diff --git a/patches/ips/animated_map_tiles.ips b/patches/ips/animated_map_tiles.ips new file mode 100644 index 000000000..9e34a4a72 Binary files /dev/null and b/patches/ips/animated_map_tiles.ips differ diff --git a/patches/rom_map/Bank DF.txt b/patches/rom_map/Bank DF.txt index 270a1b95f..58e330a70 100644 --- a/patches/rom_map/Bank DF.txt +++ b/patches/rom_map/Bank DF.txt @@ -2,7 +2,8 @@ D4DF - D761: ; credits.asm D91B - DF0A: ; credits.asm E000 - E127: ; credits.asm E200 - E212: ; alternate_door_colors.asm -E212 - FEEF: [free] +E212 - E3C2: ; animated_map_tiles.asm +E3C2 - FEF0: [free] FEF0 - FEFF: seed name (null-terminated ASCII string) FF00 - FF03: display seed / internal seed hash FF04 - FF04: [free] diff --git a/patches/rom_map/RAM.txt b/patches/rom_map/RAM.txt index 43f496c4e..6a1ad7731 100644 --- a/patches/rom_map/RAM.txt +++ b/patches/rom_map/RAM.txt @@ -48,7 +48,8 @@ $7EF597-$7EF599: split_speed.asm $7EF59A-$7EF59C: reserve_backward_fill.asm $7EF59C-$7EF59E: crash_handle_xmode.asm $7EF59E-$7EF5A0: trimmed_fanfare.asm -$7EF5A0-$7EFE00: [FREE] +$7EF5A0-$7EF5A6: animated_map_tiles.asm +$7EF5A6-$7EFE00: [FREE] $7EFE00: map area (copy of $1F5B to be saved to SRAM) $7EFE02: map area explored mask $7EFE04: copy of $1F5D (to be saved to SRAM for escape autosave) diff --git a/patches/src/animated_map_tiles.asm b/patches/src/animated_map_tiles.asm new file mode 100644 index 000000000..4883529e8 --- /dev/null +++ b/patches/src/animated_map_tiles.asm @@ -0,0 +1,239 @@ +;; Animated Maptiles for pause map double_item rooms +;; nn_357 + +lorom +arch 65816 + +!bank_df_free_space_start = $dfe212 ; this location must match fn write_double_item_table in map_tiles.rs +!bank_df_free_space_end = $dfe3c2 + +!interval = #$001B +!current_area = $7e1f5b +!animate_mask = $7ef5a0 +!tile_timer = $7ef5a2 +!tile_state = $7ef5a4 + +;;; Vanilla hooks + +org $82913B ;;; $9120: Pause menu - index 0: map screen ;;; + jsl AnimateTile + nop + nop + +org $82941e ;;; ;;; $93C3: Load pause menu map tilemap and area label ;;; + jsl BuildAnimateBitMask + nop + nop + nop + nop + + +;;; Custom code + +org !bank_df_free_space_start + +; the contents of this table is modified by fn write_double_item_table in map_tiles.rs +; +; +0 area index [table is generated in area order of the rooms] +; +2 VRAM tilemap dest +; +4 tile_a, the priority tile, revealed (palette 7). $FFFF if both items are the same type, so it never matches and tries to flip a tile to an identical tile +; +6 tile_b, the other item’s tile, revealed (palette 7) +; +8 byte offset of tile_b’s item in the collected-items array at $7ED870 +; +10 bit mask for tile_b’s item within that byte +; +12 tile_a for visited tiles (palette 2). $FFFF if same type +; +14 tile_b for visited tiles (palette 2) + +; Padding: unused entries are $FFFF, $0000, $FFFF, $0000, $0000, $0000, $FFFF, $0000. + +DoubleItemTable: + dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 ; Billy Mays + dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 ; West Sand Pit + dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 ; Watering Hole + dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 ; Green Pirates Shaft + dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 ; Green Brinstar Reserve + dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 ; Norfair Reserve + dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 ; Bomb Torizo (when it's an objective) +DoubleItemTableEnd: + +; Mask layout: !animate_mask uses bit n for “animate entry n” and bit n+8 for “entry n is visited” (VisitedRowMasks). + +RowBitMasks: + dw $0001, $0002, $0004, $0008, $0010, $0020, $0040 + +VisitedRowMasks: + dw $0101, $0202, $0404, $0808, $1010, $2020, $4040 + +BuildAnimateBitMask: + + phb + php + rep #$30 + pha + phx + phy + phk + plb + + lda #$0015 + sta !tile_timer + lda #$0000 + sta !tile_state + sta !animate_mask + + ldy #$0000 + +.loop + lda.w DoubleItemTable,y + cmp !current_area + bne .next_entry + + lda.w DoubleItemTable+8,y + tax + lda $7ed870,x + and.w DoubleItemTable+10,y + bne .next_entry + + lda.w DoubleItemTable+2,y + sec + sbc #$3000 + asl + tax + lda $7e4000,x + cmp.w DoubleItemTable+4,y + beq .revealed + cmp.w DoubleItemTable+12,y + bne .next_entry + + tya + lsr + lsr + lsr + tax + lda.w VisitedRowMasks,x + bra .set_mask + +.revealed + tya + lsr + lsr + lsr + tax + lda.w RowBitMasks,x + +.set_mask + ora !animate_mask + sta !animate_mask + +.next_entry + tya + clc + adc #$0010 + tay + cpy #DoubleItemTableEnd-DoubleItemTable + bne .loop + + ply + plx + pla + plp + plb + cmp #$0007 ; + bmi .skip ; hijacked code. (dont' think this does anything in MapRando anyway, it's for Debug options but restore it regardless.) + lda #$0000 ; +.skip + rtl + + +AnimateTile: + php + rep #$30 + lda !tile_timer + inc + cmp !interval + bcs .run + + sta !tile_timer + plp + lda #$0000 + sta $0763 + rtl + +.run + phx + phy + phb + phk + plb + + + lda #$0000 + sta !tile_timer + lda !tile_state + eor #$0002 ; byte offset of tile_a / tile_b + sta !tile_state + + lda !animate_mask + beq .done + pha ; running copy of the mask, shifted once per entry + + ldy #$0000 ; table offset + lda.l $7e0330 + tax + +.loop + lda $01,s + lsr + sta $01,s + bcc .next ; bit not set + + lda DoubleItemTable,y + cmp !current_area + bne .next + + lda #$0002 + sta $7e00d0,x ; size + lda $01,s + and #$0080 + lsr + lsr + lsr + lsr + clc + adc !tile_state + sta $7e00d2,x + tya + clc + adc #DoubleItemTable+4 + adc $7e00d2,x + sta $7e00d2,x ; source = tile_a or tile_b, revealed or visited + lda #$00df + sta $7e00d4,x ; bank (dest write below overwrites the stray high byte) + lda DoubleItemTable+2,y + sta $7e00d5,x ; VRAM dest + txa + clc + adc #$0007 + tax + +.next + tya + clc + adc #$0010 + tay + cpy #DoubleItemTableEnd-DoubleItemTable + bne .loop + + txa + sta.l $7e0330 + pla + +.done + plb + ply + plx + plp + lda #$0000 + sta $0763 + rtl + +assert pc() <= !bank_df_free_space_end \ No newline at end of file diff --git a/rust/data/presets/full-settings/Community Race Season 5.json b/rust/data/presets/full-settings/Community Race Season 5.json index 76e75fad1..4498a50a9 100644 --- a/rust/data/presets/full-settings/Community Race Season 5.json +++ b/rust/data/presets/full-settings/Community Race Season 5.json @@ -4755,6 +4755,7 @@ "room_outline_revealed": true, "opposite_area_revealed": true, "hazard_markers": true, + "animated_tiles": false, "mother_brain_fight": "Short", "supers_double": true, "escape_autosave": true, diff --git a/rust/data/presets/full-settings/Default.json b/rust/data/presets/full-settings/Default.json index 17dbbb6d2..72b1db81e 100644 --- a/rust/data/presets/full-settings/Default.json +++ b/rust/data/presets/full-settings/Default.json @@ -4667,6 +4667,7 @@ "room_outline_revealed": true, "opposite_area_revealed": false, "hazard_markers": true, + "animated_tiles": false, "mother_brain_fight": "Short", "supers_double": true, "escape_autosave": true, diff --git a/rust/data/presets/full-settings/Mentor Tournament.json b/rust/data/presets/full-settings/Mentor Tournament.json index b2434bf56..1c910df41 100644 --- a/rust/data/presets/full-settings/Mentor Tournament.json +++ b/rust/data/presets/full-settings/Mentor Tournament.json @@ -4755,6 +4755,7 @@ "room_outline_revealed": true, "opposite_area_revealed": true, "hazard_markers": true, + "animated_tiles": false, "mother_brain_fight": "Short", "supers_double": true, "escape_autosave": true, diff --git a/rust/data/presets/full-settings/Summer Series Expert Challenge.json b/rust/data/presets/full-settings/Summer Series Expert Challenge.json index 354a7ec3d..23bd298f7 100644 --- a/rust/data/presets/full-settings/Summer Series Expert Challenge.json +++ b/rust/data/presets/full-settings/Summer Series Expert Challenge.json @@ -4667,6 +4667,7 @@ "room_outline_revealed": true, "opposite_area_revealed": true, "hazard_markers": true, + "animated_tiles": false, "mother_brain_fight": "Short", "supers_double": true, "escape_autosave": true, diff --git a/rust/data/presets/quality-of-life/Default.json b/rust/data/presets/quality-of-life/Default.json index f67c790f2..0be61a02a 100644 --- a/rust/data/presets/quality-of-life/Default.json +++ b/rust/data/presets/quality-of-life/Default.json @@ -48,6 +48,7 @@ "room_outline_revealed": true, "opposite_area_revealed": false, "hazard_markers": true, + "animated_tiles": false, "mother_brain_fight": "Short", "supers_double": true, "escape_autosave": true, diff --git a/rust/data/presets/quality-of-life/High.json b/rust/data/presets/quality-of-life/High.json index cb08afbde..29c8d8b22 100644 --- a/rust/data/presets/quality-of-life/High.json +++ b/rust/data/presets/quality-of-life/High.json @@ -48,6 +48,7 @@ "room_outline_revealed": true, "opposite_area_revealed": true, "hazard_markers": true, + "animated_tiles": true, "mother_brain_fight": "Short", "supers_double": true, "escape_autosave": true, diff --git a/rust/data/presets/quality-of-life/Low.json b/rust/data/presets/quality-of-life/Low.json index 6cd0fca4d..4b9b7227f 100644 --- a/rust/data/presets/quality-of-life/Low.json +++ b/rust/data/presets/quality-of-life/Low.json @@ -48,6 +48,7 @@ "room_outline_revealed": false, "opposite_area_revealed": false, "hazard_markers": true, + "animated_tiles": false, "mother_brain_fight": "Short", "supers_double": true, "escape_autosave": true, diff --git a/rust/data/presets/quality-of-life/Max.json b/rust/data/presets/quality-of-life/Max.json index c2f1c8802..85c54343f 100644 --- a/rust/data/presets/quality-of-life/Max.json +++ b/rust/data/presets/quality-of-life/Max.json @@ -48,6 +48,7 @@ "room_outline_revealed": true, "opposite_area_revealed": true, "hazard_markers": true, + "animated_tiles": true, "mother_brain_fight": "Skip", "supers_double": true, "escape_autosave": true, diff --git a/rust/data/presets/quality-of-life/Off.json b/rust/data/presets/quality-of-life/Off.json index b3e42e4dd..85876e374 100644 --- a/rust/data/presets/quality-of-life/Off.json +++ b/rust/data/presets/quality-of-life/Off.json @@ -48,6 +48,7 @@ "room_outline_revealed": false, "opposite_area_revealed": false, "hazard_markers": false, + "animated_tiles": false, "mother_brain_fight": "Vanilla", "supers_double": false, "escape_autosave": false, diff --git a/rust/maprando-web/templates/generate/help/quality/animated_tiles.html b/rust/maprando-web/templates/generate/help/quality/animated_tiles.html new file mode 100644 index 000000000..79a911aae --- /dev/null +++ b/rust/maprando-web/templates/generate/help/quality/animated_tiles.html @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/rust/maprando-web/templates/generate/quality_of_life.html b/rust/maprando-web/templates/generate/quality_of_life.html index 12946a159..cf0cf5b1d 100644 --- a/rust/maprando-web/templates/generate/quality_of_life.html +++ b/rust/maprando-web/templates/generate/quality_of_life.html @@ -180,6 +180,24 @@

Quality-of-life options

+ +
+
+ + +
+
+ + + + +
+
@@ -872,6 +890,7 @@

Quality-of-life options

{% include "help/quality/room_outline.html" %} {% include "help/quality/opposite_area_revealed.html" %} {% include "help/quality/hazard_markers.html" %} +{% include "help/quality/animated_tiles.html" %} {% include "help/quality/mother_brain_fight.html" %} {% include "help/quality/supers_double.html" %} diff --git a/rust/maprando-web/templates/generate/scripts.html b/rust/maprando-web/templates/generate/scripts.html index baf301086..e72b32bd7 100644 --- a/rust/maprando-web/templates/generate/scripts.html +++ b/rust/maprando-web/templates/generate/scripts.html @@ -304,6 +304,7 @@ "room_outline_revealed": formData.get("room_outline_revealed") == "true", "opposite_area_revealed": formData.get("opposite_area_revealed") == "true", "hazard_markers": formData.get("hazard_markers") == "true", + "animated_tiles": formData.get("animated_tiles") == "true", "mother_brain_fight": formData.get("mother_brain_fight"), "supers_double": formData.get("supers_double") == "true", "escape_autosave": formData.get("escape_autosave") == "true", @@ -598,6 +599,7 @@ applyRadioValue("roomOutlineRevealed", preset.room_outline_revealed); applyRadioValue("oppositeAreaRevealed", preset.opposite_area_revealed); applyRadioValue("hazardMarkers", preset.hazard_markers); + applyRadioValue("animatedTiles", preset.animated_tiles); applyRadioValue("motherBrainFight", preset.mother_brain_fight); applyRadioValue("supersDouble", preset.supers_double); applyRadioValue("escapeAutosave", preset.escape_autosave); diff --git a/rust/maprando-web/templates/seed/quality_of_life_details.html b/rust/maprando-web/templates/seed/quality_of_life_details.html index 6b1456822..8cc98fa6d 100644 --- a/rust/maprando-web/templates/seed/quality_of_life_details.html +++ b/rust/maprando-web/templates/seed/quality_of_life_details.html @@ -30,6 +30,10 @@
Hazard markers:
{% if hazard_markers %}Yes{% else %}No{% endif %}
+
+
Animated map tiles:
+
{% if settings.quality_of_life_settings.animated_tiles %}Yes{% else %}No{% endif %}
+

Mother Brain fight (phases 2 and 3):
diff --git a/rust/maprando/src/patch.rs b/rust/maprando/src/patch.rs index e968239a4..034fab69d 100644 --- a/rust/maprando/src/patch.rs +++ b/rust/maprando/src/patch.rs @@ -571,6 +571,10 @@ impl Patcher<'_> { patches.push("missile_refill_all"); } + if self.settings.quality_of_life_settings.animated_tiles { + patches.push("animated_map_tiles"); + } + if self.settings.quality_of_life_settings.crash_fixes.preset != Some(CrashFixesPreset::Crash) { @@ -1069,16 +1073,13 @@ impl Patcher<'_> { } fn get_arrow_xy(&self, door: &RoomGeometryDoor) -> (isize, isize) { - if door.direction == "left" { - (door.x as isize - 1, door.y as isize) - } else if door.direction == "right" { - (door.x as isize + 1, door.y as isize) - } else if door.direction == "up" { - (door.x as isize, door.y as isize - 1) - } else if door.direction == "down" { - (door.x as isize, door.y as isize + 1) - } else { - panic!("Unrecognized door direction: {}", door.direction); + let (x, y) = (door.x as isize, door.y as isize); + match door.direction.as_str() { + "left" => (x - 1, y), + "right" => (x + 1, y), + "up" => (x, y - 1), + "down" => (x, y + 1), + other => panic!("Unrecognized door direction: {}", other), } } diff --git a/rust/maprando/src/patch/map_tiles.rs b/rust/maprando/src/patch/map_tiles.rs index 921e2f0be..4ecb37c8a 100644 --- a/rust/maprando/src/patch/map_tiles.rs +++ b/rust/maprando/src/patch/map_tiles.rs @@ -44,6 +44,7 @@ pub struct MapPatcher<'a> { pub free_tiles: Vec, // set of free tile indexes pub locked_door_state_indices: &'a [usize], pub dynamic_tile_data: Vec>, + pub bt_objective_item: Option<(usize, usize, MapTile)>, pub transition_tile_coords: Vec<(AreaIdx, isize, isize)>, pub area_min_x: [isize; NUM_AREAS], pub area_max_x: [isize; NUM_AREAS], @@ -1792,6 +1793,7 @@ impl<'a> MapPatcher<'a> { free_tiles, locked_door_state_indices, dynamic_tile_data: vec![vec![]; 6], + bt_objective_item: None, transition_tile_coords: vec![], area_min_x: [isize::MAX; NUM_AREAS], area_min_y: [isize::MAX; NUM_AREAS], @@ -2689,6 +2691,74 @@ impl<'a> MapPatcher<'a> { Ok(()) } + fn write_double_item_table( + &mut self, + area_data: &[Vec<(ItemIdx, RoomId, MapTile)>], + ) -> Result<()> { + let mut doubles: Vec<[u16; 8]> = vec![]; + for (area_idx, data) in area_data.iter().enumerate() { + for (i, (item_a, _, a)) in data.iter().enumerate() { + for (_, _, b) in &data[i + 1..] { + if a.coords != b.coords { + continue; + } + let wa = self.index_tile(a.clone(), None)? | 0x1C00; + let wb = self.index_tile(b.clone(), None)? | 0x1C00; + let wa2 = (wa & !0x1C00) | 0x0800; + let wb2 = (wb & !0x1C00) | 0x0800; + let x = a.coords.0 as isize - self.area_offset_x[area_idx]; + let y = a.coords.1 as isize - self.area_offset_y[area_idx]; + let dest = 0x3000 + xy_to_map_offset(x, y) / 2; + let same = wa == wb; + doubles.push([ + area_idx as u16, + dest as u16, + if same { 0xFFFF } else { wb }, + wa, + (item_a / 8) as u16, + 1u16 << (item_a % 8), + if same { 0xFFFF } else { wb2 }, + wa2, + ]); + } + } + } + assert!(doubles.len() <= 6); + doubles.resize(6, [0xFFFF, 0, 0xFFFF, 0, 0, 0, 0xFFFF, 0]); + + let mut bt_entry = [0xFFFF, 0, 0xFFFF, 0, 0, 0, 0xFFFF, 0]; + if let Some((area_idx, item_idx, item_tile)) = self.bt_objective_item.clone() { + let mut x_tile = item_tile.clone(); + x_tile.interior = MapTileInterior::Objective; + let wx = self.index_tile(x_tile.clone(), None)? | 0x1C00; + let wi = self.index_tile(item_tile.clone(), None)? | 0x1C00; + let wx2 = (wx & !0x1C00) | 0x0800; + let wi2 = (wi & !0x1C00) | 0x0800; + let x = x_tile.coords.0 as isize - self.area_offset_x[area_idx]; + let y = x_tile.coords.1 as isize - self.area_offset_y[area_idx]; + let dest = 0x3000 + xy_to_map_offset(x, y) / 2; + bt_entry = [ + area_idx as u16, + dest as u16, + wx, + wi, + (item_idx / 8) as u16, + 1u16 << (item_idx % 8), + wx2, + wi2, + ]; + } + doubles.push(bt_entry); + + for (i, e) in doubles.iter().enumerate() { + for (j, &w) in e.iter().enumerate() { + self.rom + .write_u16(snes2pc(0xDFE212 + i * 16 + j * 2), w as isize)?; + } + } + Ok(()) + } + fn indicate_items(&mut self) -> Result<()> { for (i, &item) in self.randomization.item_placement.iter().enumerate() { let (room_id, node_id) = self.game_data.item_locations[i]; @@ -2697,48 +2767,37 @@ impl<'a> MapPatcher<'a> { if !self.map.room_mask[room_idx] { continue; } - if room_id == 19 - && self - .randomization - .objectives - .contains(&Objective::BombTorizo) - { - // If BT is an objective, we don't draw item dot there since an objective X tile will be drawn instead. - continue; - } let item_ptr = self.game_data.node_ptr_map[&(room_id, node_id)]; let item_idx = self.rom.read_u8(item_ptr + 4)? as usize; - let room_ptr = self.game_data.room_ptr_by_id[&room_id]; - let room_idx = self.game_data.room_idx_by_ptr[&room_ptr]; let room = &self.game_data.room_geometry[room_idx]; let area = self.map.area[room_idx]; let (x, y) = find_item_xy(item_ptr, &room.items)?; let orig_tile = self.get_room_tile(room_id, x, y).unwrap().clone(); let mut tile = orig_tile.clone(); tile.faded = MapTileFade::None; - if [MapTileInterior::HiddenItem, MapTileInterior::DoubleItem].contains(&tile.interior) { - tile.interior = MapTileInterior::Item; + tile.interior = get_item_interior(item, self.settings); + // If BT is an objective, we don't draw item dot there since an objective X tile will be drawn instead. + // We will clone the tile though for animating it if it's an objective + if room_id == 19 + && self + .randomization + .objectives + .contains(&Objective::BombTorizo) + { + self.index_tile(tile.clone(), None)?; + self.bt_objective_item = Some((area, item_idx, tile.clone())); + continue; } - tile.interior = get_item_interior(item, self.settings); self.dynamic_tile_data[area].push((item_idx, room_id, tile.clone())); - match self.customize_settings.item_dot_change { - ItemDotChange::Fade => { - tile.interior = apply_item_interior(orig_tile.clone(), item, self.settings); - tile.faded = MapTileFade::Faded; - self.set_room_tile(room_id, x, y, tile.clone()); - } - ItemDotChange::Disappear => { - tile.interior = apply_item_interior(orig_tile.clone(), item, self.settings); - tile.faded = MapTileFade::Disappeared; - self.set_room_tile(room_id, x, y, tile.clone()); - } - ItemDotChange::Stay => { - tile.interior = apply_item_interior(orig_tile.clone(), item, self.settings); - tile.faded = MapTileFade::None; - self.set_room_tile(room_id, x, y, tile.clone()); - } - } + + tile.interior = apply_item_interior(orig_tile, item, self.settings); + tile.faded = match self.customize_settings.item_dot_change { + ItemDotChange::Fade => MapTileFade::Faded, + ItemDotChange::Disappear => MapTileFade::Disappeared, + ItemDotChange::Stay => MapTileFade::None, + }; + self.set_room_tile(room_id, x, y, tile); } Ok(()) @@ -3379,6 +3438,9 @@ impl<'a> MapPatcher<'a> { } self.sort_dynamic_tile_data()?; self.write_dynamic_tile_data(&self.dynamic_tile_data.clone())?; + if self.settings.quality_of_life_settings.animated_tiles { + self.write_double_item_table(&self.dynamic_tile_data.clone())?; + } self.create_room_map_tilemaps()?; if self.settings.quality_of_life_settings.hazard_markers { self.write_hazard_tiles()?; diff --git a/rust/maprando/src/settings.rs b/rust/maprando/src/settings.rs index c92f8891a..4372223df 100644 --- a/rust/maprando/src/settings.rs +++ b/rust/maprando/src/settings.rs @@ -316,6 +316,7 @@ pub struct QualityOfLifeSettings { pub room_outline_revealed: bool, pub opposite_area_revealed: bool, pub hazard_markers: bool, + pub animated_tiles: bool, // End game: pub mother_brain_fight: MotherBrainFight, pub supers_double: bool, @@ -1332,6 +1333,9 @@ fn upgrade_qol_settings(settings: &mut serde_json::Value) -> Result<()> { if !qol_settings.contains_key("hazard_markers") { qol_settings.insert("hazard_markers".to_string(), true.into()); } + if !qol_settings.contains_key("animated_tiles") { + qol_settings.insert("animated_tiles".to_string(), false.into()); + } if !qol_settings.contains_key("persist_flash_suit") { qol_settings.insert("persist_flash_suit".to_string(), false.into()); } diff --git a/rust/maprando/tests/logic_scenarios.rs b/rust/maprando/tests/logic_scenarios.rs index 2372b6d37..b4c636137 100644 --- a/rust/maprando/tests/logic_scenarios.rs +++ b/rust/maprando/tests/logic_scenarios.rs @@ -270,6 +270,7 @@ fn get_settings(scenario: &Scenario) -> Result { room_outline_revealed: false, opposite_area_revealed: false, hazard_markers: false, + animated_tiles: false, mother_brain_fight: maprando::settings::MotherBrainFight::Vanilla, supers_double: false, escape_autosave: false,