UNPKG

werewolf-core

Version:

Are you a WEREWOLF?

343 lines (342 loc) 13.5 kB
"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, }]); }); }); });