From 63884e5cc215c3a8dd3927f11b43fefd89d8adf0 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Thu, 14 May 2026 02:27:42 +0900 Subject: [PATCH 01/31] initial implementation start moving mapstation activation reveal into QOL and add a gear button to allow map stations to do more than just partial / full. --- .../templates/generate/game_variations.html | 12 ---- .../map_station_activation.html} | 17 +++-- .../generate/map_station_activation.html | 63 +++++++++++++++++++ .../templates/generate/quality_of_life.html | 24 +++++++ 4 files changed, 95 insertions(+), 21 deletions(-) rename rust/maprando-web/templates/generate/help/{variations/map_station_reveal.html => quality/map_station_activation.html} (63%) create mode 100644 rust/maprando-web/templates/generate/map_station_activation.html diff --git a/rust/maprando-web/templates/generate/game_variations.html b/rust/maprando-web/templates/generate/game_variations.html index 0af75efea..b0da89593 100644 --- a/rust/maprando-web/templates/generate/game_variations.html +++ b/rust/maprando-web/templates/generate/game_variations.html @@ -58,18 +58,6 @@ -
-
- {% include "help/variations/map_station_reveal.html" %} - -
-
- - - - -
-
{% include "help/variations/energy_free_shinesparks.html" %} diff --git a/rust/maprando-web/templates/generate/help/variations/map_station_reveal.html b/rust/maprando-web/templates/generate/help/quality/map_station_activation.html similarity index 63% rename from rust/maprando-web/templates/generate/help/variations/map_station_reveal.html rename to rust/maprando-web/templates/generate/help/quality/map_station_activation.html index 815b77347..d6e7ec8a5 100644 --- a/rust/maprando-web/templates/generate/help/variations/map_station_reveal.html +++ b/rust/maprando-web/templates/generate/help/quality/map_station_activation.html @@ -1,9 +1,4 @@ - - - - \ No newline at end of file diff --git a/rust/maprando-web/templates/generate/map_station_activation.html b/rust/maprando-web/templates/generate/map_station_activation.html new file mode 100644 index 000000000..52c32810e --- /dev/null +++ b/rust/maprando-web/templates/generate/map_station_activation.html @@ -0,0 +1,63 @@ + \ 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 1e7f2a8c1..b623021cc 100644 --- a/rust/maprando-web/templates/generate/quality_of_life.html +++ b/rust/maprando-web/templates/generate/quality_of_life.html @@ -76,6 +76,28 @@

Quality-of-life options

+
+
+ + +
+
+ + + + + +
+
+
-

Additional options are available for controlling what tiles activating a map reveals, by clicking the gear button on the right.

diff --git a/rust/maprando-web/templates/generate/map_station_activation.html b/rust/maprando-web/templates/generate/map_station_activation.html index 52c32810e..d3e306ed8 100644 --- a/rust/maprando-web/templates/generate/map_station_activation.html +++ b/rust/maprando-web/templates/generate/map_station_activation.html @@ -15,11 +15,11 @@

Map station activation reveal

stations
@@ -29,11 +29,11 @@

Map station activation reveal

stations
@@ -43,13 +43,114 @@

Map station activation reveal

class="col-md-7 col-lg-5 col-form-label">Ship
- + - + +
+ +
+ +
+ + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + +
diff --git a/rust/maprando-web/templates/generate/scripts.html b/rust/maprando-web/templates/generate/scripts.html index d639626bd..9479f28f4 100644 --- a/rust/maprando-web/templates/generate/scripts.html +++ b/rust/maprando-web/templates/generate/scripts.html @@ -522,6 +522,21 @@ processInitialMapRevealPreset(); } +function applyMapStationActivationSetting(msaSettings) { + applyRadioValue("mapStationActivationRevealSaves", msaSettings.save_stations); + applyRadioValue("mapStationActivationRefilsNo", msaSettings.refill_stations); + applyRadioValue("mapStationActivationRevealShip", msaSettings.ship); + applyRadioValue("mapStationActivationRevealObjectives", msaSettings.objectives); + applyRadioValue("mapStationActivationRevealTransitions", msaSettings.area_transitions); + applyRadioValue("mapStationActivationRevealTier1", msaSettings.items1); + applyRadioValue("mapStationActivationRevealTier2", msaSettings.items2); + applyRadioValue("mapStationActivationRevealTier3", msaSettings.items3); + applyRadioValue("mapStationActivationRevealTier4", msaSettings.items4); + applyRadioValue("mapStationActivationRevealOther", msaSettings.other); + applyRadioValue("mapStationActivationRevealPreset", msaSettings.preset); + processmapStationActivationPreset(); +} + function applyEnhancedMapSettings(emSettings) { applyRadioValue("enhancedMapBlueDoors", emSettings.blue_doors); applyRadioValue("enhancedMapGrayDoors", emSettings.gray_doors); @@ -552,6 +567,7 @@ } applyInitialMapRevealSettings(preset.initial_map_reveal_settings); + applyMapStationActivationSetting(preset.map_station_activation_settings); applyEnhancedMapSettings(preset.enhanced_map_settings); applyRadioValue("itemMarkers", preset.item_markers); applyRadioValue("roomOutlineRevealed", preset.room_outline_revealed); @@ -646,7 +662,6 @@ applyRadioValue("wallJump", other.wall_jump); applyAreaAssignment(other.area_assignment); applyRadioValue("doorLocksSize", other.door_locks_size); - applyRadioValue("mapStationReveal", other.map_station_reveal); applyRadioValue("energyFreeShinesparks", other.energy_free_shinesparks); applyRadioValue("allEnemiesRespawn", other.all_enemies_respawn); applyRadioValue("disableSpikesuit", other.disable_spikesuit); @@ -908,6 +923,42 @@ qualityOfLifeSettingChanged(); } +function mapStationActivationPresetChanged() { + processmapStationActivationPreset(); + qualityOfLifeSettingChanged(); +} + +function processmapStationActivationPreset() { + let tileTypes = [ + "Saves", + "Refils", + "Ship", + "Objectives", + "Transitions", + "Tier1", + "Tier2", + "Tier3", + "Tier4" + ] + if (document.getElementById("mapStationActivationPresetPartial").checked) { + for (t of tileTypes) { + document.getElementById(`mapStationActivation${t}No`).checked = true; + } + document.getElementById("mapStationActivationOtherYes").checked = true; + } else if (document.getElementById("mapStationActivationPresetFull").checked) { + for (t of tileTypes) { + document.getElementById(`mapStationActivation${t}Yes`).checked = true; + } + document.getElementById("mapStationActivationOtherYes").checked = true; + } +} + +function mapStationActivationSettingChanged() { + document.getElementById("mapStationActivationPresetPartial").checked = false; + document.getElementById("mapStationActivationPresetFull").checked = false; + mapStationActivationPresetChanged(); +} + function processInitialMapRevealPreset() { let tileTypes = [ "Maps", @@ -1346,7 +1397,6 @@ document.getElementById("speedBoosterSplit").checked || !document.getElementById("areaAssignmentPresetStandard").checked || document.getElementById("doorLocksSizeSmall").checked || - document.getElementById("mapStationRevealPartial").checked || document.getElementById("raceModeYes").checked) { document.getElementById("collapseGameVariations").classList.remove("collapse"); diff --git a/rust/maprando/src/patch/map_tiles.rs b/rust/maprando/src/patch/map_tiles.rs index dd481d2ba..032255677 100644 --- a/rust/maprando/src/patch/map_tiles.rs +++ b/rust/maprando/src/patch/map_tiles.rs @@ -5,8 +5,8 @@ use crate::{ randomize::{LockedDoor, Randomization}, settings::{ DisableETankSetting, DoorLocksSize, EnhancedMapLevel, EnhancedMapOther, EnhancedMapWalls, - InitialMapRevealSettings, ItemMarkers, MapRevealLevel, MapStationReveal, Objective, - RandomizerSettings, + InitialMapRevealSettings, ItemMarkers, MapRevealLevel, MapStationActivationPreset, + Objective, RandomizerSettings, }, }; use maprando_game::{ @@ -2605,12 +2605,25 @@ impl<'a> MapPatcher<'a> { } fn set_map_activation_behavior(&mut self) -> Result<()> { - match self.settings.other_settings.map_station_reveal { - MapStationReveal::Partial => { + match self + .settings + .quality_of_life_settings + .map_station_activation_settings + .preset + { + Some(MapStationActivationPreset::Partial) => { self.rom.write_u16(snes2pc(0x90F700), 0xFFFF)?; } - MapStationReveal::Full => {} + + Some(MapStationActivationPreset::Full) => { + // + } + + None => { + // + } } + Ok(()) } diff --git a/rust/maprando/src/settings.rs b/rust/maprando/src/settings.rs index 4ad550248..d406f7584 100644 --- a/rust/maprando/src/settings.rs +++ b/rust/maprando/src/settings.rs @@ -306,6 +306,7 @@ pub struct QualityOfLifeSettings { // Map: pub enhanced_map_settings: EnhancedMapSettings, pub initial_map_reveal_settings: InitialMapRevealSettings, + pub map_station_activation_settings: MapStationActivationSettings, pub item_markers: ItemMarkers, pub room_outline_revealed: bool, pub opposite_area_revealed: bool, @@ -416,6 +417,27 @@ pub struct InitialMapRevealSettings { pub all_areas: bool, } + #[derive(Serialize, Deserialize, Clone, PartialEq)] +pub struct MapStationActivationSettings { + pub preset: Option, + pub save_stations: bool, + pub refill_stations: bool, + pub ship: bool, + pub objectives: bool, + pub area_transitions: bool, + pub items1: bool, + pub items2: bool, + pub items3: bool, + pub items4: bool, + pub other: bool, +} + +#[derive(Clone, Copy, Serialize, Deserialize, Debug, PartialEq)] +pub enum MapStationActivationPreset { + Partial, + Full, +} + #[derive(Serialize, Deserialize, Clone, PartialEq)] pub struct EnhancedMapSettings { pub preset: Option, @@ -592,7 +614,6 @@ pub struct OtherSettings { pub wall_jump: WallJump, pub area_assignment: AreaAssignment, pub door_locks_size: DoorLocksSize, - pub map_station_reveal: MapStationReveal, pub energy_free_shinesparks: bool, pub all_enemies_respawn: bool, pub disable_spikesuit: bool, @@ -835,11 +856,6 @@ pub enum ETankRefill { Full, } -#[derive(Clone, Copy, Serialize, Deserialize, Debug, PartialEq)] -pub enum MapStationReveal { - Partial, - Full, -} #[derive(Clone, Copy, Serialize, Deserialize, Debug, PartialEq)] pub enum SaveAnimals { From a0181028180c8f7bf20a2e5189fb7ff3ac62dda4 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Fri, 15 May 2026 01:43:30 +0900 Subject: [PATCH 03/31] refine game variations to reflect "custom" details of setting to be added to seed page later. --- rust/maprando-web/src/randomize_helpers.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/rust/maprando-web/src/randomize_helpers.rs b/rust/maprando-web/src/randomize_helpers.rs index 44d8e672f..b106eb708 100644 --- a/rust/maprando-web/src/randomize_helpers.rs +++ b/rust/maprando-web/src/randomize_helpers.rs @@ -186,10 +186,19 @@ impl SeedHeaderTemplate<'_> { if other_settings.wall_jump == WallJump::Collectible { game_variations.push("Collectible wall jump"); } - if qol_settings.map_station_activation_settings.preset == Some(maprando::settings::MapStationActivationPreset::Partial) { - game_variations.push("Map stations give partial reveal"); - } + match qol_settings.map_station_activation_settings.preset { + Some(maprando::settings::MapStationActivationPreset::Partial) => { + game_variations.push("Map stations give partial reveal"); + } + + Some(maprando::settings::MapStationActivationPreset::Full) => { + // push nothing (default mapstation behaviour) + } + None => { + game_variations.push("Map stations have custom reveal settings"); + } + } if other_settings.energy_free_shinesparks { game_variations.push("Energy-free shinesparks"); } From 549111bf7ca366a87b3564d957fc345192c714f9 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Fri, 15 May 2026 01:58:58 +0900 Subject: [PATCH 04/31] more backend --- rust/maprando/src/settings.rs | 38 ++++++++++++++++++++++++++ rust/maprando/tests/logic_scenarios.rs | 19 +++++++++---- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/rust/maprando/src/settings.rs b/rust/maprando/src/settings.rs index d406f7584..a38840bf5 100644 --- a/rust/maprando/src/settings.rs +++ b/rust/maprando/src/settings.rs @@ -1185,6 +1185,43 @@ fn upgrade_enhanced_map_settings(settings: &mut serde_json::Value) -> Result<()> Ok(()) } +fn upgrade_map_station_activation_settings(settings: &mut serde_json::Value) -> Result<()> { + // Skip if already present + if settings["quality_of_life_settings"] + .as_object() + .unwrap() + .contains_key("initial_map_reveal_settings") + { + return Ok(()); + } + + let qol_settings = settings["quality_of_life_settings"] + .as_object_mut() + .context("missing 'quality_of_life_settings'")?; + + let msasettings = MapStationActivationSettings { + preset: Some(MapStationActivationPreset::Full), + save_stations: true, + refill_stations: true, + ship: true, + objectives: true, + area_transitions: true, + items1: true, + items2: true, + items3: true, + items4: true, + other: true, + + }; + + qol_settings.insert( + "initial_map_reveal_settings".to_string(), + serde_json::to_value(msasettings)?, + ); + + Ok(()) +} + fn upgrade_qol_settings(settings: &mut serde_json::Value) -> Result<()> { let etank_refill = settings["other_settings"]["etank_refill"] .as_str() @@ -1283,6 +1320,7 @@ fn upgrade_qol_settings(settings: &mut serde_json::Value) -> Result<()> { } upgrade_initial_map_reveal_settings(settings)?; + upgrade_map_station_activation_settings(settings)?; upgrade_enhanced_map_settings(settings)?; Ok(()) } diff --git a/rust/maprando/tests/logic_scenarios.rs b/rust/maprando/tests/logic_scenarios.rs index 9a5d5c9d9..584a9474e 100644 --- a/rust/maprando/tests/logic_scenarios.rs +++ b/rust/maprando/tests/logic_scenarios.rs @@ -5,10 +5,7 @@ use hashbrown::HashMap; use maprando::{ randomize::{DifficultyConfig, LockedDoor, Preprocessor, make_locked_door_data}, settings::{ - DisableETankSetting, DoorsSettings, EnemyDrops, EnhancedMapSettings, - InitialMapRevealSettings, ItemProgressionSettings, Objective, ObjectiveSettings, - OtherSettings, QualityOfLifeSettings, RandomizerSettings, SkillAssumptionSettings, - StartLocationSettings, + DisableETankSetting, DoorsSettings, EnemyDrops, EnhancedMapSettings, InitialMapRevealSettings, ItemProgressionSettings, MapStationActivationSettings, Objective, ObjectiveSettings, OtherSettings, QualityOfLifeSettings, RandomizerSettings, SkillAssumptionSettings, StartLocationSettings }, traverse::{LockedDoorData, Traverser}, }; @@ -243,6 +240,19 @@ fn get_settings(scenario: &Scenario) -> Result { other: maprando::settings::MapRevealLevel::No, all_areas: false, }, + map_station_activation_settings: MapStationActivationSettings { + preset: Some(maprando::settings::MapStationActivationPreset::Full), + save_stations: true, + refill_stations: true, + ship: true, + objectives: true, + area_transitions: true, + items1: true, + items2: true, + items3: true, + items4: true, + other: true, + }, item_markers: maprando::settings::ItemMarkers::Simple, room_outline_revealed: false, opposite_area_revealed: false, @@ -328,7 +338,6 @@ fn get_settings(scenario: &Scenario) -> Result { maprando::settings::AreaAssignmentPreset::Standard, ), door_locks_size: maprando::settings::DoorLocksSize::Large, - map_station_reveal: maprando::settings::MapStationReveal::Full, energy_free_shinesparks: settings.energy_free_shinesparks.unwrap_or(false), all_enemies_respawn: false, speed_booster: maprando::settings::SpeedBooster::Vanilla, From e353da2567a0311f9d6901d2e48c4bc596f6c47b Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Fri, 15 May 2026 21:40:30 +0900 Subject: [PATCH 05/31] more backend --- .../Community Race Season 5.json | 20 ++-- rust/data/presets/full-settings/Default.json | 20 ++-- .../full-settings/Mentor Tournament.json | 20 ++-- .../Summer Series Expert Challenge.json | 20 ++-- .../data/presets/quality-of-life/Default.json | 20 ++-- rust/data/presets/quality-of-life/High.json | 20 ++-- rust/data/presets/quality-of-life/Low.json | 20 ++-- rust/data/presets/quality-of-life/Max.json | 20 ++-- rust/data/presets/quality-of-life/Off.json | 20 ++-- .../generate/map_station_activation.html | 110 +++++++++++++----- .../templates/generate/scripts.html | 9 +- rust/maprando/src/settings.rs | 51 ++++---- rust/maprando/tests/logic_scenarios.rs | 20 ++-- 13 files changed, 212 insertions(+), 158 deletions(-) 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 054da943f..c82af114a 100644 --- a/rust/data/presets/full-settings/Community Race Season 5.json +++ b/rust/data/presets/full-settings/Community Race Season 5.json @@ -4687,16 +4687,16 @@ }, "map_station_activation_settings": { "preset": "Full", - "save_stations": true, - "refill_stations": true, - "ship": true, - "objectives": true, - "area_transitions": true, - "items1": true, - "items2": true, - "items3": true, - "items4": true, - "other": true + "save_stations": "Full", + "refill_stations": "Full", + "ship": "Full", + "objectives": "Full", + "area_transitions": "Full", + "items1": "Full", + "items2": "Full", + "items3": "Full", + "items4": "Full", + "other": "Full" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/full-settings/Default.json b/rust/data/presets/full-settings/Default.json index 86e1761ea..912be6040 100644 --- a/rust/data/presets/full-settings/Default.json +++ b/rust/data/presets/full-settings/Default.json @@ -4599,16 +4599,16 @@ }, "map_station_activation_settings": { "preset": "Full", - "save_stations": true, - "refill_stations": true, - "ship": true, - "objectives": true, - "area_transitions": true, - "items1": true, - "items2": true, - "items3": true, - "items4": true, - "other": true + "save_stations": "Full", + "refill_stations": "Full", + "ship": "Full", + "objectives": "Full", + "area_transitions": "Full", + "items1": "Full", + "items2": "Full", + "items3": "Full", + "items4": "Full", + "other": "Full" }, "item_markers": "3-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/full-settings/Mentor Tournament.json b/rust/data/presets/full-settings/Mentor Tournament.json index 33d2bb044..660d342fb 100644 --- a/rust/data/presets/full-settings/Mentor Tournament.json +++ b/rust/data/presets/full-settings/Mentor Tournament.json @@ -4687,16 +4687,16 @@ }, "map_station_activation_settings": { "preset": "Full", - "save_stations": true, - "refill_stations": true, - "ship": true, - "objectives": true, - "area_transitions": true, - "items1": true, - "items2": true, - "items3": true, - "items4": true, - "other": true + "save_stations": "Full", + "refill_stations": "Full", + "ship": "Full", + "objectives": "Full", + "area_transitions": "Full", + "items1": "Full", + "items2": "Full", + "items3": "Full", + "items4": "Full", + "other": "Full" }, "item_markers": "4-Tiered", "room_outline_revealed": 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 236dd38ba..57cc6cdf5 100644 --- a/rust/data/presets/full-settings/Summer Series Expert Challenge.json +++ b/rust/data/presets/full-settings/Summer Series Expert Challenge.json @@ -4599,16 +4599,16 @@ }, "map_station_activation_settings": { "preset": "Full", - "save_stations": true, - "refill_stations": true, - "ship": true, - "objectives": true, - "area_transitions": true, - "items1": true, - "items2": true, - "items3": true, - "items4": true, - "other": true + "save_stations": "Full", + "refill_stations": "Full", + "ship": "Full", + "objectives": "Full", + "area_transitions": "Full", + "items1": "Full", + "items2": "Full", + "items3": "Full", + "items4": "Full", + "other": "Full" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/Default.json b/rust/data/presets/quality-of-life/Default.json index a849cd374..8c721f8b2 100644 --- a/rust/data/presets/quality-of-life/Default.json +++ b/rust/data/presets/quality-of-life/Default.json @@ -32,16 +32,16 @@ }, "map_station_activation_settings": { "preset": "Full", - "save_stations": true, - "refill_stations": true, - "ship": true, - "objectives": true, - "area_transitions": true, - "items1": true, - "items2": true, - "items3": true, - "items4": true, - "other": true + "save_stations": "Full", + "refill_stations": "Full", + "ship": "Full", + "objectives": "Full", + "area_transitions": "Full", + "items1": "Full", + "items2": "Full", + "items3": "Full", + "items4": "Full", + "other": "Full" }, "item_markers": "3-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/High.json b/rust/data/presets/quality-of-life/High.json index 2c378a0af..92c9b4af0 100644 --- a/rust/data/presets/quality-of-life/High.json +++ b/rust/data/presets/quality-of-life/High.json @@ -32,16 +32,16 @@ }, "map_station_activation_settings": { "preset": "Full", - "save_stations": true, - "refill_stations": true, - "ship": true, - "objectives": true, - "area_transitions": true, - "items1": true, - "items2": true, - "items3": true, - "items4": true, - "other": true + "save_stations": "Full", + "refill_stations": "Full", + "ship": "Full", + "objectives": "Full", + "area_transitions": "Full", + "items1": "Full", + "items2": "Full", + "items3": "Full", + "items4": "Full", + "other": "Full" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/Low.json b/rust/data/presets/quality-of-life/Low.json index dcf234526..46621a43a 100644 --- a/rust/data/presets/quality-of-life/Low.json +++ b/rust/data/presets/quality-of-life/Low.json @@ -32,16 +32,16 @@ }, "map_station_activation_settings": { "preset": "Full", - "save_stations": true, - "refill_stations": true, - "ship": true, - "objectives": true, - "area_transitions": true, - "items1": true, - "items2": true, - "items3": true, - "items4": true, - "other": true + "save_stations": "Full", + "refill_stations": "Full", + "ship": "Full", + "objectives": "Full", + "area_transitions": "Full", + "items1": "Full", + "items2": "Full", + "items3": "Full", + "items4": "Full", + "other": "Full" }, "item_markers": "Uniques", "room_outline_revealed": false, diff --git a/rust/data/presets/quality-of-life/Max.json b/rust/data/presets/quality-of-life/Max.json index 8530e43c0..b5300f237 100644 --- a/rust/data/presets/quality-of-life/Max.json +++ b/rust/data/presets/quality-of-life/Max.json @@ -32,16 +32,16 @@ }, "map_station_activation_settings": { "preset": "Full", - "save_stations": true, - "refill_stations": true, - "ship": true, - "objectives": true, - "area_transitions": true, - "items1": true, - "items2": true, - "items3": true, - "items4": true, - "other": true + "save_stations": "Full", + "refill_stations": "Full", + "ship": "Full", + "objectives": "Full", + "area_transitions": "Full", + "items1": "Full", + "items2": "Full", + "items3": "Full", + "items4": "Full", + "other": "Full" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/Off.json b/rust/data/presets/quality-of-life/Off.json index aa3d986fb..384702510 100644 --- a/rust/data/presets/quality-of-life/Off.json +++ b/rust/data/presets/quality-of-life/Off.json @@ -32,16 +32,16 @@ }, "map_station_activation_settings": { "preset": "Full", - "save_stations": true, - "refill_stations": true, - "ship": true, - "objectives": true, - "area_transitions": true, - "items1": true, - "items2": true, - "items3": true, - "items4": true, - "other": true + "save_stations": "Full", + "refill_stations": "Full", + "ship": "Full", + "objectives": "Full", + "area_transitions": "Full", + "items1": "Full", + "items2": "Full", + "items3": "Full", + "items4": "Full", + "other": "Full" }, "item_markers": "Simple", "room_outline_revealed": false, diff --git a/rust/maprando-web/templates/generate/map_station_activation.html b/rust/maprando-web/templates/generate/map_station_activation.html index d3e306ed8..08bb66c6a 100644 --- a/rust/maprando-web/templates/generate/map_station_activation.html +++ b/rust/maprando-web/templates/generate/map_station_activation.html @@ -15,13 +15,18 @@

Map station activation reveal

stations
- + + +
@@ -29,13 +34,18 @@

Map station activation reveal

stations
+ + - +
@@ -43,13 +53,18 @@

Map station activation reveal

class="col-md-7 col-lg-5 col-form-label">Ship
- + + +
@@ -57,14 +72,19 @@

Map station activation reveal

class="col-md-7 col-lg-5 col-form-label">Objectives
+ + + for="mapStationActivationObjectivesFull">Full
@@ -72,15 +92,20 @@

Map station activation reveal

class="col-md-7 col-lg-5 col-form-label">Area transitions
+ + + for="mapStationActivationTransitionsFull">Full
@@ -88,13 +113,18 @@

Map station activation reveal

tier 1 (small dots)
- + + +
@@ -102,13 +132,18 @@

Map station activation reveal

tier 2 (X's)
+ + - +
@@ -116,13 +151,18 @@

Map station activation reveal

tier 3 (hollow circles)
- + + +
@@ -130,13 +170,18 @@

Map station activation reveal

tier 4 (large dots)
+ + - +
@@ -144,13 +189,18 @@

Map station activation reveal

class="col-md-7 col-lg-5 col-form-label">Other
+ + - +
diff --git a/rust/maprando-web/templates/generate/scripts.html b/rust/maprando-web/templates/generate/scripts.html index 9479f28f4..36c674ca3 100644 --- a/rust/maprando-web/templates/generate/scripts.html +++ b/rust/maprando-web/templates/generate/scripts.html @@ -938,18 +938,17 @@ "Tier1", "Tier2", "Tier3", - "Tier4" + "Tier4", + "Other" ] if (document.getElementById("mapStationActivationPresetPartial").checked) { for (t of tileTypes) { - document.getElementById(`mapStationActivation${t}No`).checked = true; + document.getElementById(`mapStationActivation${t}Partial`).checked = true; } - document.getElementById("mapStationActivationOtherYes").checked = true; } else if (document.getElementById("mapStationActivationPresetFull").checked) { for (t of tileTypes) { - document.getElementById(`mapStationActivation${t}Yes`).checked = true; + document.getElementById(`mapStationActivation${t}Full`).checked = true; } - document.getElementById("mapStationActivationOtherYes").checked = true; } } diff --git a/rust/maprando/src/settings.rs b/rust/maprando/src/settings.rs index a38840bf5..93a14fa4d 100644 --- a/rust/maprando/src/settings.rs +++ b/rust/maprando/src/settings.rs @@ -417,19 +417,26 @@ pub struct InitialMapRevealSettings { pub all_areas: bool, } - #[derive(Serialize, Deserialize, Clone, PartialEq)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] +pub enum MapStationActivationLevel { + No, + Partial, + Full, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq)] pub struct MapStationActivationSettings { pub preset: Option, - pub save_stations: bool, - pub refill_stations: bool, - pub ship: bool, - pub objectives: bool, - pub area_transitions: bool, - pub items1: bool, - pub items2: bool, - pub items3: bool, - pub items4: bool, - pub other: bool, + pub save_stations: MapStationActivationLevel, + pub refill_stations: MapStationActivationLevel, + pub ship: MapStationActivationLevel, + pub objectives: MapStationActivationLevel, + pub area_transitions: MapStationActivationLevel, + pub items1: MapStationActivationLevel, + pub items2: MapStationActivationLevel, + pub items3: MapStationActivationLevel, + pub items4: MapStationActivationLevel, + pub other: MapStationActivationLevel, } #[derive(Clone, Copy, Serialize, Deserialize, Debug, PartialEq)] @@ -856,7 +863,6 @@ pub enum ETankRefill { Full, } - #[derive(Clone, Copy, Serialize, Deserialize, Debug, PartialEq)] pub enum SaveAnimals { No, @@ -1201,17 +1207,16 @@ fn upgrade_map_station_activation_settings(settings: &mut serde_json::Value) -> let msasettings = MapStationActivationSettings { preset: Some(MapStationActivationPreset::Full), - save_stations: true, - refill_stations: true, - ship: true, - objectives: true, - area_transitions: true, - items1: true, - items2: true, - items3: true, - items4: true, - other: true, - + save_stations: MapStationActivationLevel::Full, + refill_stations: MapStationActivationLevel::Full, + ship: MapStationActivationLevel::Full, + objectives: MapStationActivationLevel::Full, + area_transitions: MapStationActivationLevel::Full, + items1: MapStationActivationLevel::Full, + items2: MapStationActivationLevel::Full, + items3: MapStationActivationLevel::Full, + items4: MapStationActivationLevel::Full, + other: MapStationActivationLevel::Full, }; qol_settings.insert( diff --git a/rust/maprando/tests/logic_scenarios.rs b/rust/maprando/tests/logic_scenarios.rs index 584a9474e..5a3837af3 100644 --- a/rust/maprando/tests/logic_scenarios.rs +++ b/rust/maprando/tests/logic_scenarios.rs @@ -242,16 +242,16 @@ fn get_settings(scenario: &Scenario) -> Result { }, map_station_activation_settings: MapStationActivationSettings { preset: Some(maprando::settings::MapStationActivationPreset::Full), - save_stations: true, - refill_stations: true, - ship: true, - objectives: true, - area_transitions: true, - items1: true, - items2: true, - items3: true, - items4: true, - other: true, + save_stations: maprando::settings::MapStationActivationLevel::Full, + refill_stations: maprando::settings::MapStationActivationLevel::Full, + ship: maprando::settings::MapStationActivationLevel::Full, + objectives: maprando::settings::MapStationActivationLevel::Full, + area_transitions: maprando::settings::MapStationActivationLevel::Full, + items1: maprando::settings::MapStationActivationLevel::Full, + items2: maprando::settings::MapStationActivationLevel::Full, + items3: maprando::settings::MapStationActivationLevel::Full, + items4: maprando::settings::MapStationActivationLevel::Full, + other: maprando::settings::MapStationActivationLevel::Full, }, item_markers: maprando::settings::ItemMarkers::Simple, room_outline_revealed: false, From 02b5e795da24bd0a59ed389f8c8c74f1b5074646 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Fri, 15 May 2026 21:56:56 +0900 Subject: [PATCH 06/31] Update map_station_activation.html --- .../generate/map_station_activation.html | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/rust/maprando-web/templates/generate/map_station_activation.html b/rust/maprando-web/templates/generate/map_station_activation.html index 08bb66c6a..ebc0c81da 100644 --- a/rust/maprando-web/templates/generate/map_station_activation.html +++ b/rust/maprando-web/templates/generate/map_station_activation.html @@ -11,9 +11,9 @@

Map station activation reveal

Tile types
-
-
diff --git a/rust/maprando-web/templates/generate/quality_of_life.html b/rust/maprando-web/templates/generate/quality_of_life.html index b623021cc..12946a159 100644 --- a/rust/maprando-web/templates/generate/quality_of_life.html +++ b/rust/maprando-web/templates/generate/quality_of_life.html @@ -84,7 +84,7 @@

Quality-of-life options

-
+
diff --git a/rust/maprando-web/templates/generate/scripts.html b/rust/maprando-web/templates/generate/scripts.html index f48e6d41f..20e3cc2c1 100644 --- a/rust/maprando-web/templates/generate/scripts.html +++ b/rust/maprando-web/templates/generate/scripts.html @@ -197,7 +197,7 @@ return { "preset": formData.get("map_station_reveal"), "save_stations": formData.get("map_station_activation_saves"), - "refill_stations": formData.get("map_station_activation_refils"), + "refill_stations": formData.get("map_station_activation_refills"), "ship": formData.get("map_station_activation_ship"), "objectives": formData.get("map_station_activation_objectives"), "area_transitions": formData.get("map_station_activation_transitions"), @@ -540,7 +540,7 @@ function applyMapStationActivationSettings(msaSettings) { applyRadioValue("mapStationActivationSaves", msaSettings.save_stations); - applyRadioValue("mapStationActivationRefils", msaSettings.refill_stations); + applyRadioValue("mapStationActivationRefills", msaSettings.refill_stations); applyRadioValue("mapStationActivationShip", msaSettings.ship); applyRadioValue("mapStationActivationObjectives", msaSettings.objectives); applyRadioValue("mapStationActivationTransitions", msaSettings.area_transitions); @@ -947,7 +947,7 @@ function processMapStationActivationPreset() { let tileTypes = [ "Saves", - "Refils", + "Refills", "Ship", "Objectives", "Transitions", diff --git a/rust/maprando/src/settings.rs b/rust/maprando/src/settings.rs index e9f1128c4..112df1ad7 100644 --- a/rust/maprando/src/settings.rs +++ b/rust/maprando/src/settings.rs @@ -1217,7 +1217,7 @@ fn upgrade_map_station_activation_settings(settings: &mut serde_json::Value) -> .as_object_mut() .context("missing 'quality_of_life_settings'")?; - let msasettings = MapStationActivationSettings { + let msa_settings = MapStationActivationSettings { preset: Some(MapStationActivationPreset::Full), save_stations: MapStationActivationLevel::Full, refill_stations: MapStationActivationLevel::Full, @@ -1233,7 +1233,7 @@ fn upgrade_map_station_activation_settings(settings: &mut serde_json::Value) -> qol_settings.insert( "map_station_activation_settings".to_string(), - serde_json::to_value(msasettings)?, + serde_json::to_value(msa_settings)?, ); Ok(()) From cd43d3107528cbb6651952b73225a34ade411abf Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Fri, 29 May 2026 18:43:40 +0900 Subject: [PATCH 25/31] update code based on feedback --- patches/rom_map/Bank 89.txt | 2 +- rust/maprando/src/patch/map_tiles.rs | 113 +++++++++++++++------------ 2 files changed, 66 insertions(+), 49 deletions(-) diff --git a/patches/rom_map/Bank 89.txt b/patches/rom_map/Bank 89.txt index c6f76a8bc..63b913ae6 100644 --- a/patches/rom_map/Bank 89.txt +++ b/patches/rom_map/Bank 89.txt @@ -1,4 +1,4 @@ AF00 - AF31: ; hud_expansion_opaque.asm AF60 - B0BA: ; Area FX.asm B100 - B200: nothing item graphics (zeros, used only for Bomb Torizo Room; nothing_item.asm) -B200 - : mapstation partial reveal bitmask. \ No newline at end of file +B200 - B800 : mapstation partial reveal bitmask. \ No newline at end of file diff --git a/rust/maprando/src/patch/map_tiles.rs b/rust/maprando/src/patch/map_tiles.rs index 8fccce9f2..aa5c89cc9 100644 --- a/rust/maprando/src/patch/map_tiles.rs +++ b/rust/maprando/src/patch/map_tiles.rs @@ -12,7 +12,7 @@ use crate::{ use maprando_game::{ AreaIdx, BeamType, Direction, DoorLockType, DoorType, GameData, Item, ItemIdx, Map, MapLiquidType, MapTile, MapTileEdge, MapTileFade, MapTileInterior, MapTileSpecialType, - RoomGeometryDoor, RoomGeometryItem, RoomId, RoomPtr, util::sorted_hashmap_iter, + RoomGeometry, RoomGeometryDoor, RoomGeometryItem, RoomId, RoomPtr, util::sorted_hashmap_iter, }; use super::{Rom, snes2pc, xy_to_explored_bit_ptr, xy_to_map_offset}; @@ -3180,32 +3180,49 @@ impl<'a> MapPatcher<'a> { continue; } - let Some((area, _, _)) = + let Some((area, map_x, map_y)) = self.get_room_coords(room.room_id, x as isize, y as isize) else { continue; }; + let Some(tile) = self.map_tile_map.get(&(area, map_x, map_y)) else { + continue; + }; + + let reveal_level = self.get_map_station_reveal(tile, room, x, y); + let local_x = room_x + x as isize; let local_y = room_y + y as isize; + let (offset, bitmask) = xy_to_explored_bit_ptr(local_x, local_y); + let full_addr = FULL_MASK_ADDR + area * 0x100 + offset as usize; + let partial_addr = PARTIAL_MASK_ADDR + area * 0x100 + offset as usize; - let reveal_level = self.determine_tile_reveal_level(room_idx, x, y); + match reveal_level { MapStationActivationLevel::No => {} + MapStationActivationLevel::Partial => { - let mut curr = self.rom.read_u8(snes2pc(partial_addr))?; - curr |= bitmask as isize; - self.rom.write_u8(snes2pc(partial_addr), curr)?; + let mut partial = self.rom.read_u8(snes2pc(partial_addr))?; + + partial |= bitmask as isize; + + self.rom.write_u8(snes2pc(partial_addr), partial)?; } + MapStationActivationLevel::Full => { let mut full = self.rom.read_u8(snes2pc(full_addr))?; + full |= bitmask as isize; + self.rom.write_u8(snes2pc(full_addr), full)?; let mut partial = self.rom.read_u8(snes2pc(partial_addr))?; + partial |= bitmask as isize; + self.rom.write_u8(snes2pc(partial_addr), partial)?; } } @@ -3216,24 +3233,10 @@ impl<'a> MapPatcher<'a> { Ok(()) } - fn interior_to_reveal_level(&self, interior: MapTileInterior) -> MapStationActivationLevel { - let settings = &self - .settings - .quality_of_life_settings - .map_station_activation_settings; - - match interior { - MapTileInterior::Item => settings.items1, - MapTileInterior::AmmoItem => settings.items2, - MapTileInterior::MediumItem => settings.items3, - MapTileInterior::MajorItem => settings.items4, - _ => settings.other, - } - } - - fn determine_tile_reveal_level( + fn get_map_station_reveal( &self, - room_idx: usize, + tile: &MapTile, + room: &RoomGeometry, x: usize, y: usize, ) -> MapStationActivationLevel { @@ -3242,56 +3245,70 @@ impl<'a> MapPatcher<'a> { .quality_of_life_settings .map_station_activation_settings; - let room = &self.game_data.room_geometry[room_idx]; - - let Some((area, map_x, map_y)) = self.get_room_coords(room.room_id, x as isize, y as isize) - else { - return MapStationActivationLevel::No; - }; - - let Some(tile) = self.map_tile_map.get(&(area, map_x, map_y)) else { - return MapStationActivationLevel::No; - }; - if let Some(MapTileSpecialType::AreaTransition(_, _)) = tile.special_type { - return match settings.area_transitions { - MapStationActivationLevel::No => MapStationActivationLevel::No, - MapStationActivationLevel::Partial | MapStationActivationLevel::Full => { - MapStationActivationLevel::Full - } + return if settings.area_transitions == MapStationActivationLevel::No { + MapStationActivationLevel::No + } else { + MapStationActivationLevel::Full }; } - match tile.interior { - MapTileInterior::SaveStation => settings.save_stations, - MapTileInterior::EnergyRefill - | MapTileInterior::AmmoRefill - | MapTileInterior::DoubleRefill => settings.refill_stations, - MapTileInterior::Ship => settings.ship, - MapTileInterior::Objective => settings.objectives, + let interior = match tile.interior { MapTileInterior::Item | MapTileInterior::DoubleItem | MapTileInterior::HiddenItem => { for (i, &item) in self.randomization.item_placement.iter().enumerate() { let (item_room_id, node_id) = self.game_data.item_locations[i]; + if item_room_id != room.room_id { continue; } + let item_ptr = self.game_data.node_ptr_map[&(item_room_id, node_id)]; + let Ok((item_x, item_y)) = find_item_xy(item_ptr, &room.items) else { continue; }; + if item_x == x as isize && item_y == y as isize { - let interior = get_item_interior(item, self.settings); - return self.interior_to_reveal_level(interior); + return match get_item_interior(item, self.settings) { + MapTileInterior::AmmoItem => settings.items2, + MapTileInterior::MediumItem => settings.items3, + MapTileInterior::MajorItem => settings.items4, + _ => settings.items1, + }; } } + + tile.interior + } + + _ => tile.interior, + }; + + match interior { + MapTileInterior::SaveStation => settings.save_stations, + + MapTileInterior::EnergyRefill + | MapTileInterior::AmmoRefill + | MapTileInterior::DoubleRefill => settings.refill_stations, + + MapTileInterior::Ship => settings.ship, + + MapTileInterior::Objective => settings.objectives, + + MapTileInterior::Item | MapTileInterior::DoubleItem | MapTileInterior::HiddenItem => { settings.items1 } + MapTileInterior::AmmoItem => settings.items2, + MapTileInterior::MediumItem => settings.items3, + MapTileInterior::MajorItem => settings.items4, + _ => settings.other, } } + pub fn compute_area_bounds(&mut self) -> Result<()> { for &(area_idx, x, y) in self.map_tile_map.keys() { if x < self.area_min_x[area_idx] { From d53f8f3a654c623a9652d23059de04f4108f56c9 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Sun, 31 May 2026 03:17:23 +0900 Subject: [PATCH 26/31] add separate sub area behaviour --- .../Community Race Season 5.json | 3 +- rust/data/presets/full-settings/Default.json | 3 +- .../full-settings/Mentor Tournament.json | 3 +- .../Summer Series Expert Challenge.json | 3 +- .../data/presets/quality-of-life/Default.json | 3 +- rust/data/presets/quality-of-life/High.json | 3 +- rust/data/presets/quality-of-life/Low.json | 3 +- rust/data/presets/quality-of-life/Max.json | 3 +- rust/data/presets/quality-of-life/Off.json | 3 +- .../generate/map_station_activation.html | 19 +++++++++ .../templates/generate/scripts.html | 4 ++ .../seed/map_station_activation_details.html | 4 ++ rust/maprando/src/patch/map_tiles.rs | 39 ++++++++++++++++++- rust/maprando/src/settings.rs | 2 + rust/maprando/tests/logic_scenarios.rs | 1 + 15 files changed, 86 insertions(+), 10 deletions(-) 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 c82af114a..cebc133ef 100644 --- a/rust/data/presets/full-settings/Community Race Season 5.json +++ b/rust/data/presets/full-settings/Community Race Season 5.json @@ -4696,7 +4696,8 @@ "items2": "Full", "items3": "Full", "items4": "Full", - "other": "Full" + "other": "Full", + "sub_area": "No" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/full-settings/Default.json b/rust/data/presets/full-settings/Default.json index 912be6040..b4771744c 100644 --- a/rust/data/presets/full-settings/Default.json +++ b/rust/data/presets/full-settings/Default.json @@ -4608,7 +4608,8 @@ "items2": "Full", "items3": "Full", "items4": "Full", - "other": "Full" + "other": "Full", + "sub_area": "No" }, "item_markers": "3-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/full-settings/Mentor Tournament.json b/rust/data/presets/full-settings/Mentor Tournament.json index 660d342fb..e4a4d93a0 100644 --- a/rust/data/presets/full-settings/Mentor Tournament.json +++ b/rust/data/presets/full-settings/Mentor Tournament.json @@ -4696,7 +4696,8 @@ "items2": "Full", "items3": "Full", "items4": "Full", - "other": "Full" + "other": "Full", + "sub_area": "No" }, "item_markers": "4-Tiered", "room_outline_revealed": 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 57cc6cdf5..5b24b15d8 100644 --- a/rust/data/presets/full-settings/Summer Series Expert Challenge.json +++ b/rust/data/presets/full-settings/Summer Series Expert Challenge.json @@ -4608,7 +4608,8 @@ "items2": "Full", "items3": "Full", "items4": "Full", - "other": "Full" + "other": "Full", + "sub_area": "No" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/Default.json b/rust/data/presets/quality-of-life/Default.json index 8c721f8b2..b46f4ce1b 100644 --- a/rust/data/presets/quality-of-life/Default.json +++ b/rust/data/presets/quality-of-life/Default.json @@ -41,7 +41,8 @@ "items2": "Full", "items3": "Full", "items4": "Full", - "other": "Full" + "other": "Full", + "sub_area": "No" }, "item_markers": "3-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/High.json b/rust/data/presets/quality-of-life/High.json index 92c9b4af0..270e3d9cd 100644 --- a/rust/data/presets/quality-of-life/High.json +++ b/rust/data/presets/quality-of-life/High.json @@ -41,7 +41,8 @@ "items2": "Full", "items3": "Full", "items4": "Full", - "other": "Full" + "other": "Full", + "sub_area": "No" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/Low.json b/rust/data/presets/quality-of-life/Low.json index 46621a43a..4b3702b60 100644 --- a/rust/data/presets/quality-of-life/Low.json +++ b/rust/data/presets/quality-of-life/Low.json @@ -41,7 +41,8 @@ "items2": "Full", "items3": "Full", "items4": "Full", - "other": "Full" + "other": "Full", + "sub_area": "No" }, "item_markers": "Uniques", "room_outline_revealed": false, diff --git a/rust/data/presets/quality-of-life/Max.json b/rust/data/presets/quality-of-life/Max.json index b5300f237..8d12d717e 100644 --- a/rust/data/presets/quality-of-life/Max.json +++ b/rust/data/presets/quality-of-life/Max.json @@ -41,7 +41,8 @@ "items2": "Full", "items3": "Full", "items4": "Full", - "other": "Full" + "other": "Full", + "sub_area": "No" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/Off.json b/rust/data/presets/quality-of-life/Off.json index 384702510..7262cff5d 100644 --- a/rust/data/presets/quality-of-life/Off.json +++ b/rust/data/presets/quality-of-life/Off.json @@ -41,7 +41,8 @@ "items2": "Full", "items3": "Full", "items4": "Full", - "other": "Full" + "other": "Full", + "sub_area": "No" }, "item_markers": "Simple", "room_outline_revealed": false, diff --git a/rust/maprando-web/templates/generate/map_station_activation.html b/rust/maprando-web/templates/generate/map_station_activation.html index 5ad87aa9f..fefcf8d49 100644 --- a/rust/maprando-web/templates/generate/map_station_activation.html +++ b/rust/maprando-web/templates/generate/map_station_activation.html @@ -203,6 +203,25 @@

Map station activation reveal

+
+ +
+ + + + + + +
+
diff --git a/rust/maprando-web/templates/generate/scripts.html b/rust/maprando-web/templates/generate/scripts.html index 20e3cc2c1..926e93c70 100644 --- a/rust/maprando-web/templates/generate/scripts.html +++ b/rust/maprando-web/templates/generate/scripts.html @@ -206,6 +206,7 @@ "items3": formData.get("map_station_activation_tier3"), "items4": formData.get("map_station_activation_tier4"), "other": formData.get("map_station_activation_other"), + "sub_area": formData.get("map_station_activation_sub_area"), } } @@ -549,6 +550,7 @@ applyRadioValue("mapStationActivationTier3", msaSettings.items3); applyRadioValue("mapStationActivationTier4", msaSettings.items4); applyRadioValue("mapStationActivationOther", msaSettings.other); + applyRadioValue("mapStationActivationSubArea", msaSettings.sub_area); applyRadioValue("mapStationActivationPreset", msaSettings.preset); processMapStationActivationPreset(); } @@ -961,10 +963,12 @@ for (t of tileTypes) { document.getElementById(`mapStationActivation${t}Partial`).checked = true; } + document.getElementById("mapStationActivationSubAreaNo").checked = true; } else if (document.getElementById("mapStationActivationPresetFull").checked) { for (t of tileTypes) { document.getElementById(`mapStationActivation${t}Full`).checked = true; } + document.getElementById("mapStationActivationSubAreaNo").checked = true; } } diff --git a/rust/maprando-web/templates/seed/map_station_activation_details.html b/rust/maprando-web/templates/seed/map_station_activation_details.html index 631fedfae..6f0e5bb43 100644 --- a/rust/maprando-web/templates/seed/map_station_activation_details.html +++ b/rust/maprando-web/templates/seed/map_station_activation_details.html @@ -39,3 +39,7 @@
Other:
{{ msa.other }}
+
+
Split sub area:
+
{{ msa.sub_area }}
+
diff --git a/rust/maprando/src/patch/map_tiles.rs b/rust/maprando/src/patch/map_tiles.rs index aa5c89cc9..c9418d07b 100644 --- a/rust/maprando/src/patch/map_tiles.rs +++ b/rust/maprando/src/patch/map_tiles.rs @@ -3158,6 +3158,34 @@ impl<'a> MapPatcher<'a> { fn write_map_station_bitmasks(&mut self) -> Result<()> { const FULL_MASK_ADDR: usize = 0x829727; const PARTIAL_MASK_ADDR: usize = 0x89B200; + let mut map_station_subareas = [None; NUM_AREAS]; + let settings = &self + .settings + .quality_of_life_settings + .map_station_activation_settings; + + for (room_idx, room) in self.game_data.room_geometry.iter().enumerate() { + let area = self.map.area[room_idx]; + let subarea = self.map.subarea[room_idx]; + + for y in 0..room.map.len() { + for x in 0..room.map[y].len() { + let Some((tile_area, map_x, map_y)) = + self.get_room_coords(room.room_id, x as isize, y as isize) + else { + continue; + }; + + let Some(tile) = self.map_tile_map.get(&(tile_area, map_x, map_y)) else { + continue; + }; + + if tile.interior == MapTileInterior::MapStation { + map_station_subareas[area] = Some(subarea); + } + } + } + } for area in 0..NUM_AREAS { for i in 0..0x100 { @@ -3190,7 +3218,16 @@ impl<'a> MapPatcher<'a> { continue; }; - let reveal_level = self.get_map_station_reveal(tile, room, x, y); + let mut reveal_level = self.get_map_station_reveal(tile, room, x, y); + + let tile_subarea = self.map.subarea[room_idx]; + + if let Some(map_station_subarea) = map_station_subareas[area] + && tile_subarea != map_station_subarea + && settings.sub_area != MapStationActivationLevel::No + { + reveal_level = settings.sub_area; + } let local_x = room_x + x as isize; let local_y = room_y + y as isize; diff --git a/rust/maprando/src/settings.rs b/rust/maprando/src/settings.rs index 112df1ad7..1d3e386a2 100644 --- a/rust/maprando/src/settings.rs +++ b/rust/maprando/src/settings.rs @@ -443,6 +443,7 @@ pub struct MapStationActivationSettings { pub items3: MapStationActivationLevel, pub items4: MapStationActivationLevel, pub other: MapStationActivationLevel, + pub sub_area: MapStationActivationLevel, } #[derive(Clone, Copy, Serialize, Deserialize, Debug, PartialEq)] @@ -1229,6 +1230,7 @@ fn upgrade_map_station_activation_settings(settings: &mut serde_json::Value) -> items3: MapStationActivationLevel::Full, items4: MapStationActivationLevel::Full, other: MapStationActivationLevel::Full, + sub_area: MapStationActivationLevel::No, }; qol_settings.insert( diff --git a/rust/maprando/tests/logic_scenarios.rs b/rust/maprando/tests/logic_scenarios.rs index 978d2e60f..e243388b7 100644 --- a/rust/maprando/tests/logic_scenarios.rs +++ b/rust/maprando/tests/logic_scenarios.rs @@ -255,6 +255,7 @@ fn get_settings(scenario: &Scenario) -> Result { items3: maprando::settings::MapStationActivationLevel::Full, items4: maprando::settings::MapStationActivationLevel::Full, other: maprando::settings::MapStationActivationLevel::Full, + sub_area: maprando::settings::MapStationActivationLevel::No, }, item_markers: maprando::settings::ItemMarkers::Simple, room_outline_revealed: false, From aa2025540d6729beb7506be81a80ee195ce57025 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Sun, 31 May 2026 09:55:45 +0900 Subject: [PATCH 27/31] remove extra lines hopefully this fixes my stupid rust_analyzer formatting --- rust/maprando/src/patch/map_tiles.rs | 82 ++-------------------------- 1 file changed, 4 insertions(+), 78 deletions(-) diff --git a/rust/maprando/src/patch/map_tiles.rs b/rust/maprando/src/patch/map_tiles.rs index c9418d07b..775e5a4c5 100644 --- a/rust/maprando/src/patch/map_tiles.rs +++ b/rust/maprando/src/patch/map_tiles.rs @@ -12,7 +12,7 @@ use crate::{ use maprando_game::{ AreaIdx, BeamType, Direction, DoorLockType, DoorType, GameData, Item, ItemIdx, Map, MapLiquidType, MapTile, MapTileEdge, MapTileFade, MapTileInterior, MapTileSpecialType, - RoomGeometry, RoomGeometryDoor, RoomGeometryItem, RoomId, RoomPtr, util::sorted_hashmap_iter, + RoomGeometryDoor, RoomGeometryItem, RoomId, RoomPtr, util::sorted_hashmap_iter, }; use super::{Rom, snes2pc, xy_to_explored_bit_ptr, xy_to_map_offset}; @@ -3163,11 +3163,9 @@ impl<'a> MapPatcher<'a> { .settings .quality_of_life_settings .map_station_activation_settings; - for (room_idx, room) in self.game_data.room_geometry.iter().enumerate() { let area = self.map.area[room_idx]; let subarea = self.map.subarea[room_idx]; - for y in 0..room.map.len() { for x in 0..room.map[y].len() { let Some((tile_area, map_x, map_y)) = @@ -3175,18 +3173,15 @@ impl<'a> MapPatcher<'a> { else { continue; }; - let Some(tile) = self.map_tile_map.get(&(tile_area, map_x, map_y)) else { continue; }; - if tile.interior == MapTileInterior::MapStation { map_station_subareas[area] = Some(subarea); } } } } - for area in 0..NUM_AREAS { for i in 0..0x100 { self.rom @@ -3195,11 +3190,9 @@ impl<'a> MapPatcher<'a> { .write_u8(snes2pc(PARTIAL_MASK_ADDR + area * 0x100 + i), 0)?; } } - for (room_idx, room) in self.game_data.room_geometry.iter().enumerate() { let room_x = self.rom.read_u8(room.rom_address + 2)?; let room_y = self.rom.read_u8(room.rom_address + 3)?; - for y in 0..room.map.len() { for x in 0..room.map[y].len() { if (room.map[y][x] == 0 && room_idx != self.game_data.toilet_room_idx) @@ -3207,81 +3200,54 @@ impl<'a> MapPatcher<'a> { { continue; } - let Some((area, map_x, map_y)) = self.get_room_coords(room.room_id, x as isize, y as isize) else { continue; }; - let Some(tile) = self.map_tile_map.get(&(area, map_x, map_y)) else { continue; }; - - let mut reveal_level = self.get_map_station_reveal(tile, room, x, y); - + let mut reveal_level = self.get_map_station_reveal(tile); let tile_subarea = self.map.subarea[room_idx]; - if let Some(map_station_subarea) = map_station_subareas[area] && tile_subarea != map_station_subarea && settings.sub_area != MapStationActivationLevel::No { reveal_level = settings.sub_area; } - let local_x = room_x + x as isize; let local_y = room_y + y as isize; - let (offset, bitmask) = xy_to_explored_bit_ptr(local_x, local_y); - let full_addr = FULL_MASK_ADDR + area * 0x100 + offset as usize; - let partial_addr = PARTIAL_MASK_ADDR + area * 0x100 + offset as usize; - match reveal_level { MapStationActivationLevel::No => {} - MapStationActivationLevel::Partial => { let mut partial = self.rom.read_u8(snes2pc(partial_addr))?; - partial |= bitmask as isize; - self.rom.write_u8(snes2pc(partial_addr), partial)?; } - MapStationActivationLevel::Full => { let mut full = self.rom.read_u8(snes2pc(full_addr))?; - full |= bitmask as isize; - self.rom.write_u8(snes2pc(full_addr), full)?; - let mut partial = self.rom.read_u8(snes2pc(partial_addr))?; - partial |= bitmask as isize; - self.rom.write_u8(snes2pc(partial_addr), partial)?; } } } } } - Ok(()) } - fn get_map_station_reveal( - &self, - tile: &MapTile, - room: &RoomGeometry, - x: usize, - y: usize, - ) -> MapStationActivationLevel { + fn get_map_station_reveal(&self, tile: &MapTile) -> MapStationActivationLevel { let settings = &self .settings .quality_of_life_settings .map_station_activation_settings; - if let Some(MapTileSpecialType::AreaTransition(_, _)) = tile.special_type { return if settings.area_transitions == MapStationActivationLevel::No { MapStationActivationLevel::No @@ -3289,59 +3255,19 @@ impl<'a> MapPatcher<'a> { MapStationActivationLevel::Full }; } - - let interior = match tile.interior { - MapTileInterior::Item | MapTileInterior::DoubleItem | MapTileInterior::HiddenItem => { - for (i, &item) in self.randomization.item_placement.iter().enumerate() { - let (item_room_id, node_id) = self.game_data.item_locations[i]; - - if item_room_id != room.room_id { - continue; - } - - let item_ptr = self.game_data.node_ptr_map[&(item_room_id, node_id)]; - - let Ok((item_x, item_y)) = find_item_xy(item_ptr, &room.items) else { - continue; - }; - - if item_x == x as isize && item_y == y as isize { - return match get_item_interior(item, self.settings) { - MapTileInterior::AmmoItem => settings.items2, - MapTileInterior::MediumItem => settings.items3, - MapTileInterior::MajorItem => settings.items4, - _ => settings.items1, - }; - } - } - - tile.interior - } - - _ => tile.interior, - }; - - match interior { + match tile.interior { MapTileInterior::SaveStation => settings.save_stations, - MapTileInterior::EnergyRefill | MapTileInterior::AmmoRefill | MapTileInterior::DoubleRefill => settings.refill_stations, - MapTileInterior::Ship => settings.ship, - MapTileInterior::Objective => settings.objectives, - MapTileInterior::Item | MapTileInterior::DoubleItem | MapTileInterior::HiddenItem => { settings.items1 } - MapTileInterior::AmmoItem => settings.items2, - MapTileInterior::MediumItem => settings.items3, - MapTileInterior::MajorItem => settings.items4, - _ => settings.other, } } From 3ad17a60c2c1aa91373cdee5a15084aa59e771d0 Mon Sep 17 00:00:00 2001 From: Brent Kerby Date: Tue, 2 Jun 2026 21:01:43 -0600 Subject: [PATCH 28/31] A few adjustments --- .../generate/map_station_activation.html | 38 +++++------ .../templates/generate/scripts.html | 4 +- rust/maprando/src/patch/map_tiles.rs | 12 +++- rust/maprando/src/settings.rs | 68 +++++++++++-------- rust/maprando/tests/logic_scenarios.rs | 2 +- 5 files changed, 72 insertions(+), 52 deletions(-) diff --git a/rust/maprando-web/templates/generate/map_station_activation.html b/rust/maprando-web/templates/generate/map_station_activation.html index fefcf8d49..1e262e8ca 100644 --- a/rust/maprando-web/templates/generate/map_station_activation.html +++ b/rust/maprando-web/templates/generate/map_station_activation.html @@ -203,25 +203,25 @@

Map station activation reveal

-
- -
- - - - - - -
-
+ + +
+ +
+ + + + + +
diff --git a/rust/maprando-web/templates/generate/scripts.html b/rust/maprando-web/templates/generate/scripts.html index 926e93c70..86329b42f 100644 --- a/rust/maprando-web/templates/generate/scripts.html +++ b/rust/maprando-web/templates/generate/scripts.html @@ -963,12 +963,12 @@ for (t of tileTypes) { document.getElementById(`mapStationActivation${t}Partial`).checked = true; } - document.getElementById("mapStationActivationSubAreaNo").checked = true; + document.getElementById("mapStationActivationSubAreaSame").checked = true; } else if (document.getElementById("mapStationActivationPresetFull").checked) { for (t of tileTypes) { document.getElementById(`mapStationActivation${t}Full`).checked = true; } - document.getElementById("mapStationActivationSubAreaNo").checked = true; + document.getElementById("mapStationActivationSubAreaSame").checked = true; } } diff --git a/rust/maprando/src/patch/map_tiles.rs b/rust/maprando/src/patch/map_tiles.rs index 775e5a4c5..6a28ce137 100644 --- a/rust/maprando/src/patch/map_tiles.rs +++ b/rust/maprando/src/patch/map_tiles.rs @@ -6,7 +6,7 @@ use crate::{ settings::{ DisableETankSetting, DoorLocksSize, EnhancedMapLevel, EnhancedMapOther, EnhancedMapWalls, InitialMapRevealSettings, ItemMarkers, MapRevealLevel, MapStationActivationLevel, - Objective, RandomizerSettings, + MapStationActivationSubArea, Objective, RandomizerSettings, }, }; use maprando_game::{ @@ -3212,9 +3212,15 @@ impl<'a> MapPatcher<'a> { let tile_subarea = self.map.subarea[room_idx]; if let Some(map_station_subarea) = map_station_subareas[area] && tile_subarea != map_station_subarea - && settings.sub_area != MapStationActivationLevel::No + && settings.sub_area != MapStationActivationSubArea::Same { - reveal_level = settings.sub_area; + reveal_level = match settings.sub_area { + MapStationActivationSubArea::Partial => { + MapStationActivationLevel::Partial + } + MapStationActivationSubArea::No => MapStationActivationLevel::No, + MapStationActivationSubArea::Same => unreachable!(), + }; } let local_x = room_x + x as isize; let local_y = room_y + y as isize; diff --git a/rust/maprando/src/settings.rs b/rust/maprando/src/settings.rs index 1d3e386a2..e65069b65 100644 --- a/rust/maprando/src/settings.rs +++ b/rust/maprando/src/settings.rs @@ -430,6 +430,19 @@ impl std::fmt::Display for MapStationActivationLevel { } } +#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] +pub enum MapStationActivationSubArea { + No, + Partial, + Same, +} + +impl std::fmt::Display for MapStationActivationSubArea { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self) + } +} + #[derive(Serialize, Deserialize, Clone, PartialEq)] pub struct MapStationActivationSettings { pub preset: Option, @@ -443,7 +456,7 @@ pub struct MapStationActivationSettings { pub items3: MapStationActivationLevel, pub items4: MapStationActivationLevel, pub other: MapStationActivationLevel, - pub sub_area: MapStationActivationLevel, + pub sub_area: MapStationActivationSubArea, } #[derive(Clone, Copy, Serialize, Deserialize, Debug, PartialEq)] @@ -1206,37 +1219,38 @@ fn upgrade_enhanced_map_settings(settings: &mut serde_json::Value) -> Result<()> fn upgrade_map_station_activation_settings(settings: &mut serde_json::Value) -> Result<()> { // Skip if already present - if settings["quality_of_life_settings"] - .as_object() - .unwrap() - .contains_key("map_station_activation_settings") - { - return Ok(()); - } - let qol_settings = settings["quality_of_life_settings"] .as_object_mut() .context("missing 'quality_of_life_settings'")?; - let msa_settings = MapStationActivationSettings { - preset: Some(MapStationActivationPreset::Full), - save_stations: MapStationActivationLevel::Full, - refill_stations: MapStationActivationLevel::Full, - ship: MapStationActivationLevel::Full, - objectives: MapStationActivationLevel::Full, - area_transitions: MapStationActivationLevel::Full, - items1: MapStationActivationLevel::Full, - items2: MapStationActivationLevel::Full, - items3: MapStationActivationLevel::Full, - items4: MapStationActivationLevel::Full, - other: MapStationActivationLevel::Full, - sub_area: MapStationActivationLevel::No, - }; + if !qol_settings.contains_key("map_station_activation_settings") { + let msa_settings = MapStationActivationSettings { + preset: Some(MapStationActivationPreset::Full), + save_stations: MapStationActivationLevel::Full, + refill_stations: MapStationActivationLevel::Full, + ship: MapStationActivationLevel::Full, + objectives: MapStationActivationLevel::Full, + area_transitions: MapStationActivationLevel::Full, + items1: MapStationActivationLevel::Full, + items2: MapStationActivationLevel::Full, + items3: MapStationActivationLevel::Full, + items4: MapStationActivationLevel::Full, + other: MapStationActivationLevel::Full, + sub_area: MapStationActivationSubArea::Same, + }; - qol_settings.insert( - "map_station_activation_settings".to_string(), - serde_json::to_value(msa_settings)?, - ); + qol_settings.insert( + "map_station_activation_settings".to_string(), + serde_json::to_value(msa_settings)?, + ); + } + + let msa_settings = qol_settings["map_station_activation_settings"] + .as_object_mut() + .context("map_station_activation_settings is not object")?; + if !msa_settings.contains_key("sub_area") { + msa_settings.insert("sub_area".to_string(), "Same".into()); + } Ok(()) } diff --git a/rust/maprando/tests/logic_scenarios.rs b/rust/maprando/tests/logic_scenarios.rs index e243388b7..a17b0ab23 100644 --- a/rust/maprando/tests/logic_scenarios.rs +++ b/rust/maprando/tests/logic_scenarios.rs @@ -255,7 +255,7 @@ fn get_settings(scenario: &Scenario) -> Result { items3: maprando::settings::MapStationActivationLevel::Full, items4: maprando::settings::MapStationActivationLevel::Full, other: maprando::settings::MapStationActivationLevel::Full, - sub_area: maprando::settings::MapStationActivationLevel::No, + sub_area: maprando::settings::MapStationActivationSubArea::Same, }, item_markers: maprando::settings::ItemMarkers::Simple, room_outline_revealed: false, From 0a90838441b00863a44cc35c211d98dbed8e59cc Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Fri, 5 Jun 2026 17:45:27 +0900 Subject: [PATCH 29/31] fix presets and collapse an if bracket in traverse that clippy was warning about (unreleated) --- .../Community Race Season 5.json | 2 +- rust/data/presets/full-settings/Default.json | 2 +- .../full-settings/Mentor Tournament.json | 2 +- .../Summer Series Expert Challenge.json | 2 +- .../data/presets/quality-of-life/Default.json | 2 +- rust/data/presets/quality-of-life/High.json | 2 +- rust/data/presets/quality-of-life/Low.json | 2 +- rust/data/presets/quality-of-life/Max.json | 2 +- rust/data/presets/quality-of-life/Off.json | 2 +- rust/maprando/src/traverse.rs | 32 +++++++------------ 10 files changed, 21 insertions(+), 29 deletions(-) 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 cebc133ef..c4dadc4e6 100644 --- a/rust/data/presets/full-settings/Community Race Season 5.json +++ b/rust/data/presets/full-settings/Community Race Season 5.json @@ -4697,7 +4697,7 @@ "items3": "Full", "items4": "Full", "other": "Full", - "sub_area": "No" + "sub_area": "Same" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/full-settings/Default.json b/rust/data/presets/full-settings/Default.json index b4771744c..1383c8092 100644 --- a/rust/data/presets/full-settings/Default.json +++ b/rust/data/presets/full-settings/Default.json @@ -4609,7 +4609,7 @@ "items3": "Full", "items4": "Full", "other": "Full", - "sub_area": "No" + "sub_area": "Same" }, "item_markers": "3-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/full-settings/Mentor Tournament.json b/rust/data/presets/full-settings/Mentor Tournament.json index e4a4d93a0..2bf5fbd83 100644 --- a/rust/data/presets/full-settings/Mentor Tournament.json +++ b/rust/data/presets/full-settings/Mentor Tournament.json @@ -4697,7 +4697,7 @@ "items3": "Full", "items4": "Full", "other": "Full", - "sub_area": "No" + "sub_area": "Same" }, "item_markers": "4-Tiered", "room_outline_revealed": 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 5b24b15d8..bcf33dadf 100644 --- a/rust/data/presets/full-settings/Summer Series Expert Challenge.json +++ b/rust/data/presets/full-settings/Summer Series Expert Challenge.json @@ -4609,7 +4609,7 @@ "items3": "Full", "items4": "Full", "other": "Full", - "sub_area": "No" + "sub_area": "Same" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/Default.json b/rust/data/presets/quality-of-life/Default.json index b46f4ce1b..f67c790f2 100644 --- a/rust/data/presets/quality-of-life/Default.json +++ b/rust/data/presets/quality-of-life/Default.json @@ -42,7 +42,7 @@ "items3": "Full", "items4": "Full", "other": "Full", - "sub_area": "No" + "sub_area": "Same" }, "item_markers": "3-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/High.json b/rust/data/presets/quality-of-life/High.json index 270e3d9cd..cb08afbde 100644 --- a/rust/data/presets/quality-of-life/High.json +++ b/rust/data/presets/quality-of-life/High.json @@ -42,7 +42,7 @@ "items3": "Full", "items4": "Full", "other": "Full", - "sub_area": "No" + "sub_area": "Same" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/Low.json b/rust/data/presets/quality-of-life/Low.json index 4b3702b60..6cd0fca4d 100644 --- a/rust/data/presets/quality-of-life/Low.json +++ b/rust/data/presets/quality-of-life/Low.json @@ -42,7 +42,7 @@ "items3": "Full", "items4": "Full", "other": "Full", - "sub_area": "No" + "sub_area": "Same" }, "item_markers": "Uniques", "room_outline_revealed": false, diff --git a/rust/data/presets/quality-of-life/Max.json b/rust/data/presets/quality-of-life/Max.json index 8d12d717e..c2f1c8802 100644 --- a/rust/data/presets/quality-of-life/Max.json +++ b/rust/data/presets/quality-of-life/Max.json @@ -42,7 +42,7 @@ "items3": "Full", "items4": "Full", "other": "Full", - "sub_area": "No" + "sub_area": "Same" }, "item_markers": "4-Tiered", "room_outline_revealed": true, diff --git a/rust/data/presets/quality-of-life/Off.json b/rust/data/presets/quality-of-life/Off.json index 7262cff5d..b3e42e4dd 100644 --- a/rust/data/presets/quality-of-life/Off.json +++ b/rust/data/presets/quality-of-life/Off.json @@ -42,7 +42,7 @@ "items3": "Full", "items4": "Full", "other": "Full", - "sub_area": "No" + "sub_area": "Same" }, "item_markers": "Simple", "room_outline_revealed": false, diff --git a/rust/maprando/src/traverse.rs b/rust/maprando/src/traverse.rs index 50ed11516..91e8b09c1 100644 --- a/rust/maprando/src/traverse.rs +++ b/rust/maprando/src/traverse.rs @@ -573,31 +573,23 @@ pub struct LockedDoorData { type LocalStateArray = ArrayVec; fn apply_link(link: &Link, mut local: LocalStateArray, cx: &TraversalContext) -> LocalStateArray { - if cx.reverse { - if !link.end_with_shinecharge { - local.retain(|x| x.shinecharge_frames_remaining == 0); - } - } else { - if !link.start_with_shinecharge { - for loc in &mut local { - loc.shinecharge_frames_remaining = 0; - } + if cx.reverse && !link.end_with_shinecharge { + local.retain(|x| x.shinecharge_frames_remaining == 0); + } else if !cx.reverse && !link.start_with_shinecharge { + for loc in &mut local { + loc.shinecharge_frames_remaining = 0; } } local = apply_requirement_complex(&link.requirement, local, cx); - if cx.reverse { - if !link.start_with_shinecharge { - local.retain(|x| x.shinecharge_frames_remaining == 0); - } - } else { - if !link.end_with_shinecharge { - for loc in &mut local { - loc.shinecharge_frames_remaining = 0; - } + if cx.reverse && !link.start_with_shinecharge { + local.retain(|x| x.shinecharge_frames_remaining == 0); + } else if !cx.reverse && !link.end_with_shinecharge { + for loc in &mut local { + loc.shinecharge_frames_remaining = 0; } } - for x in &mut local { - x.length += link.length; + for loc in &mut local { + loc.length += link.length; } local } From 36117dbf268bb21e42fb4a214be521df0f36bcf7 Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Fri, 5 Jun 2026 20:49:08 +0900 Subject: [PATCH 30/31] fix mapstation resetting partially revealed bits on activation also fixed the json of the kraid recharge station being wrong. --- patches/ips/map_progress_maintain.ips | Bin 637 -> 639 bytes patches/rom_map/Bank 90.txt | 2 +- patches/src/map_progress_maintain.asm | 17 +++-------------- rust/data/map_tiles.json | 2 +- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/patches/ips/map_progress_maintain.ips b/patches/ips/map_progress_maintain.ips index 68bf7298f3eb12b18ff34e9666fd6d5a5c17e5f1..f874555c9747bca6db41a23eb212f2d777c1617c 100644 GIT binary patch delta 39 ucmey%@}Fgc10(y{?;Pa}438(fGj{OHGpHBL2jUkmIxaj{m^t|l<3a#46%bkg delta 37 vcmV+=0NVfm1pNfCKmiBK_Xu|Y0O6BI0f-Hs04H$h=!nqkfB+zulimTLCMggi diff --git a/patches/rom_map/Bank 90.txt b/patches/rom_map/Bank 90.txt index 1c6e95c77..47a776daa 100644 --- a/patches/rom_map/Bank 90.txt +++ b/patches/rom_map/Bank 90.txt @@ -7,4 +7,4 @@ F980 - F99E: ; respin.asm FC00 - FC0F: ; Fake Lava.asm FC10 - FC1C: ; crash_handle_yapping.asm FC20 - FC3A: ; remove_spikesuit.asm -FC40 - FCBA: ; split_speed.asm +FC40 - FCBA: ; split_speed.asm \ No newline at end of file diff --git a/patches/src/map_progress_maintain.asm b/patches/src/map_progress_maintain.asm index 30dc84b59..db08c6095 100644 --- a/patches/src/map_progress_maintain.asm +++ b/patches/src/map_progress_maintain.asm @@ -1,7 +1,6 @@ arch snes.cpu lorom -;!map_station_reveal_type = $90F700 ; 0 = Full reveal, 1 = Partial reveal !map_reveal_tile_table = $90FA00 ; must match reference in patch.rs !bank_90_freespace_start = $90F700 !bank_90_freespace_end = $90F800 @@ -108,27 +107,17 @@ activate_map_station_hook: tax ; X <- map area * $100 ldy #$0080 ; Y <- loop counter (number of words to fill with #$FFFF) - ; lda !map_station_reveal_type - ; bne .partial_only_loop .loop: lda $829727, x - sta $702000, x + sta $702000, x ; maptiles bitmask lda $89b200, x - sta $702700, x + ora $702700, x ; don't clear any bits already marked explored as it can break scrolling with sub area reveal set to off. + sta $702700, x ; partially revealed bitmask inx inx dey bne .loop - bra .leave - -;.partial_only_loop: -; sta $702700, x -; inx -; inx -; dey -; bne .partial_only_loop -.leave jsr cross_area_reveal rtl diff --git a/rust/data/map_tiles.json b/rust/data/map_tiles.json index 0ff775b4e..3204f75b4 100644 --- a/rust/data/map_tiles.json +++ b/rust/data/map_tiles.json @@ -256,7 +256,7 @@ "roomId": 301, "roomName": "Kraid Recharge Station", "mapTiles": [ - {"coords": [0, 0], "left": "door", "right": "door", "top": "door", "bottom": "door", "interior": "doubleRefill"} + {"coords": [0, 0], "left": "door", "right": "wall", "top": "wall", "bottom": "wall", "interior": "doubleRefill"} ] }, { From ac71d245e971e68ad40b36a86640c22ff55288ea Mon Sep 17 00:00:00 2001 From: nn <53490794+nn357@users.noreply.github.com> Date: Sat, 6 Jun 2026 22:54:49 +0900 Subject: [PATCH 31/31] update map station activation --- patches/ips/map_progress_maintain.ips | Bin 639 -> 643 bytes patches/src/map_progress_maintain.asm | 6 ++---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/patches/ips/map_progress_maintain.ips b/patches/ips/map_progress_maintain.ips index f874555c9747bca6db41a23eb212f2d777c1617c..a2837aff3b419ecd3e6c37b6fd9ad1bd8a8f1d73 100644 GIT binary patch delta 51 zcmey*(#*QSfsy^Oi)7!HX9i7al9joqUgR FApq4L6UP7m delta 47 zcmZo>{m-(&fsy^}caCxfhR2iL85_jsGbj}7XV}y!&!Ao~ABbPP=(zA)VdmsVj0*vx CYZDLv diff --git a/patches/src/map_progress_maintain.asm b/patches/src/map_progress_maintain.asm index db08c6095..7068b672a 100644 --- a/patches/src/map_progress_maintain.asm +++ b/patches/src/map_progress_maintain.asm @@ -1,7 +1,7 @@ arch snes.cpu lorom -!map_reveal_tile_table = $90FA00 ; must match reference in patch.rs +!map_reveal_tile_table = $90FA00 ; must match reference in patch.rs (fn write_map_reveal_tiles) !bank_90_freespace_start = $90F700 !bank_90_freespace_end = $90F800 @@ -29,9 +29,6 @@ org $90AB6D org $90A98B jmp mark_progress -;org !map_station_reveal_type -; dw $0000 ; default: full reveal - org !bank_90_freespace_start mark_progress: lda $12 ; Samus X map coordinate @@ -110,6 +107,7 @@ activate_map_station_hook: .loop: lda $829727, x + ora $702000, x sta $702000, x ; maptiles bitmask lda $89b200, x ora $702700, x ; don't clear any bits already marked explored as it can break scrolling with sub area reveal set to off.