{ "schemaVersion": 1, "dungeonId": "hoto", "zoneId": 115, "status": "review-required", "source": { "populationRecipe": "scripts/runewaker-pipeline/recipes/hoto-population.json", "snapshot": "scripts/runewaker-pipeline/snapshots/hoto-zone-115.json", "snapshotContentSha256": "9ccae313cc75da8347ad18684a021fe651316cff6faf9418be4af05b619fa984", "dungeonConfig": "../rom-pvt-server-backups/Runewaker/Tools/dungeon_config.json", "dungeonConfigId": "hoto" }, "configuredBossTemplateIds": [ 102021, 102040, 102041, 102046, 102063 ], "configuredBossPositions": { "102021": { "name": "Jiasha", "autoplot": "LuaI_DQ_Loc5", "zone_spawn": true, "x": 0, "y": 0, "z": 0, "kx": 5531.47, "ky": 270.39, "kz": 1980.79, "px": 0, "py": 0, "pz": 0, "pdir": 0 }, "102040": { "name": "Medusa", "autoplot": "LuaI_DQ_Loc5", "zone_spawn": true, "x": 0, "y": 0, "z": 0, "kx": 4169.99, "ky": 597.26, "kz": 2808.51, "px": 0, "py": 0, "pz": 0, "pdir": 0 }, "102041": { "name": "Teeth of the Reef", "autoplot": "LuaI_DQ_Loc5", "zone_spawn": true, "x": 0, "y": 0, "z": 0, "kx": 6136.47, "ky": 229.17, "kz": 2819.32, "px": 0, "py": 0, "pz": 0, "pdir": 0 }, "102046": { "name": "Bloodthirsty Claw", "autoplot": "LuaI_DQ_Loc5", "zone_spawn": true, "x": 0, "y": 0, "z": 0, "kx": 4763.9, "ky": 507.66, "kz": 3430.26, "px": 0, "py": 0, "pz": 0, "pdir": 0 }, "102063": { "name": "Geba", "autoplot": "LuaI_DQ_Loc5", "zone_spawn": true, "x": 0, "y": 0, "z": 0, "kx": 3116.21, "ky": 450.54, "kz": 1277.8, "px": 0, "py": 0, "pz": 0, "pdir": 0 } }, "bossRows": [ { "spawnId": 5979022, "templateId": 102021, "name": "Jiasha", "sourcePosition": [ 5385, 269.7370910644531, 2065 ], "autoPlot": "LuaI_102038", "plotClassName": null }, { "spawnId": 5979036, "templateId": 102046, "name": "Bloodthirsty Claw", "sourcePosition": [ 5145.546875, 518.6312866210938, 3403.4150390625 ], "autoPlot": null, "plotClassName": null }, { "spawnId": 5979062, "templateId": 102040, "name": "Medusa", "sourcePosition": [ 4039.903076171875, 600.7479858398438, 2834.22607421875 ], "autoPlot": "LuaS_102040_10", "plotClassName": null }, { "spawnId": 5979747, "templateId": 102041, "name": "Teeth of the Reef", "sourcePosition": [ 5909.40185546875, 226.63409423828125, 2825.60693359375 ], "autoPlot": null, "plotClassName": null }, { "spawnId": 5979861, "templateId": 102063, "name": "Geba", "sourcePosition": [ 2663, 447.2875061035156, 1482 ], "autoPlot": null, "plotClassName": null } ], "luaSources": [ { "file": "03242.lua", "exists": true, "sha256": "2a1e6b9bdef254501d69717cae35b41b93960865a530e232dc02751eb8d62563", "functions": [ "LuaI_DQ_Sister", "DQ_Sister_Touch", "LuaS_DungeonQueueNPC", "DQ_EnterBossRush", "DQ_BossRushEnter", "DQ_ShowGroupSelect", "DQ_PickSolo", "DQ_PickDuo", "DQ_PickParty", "DQ_ShowLevelSelect", "DQ_PickLv1", "DQ_PickLv5", "DQ_PickLv10", "DQ_PickLv20", "DQ_PickLv30", "DQ_PickLv40", "DQ_PickLv50", "DQ_EnterDungeon", "DQ_Cancel" ], "referencedIds": [], "signalCounts": { "summon": 1, "door": 0, "timer": 2, "movement": 0, "spell": 0, "death": 0, "phase": 0, "interaction": 28, "loot": 0 } } ], "luaSignals": [ { "file": "03242.lua", "line": 42, "kinds": [ "interaction" ], "text": "CallSpeakLua( TargetID(), OwnerID(), \"LuaS_DungeonQueueNPC\" )" }, { "file": "03242.lua", "line": 46, "kinds": [ "interaction" ], "text": "SetSpeakDetail( OwnerID(), \"I can take you to the Forsaken Abbey.\" )" }, { "file": "03242.lua", "line": 47, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Enter the dungeon\", \"DQ_ShowGroupSelect\", 0 )" }, { "file": "03242.lua", "line": 48, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Boss Rush (Solo Lv1)\", \"DQ_EnterBossRush\", 0 )" }, { "file": "03242.lua", "line": 49, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Nevermind\", \"DQ_Cancel\", 0 )" }, { "file": "03242.lua", "line": 60, "kinds": [ "interaction" ], "text": "CloseSpeak( OwnerID() )" }, { "file": "03242.lua", "line": 67, "kinds": [ "timer" ], "text": "sleep( 5 )" }, { "file": "03242.lua", "line": 76, "kinds": [ "interaction" ], "text": "SetSpeakDetail( OwnerID()," }, { "file": "03242.lua", "line": 81, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Solo (1 player)\", \"DQ_PickSolo\", 0 )" }, { "file": "03242.lua", "line": 82, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Duo (2 players)\", \"DQ_PickDuo\", 0 )" }, { "file": "03242.lua", "line": 83, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Party (6 players)\", \"DQ_PickParty\", 0 )" }, { "file": "03242.lua", "line": 84, "kinds": [ "summon", "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Back\", \"LuaS_DungeonQueueNPC\", 0 )" }, { "file": "03242.lua", "line": 106, "kinds": [ "interaction" ], "text": "SetSpeakDetail( OwnerID(), \"Choose a level bracket:\" )" }, { "file": "03242.lua", "line": 107, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Level 1\", \"DQ_PickLv1\", 0 )" }, { "file": "03242.lua", "line": 108, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Level 5\", \"DQ_PickLv5\", 0 )" }, { "file": "03242.lua", "line": 109, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Level 10\", \"DQ_PickLv10\", 0 )" }, { "file": "03242.lua", "line": 110, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Level 20\", \"DQ_PickLv20\", 0 )" }, { "file": "03242.lua", "line": 111, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Level 30\", \"DQ_PickLv30\", 0 )" }, { "file": "03242.lua", "line": 112, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Level 40\", \"DQ_PickLv40\", 0 )" }, { "file": "03242.lua", "line": 113, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Level 50\", \"DQ_PickLv50\", 0 )" }, { "file": "03242.lua", "line": 114, "kinds": [ "interaction" ], "text": "AddSpeakOption( OwnerID(), TargetID(), \"Back\", \"DQ_ShowGroupSelect\", 0 )" }, { "file": "03242.lua", "line": 119, "kinds": [ "interaction" ], "text": "CloseSpeak( OwnerID() )" }, { "file": "03242.lua", "line": 125, "kinds": [ "interaction" ], "text": "CloseSpeak( OwnerID() )" }, { "file": "03242.lua", "line": 131, "kinds": [ "interaction" ], "text": "CloseSpeak( OwnerID() )" }, { "file": "03242.lua", "line": 137, "kinds": [ "interaction" ], "text": "CloseSpeak( OwnerID() )" }, { "file": "03242.lua", "line": 143, "kinds": [ "interaction" ], "text": "CloseSpeak( OwnerID() )" }, { "file": "03242.lua", "line": 149, "kinds": [ "interaction" ], "text": "CloseSpeak( OwnerID() )" }, { "file": "03242.lua", "line": 155, "kinds": [ "interaction" ], "text": "CloseSpeak( OwnerID() )" }, { "file": "03242.lua", "line": 169, "kinds": [ "timer" ], "text": "sleep( 5 )" }, { "file": "03242.lua", "line": 174, "kinds": [ "interaction" ], "text": "CloseSpeak( OwnerID() )" } ], "templateCandidates": [ { "templateId": 102021, "name": "Jiasha", "classification": "boss", "spawnCount": 1, "autoPlots": [ "LuaI_102038" ], "plotClassNames": [], "templateScripts": [ { "event": "init", "script": "LuaI_102021" }, { "event": "onDead", "script": "lua_star_BossKilledCount(102021)" } ], "spells": [ { "id": 493307, "level": 800 }, { "id": 493308, "level": 4 } ] }, { "templateId": 102024, "name": "Ayam Guard", "classification": "combat", "spawnCount": 14, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493195, "level": 6 }, { "id": 493202, "level": 0 } ] }, { "templateId": 102025, "name": "Ayam Fish Trainer", "classification": "combat", "spawnCount": 15, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493108, "level": 1 }, { "id": 493111, "level": 10 }, { "id": 493205, "level": 6 } ] }, { "templateId": 102026, "name": "Ayam Sea Incanter", "classification": "combat", "spawnCount": 13, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493192, "level": 900 }, { "id": 493196, "level": 1200 } ] }, { "templateId": 102027, "name": "Ayam Sea Mage", "classification": "combat", "spawnCount": 16, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493192, "level": 900 }, { "id": 493197, "level": 1200 } ] }, { "templateId": 102028, "name": "Ayam Defender", "classification": "combat", "spawnCount": 32, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493191, "level": 10 }, { "id": 493201, "level": 10 }, { "id": 493202, "level": 10 } ] }, { "templateId": 102029, "name": "Ayam Warrior", "classification": "combat", "spawnCount": 12, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493198, "level": 10 }, { "id": 493202, "level": 10 } ] }, { "templateId": 102030, "name": "Ayam Archpriest", "classification": "combat", "spawnCount": 24, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493193, "level": 10 }, { "id": 493194, "level": 10 }, { "id": 493206, "level": 799 } ] }, { "templateId": 102031, "name": "Ayam Sound Shell Guardian", "classification": "combat", "spawnCount": 8, "autoPlots": [], "plotClassNames": [], "templateScripts": [ { "event": "init", "script": "Lua_apon_addoil_1" } ], "spells": [ { "id": 492724, "level": 10 }, { "id": 493191, "level": 10 }, { "id": 493201, "level": 10 } ] }, { "templateId": 102032, "name": "Ayam Sound Shell Fighter", "classification": "combat", "spawnCount": 7, "autoPlots": [], "plotClassNames": [], "templateScripts": [ { "event": "init", "script": "Lua_apon_addoil_2" } ], "spells": [ { "id": 493195, "level": 10 }, { "id": 493201, "level": 10 }, { "id": 493202, "level": 10 } ] }, { "templateId": 102033, "name": "Deep Sea Vermin", "classification": "combat", "spawnCount": 25, "autoPlots": [], "plotClassNames": [], "templateScripts": [ { "event": "init", "script": "Lua_apon_bomb_1" } ], "spells": [] }, { "templateId": 102034, "name": "Tame Ray", "classification": "combat", "spawnCount": 6, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493217, "level": 5 }, { "id": 493218, "level": 5 } ] }, { "templateId": 102035, "name": "Tame Tiger Ray", "classification": "combat", "spawnCount": 17, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493223, "level": 10 }, { "id": 493224, "level": 10 } ] }, { "templateId": 102036, "name": "Medusa's Servant", "classification": "combat", "spawnCount": 17, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493195, "level": 10 }, { "id": 493205, "level": 5 }, { "id": 493306, "level": 0 } ] }, { "templateId": 102037, "name": "Medusa's Maid", "classification": "combat", "spawnCount": 10, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493206, "level": 899 }, { "id": 493226, "level": 12 }, { "id": 493227, "level": 1200 } ] }, { "templateId": 102040, "name": "Medusa", "classification": "boss", "spawnCount": 1, "autoPlots": [ "LuaS_102040_10" ], "plotClassNames": [], "templateScripts": [ { "event": "onDead", "script": "lua_star_BossKilledCount(102040)" } ], "spells": [] }, { "templateId": 102041, "name": "Teeth of the Reef", "classification": "boss", "spawnCount": 1, "autoPlots": [], "plotClassNames": [], "templateScripts": [ { "event": "init", "script": "LuaI_102041_AI" }, { "event": "onDead", "script": "lua_star_BossKilledCount(102041)" } ], "spells": [ { "id": 493231, "level": 1 } ] }, { "templateId": 102042, "name": "Template 102042", "classification": "combat", "spawnCount": 9, "autoPlots": [ "Lua_cang_seapat_1_matrix" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 102043, "name": "Little Tame Ray", "classification": "combat", "spawnCount": 13, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493218, "level": 5 } ] }, { "templateId": 102044, "name": "Ayam Assassin", "classification": "combat", "spawnCount": 19, "autoPlots": [], "plotClassNames": [], "templateScripts": [ { "event": "init", "script": "lua_star_stealth_mob" } ], "spells": [ { "id": 492864, "level": 8 }, { "id": 492865, "level": 0 }, { "id": 493202, "level": 10 } ] }, { "templateId": 102046, "name": "Bloodthirsty Claw", "classification": "boss", "spawnCount": 1, "autoPlots": [], "plotClassNames": [], "templateScripts": [ { "event": "init", "script": "Lua_apon_attackfish_2" }, { "event": "onDead", "script": "lua_star_BossKilledCount(102046)" } ], "spells": [ { "id": 493237, "level": 20 }, { "id": 493239, "level": 14 } ] }, { "templateId": 102063, "name": "Geba", "classification": "boss", "spawnCount": 1, "autoPlots": [], "plotClassNames": [], "templateScripts": [ { "event": "init", "script": "Lua_AP_OceanBoss_4" }, { "event": "onDead", "script": "lua_star_BossKilledCount(102063)" } ], "spells": [] }, { "templateId": 102064, "name": "Tiktaalik War Drum", "classification": "deferred-object", "spawnCount": 11, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 102067, "name": "Ayam Rookie", "classification": "combat", "spawnCount": 22, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 102109, "name": "Ayam War Drum Priest", "classification": "combat", "spawnCount": 11, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [ { "id": 493193, "level": 10 }, { "id": 493194, "level": 10 } ] }, { "templateId": 102680, "name": "Template 102680", "classification": "deferred-object", "spawnCount": 13, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 103518, "name": "Template 103518", "classification": "combat", "spawnCount": 10, "autoPlots": [ "Lua_cang_seapat_2_matrix" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 103519, "name": "Template 103519", "classification": "combat", "spawnCount": 2, "autoPlots": [ "Lua_cang_seapat_3_matrix" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 110578, "name": "Template 110578", "classification": "deferred-object", "spawnCount": 6, "autoPlots": [ "LuaS_115toZone7_0" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 110987, "name": "Template 110987", "classification": "deferred-object", "spawnCount": 1, "autoPlots": [ "LuaS_Zone7to115_2" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 111378, "name": "Template 111378", "classification": "deferred-object", "spawnCount": 1, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 112224, "name": "Template 112224", "classification": "deferred-object", "spawnCount": 1, "autoPlots": [ "LuaS_115toZone7_0" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 113003, "name": "Sequitee", "classification": "deferred-object", "spawnCount": 1, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 780088, "name": "Template 780088", "classification": "deferred-object", "spawnCount": 15, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 780360, "name": "Template 780360", "classification": "deferred-object", "spawnCount": 9, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 780361, "name": "Template 780361", "classification": "deferred-object", "spawnCount": 12, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 780362, "name": "Template 780362", "classification": "deferred-object", "spawnCount": 11, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 780363, "name": "Template 780363", "classification": "deferred-object", "spawnCount": 11, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 780444, "name": "Template 780444", "classification": "deferred-object", "spawnCount": 2, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] } ], "categories": { "summon": 1, "door": 0, "timer": 2, "movement": 0, "spell": 5, "death": 0, "phase": 0, "interaction": 28, "loot": 0 }, "reviewQueue": [ "Map authoritative spell ids/scripts to HealerMan EnemyAttackDefinition data.", "Implement and test doors/gates as encounter state, not static combat entities.", "Map summons and waves only after identifying their trigger, lifetime, and reset rules.", "Convert patrol/AutoPlot routes to navmesh-projected paths.", "Separate interactables/loot from combat population and define offline state transitions.", "Add encounter-specific tests and a browser playtest before marking mechanics green." ], "safety": { "executableMechanicsGenerated": false, "reason": "Lua/AutoPlot syntax is audited as evidence; ambiguous behavior is never silently guessed.", "runtimeSqlDependency": false } }