Merge pull request #15 from magical/undon't
Disable undo during bulk testing
This commit is contained in:
commit
8742e4de25
51
js/game.js
51
js/game.js
@ -375,6 +375,10 @@ export class Level extends LevelInterface {
|
|||||||
}
|
}
|
||||||
this.undo_buffer_index = 0;
|
this.undo_buffer_index = 0;
|
||||||
this.pending_undo = this.create_undo_entry();
|
this.pending_undo = this.create_undo_entry();
|
||||||
|
// If undo_enabled is false, we won't create any undo entries.
|
||||||
|
// Undo is only disabled during bulk testing, where a) there's no
|
||||||
|
// possibility of needing to undo and b) the overhead is noticable.
|
||||||
|
this.undo_enabled = true;
|
||||||
|
|
||||||
let n = 0;
|
let n = 0;
|
||||||
let connectables = [];
|
let connectables = [];
|
||||||
@ -657,6 +661,7 @@ export class Level extends LevelInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
begin_tic(p1_input) {
|
begin_tic(p1_input) {
|
||||||
|
if (this.undo_enabled) {
|
||||||
// Store some current level state in the undo entry. (These will often not be modified, but
|
// Store some current level state in the undo entry. (These will often not be modified, but
|
||||||
// they only take a few bytes each so that's fine.)
|
// they only take a few bytes each so that's fine.)
|
||||||
for (let key of [
|
for (let key of [
|
||||||
@ -667,6 +672,7 @@ export class Level extends LevelInterface {
|
|||||||
]) {
|
]) {
|
||||||
this.pending_undo.level_props[key] = this[key];
|
this.pending_undo.level_props[key] = this[key];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
this.p1_input = p1_input;
|
this.p1_input = p1_input;
|
||||||
this.p1_released |= ~p1_input; // Action keys released since we last checked them
|
this.p1_released |= ~p1_input; // Action keys released since we last checked them
|
||||||
this.swap_player1 = false;
|
this.swap_player1 = false;
|
||||||
@ -848,7 +854,7 @@ export class Level extends LevelInterface {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let local_p = p;
|
let local_p = p;
|
||||||
this.pending_undo.push(() => this.actors.splice(local_p, 0, actor));
|
this._push_pending_undo(() => this.actors.splice(local_p, 0, actor));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.actors.length = p;
|
this.actors.length = p;
|
||||||
@ -1506,7 +1512,7 @@ export class Level extends LevelInterface {
|
|||||||
// Cycle leftwards, i.e., the oldest item moves to the end of the list
|
// Cycle leftwards, i.e., the oldest item moves to the end of the list
|
||||||
if (actor.toolbelt && actor.toolbelt.length > 1) {
|
if (actor.toolbelt && actor.toolbelt.length > 1) {
|
||||||
actor.toolbelt.push(actor.toolbelt.shift());
|
actor.toolbelt.push(actor.toolbelt.shift());
|
||||||
this.pending_undo.push(() => actor.toolbelt.unshift(actor.toolbelt.pop()));
|
this._push_pending_undo(() => actor.toolbelt.unshift(actor.toolbelt.pop()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1544,7 +1550,7 @@ export class Level extends LevelInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
actor.toolbelt.shift();
|
actor.toolbelt.shift();
|
||||||
this.pending_undo.push(() => actor.toolbelt.unshift(name));
|
this._push_pending_undo(() => actor.toolbelt.unshift(name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1664,7 +1670,7 @@ export class Level extends LevelInterface {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.pending_undo.push(() => {
|
this._push_pending_undo(() => {
|
||||||
for (let [tile, edges] of powered_edges_changes.entries()) {
|
for (let [tile, edges] of powered_edges_changes.entries()) {
|
||||||
tile.powered_edges = edges;
|
tile.powered_edges = edges;
|
||||||
}
|
}
|
||||||
@ -1778,6 +1784,9 @@ export class Level extends LevelInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
commit() {
|
commit() {
|
||||||
|
if (! this.undo_enabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.undo_buffer[this.undo_buffer_index] = this.pending_undo;
|
this.undo_buffer[this.undo_buffer_index] = this.pending_undo;
|
||||||
this.pending_undo = this.create_undo_entry();
|
this.pending_undo = this.create_undo_entry();
|
||||||
|
|
||||||
@ -1821,12 +1830,22 @@ export class Level extends LevelInterface {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_push_pending_undo(thunk) {
|
||||||
|
if (this.undo_enabled) {
|
||||||
|
this.pending_undo.push(thunk)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// Level alteration methods. EVERYTHING that changes the state of a level,
|
// Level alteration methods. EVERYTHING that changes the state of a level,
|
||||||
// including the state of a single tile, should do it through one of these
|
// including the state of a single tile, should do it through one of these
|
||||||
// for undo/rewind purposes
|
// for undo/rewind purposes
|
||||||
|
|
||||||
_set_tile_prop(tile, key, val) {
|
_set_tile_prop(tile, key, val) {
|
||||||
|
if (! this.undo_enabled) {
|
||||||
|
tile[key] = val;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (tile[key] === val)
|
if (tile[key] === val)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1887,7 +1906,7 @@ export class Level extends LevelInterface {
|
|||||||
this.sfx.play_once('lose');
|
this.sfx.play_once('lose');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.pending_undo.push(() => {
|
this._push_pending_undo(() => {
|
||||||
this.fail_reason = null;
|
this.fail_reason = null;
|
||||||
this.player.fail_reason = null;
|
this.player.fail_reason = null;
|
||||||
});
|
});
|
||||||
@ -1936,17 +1955,17 @@ export class Level extends LevelInterface {
|
|||||||
remove_tile(tile) {
|
remove_tile(tile) {
|
||||||
let cell = tile.cell;
|
let cell = tile.cell;
|
||||||
let index = cell._remove(tile);
|
let index = cell._remove(tile);
|
||||||
this.pending_undo.push(() => cell._add(tile, index));
|
this._push_pending_undo(() => cell._add(tile, index));
|
||||||
}
|
}
|
||||||
|
|
||||||
add_tile(tile, cell, index = null) {
|
add_tile(tile, cell, index = null) {
|
||||||
cell._add(tile, index);
|
cell._add(tile, index);
|
||||||
this.pending_undo.push(() => cell._remove(tile));
|
this._push_pending_undo(() => cell._remove(tile));
|
||||||
}
|
}
|
||||||
|
|
||||||
add_actor(actor) {
|
add_actor(actor) {
|
||||||
this.actors.push(actor);
|
this.actors.push(actor);
|
||||||
this.pending_undo.push(() => this.actors.pop());
|
this._push_pending_undo(() => this.actors.pop());
|
||||||
}
|
}
|
||||||
|
|
||||||
spawn_animation(cell, name) {
|
spawn_animation(cell, name) {
|
||||||
@ -1961,7 +1980,7 @@ export class Level extends LevelInterface {
|
|||||||
this._set_tile_prop(tile, 'movement_cooldown', tile.type.ttl - 1);
|
this._set_tile_prop(tile, 'movement_cooldown', tile.type.ttl - 1);
|
||||||
cell._add(tile);
|
cell._add(tile);
|
||||||
this.actors.push(tile);
|
this.actors.push(tile);
|
||||||
this.pending_undo.push(() => {
|
this._push_pending_undo(() => {
|
||||||
this.actors.pop();
|
this.actors.pop();
|
||||||
cell._remove(tile);
|
cell._remove(tile);
|
||||||
});
|
});
|
||||||
@ -1969,7 +1988,7 @@ export class Level extends LevelInterface {
|
|||||||
|
|
||||||
transmute_tile(tile, name) {
|
transmute_tile(tile, name) {
|
||||||
let current = tile.type.name;
|
let current = tile.type.name;
|
||||||
this.pending_undo.push(() => tile.type = TILE_TYPES[current]);
|
this._push_pending_undo(() => tile.type = TILE_TYPES[current]);
|
||||||
tile.type = TILE_TYPES[name];
|
tile.type = TILE_TYPES[name];
|
||||||
|
|
||||||
// For transmuting into an animation, set up the timer immediately
|
// For transmuting into an animation, set up the timer immediately
|
||||||
@ -2018,7 +2037,7 @@ export class Level extends LevelInterface {
|
|||||||
actor.keyring = {};
|
actor.keyring = {};
|
||||||
}
|
}
|
||||||
actor.keyring[name] = (actor.keyring[name] ?? 0) + 1;
|
actor.keyring[name] = (actor.keyring[name] ?? 0) + 1;
|
||||||
this.pending_undo.push(() => actor.keyring[name] -= 1);
|
this._push_pending_undo(() => actor.keyring[name] -= 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// tool, presumably
|
// tool, presumably
|
||||||
@ -2026,7 +2045,7 @@ export class Level extends LevelInterface {
|
|||||||
actor.toolbelt = [];
|
actor.toolbelt = [];
|
||||||
}
|
}
|
||||||
actor.toolbelt.push(name);
|
actor.toolbelt.push(name);
|
||||||
this.pending_undo.push(() => actor.toolbelt.pop());
|
this._push_pending_undo(() => actor.toolbelt.pop());
|
||||||
|
|
||||||
// Nothing can hold more than four items
|
// Nothing can hold more than four items
|
||||||
if (actor.toolbelt.length > 4) {
|
if (actor.toolbelt.length > 4) {
|
||||||
@ -2043,7 +2062,7 @@ export class Level extends LevelInterface {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.pending_undo.push(() => actor.keyring[name] += 1);
|
this._push_pending_undo(() => actor.keyring[name] += 1);
|
||||||
actor.keyring[name] -= 1;
|
actor.keyring[name] -= 1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -2056,7 +2075,7 @@ export class Level extends LevelInterface {
|
|||||||
let index = actor.toolbelt.indexOf(name);
|
let index = actor.toolbelt.indexOf(name);
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
actor.toolbelt.splice(index, 1);
|
actor.toolbelt.splice(index, 1);
|
||||||
this.pending_undo.push(() => actor.toolbelt.splice(index, 0, name));
|
this._push_pending_undo(() => actor.toolbelt.splice(index, 0, name));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2067,7 +2086,7 @@ export class Level extends LevelInterface {
|
|||||||
take_all_keys_from_actor(actor) {
|
take_all_keys_from_actor(actor) {
|
||||||
if (actor.keyring && Object.values(actor.keyring).some(n => n > 0)) {
|
if (actor.keyring && Object.values(actor.keyring).some(n => n > 0)) {
|
||||||
let keyring = actor.keyring;
|
let keyring = actor.keyring;
|
||||||
this.pending_undo.push(() => actor.keyring = keyring);
|
this._push_pending_undo(() => actor.keyring = keyring);
|
||||||
actor.keyring = {};
|
actor.keyring = {};
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -2076,7 +2095,7 @@ export class Level extends LevelInterface {
|
|||||||
take_all_tools_from_actor(actor) {
|
take_all_tools_from_actor(actor) {
|
||||||
if (actor.toolbelt && actor.toolbelt.length > 0) {
|
if (actor.toolbelt && actor.toolbelt.length > 0) {
|
||||||
let toolbelt = actor.toolbelt;
|
let toolbelt = actor.toolbelt;
|
||||||
this.pending_undo.push(() => actor.toolbelt = toolbelt);
|
this._push_pending_undo(() => actor.toolbelt = toolbelt);
|
||||||
actor.toolbelt = [];
|
actor.toolbelt = [];
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2173,6 +2173,7 @@ class PackTestDialog extends DialogOverlay {
|
|||||||
level.sfx = dummy_sfx;
|
level.sfx = dummy_sfx;
|
||||||
level.force_floor_direction = replay.initial_force_floor_direction;
|
level.force_floor_direction = replay.initial_force_floor_direction;
|
||||||
level._blob_modifier = replay.blob_seed;
|
level._blob_modifier = replay.blob_seed;
|
||||||
|
level.undo_enabled = false; // slight performance boost
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
let input = replay.get(level.tic_counter);
|
let input = replay.get(level.tic_counter);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user