diff --git a/db/re/mob_db.yml b/db/re/mob_db.yml
index 59d285e56b..bce597c234 100644
--- a/db/re/mob_db.yml
+++ b/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
diff --git a/db/re/mob_skill_db.txt b/db/re/mob_skill_db.txt
index b8b9f761cf..f88eb8e8f3 100644
--- a/db/re/mob_skill_db.txt
+++ b/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,,,,,,,
diff --git a/db/re/quest_db.yml b/db/re/quest_db.yml
index 93894ce596..a5a3cdac32 100644
--- a/db/re/quest_db.yml
+++ b/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
diff --git a/npc/re/mobs/dungeons/nif_dun.txt b/npc/re/mobs/dungeons/nif_dun.txt
new file mode 100644
index 0000000000..b94681148f
--- /dev/null
+++ b/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
diff --git a/npc/re/quests/quests_dungeons_200.txt b/npc/re/quests/quests_dungeons_200.txt
index cbb1c59366..db19800ad7 100644
--- a/npc/re/quests/quests_dungeons_200.txt
+++ b/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, [there]niflheim,148,124,0,101,0";
+ 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 [piano]nif_dun01,140,202,0,101,0";
+ 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 [piano]nif_dun01,140,202,0,101,0";
+ 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 [ghost talking]nif_dun02,37,221,0,101,0";
+ mes "and [snoring]nif_dun02,249,221,0,101,0";
+ 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 [ghost talking]nif_dun02,37,221,0,101,0";
+ mes "and [snoring]nif_dun02,249,221,0,101,0";
+ 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;
+}
diff --git a/npc/re/scripts_monsters.conf b/npc/re/scripts_monsters.conf
index c7faf4a1ba..dca57f6d65 100644
--- a/npc/re/scripts_monsters.conf
+++ b/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
diff --git a/npc/re/scripts_warps.conf b/npc/re/scripts_warps.conf
index 3422c09500..9d50540730 100644
--- a/npc/re/scripts_warps.conf
+++ b/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
diff --git a/npc/re/warps/dungeons/nif_dun.txt b/npc/re/warps/dungeons/nif_dun.txt
new file mode 100644
index 0000000000..d97434ffa0
--- /dev/null
+++ b/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