puzzlescript
Version:
Play PuzzleScript games in your terminal!
467 lines (358 loc) • 9.94 kB
JavaScript
"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 engine_1 = require("./engine");
const parser_1 = __importDefault(require("./parser/parser"));
const HORIZONTAL_GAME = `title check that Horizontal Expands
========
OBJECTS
========
Background
blue
Player
green
Sand
yellow
Water
Blue
=======
LEGEND
=======
. = Background
================
COLLISIONLAYERS
================
Background
Player
Sand
Water
======
RULES
======
LEFT [ HORIZONTAL Player > Water ] -> [ UP Sand ]
=======
LEVELS
=======
.
`; // end game
function parseEngine(code) {
const { data } = parser_1.default.parse(code);
const engine = new engine_1.LevelEngine(data);
engine.setLevel(0);
return { engine, data };
}
describe('Rule simplifier', () => {
it('expands horizontal rules', () => {
const { data } = parseEngine(HORIZONTAL_GAME);
const foo = data.rules;
expect(foo.length).toBe(1);
expect(foo[0].getChildRules().length).toBe(2);
});
it('treats adjacent neighbors that are the same as distinct (e.g. [ Wall | Wall ]', () => {
const { engine, data } = parseEngine(`title check that Horizontal Expands
========
OBJECTS
========
Background
blue
Player
green
Wall
yellow
RightExtension
Blue
=======
LEGEND
=======
W = Wall
================
COLLISIONLAYERS
================
Background
Player
Wall
RightExtension
======
RULES
======
RIGHT [ Wall | Wall ] -> [ RightExtension | RightExtension ]
=======
LEVELS
=======
WW
`); // end game
const rightExtension = data.getSpriteByName('RightExtension');
engine.tick();
expect(engine.getCurrentLevel().getCells()[0][0].getSpritesAsSet().has(rightExtension)).toBe(true);
});
it('converts VERTICAL and HORIZONTAL at the beginning of a rule into 2 rules', () => {
const { engine, data } = parseEngine(`title check that Horizontal Expands
========
OBJECTS
========
Background
black
Player
green
SimpleWall
Yellow
PrettyHorizWall
Blue
.....
.....
00000
.....
.....
PrettyVertWall
Blue
..0..
..0..
..0..
..0..
..0..
=======
LEGEND
=======
. = Background
W = SimpleWall
Wall = SimpleWall OR PrettyHorizWall OR PrettyVertWall
===
SOUNDS
===
================
COLLISIONLAYERS
================
Background
Player
Wall, PrettyHorizWall, PrettyVertWall
======
RULES
======
HORIZONTAL [ Wall | SimpleWall | Wall ] -> [ Wall | PrettyHorizWall | Wall ]
VERTICAL [ Wall | SimpleWall | Wall ] -> [ Wall | PrettyVertWall | Wall ]
===
WINCONDITIONS
===
=======
LEVELS
=======
WWWW
W..W
W..W
WWWW
`); // end game
const horiz = data.getSpriteByName('PrettyHorizWall');
const vert = data.getSpriteByName('PrettyVertWall');
engine.tick();
expect(engine.toSnapshot()).toMatchSnapshot();
expect(data.rules.length).toBe(2);
expect(data.rules[0].getChildRules().length).toBe(2); // just LEFT RIGHT
expect(data.rules[1].getChildRules().length).toBe(2); // just UP DOWN
expect(engine.getCurrentLevel().getCells()[0][1].getSpritesAsSet().has(horiz)).toBe(true);
expect(engine.getCurrentLevel().getCells()[0][2].getSpritesAsSet().has(horiz)).toBe(true);
expect(engine.getCurrentLevel().getCells()[3][1].getSpritesAsSet().has(horiz)).toBe(true);
expect(engine.getCurrentLevel().getCells()[3][2].getSpritesAsSet().has(horiz)).toBe(true);
expect(engine.getCurrentLevel().getCells()[1][0].getSpritesAsSet().has(vert)).toBe(true);
expect(engine.getCurrentLevel().getCells()[1][3].getSpritesAsSet().has(vert)).toBe(true);
expect(engine.getCurrentLevel().getCells()[2][0].getSpritesAsSet().has(vert)).toBe(true);
expect(engine.getCurrentLevel().getCells()[2][3].getSpritesAsSet().has(vert)).toBe(true);
});
it('expands MOVING into simple UP DOWN LEFT RIGHT ACTION rules', () => {
const { engine, data } = parseEngine(`title check that MOVING Expands
========
OBJECTS
========
Background
blue
Player
green
Shadow
black
=======
LEGEND
=======
. = Background
P = Player
S = Shadow
================
COLLISIONLAYERS
================
Background
Shadow
Player
======
RULES
======
RIGHT [ Player ] -> [ > Player ]
[ MOVING Player | Shadow ] -> [ MOVING Player | MOVING Shadow ]
=======
LEVELS
=======
P..
S..
`); // end game
const player = data.getSpriteByName('player');
const shadow = data.getSpriteByName('shadow');
engine.tick();
expect(data.rules.length).toBe(2);
expect(data.rules[0].getChildRules().length).toBe(1); // Not interesting
expect(data.rules[1].getChildRules().length).toBe(4 * 5); // UP DOWN LEFT RIGHT ACTION
expect(engine.toSnapshot()).toMatchSnapshot();
expect(engine.getCurrentLevel().getCells()[0][0].getSpritesAsSet().has(player)).toBe(false);
expect(engine.getCurrentLevel().getCells()[0][1].getSpritesAsSet().has(player)).toBe(true);
expect(engine.getCurrentLevel().getCells()[1][0].getSpritesAsSet().has(shadow)).toBe(false);
expect(engine.getCurrentLevel().getCells()[1][1].getSpritesAsSet().has(shadow)).toBe(true);
});
it('expands MOVING in multiple brackets into simple UP DOWN LEFT RIGHT ACTION rules', () => {
const { engine, data } = parseEngine(`title check that MOVING Expands
========
OBJECTS
========
Background
blue
Player
green
Shadow
black
=======
LEGEND
=======
. = Background
P = Player
S = Shadow
================
COLLISIONLAYERS
================
Background
Shadow
Player
======
RULES
======
RIGHT [ Player ] -> [ > Player ]
DOWN [ MOVING Player ] [ STATIONARY Shadow ] -> [ MOVING Player ] [ MOVING Shadow ]
=======
LEVELS
=======
P..
S..
`); // end game
const player = data.getSpriteByName('player');
const shadow = data.getSpriteByName('shadow');
engine.tick();
expect(data.rules.length).toBe(2);
expect(data.rules[0].getChildRules().length).toBe(1); // Not interesting
expect(data.rules[1].getChildRules().length).toBe(5); // UP DOWN LEFT RIGHT ACTION
expect(engine.toSnapshot()).toMatchSnapshot();
expect(engine.getCurrentLevel().getCells()[0][0].getSpritesAsSet().has(player)).toBe(false);
expect(engine.getCurrentLevel().getCells()[0][1].getSpritesAsSet().has(player)).toBe(true);
expect(engine.getCurrentLevel().getCells()[1][0].getSpritesAsSet().has(shadow)).toBe(false);
expect(engine.getCurrentLevel().getCells()[1][1].getSpritesAsSet().has(shadow)).toBe(true);
});
it('collapses rules when they do not depend on the direction (major performance speedup)', () => {
const { data } = parseEngine(`title foo
========
OBJECTS
========
Background
blue
Player
green
=======
LEGEND
=======
. = Background
P = Player
================
COLLISIONLAYERS
================
Background
Player
======
RULES
======
[ Player ] -> [ ]
[ ] -> [ Player ]
=======
LEVELS
=======
P
`); // end game
expect(data.rules.length).toBe(2);
// Ensure that both rules were collapsed because they do not depend on the direction
expect(data.rules[0].getChildRules().length).toBe(1);
expect(data.rules[1].getChildRules().length).toBe(1);
});
it('keeps rules expanded when they have neighbors', () => {
const { data } = parseEngine(`title foo
========
OBJECTS
========
Background
blue
Player
green
=======
LEGEND
=======
. = Background
P = Player
================
COLLISIONLAYERS
================
Background
Player
======
RULES
======
[ Player | Player ] -> [ | ]
[ | ] -> [ Player | Player]
=======
LEVELS
=======
P
`); // end game
expect(data.rules.length).toBe(2);
// Ensure that both rules were collapsed because they do not depend on the direction
expect(data.rules[0].getChildRules().length).toBe(4);
expect(data.rules[1].getChildRules().length).toBe(4);
});
it('keeps rules expanded when the action has a direction', () => {
const { data } = parseEngine(`title foo
========
OBJECTS
========
Background
blue
Player
green
=======
LEGEND
=======
. = Background
P = Player
================
COLLISIONLAYERS
================
Background
Player
======
RULES
======
[ ] -> [ > Player ]
[ > Player ] -> [ Player]
=======
LEVELS
=======
P
`); // end game
expect(data.rules.length).toBe(2);
// Ensure that both rules were collapsed because they do not depend on the direction
expect(data.rules[0].getChildRules().length).toBe(4);
expect(data.rules[1].getChildRules().length).toBe(4);
});
});
//# sourceMappingURL=simplifyRules.spec.js.map