werewolf-core
Version:
Are you a WEREWOLF?
343 lines (342 loc) • 13.5 kB
JavaScript
"use strict";
var init_game_1 = require('./init-game');
var field_1 = require('../../core/field');
var effect = require('../../core/effect');
var events = require('../../core/event');
var count = require('../../core/lib/count');
var diereason = require('../../core/lib/diereason');
var villager_1 = require('../../core/roles/villager');
var werewolf_1 = require('../../core/roles/werewolf');
var seer_1 = require('../../core/roles/seer');
var medium_1 = require('../../core/roles/medium');
var werewolfevent = require('../../core/roles/werewolf.event');
var seerevent = require('../../core/roles/seer.event');
var mediumevent = require('../../core/roles/medium.event');
describe('Roles', function () {
var game;
var pi;
var rule = init_game_1.makeRule();
var initPlayer = function (obj) { return pi.initPlayer(obj); };
beforeEach(function () {
var load = function () {
var ps = [];
for (var _i = 0; _i < arguments.length; _i++) {
ps[_i - 0] = arguments[_i];
}
for (var _a = 0, ps_1 = ps; _a < ps_1.length; _a++) {
var p = ps_1[_a];
game.loadPackage(p);
pi.add(p);
}
};
game = init_game_1.initGame(field_1.initField(rule));
pi = init_game_1.getPlayerInitiator();
load(werewolf_1.default, seer_1.default, medium_1.default);
});
describe('Werewolf', function () {
it('Werewolf counts as werewolf', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: werewolf_1.default.role,
}));
var e = game.runEvent(events.initQueryCountEvent('id1'));
expect(e.count).toBe(count.COUNT_WEREWOLF);
});
describe('Job Selection', function () {
it('EVENT_PHASE_NIGHT initializes wolf choice', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: werewolf_1.default.role,
}));
game.addPlayer(pi.initPlayer({
id: 'id2',
type: villager_1.default.role,
}));
game.runEvent(events.initPhaseNightEvent());
var efs = game.getEffects();
expect(efs.length).toBe(1);
var e = efs.get(0);
expect(e.type).toBe(effect.EFFECT_CHOICE);
expect(e.on).toBe('id1');
expect(e.choice_kind).toBe(werewolfevent.CHOICE_WEREWOLF);
expect(e.value).toBe(undefined);
expect(e.options).toEqual([{
label: 'id1',
label_kind: 'player',
value: 'id1',
}, {
label: 'id2',
label_kind: 'player',
value: 'id2',
}]);
});
it('EVENT_JOB_WEREWOLF sets wolf target', function () {
game.runEvent(events.initPhaseNightEvent());
game.runEvent(werewolfevent.initJobWerewolfEvent({
from: 'id1',
to: 'id2',
}));
var f = game.getField();
expect(f.werewolfRemains).toBe(0);
expect(f.werewolfTarget).toEqual([{
from: 'id1',
to: 'id2',
}]);
});
it('decreases werewolf remains', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: werewolf_1.default.role,
}));
game.addPlayer(pi.initPlayer({
id: 'id2',
type: villager_1.default.role,
}));
game.runEvent(events.initPhaseNightEvent());
expect(game.getField().werewolfRemains).toBe(1);
game.runEvent(werewolfevent.initJobWerewolfEvent({
from: 'id1',
to: 'id2',
}));
var f = game.getField();
expect(f.werewolfRemains).toBe(0);
expect(f.werewolfTarget).toEqual([{
from: 'id1',
to: 'id2',
}]);
});
it('job of werewolf', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: werewolf_1.default.role,
}));
game.addPlayer(pi.initPlayer({
id: 'id2',
type: villager_1.default.role,
}));
game.runEvent(events.initPhaseNightEvent());
var e = game.getEffects().ofType(effect.EFFECT_CHOICE)[0];
game.runEvent(events.initChoiceEvent({
from: 'id1',
choice_id: e.id,
value: 'id2',
}));
var f = game.getField();
expect(f.werewolfRemains).toBe(0);
expect(f.werewolfTarget).toEqual([{
from: 'id1',
to: 'id2',
}]);
});
it('Werewolf kill players', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: werewolf_1.default.role,
}));
game.addPlayer(pi.initPlayer({
id: 'id2',
type: villager_1.default.role,
}));
game.runEvent(events.initPhaseNightEvent());
expect(game.getField().werewolfRemains).toBe(1);
var e = game.getEffects().ofType(effect.EFFECT_CHOICE)[0];
game.runEvent(events.initChoiceEvent({
from: 'id1',
choice_id: e.id,
value: 'id2',
}));
game.runEvent(events.initMidnightEvent());
var pl = game.getPlayers().get('id2');
expect(pl.dead).toBe(true);
expect(pl.dead_reason).toBe(diereason.WEREWOLF);
});
});
});
describe('Seer', function () {
it('init with result, shown set', function () {
var pl = pi.initPlayer({
id: 'id1',
type: seer_1.default.role,
});
expect(pl.results).toEqual([]);
expect(pl.shown).toBe(-1);
});
describe('EVENT_QUERY_SEER', function () {
it('init with SEER_RESULT_HUMAN', function () {
expect(seerevent.initQuerySeerEvent({
from: 'id1',
to: 'id2',
})).toEqual({
type: seerevent.EVENT_QUERY_SEER,
from: 'id1',
to: 'id2',
result: seerevent.SEER_RESULT_HUMAN,
});
});
it('Werewolf seen with result of SEER_RESULT_WEREWOLF', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: seer_1.default.role,
}));
game.addPlayer(pi.initPlayer({
id: 'id2',
type: werewolf_1.default.role,
}));
var e = game.runEvent(seerevent.initQuerySeerEvent({
from: 'id1',
to: 'id2',
}));
expect(e.result).toBe(seerevent.SEER_RESULT_WEREWOLF);
});
});
it('EVENT_GETFORTUNE', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: seer_1.default.role,
}));
game.addPlayer(pi.initPlayer({
id: 'id2',
type: werewolf_1.default.role,
}));
var e = game.runEvent(seerevent.initGetfortuneEvent({
from: 'id1',
to: 'id2',
}));
expect(e.from).toBe('id1');
expect(e.to).toBe('id2');
var pl = game.getPlayers().get('id1');
expect(pl.results).toEqual([{
to: 'id2',
result: seerevent.SEER_RESULT_WEREWOLF,
}]);
expect(pl.shown).toBe(-1);
});
describe('job selection', function () {
it('open choice at night', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: seer_1.default.role,
}));
game.addPlayer(pi.initPlayer({
id: 'id2',
type: villager_1.default.role,
}));
game.runEvent(events.initPhaseNightEvent());
var efs = game.getEffects().asArray();
expect(efs.length).toBe(1);
var e = efs[0];
expect(e.type).toBe(effect.EFFECT_CHOICE);
expect(e.on).toBe('id1');
expect(e.choice_kind).toBe(seerevent.CHOICE_SEER);
expect(e.value).toBe(undefined);
expect(e.options).toEqual([{
label: 'id1',
label_kind: 'player',
value: 'id1',
}, {
label: 'id2',
label_kind: 'player',
value: 'id2',
}]);
});
it('get fortune result', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: seer_1.default.role,
}));
game.addPlayer(pi.initPlayer({
id: 'id2',
type: werewolf_1.default.role,
}));
game.runEvent(events.initPhaseNightEvent());
var e = game.getEffects().get(0);
game.runEvent(events.initChoiceEvent({
from: 'id1',
choice_id: e.id,
value: 'id2',
}));
game.runEvent(events.initMidnightEvent());
var pl = game.getPlayers().get('id1');
expect(pl.results).toEqual([{
to: 'id2',
result: seerevent.SEER_RESULT_WEREWOLF,
}]);
expect(pl.shown).toBe(-1);
});
});
});
describe('Medium', function () {
it('init with result, shown set', function () {
var pl = pi.initPlayer({
id: 'id1',
type: medium_1.default.role,
});
expect(pl.results).toEqual([]);
expect(pl.shown).toBe(-1);
});
describe('EVENT_QUERY_MEDIUM', function () {
it('init with MEDIUM_RESULT_HUMAN', function () {
expect(mediumevent.initQueryMediumEvent({
from: 'id1',
to: 'id2',
})).toEqual({
type: mediumevent.EVENT_QUERY_MEDIUM,
from: 'id1',
to: 'id2',
result: mediumevent.MEDIUM_RESULT_HUMAN,
});
});
it('Werewolf mediumed with result of MEDIUM_RESULT_WEREWOLF', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: medium_1.default.role,
}));
game.addPlayer(pi.initPlayer({
id: 'id2',
type: werewolf_1.default.role,
}));
var e = game.runEvent(mediumevent.initQueryMediumEvent({
from: 'id1',
to: 'id2',
}));
expect(e.result).toBe(mediumevent.MEDIUM_RESULT_WEREWOLF);
});
});
it('EVENT_DO_MEDIUM', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: medium_1.default.role,
}));
game.addPlayer(pi.initPlayer({
id: 'id2',
type: werewolf_1.default.role,
}));
game.runEvent(mediumevent.initDoMediumEvent({ from: 'id1', to: 'id2' }));
var pl = game.getPlayers().get('id1');
expect(pl.results).toEqual([{
to: 'id2',
result: mediumevent.MEDIUM_RESULT_WEREWOLF,
}]);
expect(pl.shown).toBe(-1);
});
it('hook for punish dying', function () {
game.addPlayer(pi.initPlayer({
id: 'id1',
type: medium_1.default.role,
}));
game.addPlayer(pi.initPlayer({
id: 'id2',
type: werewolf_1.default.role,
}));
game.runEvent(events.initDieEvent({
on: 'id2',
reason: diereason.LYNCH,
}));
var pl = game.getPlayers().get('id1');
expect(pl.results).toEqual([{
to: 'id2',
result: mediumevent.MEDIUM_RESULT_WEREWOLF,
}]);
});
});
});