Clumsily teach bowling balls to destroy actors
This commit is contained in:
parent
2d7df413ee
commit
f858668ca8
17
js/game.js
17
js/game.js
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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 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;
|
|
||||||
},
|
},
|
||||||
];
|
// 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: {
|
xray_eye: {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user