Fix minor issues: ghosts don't affect popwalls, voodoo tiles shouldn't crash, on_bump is unused
This commit is contained in:
parent
c6c3ff2d71
commit
fe7731efe7
22
js/game.js
22
js/game.js
@ -233,6 +233,20 @@ export class Cell extends Array {
|
|||||||
try_entering(actor, direction, level, push_mode = null) {
|
try_entering(actor, direction, level, push_mode = null) {
|
||||||
let pushable_tiles = [];
|
let pushable_tiles = [];
|
||||||
let blocked = false;
|
let blocked = false;
|
||||||
|
// Subtleties ahoy! This is **EXTREMELY** sensitive to ordering. Consider:
|
||||||
|
// - An actor with foil MUST NOT bump a wall on the other side of a thin wall.
|
||||||
|
// - A ghost with foil MUST bump a wall (even on the other side of a thin wall) and be
|
||||||
|
// deflected by the resulting steel.
|
||||||
|
// - A bowling ball MUST NOT destroy an actor on the other side of a thin wall, or on top of
|
||||||
|
// a regular wall.
|
||||||
|
// - A fireball MUST melt an ice block AND ALSO still be deflected by it, even if the ice
|
||||||
|
// block is on top of an item (which blocks the fireball), but NOT one on the other side
|
||||||
|
// of a thin wall.
|
||||||
|
// - A rover MUST NOT bump walls underneath a canopy (which blocks it).
|
||||||
|
// It seems the order is thus: canopy + thin wall; terrain; actor; item. Which is the usual
|
||||||
|
// ordering from the top down, except that terrain is checked before actors. Really, the
|
||||||
|
// ordering is from "outermost" to "innermost", which makes physical sense.
|
||||||
|
// FIXME make that work, then. i think i may need to shift to fixed slots unfortunately
|
||||||
// (Note that here, and anywhere else that has any chance of altering the cell's contents,
|
// (Note that here, and anywhere else that has any chance of altering the cell's contents,
|
||||||
// we iterate over a copy of the cell to insulate ourselves from tiles appearing or
|
// we iterate over a copy of the cell to insulate ourselves from tiles appearing or
|
||||||
// disappearing mid-iteration.)
|
// disappearing mid-iteration.)
|
||||||
@ -242,9 +256,6 @@ export class Cell extends Array {
|
|||||||
// any of our other tiles either. (This is my best guess at the actual behavior, seeing
|
// any of our other tiles either. (This is my best guess at the actual behavior, seeing
|
||||||
// as walls also block everything but players can obviously bump /those/.)
|
// as walls also block everything but players can obviously bump /those/.)
|
||||||
if (! blocked) {
|
if (! blocked) {
|
||||||
if (actor.type.on_bump) {
|
|
||||||
actor.type.on_bump(actor, level, tile, direction);
|
|
||||||
}
|
|
||||||
if (tile.type.on_bumped) {
|
if (tile.type.on_bumped) {
|
||||||
tile.type.on_bumped(tile, level, actor);
|
tile.type.on_bumped(tile, level, actor);
|
||||||
}
|
}
|
||||||
@ -555,6 +566,10 @@ export class Level extends LevelInterface {
|
|||||||
if (terrain.type.name === 'logic_gate') {
|
if (terrain.type.name === 'logic_gate') {
|
||||||
let dir = terrain.direction;
|
let dir = terrain.direction;
|
||||||
let cxns = terrain.type._gate_types[terrain.gate_type];
|
let cxns = terrain.type._gate_types[terrain.gate_type];
|
||||||
|
if (! cxns) {
|
||||||
|
// Voodoo tile
|
||||||
|
continue;
|
||||||
|
}
|
||||||
for (let i = 0; i < 4; i++) {
|
for (let i = 0; i < 4; i++) {
|
||||||
let cxn = cxns[i];
|
let cxn = cxns[i];
|
||||||
if (cxn && cxn.match(/^out/)) {
|
if (cxn && cxn.match(/^out/)) {
|
||||||
@ -839,6 +854,7 @@ export class Level extends LevelInterface {
|
|||||||
|
|
||||||
// Lynx-style loop: everyone decides, then everyone moves/cools.
|
// Lynx-style loop: everyone decides, then everyone moves/cools.
|
||||||
_begin_tic_lynx() {
|
_begin_tic_lynx() {
|
||||||
|
// FIXME this should have three wire passes too, chief
|
||||||
this._do_decision_phase();
|
this._do_decision_phase();
|
||||||
this._do_combined_action_phase(3);
|
this._do_combined_action_phase(3);
|
||||||
this._do_wire_phase();
|
this._do_wire_phase();
|
||||||
|
|||||||
@ -2039,8 +2039,8 @@ const TILE_TYPES = {
|
|||||||
'bomb',
|
'bomb',
|
||||||
'ice', 'ice_nw', 'ice_ne', 'ice_sw', 'ice_se',
|
'ice', 'ice_nw', 'ice_ne', 'ice_sw', 'ice_se',
|
||||||
'force_floor_n', 'force_floor_s', 'force_floor_e', 'force_floor_w', 'force_floor_all',
|
'force_floor_n', 'force_floor_s', 'force_floor_e', 'force_floor_w', 'force_floor_all',
|
||||||
// Ghosts don't activate swivels
|
// Ghosts don't activate swivels or popwalls
|
||||||
'swivel_nw', 'swivel_ne', 'swivel_se', 'swivel_sw',
|
'popwall', 'swivel_nw', 'swivel_ne', 'swivel_se', 'swivel_sw',
|
||||||
]),
|
]),
|
||||||
movement_speed: 4,
|
movement_speed: 4,
|
||||||
// TODO ignores /most/ walls. collision is basically completely different. has a regular inventory, except red key. good grief
|
// TODO ignores /most/ walls. collision is basically completely different. has a regular inventory, except red key. good grief
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user