Implement the CC1 inventory
This commit is contained in:
parent
51acfc4353
commit
d8ac50efa9
41
js/game.js
41
js/game.js
@ -99,6 +99,8 @@ export class Tile {
|
|||||||
|
|
||||||
if (this.toolbelt) {
|
if (this.toolbelt) {
|
||||||
for (let item of this.toolbelt) {
|
for (let item of this.toolbelt) {
|
||||||
|
if (! item)
|
||||||
|
continue;
|
||||||
let item_type = TILE_TYPES[item];
|
let item_type = TILE_TYPES[item];
|
||||||
if (item_type.item_ignores && item_type.item_ignores.has(name))
|
if (item_type.item_ignores && item_type.item_ignores.has(name))
|
||||||
return true;
|
return true;
|
||||||
@ -383,6 +385,8 @@ export class Cell extends Array {
|
|||||||
// sitting completely idle, undo consumes about 2 MB every five seconds, so this shouldn't go beyond
|
// sitting completely idle, undo consumes about 2 MB every five seconds, so this shouldn't go beyond
|
||||||
// 12 MB for any remotely reasonable level.
|
// 12 MB for any remotely reasonable level.
|
||||||
const UNDO_BUFFER_SIZE = TICS_PER_SECOND * 30;
|
const UNDO_BUFFER_SIZE = TICS_PER_SECOND * 30;
|
||||||
|
// The CC1 inventory has a fixed boot order
|
||||||
|
const CC1_INVENTORY_ORDER = ['cleats', 'suction_boots', 'fire_boots', 'flippers'];
|
||||||
export class Level extends LevelInterface {
|
export class Level extends LevelInterface {
|
||||||
constructor(stored_level, compat = {}) {
|
constructor(stored_level, compat = {}) {
|
||||||
super();
|
super();
|
||||||
@ -2427,7 +2431,9 @@ export class Level extends LevelInterface {
|
|||||||
// Thus we have to check whether dropping is possible FIRST, but only place the dropped item
|
// Thus we have to check whether dropping is possible FIRST, but only place the dropped item
|
||||||
// AFTER the pickup.
|
// AFTER the pickup.
|
||||||
let dropped_item;
|
let dropped_item;
|
||||||
if (! tile.type.is_key && actor.toolbelt && actor.toolbelt.length >= 4) {
|
if (! tile.type.is_key && ! this.stored_level.use_cc1_boots &&
|
||||||
|
actor.toolbelt && actor.toolbelt.length >= 4)
|
||||||
|
{
|
||||||
let oldest_item_type = TILE_TYPES[actor.toolbelt[0]];
|
let oldest_item_type = TILE_TYPES[actor.toolbelt[0]];
|
||||||
if (oldest_item_type.layer === LAYERS.terrain && cell.get_terrain().type.name !== 'floor') {
|
if (oldest_item_type.layer === LAYERS.terrain && cell.get_terrain().type.name !== 'floor') {
|
||||||
// This is a yellow teleporter, and we are not standing on floor; abort!
|
// This is a yellow teleporter, and we are not standing on floor; abort!
|
||||||
@ -2465,7 +2471,6 @@ export class Level extends LevelInterface {
|
|||||||
|
|
||||||
// Give an item to an actor, even if it's not supposed to have an inventory
|
// Give an item to an actor, even if it's not supposed to have an inventory
|
||||||
give_actor(actor, name) {
|
give_actor(actor, name) {
|
||||||
// TODO support use_cc1_boots here -- silently consume dupes, only do cc1 items
|
|
||||||
if (! actor.type.is_actor)
|
if (! actor.type.is_actor)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -2483,16 +2488,31 @@ export class Level extends LevelInterface {
|
|||||||
actor.toolbelt = [];
|
actor.toolbelt = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nothing can hold more than four items, so try to drop one first. Note that normally,
|
if (this.stored_level.use_cc1_boots) {
|
||||||
// this should already have happened in attempt_take, so this should only come up when
|
// CC1's boot inventory is different; it has fixed slots, and duplicate items are
|
||||||
// forcibly given an item via debug tools
|
// silently ignored. CC2 items cannot be picked up.
|
||||||
if (actor.toolbelt.length >= 4) {
|
let i = CC1_INVENTORY_ORDER.indexOf(name);
|
||||||
if (! this.drop_item(actor))
|
if (i < 0)
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
actor.toolbelt.push(name);
|
if (! actor.toolbelt[i]) {
|
||||||
this._push_pending_undo(() => actor.toolbelt.pop());
|
this._push_pending_undo(() => actor.toolbelt[i] = null);
|
||||||
|
}
|
||||||
|
actor.toolbelt[i] = name;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// "Normal" (CC2) inventory mode.
|
||||||
|
// Nothing can hold more than four items, so try to drop one first. Note that
|
||||||
|
// normally, this should already have happened in attempt_take, so this should only
|
||||||
|
// come up when forcibly given an item via debug tools
|
||||||
|
if (actor.toolbelt.length >= 4) {
|
||||||
|
if (! this.drop_item(actor))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
actor.toolbelt.push(name);
|
||||||
|
this._push_pending_undo(() => actor.toolbelt.pop());
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME hardcodey, but, this doesn't seem to fit anywhere else
|
// FIXME hardcodey, but, this doesn't seem to fit anywhere else
|
||||||
if (name === 'cleats' && actor.slide_mode === 'ice') {
|
if (name === 'cleats' && actor.slide_mode === 'ice') {
|
||||||
@ -2520,6 +2540,7 @@ export class Level extends LevelInterface {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note that this doesn't support CC1 mode, but only CC2 and LL tools are individually taken
|
||||||
take_tool_from_actor(actor, name) {
|
take_tool_from_actor(actor, name) {
|
||||||
if (actor.toolbelt) {
|
if (actor.toolbelt) {
|
||||||
let index = actor.toolbelt.indexOf(name);
|
let index = actor.toolbelt.indexOf(name);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user