From f1f9b348fc7f8961397d629666efa28bcc1829c1 Mon Sep 17 00:00:00 2001 From: dyceron Date: Mon, 20 Jan 2025 00:25:46 -0500 Subject: [PATCH 01/12] Add split suits --- .../files/custom/randoapi.lua | 11 ++++++ .../files/custom/scenario.lua | 2 + .../files/pickups/randomizersuit.lua | 37 +++++++++++-------- src/open_samus_returns_rando/lua_editor.py | 6 +++ 4 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 src/open_samus_returns_rando/files/custom/randoapi.lua diff --git a/src/open_samus_returns_rando/files/custom/randoapi.lua b/src/open_samus_returns_rando/files/custom/randoapi.lua new file mode 100644 index 00000000..350d0ec3 --- /dev/null +++ b/src/open_samus_returns_rando/files/custom/randoapi.lua @@ -0,0 +1,11 @@ +Game.ImportLibrary("actors/items/randomizerpowerup/scripts/randomizerpowerup.lc", false) + +RandoApi = RandoApi or {} +function RandoApi.main() +end + +function RandoApi.ChangeSuitValues(hasVaria, hasGravity) + hasVaria = RandomizerPowerup.GetItemAmount("ITEM_VARIA_SUIT") > 0 + hasGravity = RandomizerPowerup.GetItemAmount("ITEM_GRAVITY_SUIT") > 0 + RandoApi.ChangeSuitValues(hasVaria, hasGravity) +end diff --git a/src/open_samus_returns_rando/files/custom/scenario.lua b/src/open_samus_returns_rando/files/custom/scenario.lua index eaaa385f..2b50a662 100644 --- a/src/open_samus_returns_rando/files/custom/scenario.lua +++ b/src/open_samus_returns_rando/files/custom/scenario.lua @@ -2,6 +2,7 @@ Game.ImportLibrary("system/scripts/scenario_original.lua") Game.ImportLibrary("system/scripts/guilib.lua", false) Game.ImportLibrary("system/scripts/queue.lua", false) Game.ImportLibrary("system/scripts/cosmetics.lua", false) +Game.ImportLibrary("system/scripts/randoapi.lua", false) Game.DoFile("system/scripts/room_names.lua") Game.DoFile("system/scripts/elevators.lua") @@ -64,6 +65,7 @@ function Scenario.InitGUI() GUILib.InitCustomUI() GUILib.UpdateTotalDNAColor() Scenario.UpdateDNACounter() + RandoApi.ChangeSuitValues(hasVaria, hasGravity) if Init.bEnableRoomIds then RoomNameGui.Init() diff --git a/src/open_samus_returns_rando/files/pickups/randomizersuit.lua b/src/open_samus_returns_rando/files/pickups/randomizersuit.lua index 80ce1fb1..a7a7f1ce 100644 --- a/src/open_samus_returns_rando/files/pickups/randomizersuit.lua +++ b/src/open_samus_returns_rando/files/pickups/randomizersuit.lua @@ -1,8 +1,16 @@ Game.ImportLibrary("actors/items/randomizerpowerup/scripts/randomizerpowerup.lc", false) + RandomizerSuit = RandomizerSuit or {} function RandomizerSuit.main() end +function RandomizerSuit.IsInLiquid(liquid) + if liquid ~= nil and liquid.TRIGGER:IsPlayerInside() == true then + liquid.TRIGGER:DisableTrigger() + liquid.TRIGGER:EnableTrigger() + end +end + function RandomizerSuit.ResetLiquidState() -- When collecting an item in a liquid, the liquid must be disabled if the item is Gravity, -- otherwise Samus' movement is permanently Gravityless, even after exiting the liquid. @@ -15,10 +23,7 @@ function RandomizerSuit.ResetLiquidState() for i = 1, 2 do for j = 1, 19 do local water = Game.GetEntity(waterPrefixes[i] .. string.format("%03d", j)) - if water ~= nil and water.TRIGGER:IsPlayerInside() == true then - water.TRIGGER:DisableTrigger() - water.TRIGGER:EnableTrigger() - end + RandomizerSuit.IsInLiquid(water) end end end @@ -26,11 +31,8 @@ function RandomizerSuit.ResetLiquidState() local lavaScenarios = {"s020_area2", "s033_area3b", "s036_area3c", "s040_area4", "s050_area5"} if scenario == lavaScenarios[i] then for j = 1, 5 do - lava = Game.GetEntity("TG_Lava_" .. string.format("%03d", j)) - if lava ~= nil and lava.TRIGGER:IsPlayerInside() == true then - lava.TRIGGER:DisableTrigger() - lava.TRIGGER:EnableTrigger() - end + local lava = Game.GetEntity("TG_Lava_" .. string.format("%03d", j)) + RandomizerSuit.IsInLiquid(lava) end end end @@ -52,11 +54,8 @@ function RandomizerSuit.ResetLiquidState() liquids = {"TG_Damage_Hazardous_001", "TG_Damage_Hazardous_002"} end for i = 1, #liquids do - local liquid = Game.GetEntity(liquids[i]) - if liquid.TRIGGER:IsPlayerInside() == true then - Game.GetEntity(liquid[i]).TRIGGER:DisableTrigger() - Game.GetEntity(liquid[i]).TRIGGER:EnableTrigger() - end + liquid = Game.GetEntity(liquids[i]) + RandomizerSuit.IsInLiquid(liquid) end end end @@ -64,10 +63,16 @@ end function RandomizerSuit.OnPickedUp(progression, actorOrName) RandomizerSuit.ResetLiquidState() RandomizerPowerup.OnPickedUp(progression, actorOrName) - if Game.GetItemAmount(Game.GetPlayerName(), "ITEM_GRAVITY_SUIT") > 0 then + if RandomizerPowerup.GetItemAmount("ITEM_GRAVITY_SUIT") > 0 then Game.GetEntity("Samus").MODELUPDATER.sModelAlias = "Gravity" + RandoApi.ChangeSuitValues(false, true) + if RandomizerPowerup.GetItemAmount("ITEM_VARIA_SUIT") > 0 then + RandoApi.ChangeSuitValues(true, true) + Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) + end else Game.GetEntity("Samus").MODELUPDATER.sModelAlias = "Varia" + RandoApi.ChangeSuitValues(true, false) + Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) end - Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) end \ No newline at end of file diff --git a/src/open_samus_returns_rando/lua_editor.py b/src/open_samus_returns_rando/lua_editor.py index bc23d490..1082b477 100644 --- a/src/open_samus_returns_rando/lua_editor.py +++ b/src/open_samus_returns_rando/lua_editor.py @@ -349,6 +349,12 @@ def save_modifications(self, editor: PatcherEditor, configuration: dict) -> None [] ) + editor.add_new_asset( + "system/scripts/randoapi.lc", + Lua(Container(lua_text=files_path().joinpath("custom", "randoapi.lua").read_text()), editor.target_game), + [] + ) + # replace ensured scripts with the final code final_metroid_script = lua_util.replace_lua_template("metroid_template.lua", {"mapping": self._metroid_dict}) imports_in_metroid = [f'Game.ImportLibrary("{a_import}", false)' for a_import in self._metroid_imports] From baf811ebea594d39f39c3e99408ac623a9474d11 Mon Sep 17 00:00:00 2001 From: dyceron Date: Tue, 21 Jan 2025 18:28:57 -0500 Subject: [PATCH 02/12] Fix randoapi and cleanup randomizersuit --- .../files/custom/randoapi.lua | 15 ++++++++++++++- .../files/custom/scenario.lua | 2 +- .../files/pickups/randomizersuit.lua | 13 +------------ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/open_samus_returns_rando/files/custom/randoapi.lua b/src/open_samus_returns_rando/files/custom/randoapi.lua index 350d0ec3..25b69935 100644 --- a/src/open_samus_returns_rando/files/custom/randoapi.lua +++ b/src/open_samus_returns_rando/files/custom/randoapi.lua @@ -4,8 +4,21 @@ RandoApi = RandoApi or {} function RandoApi.main() end -function RandoApi.ChangeSuitValues(hasVaria, hasGravity) +function RandoApi.UpdateSuits() hasVaria = RandomizerPowerup.GetItemAmount("ITEM_VARIA_SUIT") > 0 hasGravity = RandomizerPowerup.GetItemAmount("ITEM_GRAVITY_SUIT") > 0 + + -- Custom lua function to update damage reductions RandoApi.ChangeSuitValues(hasVaria, hasGravity) + + -- Model and damage_alarm updates + if hasGravity then + Game.GetEntity("Samus").MODELUPDATER.sModelAlias = "Gravity" + if hasVaria then + Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) + end + elseif hasVaria then + Game.GetEntity("Samus").MODELUPDATER.sModelAlias = "Varia" + Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) + end end diff --git a/src/open_samus_returns_rando/files/custom/scenario.lua b/src/open_samus_returns_rando/files/custom/scenario.lua index 2b50a662..ca52733d 100644 --- a/src/open_samus_returns_rando/files/custom/scenario.lua +++ b/src/open_samus_returns_rando/files/custom/scenario.lua @@ -65,7 +65,7 @@ function Scenario.InitGUI() GUILib.InitCustomUI() GUILib.UpdateTotalDNAColor() Scenario.UpdateDNACounter() - RandoApi.ChangeSuitValues(hasVaria, hasGravity) + RandoApi.UpdateSuits() if Init.bEnableRoomIds then RoomNameGui.Init() diff --git a/src/open_samus_returns_rando/files/pickups/randomizersuit.lua b/src/open_samus_returns_rando/files/pickups/randomizersuit.lua index a7a7f1ce..7b1f288a 100644 --- a/src/open_samus_returns_rando/files/pickups/randomizersuit.lua +++ b/src/open_samus_returns_rando/files/pickups/randomizersuit.lua @@ -63,16 +63,5 @@ end function RandomizerSuit.OnPickedUp(progression, actorOrName) RandomizerSuit.ResetLiquidState() RandomizerPowerup.OnPickedUp(progression, actorOrName) - if RandomizerPowerup.GetItemAmount("ITEM_GRAVITY_SUIT") > 0 then - Game.GetEntity("Samus").MODELUPDATER.sModelAlias = "Gravity" - RandoApi.ChangeSuitValues(false, true) - if RandomizerPowerup.GetItemAmount("ITEM_VARIA_SUIT") > 0 then - RandoApi.ChangeSuitValues(true, true) - Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) - end - else - Game.GetEntity("Samus").MODELUPDATER.sModelAlias = "Varia" - RandoApi.ChangeSuitValues(true, false) - Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) - end + RandoApi.UpdateSuits() end \ No newline at end of file From f5ebb20f3aa576c170dbbb30d28119bff58d7ffa Mon Sep 17 00:00:00 2001 From: dyceron Date: Tue, 21 Jan 2025 18:28:57 -0500 Subject: [PATCH 03/12] Fix randoapi and cleanup randomizersuit --- .../files/custom/randoapi.lua | 15 ++++++++++++++- .../files/custom/scenario.lua | 2 +- .../files/pickups/randomizersuit.lua | 13 +------------ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/open_samus_returns_rando/files/custom/randoapi.lua b/src/open_samus_returns_rando/files/custom/randoapi.lua index 350d0ec3..43b578f0 100644 --- a/src/open_samus_returns_rando/files/custom/randoapi.lua +++ b/src/open_samus_returns_rando/files/custom/randoapi.lua @@ -4,8 +4,21 @@ RandoApi = RandoApi or {} function RandoApi.main() end -function RandoApi.ChangeSuitValues(hasVaria, hasGravity) +function RandoApi.UpdateSuits() hasVaria = RandomizerPowerup.GetItemAmount("ITEM_VARIA_SUIT") > 0 hasGravity = RandomizerPowerup.GetItemAmount("ITEM_GRAVITY_SUIT") > 0 + + -- Update damage reductions based on the suits RandoApi.ChangeSuitValues(hasVaria, hasGravity) + + -- Model and damage_alarm updates + if hasGravity then + Game.GetEntity("Samus").MODELUPDATER.sModelAlias = "Gravity" + if hasVaria then + Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) + end + elseif hasVaria then + Game.GetEntity("Samus").MODELUPDATER.sModelAlias = "Varia" + Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) + end end diff --git a/src/open_samus_returns_rando/files/custom/scenario.lua b/src/open_samus_returns_rando/files/custom/scenario.lua index 2b50a662..ca52733d 100644 --- a/src/open_samus_returns_rando/files/custom/scenario.lua +++ b/src/open_samus_returns_rando/files/custom/scenario.lua @@ -65,7 +65,7 @@ function Scenario.InitGUI() GUILib.InitCustomUI() GUILib.UpdateTotalDNAColor() Scenario.UpdateDNACounter() - RandoApi.ChangeSuitValues(hasVaria, hasGravity) + RandoApi.UpdateSuits() if Init.bEnableRoomIds then RoomNameGui.Init() diff --git a/src/open_samus_returns_rando/files/pickups/randomizersuit.lua b/src/open_samus_returns_rando/files/pickups/randomizersuit.lua index a7a7f1ce..7b1f288a 100644 --- a/src/open_samus_returns_rando/files/pickups/randomizersuit.lua +++ b/src/open_samus_returns_rando/files/pickups/randomizersuit.lua @@ -63,16 +63,5 @@ end function RandomizerSuit.OnPickedUp(progression, actorOrName) RandomizerSuit.ResetLiquidState() RandomizerPowerup.OnPickedUp(progression, actorOrName) - if RandomizerPowerup.GetItemAmount("ITEM_GRAVITY_SUIT") > 0 then - Game.GetEntity("Samus").MODELUPDATER.sModelAlias = "Gravity" - RandoApi.ChangeSuitValues(false, true) - if RandomizerPowerup.GetItemAmount("ITEM_VARIA_SUIT") > 0 then - RandoApi.ChangeSuitValues(true, true) - Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) - end - else - Game.GetEntity("Samus").MODELUPDATER.sModelAlias = "Varia" - RandoApi.ChangeSuitValues(true, false) - Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) - end + RandoApi.UpdateSuits() end \ No newline at end of file From 0a3973e5c4f019b650a53a4328c6d4dac4350746 Mon Sep 17 00:00:00 2001 From: dyceron Date: Tue, 21 Jan 2025 19:37:16 -0500 Subject: [PATCH 04/12] Add split beams --- .../files/custom/randoapi.lua | 15 ++++++++++++--- .../files/custom/scenario.lua | 3 ++- .../files/pickups/randomizersuit.lua | 2 +- .../files/templates/randomizerpowerup.lua | 3 +++ 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/open_samus_returns_rando/files/custom/randoapi.lua b/src/open_samus_returns_rando/files/custom/randoapi.lua index 43b578f0..b2dca0e7 100644 --- a/src/open_samus_returns_rando/files/custom/randoapi.lua +++ b/src/open_samus_returns_rando/files/custom/randoapi.lua @@ -4,9 +4,9 @@ RandoApi = RandoApi or {} function RandoApi.main() end -function RandoApi.UpdateSuits() - hasVaria = RandomizerPowerup.GetItemAmount("ITEM_VARIA_SUIT") > 0 - hasGravity = RandomizerPowerup.GetItemAmount("ITEM_GRAVITY_SUIT") > 0 +function RandoApi.CheckSuits() + local hasVaria = RandomizerPowerup.GetItemAmount("ITEM_VARIA_SUIT") > 0 + local hasGravity = RandomizerPowerup.GetItemAmount("ITEM_GRAVITY_SUIT") > 0 -- Update damage reductions based on the suits RandoApi.ChangeSuitValues(hasVaria, hasGravity) @@ -22,3 +22,12 @@ function RandoApi.UpdateSuits() Game.GetPlayer():StopEntityLoopWithFade("actors/samus/damage_alarm.wav", 0.6) end end + +function RandoApi.CheckBeams() + local hasWave = RandomizerPowerup.GetItemAmount("ITEM_WEAPON_WAVE_BEAM") > 0 + local hasSpazer = RandomizerPowerup.GetItemAmount("ITEM_WEAPON_SPAZER_BEAM") > 0 + local hasPlasma = RandomizerPowerup.GetItemAmount("ITEM_WEAPON_PLASMA_BEAM") > 0 + + -- Damage values are Solo Spazer, Solo Plasma, Plasma + Wave, and Plasma + Spazer, respctively + RandoApi.ChangeBeams(hasWave, hasSpazer, hasPlasma, 40, 75, 90, 82.5) +end \ No newline at end of file diff --git a/src/open_samus_returns_rando/files/custom/scenario.lua b/src/open_samus_returns_rando/files/custom/scenario.lua index ca52733d..a501e7be 100644 --- a/src/open_samus_returns_rando/files/custom/scenario.lua +++ b/src/open_samus_returns_rando/files/custom/scenario.lua @@ -65,7 +65,8 @@ function Scenario.InitGUI() GUILib.InitCustomUI() GUILib.UpdateTotalDNAColor() Scenario.UpdateDNACounter() - RandoApi.UpdateSuits() + RandoApi.CheckSuits() + RandoApi.CheckBeams() if Init.bEnableRoomIds then RoomNameGui.Init() diff --git a/src/open_samus_returns_rando/files/pickups/randomizersuit.lua b/src/open_samus_returns_rando/files/pickups/randomizersuit.lua index 7b1f288a..ddd35e2a 100644 --- a/src/open_samus_returns_rando/files/pickups/randomizersuit.lua +++ b/src/open_samus_returns_rando/files/pickups/randomizersuit.lua @@ -63,5 +63,5 @@ end function RandomizerSuit.OnPickedUp(progression, actorOrName) RandomizerSuit.ResetLiquidState() RandomizerPowerup.OnPickedUp(progression, actorOrName) - RandoApi.UpdateSuits() + RandoApi.CheckSuits() end \ No newline at end of file diff --git a/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua b/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua index a35bea6e..c4021a33 100644 --- a/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua +++ b/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua @@ -53,6 +53,9 @@ function RandomizerPowerup.OnPickedUp(resources, actorOrName, regionName) for _, resource in ipairs(granted) do RandomizerPowerup.IncreaseAmmo(resource) + if resource.item_id == "ITEM_WEAPON_WAVE_BEAM" or resource.item_id == "ITEM_WEAPON_SPAZER_BEAM" or resource.item_id == "ITEM_WEAPON_PLASMA_BEAM" then + RandoApi.CheckBeams() + end end Scenario.UpdateProgressiveItemModels() From 0d9d351f26bd3bbf9c1d0909b4a5e0cfda4a7fa3 Mon Sep 17 00:00:00 2001 From: dyceron Date: Tue, 21 Jan 2025 20:31:58 -0500 Subject: [PATCH 05/12] Cleanup system scripts --- src/open_samus_returns_rando/lua_editor.py | 42 +++++++--------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/src/open_samus_returns_rando/lua_editor.py b/src/open_samus_returns_rando/lua_editor.py index 1082b477..4cbba6b7 100644 --- a/src/open_samus_returns_rando/lua_editor.py +++ b/src/open_samus_returns_rando/lua_editor.py @@ -324,36 +324,18 @@ def save_modifications(self, editor: PatcherEditor, configuration: dict) -> None self._add_replacement_files(editor, configuration) # add new system scripts - editor.add_new_asset( - "system/scripts/guilib.lc", - Lua(Container(lua_text=files_path().joinpath("custom", "guilib.lua").read_text()), editor.target_game), - [] - ) - - editor.add_new_asset( - "system/scripts/queue.lc", - Lua(Container(lua_text=files_path().joinpath("custom", "queue.lua").read_text()), editor.target_game), - [] - ) - - cosmetics_script = cosmetic_patches.lua_cosmetics(configuration["cosmetic_patches"]) - editor.add_new_asset( - "system/scripts/cosmetics.lc", - Lua(Container(lua_text=cosmetics_script), editor.target_game), - [] - ) - - editor.add_new_asset( - "system/scripts/room_names.lc", - Lua(Container(lua_text=files_path().joinpath("custom", "room_names.lua").read_text()), editor.target_game), - [] - ) - - editor.add_new_asset( - "system/scripts/randoapi.lc", - Lua(Container(lua_text=files_path().joinpath("custom", "randoapi.lua").read_text()), editor.target_game), - [] - ) + SYSTEM_SCRIPTS = ["cosmetics", "guilib", "queue", "randoapi", "room_names"] + for system_script in SYSTEM_SCRIPTS: + lua_text_replacement = ( + files_path().joinpath("custom", f"{system_script}.lua").read_text() + if system_script != "cosmetics" + else cosmetic_patches.lua_cosmetics(configuration["cosmetic_patches"]) + ) + editor.add_new_asset( + f"system/scripts/{system_script}.lc", + Lua(Container(lua_text=lua_text_replacement), editor.target_game), + [], + ) # replace ensured scripts with the final code final_metroid_script = lua_util.replace_lua_template("metroid_template.lua", {"mapping": self._metroid_dict}) From b695216848c9fb188b308c70cf99ca5337964797 Mon Sep 17 00:00:00 2001 From: dyceron Date: Tue, 21 Jan 2025 23:36:25 -0500 Subject: [PATCH 06/12] Rename function --- .../files/pickups/randomizersuit.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/open_samus_returns_rando/files/pickups/randomizersuit.lua b/src/open_samus_returns_rando/files/pickups/randomizersuit.lua index ddd35e2a..5ac1d32e 100644 --- a/src/open_samus_returns_rando/files/pickups/randomizersuit.lua +++ b/src/open_samus_returns_rando/files/pickups/randomizersuit.lua @@ -4,7 +4,7 @@ RandomizerSuit = RandomizerSuit or {} function RandomizerSuit.main() end -function RandomizerSuit.IsInLiquid(liquid) +function RandomizerSuit.CheckLiquidState(liquid) if liquid ~= nil and liquid.TRIGGER:IsPlayerInside() == true then liquid.TRIGGER:DisableTrigger() liquid.TRIGGER:EnableTrigger() @@ -23,7 +23,7 @@ function RandomizerSuit.ResetLiquidState() for i = 1, 2 do for j = 1, 19 do local water = Game.GetEntity(waterPrefixes[i] .. string.format("%03d", j)) - RandomizerSuit.IsInLiquid(water) + RandomizerSuit.CheckLiquidState(water) end end end @@ -32,7 +32,7 @@ function RandomizerSuit.ResetLiquidState() if scenario == lavaScenarios[i] then for j = 1, 5 do local lava = Game.GetEntity("TG_Lava_" .. string.format("%03d", j)) - RandomizerSuit.IsInLiquid(lava) + RandomizerSuit.CheckLiquidState(lava) end end end @@ -54,8 +54,8 @@ function RandomizerSuit.ResetLiquidState() liquids = {"TG_Damage_Hazardous_001", "TG_Damage_Hazardous_002"} end for i = 1, #liquids do - liquid = Game.GetEntity(liquids[i]) - RandomizerSuit.IsInLiquid(liquid) + local liquid = Game.GetEntity(liquids[i]) + RandomizerSuit.CheckLiquidState(liquid) end end end From 890ad66c830def6e3b8a31e4c2a330cc8b981367 Mon Sep 17 00:00:00 2001 From: dyceron Date: Thu, 23 Jan 2025 00:28:44 -0500 Subject: [PATCH 07/12] Add new code.ips, prevent higher beams from opening lower ones --- .../files/custom/scenario.lua | 35 ++++++++++++++++-- .../files/exefs_patches/code.ips | Bin 31202 -> 32288 bytes .../files/templates/randomizerpowerup.lua | 2 + .../specific_patches/door_patches.py | 7 ++++ .../specific_patches/game_patches.py | 30 ++++++--------- 5 files changed, 53 insertions(+), 21 deletions(-) diff --git a/src/open_samus_returns_rando/files/custom/scenario.lua b/src/open_samus_returns_rando/files/custom/scenario.lua index a501e7be..c2345f9e 100644 --- a/src/open_samus_returns_rando/files/custom/scenario.lua +++ b/src/open_samus_returns_rando/files/custom/scenario.lua @@ -51,6 +51,7 @@ end function Scenario.OnSubAreaChange(old_subarea, old_actorgroup, new_subarea, new_actorgroup, disable_fade) Scenario.UpdateProgressiveItemModels() + Scenario.UpdateBlastShields() Scenario.UpdateRoomName(new_subarea) end @@ -64,9 +65,9 @@ function Scenario.InitGUI() Cosmetics.UpdateGUI() GUILib.InitCustomUI() GUILib.UpdateTotalDNAColor() - Scenario.UpdateDNACounter() RandoApi.CheckSuits() RandoApi.CheckBeams() + Scenario.UpdateDNACounter() if Init.bEnableRoomIds then RoomNameGui.Init() @@ -117,8 +118,10 @@ function Scenario.InitScenario(_ARG_0_, _ARG_1_, _ARG_2_, _ARG_3_) Game.HUDIdleScreenLeave() Scenario.ShowText() end - + Scenario.UpdateProgressiveItemModels() + Scenario.UpdateBlastShields() + if Scenario.showNextSFID ~= nil then Game.DelSFByID(Scenario.showNextSFID) Scenario.showNextSFID = nil @@ -228,10 +231,36 @@ function Scenario.OnPostCreditsEnd() Game.GoToMainMenu() end +Scenario._BlastShieldTypes = { + doorwave = { + item = "ITEM_WEAPON_WAVE_BEAM", + damage = {"WAVE_BEAM"}, + }, + doorspazerbeam = { + item = "ITEM_WEAPON_SPAZER_BEAM", + damage = {"POWER_BEAM"}, + }, +} + +function Scenario._UpdateBlastShields() + for name, actordef in pairs(Game.GetEntities()) do + shield_type = Scenario._BlastShieldTypes[actordef] + if shield_type ~= nil and Game.GetItemAmount(Game.GetPlayerName(), shield_type.item) > 0 then + local shield = Game.GetEntity(name) + for _, damage in ipairs(shield_type.damage) do + shield.LIFE:AddDamageSource(damage) + end + end + end +end + +function Scenario.UpdateBlastShields() + Game.AddSF(0.1, "Scenario._UpdateBlastShields", "") +end + Scenario.QueuedPopups = Scenario.QueuedPopups or Queue() function Scenario.ShowIfNotActive() - if Scenario.hideSFID == nil and Scenario.showNextSFID == nil then Scenario.ShowNextAsyncPopup() end diff --git a/src/open_samus_returns_rando/files/exefs_patches/code.ips b/src/open_samus_returns_rando/files/exefs_patches/code.ips index f3178a9c3f763d23a4348dbbd77a4704d43da91c..6d3241156447c0b1103bc25eb9631770751a9286 100644 GIT binary patch delta 5128 zcmbVQeQ;FO6+idw=7SK(Gv6d3d4vD~LUmA@w6eX}F#9@u*^7n_sUI0E}1 za83LVfiEF&{(lLq7*RC#^nVm+BCn44WM1-kxbn(~qQK$*BIox^`+z(~q}|(XwQJa; z@3w+!w^ac=nlW~h5#c#fdrY45L$4pQ_PlDCq)S_NNbW9Y@6dR0d>n`@!bYBSIh#l` zY=twOdB5jGuYeI&m;pm>V0A3mL|4znVy8eq2e{YpyaE0!ojB?` zb)oG<%}6_pw=hmnw?`}CD(T*622o0;ZkP$09b)7d^t$y93#HJ1g!igF0W%It9590L z@wB9?q`zh{-G~j_;Yd5^YoLFM#rik_z$-%D$8DnmnB4$_OyPWF4HPR_AFj97HfES^ z4K-&cFK#bu`qIr2x4PHbUu;C)gYp7^r{Q6s2ZC{+XErv`WdJ*f@i{yU@S7M9@Eo3G zjCBST$Z_IQ->i-b4;+*!sYQWA#F_w;jIR!SS$be@yuKQ}-BzO?4?^O4^4Ft|)Oel6 z-P{9=;w2FucUiTN<&xmK`${J7-(`4Rha6-Aj?iwa1QR7tJ}~!0FV|8k9O3#|kEfTz zXl)y>hLOR_t=O4_0fQ4 z(ykjGvfBs}%!%?t@f+85TN}vV?s9DOCk6+2A#LIHW=%T`Jvat7EOL$wOiua5)u>C|Y3$ZW+&x|e9*y)CoTivnA~mBTqV^jZk+Jn~3-C;DcMISM;Rf{p~` zbw0bK_n2PnaqA)LyDE?44&(mFn+WRzMEz+f=ArXG8a%F|zGSDCQZW7yV~Tu|02HSX z=adm-G`X*G-{hu}4D=p{GJ(#OjH9$$_N7k`TtcFgQBo?Zfp;tt=(yOy-J-Le`yNUV zE}_##xc}L_$B1xgG6?ZGZ&c_8uAW*G=gTED7qD7lCLzopB^l-|C5E{OVDi;VwB0(Q zwSb~qG@l6c+MBRh=q`X+V}2fsr6_L0{O1J2%*3WlXA^JWja;@p91@(R7q{Aty%foJ zKQir#jU78Y#KQm3p-Mt z^Xxcsl_O3ZKKEpNj@Of%dC!gkTaNgxO@D%0AWEm!%(7{XnG4F7YI6Y5l_ILlTQ*0w zVB(n>Mx;=G)za{A#O_B6|L8n&Zrp*ut&oSZ){XlVt1QVT z>Kw^jNIt5!+LBdrMt0?>9!H8B`ds`7vr+?TynT##R6kH_D_oJo^^=E!iW`Mhw` z;ESL@?Y0I>Pe+J$TDxHXirkb_Ic}#T&2~THu;JlwyYI@^awb$5bc}CCZ|#Lb-O#e1YJ{+$8Rhm+*I^ zEY4dvt_Nxu2s=c_A+HTY9I}aWN8Tgik1{*IO}rrY<^Nb5ljQ}K%Bfblu3(9HQXVg; zV>@HND;nev#@2}%`Oesiz}x6jRPT+hnXe-DA&usqjg(ppQF7Z<#j}P z$tZ5>l)(LNlR6t-sv$bwh&KA8ks zjpH^TWqaWbVvKyHux`Y3Tm&3krz|YW58TMzv)+h|!)yklr#D-?T7ot;&~l=;opxJW z(a88za~WQU#SUfj4T(IFXHAr4$|t2#`AoXBd&N1qL8}z|s6r@WJjo$a3}fMybBpVn^8iTdlHk+`Pa! zxG|cheZVc*zjEwVe%USX?6p4R+XMN#)yZEfd`cbW)6~z9KjfxzD1Z2(;T}Pr)h|^b zM=ouCRG>{yA==>vj``3NM4mLbcNXQ7*C6DxcBGF^5TknaIxacmh#{ROyPzQM&vJu?pug(J8Uw`NkOc^zv&N_4Ey#2N)d0~Rt66Qeg7vM|E}+`3 zwOYS$ln+Oh`Ddxys&vXPf>IAcxeE^S5#7vtpv!0P4Z&!emEbWV?*b*+Kd4tlL4tlPdq>Qp!IHyKc%(S1yEPe)SY(Sx7Fdo~6vVECbc$%EZg^ z1x(h4!hfxPXQVQCOE`S@`y-Xc`Ph+43gZxIBDtU6)XH)yZ2L z<|zYpvZZ07QgWAkzF~!OJ`^6g;gtksus;0y=KW%28O~|JKeo|K(Al6>po5=nqxqoQ zKHWyOpyxsBL7&2WBWM+9JLqD}5B+vwth$=$InZOE&QJE-m$l$rRROKPYaE^XD2Eo0 z&!pM+71QCbXCXp{#rBq1e z{);I~R&83dd9J?!b#(Fm4Mn%EU$tr7+L{L&8o#}2>&Bd{tXO|+ W<%!-`zth|2KVSfcdiweu3;qT5Ei{b) delta 3990 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 L7~J&TRagEOSaL_k diff --git a/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua b/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua index c4021a33..8a46a568 100644 --- a/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua +++ b/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua @@ -59,6 +59,8 @@ function RandomizerPowerup.OnPickedUp(resources, actorOrName, regionName) end Scenario.UpdateProgressiveItemModels() + Scenario.UpdateBlastShields() + if actorOrName ~= nil then RandomizerPowerup.PostCollectionAdjustments(actorOrName) end diff --git a/src/open_samus_returns_rando/specific_patches/door_patches.py b/src/open_samus_returns_rando/specific_patches/door_patches.py index 99fe0ebb..d4f6b87d 100644 --- a/src/open_samus_returns_rando/specific_patches/door_patches.py +++ b/src/open_samus_returns_rando/specific_patches/door_patches.py @@ -220,6 +220,12 @@ def _patch_tiles(editor: PatcherEditor) -> None: door_tile["icon"] = "doorpowerright" +def _patch_beam_door_weaknesses(editor: PatcherEditor) -> None: + # Prevent stronger beams from opening doors for weaker beams with split beams + for door in ["doorwave", "doorspazerbeam"]: + beam_door = editor.get_file(f"actors/props/{door}/charclasses/{door}.bmsad", Bmsad) + beam_door.raw.components.LIFE.functions[0].params.Param1.value = "" + def _static_door_patches(editor: PatcherEditor) -> None: _patch_one_way_doors(editor) @@ -228,6 +234,7 @@ def _static_door_patches(editor: PatcherEditor) -> None: _patch_beam_covers(editor) _patch_charge_doors(editor) _patch_tiles(editor) + _patch_beam_door_weaknesses(editor) class ActorData(Enum): diff --git a/src/open_samus_returns_rando/specific_patches/game_patches.py b/src/open_samus_returns_rando/specific_patches/game_patches.py index a31273f5..95b7e590 100644 --- a/src/open_samus_returns_rando/specific_patches/game_patches.py +++ b/src/open_samus_returns_rando/specific_patches/game_patches.py @@ -21,9 +21,7 @@ def _remove_pb_weaknesses(editor: PatcherEditor, configuration: dict) -> None: # Charge Door if configuration["charge_door_buff"]: for door in ["doorchargecharge", "doorclosedcharge"]: - charge_door = editor.get_file( - f"actors/props/{door}/charclasses/{door}.bmsad", Bmsad - ) + charge_door = editor.get_file(f"actors/props/{door}/charclasses/{door}.bmsad", Bmsad) func = charge_door.raw.components.LIFE.functions[0] if func.params.Param1.value: func.params.Param1.value = "CHARGE_BEAM" @@ -33,18 +31,14 @@ def _remove_pb_weaknesses(editor: PatcherEditor, configuration: dict) -> None: # Beam Doors if configuration["beam_door_buff"]: for door in ["doorwave", "doorspazerbeam", "doorcreature"]: - beam_door = editor.get_file( - f"actors/props/{door}/charclasses/{door}.bmsad", Bmsad - ) - func_wp = beam_door.raw.components.LIFE.functions[1] - func_s = beam_door.raw.components.LIFE.functions[2] - if func_wp.params.Param1.value: - if door == "doorwave": - func_wp.params.Param1.value = "WAVE_BEAM" - else: - func_wp.params.Param1.value = "PLASMA_BEAM" - if func_s.params.Param1.value: - func_s.params.Param1.value = "SPAZER_BEAM" + beam_door = editor.get_file(f"actors/props/{door}/charclasses/{door}.bmsad", Bmsad) + func = beam_door.raw.components.LIFE.functions + if door == "doorwave": + func[1].params.Param1.value = "" + elif door == "doorcreature": + func[1].params.Param1.value = "PLASMA_BEAM" + else: + func[2].params.Param1.value = "" # Blobthrowers/Steel Orbs if configuration["beam_burst_buff"]: @@ -54,9 +48,9 @@ def _remove_pb_weaknesses(editor: PatcherEditor, configuration: dict) -> None: ] for plants in PLANT_FILES: plant = editor.get_file(plants, Bmsad) - plant.raw["components"]["LIFE"]["fields"][ - "bShouldDieWithPowerBomb" - ] = Container({"type": "bool", "value": False}) + plant.raw["components"]["LIFE"]["fields"]["bShouldDieWithPowerBomb"] = Container( + {"type": "bool", "value": False} + ) def _remove_grapple_blocks(editor: PatcherEditor, configuration: dict) -> None: From 8448b97c44a1ac0d05f12dd52d11b869dac66a9e Mon Sep 17 00:00:00 2001 From: dyceron Date: Thu, 23 Jan 2025 18:56:19 -0500 Subject: [PATCH 08/12] Address Review --- ...iworld_integration.py => exefs_patches.py} | 29 ----------------- .../files/custom/randoapi.lua | 6 +++- .../files/custom/scenario.lua | 4 +-- .../files/templates/randomizerpowerup.lua | 4 +-- .../pickups/multiworld_integration.py | 31 +++++++++++++++++++ .../samus_returns_patcher.py | 4 +-- 6 files changed, 41 insertions(+), 37 deletions(-) rename src/open_samus_returns_rando/{multiworld_integration.py => exefs_patches.py} (51%) create mode 100644 src/open_samus_returns_rando/pickups/multiworld_integration.py diff --git a/src/open_samus_returns_rando/multiworld_integration.py b/src/open_samus_returns_rando/exefs_patches.py similarity index 51% rename from src/open_samus_returns_rando/multiworld_integration.py rename to src/open_samus_returns_rando/exefs_patches.py index 8339e6fe..868a747b 100644 --- a/src/open_samus_returns_rando/multiworld_integration.py +++ b/src/open_samus_returns_rando/exefs_patches.py @@ -1,35 +1,6 @@ from pathlib import Path from open_samus_returns_rando.files import files_path -from open_samus_returns_rando.lua_editor import get_parent_for -from open_samus_returns_rando.misc_patches.lua_util import lua_convert - - -def get_lua_for_item(progression: list[list[dict[str, str | int]]], region_name: str) -> str: - generic_pickup = """ - Game.ImportLibrary("actors/items/randomizerpowerup/scripts/randomizerpowerup.lc", false) - MultiworldPickup = MultiworldPickup or {} - function MultiworldPickup.main() - end - - function MultiworldPickup.OnPickedUp(progression, actorOrName, regionName) - RandomizerPowerup.OnPickedUp(progression, actorOrName, regionName) - end - """ - - main_item_id = str(progression[0][0]["item_id"]) - parent = get_parent_for(main_item_id) - if parent == "RandomizerPowerup": - parent_content = generic_pickup - else: - parent_lower = parent.lower() - parent_content = files_path().joinpath("pickups", f"{parent_lower}.lua").read_text() - parent_content = parent_content.replace(parent, "MultiworldPickup") - - progression_as_lua = lua_convert(progression, True) - return (f'{parent_content}\nMultiworldPickup.OnPickedUp({progression_as_lua},nil,{region_name})' - .replace("\n", "\\\n").replace("'", "\\'") - ) def create_exefs_patches( diff --git a/src/open_samus_returns_rando/files/custom/randoapi.lua b/src/open_samus_returns_rando/files/custom/randoapi.lua index b2dca0e7..4e54f82b 100644 --- a/src/open_samus_returns_rando/files/custom/randoapi.lua +++ b/src/open_samus_returns_rando/files/custom/randoapi.lua @@ -1,6 +1,10 @@ Game.ImportLibrary("actors/items/randomizerpowerup/scripts/randomizerpowerup.lc", false) -RandoApi = RandoApi or {} +RandoApi = RandoApi or { + ChangeSuitValues = function(hasVaria, hasGravity) end, + ChangeBeams = function(hasWave, hasSpazer, hasPlasma, dmgSpazer, dmgPlasma, dmgPlasmaWave, dmgPlasmaSpazer) end +} + function RandoApi.main() end diff --git a/src/open_samus_returns_rando/files/custom/scenario.lua b/src/open_samus_returns_rando/files/custom/scenario.lua index c2345f9e..db034a88 100644 --- a/src/open_samus_returns_rando/files/custom/scenario.lua +++ b/src/open_samus_returns_rando/files/custom/scenario.lua @@ -65,8 +65,6 @@ function Scenario.InitGUI() Cosmetics.UpdateGUI() GUILib.InitCustomUI() GUILib.UpdateTotalDNAColor() - RandoApi.CheckSuits() - RandoApi.CheckBeams() Scenario.UpdateDNACounter() if Init.bEnableRoomIds then @@ -119,6 +117,8 @@ function Scenario.InitScenario(_ARG_0_, _ARG_1_, _ARG_2_, _ARG_3_) Scenario.ShowText() end + RandoApi.CheckSuits() + RandoApi.CheckBeams() Scenario.UpdateProgressiveItemModels() Scenario.UpdateBlastShields() diff --git a/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua b/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua index 8a46a568..4f3042ab 100644 --- a/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua +++ b/src/open_samus_returns_rando/files/templates/randomizerpowerup.lua @@ -53,9 +53,7 @@ function RandomizerPowerup.OnPickedUp(resources, actorOrName, regionName) for _, resource in ipairs(granted) do RandomizerPowerup.IncreaseAmmo(resource) - if resource.item_id == "ITEM_WEAPON_WAVE_BEAM" or resource.item_id == "ITEM_WEAPON_SPAZER_BEAM" or resource.item_id == "ITEM_WEAPON_PLASMA_BEAM" then - RandoApi.CheckBeams() - end + RandoApi.CheckBeams() end Scenario.UpdateProgressiveItemModels() diff --git a/src/open_samus_returns_rando/pickups/multiworld_integration.py b/src/open_samus_returns_rando/pickups/multiworld_integration.py new file mode 100644 index 00000000..e742c486 --- /dev/null +++ b/src/open_samus_returns_rando/pickups/multiworld_integration.py @@ -0,0 +1,31 @@ + +from open_samus_returns_rando.files import files_path +from open_samus_returns_rando.lua_editor import get_parent_for +from open_samus_returns_rando.misc_patches.lua_util import lua_convert + + +def get_lua_for_item(progression: list[list[dict[str, str | int]]], region_name: str) -> str: + generic_pickup = """ + Game.ImportLibrary("actors/items/randomizerpowerup/scripts/randomizerpowerup.lc", false) + MultiworldPickup = MultiworldPickup or {} + function MultiworldPickup.main() + end + + function MultiworldPickup.OnPickedUp(progression, actorOrName, regionName) + RandomizerPowerup.OnPickedUp(progression, actorOrName, regionName) + end + """ + + main_item_id = str(progression[0][0]["item_id"]) + parent = get_parent_for(main_item_id) + if parent == "RandomizerPowerup": + parent_content = generic_pickup + else: + parent_lower = parent.lower() + parent_content = files_path().joinpath("pickups", f"{parent_lower}.lua").read_text() + parent_content = parent_content.replace(parent, "MultiworldPickup") + + progression_as_lua = lua_convert(progression, True) + return (f'{parent_content}\nMultiworldPickup.OnPickedUp({progression_as_lua},nil,{region_name})' + .replace("\n", "\\\n").replace("'", "\\'") + ) diff --git a/src/open_samus_returns_rando/samus_returns_patcher.py b/src/open_samus_returns_rando/samus_returns_patcher.py index 6dbdac1a..8075b564 100644 --- a/src/open_samus_returns_rando/samus_returns_patcher.py +++ b/src/open_samus_returns_rando/samus_returns_patcher.py @@ -6,6 +6,7 @@ from mercury_engine_data_structures.file_tree_editor import OutputFormat from open_samus_returns_rando.debug import debug_custom_pickups, debug_spawn_points +from open_samus_returns_rando.exefs_patches import create_exefs_patches from open_samus_returns_rando.files import files_path from open_samus_returns_rando.logger import LOG from open_samus_returns_rando.lua_editor import LuaEditor @@ -17,7 +18,6 @@ from open_samus_returns_rando.misc_patches.final_boss import patch_final_boss from open_samus_returns_rando.misc_patches.spawn_points import patch_custom_spawn_points from open_samus_returns_rando.misc_patches.text_patches import add_spiderboost_status, apply_text_patches -from open_samus_returns_rando.multiworld_integration import create_exefs_patches from open_samus_returns_rando.patcher_editor import PatcherEditor from open_samus_returns_rando.pickups.custom_pickups import patch_custom_pickups from open_samus_returns_rando.pickups.pickup import patch_pickups @@ -153,7 +153,7 @@ def patch_extracted(input_path: Path, output_path: Path, configuration: dict) -> out_code = output_path.joinpath("code.bin") out_exheader = output_path.joinpath("exheader.bin") - # Create Exefs patches for multiworld + # Create Exefs patches for multiworld and other binary modifications LOG.info("Creating exefs patches") create_exefs_patches( out_code, out_exheader, From 593943b471657ca5fc46dcbb22380cbaf17ed9cf Mon Sep 17 00:00:00 2001 From: dyceron <38679103+dyceron@users.noreply.github.com> Date: Fri, 24 Jan 2025 09:00:47 -0500 Subject: [PATCH 09/12] Always patch code.bin regardless if `enable_remote_lua` is enabled --- src/open_samus_returns_rando/exefs_patches.py | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/open_samus_returns_rando/exefs_patches.py b/src/open_samus_returns_rando/exefs_patches.py index 868a747b..5f6be086 100644 --- a/src/open_samus_returns_rando/exefs_patches.py +++ b/src/open_samus_returns_rando/exefs_patches.py @@ -6,16 +6,30 @@ def create_exefs_patches( out_code: Path, out_exheader: Path, input_code: bytes | None, input_exheader: bytes, enabled: bool ) -> None: - if not enabled: - return if input_code is None: raise ValueError("Could not get decompressed + decrypted code binary") import ips # type: ignore + # code.bin modifications + code_ips_path = files_path().joinpath("exefs_patches", "code.ips") + out_code.parent.mkdir(parents=True, exist_ok=True) + with ( + Path.open(code_ips_path, "rb") as code_ips, + Path.open(out_code, "wb") as result + ): + content = code_ips.read() + patch = ips.Patch.load(content) + patch.apply(input_code, result) + # Citra and Luma don't support patching the exheader. User needs to provide it as input and # here the patch is just applied + + # Check if `enable_remote_lua` is enabled + if not enabled: + return + exheader_ips_path = files_path().joinpath("exefs_patches", "exheader.ips") out_exheader.parent.mkdir(parents=True, exist_ok=True) with ( @@ -25,13 +39,3 @@ def create_exefs_patches( content = exheader_ips.read() patch = ips.Patch.load(content) patch.apply(input_exheader, result) - - code_ips_path = files_path().joinpath("exefs_patches", "code.ips") - out_code.parent.mkdir(parents=True, exist_ok=True) - with ( - Path.open(code_ips_path, "rb") as code_ips, - Path.open(out_code, "wb") as result - ): - content = code_ips.read() - patch = ips.Patch.load(content) - patch.apply(input_code, result) From 29ac65b13c303c0d16ea72396271d38c8cb14f6d Mon Sep 17 00:00:00 2001 From: dyceron <38679103+dyceron@users.noreply.github.com> Date: Fri, 24 Jan 2025 09:02:36 -0500 Subject: [PATCH 10/12] Minor touchups --- src/open_samus_returns_rando/exefs_patches.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/open_samus_returns_rando/exefs_patches.py b/src/open_samus_returns_rando/exefs_patches.py index 5f6be086..d7fc6f6d 100644 --- a/src/open_samus_returns_rando/exefs_patches.py +++ b/src/open_samus_returns_rando/exefs_patches.py @@ -6,13 +6,12 @@ def create_exefs_patches( out_code: Path, out_exheader: Path, input_code: bytes | None, input_exheader: bytes, enabled: bool ) -> None: - if input_code is None: raise ValueError("Could not get decompressed + decrypted code binary") import ips # type: ignore - # code.bin modifications + # code.bin patching code_ips_path = files_path().joinpath("exefs_patches", "code.ips") out_code.parent.mkdir(parents=True, exist_ok=True) with ( @@ -30,6 +29,7 @@ def create_exefs_patches( if not enabled: return + # exheader.bin patching exheader_ips_path = files_path().joinpath("exefs_patches", "exheader.ips") out_exheader.parent.mkdir(parents=True, exist_ok=True) with ( From 3062ecf8a5a8c4161ae42fec3348a7911529f97a Mon Sep 17 00:00:00 2001 From: dyceron <38679103+dyceron@users.noreply.github.com> Date: Fri, 24 Jan 2025 13:41:16 -0500 Subject: [PATCH 11/12] Remove remote lua check --- src/open_samus_returns_rando/exefs_patches.py | 11 +++-------- src/open_samus_returns_rando/samus_returns_patcher.py | 1 - 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/open_samus_returns_rando/exefs_patches.py b/src/open_samus_returns_rando/exefs_patches.py index d7fc6f6d..68df6d60 100644 --- a/src/open_samus_returns_rando/exefs_patches.py +++ b/src/open_samus_returns_rando/exefs_patches.py @@ -4,7 +4,7 @@ def create_exefs_patches( - out_code: Path, out_exheader: Path, input_code: bytes | None, input_exheader: bytes, enabled: bool + out_code: Path, out_exheader: Path, input_code: bytes | None, input_exheader: bytes ) -> None: if input_code is None: raise ValueError("Could not get decompressed + decrypted code binary") @@ -21,15 +21,10 @@ def create_exefs_patches( content = code_ips.read() patch = ips.Patch.load(content) patch.apply(input_code, result) - + + # exheader.bin patching # Citra and Luma don't support patching the exheader. User needs to provide it as input and # here the patch is just applied - - # Check if `enable_remote_lua` is enabled - if not enabled: - return - - # exheader.bin patching exheader_ips_path = files_path().joinpath("exefs_patches", "exheader.ips") out_exheader.parent.mkdir(parents=True, exist_ok=True) with ( diff --git a/src/open_samus_returns_rando/samus_returns_patcher.py b/src/open_samus_returns_rando/samus_returns_patcher.py index 8075b564..9cdd5670 100644 --- a/src/open_samus_returns_rando/samus_returns_patcher.py +++ b/src/open_samus_returns_rando/samus_returns_patcher.py @@ -159,7 +159,6 @@ def patch_extracted(input_path: Path, output_path: Path, configuration: dict) -> out_code, out_exheader, parsed_rom.get_code_binary(), parsed_rom.exheader(), - configuration["enable_remote_lua"] ) LOG.info("Saving modified lua scripts") From eb76d64e8166b7e9c28c168bc01acd22736587e2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2025 18:41:33 +0000 Subject: [PATCH 12/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/open_samus_returns_rando/exefs_patches.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/open_samus_returns_rando/exefs_patches.py b/src/open_samus_returns_rando/exefs_patches.py index 68df6d60..4d9466bf 100644 --- a/src/open_samus_returns_rando/exefs_patches.py +++ b/src/open_samus_returns_rando/exefs_patches.py @@ -21,7 +21,7 @@ def create_exefs_patches( content = code_ips.read() patch = ips.Patch.load(content) patch.apply(input_code, result) - + # exheader.bin patching # Citra and Luma don't support patching the exheader. User needs to provide it as input and # here the patch is just applied