diff --git a/js/game.js b/js/game.js index cd7e1f2..212486f 100644 --- a/js/game.js +++ b/js/game.js @@ -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 diff --git a/js/tiletypes.js b/js/tiletypes.js index c67d28f..2fbafc4 100644 --- a/js/tiletypes.js +++ b/js/tiletypes.js @@ -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,