diff --git a/gameblocks/modules/gameplay/SnakePlay.js b/gameblocks/modules/gameplay/SnakePlay.js index d95e25c..c1ce746 100644 --- a/gameblocks/modules/gameplay/SnakePlay.js +++ b/gameblocks/modules/gameplay/SnakePlay.js @@ -33,9 +33,11 @@ function clonePlayer(player) { } function createPlayer({ playerId, segments }) { + const nextSegments = cloneCells(segments); return { playerId, - segments: cloneCells(segments), + segments: nextSegments, + initialSegments: cloneCells(nextSegments), alive: true, }; } @@ -63,6 +65,14 @@ export class SnakePlay { player.segments = cloneCells(segments); } + reset() { + this.items.clear(); + for (const player of this.players.values()) { + player.segments = cloneCells(player.initialSegments); + player.alive = true; + } + } + addItem({ cell, growth = 1 }) { const nextItem = { cell: cloneCell(cell), diff --git a/gameblocks/modules/gameplay/SnakePlay.test.js b/gameblocks/modules/gameplay/SnakePlay.test.js new file mode 100644 index 0000000..6001f88 --- /dev/null +++ b/gameblocks/modules/gameplay/SnakePlay.test.js @@ -0,0 +1,36 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { SNAKE_DEATH_REASONS, SNAKE_PLAY_EVENTS, SnakePlay } from './SnakePlay.js'; + +test('reset restores players and clears items', () => { + const play = new SnakePlay({ minRight: 0, maxRight: 7, minForward: 0, maxForward: 7 }); + play.addPlayer({ + playerId: 'a', + segments: [ + { right: 2, forward: 2 }, + { right: 2, forward: 1 }, + ], + }); + play.addItem({ cell: { right: 4, forward: 4 }, growth: 1 }); + play.movePlayer({ + playerId: 'a', + segments: [ + { right: 9, forward: 2 }, + { right: 2, forward: 2 }, + ], + }); + const events = play.step(); + assert.equal(events[0].type, SNAKE_PLAY_EVENTS.PLAYER_DIED); + assert.equal(events[0].reason, SNAKE_DEATH_REASONS.WALL); + assert.equal(play.getPlayerState('a').alive, false); + assert.equal(play.getItemState().length, 1); + + play.reset(); + const restored = play.getPlayerState('a'); + assert.equal(restored.alive, true); + assert.deepEqual(restored.segments, [ + { right: 2, forward: 2 }, + { right: 2, forward: 1 }, + ]); + assert.equal(play.getItemState().length, 0); +});