UNPKG

puzzlescript

Version:

Play PuzzleScript games in your terminal!

486 lines (372 loc) 10.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-env jasmine */ const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const engine_1 = require("./engine"); const parser_1 = __importDefault(require("./parser/parser")); const util_1 = require("./util"); function parseEngine(code, levelNum = 0) { const { data } = parser_1.default.parse(code); const engine = new engine_1.LevelEngine(data); engine.setLevel(levelNum); return { engine, data }; } describe('player movement', () => { it('evaluates a simple game', () => { const { engine, data } = parseEngine(`title foo (verbose_logging) (debug) (run_rules_on_level_start) realtime_interval 0.1 === OBJECTS === background green player Yellow === LEGEND === . = background P = Player ==== SOUNDS ==== ==== COLLISIONLAYERS ==== background player ==== RULES ==== === WINCONDITIONS === === LEVELS === P. `); // end game const playerSprite = data.getSpriteByName('player'); engine.press(util_1.INPUT_BUTTON.RIGHT); engine.tick(); expect(engine.getCurrentLevel().getCells()[0][1].getSpritesAsSet().has(playerSprite)).toBe(true); expect(engine.getCurrentLevel().getCells()[0][0].getSpritesAsSet().has(playerSprite)).toBe(false); }); it('players next to each other should move in unison', () => { const { engine, data } = parseEngine(`title foo (verbose_logging) (debug) (run_rules_on_level_start) realtime_interval 0.1 === OBJECTS === background green player Yellow === LEGEND === . = background P = Player ==== SOUNDS ==== ==== COLLISIONLAYERS ==== background player ==== RULES ==== === WINCONDITIONS === === LEVELS === PP.. `); // end game const playerSprite = data.getSpriteByName('player'); engine.press(util_1.INPUT_BUTTON.RIGHT); engine.tick(); expect(engine.getCurrentLevel().getCells()[0][0].getSpritesAsSet().has(playerSprite)).toBe(false); expect(engine.getCurrentLevel().getCells()[0][1].getSpritesAsSet().has(playerSprite)).toBe(true); expect(engine.getCurrentLevel().getCells()[0][2].getSpritesAsSet().has(playerSprite)).toBe(true); expect(engine.getCurrentLevel().getCells()[0][3].getSpritesAsSet().has(playerSprite)).toBe(false); engine.press(util_1.INPUT_BUTTON.RIGHT); engine.tick(); expect(engine.getCurrentLevel().getCells()[0][0].getSpritesAsSet().has(playerSprite)).toBe(false); expect(engine.getCurrentLevel().getCells()[0][1].getSpritesAsSet().has(playerSprite)).toBe(false); expect(engine.getCurrentLevel().getCells()[0][2].getSpritesAsSet().has(playerSprite)).toBe(true); expect(engine.getCurrentLevel().getCells()[0][3].getSpritesAsSet().has(playerSprite)).toBe(true); }); it('wantsToMove should become applied to sprites in another bracket', () => { const { engine, data } = parseEngine(`title foo (verbose_logging) (debug) (run_rules_on_level_start) realtime_interval 0.1 === OBJECTS === background green player Yellow shadow black === LEGEND === . = background P = Player S = shadow ==== SOUNDS ==== ==== COLLISIONLAYERS ==== background player shadow ==== RULES ==== [ > player ] [ shadow ] -> [ > player ] [ > shadow ] === WINCONDITIONS === === LEVELS === P. S. `); // end game const playerSprite = data.getSpriteByName('player'); const shadowSprite = data.getSpriteByName('shadow'); engine.press(util_1.INPUT_BUTTON.RIGHT); engine.tick(); expect(engine.getCurrentLevel().getCells()[0][0].getSpritesAsSet().has(playerSprite)).toBe(false); expect(engine.getCurrentLevel().getCells()[0][1].getSpritesAsSet().has(playerSprite)).toBe(true); expect(engine.getCurrentLevel().getCells()[1][0].getSpritesAsSet().has(shadowSprite)).toBe(false); expect(engine.getCurrentLevel().getCells()[1][1].getSpritesAsSet().has(shadowSprite)).toBe(true); }); it('wantsToMove should remain when updating sprites', () => { const { engine, data } = parseEngine(`title foo (verbose_logging) (debug) (run_rules_on_level_start) realtime_interval 0.1 === OBJECTS === background green player Yellow === LEGEND === . = background P = Player ==== SOUNDS ==== ==== COLLISIONLAYERS ==== background player ==== RULES ==== [ player ] -> [ player ] === WINCONDITIONS === === LEVELS === P. `); // end game const playerSprite = data.getSpriteByName('player'); engine.press(util_1.INPUT_BUTTON.RIGHT); engine.tick(); expect(engine.getCurrentLevel().getCells()[0][0].getSpritesAsSet().has(playerSprite)).toBe(false); expect(engine.getCurrentLevel().getCells()[0][1].getSpritesAsSet().has(playerSprite)).toBe(true); }); it('wantsToMove should be removed when the condition has a direction but the right does not', () => { const { engine, data } = parseEngine(`title foo (verbose_logging) (debug) (run_rules_on_level_start) realtime_interval 0.1 === OBJECTS === background green player Yellow === LEGEND === . = background P = Player ==== SOUNDS ==== ==== COLLISIONLAYERS ==== background player ==== RULES ==== [ > Player ] -> [ Player ] === WINCONDITIONS === === LEVELS === P. `); // end game const playerSprite = data.getSpriteByName('player'); engine.press(util_1.INPUT_BUTTON.RIGHT); engine.tick(); expect(engine.getCurrentLevel().getCells()[0][0].getSpritesAsSet().has(playerSprite)).toBe(true); expect(engine.getCurrentLevel().getCells()[0][1].getSpritesAsSet().has(playerSprite)).toBe(false); }); it('only creates one Player when Player is an OR tile', () => { const { engine, data } = parseEngine(`title foo === OBJECTS === background green player1 Yellow player2 blue === LEGEND === . = background P = Player1 Player = player1 OR player2 ==== SOUNDS ==== ==== COLLISIONLAYERS ==== background player ==== RULES ==== === WINCONDITIONS === === LEVELS === P.. `); // end game const player1 = data.getSpriteByName('player1'); const player2 = data.getSpriteByName('player2'); engine.press(util_1.INPUT_BUTTON.RIGHT); engine.tick(); expect(player1.getCellsThatMatch().size).toBe(1); expect(player2.getCellsThatMatch().size).toBe(0); expect(engine.getCurrentLevel().getCells()[0][1].getSpritesAsSet().has(player1)).toBe(true); }); it('preserves wantsToMove when sprite changes', () => { const { engine, data } = parseEngine(`title foo === OBJECTS === background green player1 Yellow player2 blue === LEGEND === . = background P = Player1 AND Background Player = player1 OR player2 ==== SOUNDS ==== ==== COLLISIONLAYERS ==== background player ==== RULES ==== [ Player ] -> [ Player1 ] === WINCONDITIONS === === LEVELS === P. `); // end game const player1 = data.getSpriteByName('player1'); engine.press(util_1.INPUT_BUTTON.RIGHT); engine.tick(); expect(player1.getCellsThatMatch().size).toBe(1); expect(engine.getCurrentLevel().getCells()[0][1].getSpritesAsSet().has(player1)).toBe(true); }); it('plays a level of Beam Islands', () => { const LEVEL_NUM = 3; const LEVEL_SOLUTION = 'lluuuxlduruuxddddd'; const { engine } = parseEngine(fs_1.default.readFileSync(path_1.default.join(__dirname, '../games/beam-islands/script.txt'), 'utf-8'), LEVEL_NUM); // end game let didWin = false; const keypresses = LEVEL_SOLUTION.split(''); for (const key of keypresses) { switch (key) { case 'u': engine.press(util_1.INPUT_BUTTON.UP); break; case 'd': engine.press(util_1.INPUT_BUTTON.DOWN); break; case 'l': engine.press(util_1.INPUT_BUTTON.LEFT); break; case 'r': engine.press(util_1.INPUT_BUTTON.RIGHT); break; case 'x': engine.press(util_1.INPUT_BUTTON.ACTION); break; } const { isWinning } = engine.tick(); if (isWinning) { didWin = true; } } expect(didWin).toBe(true); }); }); //# sourceMappingURL=player.spec.js.map