{ "schemaVersion": 1, "dungeonId": "forsaken-abbey", "zoneId": 102, "status": "review-required", "source": { "populationRecipe": "scripts/runewaker-pipeline/recipes/forsaken-abbey-population.json", "snapshot": "scripts/runewaker-pipeline/snapshots/forsaken-abbey-zone-102.json", "snapshotContentSha256": "13ef6edd3df6e71389aa92d01201889148c0794cf9ecaafdbaf90d3145d2bf7b", "dungeonConfig": "../rom-pvt-server-backups/Runewaker/Tools/dungeon_config.json", "dungeonConfigId": "forsaken_abbey" }, "configuredBossTemplateIds": [ 100071, 100074, 100567 ], "configuredBossPositions": { "100071": { "name": "Boss1", "x": 0, "y": 0, "z": 0, "kx": 0, "ky": 0, "kz": 0, "autoplot": "LuaI_FA_Loc1", "zone_spawn": true, "px": 0, "py": 0, "pz": 0, "pdir": 0 }, "100074": { "name": "Ankaria", "x": 0, "y": 0, "z": 0, "kx": 0, "ky": 0, "kz": 0, "autoplot": "LuaI_FA_Loc2", "zone_spawn": true, "px": 0, "py": 0, "pz": 0, "pdir": 0 }, "100567": { "name": "Boss3", "x": 0, "y": 0, "z": 0, "kx": 0, "ky": 0, "kz": 0, "autoplot": "LuaI_FA_Loc3", "zone_spawn": true, "px": 0, "py": 0, "pz": 0, "pdir": 0 } }, "bossRows": [ { "spawnId": 7379, "templateId": 100070, "name": "Necromage", "sourcePosition": [ 2480.133056640625, 148.1143035888672, 3765.718017578125 ], "autoPlot": "LuaI_100_B2Keeper", "plotClassName": null }, { "spawnId": 7384, "templateId": 100070, "name": "Necromage", "sourcePosition": [ 1500.166015625, 315.57440185546875, 3215.034912109375 ], "autoPlot": "LuaI_100_B2Keeper", "plotClassName": null }, { "spawnId": 7425, "templateId": 100070, "name": "Necromage", "sourcePosition": [ 2979, 122.4717025756836, 2704.009033203125 ], "autoPlot": "LuaI_100_B2Keeper", "plotClassName": null }, { "spawnId": 7426, "templateId": 100070, "name": "Necromage", "sourcePosition": [ 2508.112060546875, 124.79119873046875, 2892.949951171875 ], "autoPlot": "LuaI_100_B2Keeper", "plotClassName": null }, { "spawnId": 7472, "templateId": 100561, "name": "Flowing Chaos", "sourcePosition": [ 4208.9990234375, 132.5791015625, 2223 ], "autoPlot": "LuaI_100_BOSS1", "plotClassName": null }, { "spawnId": 7755, "templateId": 100562, "name": "Cruel Eater", "sourcePosition": [ 4479.166015625, 119.17400360107422, 2919.51611328125 ], "autoPlot": "LuaI_100_BOSS2", "plotClassName": null }, { "spawnId": 7844, "templateId": 100563, "name": "Hollow Shell", "sourcePosition": [ 4451.60595703125, 119.17400360107422, 3651.138916015625 ], "autoPlot": "LuaI_100_BOSS3", "plotClassName": null }, { "spawnId": 7854, "templateId": 100074, "name": "Demon Witch Ancalon", "sourcePosition": [ 5300, 127.70189666748047, 3278 ], "autoPlot": "AI_ANKARIA", "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 } }, { "file": "00571.lua", "exists": true, "sha256": "110efc48ad7a915ca76d269ec577a56c0e9e7b2edced0f146720a446aba33cf7", "functions": [ "LuaP_CastBersark", "LuaI_Follow_A", "LuaI_Follow_B", "LuaI_Follow_C", "LuaI_Follow_A_0", "LuaI_Follow_A_1" ], "referencedIds": [ 100393, 100653, 124245, 124261, 124277, 124293, 124309, 124325, 124351, 124367, 124383, 124399, 124415, 124431, 124447, 124463, 124479, 124495, 124511, 124527, 124543, 124559, 124792, 124793, 124794, 124795, 124796, 124797, 124798, 124799, 124800, 124801, 124802, 124803, 124804, 124805, 124806, 124807, 124808, 124809, 124810, 124811, 780014, 780068, 780069 ], "signalCounts": { "summon": 2, "door": 0, "timer": 6, "movement": 4, "spell": 2, "death": 0, "phase": 0, "interaction": 0, "loot": 0 } }, { "file": "00383.lua", "exists": true, "sha256": "ac2d0de936808482223f3a8f93ddac844b75a04134aa76557e0110a55f3b5e7e", "functions": [ "LuaI_B3Door_Zone2A_0", "LuaI_100_B2Keeper", "LuaI_B2Keeper_Dead", "LuaI_B3Door_Zone2A_1", "LuaI_B2BOSS_Dead", "LuaI_B3Door_Zone2A_2" ], "referencedIds": [ 100073, 124822, 124823, 124824, 124825, 124826, 124827, 124828, 124829, 124830, 124831, 124832, 124833, 124834, 124835, 124836, 124837, 124838, 124839, 124840, 124841, 780022 ], "signalCounts": { "summon": 0, "door": 13, "timer": 2, "movement": 0, "spell": 1, "death": 4, "phase": 5, "interaction": 0, "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() )" }, { "file": "00571.lua", "line": 1, "kinds": [ "spell" ], "text": "function LuaP_CastBersark()" }, { "file": "00571.lua", "line": 2, "kinds": [ "movement" ], "text": "MoveToFlagEnabled( OwnerID(), false );" }, { "file": "00571.lua", "line": 3, "kinds": [ "timer" ], "text": "sleep( 30 )" }, { "file": "00571.lua", "line": 4, "kinds": [ "spell" ], "text": "CastSpell( OwnerID() , OwnerID() , 491028 )" }, { "file": "00571.lua", "line": 5, "kinds": [ "timer" ], "text": "sleep( 10 )" }, { "file": "00571.lua", "line": 6, "kinds": [ "movement" ], "text": "MoveToFlagEnabled( OwnerID(), true );" }, { "file": "00571.lua", "line": 18, "kinds": [ "timer" ], "text": "sleep(20)" }, { "file": "00571.lua", "line": 32, "kinds": [ "timer" ], "text": "sleep(20)" }, { "file": "00571.lua", "line": 46, "kinds": [ "timer" ], "text": "sleep(20)" }, { "file": "00571.lua", "line": 60, "kinds": [ "movement" ], "text": "DW_MoveToFlag( OwnerID(), Flag , FlagNum , 10,1 )" }, { "file": "00571.lua", "line": 74, "kinds": [ "movement" ], "text": "DW_MoveToFlag( OwnerID(), Flag , FlagNum , 10,1 )" }, { "file": "00571.lua", "line": 118, "kinds": [ "summon" ], "text": "ObjMatrix[1] = LuaFunc_CreateNPCByMatrix(mobs.ghoul, Matrix,1,-1)" }, { "file": "00571.lua", "line": 119, "kinds": [ "summon" ], "text": "ObjMatrix[2] = LuaFunc_CreateNPCByMatrix(mobs.spider,Matrix,1,1)" }, { "file": "00571.lua", "line": 123, "kinds": [ "timer" ], "text": "sleep(20)" }, { "file": "00383.lua", "line": 1, "kinds": [ "door" ], "text": "function LuaI_B3Door_Zone2A_0() --�]�w������l�@���A�P�ɭ��m�����ܼ�" }, { "file": "00383.lua", "line": 4, "kinds": [ "door" ], "text": "Ver_Zone100_B3_Door[RoomID] = {}" }, { "file": "00383.lua", "line": 5, "kinds": [ "door" ], "text": "Ver_Zone100_B3_Door[RoomID][\"Door\"] = OwnerID() --�ǻ��ۤv��ID" }, { "file": "00383.lua", "line": 6, "kinds": [ "door", "phase" ], "text": "Ver_Zone100_B3_Door[RoomID][\"State\"] = 0 --�N�ˬd�Ϊ��ܼ��k�s" }, { "file": "00383.lua", "line": 11, "kinds": [ "death" ], "text": "SetPlot( OwnerID() ,\"dead\" , \"LuaI_B2Keeper_Dead\" , 40 )" }, { "file": "00383.lua", "line": 14, "kinds": [ "death" ], "text": "function LuaI_B2Keeper_Dead() --���w�k�v�b���`�ɷ|�ˬd��L���w�k�v���F�X�ӡA���F�|��(�[�ۤv)�NIJ�o�۳�����J" }, { "file": "00383.lua", "line": 17, "kinds": [ "door" ], "text": "local Door = Ver_Zone100_B3_Door[RoomID][\"Door\"]" }, { "file": "00383.lua", "line": 18, "kinds": [ "door", "phase" ], "text": "local Check = Ver_Zone100_B3_Door[RoomID][\"State\"]" }, { "file": "00383.lua", "line": 20, "kinds": [ "door", "phase" ], "text": "Ver_Zone100_B3_Door[RoomID][\"State\"] = Check" }, { "file": "00383.lua", "line": 23, "kinds": [ "door", "phase" ], "text": "Ver_Zone100_B3_Door[RoomID][\"State\"] = Check" }, { "file": "00383.lua", "line": 30, "kinds": [ "door" ], "text": "BeginPlot( Door , \"LuaI_B3Door_Zone2A_1\" , 0 )" }, { "file": "00383.lua", "line": 48, "kinds": [ "door" ], "text": "function LuaI_B3Door_Zone2A_1() --���ͷ����J���@��" }, { "file": "00383.lua", "line": 55, "kinds": [ "death" ], "text": "SetPlot( Tollker , \"dead\" , \"LuaI_B2BOSS_Dead\" , 40 ) -- �]�w���`�@��" }, { "file": "00383.lua", "line": 57, "kinds": [ "spell" ], "text": "CastSpell( Tollker , Tollker , 490101 )" }, { "file": "00383.lua", "line": 62, "kinds": [ "death" ], "text": "function LuaI_B2BOSS_Dead() --�����J�����ɭԶ}�Ҫ�" }, { "file": "00383.lua", "line": 68, "kinds": [ "door" ], "text": "local Door = Ver_Zone100_B3_Door[RoomID][\"Door\"]" }, { "file": "00383.lua", "line": 69, "kinds": [ "door", "timer" ], "text": "BeginPlot( Door , \"LuaI_B3Door_Zone2A_2\" , 0 ) -- �]���}�Ұʧ@�ݭnSleep�A�����b���`�@���A�G�ΩI�s��" }, { "file": "00383.lua", "line": 73, "kinds": [ "door" ], "text": "function LuaI_B3Door_Zone2A_2() --��������}�Ҫ��ʧ@" }, { "file": "00383.lua", "line": 74, "kinds": [ "phase" ], "text": "PlayMotionEX( OwnerID(), ruFUSION_ACTORSTATE_ACTIVATE_BEGIN,ruFUSION_ACTORSTATE_ACTIVATE_LOOP )" }, { "file": "00383.lua", "line": 75, "kinds": [ "timer" ], "text": "sleep( 40 )" } ], "templateCandidates": [ { "templateId": 100070, "name": "Necromage", "classification": "boss", "spawnCount": 4, "autoPlots": [ "LuaI_100_B2Keeper" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100071, "name": "Zombie", "classification": "combat", "spawnCount": 35, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100072, "name": "Ghoul", "classification": "combat", "spawnCount": 20, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100074, "name": "Demon Witch Ancalon", "classification": "boss", "spawnCount": 1, "autoPlots": [ "AI_ANKARIA" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100104, "name": "Carrion Spider", "classification": "combat", "spawnCount": 12, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100109, "name": "Obsessive Shadow", "classification": "combat", "spawnCount": 29, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100194, "name": "Ooze", "classification": "combat", "spawnCount": 9, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100198, "name": "Ooze", "classification": "combat", "spawnCount": 8, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100202, "name": "Zombie", "classification": "combat", "spawnCount": 1, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100392, "name": "Dark Nightsound Bat", "classification": "combat", "spawnCount": 14, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100393, "name": "Carrion Spider", "classification": "combat", "spawnCount": 11, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100561, "name": "Flowing Chaos", "classification": "boss", "spawnCount": 1, "autoPlots": [ "LuaI_100_BOSS1" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100562, "name": "Cruel Eater", "classification": "boss", "spawnCount": 1, "autoPlots": [ "LuaI_100_BOSS2" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100563, "name": "Hollow Shell", "classification": "boss", "spawnCount": 1, "autoPlots": [ "LuaI_100_BOSS3" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100567, "name": "Treasure Chest", "classification": "deferred-object", "spawnCount": 2, "autoPlots": [ "Zone100_Treasure_Init" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 100614, "name": "Follower", "classification": "combat", "spawnCount": 3, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 110201, "name": "Document Pile", "classification": "deferred-object", "spawnCount": 1, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 110202, "name": "Chris", "classification": "deferred-object", "spawnCount": 1, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 110206, "name": "Spirit Binding Pearl", "classification": "deferred-object", "spawnCount": 1, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 110208, "name": "Luanne", "classification": "deferred-object", "spawnCount": 1, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 110209, "name": "Zombie Junk", "classification": "deferred-object", "spawnCount": 11, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 110426, "name": "Follower Script Trigger", "classification": "deferred-object", "spawnCount": 3, "autoPlots": [ "LuaI_Follow_A", "LuaI_Follow_B", "LuaI_Follow_C" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 110478, "name": "Boss Door Trigger", "classification": "deferred-object", "spawnCount": 1, "autoPlots": [ "LuaI_B3Door_Zone2A_0" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 110562, "name": "Sealed Door", "classification": "deferred-object", "spawnCount": 1, "autoPlots": [ "LuaI_BossDoor_Zone2A" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 110578, "name": "Transport Trigger", "classification": "deferred-object", "spawnCount": 2, "autoPlots": [ "LuaI_TransPort_Zone2A" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 112799, "name": "Ancient Fossil", "classification": "deferred-object", "spawnCount": 7, "autoPlots": [ "Lua_Haoplaymusic_00" ], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 780014, "name": "Scripted Prop 780014", "classification": "deferred-object", "spawnCount": 17, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 780022, "name": "Scripted Prop 780022", "classification": "deferred-object", "spawnCount": 3, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 780067, "name": "Scripted Prop 780067", "classification": "deferred-object", "spawnCount": 14, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 780068, "name": "Scripted Prop 780068", "classification": "deferred-object", "spawnCount": 17, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] }, { "templateId": 780069, "name": "Scripted Prop 780069", "classification": "deferred-object", "spawnCount": 19, "autoPlots": [], "plotClassNames": [], "templateScripts": [], "spells": [] } ], "categories": { "summon": 3, "door": 15, "timer": 10, "movement": 4, "spell": 3, "death": 4, "phase": 5, "interaction": 28, "loot": 1 }, "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 } }