diff --git a/patches/ips/disableable_etanks.ips b/patches/ips/disableable_etanks.ips index 8e26b3dc6..dfa0f2c29 100644 Binary files a/patches/ips/disableable_etanks.ips and b/patches/ips/disableable_etanks.ips differ 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 diff --git a/patches/src/disableable_etanks.asm b/patches/src/disableable_etanks.asm index c4cd1de6b..0b7c54814 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,11 +497,21 @@ 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 - + 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 @@ -493,6 +519,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 +549,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 +570,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 +648,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: 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/src/web/randomize/helpers.rs b/rust/maprando-web/src/web/randomize/helpers.rs index b9ec5ec55..a590fb1dd 100644 --- a/rust/maprando-web/src/web/randomize/helpers.rs +++ b/rust/maprando-web/src/web/randomize/helpers.rs @@ -10,8 +10,8 @@ use maprando::{ randomize::{DifficultyConfig, ItemPriorityGroup, Randomization, get_starting_items}, seed_repository::{Seed, SeedFile}, settings::{ - AreaAssignmentBaseOrder, AreaAssignmentPreset, DoorLocksSize, ETankRefill, - FillerItemPriority, ItemCount, RandomizerSettings, SpeedBooster, WallJump, + AreaAssignmentBaseOrder, AreaAssignmentPreset, DisableETankSetting, DoorLocksSize, + ETankRefill, FillerItemPriority, ItemCount, RandomizerSettings, SpeedBooster, WallJump, get_objective_groups, }, spoiler_log::SpoilerLog, @@ -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,16 @@ 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/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/patch.rs b/rust/maprando/src/patch.rs index c8f4e108e..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, + AreaAssignmentPreset, DisableETankSetting, ETankRefill, Fanfares, ItemCount, + MotherBrainFight, Objective, ObjectiveScreen, RandomizerSettings, SaveAnimals, + SpeedBooster, StartLocationMode, WallJump, }, }; use anyhow::{Context, Result, bail, ensure}; @@ -582,7 +582,7 @@ 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,12 @@ 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..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, DoorLocksSize, InitialMapRevealSettings, ItemMarkers, MapRevealLevel, + MapStationReveal, Objective, RandomizerSettings, }, }; 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..6c3e28f69 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, @@ -817,7 +825,17 @@ 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()); diff --git a/rust/maprando/src/traverse.rs b/rust/maprando/src/traverse.rs index 8889fac31..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}, + 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 + 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, 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"} }