Improve rotation of frame blocks on railroads

This commit is contained in:
Eevee (Evelyn Woods) 2020-12-16 21:23:37 -07:00
parent 4d5c1b4332
commit 6aed1fa38e
2 changed files with 20 additions and 21 deletions

View File

@ -1043,7 +1043,18 @@ export class Level {
if (actor.movement_cooldown > 0)
return false;
direction = actor.cell.redirect_exit(actor, direction);
let redirected_direction = actor.cell.redirect_exit(actor, direction);
if (direction !== redirected_direction) {
// Some tiles (ahem, frame blocks) rotate when their attempted direction is redirected
if (actor.type.on_rotate) {
let turn = ['right', 'left', 'opposite'].filter(t => {
return DIRECTIONS[direction][t] === redirected_direction;
})[0];
actor.type.on_rotate(actor, this, turn);
}
direction = redirected_direction;
}
this.set_actor_direction(actor, direction);
// Record our speed, and halve it below if we're stepping onto a sliding tile

View File

@ -466,26 +466,6 @@ const TILE_TYPES = {
level._set_tile_prop(me, 'entered_direction', other.direction);
},
on_depart(me, level, other) {
if (other.type.name === 'frame_block') {
// Directional blocks are rotated when they leave
// FIXME this isn't right, they rotate by the difference between their attempted
// move and their redirected move
if (other.direction === DIRECTIONS[me.entered_direction].right) {
let new_arrows = new Set;
for (let arrow of other.arrows) {
new_arrows.add(DIRECTIONS[arrow].right);
}
level._set_tile_prop(other, 'arrows', new_arrows);
}
else if (other.direction === DIRECTIONS[me.entered_direction].left) {
let new_arrows = new Set;
for (let arrow of other.arrows) {
new_arrows.add(DIRECTIONS[arrow].left);
}
level._set_tile_prop(other, 'arrows', new_arrows);
}
}
if (! level.is_cell_wired(me.cell)) {
me.type._switch_track(me, level);
}
@ -951,6 +931,14 @@ const TILE_TYPES = {
on_clone(me, original) {
me.arrows = new Set(original.arrows);
},
on_rotate(me, level, turn) {
// We rotate when turned on railroads
let new_arrows = new Set;
for (let arrow of me.arrows) {
new_arrows.add(DIRECTIONS[arrow][turn]);
}
level._set_tile_prop(me, 'arrows', new_arrows);
},
},
green_floor: {
draw_layer: DRAW_LAYERS.terrain,