Clumsily teach bowling balls to destroy actors

This commit is contained in:
Eevee (Evelyn Woods) 2020-12-15 00:10:23 -07:00
parent 2d7df413ee
commit f858668ca8
2 changed files with 32 additions and 19 deletions

View File

@ -233,8 +233,13 @@ export class Cell extends Array {
if (push_mode === 'ignore') if (push_mode === 'ignore')
continue; continue;
if (push_mode === 'move' && tile.type.on_bump) { if (push_mode === 'move') {
tile.type.on_bump(tile, level, actor); if (actor.type.on_bump) {
actor.type.on_bump(actor, level, tile);
}
if (tile.type.on_bumped) {
tile.type.on_bumped(tile, level, actor);
}
} }
// Collect pushables for later, so we don't inadvertently push through a wall // Collect pushables for later, so we don't inadvertently push through a wall
@ -1057,8 +1062,12 @@ export class Level {
// Bump tiles that we're even attempting to move into; this mostly reveals // Bump tiles that we're even attempting to move into; this mostly reveals
// invisible walls, blue floors, etc. // invisible walls, blue floors, etc.
// XXX how to guarantee this only happens once... // XXX how to guarantee this only happens once...
if (tile.type.on_bump) { if (actor.type.on_bump) {
tile.type.on_bump(tile, this, actor); if (actor.type.on_bump(actor, this, tile) === false)
return;
}
if (tile.type.on_bumped) {
tile.type.on_bumped(tile, this, actor);
} }
} }

View File

@ -154,7 +154,7 @@ const TILE_TYPES = {
wall: { wall: {
draw_layer: DRAW_LAYERS.terrain, draw_layer: DRAW_LAYERS.terrain,
blocks_collision: COLLISION.all_but_ghost, blocks_collision: COLLISION.all_but_ghost,
on_bump(me, level, other) { on_bumped(me, level, other) {
if (other.has_item('foil')) { if (other.has_item('foil')) {
level.transmute_tile(me, 'steel'); level.transmute_tile(me, 'steel');
} }
@ -179,7 +179,7 @@ const TILE_TYPES = {
wall_invisible: { wall_invisible: {
draw_layer: DRAW_LAYERS.terrain, draw_layer: DRAW_LAYERS.terrain,
blocks_collision: COLLISION.all_but_ghost, blocks_collision: COLLISION.all_but_ghost,
on_bump(me, level, other) { on_bumped(me, level, other) {
if (other.type.can_reveal_walls) { if (other.type.can_reveal_walls) {
level.spawn_animation(me.cell, 'wall_invisible_revealed'); level.spawn_animation(me.cell, 'wall_invisible_revealed');
} }
@ -188,7 +188,7 @@ const TILE_TYPES = {
wall_appearing: { wall_appearing: {
draw_layer: DRAW_LAYERS.terrain, draw_layer: DRAW_LAYERS.terrain,
blocks_collision: COLLISION.all_but_ghost, blocks_collision: COLLISION.all_but_ghost,
on_bump(me, level, other) { on_bumped(me, level, other) {
if (other.type.can_reveal_walls) { if (other.type.can_reveal_walls) {
level.transmute_tile(me, 'wall'); level.transmute_tile(me, 'wall');
} }
@ -257,7 +257,7 @@ const TILE_TYPES = {
me.type = TILE_TYPES['popwall']; me.type = TILE_TYPES['popwall'];
} }
}, },
on_bump(me, level, other) { on_bumped(me, level, other) {
if (other.type.can_reveal_walls) { if (other.type.can_reveal_walls) {
level.transmute_tile(me, 'wall'); level.transmute_tile(me, 'wall');
} }
@ -266,7 +266,7 @@ const TILE_TYPES = {
fake_floor: { fake_floor: {
draw_layer: DRAW_LAYERS.terrain, draw_layer: DRAW_LAYERS.terrain,
blocks_collision: COLLISION.block_cc1 | COLLISION.monster_solid, blocks_collision: COLLISION.block_cc1 | COLLISION.monster_solid,
on_bump(me, level, other) { on_bumped(me, level, other) {
if (other.type.can_reveal_walls) { if (other.type.can_reveal_walls) {
level.transmute_tile(me, 'floor'); level.transmute_tile(me, 'floor');
} }
@ -902,7 +902,7 @@ const TILE_TYPES = {
ice_block: true, ice_block: true,
frame_block: true, frame_block: true,
}, },
on_bump(me, level, other) { on_bumped(me, level, other) {
// Fireballs melt ice blocks on regular floor // Fireballs melt ice blocks on regular floor
// XXX what if i'm in motion? // XXX what if i'm in motion?
if (other.type.name === 'fireball') { if (other.type.name === 'fireball') {
@ -2159,15 +2159,19 @@ const TILE_TYPES = {
// FIXME do i start moving immediately when dropped, or next turn? // FIXME do i start moving immediately when dropped, or next turn?
movement_speed: 4, movement_speed: 4,
decide_movement(me, level) { decide_movement(me, level) {
return [ return [me.direction];
me.direction, },
function() { // FIXME feel like this should be on_blocked?
// FIXME lol this is incredibly stupid but i have no way to react when /i/ hit on_bump(me, level, other) {
// something /else/ yet if (other.type.is_actor) {
level.transmute_tile(me, 'explosion'); level.transmute_tile(me, 'explosion');
return me.direction; level.transmute_tile(other, 'explosion');
}, return false;
]; }
else if (other.blocks(me, me.direction, level)) {
level.transmute_tile(me, 'explosion');
return false;
}
}, },
}, },
xray_eye: { xray_eye: {