New MS compat flag: Block splashes don't block the player

This commit is contained in:
Eevee (Evelyn Woods) 2024-04-24 03:32:15 -06:00
parent df0ab43e70
commit 55c4c574ec
3 changed files with 22 additions and 7 deletions

View File

@ -261,6 +261,10 @@ export const COMPAT_FLAGS = [
key: 'emulate_spring_mining', key: 'emulate_spring_mining',
label: "Spring mining is possible", label: "Spring mining is possible",
rulesets: new Set(['steam-strict']), rulesets: new Set(['steam-strict']),
}, {
key: 'block_splashes_dont_block',
label: "Block splashes don't block the player",
rulesets: new Set(['ms']),
/* XXX not implemented /* XXX not implemented
}, { }, {
key: 'emulate_flicking', key: 'emulate_flicking',

View File

@ -160,6 +160,7 @@ export const CC2_TILESET_LAYOUT = {
explosion_nb: [[0, 5], [1, 5], [2, 5], [3, 5]], explosion_nb: [[0, 5], [1, 5], [2, 5], [3, 5]],
splash_slime: [[0, 5], [1, 5], [2, 5], [3, 5]], splash_slime: [[0, 5], [1, 5], [2, 5], [3, 5]],
splash: [[4, 5], [5, 5], [6, 5], [7, 5]], splash: [[4, 5], [5, 5], [6, 5], [7, 5]],
splash_nb: [[4, 5], [5, 5], [6, 5], [7, 5]],
flame_jet_off: [8, 5], flame_jet_off: [8, 5],
flame_jet_on: { flame_jet_on: {
__special__: 'animated', __special__: 'animated',
@ -910,6 +911,7 @@ export const TILE_WORLD_TILESET_LAYOUT = {
cloner: [3, 1], cloner: [3, 1],
force_floor_all: [3, 2], force_floor_all: [3, 2],
splash: [3, 3], splash: [3, 3],
splash_nb: [3, 3],
bogus_player_drowned: [3, 3], bogus_player_drowned: [3, 3],
bogus_player_burned_fire: [3, 4], bogus_player_burned_fire: [3, 4],
bogus_player_burned: [3, 5], bogus_player_burned: [3, 5],
@ -2033,6 +2035,7 @@ export const LL_TILESET_LAYOUT = {
explosion: [[16, 26], [17, 26], [18, 26], [19, 26]], explosion: [[16, 26], [17, 26], [18, 26], [19, 26]],
explosion_nb: [[16, 26], [17, 26], [18, 26], [19, 26]], explosion_nb: [[16, 26], [17, 26], [18, 26], [19, 26]],
splash: [[16, 27], [17, 27], [18, 27], [19, 27]], splash: [[16, 27], [17, 27], [18, 27], [19, 27]],
splash_nb: [[16, 27], [17, 27], [18, 27], [19, 27]],
splash_slime: [[16, 28], [17, 28], [18, 28], [19, 28]], splash_slime: [[16, 28], [17, 28], [18, 28], [19, 28]],
fall: [[16, 29], [17, 29], [18, 29], [19, 29]], fall: [[16, 29], [17, 29], [18, 29], [19, 29]],
player1_exit: [[20, 28], [21, 28], [22, 28], [23, 28]], player1_exit: [[20, 28], [21, 28], [22, 28], [23, 28]],

View File

@ -882,30 +882,31 @@ const TILE_TYPES = {
on_arrive(me, level, other) { on_arrive(me, level, other) {
// TODO cc1 allows items under water, i think; water was on the upper layer // TODO cc1 allows items under water, i think; water was on the upper layer
level.sfx.play_once('splash', me.cell); level.sfx.play_once('splash', me.cell);
let splash_type = level.compat.block_splashes_dont_block ? 'splash_nb' : 'splash';
if (other.type.name === 'dirt_block') { if (other.type.name === 'dirt_block') {
level.transmute_tile(other, 'splash'); level.transmute_tile(other, splash_type);
level.transmute_tile(me, 'dirt'); level.transmute_tile(me, 'dirt');
} }
else if (other.type.name === 'frame_block') { else if (other.type.name === 'frame_block') {
level.transmute_tile(other, 'splash'); level.transmute_tile(other, splash_type);
level.transmute_tile(me, 'floor'); level.transmute_tile(me, 'floor');
} }
else if (other.type.name === 'glass_block') { else if (other.type.name === 'glass_block') {
level.transmute_tile(other, 'splash'); level.transmute_tile(other, splash_type);
level.transmute_tile(me, 'floor'); level.transmute_tile(me, 'floor');
} }
else if (other.type.name === 'ice_block') { else if (other.type.name === 'ice_block') {
level.transmute_tile(other, 'splash'); level.transmute_tile(other, splash_type);
level.transmute_tile(me, 'ice'); level.transmute_tile(me, 'ice');
} }
else if (other.type.name === 'boulder') { else if (other.type.name === 'boulder') {
level.transmute_tile(other, 'splash'); level.transmute_tile(other, splash_type);
level.transmute_tile(me, 'gravel'); level.transmute_tile(me, 'gravel');
} }
else if (other.type.name === 'circuit_block') { else if (other.type.name === 'circuit_block') {
level.transmute_tile(me, 'floor'); level.transmute_tile(me, 'floor');
level._set_tile_prop(me, 'wire_directions', other.wire_directions); level._set_tile_prop(me, 'wire_directions', other.wire_directions);
level.transmute_tile(other, 'splash'); level.transmute_tile(other, splash_type);
level.recalculate_circuitry_next_wire_phase = true; level.recalculate_circuitry_next_wire_phase = true;
} }
else if (other.type.name === 'sokoban_block') { else if (other.type.name === 'sokoban_block') {
@ -915,7 +916,7 @@ const TILE_TYPES = {
yellow: 'floor_custom_yellow', yellow: 'floor_custom_yellow',
green: 'floor_custom_green', green: 'floor_custom_green',
})[other.color]); })[other.color]);
level.transmute_tile(other, 'splash'); level.transmute_tile(other, splash_type);
} }
else { else {
level.kill_actor(other, me, 'splash', null, 'drowned'); level.kill_actor(other, me, 'splash', null, 'drowned');
@ -3262,6 +3263,13 @@ const TILE_TYPES = {
} }
}, },
}, },
// Non-blocking splash used for visual effect in MS
splash_nb: {
layer: LAYERS.vfx,
is_actor: true,
collision_mask: 0,
ttl: 16,
},
// Non-blocking explosion used for better handling edge cases with dynamite and bowling balls, // Non-blocking explosion used for better handling edge cases with dynamite and bowling balls,
// without changing gameplay // without changing gameplay
explosion_nb: { explosion_nb: {