Skip to content

Commit

Permalink
restore activePlayers to previous value when it becomes empty
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolodavis committed Aug 28, 2019
1 parent 28e8b67 commit 4a51096
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 8 deletions.
13 changes: 10 additions & 3 deletions src/core/flow.js
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,7 @@ export function Flow({ moves, phases, endIf, turn, events, plugins }) {
G = conf.turn.onBegin(G, ctx);

const turn = ctx.turn + 1;
ctx = { ...ctx, turn, numMoves: 0 };
ctx = { ...ctx, turn, numMoves: 0, _prevActivePlayers: null };

const plainCtx = ContextEnhancer.detachAllFromContext(ctx);
const _undo = [{ G, ctx: plainCtx }];
Expand Down Expand Up @@ -679,7 +679,12 @@ export function Flow({ moves, phases, endIf, turn, events, plugins }) {
function ProcessMove(state, action) {
let conf = GetPhase(state.ctx);

let { activePlayers, _activePlayersOnce, activePlayersDone } = state.ctx;
let {
activePlayers,
_activePlayersOnce,
_prevActivePlayers,
activePlayersDone,
} = state.ctx;

if (_activePlayersOnce) {
const playerID = action.playerID;
Expand All @@ -691,8 +696,9 @@ export function Flow({ moves, phases, endIf, turn, events, plugins }) {
}, {});

if (Object.keys(activePlayers).length == 0) {
activePlayers = null;
activePlayers = state.ctx._prevActivePlayers;
_activePlayersOnce = false;
_prevActivePlayers = null;
activePlayersDone = true;
}
}
Expand All @@ -709,6 +715,7 @@ export function Flow({ moves, phases, endIf, turn, events, plugins }) {
activePlayers,
activePlayersDone,
_activePlayersOnce,
_prevActivePlayers,
numMoves,
},
};
Expand Down
4 changes: 3 additions & 1 deletion src/core/turn-order.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ export function SetActivePlayersEvent(state, arg) {
}

export function SetActivePlayers(ctx, arg) {
let activePlayers = ctx.activePlayers || {};
let _prevActivePlayers = ctx.activePlayers || null;
let activePlayers = {};
let activePlayersDone = null;
let _activePlayersOnce = false;

Expand Down Expand Up @@ -84,6 +85,7 @@ export function SetActivePlayers(ctx, arg) {
activePlayers,
activePlayersDone,
_activePlayersOnce,
_prevActivePlayers,
};
}

Expand Down
78 changes: 74 additions & 4 deletions src/core/turn-order.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,75 @@ describe('setActivePlayers', () => {
expect(state.ctx.activePlayers).toBeNull();
});

describe('reset behavior', () => {
test('start of turn', () => {
const game = {
moves: {
A: () => {},
},

turn: {
activePlayers: { currentPlayer: 'stage', once: true },
},
};

const reducer = CreateGameReducer({ game });
let state = InitializeGame({ game });

expect(state.ctx).toMatchObject({
activePlayers: { '0': 'stage' },
_prevActivePlayers: null,
});

state = reducer(state, makeMove('A', null, '0'));

expect(state.ctx).toMatchObject({
activePlayers: null,
_prevActivePlayers: null,
});
});

test('reset to previous', () => {
const game = {
moves: {
A: (G, ctx) => {
ctx.events.setActivePlayers({
currentPlayer: 'stage2',
once: true,
});
},
B: () => {},
},

turn: {
activePlayers: { currentPlayer: 'stage1' },
},
};

const reducer = CreateGameReducer({ game });
let state = InitializeGame({ game });

expect(state.ctx).toMatchObject({
activePlayers: { '0': 'stage1' },
_prevActivePlayers: null,
});

state = reducer(state, makeMove('A', null, '0'));

expect(state.ctx).toMatchObject({
activePlayers: { '0': 'stage2' },
_prevActivePlayers: { '0': 'stage1' },
});

state = reducer(state, makeMove('B', null, '0'));

expect(state.ctx).toMatchObject({
activePlayers: { '0': 'stage1' },
_prevActivePlayers: null,
});
});
});

describe('militia', () => {
let state;
let reducer;
Expand All @@ -451,7 +520,6 @@ describe('setActivePlayers', () => {
moves: {
militia: (G, ctx) => {
ctx.events.setActivePlayers({
currentPlayer: '',
others: 'B',
once: true,
});
Expand Down Expand Up @@ -508,7 +576,6 @@ describe('setActivePlayers', () => {
test('player 0 plays militia', () => {
state = reducer(state, makeMove('militia', undefined, '0'));
expect(state.ctx.activePlayers).toEqual({
'0': '',
'1': 'B',
'2': 'B',
});
Expand All @@ -520,9 +587,12 @@ describe('setActivePlayers', () => {

test('everyone else discards', () => {
state = reducer(state, makeMove('discard', undefined, '1'));
expect(state.ctx.activePlayers).toEqual({ '0': '', '2': 'B' });
expect(state.ctx.activePlayers).toEqual({ '2': 'B' });
state = reducer(state, makeMove('discard', undefined, '2'));
expect(state.ctx.activePlayers).toEqual({ '0': '' });
});

test('activePlayers is restored to previous state', () => {
expect(state.ctx.activePlayers).toEqual({ '0': 'A' });
});
});
});
Expand Down

0 comments on commit 4a51096

Please sign in to comment.