Split teleporting into its own pass, like Lynx

This commit is contained in:
Eevee (Evelyn Woods) 2020-12-13 02:23:14 -07:00
parent 93954135d2
commit 0f5b8098f6

View File

@ -587,6 +587,19 @@ export class Level {
} }
} }
} }
// Mini extra pass: deal with teleporting separately. Otherwise, actors may have been in
// the way of the teleporter but finished moving away during the above loop; this is
// particularly bad when it happens with a block you're pushing.
for (let i = this.actors.length - 1; i >= 0; i--) {
let actor = this.actors[i];
if (! actor.cell)
continue;
if (actor.just_stepped_on_teleporter) {
this.attempt_teleport(actor);
}
}
} }
finish_tic(p1_actions) { finish_tic(p1_actions) {
@ -1087,7 +1100,6 @@ export class Level {
// Step on every tile in a cell we just arrived in // Step on every tile in a cell we just arrived in
step_on_cell(actor, cell) { step_on_cell(actor, cell) {
let teleporter;
// Step on topmost things first -- notably, it's safe to step on water with flippers on top // Step on topmost things first -- notably, it's safe to step on water with flippers on top
for (let tile of Array.from(cell).reverse()) { for (let tile of Array.from(cell).reverse()) {
if (tile === actor) if (tile === actor)
@ -1108,16 +1120,21 @@ export class Level {
} }
} }
else if (tile.type.teleport_dest_order) { else if (tile.type.teleport_dest_order) {
teleporter = tile; // This is used by an extra pass just after our caller, so it doesn't need to undo
actor.just_stepped_on_teleporter = tile;
} }
else if (tile.type.on_arrive) { else if (tile.type.on_arrive) {
tile.type.on_arrive(tile, this, actor); tile.type.on_arrive(tile, this, actor);
} }
} }
}
attempt_teleport(actor) {
let teleporter = actor.just_stepped_on_teleporter;
actor.just_stepped_on_teleporter = null;
// Handle teleporting, now that the dust has cleared // Handle teleporting, now that the dust has cleared
// FIXME something funny happening here, your input isn't ignored while walking out of it? // FIXME something funny happening here, your input isn't ignored while walking out of it?
if (teleporter) {
let original_direction = actor.direction; let original_direction = actor.direction;
let success = false; let success = false;
for (let dest of teleporter.type.teleport_dest_order(teleporter, this, actor)) { for (let dest of teleporter.type.teleport_dest_order(teleporter, this, actor)) {
@ -1180,7 +1197,6 @@ export class Level {
} }
} }
} }
}
remember_player_move(direction) { remember_player_move(direction) {
if (this.player.type.name === 'player') { if (this.player.type.name === 'player') {