From f5a1dadfc68f51502cb184131099396fdebcd1c2 Mon Sep 17 00:00:00 2001 From: IQuant Date: Wed, 18 Jun 2025 20:45:48 +0300 Subject: [PATCH] Parse _biomes_all.xml instead of having a hardcoded list of biome script files to patch, hopefully improving mod compat. --- .vscode/settings.json | 7 +- .../wang_hooks/files_with_spawnhooks.txt | 142 ------------------ .../files/system/wang_hooks/wang_hooks.lua | 47 ++++-- 3 files changed, 38 insertions(+), 158 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 095aab46..c2260240 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,5 +10,10 @@ "wait", "async" ], - "C_Cpp.default.compilerPath": "/usr/bin/clang++" + "C_Cpp.default.compilerPath": "/usr/bin/clang++", + "spellright.language": [], + "spellright.documentTypes": [ + "markdown", + "latex" + ] } \ No newline at end of file diff --git a/quant.ew/files/system/wang_hooks/files_with_spawnhooks.txt b/quant.ew/files/system/wang_hooks/files_with_spawnhooks.txt index 90c4b520..6e87877c 100644 --- a/quant.ew/files/system/wang_hooks/files_with_spawnhooks.txt +++ b/quant.ew/files/system/wang_hooks/files_with_spawnhooks.txt @@ -1,148 +1,6 @@ data/scripts/biome_scripts.lua data/biome_impl/static_tile/watchtower.lua data/biome_impl/static_tile/temples_common.lua -data/scripts/debug_biomes.lua -data/scripts/biomes/lake_deep.lua -data/scripts/biomes/friend_2.lua -data/scripts/biomes/solid_wall_tower.lua -data/scripts/biomes/rock_room.lua -data/scripts/biomes/vault.lua -data/scripts/biomes/town.lua -data/scripts/biomes/snowcastle.lua -data/scripts/biomes/snowcave_petri.lua -data/scripts/biomes/pyramid_left.lua -data/scripts/biomes/dragoncave.lua -data/scripts/biomes/endgame_end.lua -data/scripts/biomes/niilo_testroom_d.lua -data/scripts/biomes/temple_wall.lua -data/scripts/biomes/meatroom.lua -data/scripts/biomes/friend_6.lua -data/scripts/biomes/lake_statue.lua -data/scripts/biomes/sandroom.lua -data/scripts/biomes/temple_altar_right_empty.lua -data/scripts/biomes/robot_egg.lua -data/scripts/biomes/temple_altar_right_snowcave.lua #data/scripts/biomes/moon_room.lua -data/scripts/biomes/tower.lua -data/scripts/biomes/temple_wall_ending.lua -data/scripts/biomes/secret_entrance.lua -data/scripts/biomes/pyramid.lua -data/scripts/biomes/pyramid_right.lua -data/scripts/biomes/temple_altar.lua -data/scripts/biomes/niilo_testroom.lua -data/scripts/biomes/song_room.lua -data/scripts/biomes/lake.lua -data/scripts/biomes/temple_altar_right_snowcastle.lua -data/scripts/biomes/temple_altar_secret.lua -data/scripts/biomes/wizardcave.lua -data/scripts/biomes/snowcastle_cavern.lua -data/scripts/biomes/crypt.lua -data/scripts/biomes/magic_gate.lua -data/scripts/biomes/scale.lua -data/scripts/biomes/roadblock.lua -data/scripts/biomes/wandcave.lua -data/scripts/biomes/excavationsite.lua -data/scripts/biomes/lavalake_racing.lua -data/scripts/biomes/temple_altar_right_snowcave_empty.lua -data/scripts/biomes/coalmine.lua -data/scripts/biomes/temple_altar_empty.lua -data/scripts/biomes/null_room.lua -data/scripts/biomes/ghost_secret.lua -data/scripts/biomes/mountain/mountain_right_2.lua -data/scripts/biomes/mountain/mountain_left.lua -data/scripts/biomes/mountain/mountain_hall_3.lua -data/scripts/biomes/mountain/mountain_left_3.lua -data/scripts/biomes/mountain/mountain_right.lua -data/scripts/biomes/mountain/mountain_hall_4.lua -data/scripts/biomes/mountain/mountain_top.lua -data/scripts/biomes/mountain/mountain_left_2.lua -data/scripts/biomes/mountain/mountain_right_stub.lua -data/scripts/biomes/mountain/mountain_left_entrance.lua -data/scripts/biomes/mountain/mountain_right_entrance.lua -data/scripts/biomes/mountain/mountain_floating_island.lua -data/scripts/biomes/mountain/mountain_right_entrance_2.lua -data/scripts/biomes/mountain/mountain_hall.lua -data/scripts/biomes/mountain/mountain_left_stub.lua -data/scripts/biomes/mountain/trailer/mountain_hall.lua -data/scripts/biomes/mountain/mountain_hall_2.lua -data/scripts/biomes/orbrooms/orbroom_06.lua -data/scripts/biomes/orbrooms/orbroom_08.lua -data/scripts/biomes/orbrooms/orbroom_07.lua -data/scripts/biomes/orbrooms/orbroom_05.lua -data/scripts/biomes/orbrooms/orbroom_01.lua -data/scripts/biomes/orbrooms/orbroom_00.lua -data/scripts/biomes/orbrooms/orbroom_10.lua -data/scripts/biomes/orbrooms/orbroom_04.lua -data/scripts/biomes/orbrooms/orbroom_09.lua -data/scripts/biomes/orbrooms/orbroom_03.lua -data/scripts/biomes/orbrooms/orbroom_11.lua -data/scripts/biomes/orbrooms/orbroom_02.lua -data/scripts/biomes/secret_lab.lua -data/scripts/biomes/vault_entrance.lua -data/scripts/biomes/end_wall.lua -data/scripts/biomes/funroom.lua -data/scripts/biomes/friend_4.lua -data/scripts/biomes/boss_victoryroom.lua -data/scripts/biomes/mountain_lake.lua -data/scripts/biomes/lavalake_pit.lua -data/scripts/biomes/meat.lua -data/scripts/biomes/niilo_testroom_b.lua -data/scripts/biomes/teleroom.lua -data/scripts/biomes/essenceroom.lua -data/scripts/biomes/secret_altar.lua -data/scripts/biomes/friend_5.lua -data/scripts/biomes/friend_3.lua -data/scripts/biomes/rainforest.lua -data/scripts/biomes/excavationsite_cube_chamber.lua #data/scripts/biomes/watercave.lua -data/scripts/biomes/niilo_testroom_c.lua -data/scripts/biomes/rainforest_dark.lua -data/scripts/biomes/lavalake.lua -#data/scripts/biomes/greed_room.lua -data/scripts/biomes/wizardcave_entrance.lua -data/scripts/biomes/hills.lua -data/scripts/biomes/bridge.lua -data/scripts/biomes/fungicave.lua -data/scripts/biomes/solid_wall_hidden_cavern.lua -data/scripts/biomes/smokecave_middle.lua -data/scripts/biomes/ending_placeholder.lua -data/scripts/biomes/temple_altar_left_empty.lua -data/scripts/biomes/pyramid_top.lua -data/scripts/biomes/snowcastle_hourglass_chamber.lua -data/scripts/biomes/roboroom.lua -data/scripts/biomes/vault_frozen.lua -data/scripts/biomes/liquidcave.lua -data/scripts/biomes/mountain_tree.lua -data/scripts/biomes/robobase.lua -data/scripts/biomes/fungiforest.lua -data/scripts/biomes/pyramid_hallway.lua -data/scripts/biomes/boss_arena.lua -data/scripts/biomes/the_end.lua -data/scripts/biomes/pyramid_entrance.lua -data/scripts/biomes/temple_altar_right.lua -data/scripts/biomes/boss_limbs_arena.lua -data/scripts/biomes/boss_arena_top.lua -data/scripts/biomes/essenceroom_air.lua -data/scripts/biomes/winter.lua -data/scripts/biomes/essenceroom_hell.lua -data/scripts/biomes/endgame.lua -data/scripts/biomes/alchemist_secret.lua -data/scripts/biomes/temple_altar_right_snowcastle_empty.lua -data/scripts/biomes/smokecave_right.lua -data/scripts/biomes/shop_room.lua -data/scripts/biomes/laboratory.lua -data/scripts/biomes/essenceroom_alc.lua -#data/scripts/biomes/mystery_teleport.lua -data/scripts/biomes/snowcave_secret_chamber.lua -data/scripts/biomes/gourd_room.lua -data/scripts/biomes/coalmine_alt.lua #data/scripts/biomes/tower_end.lua -data/scripts/biomes/temple_altar_left.lua -data/scripts/biomes/mestari_secret.lua -data/scripts/biomes/ocarina.lua -data/scripts/biomes/gun_room.lua -data/scripts/biomes/desert.lua -data/scripts/biomes/friend_1.lua -data/scripts/biomes/smokecave_left.lua -data/scripts/biomes/snowcave.lua -data/scripts/biomes/sandcave.lua \ No newline at end of file diff --git a/quant.ew/files/system/wang_hooks/wang_hooks.lua b/quant.ew/files/system/wang_hooks/wang_hooks.lua index 6b2f5ea4..cf155dd9 100644 --- a/quant.ew/files/system/wang_hooks/wang_hooks.lua +++ b/quant.ew/files/system/wang_hooks/wang_hooks.lua @@ -1,3 +1,4 @@ +local nxml = dofile_once("mods/quant.ew/files/lib/nxml.lua") local uniq_flags = dofile_once("mods/quant.ew/files/system/uniq_flags/uniq_flags.lua") local rpc = net.new_rpc_namespace() @@ -36,7 +37,7 @@ local function generate_detour_fn(orig_fn_name) return detour_fn end -local function ungenerate_detour_fn(orig_fn_name) +local function generate_dummy_detour_fn(orig_fn_name) local detour_fn_name = detour_name(orig_fn_name) local detour_fn = "\n" @@ -173,33 +174,49 @@ local function patch_file(filename) ModTextFileSetContent(filename, content) end -local function unpatch_file(filename) - --print("Patching", filename) +local function patch_file_dummy_detour(filename) local content = ModTextFileGetContent(filename) - --current_file = filename - -- A textbook example of how to NOT use regular expressions. - --content = string.gsub(content, 'RegisterSpawnFunction[(][ ]?(.-), "(.-)"[ ]?[)]', patch_fn) - --content = content .. "\n" .. 'EW_CURRENT_FILE="' .. filename .. '"\n' - -- .. "dofile_once('mods/quant.ew/files/system/wang_hooks/synced_pixel_scenes.lua')\n" for val in string.gmatch(wang_scripts, "ew_detour_(.-),") do - -- print("Generating detour fn for", val) - content = content .. ungenerate_detour_fn(val) + content = content .. generate_dummy_detour_fn(val) end - -- content = content .. generate_detour_fn("spawn_small_enemies") - -- content = content .. generate_detour_fn("spawn_big_enemies") - -- content = content .. generate_detour_fn("spawn_items") - ModTextFileSetContent(filename, content) end function module.on_late_init() + -- Get list of all files to hook into + print("Entangled: discovering biome scripts. Expect some error messages from nxml.") + local already_found = {} + local ignore = { + ["data/scripts/biomes/moon_room.lua"] = true, + ["data/scripts/biomes/watercave.lua"] = true, + ["data/scripts/biomes/tower_end.lua"] = true, + } + local biomes_to_load = nxml.parse_file("data/biome/_biomes_all.xml") + for biome in biomes_to_load:each_of("Biome") do + local biome_filename = biome.attr.biome_filename + if biome_filename == nil then + goto continue + end + local biome_file = nxml.parse_file(biome_filename) + for topology in biome_file:each_of("Topology") do + local script = topology.attr.lua_script + if script ~= nil and not already_found[script] and not ignore[script] then + -- print("Discovered script", script) + already_found[script] = true + table.insert(module.files_with_spawnhooks, script) + end + end + ::continue:: + end + print("Complete") + for _, filename in ipairs(module.files_with_spawnhooks) do if string.sub(filename, 1, 1) ~= "#" then patch_file(filename) elseif filename ~= "#" then - unpatch_file(string.sub(filename, 2, -1)) + patch_file_dummy_detour(string.sub(filename, 2, -1)) end end end