From e4c03756926e8c5102bcdd4aec69243b422d27fb Mon Sep 17 00:00:00 2001 From: aquanight Date: Wed, 18 Feb 2026 19:35:47 -0700 Subject: [PATCH 1/7] Disable E-Tanks Classic Mode --- patches/ips/disableable_etanks.ips | Bin 987 -> 1030 bytes patches/src/disableable_etanks.asm | 75 +++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 20 deletions(-) diff --git a/patches/ips/disableable_etanks.ips b/patches/ips/disableable_etanks.ips index 8e26b3dc6e6e29996e49a90841e4f838a88e81ba..d25001a64ad3d136edfdfb09806dd88f5fb84400 100644 GIT binary patch delta 514 zcmXv|O=#3W82u(cn}n{qjj@F8Wr+t{u($?)f=~+LrLYu4>Y=9~f^Ee;d+TCQmO?Zo z=ut#Wp+DK?&|B&ybcG7yUPVMG9^6&exkzW&f_^D=4)Y%Gy?JjwD^Jv5acPc`;cbwt z;*Lj#--B3jQTTOb8tQz~Jr}(_&xNBFznhqNCwRi)2C{Q!f z%>@;%;mDw^QylXD4*{VJgdzuNf`fXGH{c})i1hYIQm~$swX!s8fi{wm~mM29}?| x+YAfhIp@eK#=Dx+y$c^QEto#${;t;lsl6M?KNEb)V{`~Dj3lC;Y2l3M{{#P-%YOg> delta 490 zcmXYq&r1|x7{{M?el$DS51k#BmknZ@4!Mx9N$DbpAYOt+h)~Ld3=*W4(J2U)+{;9l z!O`t6FyDjdJIujjT^2_$DE1gc1fASf*Y_gLtAahN`&_;c&-eR$z8_M*j9`B8X+nCo zKywbcM|!@2nw!SMA?k~Sq!&;N3AxjUiottRpq{-#Jp#4#HX(%(&~qP?W|Q0>z{ID7 z^v|OcCgi~}I;(Bx;Y-k+pWJJb(HXd@few1uIwg7->TnvqUT$0`pO;U@`qw0%F!FF- zH=J?ql~TO)Z?nBcIcx%)+lGWfWkKZjz&fY^={X8V(fSRVxEQBavJ@eO1N z5Lsr?IgHT2V00+91R^mxbIAnKNJ(Cq!kpRq!Gtm{t=Uzo~BJNQ)RVz5a zy;XpUwukezECppt!X7Tm-(^|fKYK3&qf_4NDjZ0#Yw$84l_F}s>o h@80IyX0h=czSqp4*xCJUvvpwZWZLb)pXxi+{|~0$xy1kg diff --git a/patches/src/disableable_etanks.asm b/patches/src/disableable_etanks.asm index c4cd1de6b..c87bf9c1c 100644 --- a/patches/src/disableable_etanks.asm +++ b/patches/src/disableable_etanks.asm @@ -4,8 +4,8 @@ !bank_82_free_space_start = $82F830 !bank_82_free_space_end = $82F9E0 -!bank_85_free_space_start = $85AD00 -!bank_85_free_space_end = $85AE13 +!bank_83_free_space_start = $83BB00 +!bank_83_free_space_end = $83BC40 !current_etank_index = $12 !count_full_etanks = $14 @@ -141,6 +141,9 @@ org $8291ED org !bank_82_free_space_start +config_classic: + dw $0000 + hook_unpause_loading: ;jsl $809A79 ; Hard re-initialize the HUD after we've messed with it. ldx #$0012 @@ -270,10 +273,9 @@ etanks_dpad_right: cmp !count_all_etanks ; Don't go right past the total number of E-Tanks bcs .no - lda $0755 - clc - adc #$0100 - sta $0755 + sep #$20 + inc $0756 + rep #$20 sec rts @@ -287,11 +289,16 @@ etanks_dpad_left: cmp #$0002 beq .no + lda config_classic + bne .classic + lda !current_etank_index dec a cmp !count_full_etanks ; Don't go into full e-tanks bcc .no +.classic + sep #$20 dec $0756 rep #$20 @@ -307,24 +314,33 @@ etanks_dpad_down: and #$00F0 bne .no + lda config_classic + bne .classic + ; Don't move down into full e-tanks lda $09C2 cmp #$02BC ; [Current energy] >= 700 means all 7 bottom row tanks are full bcs .no +.classic - lda $0755 - xba - and #$00ff + lda !current_etank_index sec sbc #$0007 - cmp !count_full_etanks + tax + lda config_classic + bne + + cpx !count_full_etanks bcs + - lda !count_full_etanks + ldx !count_full_etanks + - sta $0756 - + sep #$10 + stx $0756 + rep #$10 + +.done sec rts + .no ; Don't go back to hook_equipment_screen_category_etanks lda #$0037 @@ -341,14 +357,14 @@ etanks_dpad_up: lda !current_etank_index clc - adc #$0007 - cmp !count_all_etanks - bcc + - lda !count_all_etanks + adc #$0008 +- dec a + cmp !count_all_etanks + bcs - cmp !current_etank_index beq .no -+ + sep #$20 sta $0756 rep #$20 @@ -423,7 +439,7 @@ hook_equipment_screen_category_etanks: warnpc !bank_82_free_space_end -org !bank_85_free_space_start +org !bank_83_free_space_start etank_do_some_math: php @@ -481,10 +497,15 @@ dpad_enter_hud: pla sta $12 + lda.l config_classic + bne .classic + ; Can we move up here at all. lda !count_all_etanks cmp !count_full_etanks beq .no + +.classic ; Are any not-full etanks enabled lda !count_full_etanks @@ -493,6 +514,7 @@ dpad_enter_hud: ; Select leftmost enabled tank (A button disables all tanks) lda !count_full_etanks + cmp !count_all_etanks xba and #$ff00 ora #$0004 @@ -522,11 +544,14 @@ dpad_enter_hud: disable_tank: ; Sanity check: can we actually disable this tank? + lda.l config_classic + bne .classic lda $09C4 sec sbc #$0064 cmp $09C2 bcc tank_swap_done ; (max health - 100) < current health = bad times +.classic ; Disable 1 e-tank lda $09C4 @@ -540,6 +565,16 @@ disable_tank: lda !current_etank_index cmp !count_enabled_etanks bcc disable_tank ; Repeat until we've disabled all tanks above and including the selected tank + + lda.l config_classic + beq .skipclamp + + lda $09C4 + cmp $09C2 + bcs .skipclamp ; max health < current health = need to clamp + + sta $09C2 +.skipclamp bra tank_swap_good @@ -608,7 +643,7 @@ hook_load_equipment_menu: stx $0330 rtl -warnpc !bank_85_free_space_end +warnpc !bank_83_free_space_end org $B6FE60 tile_modified_map_cursor: From 5c00e9c30050e31ea3341d37c722aaf2493c2ee2 Mon Sep 17 00:00:00 2001 From: aquanight Date: Wed, 18 Feb 2026 19:41:00 -0700 Subject: [PATCH 2/7] Update ROM map --- patches/rom_map/Bank 83.txt | 4 +++- patches/rom_map/Bank 85.txt | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/patches/rom_map/Bank 83.txt b/patches/rom_map/Bank 83.txt index 378b68a20..6e349082c 100644 --- a/patches/rom_map/Bank 83.txt +++ b/patches/rom_map/Bank 83.txt @@ -4,5 +4,7 @@ B000 - B700: items_disappear.asm B700 - B800: rng_fix.asm B800 - BA00: Mosaic (Area FX.asm) BA00 - BA15: vanilla_bugfixes.asm -BA15 - F000: [free space] +BA15 - BB00: [free] +BB00 - BC40: disableable_etanks.asm +BC40 - F000: [free space] F000 - end: Mosaic (FX data) \ No newline at end of file diff --git a/patches/rom_map/Bank 85.txt b/patches/rom_map/Bank 85.txt index af23d72c2..318025ef4 100644 --- a/patches/rom_map/Bank 85.txt +++ b/patches/rom_map/Bank 85.txt @@ -16,7 +16,7 @@ $AA00 - $AAA0: pause_menu_objectives.asm $AAA0 - $AB00: [FREE] $AB00 - $ACA0: map_area.asm $ACA0 - $AD00: load_flash_suit -$AD00 - $AE20: disable_etanks.asm +$AD00 - $AE20: [FREE] $AE20 - $B000: reserve_backward_fill.asm $B000 - $B600: vanilla_bugfixes.asm $B600 - $BA00: map_area.asm \ No newline at end of file From 667e3e4945e3a0e0ff0259c977f259ee85eac22c Mon Sep 17 00:00:00 2001 From: aquanight Date: Wed, 18 Feb 2026 20:34:39 -0700 Subject: [PATCH 3/7] Step 1 of plumbing QoL setting --- rust/maprando-web/src/web/randomize/helpers.rs | 8 +++++++- .../templates/generate/quality_of_life.html | 10 ++++++---- rust/maprando/src/patch.rs | 10 +++++++--- rust/maprando/src/patch/map_tiles.rs | 6 +++--- rust/maprando/src/settings.rs | 10 +++++++++- rust/maprando/src/traverse.rs | 6 +++--- 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/rust/maprando-web/src/web/randomize/helpers.rs b/rust/maprando-web/src/web/randomize/helpers.rs index b9ec5ec55..74c681423 100644 --- a/rust/maprando-web/src/web/randomize/helpers.rs +++ b/rust/maprando-web/src/web/randomize/helpers.rs @@ -12,7 +12,7 @@ use maprando::{ settings::{ AreaAssignmentBaseOrder, AreaAssignmentPreset, DoorLocksSize, ETankRefill, FillerItemPriority, ItemCount, RandomizerSettings, SpeedBooster, WallJump, - get_objective_groups, + get_objective_groups, DisableETankSetting }, spoiler_log::SpoilerLog, spoiler_map, @@ -59,6 +59,7 @@ pub struct SeedHeaderTemplate<'a> { momentum_conservation: bool, fanfares: String, etank_refill: String, + disableable_etanks: String, doors: String, start_location_mode: String, map_layout: String, @@ -455,6 +456,11 @@ pub fn render_seed( ETankRefill::Full => "Full", } .to_string(), + disableable_etanks: match seed_data.settings.quality_of_life_settings.disableable_etanks { + DisableETankSetting::Off => "Off", + DisableETankSetting::Standard => "Standard", + DisableETankSetting::Unrestricted => "Unrestricted" + }.to_string(), doors: seed_data.doors.clone(), start_location_mode: seed_data.start_location_mode.clone(), map_layout: seed_data.map_layout.clone(), diff --git a/rust/maprando-web/templates/generate/quality_of_life.html b/rust/maprando-web/templates/generate/quality_of_life.html index aaff51cb7..93e923b80 100644 --- a/rust/maprando-web/templates/generate/quality_of_life.html +++ b/rust/maprando-web/templates/generate/quality_of_life.html @@ -404,10 +404,12 @@

Quality-of-life options

- - - - + + + + + +
diff --git a/rust/maprando/src/patch.rs b/rust/maprando/src/patch.rs index c8f4e108e..a76d85d4c 100644 --- a/rust/maprando/src/patch.rs +++ b/rust/maprando/src/patch.rs @@ -20,7 +20,7 @@ use crate::{ settings::{ AreaAssignmentPreset, ETankRefill, Fanfares, ItemCount, MotherBrainFight, Objective, ObjectiveScreen, RandomizerSettings, SaveAnimals, SpeedBooster, StartLocationMode, - WallJump, + WallJump, DisableETankSetting }, }; use anyhow::{Context, Result, bail, ensure}; @@ -581,8 +581,8 @@ impl Patcher<'_> { { patches.push("energy_station_reserves"); } - - if self.settings.quality_of_life_settings.disableable_etanks { + + if self.settings.quality_of_life_settings.disableable_etanks != DisableETankSetting::Off { patches.push("disableable_etanks"); } @@ -689,6 +689,10 @@ impl Patcher<'_> { } self.rom.write_u16(snes2pc(0xdfff05), settings_flag)?; + if self.settings.quality_of_life_settings.disableable_etanks == DisableETankSetting::Unrestricted { + self.rom.write_u16(snes2pc(0x82F830), 0x0001)?; + } + Ok(()) } diff --git a/rust/maprando/src/patch/map_tiles.rs b/rust/maprando/src/patch/map_tiles.rs index 8027a1b94..ddb083cfd 100644 --- a/rust/maprando/src/patch/map_tiles.rs +++ b/rust/maprando/src/patch/map_tiles.rs @@ -5,7 +5,7 @@ use crate::{ randomize::{LockedDoor, Randomization}, settings::{ DoorLocksSize, InitialMapRevealSettings, ItemMarkers, MapRevealLevel, MapStationReveal, - Objective, RandomizerSettings, + Objective, RandomizerSettings, DisableETankSetting }, }; use maprando_game::{ @@ -1522,7 +1522,7 @@ impl<'a> MapPatcher<'a> { .into_iter() .collect(); - if settings.quality_of_life_settings.disableable_etanks { + if settings.quality_of_life_settings.disableable_etanks != DisableETankSetting::Off { // Reserve tile $2F for disabled ETank reserved_tiles.insert(0x2F); } @@ -2940,7 +2940,7 @@ impl<'a> MapPatcher<'a> { self.fix_message_boxes()?; self.fix_hud_black()?; self.darken_hud_grid()?; - if self.settings.quality_of_life_settings.disableable_etanks { + if self.settings.quality_of_life_settings.disableable_etanks != DisableETankSetting::Off { self.write_disabled_etank_tile()?; } self.apply_room_tiles()?; diff --git a/rust/maprando/src/settings.rs b/rust/maprando/src/settings.rs index e3d9bad92..d37d4e0a6 100644 --- a/rust/maprando/src/settings.rs +++ b/rust/maprando/src/settings.rs @@ -119,6 +119,14 @@ pub enum StartingItemsPreset { None, All, } + +#[derive(Serialize, Deserialize, Clone, PartialEq)] +pub enum DisableETankSetting { + Off, + Standard, + Unrestricted +} + #[derive(Serialize, Deserialize, Clone, PartialEq)] pub struct QualityOfLifeSettings { pub preset: Option, @@ -149,7 +157,7 @@ pub struct QualityOfLifeSettings { // Energy and reserves pub etank_refill: ETankRefill, pub energy_station_reserves: bool, - pub disableable_etanks: bool, + pub disableable_etanks: DisableETankSetting, pub reserve_backward_transfer: bool, // Other: pub buffed_drops: bool, diff --git a/rust/maprando/src/traverse.rs b/rust/maprando/src/traverse.rs index 8889fac31..2e7fed136 100644 --- a/rust/maprando/src/traverse.rs +++ b/rust/maprando/src/traverse.rs @@ -10,7 +10,7 @@ use serde::{Deserialize, Serialize}; use crate::{ randomize::{DifficultyConfig, LockedDoor}, - settings::{MotherBrainFight, Objective, RandomizerSettings, WallJump}, + settings::{MotherBrainFight, Objective, RandomizerSettings, WallJump, DisableETankSetting}, }; use maprando_game::{ BeamType, Capacity, DoorType, EnemyDrop, EnemyVulnerabilities, GameData, Item, Link, LinkIdx, @@ -1157,10 +1157,10 @@ fn apply_requirement_simple( *obj_id, ) .into(), - Requirement::DisableableETank => cx + Requirement::DisableableETank => (cx .settings .quality_of_life_settings - .disableable_etanks + .disableable_etanks != DisableETankSetting::Off) .into(), Requirement::Walljump => match cx.settings.other_settings.wall_jump { WallJump::Vanilla => cx.difficulty.tech[cx.game_data.wall_jump_tech_idx].into(), From f7932a341ce5a45e778ed82f4e1b431a99c30266 Mon Sep 17 00:00:00 2001 From: aquanight Date: Wed, 18 Feb 2026 21:12:56 -0700 Subject: [PATCH 4/7] The rest of QoL expansion for Disable E-Tanks --- .../presets/full-settings/Community Race Season 4.json | 2 +- rust/data/presets/full-settings/Default.json | 2 +- rust/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 +- .../generate/help/quality/disableable_etanks.html | 10 +++++++--- .../templates/generate/quality_of_life.html | 2 +- rust/maprando-web/templates/generate/scripts.html | 2 +- .../templates/seed/quality_of_life_details.html | 2 +- rust/maprando/src/settings.rs | 8 +++++++- 12 files changed, 24 insertions(+), 14 deletions(-) diff --git a/rust/data/presets/full-settings/Community Race Season 4.json b/rust/data/presets/full-settings/Community Race Season 4.json index 0497342a2..0899f4f8a 100644 --- a/rust/data/presets/full-settings/Community Race Season 4.json +++ b/rust/data/presets/full-settings/Community Race Season 4.json @@ -4553,7 +4553,7 @@ "remove_climb_lava": true, "etank_refill": "Full", "energy_station_reserves": true, - "disableable_etanks": true, + "disableable_etanks": "Standard", "reserve_backward_transfer": false, "buffed_drops": true, "early_save": true, diff --git a/rust/data/presets/full-settings/Default.json b/rust/data/presets/full-settings/Default.json index 72f84763e..3920a9f1d 100644 --- a/rust/data/presets/full-settings/Default.json +++ b/rust/data/presets/full-settings/Default.json @@ -4553,7 +4553,7 @@ "remove_climb_lava": true, "energy_station_reserves": false, "etank_refill": "Vanilla", - "disableable_etanks": false, + "disableable_etanks": "Off", "reserve_backward_transfer": false, "buffed_drops": true, "early_save": true, diff --git a/rust/data/presets/quality-of-life/Default.json b/rust/data/presets/quality-of-life/Default.json index 644d616df..d5513ad31 100644 --- a/rust/data/presets/quality-of-life/Default.json +++ b/rust/data/presets/quality-of-life/Default.json @@ -35,7 +35,7 @@ "remove_climb_lava": true, "energy_station_reserves": false, "etank_refill": "Vanilla", - "disableable_etanks": false, + "disableable_etanks": "Off", "reserve_backward_transfer": false, "buffed_drops": true, "early_save": true, diff --git a/rust/data/presets/quality-of-life/High.json b/rust/data/presets/quality-of-life/High.json index 3998f745e..fdcd0b9f9 100644 --- a/rust/data/presets/quality-of-life/High.json +++ b/rust/data/presets/quality-of-life/High.json @@ -35,7 +35,7 @@ "remove_climb_lava": true, "energy_station_reserves": true, "etank_refill": "Full", - "disableable_etanks": true, + "disableable_etanks": "Standard", "reserve_backward_transfer": false, "buffed_drops": true, "early_save": true, diff --git a/rust/data/presets/quality-of-life/Low.json b/rust/data/presets/quality-of-life/Low.json index 84f73e7c0..4dcb90268 100644 --- a/rust/data/presets/quality-of-life/Low.json +++ b/rust/data/presets/quality-of-life/Low.json @@ -35,7 +35,7 @@ "remove_climb_lava": false, "energy_station_reserves": false, "etank_refill": "Vanilla", - "disableable_etanks": false, + "disableable_etanks": "Off", "reserve_backward_transfer": false, "buffed_drops": false, "early_save": false, diff --git a/rust/data/presets/quality-of-life/Max.json b/rust/data/presets/quality-of-life/Max.json index a54aa11d1..a1f389638 100644 --- a/rust/data/presets/quality-of-life/Max.json +++ b/rust/data/presets/quality-of-life/Max.json @@ -35,7 +35,7 @@ "remove_climb_lava": true, "energy_station_reserves": true, "etank_refill": "Full", - "disableable_etanks": true, + "disableable_etanks": "Standard", "reserve_backward_transfer": true, "buffed_drops": true, "early_save": true, diff --git a/rust/data/presets/quality-of-life/Off.json b/rust/data/presets/quality-of-life/Off.json index 55b7ee2b9..93d16b12f 100644 --- a/rust/data/presets/quality-of-life/Off.json +++ b/rust/data/presets/quality-of-life/Off.json @@ -35,7 +35,7 @@ "remove_climb_lava": false, "energy_station_reserves": false, "etank_refill": "Vanilla", - "disableable_etanks": false, + "disableable_etanks": "Off", "reserve_backward_transfer": false, "buffed_drops": false, "early_save": false, diff --git a/rust/maprando-web/templates/generate/help/quality/disableable_etanks.html b/rust/maprando-web/templates/generate/help/quality/disableable_etanks.html index 9f78803de..685d1fcff 100644 --- a/rust/maprando-web/templates/generate/help/quality/disableable_etanks.html +++ b/rust/maprando-web/templates/generate/help/quality/disableable_etanks.html @@ -6,9 +6,13 @@

Disableable E-Tanks

-
+
diff --git a/rust/maprando-web/templates/generate/scripts.html b/rust/maprando-web/templates/generate/scripts.html index 0f5db0c19..d63b81e12 100644 --- a/rust/maprando-web/templates/generate/scripts.html +++ b/rust/maprando-web/templates/generate/scripts.html @@ -278,7 +278,7 @@ "remove_climb_lava": formData.get("remove_climb_lava") == "true", "etank_refill": formData.get("etank_refill"), "energy_station_reserves": formData.get("energy_station_reserves") == "true", - "disableable_etanks": formData.get("disableable_etanks") == "true", + "disableable_etanks": formData.get("disableable_etanks"), "reserve_backward_transfer": formData.get("reserve_backward_transfer") == "true", "buffed_drops": formData.get("buffed_drops") == "true", "early_save": formData.get("early_save") == "true", 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 da73eaaa6..b789aa788 100644 --- a/rust/maprando-web/templates/seed/quality_of_life_details.html +++ b/rust/maprando-web/templates/seed/quality_of_life_details.html @@ -91,7 +91,7 @@
Disableable E-Tanks:
-
{% if settings.quality_of_life_settings.disableable_etanks %}Yes{% else %}No{% endif %}
+
{{+ disableable_etanks }}
Reserve energy backward transfer:
diff --git a/rust/maprando/src/settings.rs b/rust/maprando/src/settings.rs index d37d4e0a6..232c77009 100644 --- a/rust/maprando/src/settings.rs +++ b/rust/maprando/src/settings.rs @@ -825,7 +825,13 @@ fn upgrade_qol_settings(settings: &mut serde_json::Value) -> Result<()> { qol_settings.insert("energy_station_reserves".to_string(), false.into()); } if !qol_settings.contains_key("disableable_etanks") { - qol_settings.insert("disableable_etanks".to_string(), false.into()); + qol_settings.insert("disableable_etanks".to_string(), "Off".into()); + } else { + match qol_settings["disableable_etanks"].as_bool() { + Some(false) => { qol_settings.insert("disableable_etanks".to_string(), "Off".into()); }, + Some(true) => { qol_settings.insert("disableable_etanks".to_string(), "Standard".into()); }, + None => {} + }; } if !qol_settings.contains_key("reserve_backward_transfer") { qol_settings.insert("reserve_backward_transfer".to_string(), false.into()); From 252e04634367628b04cf65a7e209ce5b803a8c48 Mon Sep 17 00:00:00 2001 From: aquanight Date: Wed, 18 Feb 2026 21:17:04 -0700 Subject: [PATCH 5/7] In Unrestricted, don't go into the HUD with no tanks --- patches/ips/disableable_etanks.ips | Bin 1030 -> 1036 bytes patches/src/disableable_etanks.asm | 7 ++++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/patches/ips/disableable_etanks.ips b/patches/ips/disableable_etanks.ips index d25001a64ad3d136edfdfb09806dd88f5fb84400..dfa0f2c29d0a92eb52e2772ddf7f3a31b2a94bd0 100644 GIT binary patch delta 51 zcmV-30L=e}2#g4jasd*Nb6f%avCy3X2b;TtfCM7dlXL<%0XUPa0$mFTr5ME&@HK!0 Jr5KYA1NiSk64C$w delta 45 zcmV+|0Mh@A2!;rdasdpHb6f%UvCy3X2bH^nfCM7XlXL<%0Wy=U0$l|Lr5ME&lN1B^ De_s$x diff --git a/patches/src/disableable_etanks.asm b/patches/src/disableable_etanks.asm index c87bf9c1c..0b7c54814 100644 --- a/patches/src/disableable_etanks.asm +++ b/patches/src/disableable_etanks.asm @@ -504,9 +504,14 @@ dpad_enter_hud: lda !count_all_etanks cmp !count_full_etanks beq .no + bra .which .classic - + ; Have we any tanks at all + lda !count_all_etanks + beq .no + +.which ; Are any not-full etanks enabled lda !count_full_etanks cmp !count_enabled_etanks From c4bc5bb17d7f5e5244f6ded66436191bea35a50a Mon Sep 17 00:00:00 2001 From: aquanight Date: Wed, 18 Feb 2026 21:38:46 -0700 Subject: [PATCH 6/7] Fix failing tests --- .../maprando-web/src/web/randomize/helpers.rs | 17 ++++++++++------ rust/maprando/src/patch.rs | 12 ++++++----- rust/maprando/src/patch/map_tiles.rs | 4 ++-- rust/maprando/src/settings.rs | 10 +++++++--- rust/maprando/src/traverse.rs | 8 +++----- rust/maprando/tests/logic_scenarios.rs | 20 ++++++++++++++----- .../disable-equipment/scenarios.json | 2 +- 7 files changed, 46 insertions(+), 27 deletions(-) diff --git a/rust/maprando-web/src/web/randomize/helpers.rs b/rust/maprando-web/src/web/randomize/helpers.rs index 74c681423..a590fb1dd 100644 --- a/rust/maprando-web/src/web/randomize/helpers.rs +++ b/rust/maprando-web/src/web/randomize/helpers.rs @@ -10,9 +10,9 @@ use maprando::{ randomize::{DifficultyConfig, ItemPriorityGroup, Randomization, get_starting_items}, seed_repository::{Seed, SeedFile}, settings::{ - AreaAssignmentBaseOrder, AreaAssignmentPreset, DoorLocksSize, ETankRefill, - FillerItemPriority, ItemCount, RandomizerSettings, SpeedBooster, WallJump, - get_objective_groups, DisableETankSetting + AreaAssignmentBaseOrder, AreaAssignmentPreset, DisableETankSetting, DoorLocksSize, + ETankRefill, FillerItemPriority, ItemCount, RandomizerSettings, SpeedBooster, WallJump, + get_objective_groups, }, spoiler_log::SpoilerLog, spoiler_map, @@ -456,11 +456,16 @@ pub fn render_seed( ETankRefill::Full => "Full", } .to_string(), - disableable_etanks: match seed_data.settings.quality_of_life_settings.disableable_etanks { + disableable_etanks: match seed_data + .settings + .quality_of_life_settings + .disableable_etanks + { DisableETankSetting::Off => "Off", DisableETankSetting::Standard => "Standard", - DisableETankSetting::Unrestricted => "Unrestricted" - }.to_string(), + DisableETankSetting::Unrestricted => "Unrestricted", + } + .to_string(), doors: seed_data.doors.clone(), start_location_mode: seed_data.start_location_mode.clone(), map_layout: seed_data.map_layout.clone(), diff --git a/rust/maprando/src/patch.rs b/rust/maprando/src/patch.rs index a76d85d4c..b0de2fa07 100644 --- a/rust/maprando/src/patch.rs +++ b/rust/maprando/src/patch.rs @@ -18,9 +18,9 @@ use crate::{ patch::map_tiles::diagonal_flip_tile, randomize::{LockedDoor, Randomization, get_starting_items}, settings::{ - AreaAssignmentPreset, ETankRefill, Fanfares, ItemCount, MotherBrainFight, Objective, - ObjectiveScreen, RandomizerSettings, SaveAnimals, SpeedBooster, StartLocationMode, - WallJump, DisableETankSetting + AreaAssignmentPreset, DisableETankSetting, ETankRefill, Fanfares, ItemCount, + MotherBrainFight, Objective, ObjectiveScreen, RandomizerSettings, SaveAnimals, + SpeedBooster, StartLocationMode, WallJump, }, }; use anyhow::{Context, Result, bail, ensure}; @@ -581,7 +581,7 @@ impl Patcher<'_> { { patches.push("energy_station_reserves"); } - + if self.settings.quality_of_life_settings.disableable_etanks != DisableETankSetting::Off { patches.push("disableable_etanks"); } @@ -689,7 +689,9 @@ impl Patcher<'_> { } self.rom.write_u16(snes2pc(0xdfff05), settings_flag)?; - if self.settings.quality_of_life_settings.disableable_etanks == DisableETankSetting::Unrestricted { + if self.settings.quality_of_life_settings.disableable_etanks + == DisableETankSetting::Unrestricted + { self.rom.write_u16(snes2pc(0x82F830), 0x0001)?; } diff --git a/rust/maprando/src/patch/map_tiles.rs b/rust/maprando/src/patch/map_tiles.rs index ddb083cfd..54e25c7c2 100644 --- a/rust/maprando/src/patch/map_tiles.rs +++ b/rust/maprando/src/patch/map_tiles.rs @@ -4,8 +4,8 @@ use crate::{ customize::{CustomizeSettings, ItemDotChange}, randomize::{LockedDoor, Randomization}, settings::{ - DoorLocksSize, InitialMapRevealSettings, ItemMarkers, MapRevealLevel, MapStationReveal, - Objective, RandomizerSettings, DisableETankSetting + DisableETankSetting, DoorLocksSize, InitialMapRevealSettings, ItemMarkers, MapRevealLevel, + MapStationReveal, Objective, RandomizerSettings, }, }; use maprando_game::{ diff --git a/rust/maprando/src/settings.rs b/rust/maprando/src/settings.rs index 232c77009..6c3e28f69 100644 --- a/rust/maprando/src/settings.rs +++ b/rust/maprando/src/settings.rs @@ -124,7 +124,7 @@ pub enum StartingItemsPreset { pub enum DisableETankSetting { Off, Standard, - Unrestricted + Unrestricted, } #[derive(Serialize, Deserialize, Clone, PartialEq)] @@ -828,8 +828,12 @@ fn upgrade_qol_settings(settings: &mut serde_json::Value) -> Result<()> { qol_settings.insert("disableable_etanks".to_string(), "Off".into()); } else { match qol_settings["disableable_etanks"].as_bool() { - Some(false) => { qol_settings.insert("disableable_etanks".to_string(), "Off".into()); }, - Some(true) => { qol_settings.insert("disableable_etanks".to_string(), "Standard".into()); }, + Some(false) => { + qol_settings.insert("disableable_etanks".to_string(), "Off".into()); + } + Some(true) => { + qol_settings.insert("disableable_etanks".to_string(), "Standard".into()); + } None => {} }; } diff --git a/rust/maprando/src/traverse.rs b/rust/maprando/src/traverse.rs index 2e7fed136..d079ce9db 100644 --- a/rust/maprando/src/traverse.rs +++ b/rust/maprando/src/traverse.rs @@ -10,7 +10,7 @@ use serde::{Deserialize, Serialize}; use crate::{ randomize::{DifficultyConfig, LockedDoor}, - settings::{MotherBrainFight, Objective, RandomizerSettings, WallJump, DisableETankSetting}, + settings::{DisableETankSetting, MotherBrainFight, Objective, RandomizerSettings, WallJump}, }; use maprando_game::{ BeamType, Capacity, DoorType, EnemyDrop, EnemyVulnerabilities, GameData, Item, Link, LinkIdx, @@ -1157,10 +1157,8 @@ fn apply_requirement_simple( *obj_id, ) .into(), - Requirement::DisableableETank => (cx - .settings - .quality_of_life_settings - .disableable_etanks != DisableETankSetting::Off) + Requirement::DisableableETank => (cx.settings.quality_of_life_settings.disableable_etanks + != DisableETankSetting::Off) .into(), Requirement::Walljump => match cx.settings.other_settings.wall_jump { WallJump::Vanilla => cx.difficulty.tech[cx.game_data.wall_jump_tech_idx].into(), diff --git a/rust/maprando/tests/logic_scenarios.rs b/rust/maprando/tests/logic_scenarios.rs index 574cfaf02..96813be58 100644 --- a/rust/maprando/tests/logic_scenarios.rs +++ b/rust/maprando/tests/logic_scenarios.rs @@ -5,9 +5,9 @@ use hashbrown::HashMap; use maprando::{ randomize::{DifficultyConfig, Preprocessor}, settings::{ - InitialMapRevealSettings, ItemProgressionSettings, Objective, ObjectiveSettings, - OtherSettings, QualityOfLifeSettings, RandomizerSettings, SkillAssumptionSettings, - StartLocationSettings, + DisableETankSetting, InitialMapRevealSettings, ItemProgressionSettings, Objective, + ObjectiveSettings, OtherSettings, QualityOfLifeSettings, RandomizerSettings, + SkillAssumptionSettings, StartLocationSettings, }, traverse::{LockedDoorData, Traverser}, }; @@ -82,7 +82,7 @@ struct ScenarioSettings { shinecharge_leniency_frames: Option, resource_multiplier: Option, farm_time_limit: Option, - disableable_etanks: Option, + disableable_etanks: Option, buffed_drops: Option, collectible_wall_jump: Option, split_speed_booster: Option, @@ -221,7 +221,17 @@ fn get_settings(scenario: &Scenario) -> Result { remove_climb_lava: false, etank_refill: maprando::settings::ETankRefill::Vanilla, energy_station_reserves: false, - disableable_etanks: settings.disableable_etanks.unwrap_or(false), + disableable_etanks: match settings + .disableable_etanks + .clone() + .unwrap_or("Off".to_string()) + .as_str() + { + "Off" => DisableETankSetting::Off, + "Standard" => DisableETankSetting::Standard, + "Unrestricted" => DisableETankSetting::Unrestricted, + _ => DisableETankSetting::Off, + }, reserve_backward_transfer: false, buffed_drops: settings.buffed_drops.unwrap_or(false), early_save: false, diff --git a/rust/maprando/tests/scenarios/disable-equipment/scenarios.json b/rust/maprando/tests/scenarios/disable-equipment/scenarios.json index 94e481240..01367ade3 100644 --- a/rust/maprando/tests/scenarios/disable-equipment/scenarios.json +++ b/rust/maprando/tests/scenarios/disable-equipment/scenarios.json @@ -22,7 +22,7 @@ { "name": "Have Disableable Tanks", "settings": { - "disableableEtanks": true + "disableableEtanks": "Standard" }, "startRoomId": 0, "startNodeId": 1, From 5efe2859361b9187bcb0a1484c16512ce3135c77 Mon Sep 17 00:00:00 2001 From: Brent Kerby Date: Thu, 19 Feb 2026 07:47:19 -0700 Subject: [PATCH 7/7] update logic scenario schema --- rust/maprando/tests/schema/scenarios.schema.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rust/maprando/tests/schema/scenarios.schema.json b/rust/maprando/tests/schema/scenarios.schema.json index 9224ebfe6..a415c5b15 100644 --- a/rust/maprando/tests/schema/scenarios.schema.json +++ b/rust/maprando/tests/schema/scenarios.schema.json @@ -66,7 +66,10 @@ "shinechargeLeniencyFrames": {"type": "integer"}, "resourceMultiplier": {"type": "number"}, "farmTimeLimit": {"type": "number"}, - "disableableEtanks": {"type": "boolean"}, + "disableableEtanks": { + "type": "string", + "enum": ["Off", "Standard", "Unrestricted"] + }, "buffedDrops": {"type": "boolean"}, "collectibleWallJump": {"type": "boolean"} }