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
Map station activation reveal
+
Partial
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
Full