diff --git a/js/game.js b/js/game.js index a7d835f..378d1ee 100644 --- a/js/game.js +++ b/js/game.js @@ -1266,6 +1266,7 @@ export class Level extends LevelInterface { // At this point, we have exactly 1 or 2 directions, and deciding between them requires // checking which ones are blocked. Note that we do this even if only one direction is // requested, meaning that we get to push blocks before anything else has moved! + let push_mode = this.compat.no_early_push ? 'bump' : 'push'; let open; if (dir2 === null) { // Only one direction is held, but for consistency, "check" it anyway diff --git a/js/main.js b/js/main.js index 7071c16..220bc5a 100644 --- a/js/main.js +++ b/js/main.js @@ -2890,6 +2890,11 @@ const COMPAT_FLAGS = [{ label: "Player pulls blocks at decision time", // TODO maybe steam as well? rulesets: new Set(['steam-strict']), +}, { + key: 'blue_keys_not_edible', + label: "Monsters do not eat blue keys", + // TODO wonder if this should also remove the special behavior of red keys + rulesets: new Set(['ms']), }, { // XXX this is goofy key: 'tiles_react_instantly', @@ -2910,6 +2915,10 @@ const COMPAT_FLAGS = [{ key: 'use_lynx_loop', label: "Use Lynx-style update loop", rulesets: new Set(['steam', 'steam-strict', 'lynx', 'ms']), +}, { + key: 'no_early_push', + label: "Player doesn't push at decision time", + rulesets: new Set(['lynx', 'ms']), }, { key: 'emulate_60fps', label: "Run at 60 FPS", diff --git a/js/tiletypes.js b/js/tiletypes.js index 07477ab..d4664db 100644 --- a/js/tiletypes.js +++ b/js/tiletypes.js @@ -2215,7 +2215,7 @@ const TILE_TYPES = { // actors who aren't supposed to have an inventory // TODO make this a... flag? i don't know? // TODO major difference from lynx... - if (other.type.name !== 'ice_block' && other.type.name !== 'frame_block') { + if (other.type.name !== 'ice_block' && other.type.name !== 'frame_block' && ! level.compat.blue_keys_not_edible) { level.attempt_take(other, me); } },