Handle actors starting on force floors; partially implement item bestowal
This commit is contained in:
parent
3514f25f2b
commit
e803af2fd2
18
js/game.js
18
js/game.js
@ -137,6 +137,22 @@ export class Cell extends Array {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_actor() {
|
||||||
|
for (let tile of this) {
|
||||||
|
if (tile.type.is_actor)
|
||||||
|
return tile;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
get_item() {
|
||||||
|
for (let tile of this) {
|
||||||
|
if (tile.type.is_item)
|
||||||
|
return tile;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
blocks_leaving(actor, direction) {
|
blocks_leaving(actor, direction) {
|
||||||
for (let tile of this) {
|
for (let tile of this) {
|
||||||
if (tile !== actor &&
|
if (tile !== actor &&
|
||||||
@ -371,6 +387,8 @@ export class Level {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Erase undo, in case any on_ready added to it (we don't want to undo initialization!)
|
||||||
|
this.pending_undo = this.create_undo_entry();
|
||||||
}
|
}
|
||||||
|
|
||||||
can_accept_input() {
|
can_accept_input() {
|
||||||
|
|||||||
@ -5,12 +5,14 @@ import TILE_TYPES from './tiletypes.js';
|
|||||||
// XXX special kinds of drawing i know this has for a fact:
|
// XXX special kinds of drawing i know this has for a fact:
|
||||||
// - letter tiles draw from a block of half-tiles onto the center of the base
|
// - letter tiles draw from a block of half-tiles onto the center of the base
|
||||||
// - slime and walkers have double-size tiles when moving
|
// - slime and walkers have double-size tiles when moving
|
||||||
|
// - force floors are cropped from a double-size tile
|
||||||
// - wired tiles are a whole thing
|
// - wired tiles are a whole thing
|
||||||
// - thin walls are packed into just two tiles
|
// - thin walls are packed into just two tiles
|
||||||
// - rover has a half-tile overlay for its direction?
|
// - rover has a half-tile overlay for its direction?
|
||||||
// - railroad tracks overlay a Lot
|
// - railroad tracks overlay a Lot
|
||||||
// - directional blocks have arrows in an awkward layout, not 4x4 grid but actually positioned on the edges
|
// - directional blocks have arrows in an awkward layout, not 4x4 grid but actually positioned on the edges
|
||||||
// - green and purple toggle walls use an overlay
|
// - green and purple toggle walls use an overlay
|
||||||
|
// - turtles use an overlay
|
||||||
export const CC2_TILESET_LAYOUT = {
|
export const CC2_TILESET_LAYOUT = {
|
||||||
'#wire-width': 1/16,
|
'#wire-width': 1/16,
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,40 @@ const LAYER_ACTOR = 3;
|
|||||||
const LAYER_OVERLAY = 4;
|
const LAYER_OVERLAY = 4;
|
||||||
// TODO cc2 order is: swivel, thinwalls, canopy (and yes you can have them all in the same tile)
|
// TODO cc2 order is: swivel, thinwalls, canopy (and yes you can have them all in the same tile)
|
||||||
|
|
||||||
|
function on_ready_force_floor(me, level) {
|
||||||
|
// At the start of the level, if there's an actor on a force floor:
|
||||||
|
// - use on_arrive to set the actor's direction
|
||||||
|
// - set the slide_mode (normally done by the main game loop)
|
||||||
|
// - item bestowal: if they're being pushed into a wall and standing on an item, pick up the
|
||||||
|
// item, even if they couldn't normally pick items up
|
||||||
|
let actor = me.cell.get_actor();
|
||||||
|
if (! actor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
me.type.on_arrive(me, level, actor);
|
||||||
|
if (me.type.slide_mode) {
|
||||||
|
actor.slide_mode = me.type.slide_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Item bestowal
|
||||||
|
// TODO seemingly lynx/cc2 only pick RFF direction at decision time, but that's in conflict with
|
||||||
|
// doing this here; decision time hasn't happened yet, but we need to know what direction we're
|
||||||
|
// moving to know whether bestowal happens? so what IS the cause of item bestowal?
|
||||||
|
let neighbor = level.get_neighboring_cell(me.cell, actor.direction);
|
||||||
|
if (! neighbor)
|
||||||
|
return;
|
||||||
|
if (! neighbor.blocks_entering(actor, actor.direction, level, true))
|
||||||
|
return;
|
||||||
|
let item = me.cell.get_item();
|
||||||
|
if (! item)
|
||||||
|
return;
|
||||||
|
if (level.attempt_take(actor, item) && actor.ignores(me.type.name)) {
|
||||||
|
// If they just picked up suction boots, they're no longer sliding
|
||||||
|
// TODO this feels hacky, shouldn't the slide mode be erased some other way?
|
||||||
|
actor.slide_mode = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function player_visual_state(me) {
|
function player_visual_state(me) {
|
||||||
if (! me) {
|
if (! me) {
|
||||||
return 'normal';
|
return 'normal';
|
||||||
@ -467,6 +501,7 @@ const TILE_TYPES = {
|
|||||||
force_floor_n: {
|
force_floor_n: {
|
||||||
draw_layer: LAYER_TERRAIN,
|
draw_layer: LAYER_TERRAIN,
|
||||||
slide_mode: 'force',
|
slide_mode: 'force',
|
||||||
|
on_ready: on_ready_force_floor,
|
||||||
on_arrive(me, level, other) {
|
on_arrive(me, level, other) {
|
||||||
level.set_actor_direction(other, 'north');
|
level.set_actor_direction(other, 'north');
|
||||||
},
|
},
|
||||||
@ -474,6 +509,7 @@ const TILE_TYPES = {
|
|||||||
force_floor_e: {
|
force_floor_e: {
|
||||||
draw_layer: LAYER_TERRAIN,
|
draw_layer: LAYER_TERRAIN,
|
||||||
slide_mode: 'force',
|
slide_mode: 'force',
|
||||||
|
on_ready: on_ready_force_floor,
|
||||||
on_arrive(me, level, other) {
|
on_arrive(me, level, other) {
|
||||||
level.set_actor_direction(other, 'east');
|
level.set_actor_direction(other, 'east');
|
||||||
},
|
},
|
||||||
@ -481,6 +517,7 @@ const TILE_TYPES = {
|
|||||||
force_floor_s: {
|
force_floor_s: {
|
||||||
draw_layer: LAYER_TERRAIN,
|
draw_layer: LAYER_TERRAIN,
|
||||||
slide_mode: 'force',
|
slide_mode: 'force',
|
||||||
|
on_ready: on_ready_force_floor,
|
||||||
on_arrive(me, level, other) {
|
on_arrive(me, level, other) {
|
||||||
level.set_actor_direction(other, 'south');
|
level.set_actor_direction(other, 'south');
|
||||||
},
|
},
|
||||||
@ -488,6 +525,7 @@ const TILE_TYPES = {
|
|||||||
force_floor_w: {
|
force_floor_w: {
|
||||||
draw_layer: LAYER_TERRAIN,
|
draw_layer: LAYER_TERRAIN,
|
||||||
slide_mode: 'force',
|
slide_mode: 'force',
|
||||||
|
on_ready: on_ready_force_floor,
|
||||||
on_arrive(me, level, other) {
|
on_arrive(me, level, other) {
|
||||||
level.set_actor_direction(other, 'west');
|
level.set_actor_direction(other, 'west');
|
||||||
},
|
},
|
||||||
@ -495,6 +533,7 @@ const TILE_TYPES = {
|
|||||||
force_floor_all: {
|
force_floor_all: {
|
||||||
draw_layer: LAYER_TERRAIN,
|
draw_layer: LAYER_TERRAIN,
|
||||||
slide_mode: 'force',
|
slide_mode: 'force',
|
||||||
|
on_ready: on_ready_force_floor,
|
||||||
// TODO ms: this is random, and an acting wall to monsters (!)
|
// TODO ms: this is random, and an acting wall to monsters (!)
|
||||||
// TODO lynx/cc2 check this at decision time, which may affect ordering
|
// TODO lynx/cc2 check this at decision time, which may affect ordering
|
||||||
on_arrive(me, level, other) {
|
on_arrive(me, level, other) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user