Files
healer-man/src/assets/game/dungeons/hoto/mechanics-audit.json
T
2026-08-14 15:56:39 -04:00

1131 lines
24 KiB
JSON

{
"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
}
}