Hardcode green toggles a bit less, and shrink the undo size

This commit is contained in:
Eevee (Evelyn Woods) 2024-04-17 19:46:29 -06:00
parent 5aeeb8a974
commit e9650db4d8
2 changed files with 27 additions and 19 deletions

View File

@ -1217,26 +1217,30 @@ export class Level extends LevelInterface {
_do_post_actor_phase() { _do_post_actor_phase() {
if (this.pending_green_toggle) { if (this.pending_green_toggle) {
// Swap green floors and walls // Swap green objects
// TODO could probably make this more compact for undo purposes this.__toggle_green_tiles();
this._push_pending_undo(() => {
this.__toggle_green_tiles();
});
this.pending_green_toggle = false;
}
}
__toggle_green_tiles() {
// This is NOT undo-safe; it's undone by calling it again!
// Assumes:
// 1. Green tile types come in pairs, which toggle into one another
// 2. A pair of green tile types appear on the same layer
for (let cell of this.linear_cells) { for (let cell of this.linear_cells) {
let terrain = cell.get_terrain(); let terrain = cell.get_terrain();
if (terrain.type.name === 'green_floor') { if (terrain.type.green_toggle_counterpart) {
this.transmute_tile(terrain, 'green_wall'); terrain.type = TILE_TYPES[terrain.type.green_toggle_counterpart];
}
else if (terrain.type.name === 'green_wall') {
this.transmute_tile(terrain, 'green_floor');
} }
let item = cell.get_item(); let item = cell.get_item();
if (item && item.type.name === 'green_chip') { if (item && item.type.green_toggle_counterpart) {
this.transmute_tile(item, 'green_bomb'); item.type = TILE_TYPES[item.type.green_toggle_counterpart];
} }
else if (item && item.type.name === 'green_bomb') {
this.transmute_tile(item, 'green_chip');
}
}
this.pending_green_toggle = false;
} }
} }

View File

@ -1317,6 +1317,7 @@ const TILE_TYPES = {
}, },
green_floor: { green_floor: {
layer: LAYERS.terrain, layer: LAYERS.terrain,
green_toggle_counterpart: 'green_wall',
blocks(me, level, other) { blocks(me, level, other) {
// Toggle walls don't toggle until the end of the frame, but the collision takes into // Toggle walls don't toggle until the end of the frame, but the collision takes into
// account whether a toggle is coming // account whether a toggle is coming
@ -1333,6 +1334,7 @@ const TILE_TYPES = {
}, },
green_wall: { green_wall: {
layer: LAYERS.terrain, layer: LAYERS.terrain,
green_toggle_counterpart: 'green_floor',
blocks(me, level, other) { blocks(me, level, other) {
// Same as above // Same as above
return ( return (
@ -1350,6 +1352,7 @@ const TILE_TYPES = {
layer: LAYERS.item, layer: LAYERS.item,
is_chip: true, is_chip: true,
is_required_chip: true, is_required_chip: true,
green_toggle_counterpart: 'green_bomb',
blocks_collision: COLLISION.block_cc1 | COLLISION.monster_typical, blocks_collision: COLLISION.block_cc1 | COLLISION.monster_typical,
item_priority: PICKUP_PRIORITIES.real_player, item_priority: PICKUP_PRIORITIES.real_player,
on_pickup(me, level, other) { on_pickup(me, level, other) {
@ -1361,6 +1364,7 @@ const TILE_TYPES = {
green_bomb: { green_bomb: {
layer: LAYERS.item, layer: LAYERS.item,
is_required_chip: true, is_required_chip: true,
green_toggle_counterpart: 'green_chip',
on_arrive(me, level, other) { on_arrive(me, level, other) {
// Unlike regular bombs, these only seem to respond to being stepped on, not stood on // Unlike regular bombs, these only seem to respond to being stepped on, not stood on
level.remove_tile(me); level.remove_tile(me);