Skip to content

Commit

Permalink
Fix a bug that villagers are locked out
Browse files Browse the repository at this point in the history
  • Loading branch information
takashiro committed May 9, 2021
1 parent ff38149 commit c2af892
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 30 deletions.
11 changes: 8 additions & 3 deletions src/api/room/player/board.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,14 @@ router.get('/', (req, res) => {
const { driver } = context;

const [skill] = self.getSkills();
if ((skill && skill.isReady() && !skill.isFinished())) {
const vision = wakeUp(self, driver);
res.json(vision);
if (skill) {
if (skill.isReady() && !skill.isFinished()) {
const vision = wakeUp(self, driver);
res.json(vision);
return;
}
} else if (!self.isReady()) {
res.json({});
return;
}

Expand Down
26 changes: 26 additions & 0 deletions src/collection/DiscloseAction.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import Action from '../game/Action';
import Player, { Skill } from '../game/Player';
import ActionType from '../game/ActionType';

export default class DiscloseAction extends Action {
protected from: Player;

protected to: Player;

/**
* Create an exchange action
* @param skill
* @param from
* @param to
*/
constructor(skill: Skill, from: Player, to: Player) {
super(skill, ActionType.None);

this.from = from;
this.to = to;
}

protected run(): void {
this.from.discloseTo(this.to);
}
}
10 changes: 9 additions & 1 deletion src/collection/bonus/Thing.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import { Selection } from '@bezier/werewolf-core';

import MutexType from '../../game/MutexType';
import DiscloseAction from '../DiscloseAction';
import Skill from '../Skill';
import SkipAction from '../SkipAction';

export default class Thing extends Skill<void> {
protected priority = 0x410;

protected writeMode = [MutexType.Any];

isFeasible(data: Selection): boolean {
const target = this.selectPlayer(data);
if (!target) {
Expand All @@ -15,7 +21,9 @@ export default class Thing extends Skill<void> {
protected run(data: Selection): void {
const target = this.selectPlayer(data);
if (target) {
this.owner.discloseTo(target);
this.driver.addAction(new DiscloseAction(this, this.owner, target));
} else {
this.driver.addAction(new SkipAction(this));
}
}
}
84 changes: 59 additions & 25 deletions test/collection/bonus/Thing.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ const roles: Role[] = [
1002,
1003,
Role.Thing,
Role.Robber,
Role.Villager,
Role.Villager,
Role.Villager,
Role.Prince,
];

const room = {
Expand All @@ -24,7 +24,9 @@ const room = {
};

const thing = 1;
const tapped = 4;
const robber = 2;
const villager = 3;
const prince = 4;

beforeAll(async () => {
const res = await self.post('/room').send({
Expand All @@ -47,45 +49,77 @@ it('takes all seats', async () => {
}
});

it('wakes up villagers', async () => {
for (let seat = 2; seat <= 4; seat++) {
const res = await self.post(`/room/${room.id}/player/${seat}/skill?seatKey=1`);
expect(res.status).toBe(200);
}
it('blocks night phase of robber', async () => {
const res = await self.get(`/room/${room.id}/player/${robber}/board?seatKey=1`);
expect(res.status).toBe(425);
});

it('blocks day phase', async () => {
const res = await self.get(`/room/${room.id}/player/${tapped}/board?seatKey=1`);
expect(res.status).toBe(425);
it('does not block night phase of villager', async () => {
await self.get(`/room/${room.id}/player/${villager}/board?seatKey=1`)
.expect(200, {});
});

it('cannot tap anyone remote from him', async () => {
const res = await self.post(`/room/${room.id}/player/${thing}/skill?seatKey=1`).send({
players: [3],
players: [villager],
});
expect(res.status).toBe(400);
});

it(`taps Player ${tapped}`, async () => {
it('taps Prince', async () => {
const res = await self.post(`/room/${room.id}/player/${thing}/skill?seatKey=1`).send({
players: [tapped],
players: [prince],
});
expect(res.status).toBe(200);
});

it(`is disclosed to Player ${tapped}`, async () => {
const res = await self.get(`/room/${room.id}/player/${tapped}/board?seatKey=1`);
expect(res.status).toBe(200);
const { players } = res.body as Vision;
expect(players).toHaveLength(1);
const [a] = players;
expect(a.role).toBe(Role.Thing);
expect(a.seat).toBe(thing);
it('is not disclosed to Prince at night', async () => {
await self.get(`/room/${room.id}/player/${prince}/board?seatKey=1`)
.expect(200, {});
});

it('is not disclosed to Player 2', async () => {
const res = await self.get(`/room/${room.id}/player/2/board?seatKey=1`);
it('idles while Prince gets ready', async () => {
await self.post(`/room/${room.id}/player/${prince}/skill?seatKey=1`)
.expect(200);
});

it('prevents Prince from waking up', async () => {
await self.get(`/room/${room.id}/player/${prince}/board?seatKey=1`)
.expect(425, 'Other players are still invoking their skills.');
});

it('is not disclosed to villager', async () => {
await self.get(`/room/${room.id}/player/${villager}/board?seatKey=1`)
.expect(200, {});
});

it('is not disclosed to robber', async () => {
const empty: Vision = {
players: [],
cards: [],
};
await self.get(`/room/${room.id}/player/${robber}/board?seatKey=1`)
.expect(200, empty);
});

it('idles while Robber is robbing someone else', async () => {
await self.post(`/room/${room.id}/player/${robber}/skill?seatKey=1`)
.send({ players: [prince] })
.expect(200);
});

it('idles while Villager is getting ready', async () => {
await self.post(`/room/${room.id}/player/${villager}/skill?seatKey=1`)
.expect(200);
});

it('is disclosed to Prince during the day', async () => {
const res = await self.get(`/room/${room.id}/player/${prince}/board?seatKey=1`);
expect(res.status).toBe(200);
const { players } = res.body as Vision;
expect(players).toHaveLength(0);
expect(players).toHaveLength(1);
expect(players[0]).toStrictEqual({
role: Role.Thing,
seat: thing,
});
});
2 changes: 1 addition & 1 deletion test/collection/daybreak/Sentinel.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ it('does not prevent werewolves from putting up their thumbs', async () => {

it('shows nothing to tanner at night', async () => {
const res = await self.get(`/room/${room.id}/player/${tanner}/board?seatKey=1`);
expect(res.status).toBe(425);
expect(res.status).toBe(200);
expect(res.body).toStrictEqual({});
});

Expand Down

0 comments on commit c2af892

Please sign in to comment.