Implement some more properties of lit dynamite
This commit is contained in:
parent
0d59ffef85
commit
a294338080
@ -83,7 +83,7 @@ export const COLLISION = {
|
|||||||
|
|
||||||
block_cc1: 0x0010,
|
block_cc1: 0x0010,
|
||||||
block_cc2: 0x0020, // ice + frame (+ circuit, etc)
|
block_cc2: 0x0020, // ice + frame (+ circuit, etc)
|
||||||
dropped_item: 0x0040, // rolling ball, dynamite
|
bowling_ball: 0x0040, // rolling ball, dynamite
|
||||||
|
|
||||||
// Monsters are a little complicated, because some of them have special rules, e.g. fireballs
|
// Monsters are a little complicated, because some of them have special rules, e.g. fireballs
|
||||||
// aren't blocked by fire.
|
// aren't blocked by fire.
|
||||||
|
|||||||
@ -1071,12 +1071,6 @@ export class Level extends LevelInterface {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! forced_only && actor.type.on_tic) {
|
|
||||||
actor.type.on_tic(actor, this);
|
|
||||||
if (! actor.cell)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actor === this.player) {
|
if (actor === this.player) {
|
||||||
this.make_player_decision(actor, this.p1_input, forced_only);
|
this.make_player_decision(actor, this.p1_input, forced_only);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2222,6 +2222,7 @@ const TILE_TYPES = {
|
|||||||
layer: LAYERS.actor,
|
layer: LAYERS.actor,
|
||||||
collision_mask: COLLISION.block_cc2,
|
collision_mask: COLLISION.block_cc2,
|
||||||
blocks_collision: COLLISION.all,
|
blocks_collision: COLLISION.all,
|
||||||
|
item_pickup_priority: PICKUP_PRIORITIES.never,
|
||||||
is_actor: true,
|
is_actor: true,
|
||||||
is_block: true,
|
is_block: true,
|
||||||
can_reverse_on_railroad: true,
|
can_reverse_on_railroad: true,
|
||||||
@ -2657,6 +2658,23 @@ const TILE_TYPES = {
|
|||||||
// Actors are expected to have this, so populate it
|
// Actors are expected to have this, so populate it
|
||||||
level._set_tile_prop(me, 'movement_cooldown', 0);
|
level._set_tile_prop(me, 'movement_cooldown', 0);
|
||||||
level.add_actor(me);
|
level.add_actor(me);
|
||||||
|
// Dynamite inherits a copy of the player's inventory, which largely doesn't matter
|
||||||
|
// except for suction boots, helmet, or lightning bolt; keys can't matter because
|
||||||
|
// dynamite is blocked by doors
|
||||||
|
if (other.toolbelt) {
|
||||||
|
level._set_tile_prop(me, 'toolbelt', [...other.toolbelt]);
|
||||||
|
}
|
||||||
|
// Dynamite that lands on a force floor is moved by it, and dynamite that lands on a
|
||||||
|
// button holds it down
|
||||||
|
// TODO is there anything this should NOT activate?
|
||||||
|
let terrain = me.cell.get_terrain();
|
||||||
|
if (terrain && terrain.type.on_arrive && ! me.ignores(terrain.type.name)) {
|
||||||
|
terrain.type.on_arrive(terrain, level, me);
|
||||||
|
}
|
||||||
|
// FIXME Ugh should this just be step_on or what? but it doesn't slide on ice
|
||||||
|
if (terrain && terrain.type.slide_mode === 'force') {
|
||||||
|
level.make_slide(me, terrain.type.slide_mode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -2664,23 +2682,15 @@ const TILE_TYPES = {
|
|||||||
layer: LAYERS.actor,
|
layer: LAYERS.actor,
|
||||||
is_actor: true,
|
is_actor: true,
|
||||||
is_monster: true,
|
is_monster: true,
|
||||||
collision_mask: COLLISION.dropped_item,
|
collision_mask: COLLISION.block_cc1,
|
||||||
blocks_collision: COLLISION.all_but_real_player,
|
blocks_collision: COLLISION.all_but_real_player,
|
||||||
// FIXME item_pickup_priority?
|
item_pickup_priority: PICKUP_PRIORITIES.always,
|
||||||
// FIXME inherits a copy of player's inventory!
|
movement_speed: 4,
|
||||||
// FIXME holds down buttons, so needs an on_arrive
|
// FIXME especially for buttons, destroyed actors should on_depart (behind compat flag)
|
||||||
// FIXME speaking of buttons, destroyed actors should on_depart (behind compat flag)
|
decide_movement(me, level) {
|
||||||
// FIXME wait couldn't this just be a decide_movement?
|
|
||||||
on_tic(me, level) {
|
|
||||||
// FIXME When Chip or Melinda leaves a tile with a time bomb and no no sign on it, the
|
|
||||||
// time bomb will count down for about 4.3 seconds before exploding; it does not matter
|
|
||||||
// whether the player dropped the item (e.g. if the player teleported)????
|
|
||||||
if (me.slide_mode || me.movement_cooldown)
|
|
||||||
return;
|
|
||||||
|
|
||||||
level._set_tile_prop(me, 'timer', me.timer - 1);
|
level._set_tile_prop(me, 'timer', me.timer - 1);
|
||||||
if (me.timer > 0)
|
if (me.timer > 0)
|
||||||
return;
|
return null;
|
||||||
|
|
||||||
// Kaboom! Blow up a 5x5 square
|
// Kaboom! Blow up a 5x5 square
|
||||||
level.sfx.play_once('bomb', me.cell);
|
level.sfx.play_once('bomb', me.cell);
|
||||||
@ -2742,7 +2752,8 @@ const TILE_TYPES = {
|
|||||||
else if (terrain) {
|
else if (terrain) {
|
||||||
// Anything other than these babies gets blown up and turned into floor
|
// Anything other than these babies gets blown up and turned into floor
|
||||||
if (!(
|
if (!(
|
||||||
terrain.type.name === 'steel' || terrain.type.name === 'socket' || terrain.type.name === 'logic_gate' || terrain.type.name === 'floor'))
|
terrain.type.name === 'steel' || terrain.type.name === 'socket' ||
|
||||||
|
terrain.type.name === 'logic_gate' || terrain.type.name === 'floor'))
|
||||||
{
|
{
|
||||||
level.transmute_tile(terrain, 'floor');
|
level.transmute_tile(terrain, 'floor');
|
||||||
removed_anything = true;
|
removed_anything = true;
|
||||||
@ -2755,6 +2766,8 @@ const TILE_TYPES = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
},
|
},
|
||||||
visual_state(me) {
|
visual_state(me) {
|
||||||
// 0 1 2 3 4
|
// 0 1 2 3 4
|
||||||
@ -2777,7 +2790,7 @@ const TILE_TYPES = {
|
|||||||
is_monster: true,
|
is_monster: true,
|
||||||
has_inventory: true,
|
has_inventory: true,
|
||||||
can_reveal_walls: true,
|
can_reveal_walls: true,
|
||||||
collision_mask: COLLISION.dropped_item,
|
collision_mask: COLLISION.bowling_ball,
|
||||||
item_pickup_priority: PICKUP_PRIORITIES.normal,
|
item_pickup_priority: PICKUP_PRIORITIES.normal,
|
||||||
// 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,
|
||||||
@ -3245,7 +3258,7 @@ for (let [name, type] of Object.entries(TILE_TYPES)) {
|
|||||||
if (type.collision_mask === undefined)
|
if (type.collision_mask === undefined)
|
||||||
console.error(`Tile type ${name} is an actor but has no collision mask`);
|
console.error(`Tile type ${name} is an actor but has no collision mask`);
|
||||||
|
|
||||||
if (type.item_pickup_priority === undefined)
|
if (type.ttl === undefined && type.item_pickup_priority === undefined)
|
||||||
console.error(`Tile type ${name} is an actor but has no item pickup priority`);
|
console.error(`Tile type ${name} is an actor but has no item pickup priority`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user