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')
continue;
if (push_mode === 'move' && tile.type.on_bump) {
tile.type.on_bump(tile, level, actor);
if (push_mode === 'move') {
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
@ -1057,8 +1062,12 @@ export class Level {
// Bump tiles that we're even attempting to move into; this mostly reveals
// invisible walls, blue floors, etc.
// XXX how to guarantee this only happens once...
if (tile.type.on_bump) {
tile.type.on_bump(tile, this, actor);
if (actor.type.on_bump) {
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: {
draw_layer: DRAW_LAYERS.terrain,
blocks_collision: COLLISION.all_but_ghost,
on_bump(me, level, other) {
on_bumped(me, level, other) {
if (other.has_item('foil')) {
level.transmute_tile(me, 'steel');
}
@ -179,7 +179,7 @@ const TILE_TYPES = {
wall_invisible: {
draw_layer: DRAW_LAYERS.terrain,
blocks_collision: COLLISION.all_but_ghost,
on_bump(me, level, other) {
on_bumped(me, level, other) {
if (other.type.can_reveal_walls) {
level.spawn_animation(me.cell, 'wall_invisible_revealed');
}
@ -188,7 +188,7 @@ const TILE_TYPES = {
wall_appearing: {
draw_layer: DRAW_LAYERS.terrain,
blocks_collision: COLLISION.all_but_ghost,
on_bump(me, level, other) {
on_bumped(me, level, other) {
if (other.type.can_reveal_walls) {
level.transmute_tile(me, 'wall');
}
@ -257,7 +257,7 @@ const TILE_TYPES = {
me.type = TILE_TYPES['popwall'];
}
},
on_bump(me, level, other) {
on_bumped(me, level, other) {
if (other.type.can_reveal_walls) {
level.transmute_tile(me, 'wall');
}
@ -266,7 +266,7 @@ const TILE_TYPES = {
fake_floor: {
draw_layer: DRAW_LAYERS.terrain,
blocks_collision: COLLISION.block_cc1 | COLLISION.monster_solid,
on_bump(me, level, other) {
on_bumped(me, level, other) {
if (other.type.can_reveal_walls) {
level.transmute_tile(me, 'floor');
}
@ -902,7 +902,7 @@ const TILE_TYPES = {
ice_block: true,
frame_block: true,
},
on_bump(me, level, other) {
on_bumped(me, level, other) {
// Fireballs melt ice blocks on regular floor
// XXX what if i'm in motion?
if (other.type.name === 'fireball') {
@ -2159,15 +2159,19 @@ const TILE_TYPES = {
// FIXME do i start moving immediately when dropped, or next turn?
movement_speed: 4,
decide_movement(me, level) {
return [
me.direction,
function() {
// FIXME lol this is incredibly stupid but i have no way to react when /i/ hit
// something /else/ yet
level.transmute_tile(me, 'explosion');
return me.direction;
},
];
return [me.direction];
},
// FIXME feel like this should be on_blocked?
on_bump(me, level, other) {
if (other.type.is_actor) {
level.transmute_tile(me, 'explosion');
level.transmute_tile(other, 'explosion');
return false;
}
else if (other.blocks(me, me.direction, level)) {
level.transmute_tile(me, 'explosion');
return false;
}
},
},
xray_eye: {