Selaa lähdekoodia

Initial release of nif_dun quests (#7349)

* Added mobs db, mobs spawn and quests related to nif_dun01 and nif_dun02
* Some data after rebalance is missing but the base is there

Thanks to @aleos89 @Lemongrass3110 @Pokye @OptimusM @Tokeiburu for the reviews !
Atemo 2 vuotta sitten
vanhempi
commit
19bbd82c55

+ 441 - 19
db/re/mob_db.yml

@@ -97145,25 +97145,447 @@ Body:
       - Item: R001_Bestia_Card
         Rate: 1
         StealProtected: true
-#  - Id: 20935
-#    AegisName: GAN_CEANN
-#  - Id: 20936
-#    AegisName: DISGUISER
-#  - Id: 20937
-#    AegisName: BRUTAL_MURDERER
-#  - Id: 20938
-#    AegisName: GHOST_CUBE
-#  - Id: 20939
-#    AegisName: LUDE_GAL
-#  - Id: 20940
-#    AegisName: BLUEMOON_LOLI_RURI
-#  - Id: 20941
-#    AegisName: GROTE
-#  - Id: 20942
-#    AegisName: PIERROTZOIST
-#  - Id: 20943
-#    AegisName: DEATH_WITCH
-#    DamageTaken: 10
+  - Id: 20935
+    AegisName: GAN_CEANN
+    Name: Gan Ceann
+    Level: 215
+    Hp: 11785610
+    BaseExp: 267854
+    JobExp: 188128
+    Attack: 7951
+    Attack2: 922
+    Defense: 380
+    MagicDefense: 99
+    MagicResistance: 130
+    Resistance: 130
+    Str: 278
+    Agi: 166
+    Vit: 121
+    Int: 121
+    Dex: 178
+    Luk: 123
+    AttackRange: 2
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Formless
+    Element: Neutral
+    ElementLevel: 1
+    WalkSpeed: 155
+    AttackDelay: 238
+    AttackMotion: 576
+    DamageMotion: 360
+    Ai: 04
+    Drops:
+      - Item: Broken_Armor_Piece
+        Rate: 2400
+      - Item: Broken_Steel_Piece
+        Rate: 1600
+      - Item: Shadowdecon_Ore
+        Rate: 150
+      - Item: Zelunium_Ore
+        Rate: 150
+      - Item: Shadowdecon
+        Rate: 12
+      - Item: Zelunium
+        Rate: 12
+      - Item: Gan_Ceann_Card
+        Rate: 1
+        StealProtected: true
+  - Id: 20936
+    AegisName: DISGUISER
+    Name: Disguiser
+    Level: 254
+    Hp: 42303800
+    BaseExp: 335956
+    JobExp: 235169
+    Attack: 9874
+    Attack2: 1230
+    Defense: 542
+    MagicDefense: 168
+    MagicResistance: 171
+    Resistance: 187
+    Str: 314
+    Agi: 203
+    Vit: 147
+    Int: 135
+    Dex: 201
+    Luk: 198
+    AttackRange: 2
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Demon
+    Element: Undead
+    ElementLevel: 2
+    WalkSpeed: 150
+    AttackDelay: 384
+    AttackMotion: 768
+    DamageMotion: 384
+    Ai: 04
+    Drops:
+      - Item: Red_Scarf
+        Rate: 2500
+      - Item: Tangled_Chain
+        Rate: 1800
+      - Item: White_Powder
+        Rate: 50
+      - Item: Shadowdecon_Ore
+        Rate: 150
+      - Item: Zelunium_Ore
+        Rate: 150
+      - Item: Zelunium
+        Rate: 25
+      - Item: Shadowdecon
+        Rate: 25
+      - Item: Disguiser_Card
+        Rate: 1
+        StealProtected: true
+  - Id: 20937
+    AegisName: BRUTAL_MURDERER
+    Name: Brutal Murderer
+    Level: 214
+    Hp: 13909270
+    BaseExp: 269952
+    JobExp: 188966
+    Attack: 8135
+    Attack2: 998
+    Defense: 470
+    MagicDefense: 80
+    MagicResistance: 143
+    Resistance: 187
+    Str: 277
+    Agi: 174
+    Vit: 175
+    Int: 134
+    Dex: 131
+    Luk: 130
+    AttackRange: 2
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Large
+    Race: Demihuman
+    Element: Neutral
+    ElementLevel: 2
+    WalkSpeed: 175
+    AttackDelay: 336
+    AttackMotion: 672
+    DamageMotion: 288
+    Ai: 04
+    Drops:
+      - Item: Old_Manteau
+        Rate: 2400
+      - Item: Rusty_Cleaver
+        Rate: 1600
+      - Item: Mr_Scream
+        Rate: 20
+      - Item: Shadowdecon_Ore
+        Rate: 150
+      - Item: Zelunium_Ore
+        Rate: 150
+      - Item: Shadowdecon
+        Rate: 12
+      - Item: Zelunium
+        Rate: 12
+      - Item: Brutal_Murderer_Card
+        Rate: 1
+        StealProtected: true
+  - Id: 20938
+    AegisName: GHOST_CUBE
+    Name: Ghost Cube
+    Level: 213
+    Hp: 12735150
+    BaseExp: 261542
+    JobExp: 183079
+    Attack: 8114
+    Attack2: 1032
+    Defense: 482
+    MagicDefense: 114
+    MagicResistance: 171
+    Resistance: 171
+    Str: 274
+    Agi: 185
+    Vit: 161
+    Int: 161
+    Dex: 177
+    Luk: 169
+    AttackRange: 1
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Small
+    Race: Undead
+    Element: Undead
+    ElementLevel: 1
+    WalkSpeed: 150
+    AttackDelay: 624
+    AttackMotion: 1248
+    DamageMotion: 576
+    Ai: 04
+    Drops:
+      - Item: Piece_Of_Black_Cloth
+        Rate: 2400
+      - Item: Ectoplasm
+        Rate: 2000
+      - Item: Black_Powder
+        Rate: 250
+      - Item: Shadowdecon_Ore
+        Rate: 150
+      - Item: Zelunium_Ore
+        Rate: 150
+      - Item: Shadowdecon
+        Rate: 12
+      - Item: Zelunium
+        Rate: 12
+      - Item: Ghost_Cube_Card
+        Rate: 1
+        StealProtected: true
+  - Id: 20939
+    AegisName: LUDE_GAL
+    Name: Lude Gal
+    Level: 213
+    Hp: 12840680
+    BaseExp: 259877
+    JobExp: 181914
+    Attack: 7925
+    Attack2: 1001
+    Defense: 410
+    MagicDefense: 105
+    MagicResistance: 151
+    Resistance: 179
+    Str: 274
+    Agi: 171
+    Vit: 168
+    Int: 142
+    Dex: 168
+    Luk: 134
+    AttackRange: 2
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Small
+    Race: Undead
+    Element: Undead
+    ElementLevel: 2
+    WalkSpeed: 150
+    AttackDelay: 480
+    AttackMotion: 960
+    DamageMotion: 480
+    Ai: 04
+    Drops:
+      - Item: Pumpkin_Bucket
+        Rate: 2500
+      - Item: Ectoplasm
+        Rate: 2000
+      - Item: Transparent_Cloth
+        Rate: 500
+      - Item: Shadowdecon_Ore
+        Rate: 150
+      - Item: Zelunium_Ore
+        Rate: 150
+      - Item: Shadowdecon
+        Rate: 12
+      - Item: Zelunium
+        Rate: 12
+      - Item: Lude_Gal_Card
+        Rate: 1
+        StealProtected: true
+  - Id: 20940
+    AegisName: BLUEMOON_LOLI_RURI
+    Name: Blue Moon Loli Ruri
+    Level: 255
+    Hp: 46338500
+    BaseExp: 339785
+    JobExp: 237850
+    Attack: 9325
+    Attack2: 1345
+    Defense: 457
+    MagicDefense: 191
+    MagicResistance: 260
+    Resistance: 238
+    Str: 301
+    Agi: 205
+    Vit: 187
+    Int: 204
+    Dex: 192
+    Luk: 205
+    AttackRange: 2
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Large
+    Race: Demon
+    Element: Water
+    ElementLevel: 3
+    WalkSpeed: 125
+    AttackDelay: 510
+    AttackMotion: 1020
+    DamageMotion: 576
+    Ai: 04
+    Drops:
+      - Item: Black_Kitty_Doll
+        Rate: 500
+      - Item: Striped_Socks
+        Rate: 2400
+      - Item: Bat_Cage
+        Rate: 2000
+      - Item: Loki's_Whispers
+        Rate: 2
+      - Item: Shadowdecon_Ore
+        Rate: 150
+      - Item: Zelunium_Ore
+        Rate: 150
+      - Item: Shadowdecon
+        Rate: 25
+      - Item: Bluemoon_Loli_Ruri_Card
+        Rate: 1
+        StealProtected: true
+  - Id: 20941
+    AegisName: GROTE
+    Name: Grote
+    Level: 253
+    Hp: 47842600
+    BaseExp: 346622
+    JobExp: 242635
+    Attack: 9354
+    Attack2: 1320
+    Defense: 456
+    MagicDefense: 117
+    MagicResistance: 153
+    Resistance: 237
+    Str: 311
+    Agi: 207
+    Vit: 187
+    Int: 121
+    Dex: 199
+    Luk: 207
+    AttackRange: 1
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Large
+    Race: Demon
+    Element: Earth
+    ElementLevel: 2
+    WalkSpeed: 180
+    AttackDelay: 792
+    AttackMotion: 1584
+    DamageMotion: 576
+    Ai: 04
+    Drops:
+      - Item: Hanging_Doll
+        Rate: 1000
+      - Item: Rotten_Rope
+        Rate: 2500
+      - Item: Tree_Knot
+        Rate: 2000
+      - Item: Branch_Of_Dead_Tree
+        Rate: 5
+      - Item: Bloody_Dead_Branch
+        Rate: 2
+      - Item: Shadowdecon
+        Rate: 25
+      - Item: Zelunium
+        Rate: 25
+      - Item: Grote_Card
+        Rate: 1
+        StealProtected: true
+  - Id: 20942
+    AegisName: PIERROTZOIST
+    Name: Pierrotzoist
+    Level: 255
+    Hp: 38506310
+    BaseExp: 339451
+    JobExp: 237616
+    Attack: 9356
+    Attack2: 1247
+    Defense: 541
+    MagicDefense: 134
+    MagicResistance: 226
+    Resistance: 212
+    Str: 311
+    Agi: 177
+    Vit: 166
+    Int: 177
+    Dex: 201
+    Luk: 169
+    AttackRange: 1
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Demon
+    Element: Dark
+    ElementLevel: 2
+    WalkSpeed: 155
+    AttackDelay: 768
+    AttackMotion: 1536
+    DamageMotion: 480
+    Ai: 04
+    Drops:
+      - Item: Broken_Needle
+        Rate: 2400
+      - Item: Needle_Pouch
+        Rate: 2000
+      - Item: Stuffed_Doll
+        Rate: 40
+      - Item: Ectoplasm
+        Rate: 150
+      - Item: Shadowdecon_Ore
+        Rate: 150
+      - Item: Zelunium_Ore
+        Rate: 150
+      - Item: Zelunium
+        Rate: 25
+      - Item: Pierrotzoist_Card
+        Rate: 1
+        StealProtected: true
+  - Id: 20943
+    AegisName: DEATH_WITCH
+    Name: Death Witch
+    Level: 255
+    Hp: 398856250
+    BaseExp: 9051055
+    JobExp: 6335739
+    Attack: 14658
+    Attack2: 2687
+    Defense: 687
+    MagicDefense: 210
+    MagicResistance: 539
+    Resistance: 273
+    Str: 424
+    Agi: 236
+    Vit: 214
+    Int: 423
+    Dex: 241
+    Luk: 174
+    AttackRange: 3
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Demihuman
+    Element: Dark
+    ElementLevel: 2
+    WalkSpeed: 150
+    AttackDelay: 517
+    AttackMotion: 1134
+    DamageMotion: 480
+    DamageTaken: 10
+    Ai: 21
+    Class: Boss
+    Modes:
+      Mvp: true
+    Drops:
+      - Item: Ectoplasm
+        Rate: 200
+      - Item: Yggdrasilberry
+        Rate: 1500
+      - Item: Seed_Of_Yggdrasil
+        Rate: 1500
+      - Item: Leaf_Of_Yggdrasil
+        Rate: 1500
+      - Item: Shadowdecon
+        Rate: 1000
+      - Item: Zelunium
+        Rate: 1000
+      - Item: Death_Witch_Card
+        Rate: 1
+        StealProtected: true
 #  - Id: 20944
 #    AegisName: JP_E_MONSTER_151
 #  - Id: 20945

+ 102 - 0
db/re/mob_skill_db.txt

@@ -13239,6 +13239,108 @@
 20934,R001_BESTIA@NPC_DRAGONFEAR,attack,659,5,10000,0,10000,no,self,always,0,,,,,,,
 // 20934,R001_BESTIA@NPC_DAMAGE_HEAL,attack,753,1,3000,1500,40000,no,target,myhpltmaxrate,20,,,,,,,
 
+// nif_dun
+20935,GAN_CEANN@NPC_CRITICALSLASH,attack,170,1,1000,500,5000,no,target,always,0,,,,,,,
+20935,GAN_CEANN@NPC_DARKNESSATTACK,attack,190,3,500,500,5000,no,target,always,0,,,,,,6,
+20935,GAN_CEANN@NPC_BLINDATTACK,attack,177,3,2000,0,5000,yes,target,always,0,,,,,,,
+20935,GAN_CEANN@NPC_DARKNESSATTACK,attack,190,3,1000,500,5000,no,target,always,0,,,,,,6,
+20935,GAN_CEANN@NPC_BLEEDING2,attack,764,5,2000,0,60000,yes,target,always,0,,,,,,,
+20935,GAN_CEANN@NPC_BLEEDING,attack,660,5,2000,0,60000,yes,target,always,0,,,,,,,
+20935,GAN_CEANN@NPC_DARKCROSS,attack,338,3,300,0,5000,yes,target,always,0,,,,,,,
+20936,DISGUISER@NPC_COMBOATTACK,attack,171,2,1000,700,5000,no,target,always,0,,,,,,19,
+20936,DISGUISER@NPC_PIERCINGATT,attack,158,5,500,0,5000,yes,target,always,0,,,,,,,
+20936,DISGUISER@AS_GRIMTOOTH,chase,137,5,2000,0,0,yes,target,always,0,,,,,,,
+20936,DISGUISER@NPC_GUIDEDATTACK,attack,172,3,8000,500,600000,no,target,always,0,,,,,,,
+20936,DISGUISER@NPC_COMBOATTACK,attack,171,3,1000,500,15000,no,target,always,0,,,,,,,
+20936,DISGUISER@NPC_CHANGEWIND,attack,165,1,10000,500,100000,no,self,always,0,,,,,,,
+20936,DISGUISER@NPC_CHANGEFIRE,attack,164,1,10000,500,100000,no,self,always,0,,,,,,,
+20936,DISGUISER@NPC_CHANGEWATER,attack,162,1,10000,500,100000,no,self,always,0,,,,,,,
+20936,DISGUISER@NPC_CHANGEGROUND,attack,163,1,10000,500,100000,no,self,always,0,,,,,,,
+20937,BRUTAL_MURDERER@AS_SONICBLOW,attack,136,7,500,800,5000,no,target,always,0,,,,,,29,
+20937,BRUTAL_MURDERER@NPC_CURSEATTACK,attack,181,5,500,800,5000,no,target,always,0,,,,,,29,
+20937,BRUTAL_MURDERER@NPC_SPLASHATTACK,attack,174,1,2000,0,5000,yes,target,always,0,,,,,,,
+20937,BRUTAL_MURDERER@NPC_IGNITIONBREAK,attack,740,2,1000,300,30000,no,self,always,0,,,,,,,
+20937,BRUTAL_MURDERER@NPC_CRITICALWOUND,attack,673,1,8000,300,5000,no,target,always,0,,,,,,,
+20938,GHOST_CUBE@MG_STONECURSE,attack,16,10,500,1500,5000,no,target,always,0,,,,,,6,
+20938,GHOST_CUBE@NPC_MENTALBREAKER,attack,159,3,500,800,5000,no,target,always,0,,,,,,29,
+20938,GHOST_CUBE@NPC_BLINDATTACK,attack,177,3,2000,0,5000,yes,target,always,0,,,,,,,
+20938,GHOST_CUBE@NPC_SILENCEATTACK,attack,178,3,500,700,5000,no,target,always,0,,,,,,,
+20938,GHOST_CUBE@NPC_SLEEPATTACK,attack,182,3,500,0,5000,yes,target,always,0,,,,,,,
+20938,GHOST_CUBE@NPC_WINDATTACK,attack,187,3,2000,0,5000,yes,target,always,0,,,,,,,
+20939,LUDE_GAL@NPC_CHEAL,idle,729,3,2500,500,5000,no,self,always,0,,,,,,5,
+20939,LUDE_GAL@AL_HEAL,chase,28,9,10000,500,5000,no,friend,friendhpltmaxrate,60,,,,,,18,
+20939,LUDE_GAL@AL_HEAL,attack,28,9,10000,500,5000,no,friend,friendhpltmaxrate,60,,,,,,18,
+20939,LUDE_GAL@AL_HEAL,chase,28,9,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,18,
+20939,LUDE_GAL@AL_HEAL,attack,28,9,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,18,
+20939,LUDE_GAL@PR_LEXAETERNA,chase,78,1,1000,1000,5000,no,target,always,0,,,,,,6,
+20939,LUDE_GAL@PR_LEXAETERNA,attack,78,1,1000,1000,5000,no,target,always,0,,,,,,6,
+20939,LUDE_GAL@NPC_CHEAL,chase,729,3,2500,500,5000,no,self,always,0,,,,,,5,
+20939,LUDE_GAL@AM_POTIONPITCHER,attack,231,4,10000,500,5000,no,friend,friendhpltmaxrate,60,,,,,,5,
+20939,LUDE_GAL@AM_POTIONPITCHER,attack,231,4,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,5,
+20939,LUDE_GAL@NPC_GROUNDATTACK,attack,185,5,2000,500,5000,no,target,always,0,,,,,,6,
+20939,LUDE_GAL@NPC_STUNATTACK,attack,179,5,2000,0,0,yes,target,always,0,,,,,,,
+20940,BLUEMOON_LOLI_RURI@AL_TELEPORT,idle,26,1,5000,0,5000,yes,self,rudeattacked,0,,,,,,,
+20940,BLUEMOON_LOLI_RURI@AL_TELEPORT,walk,26,1,5000,0,5000,yes,self,rudeattacked,0,,,,,,,
+20940,BLUEMOON_LOLI_RURI@NPC_DARKSTRIKE,attack,340,5,500,700,5000,no,target,myhpltmaxrate,50,,,,,,6,
+20940,BLUEMOON_LOLI_RURI@NPC_DARKSTRIKE,chase,340,5,500,700,5000,no,target,always,0,,,,,,6,
+20940,BLUEMOON_LOLI_RURI@NPC_EMOTION,chase,197,1,2000,0,5000,yes,self,always,0,,,,,,3,
+20940,BLUEMOON_LOLI_RURI@PR_LEXDIVINA,chase,76,10,500,1000,5000,no,target,always,0,,,,,,2,
+20940,BLUEMOON_LOLI_RURI@PR_LEXDIVINA,attack,76,10,500,1000,5000,no,target,always,0,,,,,,2,
+20940,BLUEMOON_LOLI_RURI@SA_REVERSEORCISH,chase,294,1,50,0,30000,yes,target,always,0,,,,,,18,
+20940,BLUEMOON_LOLI_RURI@SA_REVERSEORCISH,attack,294,1,50,0,30000,yes,target,always,0,,,,,,18,
+20941,GROTE@AS_GRIMTOOTH,chase,137,5,2000,0,5000,yes,target,always,0,,,,,,,
+20941,GROTE@NPC_CURSEATTACK,attack,181,3,1000,800,5000,no,target,always,0,,,,,,6,
+20941,GROTE@NPC_UNDEADATTACK,attack,347,3,500,500,5000,no,target,always,0,,,,,,6,
+20941,GROTE@NPC_CHEAL,chase,729,3,2500,500,5000,no,self,always,0,,,,,,5,
+20941,GROTE@NPC_COMBOATTACK,attack,171,5,1500,0,5000,yes,target,always,0,,,,,,,
+20941,GROTE@NPC_WIDEBLEEDING2,attack,756,4,10000,0,15000,yes,self,always,0,,,,,,,
+20941,GROTE@NPC_WIDEBLEEDING,attack,665,4,10000,0,15000,yes,self,always,0,,,,,,,
+20941,GROTE@NPC_GROUNDATTACK,attack,185,5,2000,500,5000,no,target,always,0,,,,,,6,
+20941,GROTE@NPC_STUNATTACK,attack,179,5,2000,0,0,yes,target,always,0,,,,,,,
+20942,PIERROTZOIST@AL_DECAGI,attack,30,1,500,1000,5000,no,target,always,0,,,,,,29,
+20942,PIERROTZOIST@NPC_HALLUCINATION,chase,207,1,500,500,5000,no,target,always,0,,,,,,9,
+20942,PIERROTZOIST@NPC_HALLUCINATION,attack,207,1,500,500,5000,no,target,always,0,,,,,,9,
+20942,PIERROTZOIST@MO_BODYRELOCATION,chase,264,1,2000,500,5000,no,target,always,0,,,,,,,
+20942,PIERROTZOIST@KN_SPEARSTAB,chase,58,5,2500,0,5000,yes,target,groundattacked,0,,,,,,9,
+20942,PIERROTZOIST@KN_SPEARSTAB,chase,58,5,5000,0,5000,yes,target,longrangeattacked,0,,,,,,,
+20942,PIERROTZOIST@SM_MAGNUM,attack,7,4,500,500,5000,no,self,always,0,,,,,,,
+20942,PIERROTZOIST@KN_TWOHANDQUICKEN,attack,60,5,2000,0,120000,yes,self,myhpltmaxrate,30,,,,,,6,
+20942,PIERROTZOIST@KN_BRANDISHSPEAR,attack,57,5,2000,0,10000,yes,target,always,0,,,,,,6,
+20942,PIERROTZOIST@NPC_DARKNESSATTACK,attack,190,4,1000,0,5000,yes,target,always,0,,,,,,,
+20943,DEATH_WITCH@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
+20943,DEATH_WITCH@NPC_WIDESILENCE,chase,663,1,2000,1000,20000,no,self,always,0,,,,,,32,
+20943,DEATH_WITCH@NPC_WIDESILENCE,attack,663,1,2000,700,25000,no,self,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_WIDEFREEZE,chase,664,1,2000,1000,20000,no,self,always,0,,,,,,36,
+20943,DEATH_WITCH@NPC_WIDEFREEZE,attack,664,1,2000,1000,20000,no,self,always,0,,,,,,36,
+20943,DEATH_WITCH@NPC_WIDESLEEP,chase,668,1,2000,700,25000,no,self,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_WIDESLEEP,attack,668,1,2000,700,25000,no,self,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_DARKTHUNDER,chase,341,3,500,1500,15000,no,target,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_DARKTHUNDER,attack,341,3,500,1500,15000,no,target,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_WIDESOULDRAIN,chase,680,1,1000,500,5000,no,self,always,0,,,,,,42,
+20943,DEATH_WITCH@NPC_WIDESOULDRAIN,attack,680,1,1000,500,5000,no,self,always,0,,,,,,42,
+20943,DEATH_WITCH@WZ_WATERBALL,attack,86,10,3000,500,25000,no,target,always,0,,,,,,0,
+20943,DEATH_WITCH@WZ_WATERBALL,chase,86,10,3000,500,25000,no,target,always,0,,,,,,0,
+20943,DEATH_WITCH@NPC_WIDECURSE,chase,677,1,500,800,5000,no,self,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_SUMMONSLAVE,attack,196,1,10000,700,10000,no,self,slavele,3,,,,,,,
+20943,DEATH_WITCH@NPC_SUMMONSLAVE,idle,196,1,10000,700,10000,no,self,slavele,3,,,,,,,
+20943,DEATH_WITCH@NPC_WIDECURSE,attack,677,1,500,800,5000,no,self,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_WIDESTUN,chase,678,1,2000,1300,180000,no,self,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_WIDESTUN,attack,678,1,2000,1300,180000,no,self,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_DARKNESSATTACK,attack,190,5,2000,0,5000,yes,target,always,0,,,,,,29,
+20943,DEATH_WITCH@NPC_DARKNESSATTACK,chase,190,5,2000,0,5000,yes,target,always,0,,,,,,29,
+20943,DEATH_WITCH@WZ_FROSTNOVA,chase,88,10,3000,1000,10000,no,self,always,0,,,,,,,
+20943,DEATH_WITCH@WZ_FROSTNOVA,attack,88,10,3000,1000,10000,no,self,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_PULSESTRIKE,attack,661,5,2000,0,30000,yes,self,always,0,,,,,,32,
+20943,DEATH_WITCH@HW_GANBANTEIN,attack,483,1,2000,0,5000,yes,target,always,0,,,,,,,
+// 20943,DEATH_WITCH@NPC_EARTHQUAKE_K,attack,750,5,10000,1500,25000,no,target,myhpltmaxrate,20,,,,,,,
+20943,DEATH_WITCH@NPC_EARTHQUAKE,attack,653,5,10000,1500,25000,no,target,myhpltmaxrate,20,,,,,,,
+20943,DEATH_WITCH@NPC_HELLJUDGEMENT,chase,662,2,2000,500,5000,no,self,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_HELLJUDGEMENT,attack,662,2,2000,500,5000,no,self,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,,
+// 20943,DEATH_WITCH@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,target,myhpltmaxrate,10,,,,,,,
+20943,DEATH_WITCH@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,,
+20943,DEATH_WITCH@NPC_CALLSLAVE,attack,352,1,5000,0,30000,yes,self,always,0,,,,,,,
+
 // Training Ground outside Prontera
 21064,S_DUMMY_100_SMALL@NPC_ALLHEAL,attack,687,1,10000,0,500,no,self,myhpltmaxrate,90,,,,,,,
 21064,S_DUMMY_100_SMALL@NPC_ALLHEAL,idle,687,1,10000,0,500,no,self,myhpltmaxrate,90,,,,,,,

+ 51 - 0
db/re/quest_db.yml

@@ -5704,24 +5704,75 @@ Body:
   - Id: 8595
     Title: Playing with Pitaya - Standby
     TimeLimit: 4h
+  - Id: 8639
+    Title: Great banquet hall in the depths of the underworld
+  - Id: 8640
+    Title: Both the dead and the living are in high spirits
+  - Id: 8641
+    Title: He looks cute
+    Targets:
+      - Mob: GHOST_CUBE
+        Count: 15
+      - Mob: LUDE_GAL
+        Count: 15
   - Id: 8642
     Title: He looks cute - Standby
     TimeLimit: 4h
+  - Id: 8644
+    Title: That's not an instrument
+    Targets:
+      - Mob: BRUTAL_MURDERER
+        Count: 10
+      - Mob: GAN_CEANN
+        Count: 10
   - Id: 8645
     Title: That's not an instrument - Standby
     TimeLimit: 4h
+  - Id: 8647
+    Title: Playing the piano
   - Id: 8648
     Title: Playing the piano - Standby
     TimeLimit: 4h
+  - Id: 8649
+    Title: It was a great performance
+  - Id: 8650
+    Title: Guys with messy hair
+    Targets:
+      - Mob: DISGUISER
+        Count: 15
+      - Mob: BLUEMOON_LOLI_RURI
+        Count: 15
   - Id: 8651
     Title: Guys with messy hair - Standby
     TimeLimit: 4h
+  - Id: 8652
+    Title: Guys with messy hair
+    Targets:
+      - Mob: DISGUISER
+        Count: 15
+      - Mob: BLUEMOON_LOLI_RURI
+        Count: 15
+  - Id: 8653
+    Title: The ones with dolls
+    Targets:
+      - Mob: GROTE
+        Count: 10
+      - Mob: PIERROTZOIST
+        Count: 10
   - Id: 8654
     Title: The ones with dolls - Standby
     TimeLimit: 4h
+  - Id: 8655
+    Title: The ones with dolls
+  - Id: 8656
+    Title: Wake them up
   - Id: 8657
     Title: Wake them up - Standby
     TimeLimit: 4h
+  - Id: 8658
+    Title: Sorry for being sleepy (1)
+  - Id: 8659
+    Title: Sorry for being sleepy (2)
   - Id: 8661
     Title: "[Standby] Subjugation-Audumra Chowon-3"
     TimeLimit: 4h

+ 18 - 0
npc/re/mobs/dungeons/nif_dun.txt

@@ -0,0 +1,18 @@
+//===== rAthena Script =======================================
+//= Niflheim dungeon Monsters Spawn Script
+//===== Description: =========================================
+//= Spawns monsters in nif_dun.
+//===== Additional Comments: =================================
+//= 1.0 First version. [Capuche]
+//============================================================
+
+nif_dun01	monster	Gan Ceann	GAN_CEANN,60
+nif_dun01	monster	Brutal Murderer	BRUTAL_MURDERER,60
+nif_dun01	monster	Ghost Cube	GHOST_CUBE,60
+nif_dun01	monster	Lude Gal	LUDE_GAL,60
+
+nif_dun02	monster	Disguiser	DISGUISER,80
+nif_dun02	monster	Grote	GROTE,80
+nif_dun02	monster	Pierrotzoist	PIERROTZOIST,80
+nif_dun02	monster	Blue Moon Loli Ruri	BLUEMOON_LOLI_RURI,80
+nif_dun02	boss_monster	Death Witch	DEATH_WITCH,1,21600000,600000,0

+ 827 - 0
npc/re/quests/quests_dungeons_200.txt

@@ -4,6 +4,7 @@
 //= [Walkthrough Conversion]
 //===== Changelog: ===========================================
 //= 1.0 Added sp_rudus4 quests. [Capuche]
+//= 1.1 Added nif_dun01 and nif_dun02 quests. [Capuche]
 //============================================================
 
 // sp_rudus4
@@ -478,3 +479,829 @@ OnInit:
 	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "isbegin_quest(16528) == 1" );
 	end;
 }
+
+
+// nif_dun
+moc_para01,14,19,7	script	Old scholar#lv200	2_M_SAGE_OLD,{
+	if (BaseLevel < 200) {
+		mes "[Old scholar]";
+		mes "I would like to do more research, but if my life is really in danger...";
+		next;
+		mes "[Old scholar]";
+		mes "I have no choice but to hire a strong and sincere adventurer. Hmm...";
+		next;
+		mes "[Old scholar]";
+		mes "I think level 200 would be enough... It's easy to say, but that is not the type of person who can be easily found.";
+		close;
+	}
+	switch( isbegin_quest(8640) ) {
+	case 0:
+		if (isbegin_quest(8639) == 0) {
+			mes "[Old scholar]";
+			mes "Oh, oh my, my gosh. The strong and sincere adventurer I've been looking for has appeared here.";
+			mes "Would you like to help me with my research?";
+			next;
+			.@s = select( "Listen to the request", "Suspicious..." );
+			mes "[Old scholar]";
+			mes "Even if I look at you with my eyes I recognize your skills at a glance, please do something...!";
+			if (.@s == 2)
+				close;
+			mes "...?";
+			mes "What? Will you help me?";
+			next;
+			mes "[Old scholar]";
+			mes "No, that's it... Everyone refused, so the hanging words got stuck in my mouth.";
+			mes "Thank you for your cooperation.";
+			next;
+			select( "You're still cooperating..." );
+			mes "[Old scholar]";
+			mes "Come on, that's it. Of course someone as talented as you can go to Niflheim.";
+			mes "Of course I don't have many days left and it's not the right time for me to go and I can't come back in time.";
+			next;
+			mes "[Old scholar]";
+			mes "According to recent sources... Deep in the darkness of Niflheim, the dead hold a banquet,";
+			mes "in a form we cannot imagine.";
+			mes "But there is nowhere to hear more about it.";
+			next;
+			mes "[Old scholar]";
+			mes "You'll find out soon anyway, but I'm curious now.";
+			mes "Can you take a look? I'll give you plenty of examples.";
+			next;
+			if (select( "That's enough. Can I come back?", "What if I can't come back?" ) == 2) {
+				mes "[Old scholar]";
+				mes "You wouldn't even think that you wouldn't be able to come back at your level...";
+				mes "If you're still that careful, okay. Come back when you're ready.";
+				close;
+			}
+			setquest 8639;
+			mes "[Garim Springfield]";
+			mes "Thank you. Turns out I forgot to introduce myself.";
+			mes "My name is Garim Springfield.";
+			mes "I worked at Sage Castle for a long time... Now that I'm retired, I want to spend some leisure time here and also put in requests...";
+			next;
+			mes "[" + strcharinfo(0) + "]";
+			mes "Relax...";
+			next;
+			mes "[Garim Springfield]";
+			mes "Okay. It's worth it.";
+			mes "Grant an idle old man a wish.";
+			mes "Then I'll wait for the good news.";
+			close;
+		}
+		mes "[Garim Springfield]";
+		mes "What are you doing? Go fast.";
+		close;
+	case 1:
+		mes "[Garim Springfield]";
+		mes "Huh? Did you really visit the banquet hall deep in Niflheim?";
+		mes "You came back alive?";
+		mes "Okay then, tell me your story.";
+		next;
+		mes "[Garim Springfield]";
+		mes "Hmm hmm... I see!";
+		mes "I am prepared like this, so I won't be afraid if I go later!";
+		next;
+		mes "[Garim Springfield]";
+		mes "The research will last forever...!";
+		completequest 8640;
+		close;
+	case 2:
+		mes "[Garim Springfield]";
+		mes "I felt like I could do research even after dying, so I felt better.";
+		close;
+	}
+	end;
+
+OnInit:
+	questinfo( QTYPE_QUEST2, QMARK_YELLOW, "BaseLevel >= 200 && isbegin_quest(8639) == 0 && isbegin_quest(8640) == 0" );
+	questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(8640) == 1" );
+	end;
+}
+
+niflheim,164,102,3	script	Tired looking dead#lv20	4_F_NFDEADMGCIAN,{
+	switch( isbegin_quest(8640) ) {
+	case 0:
+		switch( isbegin_quest(8639) ) {
+		case 0:
+			mes "[Tired looking dead]";
+			mes "Ha-am...";
+			mes "I can't sleep";
+			mes "What's the fuss that you can't sleep even after you're dead?";
+			mes "Let's get some sleep...";
+			mes "I'm going to die because of the noise.";
+			close;
+		case 1:
+			mes "[Tired looking dead]";
+			mes "Ha-am...";
+			mes "Huh? What? I don't deal with peddlers.";
+			next;
+			if (select( "You have a bad complexion", "Go back quietly" ) == 2) {
+				mes "[Tired looking dead]";
+				mes "Oh, I did mean to ask you if you had sleeping pills... But I'm dead... You won't hear me... Hmm.";
+				close;
+			}
+			mes "[Tired looking dead]";
+			mes "Uh, how did you know?";
+			mes "My complexion must look real bad...";
+			mes "Do you have a sleeping pill?";
+			next;
+			select("I'm not a junkie" );
+			mes "[Tired looking dead]";
+			mes "Ah... I'm sorry. I misunderstood. All the people who have come this far were weird kids or people who sold drugs, so I kicked them out.";
+			next;
+			mes "[Tired looking dead]";
+			mes "By the way... how did you know that I am tired? Does my complexion look that bad?";
+			next;
+			mes "[Tired looking dead]";
+			mes "Actually, I've been dead for a while, but I've only recently come to Niflheim. So I decided to sleep here in this house...";
+			mes "I can't sleep at night because it's so noisy next door.";
+			next;
+			mes "[Tired looking dead]";
+			mes "No, it's the pain of not being able to sleep because the next door is noisy even though I'm already dead..";
+			mes "Oh, not next door. They all ran away.";
+			mes "There's a reason why it is so cheap...";
+			next;
+			mes "[Tired looking dead]";
+			mes "Yes, <NAVI>[there]<INFO>niflheim,148,124,0,101,0</INFO></NAVI>";
+			mes "The crazy villagers over there... they have a banquet every day.";
+			next;
+			mes "[Tired looking dead]";
+			mes "I'm in there every day, every day!!";
+			next;
+			mes "[Tired looking dead]";
+			mes "Ha... I know, even if it's every day, there's a set time.";
+			mes "By the way... If you were a drinker, who would have gone home on time, while you were alive, would you do that even in death?";
+			next;
+			mes "[Tired looking dead]";
+			mes "I'm... dead, so I just want to sleep peacefully...";
+			mes "I hope they return to their senses after the banquet is over.";
+			next;
+			select( "Banquet is..." );
+			mes "[Tired looking dead]";
+			mes "Yeah... you look pretty strong and there's alcohol... they are dead, so it's magic.";
+			mes "If you can silence those who are drunk with magical powers all night long, I will reward you.";
+			mes "Yes, of course every day.";
+			next;
+			mes "[Milla]";
+			mes "I am Milla. I am now a resident of Niflheim.";
+			mes "Please help me sleep, my dear.";
+			erasequest 8639;
+			setquest 8640;
+			close;
+		case 2:
+			end;
+		}
+		end;
+	case 1:
+	case 2:
+		mes "[Milla]";
+		mes "Yes, thank you for coming back.";
+		mes "Ha-am...";
+		mes "For me and my neighbors... for a good night's sleep.";
+		next;
+		if (select( "Listen to the request.", "Reject." ) == 2) {
+			mes "[Milla]";
+			mes "You can't do this if you're busy...";
+			mes "Ah, after all, the living do not hear that sound. This is my agony only known to the dead...";
+			npctalk "Another Dead: Noisy! Get some sleep!", "#lv200althema", bc_self;
+			npctalk "Another Dead: He really can't sleep!", "#lv200althema2", bc_self;
+			close;
+		}
+		mes "[Milla]";
+		mes "Beloved living, thank you for your mercy.";
+		mes "It's a luxurious facility with a banquet hall and an Opera House, but each one is a little different.";
+		mes "I'll ask for that kind of skill based on your kindness...";
+		next;
+		switch( select( "He looks cute", "That's not an instrument", "Playing the piano", "Guys with messy hair", "The ones with dolls", "Wake them up", "Stop" ) ) {
+		case 1:
+			switch( checkquest(8642,PLAYTIME) ) {
+			case -1:
+				break;
+			case 0:
+			case 1:
+				mes "[Milla]";
+				mes "I think they've had enough today.";
+				mes "I hope you can help me tomorrow if you have time.";
+				close;
+			case 2:
+				erasequest 8642;
+				break;
+			}
+			switch( checkquest(8641,HUNTING) ) {
+			case -1:
+				mes "[Milla]";
+				mes "They look cute... but they're terribly noisy.";
+				mes "^0000FF" + getmonsterinfo("GHOST_CUBE", MOB_NAME) + "^000000,";
+				mes "^0000FF" + getmonsterinfo("LUDE_GAL", MOB_NAME) + "^000000";
+				next;
+				mes "[Milla]";
+				mes "I wish you could beat 15 " + getmonsterinfo("GHOST_CUBE", MOB_NAME) + "";
+				mes "and 15 of their mate " + getmonsterinfo("LUDE_GAL", MOB_NAME) + ", who haunted the banquet hall of the dead,";
+				mes "and make them holy for a day.";
+				next;
+				if (select( "I accept", "I'm busy today" ) == 2) {
+					mes "[Milla]";
+					mes "Ummm...";
+					mes "Yeah... Well, I won't die just because I can't sleep...";
+					mes "I'm already dead";
+					close;
+				}
+				mes "[Milla]";
+				mes "Thank you for your kind heart.";
+				mes "Blessed be the mercy of the living!";
+				setquest 8641;
+				close;
+			case 0:
+			case 1:
+				mes "[Milla]";
+				mes "I wish you could beat 15 " + getmonsterinfo("GHOST_CUBE", MOB_NAME) + "";
+				mes "and 15 of their mate " + getmonsterinfo("LUDE_GAL", MOB_NAME) + ", who haunted the banquet hall of the dead,";
+				mes "and make them holy for a day.";
+				close;
+			case 2:
+				mes "[Milla]";
+				mes "Kya, did you hear them scream all the way here?";
+				mes "I think I can sleep a little deeper today thanks to you...";
+				mes "I have to make it through this commotion again tomorrow.";
+				mes "Thank you.";
+				erasequest 8641;
+				setquest 8642;
+				// getexp 15642570,10949790;	// pre-rebalance
+				getexp 20300909,14210636;	// rebalance (unknown jexp, 70% of baseexp)
+				close;
+			}
+			end;
+		case 2:
+			switch( checkquest(8645,PLAYTIME) ) {
+			case -1:
+				break;
+			case 0:
+			case 1:
+				mes "[Milla]";
+				mes "I think they've had enough today.";
+				mes "I hope you can help me tomorrow if you have time.";
+				close;
+			case 2:
+				erasequest 8645;
+				break;
+			}
+			switch( checkquest(8644,HUNTING) ) {
+			case -1:
+				mes "[Milla]";
+				mes "It's called ^0000FF" + getmonsterinfo("BRUTAL_MURDERER", MOB_NAME) + "^000000.";
+				mes "They have knives in their hands... ";
+				mes "It's too loud to knock anywhere!";
+				next;
+				mes "[Milla]";
+				mes "I wish you could beat 10 " + getmonsterinfo("BRUTAL_MURDERER", MOB_NAME) + "";
+				mes "and 10 of their mate " + getmonsterinfo("GAN_CEANN", MOB_NAME) + ", who haunted the banquet hall of the dead,";
+				mes "and make them holy for a day.";
+				next;
+				if (select( "I accept", "I'm busy today" ) == 2) {
+					mes "[Milla]";
+					mes "Ummm...";
+					mes "Yeah... Well, I won't die just because I can't sleep...";
+					mes "I'm already dead.";
+					close;
+				}
+				mes "[Milla]";
+				mes "Thank you for your kind heart.";
+				mes "Blessed be the mercy of the living!";
+				setquest 8644;
+				close;
+			case 0:
+			case 1:
+				mes "[Milla]";
+				mes "I wish you could beat 10 " + getmonsterinfo("BRUTAL_MURDERER", MOB_NAME) + "";
+				mes "and 10 of their mate " + getmonsterinfo("GAN_CEANN", MOB_NAME) + ", who haunted the banquet hall of the dead,";
+				mes "and make them holy for a day.";
+				close;
+			case 2:
+				mes "[Milla]";
+				mes "Kya, did you hear the sound of their cleavers and their helmets flying all the way up to here?";
+				mes "I think I can sleep a little deeper today thanks to you...";
+				mes "Thank you.";
+				erasequest 8644;
+				setquest 8645;
+				// getexp 10756120,7541880;	// pre-rebalance
+				getexp 14106860,9874802;	// rebalance (unknown jexp, 70% of baseexp)
+				close;
+			}
+			end;
+		case 3:
+			switch( checkquest(8648,PLAYTIME) ) {
+			case -1:
+				break;
+			case 0:
+			case 1:
+				mes "[Milla]";
+				mes "I think they've had enough today.";
+				mes "I hope you can help me tomorrow if you have time.";
+				close;
+			case 2:
+				erasequest 8648;
+				break;
+			}
+			switch( isbegin_quest(8647) ) {
+			case 0:
+				mes "[Milla]";
+				mes "If you go into the banquet hall of the dead there, there will be a piano.";
+				mes "It actually screams when a living person knocks on it.";
+				mes "Would it be fun?";
+				next;
+				mes "[Milla]";
+				mes "Play the <NAVI>[piano]<INFO>nif_dun01,140,202,0,101,0</INFO></NAVI>";
+				mes "of the banquet hall of the dead.";
+				mes "There is no such thing as a song request.";
+				next;
+				if (select( "I accept", "I'm busy today" ) == 2) {
+					mes "[Milla]";
+					mes "Ummm...";
+					mes "Yeah... Well, I won't die just because I can't sleep...";
+					mes "I'm already dead";
+					close;
+				}
+				mes "[Milla]";
+				mes "Thank you for your kind heart.";
+				mes "Blessed be the mercy of the living!";
+				setquest 8647;
+				close;
+			case 1:
+				mes "[Milla]";
+				mes "Play the <NAVI>[piano]<INFO>nif_dun01,140,202,0,101,0</INFO></NAVI>";
+				mes "of the banquet hall of the dead.";
+				mes "There is no such thing as a song request.";
+				close;
+			case 2:
+				mes "[Milla]";
+				mes "Hahaha, did you hear that? It's like alcohol... No, it's like that if you drink magic and act like a hawk.";
+				mes "I think I can sleep a little deeper today thanks to you...";
+				mes "Thank you.";
+				erasequest 8647;
+				erasequest 8649;
+				setquest 8648;
+				getexp 10000000,7500000;
+				close;
+			}
+			end;
+		case 4:
+			if (BaseLevel < 240) {
+				mes "[Milla]";
+				mes "Hmm... no.";
+				mes "It's still too early to leave it to you...";
+				mes "I'll wait until you reach level 240.";
+				mes "I have time.";
+				close;
+			}
+			switch( checkquest(8651,PLAYTIME) ) {
+			case -1:
+				break;
+			case 0:
+			case 1:
+				mes "[Milla]";
+				mes "I think they've had enough today.";
+				mes "I hope you can help me tomorrow if you have time.";
+				close;
+			case 2:
+				erasequest 8651;
+				break;
+			}
+			switch( isbegin_quest(8650) ) {
+			case 0:
+			case 1:
+				switch( checkquest(8650,HUNTING) ) {
+				case -1:
+					mes "[Milla]";
+					mes "I mean, there are kids called ^0000FF" + getmonsterinfo("DISGUISER", MOB_NAME) + "^000000. ";
+					mes "They've got their hair as if a bomb hit, and they look so excited.";
+					mes "^0000FF" + getmonsterinfo("BLUEMOON_LOLI_RURI", MOB_NAME) + "^000000, it can't be that loud when you get together with guys with broom hair.";
+					next;
+					mes "[Milla]";
+					mes "I hope you show the hot taste to";
+					mes "the 15 ^0000FF" + getmonsterinfo("DISGUISER", MOB_NAME) + "^000000 and the 15 ^0000FF" + getmonsterinfo("BLUEMOON_LOLI_RURI", MOB_NAME) + "^000000";
+					mes "that haunt the collapsed Opera House.";
+					next;
+					if (select( "I accept", "I'm busy today" ) == 2) {
+						mes "[Milla]";
+						mes "Ummm...";
+						mes "Yeah... Well, I won't die just because I can't sleep...";
+						mes "I'm already dead";
+						close;
+					}
+					mes "[Milla]";
+					mes "Thank you for your kind heart.";
+					mes "Blessed be the mercy of the living!";
+					setquest 8650;
+					close;
+				case 0:
+				case 1:
+					mes "[Milla]";
+					mes "I hope you show the hot taste to";
+					mes "the 15 ^0000FF" + getmonsterinfo("DISGUISER", MOB_NAME) + "^000000 and the 15 ^0000FF" + getmonsterinfo("BLUEMOON_LOLI_RURI", MOB_NAME) + "^000000";
+					mes "that haunt the collapsed Opera House.";
+					close;
+				case 2:
+					mes "[Milla]";
+					mes "Huh, huh, I can hear the bomb head dusting all the way up to here.";
+					mes "Thanks to you, I will sleep well today.";
+					mes "Thank you. See you again tomorrow.";
+					completequest 8650;
+					setquest 8651;
+					getexp 44984725,31489308;	// rebalance (unknown jexp, 70% of baseexp)
+					close;
+				}
+				end;
+			case 2:
+				switch( checkquest(8652,HUNTING) ) {
+				case -1:
+					mes "[Milla]";
+					mes "I hope you show the hot taste to";
+					mes "the 15 ^0000FF" + getmonsterinfo("DISGUISER", MOB_NAME) + "^000000 and the 15 ^0000FF" + getmonsterinfo("BLUEMOON_LOLI_RURI", MOB_NAME) + "^000000";
+					mes "that haunt the collapsed Opera House.";
+					next;
+					if (select( "I accept", "I'm busy today" ) == 2) {
+						mes "[Milla]";
+						mes "Ummm...";
+						mes "Yeah... Well, I won't die just because I can't sleep...";
+						mes "I'm already dead";
+						close;
+					}
+					mes "[Milla]";
+					mes "Thank you for your kind heart.";
+					mes "Blessed be the mercy of the living!";
+					setquest 8652;
+					close;
+				case 0:
+				case 1:
+					mes "[Milla]";
+					mes "I hope you show the hot taste to";
+					mes "the 15 ^0000FF" + getmonsterinfo("DISGUISER", MOB_NAME) + "^000000 and the 15 ^0000FF" + getmonsterinfo("BLUEMOON_LOLI_RURI", MOB_NAME) + "^000000";
+					mes "that haunt the collapsed Opera House.";
+					close;
+				case 2:
+					mes "[Milla]";
+					mes "Huh, huh, I can hear the bomb head dusting all the way up to here.";
+					mes "Thanks to you, I will sleep well today.";
+					mes "Thank you. See you again tomorrow.";
+					erasequest 8652;
+					setquest 8651;
+					getexp 44984725,31489308;	// rebalance (unknown jexp, 70% of baseexp)
+					close;
+				}
+				end;
+			}
+			end;
+		case 5:
+			if (BaseLevel < 240) {
+				mes "[Milla]";
+				mes "Hmm... no.";
+				mes "It's still too early to leave it to you...";
+				mes "I'll wait until you reach level 240.";
+				mes "I have time.";
+				close;
+			}
+			switch( checkquest(8654,PLAYTIME) ) {
+			case -1:
+				break;
+			case 0:
+			case 1:
+				mes "[Milla]";
+				mes "I think they've had enough today.";
+				mes "I hope you can help me tomorrow if you have time.";
+				close;
+			case 2:
+				erasequest 8654;
+				break;
+			}
+			switch( isbegin_quest(8653) ) {
+			case 0:
+			case 1:
+				switch( checkquest(8653,HUNTING) ) {
+				case -1:
+					mes "[Milla]";
+					mes "If you look at the collapsed Opera House there,";
+					mes "you'll see the ones with dolls. There's " + getmonsterinfo("GROTE", MOB_NAME) + " and " + getmonsterinfo("PIERROTZOIST", MOB_NAME) + "^000000...";
+					mes "All the ones with dolls are so noisy.";
+					next;
+					mes "[Milla]";
+					mes "I hope you show the hot taste to";
+					mes "the 10 ^0000FF" + getmonsterinfo("GROTE", MOB_NAME) + "^000000 and the 10 ^0000FF" + getmonsterinfo("PIERROTZOIST", MOB_NAME) + "^000000";
+					mes "that haunt the collapsed Opera House.";
+					next;
+					if (select( "I accept", "I'm busy today" ) == 2) {
+						mes "[Milla]";
+						mes "Ummm...";
+						mes "Yeah... Well, I won't die just because I can't sleep...";
+						mes "I'm already dead";
+						close;
+					}
+					mes "[Milla]";
+					mes "Thank you for your kind heart.";
+					mes "Blessed be the mercy of the living!";
+					setquest 8653;
+					close;
+				case 0:
+				case 1:
+					mes "[Milla]";
+					mes "I hope you show the hot taste to";
+					mes "the 10 ^0000FF" + getmonsterinfo("GROTE", MOB_NAME) + "^000000 and the 10 ^0000FF" + getmonsterinfo("PIERROTZOIST", MOB_NAME) + "^000000";
+					mes "that haunt the collapsed Opera House.";
+					close;
+				case 2:
+					mes "[Milla]";
+					mes "Kyak-kyak-kyak-kyak-kyak-kyak-kyak, what did you really do?";
+					mes "A while ago, " + getmonsterinfo("GROTE", MOB_NAME) + " and " + getmonsterinfo("PIERROTZOIST", MOB_NAME) + " went home saying they wouldn't make a noise again.";
+					mes "Of course not. They will come again tomorrow.";
+					mes "Thank you. See you tomorrow.";
+					completequest 8653;
+					setquest 8654;
+					getexp 29944101,20960871;	// rebalance (unknown jexp, 70% of baseexp)
+					close;
+				}
+				end;
+			case 2:
+				switch( checkquest(8655,HUNTING) ) {
+				case -1:
+					mes "[Milla]";
+					mes "I hope you show the hot taste to";
+					mes "the 10 ^0000FF" + getmonsterinfo("GROTE", MOB_NAME) + "^000000 and the 10 ^0000FF" + getmonsterinfo("PIERROTZOIST", MOB_NAME) + "^000000";
+					mes "that haunt the collapsed Opera House.";
+					next;
+					if (select( "I accept", "I'm busy today" ) == 2) {
+						mes "[Milla]";
+						mes "Ummm...";
+						mes "Yeah... Well, I won't die just because I can't sleep...";
+						mes "I'm already dead";
+						close;
+					}
+					mes "[Milla]";
+					mes "Thank you for your kind heart.";
+					mes "Blessed be the mercy of the living!";
+					setquest 8655;
+					close;
+				case 0:
+				case 1:
+					mes "[Milla]";
+					mes "I hope you show the hot taste to";
+					mes "the 10 ^0000FF" + getmonsterinfo("GROTE", MOB_NAME) + "^000000 and the 10 ^0000FF" + getmonsterinfo("PIERROTZOIST", MOB_NAME) + "^000000";
+					mes "that haunt the collapsed Opera House.";
+					close;
+				case 2:
+					mes "[Milla]";
+					mes "Kyak-kyak-kyak-kyak-kyak-kyak-kyak, what did you really do?";
+					mes "A while ago, " + getmonsterinfo("GROTE", MOB_NAME) + " and " + getmonsterinfo("PIERROTZOIST", MOB_NAME) + " went home saying they wouldn't make a noise again.";
+					mes "Of course not. They will come again tomorrow.";
+					mes "Thank you. See you tomorrow.";
+					erasequest 8655;
+					setquest 8654;
+					getexp 29944101,20960871;	// rebalance (unknown jexp, 70% of baseexp)
+					close;
+				}
+				end;
+			}
+			end;
+		case 6:
+			if (BaseLevel < 240) {
+				mes "[Milla]";
+				mes "Hmm... no.";
+				mes "It's still too early to leave it to you...";
+				mes "I'll wait until you reach level 240.";
+				mes "I have time.";
+				close;
+			}
+			switch( checkquest(8657,PLAYTIME) ) {
+			case -1:
+				break;
+			case 0:
+			case 1:
+				mes "[Milla]";
+				mes "I think they've had enough today.";
+				mes "I hope you can help me tomorrow if you have time.";
+				close;
+			case 2:
+				erasequest 8657;
+				break;
+			}
+			switch( isbegin_quest(8656) ) {
+			case 0:
+				mes "[Milla]";
+				mes "The smashed... no, don't say that.";
+				mes "If you go to the collapsed Opera House, you will find ghosts in the frames.";
+				mes "But they don't even have a body...";
+				mes "Snoring, my dear.";
+				next;
+				mes "[Milla]";
+				mes "A <NAVI>[ghost talking]<INFO>nif_dun02,37,221,0,101,0</INFO></NAVI>";
+				mes "and <NAVI>[snoring]<INFO>nif_dun02,249,221,0,101,0</INFO></NAVI>";
+				mes "inside the banquet hall of the dead, twist your nose.";
+				mes "You need to calm them down.";
+				next;
+				if (select( "I accept", "I'm busy today" ) == 2) {
+					mes "[Milla]";
+					mes "Ummm...";
+					mes "Yeah... Well, I won't die just because I can't sleep...";
+					mes "I'm already dead";
+					close;
+				}
+				mes "[Milla]";
+				mes "Thank you for your kind heart.";
+				mes "Blessed be the mercy of the living!";
+				setquest 8656;
+				close;
+			case 1:
+				if (isbegin_quest(8658) == 0 || isbegin_quest(8659) == 0) {
+					mes "[Milla]";
+					mes "A <NAVI>[ghost talking]<INFO>nif_dun02,37,221,0,101,0</INFO></NAVI>";
+					mes "and <NAVI>[snoring]<INFO>nif_dun02,249,221,0,101,0</INFO></NAVI>";
+					mes "inside the banquet hall of the dead, twist your nose.";
+					mes "You need to calm them down.";
+					close;
+				}
+				mes "[Milla]";
+				mes "...I can't eat any more...";
+				mes "...hick.";
+				mes "Oh, have you been there? I fell asleep without realizing it.";
+				mes "It's really annoying to hear that snoring all the way...";
+				next;
+				mes "[Milla]";
+				mes "It seems that the living do not hear well.";
+				mes "Anyway, thank you for today.";
+				mes "Sleep is precious...";
+				mes "Sleep enough while you're alive.";
+				erasequest 8656;
+				erasequest 8658;
+				erasequest 8659;
+				setquest 8657;
+				getexp 13000000,9100000;	// rebalance (unknown jexp, 70% of baseexp)
+				close;
+			case 2:
+				end;
+			}
+			end;
+		case 7:
+			mes "[Milla]";
+			mes "You can't do this if you're busy...";
+			mes "Ah, after all, the living do not hear that sound. This is my agony only known to the dead...";
+			npctalk "Another Dead: Noisy! Get some sleep!", "#lv200althema", bc_self;
+			npctalk "Another Dead: He really can't sleep!", "#lv200althema2", bc_self;
+			close;
+		}
+		end;
+	}
+	end;
+
+OnInit:
+	// prerequisite
+	questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(8639) == 1" );
+
+	// daily
+	questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(8641,HUNTING) == 2" );
+	questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(8644,HUNTING) == 2" );
+	questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(8647) == 2" );
+	questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(8650,HUNTING) == 2" );
+	questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(8652,HUNTING) == 2" );
+	questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(8653,HUNTING) == 2" );
+	questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(8655,HUNTING) == 2" );
+	questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(8656) == 1 && isbegin_quest(8658) == 1 && isbegin_quest(8659) == 1" );
+
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "checkquest(8642,PLAYTIME) == 2" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "checkquest(8645,PLAYTIME) == 2" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "checkquest(8648,PLAYTIME) == 2" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "checkquest(8651,PLAYTIME) == 2" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "checkquest(8654,PLAYTIME) == 2" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "checkquest(8657,PLAYTIME) == 2" );
+
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "BaseLevel >= 200 && (checkquest(8641,HUNTING) == -1 && checkquest(8642,PLAYTIME) == -1)" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "BaseLevel >= 200 && (checkquest(8644,HUNTING) == -1 && checkquest(8645,PLAYTIME) == -1)" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "BaseLevel >= 200 && (isbegin_quest(8647) == 0 && checkquest(8648,PLAYTIME) == -1)" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "BaseLevel >= 240 && (checkquest(8650,HUNTING) == -1 && checkquest(8651,PLAYTIME) == -1)" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "BaseLevel >= 240 && isbegin_quest(8650) == 2 && checkquest(8652,HUNTING) == -1 && checkquest(8651,PLAYTIME) == -1" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "BaseLevel >= 240 && (checkquest(8653,HUNTING) == -1 && checkquest(8654,PLAYTIME) == -1)" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "BaseLevel >= 240 && isbegin_quest(8653) == 2 && checkquest(8655,HUNTING) == -1 && checkquest(8654,PLAYTIME) == -1" );
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "BaseLevel >= 240 && (isbegin_quest(8656) == 0 && checkquest(8657,PLAYTIME) == -1)" );
+	end;
+}
+
+niflheim,160,106,3	duplicate(dummy_npc)	#lv200althema	CLEAR_NPC
+niflheim,165,105,3	duplicate(dummy_npc)	#lv200althema2	CLEAR_NPC
+
+
+niflheim,143,125,6	script	Funny Gatekeeper's Friend#lv20	LUDE_GAL,{
+	npctalk "Funny Gatekeeper's Friend: Sing~ All night~ or forever~", "", bc_self;
+	end;
+}
+
+niflheim,145,126,6	script	Angry Gatekeeper#lv200	GHOST_CUBE,{
+	npctalk "Angry Gatekeeper: Kye-Look! Living! Play! No need to go!", "", bc_self;
+	npctalk "Funny Gatekeeper's Friend: No need to leave! Play with us!", "Funny Gatekeeper's Friend#lv20", bc_self;
+	end;
+}
+
+nif_dun01,140,202,3	script	Piano#lv200	CLEAR_NPC,{
+	if (isbegin_quest(8647) == 1) {
+		mes "I couldn't hear anything, but the dead around me seem to be in an uproar.";
+		mes "Let's report to Milla.";
+		completequest 8647;
+		setquest 8649;
+		npctalk "Clink clink... Crackle!", "Piano#lv200", bc_self;
+		npctalk "Sleep alive! Kyaaak!", "Exciting Cello#lv200", bc_self;
+		npctalk "The living man plays the piano!", "Dancing Cello#lv200", bc_self;
+		npctalk "Oh my God, he can't really play...", "Quiet Cello#lv200", bc_self;
+		npctalk "How could that be...", "Stranger Cello#lv200", bc_self;
+		npctalk "You ruined the atmosphere!", "Happy Cello#lv200", bc_self;
+		npctalk "Piano Ooo!!!", "Serious Contrabass#lv2", bc_self;
+		npctalk "The piano is stunned...", "Sleek Harp#lv200", bc_self;
+		close;
+	}
+	// note: no text
+	end;
+
+OnInit:
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "isbegin_quest(8647) == 1" );
+	end;
+}
+nif_dun01,133,198,3	duplicate(dummy_npc)	Exciting Cello#lv200	CLEAR_NPC
+nif_dun01,138,195,3	duplicate(dummy_npc)	Dancing Cello#lv200	CLEAR_NPC
+nif_dun01,153,195,3	duplicate(dummy_npc)	Quiet Cello#lv200	CLEAR_NPC
+nif_dun01,152,198,3	duplicate(dummy_npc)	Stranger Cello#lv200	CLEAR_NPC
+nif_dun01,157,198,3	duplicate(dummy_npc)	Happy Cello#lv200	CLEAR_NPC
+nif_dun01,156,202,3	duplicate(dummy_npc)	Serious Contrabass#lv2	CLEAR_NPC
+nif_dun01,133,201,3	duplicate(dummy_npc)	Sleek Harp#lv200	CLEAR_NPC
+
+nif_dun01,148,43,3	script	Helpful Gatekeeper#240	DISGUISER,{
+	if (BaseLevel < 240) {
+		npctalk "Helpful Gatekeeper: Uh-huh-huh. You don't have enough grooming to get through here.", "", bc_self;
+		npctalk "Silent Gatekeeper: ...means you are under-leveled.", "Silent Gatekeeper#240", bc_self;
+		end;
+	}
+	npctalk "Helpful Gatekeeper: Uh-huh-huh. Mountain, go up. Can't come down.", "", bc_self;
+	npctalk "Silent Gatekeeper: ...means welcome.", "Silent Gatekeeper#240", bc_self;
+	end;
+}
+
+nif_dun01,143,43,7	script	Silent Gatekeeper#240	GROTE,{
+	npctalk "Silent Gatekeeper: ...", "", bc_self;
+	end;
+}
+
+nif_dun02,37,221,3	script	Sleep Talking Ghost#lv240	CLEAR_NPC,3,3,{
+	if (isbegin_quest(8656) == 1) {
+		switch( isbegin_quest(8659) ) {
+		case 0:
+			setquest 8659;
+			mes "I twisted the nose of the ghost in the frame.";
+			mes "There was no touch, but the ghost stopped talking.";
+			npctalk "????????!", "", bc_self;
+			if (isbegin_quest(8658) == 1)
+				mes "Let's go report to Milla.";
+			close;
+		case 1:
+			mes "The ghost that was talking about is not seen, and another ghost is sleeping.";
+			close;
+		default:
+			end;
+		}
+	}
+	end;
+
+OnTouch:
+	if (isbegin_quest(8659) == 0) {
+		npctalk "I want to eat it too... it looks delicious...", "", bc_self;
+		end;
+	}
+	end;
+
+OnInit:
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "isbegin_quest(8656) == 1 && isbegin_quest(8659) == 0" );
+	end;
+}
+
+nif_dun02,249,221,3	script	Snoring Ghost#lv240	CLEAR_NPC,3,3,{
+	if (isbegin_quest(8656) == 1) {
+		switch( isbegin_quest(8658) ) {
+		case 0:
+			setquest 8658;
+			mes "I twisted the nose of the ghost in the frame.";
+			mes "There was no touch, but the ghost stopped snoring.";
+			npctalk "Nang!", "", bc_self;
+			if (isbegin_quest(8659) == 1)
+				mes "Let's go report to Milla.";
+			close;
+		case 1:
+			mes "The snoring ghost is nowhere to be seen, and another ghost is sleeping.";
+			close;
+		default:
+			end;
+		}
+	}
+	end;
+
+OnTouch:
+	if (isbegin_quest(8658) == 0)
+		npctalk "Dorolong Dorolong...", "", bc_self;
+	end;
+
+OnInit:
+	questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "isbegin_quest(8656) == 1 && isbegin_quest(8658) == 0" );
+	end;
+}

+ 1 - 0
npc/re/scripts_monsters.conf

@@ -46,6 +46,7 @@ npc: npc/re/mobs/dungeons/mjo_dun.txt
 npc: npc/re/mobs/dungeons/moc_pryd.txt
 npc: npc/re/mobs/dungeons/moro_vol.txt
 npc: npc/re/mobs/dungeons/mosk_dun.txt
+npc: npc/re/mobs/dungeons/nif_dun.txt
 npc: npc/re/mobs/dungeons/nyd_dun.txt
 npc: npc/re/mobs/dungeons/odin.txt
 npc: npc/re/mobs/dungeons/orcsdun.txt

+ 1 - 0
npc/re/scripts_warps.conf

@@ -26,6 +26,7 @@ npc: npc/re/warps/dungeons/ecl_dun.txt
 npc: npc/re/warps/dungeons/harboro2.txt
 npc: npc/re/warps/dungeons/iz_dun.txt
 npc: npc/re/warps/dungeons/moc_pryd.txt
+npc: npc/re/warps/dungeons/nif_dun.txt
 npc: npc/re/warps/dungeons/rockmi1.txt
 npc: npc/re/warps/dungeons/sp_rudus.txt
 npc: npc/re/warps/dungeons/slabw01.txt

+ 34 - 0
npc/re/warps/dungeons/nif_dun.txt

@@ -0,0 +1,34 @@
+//===== rAthena Script ======================================= 
+//= Niflheim dungeon warps script
+//===== Changelogs: ==========================================
+//= 1.0 First version. [Capuche]
+//============================================================
+
+niflheim,149,124,0	script	nifla_nifdun01a	WARPNPC,1,1,{
+	end;
+OnTouch:
+	if (isbegin_quest(8640) == 0) {
+		npctalk "Angry Gatekeeper: How are you adventurer? Go in? Do you want to go in? Kick!", "Angry Gatekeeper#lv200", bc_self;
+		npctalk "Funny Gatekeeper's Friend: Awesome!", "Funny Gatekeeper's Friend#lv20", bc_self;
+		end;
+	}
+	warp "nif_dun01",145,85;
+	end;
+}
+
+nif_dun01,145,82,0	warp2	nifdun01a_nifla	1,1,niflheim,146,122
+	
+nif_dun01,146,36,0	script	nifdun01a_nifdun02a	WARPNPC,1,1,{
+	end;
+OnTouch:
+	if (BaseLevel < 240) {
+		npctalk "Helpful Gatekeeper: Hey, look at how you look! How can you come all the way here!", "Helpful Gatekeeper#240", bc_self;
+		npctalk "Silent Gatekeeper: ...means lack of training.", "Silent Gatekeeper#240", bc_self;
+		end;
+	}
+	warp "nif_dun02",149,23;
+	end;
+}
+
+nif_dun02,162,15,0	warp2	nifdun02a_nifdun01a	1,1,nif_dun01,146,39
+nif_dun02,137,15,0	warp2	nifdun02a_nifdun01a_	1,1,nif_dun01,146,39