Add an xray view and a "matching button" sprite for the sokoban blocks

This commit is contained in:
Eevee (Evelyn Woods) 2024-04-17 03:51:11 -06:00
parent 849010fc75
commit 618f292ec9
2 changed files with 42 additions and 9 deletions

View File

@ -1907,11 +1907,30 @@ export const LL_TILESET_LAYOUT = {
wired_cross: [18, 22], wired_cross: [18, 22],
}, },
sokoban_block: { sokoban_block: {
__special__: 'perception',
modes: new Set(['editor', 'xray']),
hidden: {
__special__: 'visual-state', __special__: 'visual-state',
red: [26, 20], red: [26, 20],
blue: [26, 21], blue: [26, 21],
yellow: [26, 22], yellow: [26, 22],
green: [26, 23], green: [26, 23],
red_matched: [27, 20],
blue_matched: [27, 21],
yellow_matched: [27, 22],
green_matched: [27, 23],
},
revealed: {
__special__: 'visual-state',
red: [25, 20],
blue: [25, 21],
yellow: [25, 22],
green: [25, 23],
red_matched: [25, 20],
blue_matched: [25, 21],
yellow_matched: [25, 22],
green_matched: [25, 23],
},
}, },
sokoban_button: { sokoban_button: {
__special__: 'visual-state', __special__: 'visual-state',

View File

@ -1072,7 +1072,9 @@ const TILE_TYPES = {
level.kill_actor(other, me, 'fall', null, 'fell'); level.kill_actor(other, me, 'fall', null, 'fell');
}, },
visual_state(me) { visual_state(me) {
return (me && me.visual_state) ?? 'open'; // Default to the version of the tile that actually shows something; otherwise this
// looks like an error or gap in the editor
return (me && me.visual_state) ?? 'north';
}, },
}, },
cracked_floor: { cracked_floor: {
@ -1411,17 +1413,27 @@ const TILE_TYPES = {
me.color = original.color; me.color = original.color;
}, },
visual_state(me) { visual_state(me) {
return me.color ?? 'red'; let color = me.color ?? 'red';
if (me && me.cell && ! me.movement_cooldown) {
let terrain = me.cell.get_terrain();
if (terrain.type.name === 'sokoban_button' && terrain.pressed) {
return color + '_matched';
}
}
return color;
}, },
}, },
sokoban_button: { sokoban_button: {
layer: LAYERS.terrain, layer: LAYERS.terrain,
populate_defaults(me) { populate_defaults(me) {
me.color = 'red'; me.color = 'red';
me.pressed = false;
}, },
on_ready(me, level) { on_ready(me, level) {
if (me.cell.get_actor()) { let actor = me.cell.get_actor();
if (actor && ! (actor.type.name === 'sokoban_block' && actor.color !== me.color)) {
// Already held down, make sure the level knows // Already held down, make sure the level knows
me.pressed = true;
level.sokoban_buttons_unpressed[me.color] -= 1; level.sokoban_buttons_unpressed[me.color] -= 1;
if (level.sokoban_buttons_unpressed[me.color] === 0) { if (level.sokoban_buttons_unpressed[me.color] === 0) {
for (let cell of level.linear_cells) { for (let cell of level.linear_cells) {
@ -1436,6 +1448,7 @@ const TILE_TYPES = {
on_arrive(me, level, other) { on_arrive(me, level, other) {
if (other.type.name === 'sokoban_block' && me.color !== other.color) if (other.type.name === 'sokoban_block' && me.color !== other.color)
return; return;
level._set_tile_prop(me, 'pressed', true);
level.sfx.play_once('button-press', me.cell); level.sfx.play_once('button-press', me.cell);
level.sokoban_buttons_unpressed[me.color] -= 1; level.sokoban_buttons_unpressed[me.color] -= 1;
@ -1452,6 +1465,7 @@ const TILE_TYPES = {
} }
}, },
on_depart(me, level, other) { on_depart(me, level, other) {
level._set_tile_prop(me, 'pressed', false);
if (other.type.name === 'sokoban_block' && me.color !== other.color) if (other.type.name === 'sokoban_block' && me.color !== other.color)
return; return;
level.sfx.play_once('button-release', me.cell); level.sfx.play_once('button-release', me.cell);
@ -1470,7 +1484,7 @@ const TILE_TYPES = {
} }
}, },
visual_state(me) { visual_state(me) {
return (me.color ?? 'red') + '_' + button_visual_state(me); return (me.color ?? 'red') + '_' + (me.pressed ? 'pressed' : 'released');
}, },
}, },
sokoban_wall: { sokoban_wall: {