Browse Source

Initial release of Sky Fortress Invasion Instance (Official Conversion) (#3586)

* Implemented skills
NPC_HALLUCINATIONWALK
NPC_POISON_BUSTER
NPC_CLOUD_KILL
NPC_IGNITIONBREAK
NPC_PHANTOMTHRUST
NPC_FIREWALK
NPC_ELECTRICWALK

Thanks to @aleos89 @Lemongrass3110 @Angelic234 @Latiosu @Akaineko-astasi !
Atemo 4 years ago
parent
commit
95c671a95d

+ 174 - 0
db/pre-re/skill_db.yml

@@ -16381,6 +16381,180 @@ Body:
     Name: NPC_ARROWSTORM
     Description: NPC Arrow Storm
     MaxLevel: 1
+  - Id: 739
+    Name: NPC_CLOUD_KILL
+    Description: Cloud Kill
+    MaxLevel: 5
+    Type: Magic
+    TargetType: Ground
+    Range: 9
+    Flags:
+      IsNpc: true
+      ShowScale: true
+    Hit: Single
+    HitCount: 1
+    Element: Poison
+    CastCancel: true
+    Duration1:
+      - Level: 1
+        Time: 8000
+      - Level: 2
+        Time: 10000
+      - Level: 3
+        Time: 12000
+      - Level: 4
+        Time: 14000
+      - Level: 5
+        Time: 16000
+    Unit:
+      Id: Cloud_Kill
+      Range:
+        - Level: 1
+          Size: 1
+        - Level: 2
+          Size: 2
+        - Level: 3
+          Size: 3
+        - Level: 4
+          Size: 3
+        - Level: 5
+          Size: 3
+      Interval: 500
+      Target: Enemy
+      Flag:
+        PathCheck: true
+        RemovedByFireRain: true
+  - Id: 740
+    Name: NPC_IGNITIONBREAK
+    Description: Ignition Break
+    MaxLevel: 5
+    Type: Weapon
+    TargetType: Self
+    DamageFlags:
+      Splash: true
+    Flags:
+      IsNpc: true
+      ShowScale: true
+    Hit: Single
+    HitCount: 1
+    Element: Fire
+    SplashArea: 5
+  - Id: 741
+    Name: NPC_PHANTOMTHRUST
+    Description: Phantom Thrust
+    MaxLevel: 5
+    Type: Weapon
+    TargetType: Attack
+    Flags:
+      IsNpc: true
+    Range:
+      - Level: 1
+        Size: 7
+      - Level: 2
+        Size: 9
+      - Level: 3
+        Size: 11
+      - Level: 4
+        Size: 13
+      - Level: 5
+        Size: 15
+    Hit: Single
+    HitCount: 1
+    Element: Neutral
+    CastCancel: true
+  - Id: 742
+    Name: NPC_POISON_BUSTER
+    Description: Poison Buster
+    MaxLevel: 2
+    Type: Magic
+    TargetType: Attack
+    Flags:
+      IsNpc: true
+    DamageFlags:
+      Splash: true
+    Range: 9
+    Hit: Single
+    HitCount: 1
+    Element: Poison
+    CastCancel: true
+    SplashArea: 1
+  - Id: 743
+    Name: NPC_HALLUCINATIONWALK
+    Description: Hallucination Walk
+    MaxLevel: 5
+    TargetType: Self
+    Flags:
+      IsNpc: true
+    DamageFlags:
+      NoDamage: true
+    Hit: Single
+    HitCount: 1
+    CastCancel: true
+    Duration1: 20000
+  - Id: 744
+    Name: NPC_ELECTRICWALK
+    Description: Electric Walk
+    MaxLevel: 5
+    Type: Magic
+    TargetType: Self
+    Flags:
+      IgnoreHovering: true
+      IsNpc: true
+    Hit: Single
+    HitCount: 1
+    Element: Wind
+    ActiveInstance:
+      - Level: 1
+        Max: 8
+      - Level: 2
+        Max: 10
+      - Level: 3
+        Max: 12
+      - Level: 4
+        Max: 14
+      - Level: 5
+        Max: 16
+    CastCancel: true
+    Duration1: 12000
+    Unit:
+      Id: Electricwalk
+      Interval: 1000
+      Target: Enemy
+      Flag:
+        NoReiteration: true
+        NoOverlap: true
+  - Id: 745
+    Name: NPC_FIREWALK
+    Description: Fire Walk
+    MaxLevel: 5
+    Type: Magic
+    TargetType: Self
+    Flags:
+      IgnoreHovering: true
+      IsNpc: true
+    Hit: Single
+    HitCount: 1
+    Element: Fire
+    ActiveInstance:
+      - Level: 1
+        Max: 8
+      - Level: 2
+        Max: 10
+      - Level: 3
+        Max: 12
+      - Level: 4
+        Max: 14
+      - Level: 5
+        Max: 16
+    CastCancel: true
+    Duration1: 12000
+    Unit:
+      Id: Firewalk
+      Interval: 1000
+      Target: Enemy
+      Flag:
+        NoReiteration: true
+        NoOverlap: true
   - Id: 1001
     Name: KN_CHARGEATK
     Description: Charge Attack

+ 9 - 9
db/re/instance_db.yml

@@ -267,15 +267,15 @@ Body:
       Map: 1@mir
       X: 101
       Y: 10
-#  - Id: 33
-#    Name: Sky Fortress Invasion
-#    Enter:
-#      Map: 1@sthb
-#      X: 54
-#      Y: 67
-#    AdditionalMaps:
-#      1@sthc: true
-#      1@sthd: true
+  - Id: 33
+    Name: Sky Fortress Invasion
+    Enter:
+      Map: 1@sthb
+      X: 54
+      Y: 67
+    AdditionalMaps:
+      1@sthc: true
+      1@sthd: true
   - Id: 34
     Name: Heart Hunter War Base 1
     Enter:

+ 2 - 2
db/re/item_randomopt_group.yml

@@ -1108,7 +1108,7 @@ Body:
             MaxValue: 5
             Chance: 100
   - Id: 10
-    Group: AS_WEAPON_4 # Daggers, Books, Swords
+    Group: AS_WEAPON_4 # Daggers, Books, Huuma
     Slots:
       - Slot: 1
         Options:
@@ -1315,7 +1315,7 @@ Body:
             MaxValue: 5
             Chance: 100
   - Id: 11
-    Group: AS_WEAPON_5
+    Group: AS_WEAPON_5  # One-handed spear, Two-handed spear, Two-handed sword, Katar, Knuckle
     Slots:
       - Slot: 1
         Options:

+ 553 - 26
db/re/mob_db.yml

@@ -81935,32 +81935,559 @@ Body:
 #    AegisName: WATERMELON_49
 #  - Id: 3472
 #    AegisName: WATERMELON_50
-#  - Id: 3473
-#    AegisName: AS_RAGGED_GOLEM
-#  - Id: 3474
-#    AegisName: AS_BLOODY_KNIGHT
-#  - Id: 3475
-#    AegisName: AS_WIND_GHOST
-#  - Id: 3476
-#    AegisName: AS_ZOMBIE
-#  - Id: 3477
-#    AegisName: AS_IMMORTAL_CORPS
-#  - Id: 3478
-#    AegisName: AS_ZOMBIE_SLAUGHTER
-#  - Id: 3479
-#    AegisName: AS_ZOMBIE_MASTER
-#  - Id: 3480
-#    AegisName: AS_CURSED_SOLDIER
-#  - Id: 3481
-#    AegisName: AS_EVIL_SHADOW1
-#  - Id: 3482
-#    AegisName: AS_EVIL_SHADOW2
-#  - Id: 3483
-#    AegisName: AS_EVIL_SHADOW3
-#  - Id: 3484
-#    AegisName: AS_D_RAGGED_GOLEM
-#  - Id: 3485
-#    AegisName: AS_D_CURSED_SOLDIER
+  - Id: 3473
+    AegisName: AS_RAGGED_GOLEM
+    Name: Stefan.J.E.Wolf
+    Level: 160
+    Hp: 20000000
+    BaseExp: 96453
+    JobExp: 109040
+    MvpExp: 5000
+    Attack: 8128
+    Attack2: 640
+    Defense: 146
+    MagicDefense: 30
+    Str: 248
+    Agi: 57
+    Vit: 16
+    Int: 59
+    Dex: 245
+    Luk: 43
+    AttackRange: 1
+    SkillRange: 14
+    ChaseRange: 16
+    Size: Large
+    Race: Undead
+    Element: Undead
+    ElementLevel: 1
+    WalkSpeed: 300
+    AttackDelay: 960
+    AttackMotion: 1632
+    DamageMotion: 480
+    Ai: 21
+    Class: Boss
+    Modes:
+      Mvp: true
+    MvpDrops:
+      - Item: Old_Blue_Box
+        Rate: 5000
+      - Item: Old_Violet_Box
+        Rate: 5000
+      - Item: Old_Card_Album
+        Rate: 2000
+    Drops:
+      - Item: Katar_170
+        Rate: 1
+      - Item: Two_Hand_Spear_170
+        Rate: 1
+      - Item: Staff_170
+        Rate: 1
+      - Item: Yggdrasilberry
+        Rate: 1000
+      - Item: Seed_Of_Yggdrasil
+        Rate: 2000
+      - Item: Oridecon
+        Rate: 3500
+        StealProtected: true
+      - Item: Elunium
+        Rate: 3500
+        StealProtected: true
+      - Item: As_Ragged_Golem_Card
+        Rate: 1
+        StealProtected: true
+  - Id: 3474
+    AegisName: AS_BLOODY_KNIGHT
+    Name: Immortal Cursed Knight
+    Level: 160
+    Hp: 10000000
+    BaseExp: 47986
+    JobExp: 46416
+    Attack: 4666
+    Attack2: 434
+    Defense: 178
+    MagicDefense: 48
+    Str: 193
+    Agi: 103
+    Vit: 102
+    Int: 83
+    Dex: 240
+    Luk: 65
+    AttackRange: 2
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Large
+    Race: Formless
+    Element: Dark
+    ElementLevel: 2
+    WalkSpeed: 250
+    AttackDelay: 768
+    AttackMotion: 528
+    DamageMotion: 288
+    Ai: 21
+    Class: Boss
+    Drops:
+      - Item: Two_Hand_Spear_170
+        Rate: 1
+      - Item: Old_Card_Album
+        Rate: 500
+      - Item: Yggdrasilberry
+        Rate: 1004
+      - Item: Seed_Of_Yggdrasil
+        Rate: 2005
+      - Item: Oridecon
+        Rate: 3245
+      - Item: Elunium
+        Rate: 3245
+        StealProtected: true
+      - Item: As_Bdy_Knight_Card
+        Rate: 1
+        StealProtected: true
+  - Id: 3475
+    AegisName: AS_WIND_GHOST
+    Name: Immortal Wind Ghost
+    Level: 160
+    Hp: 10000000
+    BaseExp: 47986
+    JobExp: 46416
+    Attack: 4666
+    Attack2: 1577
+    Defense: 136
+    MagicDefense: 72
+    Str: 131
+    Agi: 68
+    Vit: 53
+    Int: 116
+    Dex: 259
+    Luk: 42
+    AttackRange: 5
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Demon
+    Element: Wind
+    ElementLevel: 2
+    WalkSpeed: 150
+    AttackDelay: 2112
+    AttackMotion: 1152
+    DamageMotion: 672
+    Ai: 21
+    Class: Boss
+    Drops:
+      - Item: Staff_170
+        Rate: 1
+      - Item: Old_Card_Album
+        Rate: 500
+      - Item: Yggdrasilberry
+        Rate: 1004
+      - Item: Seed_Of_Yggdrasil
+        Rate: 2005
+      - Item: Oridecon
+        Rate: 3245
+      - Item: Elunium
+        Rate: 3245
+        StealProtected: true
+      - Item: As_Wind_Ghost_Card
+        Rate: 1
+        StealProtected: true
+  - Id: 3476
+    AegisName: AS_ZOMBIE
+    Name: Immortal Zombie Soldier
+    Level: 160
+    Hp: 405694
+    Attack: 2446
+    Attack2: 3669
+    Defense: 188
+    MagicDefense: 28
+    Str: 141
+    Agi: 90
+    Vit: 160
+    Dex: 169
+    AttackRange: 1
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Undead
+    Element: Undead
+    ElementLevel: 1
+    WalkSpeed: 400
+    AttackDelay: 2612
+    AttackMotion: 912
+    DamageMotion: 288
+    Ai: 09
+  - Id: 3477
+    AegisName: AS_IMMORTAL_CORPS
+    Name: Immortal Fortress Legio
+    Level: 160
+    Hp: 405694
+    BaseExp: 15464
+    JobExp: 12888
+    Attack: 2446
+    Attack2: 1546
+    Defense: 150
+    MagicDefense: 83
+    Str: 165
+    Agi: 90
+    Vit: 95
+    Int: 75
+    Dex: 180
+    Luk: 50
+    AttackRange: 1
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Demon
+    Element: Undead
+    ElementLevel: 1
+    WalkSpeed: 150
+    AttackDelay: 1500
+    AttackMotion: 600
+    DamageMotion: 500
+    Ai: 09
+    Drops:
+      - Item: Sinister_Dagger
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_4
+      - Item: Sinister_Saber
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_3
+      - Item: Sinister_Twohand_Sword
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_5
+      - Item: Sinister_Spear
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_5
+      - Item: Sinister_Lance
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_5
+  - Id: 3478
+    AegisName: AS_ZOMBIE_SLAUGHTER
+    Name: Sky Fortress Key Keeper
+    Level: 160
+    Hp: 423332
+    BaseExp: 15464
+    JobExp: 12888
+    Attack: 2446
+    Attack2: 292
+    Defense: 129
+    MagicDefense: 58
+    Str: 150
+    Agi: 88
+    Vit: 105
+    Int: 16
+    Dex: 210
+    Luk: 27
+    AttackRange: 1
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Undead
+    Element: Undead
+    ElementLevel: 2
+    WalkSpeed: 200
+    AttackDelay: 676
+    AttackMotion: 648
+    DamageMotion: 432
+    Ai: 09
+    Modes:
+      Detector: true
+    Drops:
+      - Item: Air_Stronghold_Key
+        Rate: 10000
+        StealProtected: true
+  - Id: 3479
+    AegisName: AS_ZOMBIE_MASTER
+    Name: Immortal Zombie Assault
+    Level: 160
+    Hp: 405694
+    BaseExp: 15464
+    JobExp: 12888
+    Attack: 2446
+    Attack2: 430
+    Defense: 104
+    MagicDefense: 61
+    Str: 73
+    Agi: 96
+    Vit: 64
+    Int: 65
+    Dex: 138
+    Luk: 64
+    AttackRange: 1
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Undead
+    Element: Undead
+    ElementLevel: 1
+    WalkSpeed: 175
+    AttackDelay: 2612
+    AttackMotion: 912
+    DamageMotion: 288
+    Ai: 09
+    Drops:
+      - Item: Sinister_Book
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_4
+      - Item: Sinister_Katar
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_5
+      - Item: Sinister_Huuma
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_4
+      - Item: Sinister_Twohand_Axe
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_3
+      - Item: Sinister_Mace
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_3
+      - Item: Sinister_Fist
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_5
+  - Id: 3480
+    AegisName: AS_CURSED_SOLDIER
+    Name: Immortal Cursed Zombie
+    Level: 160
+    Hp: 405694
+    BaseExp: 15464
+    JobExp: 12888
+    Attack: 2446
+    Attack2: 1
+    Defense: 123
+    MagicDefense: 50
+    Str: 117
+    Agi: 86
+    Vit: 93
+    Int: 81
+    Dex: 309
+    Luk: 33
+    AttackRange: 9
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Undead
+    Element: Undead
+    ElementLevel: 1
+    WalkSpeed: 150
+    AttackDelay: 1960
+    AttackMotion: 576
+    DamageMotion: 420
+    Ai: 09
+    Drops:
+      - Item: Sinister_Staff
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_1
+      - Item: Sinister_Rod
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_1
+      - Item: Sinister_Revolver
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_2
+      - Item: Sinister_Wire
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_2
+      - Item: Sinister_Viollin
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_2
+      - Item: Sinister_Bow
+        Rate: 20
+        RandomOptionGroup: AS_WEAPON_2
+  - Id: 3481
+    AegisName: AS_EVIL_SHADOW1
+    Name: Immortal Nightmare Shadow
+    Level: 160
+    Hp: 423330
+    BaseExp: 14059
+    JobExp: 13590
+    Attack: 2446
+    Attack2: 498
+    Defense: 34
+    MagicDefense: 34
+    Str: 102
+    Agi: 61
+    Vit: 102
+    Int: 24
+    Dex: 132
+    Luk: 51
+    AttackRange: 1
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Large
+    Race: Demon
+    Element: Dark
+    ElementLevel: 1
+    WalkSpeed: 200
+    AttackDelay: 1500
+    AttackMotion: 600
+    DamageMotion: 500
+    Ai: 09
+    Drops:
+      - Item: Sinister_Book
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_4
+      - Item: Sinister_Katar
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_5
+      - Item: Sinister_Huuma
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_4
+      - Item: Sinister_Twohand_Axe
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_3
+      - Item: Sinister_Mace
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_3
+      - Item: Sinister_Fist
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_5
+  - Id: 3482
+    AegisName: AS_EVIL_SHADOW2
+    Name: Immortal Angry Shadow
+    Level: 160
+    Hp: 388054
+    BaseExp: 14059
+    JobExp: 13590
+    Attack: 2202
+    Attack2: 1033
+    Defense: 137
+    MagicDefense: 40
+    Str: 68
+    Agi: 139
+    Vit: 51
+    Int: 39
+    Dex: 234
+    Luk: 17
+    AttackRange: 1
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Demon
+    Element: Dark
+    ElementLevel: 1
+    WalkSpeed: 200
+    AttackDelay: 1000
+    AttackMotion: 500
+    DamageMotion: 600
+    Ai: 09
+    Drops:
+      - Item: Sinister_Staff
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_1
+      - Item: Sinister_Rod
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_1
+      - Item: Sinister_Revolver
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_2
+      - Item: Sinister_Wire
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_2
+      - Item: Sinister_Viollin
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_2
+      - Item: Sinister_Bow
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_2
+  - Id: 3483
+    AegisName: AS_EVIL_SHADOW3
+    Name: Immortal Death Shadow
+    Level: 160
+    Hp: 423330
+    BaseExp: 14059
+    JobExp: 13590
+    Attack: 2446
+    Attack2: 106
+    Defense: 100
+    MagicDefense: 49
+    Str: 135
+    Agi: 117
+    Vit: 74
+    Int: 37
+    Dex: 142
+    Luk: 30
+    AttackRange: 1
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Large
+    Race: Demon
+    Element: Dark
+    ElementLevel: 1
+    WalkSpeed: 200
+    AttackDelay: 1800
+    AttackMotion: 780
+    DamageMotion: 480
+    Ai: 09
+    Drops:
+      - Item: Sinister_Dagger
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_4
+      - Item: Sinister_Saber
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_3
+      - Item: Sinister_Twohand_Sword
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_5
+      - Item: Sinister_Spear
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_5
+      - Item: Sinister_Lance
+        Rate: 30
+        RandomOptionGroup: AS_WEAPON_5
+  - Id: 3484
+    AegisName: AS_D_RAGGED_GOLEM
+    Name: Stefan.J.E.Wolf
+    Level: 160
+    Hp: 20000000
+    Attack: 8128
+    Attack2: 640
+    Defense: 146
+    MagicDefense: 30
+    Str: 248
+    Agi: 57
+    Vit: 16
+    Int: 59
+    Dex: 245
+    Luk: 43
+    AttackRange: 1
+    SkillRange: 14
+    ChaseRange: 16
+    Size: Large
+    Race: Undead
+    Element: Undead
+    ElementLevel: 2
+    WalkSpeed: 300
+    AttackDelay: 960
+    AttackMotion: 1632
+    DamageMotion: 480
+    Ai: 21
+    Class: Boss
+    Modes:
+      Mvp: true
+  - Id: 3485
+    AegisName: AS_D_CURSED_SOLDIER
+    Name: Cursed Soldier of Bijou
+    Level: 160
+    Hp: 405694
+    Attack: 2446
+    Attack2: 1
+    Defense: 123
+    MagicDefense: 50
+    Str: 117
+    Agi: 86
+    Vit: 93
+    Int: 81
+    Dex: 309
+    Luk: 33
+    AttackRange: 9
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Undead
+    Element: Undead
+    ElementLevel: 1
+    WalkSpeed: 150
+    AttackDelay: 1960
+    AttackMotion: 576
+    DamageMotion: 420
+    Ai: 09
 #  - Id: 3486
 #    AegisName: E_WILD_RABBIT
   - Id: 3487

+ 39 - 0
db/re/mob_skill_db.txt

@@ -11925,6 +11925,45 @@
 3254,T_W_O@NPC_WIDESOULDRAIN,attack,680,10,10000,0,60000,no,self,always,0,,,,,,,
 3254,T_W_O@NPC_CRITICALWOUND,attack,673,5,1500,500,45000,no,target,always,,,,,,,,
 
+// Sky Fortress Invasion Instance
+3473,AS_RAGGED_GOLEM@NPC_ELECTRICWALK,attack,744,5,2000,0,5000,yes,self,always,,,,,,,,
+3473,AS_RAGGED_GOLEM@NPC_FIREWALK,attack,745,5,2000,0,5000,yes,self,always,,,,,,,,
+3473,AS_RAGGED_GOLEM@NPC_HALLUCINATIONWALK,attack,743,5,10000,800,500000,yes,self,always,,,,,,,,
+3473,AS_RAGGED_GOLEM@NPC_HALLUCINATIONWALK,chase,743,5,10000,800,500000,yes,self,always,,,,,,,,
+3474,AS_BLOODY_KNIGHT@NPC_PHANTOMTHRUST,attack,741,5,2000,1000,5000,no,target,always,,,,,,,,
+3474,AS_BLOODY_KNIGHT@NPC_IGNITIONBREAK,attack,740,5,1000,3000,5000,no,self,always,,,,,,,,
+3475,AS_WIND_GHOST@NPC_CLOUD_KILL,chase,739,5,10000,0,5000,yes,target,always,,,,,,,,
+3475,AS_WIND_GHOST@NPC_CLOUD_KILL,attack,739,5,2000,0,5000,yes,target,always,,,,,,,,
+3475,AS_WIND_GHOST@NPC_POISON_BUSTER,attack,742,2,1000,1000,5000,no,target,always,,,,,,,,
+3475,AS_WIND_GHOST@NPC_EMOTION,idle,197,1,2000,0,5000,yes,self,always,,,,,,,29,
+3475,AS_WIND_GHOST@HT_SHOCKWAVE,idle,118,5,500,0,300000,yes,target,always,,,,,,,29,
+3476,AS_ZOMBIE@NPC_POISON,attack,176,1,500,800,5000,no,target,always,,,,,,,,
+3476,AS_ZOMBIE@NPC_POISON,angry,176,1,500,800,5000,no,target,always,,,,,,,,
+3476,AS_ZOMBIE@NPC_UNDEADATTACK,attack,347,1,2000,0,5000,yes,target,always,,,,,,,,
+3476,AS_ZOMBIE@NPC_UNDEADATTACK,angry,347,1,2000,0,5000,yes,target,always,,,,,,,,
+3478,AS_ZOMBIE_SLAUGHTER@NPC_BLINDATTACK,attack,177,5,500,0,5000,yes,target,always,,,,,,,,
+3478,AS_ZOMBIE_SLAUGHTER@NPC_POISON,attack,176,5,500,800,5000,yes,target,always,,,,,,,,
+3478,AS_ZOMBIE_SLAUGHTER@AS_SONICBLOW,attack,136,5,1000,800,5000,yes,target,always,,,,,,,,
+3478,AS_ZOMBIE_SLAUGHTER@NPC_COMBOATTACK,attack,171,1,500,700,5000,yes,target,always,,,,,,,,
+3479,AS_ZOMBIE_MASTER@KN_BRANDISHSPEAR,attack,57,5,500,1000,5000,no,target,always,,,,,,,,
+3479,AS_ZOMBIE_MASTER@NPC_POISON,attack,176,3,500,800,5000,no,target,always,,,,,,,,
+3479,AS_ZOMBIE_MASTER@NPC_UNDEADATTACK,attack,347,3,2000,0,5000,yes,target,always,,,,,,,,
+3479,AS_ZOMBIE_MASTER@NPC_UNDEADATTACK,angry,347,1,2000,0,5000,yes,target,always,,,,,,,,
+3480,AS_CURSED_SOLDIER@NPC_BLINDATTACK,attack,177,5,500,0,5000,yes,target,always,,,,,,,,
+3480,AS_CURSED_SOLDIER@AC_DOUBLE,attack,46,5,500,0,5000,yes,target,always,,,,,,,,
+3480,AS_CURSED_SOLDIER@NPC_MAGICALATTACK,attack,192,1,500,800,5000,no,target,always,,,,,,,,
+3480,AS_CURSED_SOLDIER@AC_SHOWER,attack,47,3,500,0,5000,yes,target,always,,,,,,,,
+3481,AS_EVIL_SHADOW1@NPC_PIERCINGATT,chase,158,1,4000,0,5000,no,target,always,,,,,,,,
+3481,AS_EVIL_SHADOW1@NPC_CURSEATTACK,attack,181,5,3500,0,20000,no,target,always,,,,,,,,
+3482,AS_EVIL_SHADOW2@NPC_DARKSTRIKE,attack,340,1,3000,0,5000,no,target,always,,,,,,,,
+3483,AS_EVIL_SHADOW3@NPC_CRITICALSLASH,chase,170,1,3000,0,5000,no,target,always,,,,,,,,
+3483,AS_EVIL_SHADOW3@NPC_PETRIFYATTACK,attack,180,5,3500,0,5000,no,target,always,,,,,,,,
+3485,AS_D_CURSED_SOLDIER@NPC_BLINDATTACK,attack,177,5,500,0,5000,yes,target,always,,,,,,,,
+3485,AS_D_CURSED_SOLDIER@AC_DOUBLE,attack,46,5,500,0,5000,yes,target,always,,,,,,,,
+3485,AS_D_CURSED_SOLDIER@NPC_MAGICALATTACK,attack,192,1,500,800,5000,no,target,always,,,,,,,,
+3485,AS_D_CURSED_SOLDIER@AC_SHOWER,attack,47,3,500,0,5000,yes,target,always,,,,,,,,
+
+
 3505,DR_BIG_EGGRING@NPC_SUMMONSLAVE,attack,196,4,10000,2000,10000,no,self,slavele,3,3508,,,,,,
 3505,DR_BIG_EGGRING@NPC_SUMMONSLAVE,idle,196,4,10000,2000,10000,no,self,slavele,3,3508,,,,,,
 

+ 10 - 0
db/re/quest_db.yml

@@ -5262,6 +5262,16 @@ Body:
   - Id: 9319
     Title: Pursuing Hiding Morocc Continues
     TimeLimit: +23h
+  - Id: 9418
+    Title: Attack Sky Fortress Invading Prontera
+    Targets:
+      - Mob: AS_RAGGED_GOLEM
+        Count: 1
+  - Id: 9419
+    Title: Attack Sky Fortress Invading Prontera
+    TimeLimit: 2d 12h
+  - Id: 9427
+    Title: Clearing the Sky Fortress for the Same Time
   - Id: 9335
     Title: Search for shards of Gigantes
   - Id: 9336

+ 174 - 0
db/re/skill_db.yml

@@ -17003,6 +17003,180 @@ Body:
       - Level: 10
         Area: 5
     CastCancel: true
+  - Id: 739
+    Name: NPC_CLOUD_KILL
+    Description: Cloud Kill
+    MaxLevel: 5
+    Type: Magic
+    TargetType: Ground
+    Range: 9
+    Flags:
+      IsNpc: true
+      ShowScale: true
+    Hit: Single
+    HitCount: 1
+    Element: Poison
+    CastCancel: true
+    Duration1:
+      - Level: 1
+        Time: 8000
+      - Level: 2
+        Time: 10000
+      - Level: 3
+        Time: 12000
+      - Level: 4
+        Time: 14000
+      - Level: 5
+        Time: 16000
+    Unit:
+      Id: Cloud_Kill
+      Range:
+        - Level: 1
+          Size: 1
+        - Level: 2
+          Size: 2
+        - Level: 3
+          Size: 3
+        - Level: 4
+          Size: 3
+        - Level: 5
+          Size: 3
+      Interval: 500
+      Target: Enemy
+      Flag:
+        PathCheck: true
+        RemovedByFireRain: true
+  - Id: 740
+    Name: NPC_IGNITIONBREAK
+    Description: Ignition Break
+    MaxLevel: 5
+    Type: Weapon
+    TargetType: Self
+    DamageFlags:
+      Splash: true
+    Flags:
+      IsNpc: true
+      ShowScale: true
+    Hit: Single
+    HitCount: 1
+    Element: Fire
+    SplashArea: 5
+  - Id: 741
+    Name: NPC_PHANTOMTHRUST
+    Description: Phantom Thrust
+    MaxLevel: 5
+    Type: Weapon
+    TargetType: Attack
+    Flags:
+      IsNpc: true
+    Range:
+      - Level: 1
+        Size: 7
+      - Level: 2
+        Size: 9
+      - Level: 3
+        Size: 11
+      - Level: 4
+        Size: 13
+      - Level: 5
+        Size: 15
+    Hit: Single
+    HitCount: 1
+    Element: Neutral
+    CastCancel: true
+  - Id: 742
+    Name: NPC_POISON_BUSTER
+    Description: Poison Buster
+    MaxLevel: 2
+    Type: Magic
+    TargetType: Attack
+    Flags:
+      IsNpc: true
+    DamageFlags:
+      Splash: true
+    Range: 9
+    Hit: Single
+    HitCount: 1
+    Element: Poison
+    CastCancel: true
+    SplashArea: 1
+  - Id: 743
+    Name: NPC_HALLUCINATIONWALK
+    Description: Hallucination Walk
+    MaxLevel: 5
+    TargetType: Self
+    Flags:
+      IsNpc: true
+    DamageFlags:
+      NoDamage: true
+    Hit: Single
+    HitCount: 1
+    CastCancel: true
+    Duration1: 20000
+  - Id: 744
+    Name: NPC_ELECTRICWALK
+    Description: Electric Walk
+    MaxLevel: 5
+    Type: Magic
+    TargetType: Self
+    Flags:
+      IgnoreHovering: true
+      IsNpc: true
+    Hit: Single
+    HitCount: 1
+    Element: Wind
+    ActiveInstance:
+      - Level: 1
+        Max: 8
+      - Level: 2
+        Max: 10
+      - Level: 3
+        Max: 12
+      - Level: 4
+        Max: 14
+      - Level: 5
+        Max: 16
+    CastCancel: true
+    Duration1: 12000
+    Unit:
+      Id: Electricwalk
+      Interval: 1000
+      Target: Enemy
+      Flag:
+        NoReiteration: true
+        NoOverlap: true
+  - Id: 745
+    Name: NPC_FIREWALK
+    Description: Fire Walk
+    MaxLevel: 5
+    Type: Magic
+    TargetType: Self
+    Flags:
+      IgnoreHovering: true
+      IsNpc: true
+    Hit: Single
+    HitCount: 1
+    Element: Fire
+    ActiveInstance:
+      - Level: 1
+        Max: 8
+      - Level: 2
+        Max: 10
+      - Level: 3
+        Max: 12
+      - Level: 4
+        Max: 14
+      - Level: 5
+        Max: 16
+    CastCancel: true
+    Duration1: 12000
+    Unit:
+      Id: Firewalk
+      Interval: 1000
+      Target: Enemy
+      Flag:
+        NoReiteration: true
+        NoOverlap: true
   - Id: 1001
     Name: KN_CHARGEATK
     Description: Charge Attack

+ 2070 - 0
npc/re/instances/SkyFortress.txt

@@ -0,0 +1,2070 @@
+//===== rAthena Script =======================================
+//= Sky Fortress Invasion
+//===== Description: =========================================
+//= [Official Conversion]
+//= Sky Fortress Invasion Instance
+//===== Changelogs: ==========================================
+//= 1.0 First version. [Capuche]
+//============================================================
+
+prt_q,249,82,2	script	Han#a1	8W_SOLDIER,{
+	mes "[Han]";
+	mes "There must be a ton of monsters";
+	mes "attacking the center of Prontera.";
+	mes "***";
+	next;
+	mes "[Han]";
+	mes "My family...My friends...";
+	mes "They're all there...";
+	mes "I must protect them...";
+	mes "But...I have an even more important";
+	mes "job to do here...";
+	next;
+	mes "[Han]";
+	mes "I, scientist Doyeon, can do it.";
+	mes "I can obliterate that dirty source place,";
+	mes "ceaselessly spawning the monsters...";
+	mes "That's why I'm protecting him.";
+	mes "***";
+	next;
+	mes "[Han]";
+	mes "Protecting him and destroying this fortress";
+	mes "is what ultimately protects my family";
+	mes "and friends.";
+	close;
+}
+
+prt_q,252,79,4	script	Doek#a1	8W_SOLDIER,{
+	mes "[Doek]";
+	mes "Can this scientist you're seeing here";
+	mes "really protect Prontera?";
+	mes "Can she?";
+	mes "Do you believe so?";
+	next;
+	mes "[Doek]";
+	mes "Honestly, I don't...";
+	mes "But...";
+	next;
+	mes "[Doek]";
+	mes "All my loved ones were...";
+	mes "...by those monsters....";
+	next;
+	mes "[Doek]";
+	mes "This is the last hope I can have...";
+	mes "This is the last.";
+	mes "So please help me.";
+	mes "Help Doyeon...";
+	next;
+	mes "- And then, she remained silent -";
+	mes "- for quite a while. -";
+	close;
+}
+
+prt_q,249,79,4	script	Scientist Doyeon#a1	4_M_MAYOR,{
+	if (!checkweight(2104,2)) {
+		mes "- It's full of items";
+		mes "so you can't proceed to conversation. -";
+		close;
+	}
+	if (BaseLevel < 145) {
+		mes "- You should be level 145 or higher";
+		mes "to proceed. -";
+		close;
+	}
+	switch( checkquest(9419,PLAYTIME) ) {
+	case -1:
+		if (is_party_leader() == false) {
+			callsub S_Info;
+			close;
+		}
+		if (isbegin_quest(9418) == 0) {// first entrance
+			.@party_name$ = getpartyname(getcharid(1));
+			mes "[Scientist Doyeon]";
+			mes "I'm a scientist";
+			mes "living in Prontera.";
+			mes "I'm just an ordinary scientist";
+			mes "teaching children and doing research.";
+			mes "And then...things came up";
+			mes "in Prontera all of a sudden....";
+			while(true) {
+				next;
+				switch( select( "About Sky Fortress", "Enter the Sky Fortress.", "End the dialogue." ) ) {
+				case 1:
+					callsub S_Info;
+					break;
+				case 2:
+					mes "[Scientist Doyeon]";
+					mes "I think I can open the warp,";
+					mes "at least for once, with the magic";
+					mes "that I've been collecting so hard.";
+					mes "I hope you would help me";
+					mes "destroy the fortress and";
+					mes "get back our Prontera.";
+					next;
+					if (select( "No", "Yes" ) == 1) {
+						mes "[Scientist Doyeon]";
+						mes "Come back";
+						mes "if you change your mind...";
+						mes "Just know that time is running out...";
+						break;
+					}
+					mes "[Scientist Doyeon]";
+					mes "There! I opened the warp";
+					mes "to the Sky Fortress!";
+					mes "The warp will be activated";
+					mes "only for a limited period of time.";
+					mes "Step inside it, quick!";
+					if (instance_create("Sky Fortress Invasion") < 0) {
+						mes "Party Name: " + .@party_name$;
+						mes "Party Leader: " + strcharinfo(0);
+						mes "^0000ffSky Fortress Invasion ^000000- Reservation Failed!";
+						close;
+					}
+					close;
+				case 3:
+					mes "[Scientist Doyeon]";
+					mes "I'm so worried about";
+					mes "the future of Prontera...";
+					mes "It appears this fortress";
+					mes "must be the source of all evil...";
+					close;
+				}
+			}
+		}
+		mes "You're back unscathed.";
+		mes "So...whatever happened";
+		mes "inside?";
+		next;
+		mes "- I told her everything that";
+		mes "happened inside the Sky Fortress. -";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "How could that be...";
+		mes "Still, I think we have every reason to remain hopeful";
+		mes "for eliminating that huge Golem";
+		mes "in the Sky Fortress.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "Still, those filthy monsters";
+		mes "keep spawning in Prontera.";
+		mes "So I think what we've done";
+		mes "must not be enough.";
+		mes "***";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "To operate the warp,";
+		mes "a lot of magic is required.";
+		mes "Bring me the item called the -Dungeon Pass-,";
+		mes "or I need about";
+		mes "three days to collect magic.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "I hope you'd enter the Sky Fortress";
+		mes "and help us save";
+		mes "Prontera.";
+		completequest 9418;// Attack Sky Fortress Invading Prontera
+		setquest 9419;// Attack Sky Fortress Invading Prontera
+		if (isbegin_quest(9427) == 0) {
+			setquest 9427;// Clearing the Sky Fortress for the Same Time
+			completequest 9427;
+			rentitem 14505,3600;// Sky Fortress Ticket
+		}
+		close;
+	case 0:
+	case 1:
+		mes "[Scientist Doyeon]";
+		mes "To operate the warp,";
+		mes "a lot of magic is required.";
+		mes "Bring me the item called the -Dungeon Pass-,";
+		mes "or I need about";
+		mes "three days to collect magic.";
+		next;
+		if (is_party_leader() == true) {
+			.@party_name$ = getpartyname(getcharid(1));
+			if (select( "End the dialogue.", "Show the -Dungeon Pass-." ) == 2) {
+				if (rentalcountitem(14505) < 1 && rentalcountitem(14506) < 1) {// Sky Fortress Ticket
+					mes "[Scientist Doyeon]";
+					mes "I don't think this works";
+					mes "without the -Dungeon Pass-.";
+					mes "I can't open the warp without it.";
+					close;
+				}
+				mes "[Scientist Doyeon]";
+				mes "Oh! Where did you";
+				mes "get the -Dungeon Pass-?";
+				mes "With this item,";
+				mes "I can pretty much open the warp.";
+				next;
+				if (select( "End the dialogue.", "Activate the warp." ) == 1) {
+					mes "[Scientist Doyeon]";
+					mes "Are you not going";
+					mes "to help Prontera?";
+					close;
+				}
+				mes "[Scientist Doyeon]";
+				mes "There! I opened the warp";
+				mes "to the Sky Fortress!";
+				mes "The warp will be activated";
+				mes "only for a limited period of time.";
+				mes "Step inside it, quick!";
+				if (instance_create("Sky Fortress Invasion") < 0) {
+					mes "Party Name: " + .@party_name$;
+					mes "Party Leader: " + strcharinfo(0);
+					mes "^0000ffSky Fortress Invasion ^000000- Reservation Failed!";
+					close;
+				}
+				close;
+			}
+		}
+		mes "[Scientist Doyeon]";
+		mes "I hope you'd enter the Sky Fortress";
+		mes "and help us save";
+		mes "Prontera.";
+		close;
+	case 2:
+		mes "[Scientist Doyeon]";
+		mes "You've come back! You didn't get away!";
+		mes "Thanks so much!";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "But still...";
+		mes "A ton of undead monsters kept swarming about";
+		mes "from that entrance seen behind me";
+		mes "as if the sap monster spits out the sap.";
+		mes "They kept coming out";
+		mes "no matter how many were killed.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "I suppose the monsters are being made up";
+		mes "inside the fortress.";
+		mes "My guess is that if we can defeat their ringleader in the fortress,";
+		mes "the monsters will go away";
+		mes "and Prontera will become stabilized.";
+		mes "***";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "I think I can open the warp,";
+		mes "at least for once, with the magic";
+		mes "that I've been collecting so hard.";
+		mes "I hope you would help me";
+		mes "destroy the fortress and";
+		mes "get back our Prontera.";
+		if (is_party_leader() == true) {
+			.@party_name$ = getpartyname(getcharid(1));
+			next;
+			if (select( "No", "Yes" ) == 1) {
+				mes "[Scientist Doyeon]";
+				mes "Come back";
+				mes "if you change your mind...";
+				mes "Just know that time is running out...";
+				close;
+			}
+			mes "[Scientist Doyeon]";
+			mes "There! I opened the warp";
+			mes "to the Sky Fortress!";
+			mes "The warp will be activated";
+			mes "only for a limited period of time.";
+			mes "Step inside it, quick!";
+			if (instance_create("Sky Fortress Invasion") < 0) {
+				mes "Party Name: " + .@party_name$;
+				mes "Party Leader: " + strcharinfo(0);
+				mes "^0000ffSky Fortress Invasion ^000000- Reservation Failed!";
+				close;
+			}
+		}
+		close;
+	}
+	end;
+
+S_Info:
+	mes "[Scientist Doyeon]";
+	mes "I'm a scientist";
+	mes "living in Prontera.";
+	mes "I'm just an ordinary scientist";
+	mes "teaching children and doing research.";
+	next;
+	mes "[Scientist Doyeon]";
+	mes "But now...the life at least as I know it";
+	mes "has become shattered.";
+	next;
+	mes "[Scientist Doyeon]";
+	mes "Thanks to this fortress";
+	mes "looking like a huge trash can,";
+	mes "our village has turned into a trash heap";
+	mes "that doesn't even decay.";
+	next;
+	mes "[Scientist Doyeon]";
+	mes "Buildings fall down,";
+	mes "people keep dying out...";
+	mes "I have to wonder what the nobility and soldiers at the Prontera Palace";
+	mes "are up to when things are like this.";
+	next;
+	mes "[Scientist Doyeon]";
+	mes "A ton of undead monsters kept swarming about";
+	mes "from that entrance seen behind me";
+	mes "as if the sap monster spits out the sap.";
+	mes "They kept coming out";
+	mes "no matter how many were killed.";
+	next;
+	mes "[Scientist Doyeon]";
+	mes "I suppose the monsters are being made up";
+	mes "inside the fortress.";
+	mes "My guess is that if we can defeat their ringleader in the fortress,";
+	mes "the monsters will get away";
+	mes "and Prontera will become stabilized.";
+	mes "***";
+	next;
+	mes "[Scientist Doyeon]";
+	mes "So I really wanted to enter the fortress";
+	mes "but couldn't find any entrance.";
+	mes "I studied day and night";
+	mes "and finally located it.";
+	next;
+	mes "[Scientist Doyeon]";
+	mes "To enter the fortress,";
+	mes "the warp should be activated.";
+	mes "To do so, a lot of magic";
+	mes "is indispensable!";
+	next;
+	mes "[Scientist Doyeon]";
+	mes "And then...I've been preparing";
+	mes "a lot of magic necessary for the warp.";
+	mes "Now I could use a warrior";
+	mes "who can shatter the fortress";
+	mes "and bring peace to Prontera.";
+	return;
+}
+
+prt_q,243,75,3	script	Fortress Entry Warp Portal#1	PORTAL,{
+	if (BaseLevel < 145) {
+		mes "- You should be level 145 or higher";
+		mes "to proceed. -";
+		close;
+	}
+	if (checkquest(9419,PLAYTIME) == 2 || (checkquest(9419,PLAYTIME) == -1 && isbegin_quest(9418) != 1)) {
+		setarray .@menu$[0], "Don't step into the warp.", "Step into the warp.";
+		.@type = 1;
+	}
+	else {
+		mes "- The warp doesn't seem to work.";
+		mes "You can't seem to enter... -";
+		next;
+		setarray .@menu$[0], "End the dialogue.", "", "Put the - Dungeon Pass - near to the warp.";
+	}
+	switch( select( .@menu$[0], .@menu$[1], .@menu$[2] ) ) {
+	case 1:
+		mes "- The warp is emanating bright lights. -";
+		close;
+	case 2:
+		break;
+	case 3:
+		if (rentalcountitem(14505) < 1 && rentalcountitem(14506) < 1) {// Sky Fortress Ticket
+			mes "- You don't have -";
+			mes "- the Dungeon Pass. -";
+			close;
+		}
+		break;
+	}
+	.@md_name$ = "Sky Fortress Invasion";
+	switch( instance_enter(.@md_name$) ) {
+	case IE_OTHER:
+		mes "An unknown error occurred.";
+		close;
+	case IE_NOINSTANCE:
+		mes "Memorial Dungeon " + .@md_name$ + " doesn't exist.";
+		mes "Party leader hasn't created the Memorial Dungeon.";
+		close;
+	case IE_NOMEMBER:
+		mes "Only the party members may enter the Memorial Dungeon.";
+		close;
+	case IE_OK:
+		mapannounce "prt_q", "Party member " + strcharinfo(0) + " of party's " + getpartyname( getcharid(1) ) + " enters " + .@md_name$ + "", bc_map,0xFF99;
+		if (.@type == 1) {
+			if (isbegin_quest(9419) > 0)
+				erasequest 9419;
+			if (isbegin_quest(9418) > 0)
+				erasequest 9418;
+			setquest 9418;// Attack Sky Fortress Invading Prontera
+		}
+		fortress_entrance_loc = 0;	// warp back to prt_q on exit
+		// warp "1@sthb",54,67;
+		end;
+	}
+	end;
+
+OnInit:
+	while(true) {
+		sleep 10000;
+		specialeffect EF_ENHANCE;
+	}
+	end;
+}
+
+// Dali entrance
+dali02,115,61,3	script	Fortress Entry Warp Portal#2	PORTAL,{
+	if (BaseLevel < 145) {
+		mes "- You should be level 145 or higher";
+		mes "to proceed. -";
+		close;
+	}
+	mes "- The warp doesn't seem to work.";
+	mes "You can't seem to enter. -";
+	next;
+	if (select( "End the dialogue.", "Put the - Dungeon Pass - near to the warp." ) == 1) {
+		mes "- The warp is emanating bright lights. -";
+		close;
+	}
+	if (rentalcountitem(14505) < 1 && rentalcountitem(14506) < 1) {// Sky Fortress Ticket
+		mes "- You don't have -";
+		mes "- the Dungeon Pass. -";
+		close;
+	}
+	.@md_name$ = "Sky Fortress Invasion";
+	switch( instance_enter(.@md_name$) ) {
+	case IE_OTHER:
+		mes "An unknown error occurred.";
+		close;
+	case IE_NOINSTANCE:
+		mes "Memorial Dungeon " + .@md_name$ + " doesn't exist.";
+		mes "Party leader hasn't created the Memorial Dungeon.";
+		close;
+	case IE_NOMEMBER:
+		mes "Only the party members may enter the Memorial Dungeon.";
+		close;
+	case IE_OK:
+		mapannounce "prt_q", "Party member " + strcharinfo(0) + " of party's " + getpartyname( getcharid(1) ) + " enters " + .@md_name$ + "", bc_map,0xFF99;
+		// warp "1@sthb",54,67;
+		fortress_entrance_loc = 1;	// warp back to dali02 on exit
+		// note: no quest change when using tickets
+		end;
+	}
+	end;
+
+OnInit:
+	while(true) {
+		sleep 10000;
+		specialeffect EF_ENHANCE;
+	}
+	end;
+}
+
+dali02,122,63,2	script	Scientist Doyeon#a2	4_M_MAYOR,{
+	if (!checkweight(2104,2)) {
+		mes "- It's full of items";
+		mes "so you can't proceed to conversation. -";
+		close;
+	}
+	if (BaseLevel < 145) {
+		mes "- You should be level 145 or higher";
+		mes "to proceed. -";
+		close;
+	}
+	if (is_party_leader() == false) {
+		mes "[Scientist Doyeon]";
+		mes "I'm a scientist";
+		mes "living in Prontera.";
+		mes "I'm just an ordinary scientist";
+		mes "teaching children and doing research.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "But now...my normal life";
+		mes "has become shattered.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "Thanks to this fortress";
+		mes "looking like a huge trash can,";
+		mes "our village has turned into a trash heap";
+		mes "that doesn't even decay.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "Buildings fall down,";
+		mes "people keep dying out...";
+		mes "I have to wonder what the nobility and soldiers at the Prontera Palace";
+		mes "are up to when things are like this.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "A ton of undead monsters kept swarming about";
+		mes "from that entrance seen behind me";
+		mes "as if the sap monster spits out the sap.";
+		mes "They kept coming out";
+		mes "no matter how many were killed.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "I suppose the monsters are being made up";
+		mes "inside the fortress.";
+		mes "My guess is that if we can defeat their ringleader in the fortress,";
+		mes "the monsters will go away";
+		mes "and Prontera will become stabilized.";
+		mes "***";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "So I really wanted to enter the fortress";
+		mes "but couldn't find any entrance.";
+		mes "I studied day and night";
+		mes "and finally located it.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "To enter the fortress,";
+		mes "the warp should be activated.";
+		mes "To do so,";
+		mes "the -Dungeon Pass-";
+		mes "is indispensable!";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "And then...I've been preparing";
+		mes "a lot of magic necessary for the warp.";
+		mes "Now I could use a warrior";
+		mes "who can shatter the fortress";
+		mes "and bring peace to Prontera.";
+		close;
+	}
+	.@party_name$ = getpartyname(getcharid(1));
+	mes "[Scientist Doyeon]";
+	mes "I'm a scientist";
+	mes "living in Prontera.";
+	mes "I teach children and perform research activities.";
+	mes "But it has become";
+	mes "so dangerous there,";
+	mes "so I moved in here.";
+	next;
+	switch( select( "About Sky Fortress", "Enter the Sky Fortress.", "End the dialogue." ) ) {
+	case 1:
+		mes "[Scientist Doyeon]";
+		mes "But now...my normal life";
+		mes "has become shattered.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "Thanks to this fortress";
+		mes "looking like a huge trash can,";
+		mes "our village has turned into a trash heap";
+		mes "that doesn't even decay.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "Buildings fall down,";
+		mes "people keep dying out...";
+		mes "I have to wonder what the nobility and soldiers at the Prontera Palace";
+		mes "are up to when things are like this.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "A ton of undead monsters kept swarming about";
+		mes "as if the sap monster spits out the sap.";
+		mes "They kept coming out";
+		mes "no matter how many were killed.";
+		mes "***";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "I suppose the monsters are being made up";
+		mes "inside the fortress.";
+		mes "My guess is that if we can defeat their ringleader in the fortress,";
+		mes "the monsters will go away";
+		mes "and Prontera will become stabilized.";
+		mes "***";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "So I wanted to enter the fortress";
+		mes "but couldn't find any entrance.";
+		mes "I studied day and night";
+		mes "and finally located it.";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "To enter the fortress,";
+		mes "the warp should be activated.";
+		mes "To do so, a lot of magic";
+		mes "is indispensable!";
+		next;
+		mes "[Scientist Doyeon]";
+		mes "And then...I've been preparing";
+		mes "a lot of magic necessary for the warp.";
+		mes "Now I could use a warrior";
+		mes "who can shatter the fortress";
+		mes "and bring peace to Prontera.";
+		mes "That's why I'm here.";
+		close;
+	case 2:
+		mes "[Scientist Doyeon]";
+		mes "To operate the warp,";
+		mes "a lot of magic is required.";
+		mes "Don't forget to bring me";
+		mes "the -Dungeon Pass-.";
+		mes "That's the only way to open";
+		mes "the warp to the Sky Fortress.";
+		next;
+		if (select( "End the dialogue.", "Show the -Dungeon Pass-." ) == 1) {
+			mes "[Scientist Doyeon]";
+			mes "Don't forget to bring me";
+			mes "the -Dungeon Pass-.";
+			mes "Enter the Sky Fortress";
+			mes "and help us save";
+			mes "the invaded Prontera.";
+			close;
+		}
+		if (rentalcountitem(14505) < 1 && rentalcountitem(14506) < 1) {// Sky Fortress Ticket
+			mes "[Scientist Doyeon]";
+			mes "I don't think this works";
+			mes "without the -Dungeon Pass-.";
+			mes "I can't open the warp without it.";
+			close;
+		}
+		mes "[Scientist Doyeon]";
+		mes "Oh! Where did you";
+		mes "get the -Dungeon Pass-?";
+		mes "This item is enough";
+		mes "to open the warp.";
+		next;
+		if (select( "End the dialogue.", "Activate the warp." ) == 1) {
+			mes "[Scientist Doyeon]";
+			mes "Are you not going";
+			mes "to help Prontera?";
+			close;
+		}
+		mes "[Scientist Doyeon]";
+		mes "There! I opened the warp";
+		mes "to the Sky Fortress!";
+		mes "The warp will be activated";
+		mes "only for a limited period of time.";
+		mes "Step inside it, quick!";
+		if (instance_create("Sky Fortress Invasion") < 0) {
+			mes "Party Name: " + .@party_name$;
+			mes "Party Leader: " + strcharinfo(0);
+			mes "^0000ffSky Fortress Invasion ^000000- Reservation Failed!";
+			close;
+		}
+		close;
+	case 3:
+		close;
+	}
+}
+
+// Warps
+1@sthb,73,71,0	warp2	#sthd_move_01_01	3,3,1@sthb,73,84
+1@sthb,93,77,0	warp2	#sthd_move_02_01	2,2,1@sthb,210,96
+1@sthb,190,54,0	warp2	#sthd_move_02_02	2,2,1@sthd,103,71
+
+// Main event - step 1
+1@sthb,64,67,4	script	Stefan.J.E.Wolf#sthd_01	4_AS_RAGGED_GOLEM,{
+	end;
+OnStart:
+	enablenpc instance_npcname("Stefan.J.E.Wolf#sthd_01");
+	initnpctimer;
+	end;
+OnTimer1000:
+	npctalk "Stefan: ~Grunts~";
+	end;
+OnTimer3000:
+	npctalk "Earnest: What a bunch of menacing worms...!";
+	end;
+OnTimer5000:
+	mapannounce 'sthb_map$, "Stefan Jack Earnest Wolf: Guard...the Sky Fortress...Immortal...beings...", bc_map,0xEBFF;
+	end;
+OnTimer6000:
+	donpcevent instance_npcname("#sthd_event_2") + "::OnStart";
+	end;
+OnTimer7000:
+	disablenpc instance_npcname("Stefan.J.E.Wolf#sthd_01");
+	stopnpctimer;
+	end;
+}
+
+1@sthb,64,67,4	duplicate(dummy_npc)	Stefan.J.E.Wolf#sthd_02	4_AS_RAGGED_GOLEM
+
+1@sthb,56,71,0	script	#sthd_event_1	HIDDEN_WARP_NPC,8,8,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_1");
+	.@stefan$ = instance_npcname("Stefan.J.E.Wolf#sthd_01");
+	setpcblock PCBLOCK_NPC, true;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : Is this what caused the invasion into Prontera? Inside the Sky Fortress?";
+	sleep2 2000;
+	enablenpc .@stefan$;
+	sleep2 2000;
+	cutin "stephan_j_e_w.bmp",2;
+	npctalk "Wolf: Trespassers... Sky Fortress...", .@stefan$;
+	specialeffect2 EF_LOCKON;
+	sleep2 2000;
+	npctalk "Jack: Bijou...told me...to impede the intruders...", .@stefan$;
+	sleep2 2000;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : What's that...huge lump?";
+	npctalk "Earnest: Little...human...Greenhorn...Away...", .@stefan$;
+	sleep2 2000;
+	setpcblock PCBLOCK_NPC, false;
+	cutin "",255;
+	specialeffect2 EF_LOCKON;
+	donpcevent instance_npcname("#sthd_event_1_boss") + "::OnStefanHp";
+	disablenpc .@stefan$;
+	end;
+}
+
+1@sthb,1,1,0	script	#sthd_event_1_boss	HIDDEN_WARP_NPC,{
+	end;
+OnStefanHp:
+	enablenpc instance_npcname("#sthd_event_1_boss");
+	monster 'sthb_map$,64,67, "Stefan.J.E.Wolf",3484,1, instance_npcname("#sthd_event_1_boss") + "::OnMobDead";	// AS_D_RAGGED_GOLEM
+	'boss_id = $@mobid[0];
+	initnpctimer;
+	end;
+OnTimer2000:
+	getunitdata 'boss_id, .@data;
+	if (.@data[UMOB_HP] >= 19000000)
+		end;
+	// fall through
+OnMobDead:
+	stopnpctimer;
+	killmonster 'sthb_map$, instance_npcname("#sthd_event_1_boss") + "::OnMobDead";
+	donpcevent instance_npcname("Stefan.J.E.Wolf#sthd_01") + "::OnStart";
+	disablenpc instance_npcname("#sthd_event_1_boss");
+	end;
+OnTimer3000:
+	initnpctimer;
+	end;
+}
+
+// 1@sthb,68,65,0	script	#sthd_event_2	HIDDEN_WARP_NPC,{	// official coord
+1@sthb,1,1,0	script	#sthd_event_2	HIDDEN_WARP_NPC,{
+	end;
+OnStart:
+	enablenpc instance_npcname("#sthd_event_2");
+	initnpctimer;
+	.@label$ = instance_npcname("#sthd_event_2") + "::OnMobDead";
+	monster 'sthb_map$,48,75,"Immortal Zombie Soldier",3476,1, .@label$;// AS_ZOMBIE
+	monster 'sthb_map$,56,75,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,63,74,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,63,67,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,63,61,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,56,60,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,48,60,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,48,67,"Immortal Zombie Soldier",3476,1, .@label$;
+	end;
+OnTimer3000:
+	if (mobcount( 'sthb_map$, instance_npcname("#sthd_event_2") + "::OnMobDead" ) > 0) {
+		initnpctimer;
+		end;
+	}
+	stopnpctimer;
+	disablenpc instance_npcname("#sthd_event_2");
+	donpcevent instance_npcname("#sthd_event_3") + "::OnStart";
+	end;
+OnMobDead:
+	end;
+}
+
+// 1@sthb,68,66,0	script	#sthd_event_3	HIDDEN_WARP_NPC,{	// official coord
+1@sthb,1,1,0	script	#sthd_event_3	HIDDEN_WARP_NPC,{
+	end;
+OnStart:
+	enablenpc instance_npcname("#sthd_event_3");
+	initnpctimer;
+	.@label$ = instance_npcname("#sthd_event_3") + "::OnMobDead";
+	monster 'sthb_map$,48,75,"Immortal Zombie Soldier",3476,1, .@label$;// AS_ZOMBIE
+	monster 'sthb_map$,56,75,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,63,74,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,63,67,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,63,61,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,56,60,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,48,60,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,48,67,"Immortal Zombie Soldier",3476,1, .@label$;
+	end;
+OnTimer3000:
+	if (mobcount( 'sthb_map$, instance_npcname("#sthd_event_3") + "::OnMobDead" ) > 0) {
+		initnpctimer;
+		end;
+	}
+	stopnpctimer;
+	disablenpc instance_npcname("#sthd_event_3");
+	donpcevent instance_npcname("#sthd_event_4") + "::OnStart";
+	end;
+OnMobDead:
+	end;
+}
+
+// 1@sthb,68,67,0	script	#sthd_event_4	HIDDEN_WARP_NPC,{	// official coord
+1@sthb,1,1,0	script	#sthd_event_4	HIDDEN_WARP_NPC,{
+	end;
+OnStart:
+	enablenpc instance_npcname("#sthd_event_4");
+	initnpctimer;
+	.@label$ = instance_npcname("#sthd_event_4") + "::OnMobDead";
+	monster 'sthb_map$,48,75,"Immortal Zombie Soldier",3476,1, .@label$;// AS_ZOMBIE
+	monster 'sthb_map$,56,75,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,63,74,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,63,67,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,63,61,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,56,60,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,48,60,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,48,67,"Immortal Zombie Soldier",3476,1, .@label$;
+	monster 'sthb_map$,56,79,"Sky Fortress Key Keeper",3478,1, .@label$;	// AS_ZOMBIE_SLAUGHTER
+	end;
+OnTimer3000:
+	if (mobcount( 'sthb_map$, instance_npcname("#sthd_event_4") + "::OnMobDead" ) > 0) {
+		initnpctimer;
+		end;
+	}
+	stopnpctimer;
+	disablenpc instance_npcname("#sthd_event_4");
+	enablenpc instance_npcname("#Stefan_Action1");
+	enablenpc instance_npcname("Stefan.J.E.Wolf#sthd_02");
+	end;
+OnMobDead:
+	end;
+}
+
+1@sthb,64,67,0	script	#Stefan_Action1	HIDDEN_WARP_NPC,8,8,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#Stefan_Action1");
+	setpcblock PCBLOCK_NPC, true;
+	sleep2 1000;
+	cutin "stephan_j_e_w.bmp",2;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : I believe that huge Golem is what plays an important role in the Sky Fortress.";
+	sleep2 2000;
+	npctalk "Wolf: Every subordinate at the fortress...Intruders...Stop them...Bijou's...order...", instance_npcname("Stefan.J.E.Wolf#sthd_02");
+	specialeffect2 EF_LOCKON;
+	sleep2 2000;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : What on earth is happening inside?";
+	sleep2 2000;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : Let's head to top! I believe there must be something there.";
+	sleep2 2000;
+	setpcblock PCBLOCK_NPC, false;
+	specialeffect2 EF_LOCKON;
+	specialeffect EF_BAKU,AREA, instance_npcname("Stefan.J.E.Wolf#sthd_02");
+	cutin "",255;
+
+	disablenpc instance_npcname("Stefan.J.E.Wolf#sthd_02");
+	for ( .@i = 1; .@i <= 6; .@i++ ) {
+		enablenpc instance_npcname("Deactivated Warp#sthd_mov_" + .@i);
+		enablenpc instance_npcname("#sthd_move_back_a_" + .@i);
+	}
+	enablenpc instance_npcname("#sthd_move_01_01");
+	enablenpc instance_npcname("#sthd_move_02_01");
+	enablenpc instance_npcname("#sthd_move_02_02");
+
+	enablenpc instance_npcname("#Stefan_Action2");	// 2nd map
+	enablenpc instance_npcname("Stefan.J.E.Wolf#sthd_03");
+
+	// Mobs spots
+	for ( .@i = 5; .@i <= 18; .@i++ )
+		enablenpc instance_npcname("#sthd_event_" + .@i);
+
+	// Room Shuffle
+	donpcevent instance_npcname("#sthd_key_control") + "::OnShuffle";
+	end;
+}
+
+
+// Shuffle warp room
+1@sthb,68,80,0	script	#sthd_key_control	HIDDEN_WARP_NPC,{
+	end;
+OnShuffle:
+	switch( rand(6) ) {
+	case 0:
+		// 'warp_list[ <from room X> ] = <to room Y>;
+		setarray 'warp_list[1], 5,1,3,4,6,2;
+		break;
+	case 1:
+		setarray 'warp_list[1], 2,6,4,3,1,5;
+		break;
+	case 2:
+		setarray 'warp_list[1], 3,5,1,6,2,4;
+		break;
+	case 3:
+		setarray 'warp_list[1], 6,4,2,5,3,1;
+		break;
+	case 4:
+		setarray 'warp_list[1], 1,3,5,2,4,6;
+		break;
+	case 5:
+		setarray 'warp_list[1], 4,2,6,1,5,3;
+		break;
+	}
+	end;
+}
+
+
+// Room exit
+1@sthc,66,88,0	script	#sthd_move_back_a_1	WARPNPC,2,2,{
+	end;
+OnTouch:
+	setarray .@coord[2],
+		 39,85,	// Activated Warp#sthd_mov_1
+		 83,95,	// Activated Warp#sthd_mov_2
+		 28,39,	// Activated Warp#sthd_mov_3
+		210,79,	// Activated Warp#sthd_mov_4
+		143,87,	// Activated Warp#sthd_mov_5
+		179,47;	// Activated Warp#sthd_mov_6
+	.@room_num = atoi( replacestr( strnpcinfo(2), "sthd_move_back_a_", "" ) );
+	.@index = inarray( 'warp_list[1], .@room_num ) * 2;
+	warp 'sthb_map$, .@coord[.@index], .@coord[ .@index+1 ];
+	end;
+}
+
+1@sthc,116,88,0	duplicate(#sthd_move_back_a_1)	#sthd_move_back_a_2	WARPNPC,2,2
+1@sthc,16,6,0	duplicate(#sthd_move_back_a_1)	#sthd_move_back_a_3	WARPNPC,2,2
+1@sthc,115,6,0	duplicate(#sthd_move_back_a_1)	#sthd_move_back_a_4	WARPNPC,2,2
+1@sthc,66,6,0	duplicate(#sthd_move_back_a_1)	#sthd_move_back_a_5	WARPNPC,2,2
+1@sthc,15,88,0	duplicate(#sthd_move_back_a_1)	#sthd_move_back_a_6	WARPNPC,2,2
+
+// Room entrance
+1@sthb,34,86,1	script	Activated Warp#sthd_mov_1	1_SHADOW_NPC,{
+	if (select( "Don't step into the warp.", "Step into the warp." ) == 1) {
+		mes "- Dreary warp -";
+		mes "- Black light is shining. -";
+		close;
+	}
+	mes "- Black Warp is swirling about. -";
+	close2;
+	setarray .@coord[2],
+		 66,96,	// #sthd_move_back_a_1, #sthd_event_13
+		116,96,	// #sthd_move_back_a_2, #sthd_event_14
+		 16,13,	// #sthd_move_back_a_3, #sthd_event_18, Immortal Wind Ghost
+		115,14,	// #sthd_move_back_a_4, #sthd_event_15
+		 66,14,	// #sthd_move_back_a_5, #sthd_event_16
+		 15,96;	// #sthd_move_back_a_6, #sthd_event_17, Immortal Cursed Knight
+
+	.@room_num = atoi( replacestr( strnpcinfo(2), "sthd_mov_", "" ) );
+	.@index = 'warp_list[.@room_num] * 2;
+	warp 'sthc_map$, .@coord[.@index], .@coord[ .@index+1 ];
+	end;
+}
+
+1@sthb,84,99,1	duplicate(Activated Warp#sthd_mov_1)	Activated Warp#sthd_mov_2	1_SHADOW_NPC
+1@sthb,24,40,1	duplicate(Activated Warp#sthd_mov_1)	Activated Warp#sthd_mov_3	1_SHADOW_NPC
+1@sthb,206,80,1	duplicate(Activated Warp#sthd_mov_1)	Activated Warp#sthd_mov_4	1_SHADOW_NPC
+1@sthb,147,86,1	duplicate(Activated Warp#sthd_mov_1)	Activated Warp#sthd_mov_5	1_SHADOW_NPC
+1@sthb,179,51,1	duplicate(Activated Warp#sthd_mov_1)	Activated Warp#sthd_mov_6	1_SHADOW_NPC
+
+1@sthb,34,85,1	script	Deactivated Warp#sthd_mov_1	4_ENERGY_WHITE,{
+	if (select( "Desactivate the warp.", "Activate the warp." ) == 1) {
+		mes "- Move the fortress to a special place -";
+		mes "- Accessible door -";
+		mes "- You seen an accessible door -";
+		close;
+	}
+	if (countitem(6960) < 1) {
+		mes "- To operate the warp -";
+		mes "- You need a key to the Sky Fortress. -";
+		close;
+	}
+	delitem 6960,1;
+	mes "- Warp has been -";
+	mes "- successfully activated -";
+	mes "- Dreary warp -";
+	mes "- is brought up -";
+	mes "- shining in black -";
+	disablenpc instance_npcname( strnpcinfo(0) );
+	enablenpc instance_npcname("Activated Warp#" + strnpcinfo(2));
+	close;
+}
+
+1@sthb,83,99,1	duplicate(Deactivated Warp#sthd_mov_1)	Deactivated Warp#sthd_mov_2	4_ENERGY_WHITE
+1@sthb,24,39,1	duplicate(Deactivated Warp#sthd_mov_1)	Deactivated Warp#sthd_mov_3	4_ENERGY_WHITE
+1@sthb,206,79,1	duplicate(Deactivated Warp#sthd_mov_1)	Deactivated Warp#sthd_mov_4	4_ENERGY_WHITE
+1@sthb,147,87,1	duplicate(Deactivated Warp#sthd_mov_1)	Deactivated Warp#sthd_mov_5	4_ENERGY_WHITE
+1@sthb,178,51,1	duplicate(Deactivated Warp#sthd_mov_1)	Deactivated Warp#sthd_mov_6	4_ENERGY_WHITE
+
+
+// Spawn in the rooms
+1@sthc,66,94,0	script	#sthd_event_13	HIDDEN_WARP_NPC,8,8,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_13");
+	.@label$ = instance_npcname("#sthd_event_13") + "::OnMobDead";
+	monster 'sthc_map$,62,108,"Immortal Nightmare Shadow",3481,1, .@label$;// AS_EVIL_SHADOW1
+	monster 'sthc_map$,70,108,"Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,70,101,"Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,66,115,"Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,70,116,"Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,69,127,"Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,64,132,"Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,61,127,"Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,61,101,"Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,62,116,"Immortal Nightmare Shadow",3481,1, .@label$;
+	initnpctimer;
+	end;
+OnTimer2000:
+	if (mobcount( 'sthc_map$, instance_npcname("#sthd_event_13") + "::OnMobDead" ) > 0) {
+		initnpctimer;
+		end;
+	}
+	stopnpctimer;
+	enablenpc instance_npcname("Sky Fortress Gold Treasure#1");
+	end;
+OnMobDead:
+	end;
+}
+
+1@sthc,116,94,0	script	#sthd_event_14	HIDDEN_WARP_NPC,8,8,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_14");
+	.@label$ = instance_npcname("#sthd_event_14") + "::OnMobDead";
+	monster 'sthc_map$,112,101, "Immortal Angry Shadow",3482,1, .@label$;// AS_EVIL_SHADOW2
+	monster 'sthc_map$,120,101, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,119,110, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,115,115, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,114,128, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,112,110, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,118,120, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,110,130, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,111,120, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,120,130, "Immortal Angry Shadow",3482,1, .@label$;
+	initnpctimer;
+	end;
+OnTimer2000:
+	if (mobcount( 'sthc_map$, instance_npcname("#sthd_event_14") + "::OnMobDead" ) > 0) {
+		initnpctimer;
+		end;
+	}
+	stopnpctimer;
+	enablenpc instance_npcname("Sky Fortress Gold Treasure#2");
+	end;
+OnMobDead:
+	end;
+}
+
+1@sthc,115,12,0	script	#sthd_event_15	HIDDEN_WARP_NPC,8,8,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_15");
+	.@label$ = instance_npcname("#sthd_event_15") + "::OnMobDead";
+	monster 'sthc_map$,120,27, "Immortal Nightmare Shadow",3481,1, .@label$;// AS_EVIL_SHADOW1
+	monster 'sthc_map$,120,19, "Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,111,27, "Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,115,33, "Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,111,36, "Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,111,45, "Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,114,49, "Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,119,36, "Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,119,45, "Immortal Nightmare Shadow",3481,1, .@label$;
+	monster 'sthc_map$,116,18, "Immortal Nightmare Shadow",3481,1, .@label$;
+	initnpctimer;
+	end;
+OnTimer2000:
+	if (mobcount( 'sthc_map$, instance_npcname("#sthd_event_15") + "::OnMobDead" ) > 0) {
+		initnpctimer;
+		end;
+	}
+	stopnpctimer;
+	enablenpc instance_npcname("Sky Fortress Gold Treasure#3");
+	end;
+OnMobDead:
+	end;
+}
+
+1@sthc,66,12,0	script	#sthd_event_16	HIDDEN_WARP_NPC,8,8,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_16");
+	.@label$ = instance_npcname("#sthd_event_16") + "::OnMobDead";
+	monster 'sthc_map$,70,18, "Immortal Angry Shadow",3482,1, .@label$;// AS_EVIL_SHADOW2
+	monster 'sthc_map$,61,18, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,65,34, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,62,38, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,69,37, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,72,29, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,69,47, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,62,47, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,61,30, "Immortal Angry Shadow",3482,1, .@label$;
+	monster 'sthc_map$,64,50, "Immortal Angry Shadow",3482,1, .@label$;
+	initnpctimer;
+	end;
+OnTimer2000:
+	if (mobcount( 'sthc_map$, instance_npcname("#sthd_event_16") + "::OnMobDead" ) > 0) {
+		initnpctimer;
+		end;
+	}
+	stopnpctimer;
+	enablenpc instance_npcname("Sky Fortress Gold Treasure#4");
+	end;
+OnMobDead:
+	end;
+}
+
+// Cursed Knight room
+1@sthc,15,94,0	script	#sthd_event_17	HIDDEN_WARP_NPC,8,8,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_17");
+	donpcevent instance_npcname("Sky Fortress Treasure Box") + "::OnStart";	// enabled regardless of the monster count
+	monster 'sthc_map$,19,106, "Immortal Death Shadow",3483,1;// AS_EVIL_SHADOW3
+	monster 'sthc_map$,12,105, "Immortal Death Shadow",3483,1;
+	areamonster 'sthc_map$,11,113,15,117, "Immortal Death Shadow",3483,2;
+	areamonster 'sthc_map$,18,116,22,120, "Immortal Death Shadow",3483,2;
+	areamonster 'sthc_map$,10,125,14,129, "Immortal Death Shadow",3483,2;
+	areamonster 'sthc_map$,17,125,21,129, "Immortal Death Shadow",3483,2;
+	end;
+}
+
+// Wind Ghost room
+1@sthc,16,11,0	script	#sthd_event_18	HIDDEN_WARP_NPC,8,8,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_18");
+	donpcevent instance_npcname("Wind Ghost in Experiment") + "::OnStart";	// enabled regardless of the monster count
+	monster 'sthc_map$,19,21, "Immortal Death Shadow",3483,1;// AS_EVIL_SHADOW3
+	monster 'sthc_map$,12,21, "Immortal Death Shadow",3483,1;
+	areamonster 'sthc_map$,9,28,13,32, "Immortal Death Shadow",3483,2;
+	areamonster 'sthc_map$,17,29,21,33, "Immortal Death Shadow",3483,2;
+	areamonster 'sthc_map$,13,35,17,39, "Immortal Death Shadow",3483,2;
+	areamonster 'sthc_map$,13,43,17,47, "Immortal Death Shadow",3483,2;
+	end;
+}
+
+// Chest
+1@sthc,66,137,4	script	Sky Fortress Gold Treasure#1	4_TREASURE_BOX,{
+	mes "- You've found -";
+	mes "- the Shining Treasure Box. -";
+	next;
+	if (select( "Open the box.", "Do not open the box." ) == 2) {
+		mes "- If you open the box, -";
+		mes "- there must be some good items. -";
+		close;
+	}
+	if (is_party_leader() == false) {
+		mes "- Those other than the party leader -";
+		mes "- don't seem to be able to open the box. -";
+		close;
+	}
+	if (checkweight(5128,1) == 0) {
+		mes "- It's full of items -";
+		mes "- so you can't open the box. -";
+		close;
+	}
+	donpcevent instance_npcname( strnpcinfo(0) ) + "::OnBar";
+	sleep2 3000;
+	if (is_party_leader() == false)
+		end;
+	disablenpc instance_npcname( strnpcinfo(0) );
+	mes "- In that treasure box, -";
+	.@r = rand(100);
+	if (.@r < 32) {
+		.@item_id = 985;	// Oridecon
+		specialeffect EF_ENHANCE;
+	}
+	else if (.@r < 64) {
+		.@item_id = 984;	// Elunium
+		specialeffect EF_ENHANCE;
+	}
+	else if (.@r < 84) {
+		.@item_id = 608;	// Seed_Of_Yggdrasil
+		specialeffect EF_ENHANCE;
+	}
+	else if (.@r < 94) {
+		.@item_id = 607;	// Yggdrasilberry
+		specialeffect EF_ENHANCE;
+	}
+	else if (.@r < 99) {
+		.@item_id = 616;	// Old_Card_Album
+		specialeffect EF_ENHANCE;
+	}
+	else if (.@r  == 99) {
+		.@item_id = 12246;	// Magic_Card_Album
+		specialeffect EF_GUMGANG2;
+		specialeffect EF_VOLCANO;
+		specialeffect EF_PNEUMA;
+	}
+	getitem .@item_id, 1;
+	mes "- you've found the " + getitemname(.@item_id) + ". -";
+	close;
+OnBar:
+	progressbar_npc "000000",3;
+	end;
+}
+
+1@sthc,116,137,4	duplicate(Sky Fortress Gold Treasure#1)	Sky Fortress Gold Treasure#2	4_TREASURE_BOX
+1@sthc,116,55,4	duplicate(Sky Fortress Gold Treasure#1)	Sky Fortress Gold Treasure#3	4_TREASURE_BOX
+1@sthc,66,55,4	duplicate(Sky Fortress Gold Treasure#1)	Sky Fortress Gold Treasure#4	4_TREASURE_BOX
+
+// Cursed Knight
+1@sthc,16,132,4	script	Sky Fortress Treasure Box	CLEAR_NPC,{
+	mes "- You've found -";
+	mes "- the Shining Treasure Box. -";
+	next;
+	if (select( "Open the box.", "Do not open the box." ) == 2) {
+		mes "- If you open the box, -";
+		mes "- there must be some good items. -";
+		close;
+	}
+	if (is_party_leader() == false) {
+		mes "- Those other than the party leader -";
+		mes "- don't seem to be able to open the box. -";
+		close;
+	}
+	if (checkweight(2655,1) == 0) {
+		mes "- It's full of items -";
+		mes "- so you can't open the box. -";
+		close;
+	}
+	mes "- The treasure box is opening up -";
+	mes "- and something suddenly -";
+	mes "- showed up in the front. -";
+	specialeffect EF_SILENT_BREEZE;
+	specialeffect EF_LOCKON;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : You may have touched something wrong...";
+	disablenpc instance_npcname("Sky Fortress Treasure Box");
+	stopnpctimer;
+	donpcevent instance_npcname("Immortal Cursed Knight#") + "::OnEvent";
+	close;
+OnStart:
+	enablenpc instance_npcname("Sky Fortress Treasure Box");
+	initnpctimer;
+	end;
+OnTimer8000:
+	specialeffect EF_LIGHTSPHERE2;
+	end;
+OnTimer9000:
+	initnpctimer;
+	end;
+}
+
+1@sthc,16,129,4	script	Immortal Cursed Knight#	4_AS_BLOODY_KNIGHT,{
+	end;
+OnEvent:
+	enablenpc instance_npcname("Immortal Cursed Knight#");
+	sleep 2000;
+	npctalk "Immortal Cursed Knight: What kind of intruder is trying to wake me up...";
+	sleep 2000;
+	npctalk "Immortal Cursed Knight: Doom to the petty thief coveting the treasure at the fortress...";
+	sleep 2000;
+	disablenpc instance_npcname("Immortal Cursed Knight#");
+	monster 'sthc_map$,16,129,"Immortal Cursed Knight",3474,1, instance_npcname("Immortal Cursed Knight#") + "::OnKnightB";	// AS_BLOODY_KNIGHT
+	'cursed_knight = $@mobid[0];
+	initnpctimer;
+	end;
+OnTimer2000:
+	if (mobcount('sthd_map$, instance_npcname("Immortal Cursed Knight#") + "::OnKnightB") < 1) {
+		stopnpctimer;
+		'cursed_knight = 0;
+		mapannounce 'sthc_map$, "Stefan Jack Earnest Wolf: Fell down... Immortal Cursed Knight... Sad... Will kill... The intruder...", bc_map,0xEBFF;
+		end;
+	}
+	if ('cursed_knight > 0) {
+		.@r = rand(30);
+		if (.@r == 0)
+			unittalk 'cursed_knight, "Immortal Cursed Knight: Glory to Bijou! Death to the intruders!";
+		else if (.@r == 1)
+			unittalk 'cursed_knight, "Immortal Cursed Knight: The perishable is nothing but a handful of ash before the Immortal Knight!";
+		else if (.@r == 2)
+			unittalk 'cursed_knight, "Immortal Cursed Knight: I can't...I can't seem to control the power!";
+	}
+	end;
+OnTimer3000:
+	initnpctimer;
+	end;
+OnKnightB:
+	end;
+}
+
+// Wind Ghost
+1@sthc,16,54,4	script	Wind Ghost in Experiment	CLEAR_NPC,{
+	if (select( "Examine the test tube.", "Do not examine the test tube." ) == 2) {
+		mes "- I'm sure there is something -";
+		mes "- extremely fearsome. -";
+		close;
+	}
+	if (is_party_leader() == false) {
+		mes "- Those other than the party leader -";
+		mes "- don't seem to be able operate the test tube. -";
+		close;
+	}
+	mes "- The test tube is opening up -";
+	mes "- and something suddenly -";
+	mes "- showed up in the front. -";
+	specialeffect EF_SILENT_BREEZE;
+	specialeffect EF_LOCKON;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : What...what is this?";
+	donpcevent instance_npcname("Immortal Wind Ghost#01") + "::OnEvent";
+	stopnpctimer;
+	disablenpc instance_npcname("Wind Ghost in Experiment");
+	close;
+OnStart:
+	enablenpc instance_npcname("Wind Ghost in Experiment");
+	initnpctimer;
+	end;
+OnTimer8000:
+	specialeffect EF_LIGHTSPHERE2;
+	end;
+OnTimer9000:
+	initnpctimer;
+	end;
+}
+
+1@sthc,15,49,4	script	Immortal Wind Ghost#01	4_AS_WIND_GHOST,{
+	end;
+OnEvent:
+	enablenpc instance_npcname("Immortal Wind Ghost#01");
+	sleep 2000;
+	npctalk "Immortal Wind Ghost: Foolish human...You're praying for death...";
+	sleep 2000;
+	npctalk "Immortal Wind Ghost: The power boiling inside my body...It sure feels good...";
+	sleep 2000;
+	disablenpc instance_npcname("Immortal Wind Ghost#01");
+	monster 'sthc_map$,15,49,"Immortal Wind Ghost",3475,1, instance_npcname("Immortal Wind Ghost#01") + "::OnWindDead";	// AS_WIND_GHOST
+	'wind_ghost = $@mobid[0];
+	initnpctimer;
+	end;
+OnTimer2000:
+	if (mobcount('sthd_map$, instance_npcname("Immortal Wind Ghost#01") + "::OnWindDead") < 1) {
+		stopnpctimer;
+		'wind_ghost = 0;
+		mapannounce 'sthc_map$, "Stefan Jack Earnest Wolf: Experiment... Became stronger... Immortal Wind Ghost...is dead...Death to all...", bc_map,0xEBFF;
+		end;
+	}
+	if ('wind_ghost > 0) {
+		.@r = rand(30);
+		if (.@r == 0)
+			unittalk 'wind_ghost, "Immortal Wind Ghost: I feel more power filling up inside...";
+		else if (.@r == 1)
+			unittalk 'wind_ghost, "Immortal Wind Ghost: I will kill you slowly...from the deep side of your lung...";
+		else if (.@r == 2)
+			unittalk 'wind_ghost, "Immortal Wind Ghost: Only death awaits the humans who dare to go against me...";
+	}
+	end;
+OnTimer3000:
+	initnpctimer;
+	end;
+OnWindDead:
+	end;
+}
+
+
+// Spawn stairs - step 1
+1@sthb,65,86,0	script	#sthd_event_5	HIDDEN_WARP_NPC,5,5,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_5");
+	monster 'sthb_map$,61,84,"Immortal Fortress Legionnaire",3477,1;	// AS_IMMORTAL_CORPS
+	monster 'sthb_map$,51,87,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,37,81,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,41,85,"Immortal Zombie Assault",3479,1;			// AS_ZOMBIE_MASTER
+	monster 'sthb_map$,41,49,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,52,50,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,82,50,"Immortal Cursed Zombie",3480,1;			// AS_CURSED_SOLDIER
+	areamonster 'sthb_map$,34,57,38,61,"Immortal Cursed Zombie",3480,2;
+	if (rand(100) < 20)
+		monster 'sthb_map$,80,49,"Sky Fortress Key Keeper",3478,1;		// AS_ZOMBIE_SLAUGHTER
+	end;
+}
+
+1@sthb,62,49,0	script	#sthd_event_6	HIDDEN_WARP_NPC,5,5,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_6");
+	monster 'sthb_map$,79,48,"Immortal Fortress Legionnaire",3477,1;	// AS_IMMORTAL_CORPS
+	monster 'sthb_map$,67,50,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,85,60,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,82,74,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,83,49,"Immortal Zombie Assault",3479,1;			// AS_ZOMBIE_MASTER
+	monster 'sthb_map$,83,71,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,79,96,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,69,95,"Immortal Zombie Assault",3479,1;
+	areamonster 'sthb_map$,82,92,86,96,"Immortal Cursed Zombie",3480,2;			// AS_CURSED_SOLDIER
+	areamonster 'sthb_map$,83,84,87,88,"Immortal Cursed Zombie",3480,2;
+	if (rand(100) < 20)
+		monster 'sthb_map$,73,96,"Sky Fortress Key Keeper",3478,1;
+	end;
+}
+
+1@sthb,57,96,0	script	#sthd_event_7	HIDDEN_WARP_NPC,5,5,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_7");
+	monster 'sthb_map$,52,94,"Immortal Fortress Legionnaire",3477,1;	// AS_IMMORTAL_CORPS
+	monster 'sthb_map$,42,98,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,29,91,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,25,78,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,28,96,"Immortal Zombie Assault",3479,1;			// AS_ZOMBIE_MASTER
+	monster 'sthb_map$,27,69,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,26,55,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,32,41,"Immortal Zombie Assault",3479,1;
+	areamonster 'sthb_map$,27,65,31,69,"Immortal Cursed Zombie",3480,2;			// AS_CURSED_SOLDIER
+	areamonster 'sthb_map$,25,41,29,45,"Immortal Cursed Zombie",3480,2;
+	if (rand(100) < 20)
+		monster 'sthb_map$,27,54,"Sky Fortress Key Keeper",3478,1;
+	end;
+}
+
+1@sthb,32,39,0	script	#sthd_event_8	HIDDEN_WARP_NPC,5,5,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_8");
+	monster 'sthb_map$,53,38,"Immortal Fortress Legionnaire",3477,1;	// AS_IMMORTAL_CORPS
+	monster 'sthb_map$,64,41,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,78,38,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,43,41,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,28,40,"Immortal Zombie Assault",3479,1;			// AS_ZOMBIE_MASTER
+	monster 'sthb_map$,59,40,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,92,45,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,95,57,"Immortal Zombie Assault",3479,1;
+	areamonster 'sthb_map$,92,37,96,41,"Immortal Cursed Zombie",3480,2;			// AS_CURSED_SOLDIER
+	areamonster 'sthb_map$,87,39,91,43,"Immortal Cursed Zombie",3480,2;
+	if (rand(100) < 20)
+		monster 'sthb_map$,75,40,"Sky Fortress Key Keeper",3478,1;
+	end;
+}
+
+// Spawn stairs - step 2
+1@sthb,209,64,0	script	#sthd_event_9	HIDDEN_WARP_NPC,5,5,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_9");
+	monster 'sthb_map$,207,50,"Immortal Fortress Legionnaire",3477,1;	// AS_IMMORTAL_CORPS
+	monster 'sthb_map$,205,38,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,195,36,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,209,38,"Immortal Zombie Assault",3479,1;			// AS_ZOMBIE_MASTER
+	monster 'sthb_map$,161,39,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,150,36,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,144,38,"Immortal Cursed Zombie",3480,1;			// AS_CURSED_SOLDIER
+	areamonster 'sthb_map$,169,34,173,38,"Immortal Cursed Zombie",3480,2;
+	if (rand(100) < 20)
+		monster 'sthb_map$,163,38,"Sky Fortress Key Keeper",3478,1;
+	end;
+}
+
+1@sthb,144,47,0	script	#sthd_event_10	HIDDEN_WARP_NPC,5,5,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_10");
+	monster 'sthb_map$,142,61,"Immortal Fortress Legionnaire",3477,1;	// AS_IMMORTAL_CORPS
+	monster 'sthb_map$,145,71,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,142,83,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,147,94,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,143,64,"Immortal Zombie Assault",3479,1;			// AS_ZOMBIE_MASTER
+	monster 'sthb_map$,144,78,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,165,95,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,173,92,"Immortal Zombie Assault",3479,1;
+	areamonster 'sthb_map$,154,90,158,94,"Immortal Cursed Zombie",3480,2;			// AS_CURSED_SOLDIER
+	areamonster 'sthb_map$,141,92,145,96,"Immortal Cursed Zombie",3480,2;
+	if (rand(100) < 20)
+		monster 'sthb_map$,154,96,"Sky Fortress Key Keeper",3478,1;
+	end;
+}
+
+1@sthb,178,94,0	script	#sthd_event_11	HIDDEN_WARP_NPC,5,5,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_11");
+	monster 'sthb_map$,187,92,"Immortal Fortress Legionnaire",3477,1;	// AS_IMMORTAL_CORPS
+	monster 'sthb_map$,200,90,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,198,81,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,201,72,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,199,94,"Immortal Zombie Assault",3479,1;			// AS_ZOMBIE_MASTER
+	monster 'sthb_map$,199,70,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,195,48,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,185,47,"Immortal Zombie Assault",3479,1;
+	areamonster 'sthb_map$,196,60,200,64,"Immortal Cursed Zombie",3480,2;			// AS_CURSED_SOLDIER
+	areamonster 'sthb_map$,198,45,202,49,"Immortal Cursed Zombie",3480,2;
+	if (rand(100) < 20)
+		monster 'sthb_map$,202,56,"Sky Fortress Key Keeper",3478,1;
+	end;
+}
+
+1@sthb,179,48,0	script	#sthd_event_12	HIDDEN_WARP_NPC,5,5,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#sthd_event_12");
+	monster 'sthb_map$,168,49,"Immortal Fortress Legionnaire",3477,1;	// AS_IMMORTAL_CORPS
+	monster 'sthb_map$,159,46,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,154,52,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,152,65,"Immortal Fortress Legionnaire",3477,1;
+	monster 'sthb_map$,155,48,"Immortal Zombie Assault",3479,1;			// AS_ZOMBIE_MASTER
+	monster 'sthb_map$,154,73,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,159,84,"Immortal Zombie Assault",3479,1;
+	monster 'sthb_map$,171,82,"Immortal Zombie Assault",3479,1;
+	areamonster 'sthb_map$,151,82,155,86,"Immortal Cursed Zombie",3480,2;			// AS_CURSED_SOLDIER
+	areamonster 'sthb_map$,153,75,157,79,"Immortal Cursed Zombie",3480,2;
+	if (rand(100) < 20)
+		monster 'sthb_map$,156,46,"Sky Fortress Key Keeper",3478,1;
+	end;
+}
+
+
+// Main event - 2nd step
+1@sthb,207,83,0	script	#Stefan_Action2	HIDDEN_WARP_NPC,6,6,{
+	end;
+OnTouch:
+	disablenpc instance_npcname("#Stefan_Action2");
+	setpcblock PCBLOCK_NPC, true;
+	sleep2 1000;
+	cutin "stephan_j_e_w.bmp",2;
+	npctalk "Stefan: ~Grunts~", instance_npcname("Stefan.J.E.Wolf#sthd_03");
+	sleep2 2000;
+	npctalk "Earnest: Filthy humans...Stop them...Guard...the holy fortress...", instance_npcname("Stefan.J.E.Wolf#sthd_03");
+	specialeffect2 EF_LOCKON;
+	sleep2 2000;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : It's extremely vigilant of me.";
+	sleep2 2000;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : I think there must be something if we keep following";
+	sleep2 2000;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : that Golem's trace!";
+	sleep2 2000;
+	setpcblock PCBLOCK_NPC, false;
+	mapannounce 'sthb_map$, "Stefan Jack Earnest Wolf: Holy fortress...Intruders...How wicked...Stop them...", bc_map,0xEBFF;
+	cutin "",255;
+	specialeffect2 EF_LOCKON;
+	disablenpc instance_npcname("Stefan.J.E.Wolf#sthd_03");
+	enablenpc instance_npcname("#Stefan for display3");
+	enablenpc instance_npcname("Stefan.J.E.Wolf#sthd_04");
+	end;
+}
+
+1@sthb,207,83,8	duplicate(dummy_npc)	Stefan.J.E.Wolf#sthd_03	4_AS_RAGGED_GOLEM
+
+
+// Final step
+1@sthd,103,115,6	duplicate(dummy_npc)	Stefan.J.E.Wolf#sthd_04	4_AS_RAGGED_GOLEM
+
+1@sthd,103,115,0	script	#Stefan for display3	HIDDEN_WARP_NPC,10,10,{
+	end;
+OnTouch:
+	.@stephan$ = instance_npcname("Stefan.J.E.Wolf#sthd_04");
+	disablenpc instance_npcname("#Stefan for display3");
+	setpcblock PCBLOCK_NPC, true;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : So this is finally the last...I suppose he must be the cause of Prontera Invasion, isn't he?";
+	sleep2 2000;
+	cutin "stephan_j_e_w.bmp",2;
+	npctalk "Wolf: Adventurers...A bunch of foolish greenhorns...", .@stephan$;
+	sleep2 2000;
+	npctalk "Jack: I must follow...order...from Bijou...", .@stephan$;
+	sleep2 2000;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : Bijou? So, was Golem the mere guardian around here? Is that it...?";
+	sleep2 2000;
+	npctalk "Stefan: ~Growls~", .@stephan$;
+	sleep2 2000;
+	npctalk "Earnest: Filthy worms...Can't lead life as intended...Immortal power...My body...", .@stephan$;
+	sleep2 2000;
+	unittalk getcharid(3), "" + strcharinfo(0) + " : I'd better defeat it first.";
+	sleep2 2000;
+	mapannounce 'sthd_map$, "Stefan Jack Earnest Wolf: Soldiers...Bijou's...fortress...Cut them all...I'll step up...I'll kill them...all...", bc_map,0xEBFF;
+	sleep2 2000;
+	cutin "",255;
+	specialeffect EF_LOCKON;
+	sleep2 2000;
+	setpcblock PCBLOCK_NPC, false;
+	disablenpc .@stephan$;
+	donpcevent instance_npcname("#Last_Boss") + "::OnStart";
+	areamonster 'sthd_map$,84,76,124,116,"Zombie Soldier of Bijou",3476,10, instance_npcname("#Stefan for display3") + "::OnMobDead";	// AS_ZOMBIE
+	initnpctimer;
+	end;
+OnTimer30000:
+	stopnpctimer;
+	mapannounce 'sthd_map$, "Stefan Jack Earnest Wolf: Cursed soldiers...Come...Bring it on...", bc_map,0xEBFF;
+	monster 'sthd_map$,0,0,"Cursed Soldier of Bijou",3485,5, instance_npcname("#Stefan for display3") + "::OnMobDead";	// AS_D_CURSED_SOLDIER
+	end;
+OnStop:
+	killmonster 'sthd_map$, instance_npcname("#Stefan for display3") + "::OnMobDead";
+	stopnpctimer;
+	end;
+OnMobDead:
+	end;
+}
+
+1@sthd,96,127,0	script	#Last_Boss	HIDDEN_WARP_NPC,{
+	end;
+OnStart:
+	monster 'sthd_map$,103,115,"Stefan.J.E.Wolf",3473,1, instance_npcname("#Last_Boss") + "::OnBossDead";		// AS_RAGGED_GOLEM
+	'boss_id = $@mobid[0];
+	initnpctimer;
+	end;
+OnBossDead:
+	end;
+OnTimer1000:
+	if ('boss_id < 1 || mobcount( 'sthd_map$, instance_npcname("#Last_Boss") + "::OnBossDead" ) < 1) {
+		'boss_id = 0;
+		'pantheon_event[0] = 1;
+		'pantheon_event[1] = 1;
+		donpcevent instance_npcname("#Last_Boss") + "::OnLastWord";
+		donpcevent instance_npcname("#Last_Boss_Monster") + "::OnReset";
+		donpcevent instance_npcname("#Last_Boss2_Monster") + "::OnReset";
+		donpcevent instance_npcname("#Stefan for display3") + "::OnStop";
+		donpcevent instance_npcname("Sky Fortress Escape Warp#end_warp") + "::OnEnable";
+		stopnpctimer;
+		end;
+	}
+	getunitdata 'boss_id, .@data;
+	.@hp = .@data[UMOB_HP];
+
+	if (.@hp > 6000000 && .@hp < 14000000) {
+		if ('pantheon_event[0] == 0) {
+			'pantheon_event[0] = 1;
+			donpcevent instance_npcname("#Last_Boss2_Monster") + "::OnStart";
+			mapannounce 'sthd_map$, "Stefan Jack Earnest Wolf: Strong...Adventurer... ~Growls~ My... soliders... Get out...", bc_map,0xEBFF;
+		}
+	}
+	else if (.@hp > 5000000 && .@hp < 6000001)
+		mapannounce 'sthd_map$, "Stefan Jack Earnest Wolf: I'll destroy you...I'll be smashing you...Come, the Cursed Soldiers...Ground-shaking...", bc_map,0xEBFF;
+	else if (.@hp < 5000001) {
+		if ('pantheon_event[1] == 0) {
+			'pantheon_event[1] = 1;
+			donpcevent instance_npcname("#Last_Boss2_Monster") + "::OnReset";
+			donpcevent instance_npcname("#Last_Boss_Monster") + "::OnStart";
+		}
+		.@bomb[0] = rand(1,7);
+		.@bomb[1] = rand(1,7);
+		.@bomb[2] = rand(1,8);
+		.@bomb[3] = rand(1,7);
+		.@bomb[4] = rand(1,8);
+		.@bomb[5] = rand(1,7);
+
+		if (.@bomb[0] == 1) {
+			.@pant[0] = 1;
+			if (.@bomb[3] == 1) setarray .@pant[1],8,23;
+			else if (.@bomb[3] == 2) setarray .@pant[1],9,21;
+			else if (.@bomb[3] == 3) setarray .@pant[1],10,24;
+			else if (.@bomb[3] == 4) setarray .@pant[1],11;
+			else if (.@bomb[3] == 5) setarray .@pant[1],12;
+			else if (.@bomb[3] == 6) setarray .@pant[1],13;
+			else if (.@bomb[3] == 7) setarray .@pant[1],14,27;
+		}
+		else if (.@bomb[0] == 2) {
+			.@pant[0] = 2;
+			if (.@bomb[3] == 1) setarray .@pant[1],8,23;
+			else if (.@bomb[3] == 2) setarray .@pant[1],9,1;
+			else if (.@bomb[3] == 3) setarray .@pant[1],10,21;
+			else if (.@bomb[3] == 4) setarray .@pant[1],11,24;
+			else if (.@bomb[3] == 5) setarray .@pant[1],12,27;
+			else if (.@bomb[3] == 6) setarray .@pant[1],13;
+			else if (.@bomb[3] == 7) setarray .@pant[1],14;
+		}
+		else if (.@bomb[0] == 3) {
+			.@pant[0] = 3;
+			if (.@bomb[3] == 1) setarray .@pant[1],8,23;
+			else if (.@bomb[3] == 2) setarray .@pant[1],9,24;
+			else if (.@bomb[3] == 3) setarray .@pant[1],10,1;
+			else if (.@bomb[3] == 4) setarray .@pant[1],11,21;
+			else if (.@bomb[3] == 5) setarray .@pant[1],12,27;
+			else if (.@bomb[3] == 6) setarray .@pant[1],13;
+			else if (.@bomb[3] == 7) setarray .@pant[1],14;
+		}
+		else if (.@bomb[0] == 4) {
+			.@pant[0] = 4;
+			if (.@bomb[3] == 1) setarray .@pant[1],8,23;
+			else if (.@bomb[3] == 2) setarray .@pant[1],9,24;
+			else if (.@bomb[3] == 3) setarray .@pant[1],10;
+			else if (.@bomb[3] == 4) setarray .@pant[1],11,1;
+			else if (.@bomb[3] == 5) setarray .@pant[1],12,21;
+			else if (.@bomb[3] == 6) setarray .@pant[1],13,27;
+			else if (.@bomb[3] == 7) setarray .@pant[1],14;
+		}
+		else if (.@bomb[0] == 5) {
+			.@pant[0] = 5;
+			if (.@bomb[3] == 1) setarray .@pant[1],8,23;
+			else if (.@bomb[3] == 2) setarray .@pant[1],9,24;
+			else if (.@bomb[3] == 3) setarray .@pant[1],10;
+			else if (.@bomb[3] == 4) setarray .@pant[1],11,27;
+			else if (.@bomb[3] == 5) setarray .@pant[1],12,1;
+			else if (.@bomb[3] == 6) setarray .@pant[1],13,21;
+			else if (.@bomb[3] == 7) setarray .@pant[1],14;
+		}
+		else if (.@bomb[0] == 6) {
+			setarray .@pant[0],6,26;
+			if (.@bomb[3] == 1) setarray .@pant[2],8,23;
+			else if (.@bomb[3] == 2) setarray .@pant[2],9,24;
+			else if (.@bomb[3] == 3) setarray .@pant[2],10;
+			else if (.@bomb[3] == 4) setarray .@pant[2],11,27;
+			else if (.@bomb[3] == 5) setarray .@pant[2],12;
+			else if (.@bomb[3] == 6) setarray .@pant[2],13,1;
+			else if (.@bomb[3] == 7) setarray .@pant[2],14,21;
+		}
+		else if (.@bomb[0] == 7) {
+			.@pant[0] = 7;
+			if (.@bomb[3] == 1) setarray .@pant[1],8,23;
+			else if (.@bomb[3] == 2) setarray .@pant[1],9,21;
+			else if (.@bomb[3] == 3) setarray .@pant[1],10,24;
+			else if (.@bomb[3] == 4) setarray .@pant[1],11;
+			else if (.@bomb[3] == 5) setarray .@pant[1],12,27;
+			else if (.@bomb[3] == 6) setarray .@pant[1],13;
+			else if (.@bomb[3] == 7) setarray .@pant[1],14,1;
+		}
+		.@s = getarraysize(.@pant);
+
+		if (.@bomb[1] == 1) {
+			setarray .@pant[.@s],8,23;
+			.@s += 2;
+			if (.@bomb[4] == 1) setarray .@pant[.@s],15,5;
+			else if (.@bomb[4] == 2) setarray .@pant[.@s],16,25;
+			else if (.@bomb[4] == 3) setarray .@pant[.@s],17;
+			else if (.@bomb[4] == 4) setarray .@pant[.@s],18;
+			else if (.@bomb[4] == 5) setarray .@pant[.@s],19;
+			else if (.@bomb[4] == 6) setarray .@pant[.@s],20;
+			else if (.@bomb[4] == 7) setarray .@pant[.@s],21;
+			else if (.@bomb[4] == 8) setarray .@pant[.@s],22;
+		}
+		else if (.@bomb[1] == 2) {
+			setarray .@pant[.@s],9,24;
+			.@s += 2;
+			if (.@bomb[4] == 1) setarray .@pant[.@s],15;
+			else if (.@bomb[4] == 2) setarray .@pant[.@s],16,5;
+			else if (.@bomb[4] == 3) setarray .@pant[.@s],17,25;
+			else if (.@bomb[4] == 4) setarray .@pant[.@s],18;
+			else if (.@bomb[4] == 5) setarray .@pant[.@s],19;
+			else if (.@bomb[4] == 6) setarray .@pant[.@s],20;
+			else if (.@bomb[4] == 7) setarray .@pant[.@s],21;
+			else if (.@bomb[4] == 8) setarray .@pant[.@s],22;
+		}
+		else if (.@bomb[1] == 3) {
+			.@pant[.@s] = 10;
+			.@s++;
+			if (.@bomb[4] == 1) setarray .@pant[.@s],15;
+			else if (.@bomb[4] == 2) setarray .@pant[.@s],16;
+			else if (.@bomb[4] == 3) setarray .@pant[.@s],17,5;
+			else if (.@bomb[4] == 4) setarray .@pant[.@s],18,25;
+			else if (.@bomb[4] == 5) setarray .@pant[.@s],19;
+			else if (.@bomb[4] == 6) setarray .@pant[.@s],20;
+			else if (.@bomb[4] == 7) setarray .@pant[.@s],21;
+			else if (.@bomb[4] == 8) setarray .@pant[.@s],22;
+		}
+		else if (.@bomb[1] == 4) {
+			.@pant[.@s] = 11;
+			.@s++;
+			if (.@bomb[4] == 1) setarray .@pant[.@s],15;
+			else if (.@bomb[4] == 2) setarray .@pant[.@s],16;
+			else if (.@bomb[4] == 3) setarray .@pant[.@s],17;
+			else if (.@bomb[4] == 4) setarray .@pant[.@s],18,5;
+			else if (.@bomb[4] == 5) setarray .@pant[.@s],19,25;
+			else if (.@bomb[4] == 6) setarray .@pant[.@s],20;
+			else if (.@bomb[4] == 7) setarray .@pant[.@s],21;
+			else if (.@bomb[4] == 8) setarray .@pant[.@s],22;
+		}
+		else if (.@bomb[1] == 5) {
+			.@pant[.@s] = 12;
+			.@s++;
+			if (.@bomb[4] == 1) setarray .@pant[.@s],15;
+			else if (.@bomb[4] == 2) setarray .@pant[.@s],16;
+			else if (.@bomb[4] == 3) setarray .@pant[.@s],17;
+			else if (.@bomb[4] == 4) setarray .@pant[.@s],18;
+			else if (.@bomb[4] == 5) setarray .@pant[.@s],19,5;
+			else if (.@bomb[4] == 6) setarray .@pant[.@s],20,25;
+			else if (.@bomb[4] == 7) setarray .@pant[.@s],21;
+			else if (.@bomb[4] == 8) setarray .@pant[.@s],22;
+		}
+		else if (.@bomb[1] == 6) {
+			.@pant[.@s] = 13;
+			.@s++;
+			if (.@bomb[4] == 1) setarray .@pant[.@s],15;
+			else if (.@bomb[4] == 2) setarray .@pant[.@s],16;
+			else if (.@bomb[4] == 3) setarray .@pant[.@s],17;
+			else if (.@bomb[4] == 4) setarray .@pant[.@s],18;
+			else if (.@bomb[4] == 5) setarray .@pant[.@s],19;
+			else if (.@bomb[4] == 6) setarray .@pant[.@s],20,5;
+			else if (.@bomb[4] == 7) setarray .@pant[.@s],21,25;
+			else if (.@bomb[4] == 8) setarray .@pant[.@s],22;
+		}
+		else if (.@bomb[1] == 7) {
+			.@pant[.@s] = 14;
+			.@s++;
+			if (.@bomb[4] == 1) setarray .@pant[.@s],15;
+			else if (.@bomb[4] == 2) setarray .@pant[.@s],16;
+			else if (.@bomb[4] == 3) setarray .@pant[.@s],17;
+			else if (.@bomb[4] == 4) setarray .@pant[.@s],18;
+			else if (.@bomb[4] == 5) setarray .@pant[.@s],19;
+			else if (.@bomb[4] == 6) setarray .@pant[.@s],20;
+			else if (.@bomb[4] == 7) setarray .@pant[.@s],21,5;
+			else if (.@bomb[4] == 8) setarray .@pant[.@s],22,25;
+		}
+
+		if (.@bomb[2] == 1) {
+			.@pant[.@s] = 15;
+			.@s++;
+			if (.@bomb[5] == 1) setarray .@pant[.@s],1,22;
+			else if (.@bomb[5] == 2) setarray .@pant[.@s],2,23;
+			else if (.@bomb[5] == 3) setarray .@pant[.@s],3,26;
+			else if (.@bomb[5] == 4) setarray .@pant[.@s],4;
+			else if (.@bomb[5] == 5) setarray .@pant[.@s],5;
+			else if (.@bomb[5] == 6) setarray .@pant[.@s],6;
+			else if (.@bomb[5] == 7) setarray .@pant[.@s],7;
+		}
+		else if (.@bomb[2] == 2) {
+			.@pant[.@s] = 16;
+			.@s++;
+			if (.@bomb[5] == 1) setarray .@pant[.@s],1;
+			else if (.@bomb[5] == 2) setarray .@pant[.@s],2,22;
+			else if (.@bomb[5] == 3) setarray .@pant[.@s],3,23;
+			else if (.@bomb[5] == 4) setarray .@pant[.@s],4,26;
+			else if (.@bomb[5] == 5) setarray .@pant[.@s],5;
+			else if (.@bomb[5] == 6) setarray .@pant[.@s],6;
+			else if (.@bomb[5] == 7) setarray .@pant[.@s],7;
+		}
+		else if (.@bomb[2] == 3) {
+			setarray .@pant[.@s],17,25;
+			.@s += 2;
+			if (.@bomb[5] == 1) setarray .@pant[.@s],1;
+			else if (.@bomb[5] == 2) setarray .@pant[.@s],2;
+			else if (.@bomb[5] == 3) setarray .@pant[.@s],3,22;
+			else if (.@bomb[5] == 4) setarray .@pant[.@s],4,23;
+			else if (.@bomb[5] == 5) setarray .@pant[.@s],5,26;
+			else if (.@bomb[5] == 6) setarray .@pant[.@s],6;
+			else if (.@bomb[5] == 7) setarray .@pant[.@s],7;
+		}
+		else if (.@bomb[2] == 4) {
+			.@pant[.@s] = 18;
+			.@s++;
+			if (.@bomb[5] == 1) setarray .@pant[.@s],1;
+			else if (.@bomb[5] == 2) setarray .@pant[.@s],2;
+			else if (.@bomb[5] == 3) setarray .@pant[.@s],3;
+			else if (.@bomb[5] == 4) setarray .@pant[.@s],4,22;
+			else if (.@bomb[5] == 5) setarray .@pant[.@s],5,23;
+			else if (.@bomb[5] == 6) setarray .@pant[.@s],6,26;
+			else if (.@bomb[5] == 7) setarray .@pant[.@s],7;
+		}
+		else if (.@bomb[2] == 5) {
+			setarray .@pant[.@s],19,27;
+			.@s += 2;
+			if (.@bomb[5] == 1) setarray .@pant[.@s],1;
+			else if (.@bomb[5] == 2) setarray .@pant[.@s],2;
+			else if (.@bomb[5] == 3) setarray .@pant[.@s],3;
+			else if (.@bomb[5] == 4) setarray .@pant[.@s],4;
+			else if (.@bomb[5] == 5) setarray .@pant[.@s],5,22;
+			else if (.@bomb[5] == 6) setarray .@pant[.@s],6,23;
+			else if (.@bomb[5] == 7) setarray .@pant[.@s],7,26;
+		}
+		else if (.@bomb[2] == 6) {
+			.@pant[.@s] = 20;
+			.@s++;
+			if (.@bomb[5] == 1) setarray .@pant[.@s],1,26;
+			else if (.@bomb[5] == 2) setarray .@pant[.@s],2;
+			else if (.@bomb[5] == 3) setarray .@pant[.@s],3;
+			else if (.@bomb[5] == 4) setarray .@pant[.@s],4;
+			else if (.@bomb[5] == 5) setarray .@pant[.@s],5;
+			else if (.@bomb[5] == 6) setarray .@pant[.@s],6,22;
+			else if (.@bomb[5] == 7) setarray .@pant[.@s],7,23;
+		}
+		else if (.@bomb[2] == 7) {
+			.@pant[.@s] = 21;
+			.@s++;
+			if (.@bomb[5] == 1) setarray .@pant[.@s],1,23;
+			else if (.@bomb[5] == 2) setarray .@pant[.@s],2;
+			else if (.@bomb[5] == 3) setarray .@pant[.@s],3,26;
+			else if (.@bomb[5] == 4) setarray .@pant[.@s],4;
+			else if (.@bomb[5] == 5) setarray .@pant[.@s],5;
+			else if (.@bomb[5] == 6) setarray .@pant[.@s],6;
+			else if (.@bomb[5] == 7) setarray .@pant[.@s],7,22;
+		}
+		else if (.@bomb[2] == 8) {
+			.@pant[.@s] = 22;
+			.@s++;
+			if (.@bomb[5] == 1) setarray .@pant[.@s],1;
+			else if (.@bomb[5] == 2) setarray .@pant[.@s],2,23;
+			else if (.@bomb[5] == 3) setarray .@pant[.@s],3,26;
+			else if (.@bomb[5] == 4) setarray .@pant[.@s],4;
+			else if (.@bomb[5] == 5) setarray .@pant[.@s],5;
+			else if (.@bomb[5] == 6) setarray .@pant[.@s],6;
+			else if (.@bomb[5] == 7) setarray .@pant[.@s],7;
+		}
+		.@s = getarraysize(.@pant);
+		for ( .@i = 0; .@i < .@s; ++.@i ) {
+			if (.@tmp[.@pant[.@i]])	// prevent to trigger the same event multiple times
+				continue;
+			.@tmp[.@pant[.@i]] = true;
+			donpcevent instance_npcname("#pantheon_damage" + .@pant[.@i]) + "::OnEvent";
+		}
+	}
+	end;
+OnTimer1500:
+	.@r = rand(1,30);
+	if (.@r == 1)
+		unittalk 'boss_id, "Wolf: Don't get away... Come closer... I'll kill you...";
+	else if (.@r < 11)
+		unittalk 'boss_id, "Stefan: ~Groans~ ~Growls~";
+	else if (.@r == 20)
+		unittalk 'boss_id, "Jack: I'm hurt... I'm scared... I take courage... I hit you...";
+	else if (.@r == 30)
+		unittalk 'boss_id, "Earnest: I'm angry... It's noisy... I'll wipe them all up...";
+	end;
+OnTimer3000:
+OnTimer4500:
+	if ('boss_id < 1 || mobcount( 'sthd_map$, instance_npcname("#Last_Boss") + "::OnBossDead" ) < 1) {
+		'boss_id = 0;
+		'pantheon_event[0] = 1;
+		'pantheon_event[1] = 1;
+		donpcevent instance_npcname("#Last_Boss") + "::OnLastWord";
+		donpcevent instance_npcname("#Last_Boss_Monster") + "::OnReset";
+		donpcevent instance_npcname("#Last_Boss2_Monster") + "::OnReset";
+		donpcevent instance_npcname("#Stefan for display3") + "::OnStop";
+		donpcevent instance_npcname("Sky Fortress Escape Warp#end_warp") + "::OnEnable";
+		stopnpctimer;
+	}
+	end;
+OnTimer6000:
+	initnpctimer;
+	end;
+OnLastWord:
+	mapannounce 'sthd_map$, "Stefan Jack Earnest Wolf: Dead...I was...But...I won't be dead...", bc_map,0xEBFF;
+	sleep 3000;
+	mapannounce 'sthd_map$, "Stefan Jack Earnest Wolf: Comes back...the power of Bijou...Eternal body...Again...", bc_map,0xEBFF;
+	end;
+}
+
+// hp > 6000000 && hp < 14000000
+1@sthd,99,128,0	script	#Last_Boss2_Monster	HIDDEN_WARP_NPC,{
+	end;
+OnStart:
+OnTimer10000:
+	initnpctimer;
+	end;
+OnTimer1000:
+	if (mobcount( 'sthd_map$, instance_npcname("#Last_Boss2_Monster") + "::OnMobDead" ) < 8)
+		areamonster 'sthd_map$,89,81,119,111,"Zombie Soldier of Bijou",3476,3, instance_npcname("#Last_Boss2_Monster") + "::OnMobDead";	// AS_ZOMBIE
+	end;
+OnReset:
+	killmonster 'sthd_map$, instance_npcname("#Last_Boss2_Monster") + "::OnMobDead";
+	stopnpctimer;
+	end;
+OnMobDead:
+	end;
+}
+
+// hp < 5000001
+1@sthd,99,127,0	script	#Last_Boss_Monster	HIDDEN_WARP_NPC,{
+	end;
+OnStart:
+OnTimer10000:
+	initnpctimer;
+	end;
+OnReset:
+	killmonster 'sthd_map$, instance_npcname("#Last_Boss_Monster") + "::OnMobDead";
+	stopnpctimer;
+	end;
+OnTimer1000:
+OnTimer8000:
+OnTimer16000:
+OnTimer24000:
+OnTimer32000:
+	// no count check
+	areamonster 'sthd_map$,84,76,124,116,"Cursed Soldier of Bijou",3485,2, instance_npcname("#Last_Boss_Monster") + "::OnMobDead";	// AS_D_CURSED_SOLDIER
+	end;
+OnTimer33000:
+	stopnpctimer;
+	end;
+OnMobDead:
+	end;
+}
+
+// Kill the player
+1@sthd,94,119,0	script	#pantheon_damage1	HIDDEN_WARP_NPC,6,5,{
+	end;
+OnTouch:
+	unitkill getcharid(3);
+	end;
+OnEvent:
+	specialeffect EF_GUMGANG4;
+	progressbar_npc "000000",4;
+	specialeffect EF_NPC_EARTHQUAKE;
+	cloakoffnpc instance_npcname( strnpcinfo(0) );
+	initnpctimer;
+	end;
+OnTimer1000:
+	cloakonnpc instance_npcname( strnpcinfo(0) );
+	end;
+OnTimer2000:
+	stopnpctimer;
+	end;
+}
+1@sthd,96,109,0	duplicate(#pantheon_damage1)	#pantheon_damage2	HIDDEN_WARP_NPC,6,5
+1@sthd,104,110,0	duplicate(#pantheon_damage1)	#pantheon_damage3	HIDDEN_WARP_NPC,6,5
+1@sthd,110,110,0	duplicate(#pantheon_damage1)	#pantheon_damage4	HIDDEN_WARP_NPC,6,5
+1@sthd,113,117,0	duplicate(#pantheon_damage1)	#pantheon_damage5	HIDDEN_WARP_NPC,6,5
+1@sthd,112,103,0	duplicate(#pantheon_damage1)	#pantheon_damage6	HIDDEN_WARP_NPC,6,5
+1@sthd,104,103,0	duplicate(#pantheon_damage1)	#pantheon_damage7	HIDDEN_WARP_NPC,6,5
+1@sthd,97,103,0	duplicate(#pantheon_damage1)	#pantheon_damage8	HIDDEN_WARP_NPC,6,5
+1@sthd,92,97,0	duplicate(#pantheon_damage1)	#pantheon_damage9	HIDDEN_WARP_NPC,6,5
+1@sthd,99,95,0	duplicate(#pantheon_damage1)	#pantheon_damage10	HIDDEN_WARP_NPC,6,5
+1@sthd,108,95,0	duplicate(#pantheon_damage1)	#pantheon_damage11	HIDDEN_WARP_NPC,6,5
+1@sthd,116,95,0	duplicate(#pantheon_damage1)	#pantheon_damage12	HIDDEN_WARP_NPC,6,5
+1@sthd,112,87,0	duplicate(#pantheon_damage1)	#pantheon_damage13	HIDDEN_WARP_NPC,6,5
+1@sthd,104,88,0	duplicate(#pantheon_damage1)	#pantheon_damage14	HIDDEN_WARP_NPC,6,5
+1@sthd,95,87,0	duplicate(#pantheon_damage1)	#pantheon_damage15	HIDDEN_WARP_NPC,6,5
+1@sthd,96,78,0	duplicate(#pantheon_damage1)	#pantheon_damage16	HIDDEN_WARP_NPC,6,5
+1@sthd,94,72,0	duplicate(#pantheon_damage1)	#pantheon_damage17	HIDDEN_WARP_NPC,6,5
+1@sthd,104,81,0	duplicate(#pantheon_damage1)	#pantheon_damage18	HIDDEN_WARP_NPC,6,5
+1@sthd,111,81,0	duplicate(#pantheon_damage1)	#pantheon_damage19	HIDDEN_WARP_NPC,6,5
+1@sthd,114,72,0	duplicate(#pantheon_damage1)	#pantheon_damage20	HIDDEN_WARP_NPC,6,5
+1@sthd,126,96,0	duplicate(#pantheon_damage1)	#pantheon_damage21	HIDDEN_WARP_NPC,6,6
+1@sthd,81,96,0	duplicate(#pantheon_damage1)	#pantheon_damage22	HIDDEN_WARP_NPC,6,6
+1@sthd,100,71,0	duplicate(#pantheon_damage1)	#pantheon_damage23	HIDDEN_WARP_NPC,6,6
+1@sthd,91,101,0	duplicate(#pantheon_damage1)	#pantheon_damage24	HIDDEN_WARP_NPC,6,6
+1@sthd,117,101,0	duplicate(#pantheon_damage1)	#pantheon_damage25	HIDDEN_WARP_NPC,6,6
+1@sthd,117,90,0	duplicate(#pantheon_damage1)	#pantheon_damage26	HIDDEN_WARP_NPC,6,6
+1@sthd,90,90,0	duplicate(#pantheon_damage1)	#pantheon_damage27	HIDDEN_WARP_NPC,6,6
+
+1@sthd,104,96,4	script	Sky Fortress Escape Warp#end_warp	1_SHADOW_NPC,{
+	if (select( "Do not go outside of the Sky Fortress.", "Go outside of the Sky Fortress." ) == 1) {
+		mes "- The warp is emanating bright lights. -";
+		close;
+	}
+	mes "- You start to transport. -";
+	close2;
+	if (fortress_entrance_loc == 0)
+		warp "prt_q",244,81;
+	else {
+		warp "dali02",117,69;
+		fortress_entrance_loc = 0;
+	}
+	end;
+
+OnEnable:
+	initnpctimer;
+	enablenpc instance_npcname("Sky Fortress Escape Warp#end_warp");
+	end;
+OnTimer2000:
+	specialeffect EF_ENHANCE;
+	end;
+OnTimer3000:
+	initnpctimer;
+	end;
+
+OnInstanceInit:
+	'status_event = 0;
+	'boss_id = 0;
+	'pantheon_event[0] = 0;
+	'pantheon_event[1] = 0;
+
+	'sthb_map$ = instance_mapname("1@sthb");
+	'sthc_map$ = instance_mapname("1@sthc");
+	'sthd_map$ = instance_mapname("1@sthd");
+
+	// Warps
+	disablenpc instance_npcname("#sthd_move_01_01");
+	disablenpc instance_npcname("#sthd_move_02_01");
+	disablenpc instance_npcname("#sthd_move_02_02");
+
+	disablenpc instance_npcname("#sthd_event_1_boss");
+	disablenpc instance_npcname("Stefan.J.E.Wolf#sthd_01");
+	disablenpc instance_npcname("Stefan.J.E.Wolf#sthd_02");
+	disablenpc instance_npcname("#Stefan_Action1");
+
+	for ( .@i = 1; .@i <= 6; .@i++ ) {
+		disablenpc instance_npcname("Activated Warp#sthd_mov_" + .@i);
+		disablenpc instance_npcname("Deactivated Warp#sthd_mov_" + .@i);
+		disablenpc instance_npcname("#sthd_move_back_a_" + .@i);
+	}
+
+	disablenpc instance_npcname("#sthd_event_2");
+	disablenpc instance_npcname("#sthd_event_3");
+	disablenpc instance_npcname("#sthd_event_4");
+	for ( .@i = 5; .@i <= 18; .@i++ )
+		disablenpc instance_npcname("#sthd_event_" + .@i);
+
+	disablenpc instance_npcname("#sthd_key_control");
+
+	disablenpc instance_npcname("Sky Fortress Gold Treasure#1");
+	disablenpc instance_npcname("Sky Fortress Gold Treasure#2");
+	disablenpc instance_npcname("Sky Fortress Gold Treasure#3");
+	disablenpc instance_npcname("Sky Fortress Gold Treasure#4");
+	disablenpc instance_npcname("Sky Fortress Treasure Box");
+	disablenpc instance_npcname("Wind Ghost in Experiment");
+	disablenpc instance_npcname("Immortal Cursed Knight#");
+	disablenpc instance_npcname("Immortal Wind Ghost#01");
+
+	disablenpc instance_npcname("#Stefan_Action2");
+	disablenpc instance_npcname("Stefan.J.E.Wolf#sthd_03");
+
+	// Boss room
+	disablenpc instance_npcname("#Stefan for display3");
+	disablenpc instance_npcname("Stefan.J.E.Wolf#sthd_04");
+	disablenpc instance_npcname("#Last_Boss");
+	disablenpc instance_npcname("#Last_Boss2_Monster");
+	disablenpc instance_npcname("#Last_Boss_Monster");
+	disablenpc instance_npcname("Sky Fortress Escape Warp#end_warp");
+	for ( .@i = 1; .@i <= 27; .@i++ )
+		cloakonnpc instance_npcname("#pantheon_damage" + .@i);
+	end;
+}

+ 2 - 0
npc/re/scripts_athena.conf

@@ -86,6 +86,8 @@ npc: npc/re/instances/RitualOfBlessing.txt
 npc: npc/re/instances/RoomOfConsciousness.txt
 npc: npc/re/instances/SarahAndFenrir.txt
 npc: npc/re/instances/SaraMemory.txt
+npc: npc/re/instances/SkyFortress.txt
+
 npc: npc/re/instances/WernerLaboratoryCentralRoom.txt
 npc: npc/re/instances/WolfchevLaboratory.txt
 //npc: npc/custom/official/GeffenMagicTournament.txt

+ 13 - 0
sql-files/mob_db_re.sql

@@ -2103,6 +2103,19 @@ REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`leve
 REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`drop1_item`,`drop1_rate`,`drop1_nosteal`) VALUES (3452,'ZOMBIE_GUARD','Zombie Guard','Zombie Guard',145,124000,6887,4809,897,347,200,35,138,75,200,43,120,20,1,10,12,'Medium','Undead','Undead',4,400,768,2784,480,'04','Zombie_Guard_Card',1,true);
 REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`racegroup_hearthunter`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`) VALUES (3454,'HEART_HUNTER_N','Suspicious Intruder','Suspicious Intruder',103,20714,1963,2001,703,178,49,28,36,53,32,22,98,5,1,10,12,'Medium','Demihuman',true,'Dark',2,200,864,1268,480,'04');
 REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`defense`,`magic_defense`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`mode_ignoremelee`,`mode_ignoremagic`,`mode_ignoreranged`,`mode_ignoremisc`) VALUES (3455,'GLASS_PLATE','Plate','Plate',1,100,99,7,12,'Small','Formless','Neutral',1,1000,true,true,true,true);
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`mvp_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`class`,`mode_mvp`,`mvpdrop1_item`,`mvpdrop1_rate`,`mvpdrop2_item`,`mvpdrop2_rate`,`mvpdrop3_item`,`mvpdrop3_rate`,`drop1_item`,`drop1_rate`,`drop2_item`,`drop2_rate`,`drop3_item`,`drop3_rate`,`drop4_item`,`drop4_rate`,`drop5_item`,`drop5_rate`,`drop6_item`,`drop6_rate`,`drop6_nosteal`,`drop7_item`,`drop7_rate`,`drop7_nosteal`,`drop8_item`,`drop8_rate`,`drop8_nosteal`) VALUES (3473,'AS_RAGGED_GOLEM','Stefan.J.E.Wolf','Stefan.J.E.Wolf',160,20000000,96453,109040,5000,8128,640,146,30,248,57,16,59,245,43,1,14,16,'Large','Undead','Undead',1,300,960,1632,480,'21','Boss',true,'Old_Blue_Box',5000,'Old_Violet_Box',5000,'Old_Card_Album',2000,'Katar_170',1,'Two_Hand_Spear_170',1,'Staff_170',1,'Yggdrasilberry',1000,'Seed_Of_Yggdrasil',2000,'Oridecon',3500,true,'Elunium',3500,true,'As_Ragged_Golem_Card',1,true);
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`class`,`drop1_item`,`drop1_rate`,`drop2_item`,`drop2_rate`,`drop3_item`,`drop3_rate`,`drop4_item`,`drop4_rate`,`drop5_item`,`drop5_rate`,`drop6_item`,`drop6_rate`,`drop6_nosteal`,`drop7_item`,`drop7_rate`,`drop7_nosteal`) VALUES (3474,'AS_BLOODY_KNIGHT','Immortal Cursed Knight','Immortal Cursed Knight',160,10000000,47986,46416,4666,434,178,48,193,103,102,83,240,65,2,10,12,'Large','Formless','Dark',2,250,768,528,288,'21','Boss','Two_Hand_Spear_170',1,'Old_Card_Album',500,'Yggdrasilberry',1004,'Seed_Of_Yggdrasil',2005,'Oridecon',3245,'Elunium',3245,true,'As_Bdy_Knight_Card',1,true);
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`class`,`drop1_item`,`drop1_rate`,`drop2_item`,`drop2_rate`,`drop3_item`,`drop3_rate`,`drop4_item`,`drop4_rate`,`drop5_item`,`drop5_rate`,`drop6_item`,`drop6_rate`,`drop6_nosteal`,`drop7_item`,`drop7_rate`,`drop7_nosteal`) VALUES (3475,'AS_WIND_GHOST','Immortal Wind Ghost','Immortal Wind Ghost',160,10000000,47986,46416,4666,1577,136,72,131,68,53,116,259,42,5,10,12,'Medium','Demon','Wind',2,150,2112,1152,672,'21','Boss','Staff_170',1,'Old_Card_Album',500,'Yggdrasilberry',1004,'Seed_Of_Yggdrasil',2005,'Oridecon',3245,'Elunium',3245,true,'As_Wind_Ghost_Card',1,true);
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`dex`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`) VALUES (3476,'AS_ZOMBIE','Immortal Zombie Soldier','Immortal Zombie Soldier',160,405694,2446,3669,188,28,141,90,160,169,1,10,12,'Medium','Undead','Undead',1,400,2612,912,288,'09');
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`drop1_item`,`drop1_rate`,`drop1_option`,`drop2_item`,`drop2_rate`,`drop2_option`,`drop3_item`,`drop3_rate`,`drop3_option`,`drop4_item`,`drop4_rate`,`drop4_option`,`drop5_item`,`drop5_rate`,`drop5_option`) VALUES (3477,'AS_IMMORTAL_CORPS','Immortal Fortress Legio','Immortal Fortress Legio',160,405694,15464,12888,2446,1546,150,83,165,90,95,75,180,50,1,10,12,'Medium','Demon','Undead',1,150,1500,600,500,'09','Sinister_Dagger',20,'AS_WEAPON_4','Sinister_Saber',20,'AS_WEAPON_3','Sinister_Twohand_Sword',20,'AS_WEAPON_5','Sinister_Spear',20,'AS_WEAPON_5','Sinister_Lance',20,'AS_WEAPON_5');
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`mode_detector`,`drop1_item`,`drop1_rate`,`drop1_nosteal`) VALUES (3478,'AS_ZOMBIE_SLAUGHTER','Sky Fortress Key Keeper','Sky Fortress Key Keeper',160,423332,15464,12888,2446,292,129,58,150,88,105,16,210,27,1,10,12,'Medium','Undead','Undead',2,200,676,648,432,'09',true,'Air_Stronghold_Key',10000,true);
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`drop1_item`,`drop1_rate`,`drop1_option`,`drop2_item`,`drop2_rate`,`drop2_option`,`drop3_item`,`drop3_rate`,`drop3_option`,`drop4_item`,`drop4_rate`,`drop4_option`,`drop5_item`,`drop5_rate`,`drop5_option`,`drop6_item`,`drop6_rate`,`drop6_option`) VALUES (3479,'AS_ZOMBIE_MASTER','Immortal Zombie Assault','Immortal Zombie Assault',160,405694,15464,12888,2446,430,104,61,73,96,64,65,138,64,1,10,12,'Medium','Undead','Undead',1,175,2612,912,288,'09','Sinister_Book',20,'AS_WEAPON_4','Sinister_Katar',20,'AS_WEAPON_5','Sinister_Huuma',20,'AS_WEAPON_4','Sinister_Twohand_Axe',20,'AS_WEAPON_3','Sinister_Mace',20,'AS_WEAPON_3','Sinister_Fist',20,'AS_WEAPON_5');
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`drop1_item`,`drop1_rate`,`drop1_option`,`drop2_item`,`drop2_rate`,`drop2_option`,`drop3_item`,`drop3_rate`,`drop3_option`,`drop4_item`,`drop4_rate`,`drop4_option`,`drop5_item`,`drop5_rate`,`drop5_option`,`drop6_item`,`drop6_rate`,`drop6_option`) VALUES (3480,'AS_CURSED_SOLDIER','Immortal Cursed Zombie','Immortal Cursed Zombie',160,405694,15464,12888,2446,1,123,50,117,86,93,81,309,33,9,10,12,'Medium','Undead','Undead',1,150,1960,576,420,'09','Sinister_Staff',20,'AS_WEAPON_1','Sinister_Rod',20,'AS_WEAPON_1','Sinister_Revolver',20,'AS_WEAPON_2','Sinister_Wire',20,'AS_WEAPON_2','Sinister_Viollin',20,'AS_WEAPON_2','Sinister_Bow',20,'AS_WEAPON_2');
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`drop1_item`,`drop1_rate`,`drop1_option`,`drop2_item`,`drop2_rate`,`drop2_option`,`drop3_item`,`drop3_rate`,`drop3_option`,`drop4_item`,`drop4_rate`,`drop4_option`,`drop5_item`,`drop5_rate`,`drop5_option`,`drop6_item`,`drop6_rate`,`drop6_option`) VALUES (3481,'AS_EVIL_SHADOW1','Immortal Nightmare Shadow','Immortal Nightmare Shadow',160,423330,14059,13590,2446,498,34,34,102,61,102,24,132,51,1,10,12,'Large','Demon','Dark',1,200,1500,600,500,'09','Sinister_Book',30,'AS_WEAPON_4','Sinister_Katar',30,'AS_WEAPON_5','Sinister_Huuma',30,'AS_WEAPON_4','Sinister_Twohand_Axe',30,'AS_WEAPON_3','Sinister_Mace',30,'AS_WEAPON_3','Sinister_Fist',30,'AS_WEAPON_5');
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`drop1_item`,`drop1_rate`,`drop1_option`,`drop2_item`,`drop2_rate`,`drop2_option`,`drop3_item`,`drop3_rate`,`drop3_option`,`drop4_item`,`drop4_rate`,`drop4_option`,`drop5_item`,`drop5_rate`,`drop5_option`,`drop6_item`,`drop6_rate`,`drop6_option`) VALUES (3482,'AS_EVIL_SHADOW2','Immortal Angry Shadow','Immortal Angry Shadow',160,388054,14059,13590,2202,1033,137,40,68,139,51,39,234,17,1,10,12,'Medium','Demon','Dark',1,200,1000,500,600,'09','Sinister_Staff',30,'AS_WEAPON_1','Sinister_Rod',30,'AS_WEAPON_1','Sinister_Revolver',30,'AS_WEAPON_2','Sinister_Wire',30,'AS_WEAPON_2','Sinister_Viollin',30,'AS_WEAPON_2','Sinister_Bow',30,'AS_WEAPON_2');
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`base_exp`,`job_exp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`drop1_item`,`drop1_rate`,`drop1_option`,`drop2_item`,`drop2_rate`,`drop2_option`,`drop3_item`,`drop3_rate`,`drop3_option`,`drop4_item`,`drop4_rate`,`drop4_option`,`drop5_item`,`drop5_rate`,`drop5_option`) VALUES (3483,'AS_EVIL_SHADOW3','Immortal Death Shadow','Immortal Death Shadow',160,423330,14059,13590,2446,106,100,49,135,117,74,37,142,30,1,10,12,'Large','Demon','Dark',1,200,1800,780,480,'09','Sinister_Dagger',30,'AS_WEAPON_4','Sinister_Saber',30,'AS_WEAPON_3','Sinister_Twohand_Sword',30,'AS_WEAPON_5','Sinister_Spear',30,'AS_WEAPON_5','Sinister_Lance',30,'AS_WEAPON_5');
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`class`,`mode_mvp`) VALUES (3484,'AS_D_RAGGED_GOLEM','Stefan.J.E.Wolf','Stefan.J.E.Wolf',160,20000000,8128,640,146,30,248,57,16,59,245,43,1,14,16,'Large','Undead','Undead',2,300,960,1632,480,'21','Boss',true);
+REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`) VALUES (3485,'AS_D_CURSED_SOLDIER','Cursed Soldier of Bijou','Cursed Soldier of Bijou',160,405694,2446,1,123,50,117,86,93,81,309,33,9,10,12,'Medium','Undead','Undead',1,150,1960,576,420,'09');
 REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`drop1_item`,`drop1_rate`,`drop1_nosteal`) VALUES (3487,'IMMORTAL_CORPS1','Butcher Soldier','Butcher Soldier',115,90000,800,800,50,30,100,90,70,50,150,50,1,10,12,'Small','Demon','Undead',4,100,500,840,300,'04','Immotal_Corps_Card',1,true);
 REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`drop1_item`,`drop1_rate`,`drop1_nosteal`) VALUES (3488,'IMMORTAL_CORPS2','Scythe Soldier','Scythe Soldier',115,120000,600,600,30,60,84,75,70,120,120,80,1,10,12,'Small','Demon','Undead',4,150,1000,1100,480,'04','Immotal_Corps_Card',1,true);
 REPLACE INTO `mob_db_re` (`id`,`name_aegis`,`name_english`,`name_japanese`,`level`,`hp`,`attack`,`attack2`,`defense`,`magic_defense`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`attack_range`,`skill_range`,`chase_range`,`size`,`race`,`element`,`element_level`,`walk_speed`,`attack_delay`,`attack_motion`,`damage_motion`,`ai`,`drop1_item`,`drop1_rate`,`drop1_nosteal`) VALUES (3489,'IMMORTAL_CORPS3','Bone Crash Soldier','Bone Crash Soldier',115,170000,900,900,80,40,120,90,130,30,80,50,2,10,12,'Small','Demon','Undead',4,200,1500,1500,480,'04','Immotal_Corps_Card',1,true);

+ 23 - 0
src/map/battle.cpp

@@ -4321,6 +4321,18 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			skillratio += -100 + 400 * skill_lv;
 			RE_LVL_DMOD(100);
 			break;
+		case NPC_IGNITIONBREAK:
+			// 3x3 cell Damage   = 1000  1500  2000  2500  3000 %
+			// 7x7 cell Damage   = 750   1250  1750  2250  2750 %
+			// 11x11 cell Damage = 500   1000  1500  2000  2500 %
+			i = distance_bl(src,target);
+			if (i < 2)
+				skillratio += -100 + 500 * (skill_lv + 1);
+			else if (i < 4)
+				skillratio += -100 + 250 + 500 * skill_lv;
+			else
+				skillratio += -100 + 500 * skill_lv;
+			break;
 		case RK_STORMBLAST:
 			skillratio += -100 + (((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : 0) + status_get_str(src) / 8) * 100; // ATK = [{Rune Mastery Skill Level + (Caster's STR / 8)} x 100] %
 			RE_LVL_DMOD(100);
@@ -4329,6 +4341,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			skillratio += -100 + 50 * skill_lv + 10 * (sd ? pc_checkskill(sd,KN_SPEARMASTERY) : 5);
 			RE_LVL_DMOD(150); // Base level bonus.
 			break;
+		// case NPC_PHANTOMTHRUST:	// ATK = 100% for all level
 		case GC_CROSSIMPACT:
 			skillratio += -100 + 1000 + 150 * skill_lv;
 			RE_LVL_DMOD(100);
@@ -6661,6 +6674,10 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						if( sc && sc->data[SC_BLAST_OPTION] )
 							skillratio += (sd ? sd->status.job_level / 2 : 0);
 						break;
+					case NPC_FIREWALK:
+					case NPC_ELECTRICWALK:
+						skillratio += -100 + 100 * skill_lv;
+						break;
 					case SO_EARTHGRAVE:
 						skillratio += -100 + sstatus->int_ * skill_lv + ((sd) ? pc_checkskill(sd, SA_SEISMICWEAPON) * 200 : 0);
 						RE_LVL_DMOD(100);
@@ -6679,6 +6696,9 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						if( sc && sc->data[SC_CURSED_SOIL_OPTION] )
 							skillratio += (sd ? sd->status.job_level * 5 : 0);
 						break;
+					case NPC_POISON_BUSTER:
+						skillratio += -100 + 1500 * skill_lv;
+						break;
 					case SO_PSYCHIC_WAVE:
 						skillratio += -100 + 70 * skill_lv + 3 * sstatus->int_;
 						RE_LVL_DMOD(100);
@@ -6692,6 +6712,9 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						if (sc && sc->data[SC_CURSED_SOIL_OPTION])
 							skillratio += (sd ? sd->status.job_level : 0);
 						break;
+					case NPC_CLOUD_KILL:
+						skillratio += -100 + 50 * skill_lv;
+						break;
 					case SO_VARETYR_SPEAR: //MATK [{( Endow Tornado skill level x 50 ) + ( Caster INT x Varetyr Spear Skill level )} x Caster Base Level / 100 ] %
 						skillratio += -100 + status_get_int(src) * skill_lv + ((sd) ? pc_checkskill(sd, SA_LIGHTNINGLOADER) * 50 : 0);
 						RE_LVL_DMOD(100);

+ 2 - 0
src/map/map.cpp

@@ -504,7 +504,9 @@ int map_moveblock(struct block_list *bl, int x1, int y1, t_tick tick)
 				if (sc->data[SC_PROPERTYWALK]
 					&& sc->data[SC_PROPERTYWALK]->val3 < skill_get_maxcount(sc->data[SC_PROPERTYWALK]->val1,sc->data[SC_PROPERTYWALK]->val2)
 					&& map_find_skill_unit_oncell(bl,bl->x,bl->y,SO_ELECTRICWALK,NULL,0) == NULL
+					&& map_find_skill_unit_oncell(bl,bl->x,bl->y,NPC_ELECTRICWALK,NULL,0) == NULL
 					&& map_find_skill_unit_oncell(bl,bl->x,bl->y,SO_FIREWALK,NULL,0) == NULL
+					&& map_find_skill_unit_oncell(bl,bl->x,bl->y,NPC_FIREWALK,NULL,0) == NULL
 					&& skill_unitsetting(bl,sc->data[SC_PROPERTYWALK]->val1,sc->data[SC_PROPERTYWALK]->val2,x0, y0,0)) {
 						sc->data[SC_PROPERTYWALK]->val3++;
 				}

+ 1 - 0
src/map/script_constants.hpp

@@ -1611,6 +1611,7 @@
 	export_constant(SC_EP16_2_BUFF_AC);
 	export_constant(SC_EMERGENCY_MOVE);
 	export_constant(SC_MADOGEAR);
+	export_constant(SC_NPC_HALLUCINATIONWALK);
 #ifdef RENEWAL
 	export_constant(SC_EXTREMITYFIST2);
 #endif

+ 25 - 4
src/map/skill.cpp

@@ -3450,7 +3450,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 				sp = sp/((skill_lv|1)*(skill_lv|1)); //Estimate SP cost of a single water-ball
 			status_heal(bl, 0, sp, 2);
 		}
-		if( (dmg.damage || dmg.damage2) && tsc && tsc->data[SC_HALLUCINATIONWALK] && rnd()%100 < tsc->data[SC_HALLUCINATIONWALK]->val3 ) {
+		if( (dmg.damage || dmg.damage2) && tsc && (tsc->data[SC_HALLUCINATIONWALK] && rnd()%100 < tsc->data[SC_HALLUCINATIONWALK]->val3 || tsc->data[SC_NPC_HALLUCINATIONWALK] && rnd()%100 < tsc->data[SC_NPC_HALLUCINATIONWALK]->val3) ) {
 			dmg.damage = dmg.damage2 = 0;
 			dmg.dmg_lv = ATK_MISS;
 		}
@@ -5101,6 +5101,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 	case NPC_JACKFROST:
 	case NPC_REVERBERATION_ATK:
 	case NPC_ARROWSTORM:
+	case NPC_IGNITIONBREAK:
 	case RK_IGNITIONBREAK:
 	case RK_HUNDREDSPEAR:
 	case AB_JUDEX:
@@ -5625,6 +5626,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
 		break;
 	case RK_PHANTOMTHRUST:
+	case NPC_PHANTOMTHRUST:
 		unit_setdir(src,map_calc_dir(src, bl->x, bl->y));
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 
@@ -6028,6 +6030,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		}
 		break;
 
+	case NPC_POISON_BUSTER:
 	case SO_POISON_BUSTER:
 		if( tsc && tsc->data[SC_POISON] ) {
 			skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
@@ -7096,6 +7099,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case SJ_FALLINGSTAR:
 	case SJ_LIGHTOFSUN:
 	case SJ_BOOKOFDIMENSION:
+	case NPC_HALLUCINATIONWALK:
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,
 			sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
 		break;
@@ -7543,6 +7547,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	}
 		break;
 
+	case NPC_IGNITIONBREAK:
 	case RK_IGNITIONBREAK:
 		skill_area_temp[1] = 0;
 #if PACKETVER >= 20180207
@@ -11764,6 +11769,7 @@ static int8 skill_castend_id_check(struct block_list *src, struct block_list *ta
 		case SL_SKE:
 		case SL_SKA:
 		case RK_PHANTOMTHRUST:
+		case NPC_PHANTOMTHRUST:
 			if (target->type == BL_MOB && ((TBL_MOB*)target)->mob_id == MOBID_EMPERIUM)
 				return USESKILL_FAIL_MAX;
 			break;
@@ -11772,6 +11778,7 @@ static int8 skill_castend_id_check(struct block_list *src, struct block_list *ta
 	if (inf && battle_check_target(src, target, inf) <= 0) {
 		switch(skill_id) {
 			case RK_PHANTOMTHRUST:
+			case NPC_PHANTOMTHRUST:
 			case AB_CLEARANCE:
 				return USESKILL_FAIL_TOTARGET;
 			default:
@@ -12519,6 +12526,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 
 	case SO_WARMER:
 	case SO_CLOUD_KILL:
+	case NPC_CLOUD_KILL:
 		flag |= (skill_id == SO_WARMER) ? 8 : 4;
 		skill_unitsetting(src,skill_id,skill_lv,x,y,0);
 		break;
@@ -12999,6 +13007,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 
 	case SO_FIREWALK:
 	case SO_ELECTRICWALK:
+	case NPC_FIREWALK:
+	case NPC_ELECTRICWALK:
 		if( sc && sc->data[type] )
 			status_change_end(src,type,INVALID_TIMER);
 		sc_start2(src, src, type, 100, skill_id, skill_lv, skill_get_time(skill_id, skill_lv));
@@ -13660,6 +13670,7 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
 			return NULL;
 		break;
 	case SO_CLOUD_KILL:
+	case NPC_CLOUD_KILL:
 		skill_clear_group(src, 4);
 		break;
 	case SO_WARMER:
@@ -14854,7 +14865,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
 			break;
 
 		case UNT_VACUUM_EXTREME:
-			if (tsc && (tsc->data[SC_HALLUCINATIONWALK] || tsc->data[SC_HOVERING] || tsc->data[SC_VACUUM_EXTREME] ||
+			if (tsc && (tsc->data[SC_HALLUCINATIONWALK] || tsc->data[SC_NPC_HALLUCINATIONWALK] || tsc->data[SC_HOVERING] || tsc->data[SC_VACUUM_EXTREME] ||
 				(tsc->data[SC_VACUUM_EXTREME_POSTDELAY] && tsc->data[SC_VACUUM_EXTREME_POSTDELAY]->val2 == sg->group_id))) // Ignore post delay from other vacuum (this will make stack effect enabled)
 				return 0;
 
@@ -16074,6 +16085,11 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
 				return false;
 			}
 			break;
+		case NPC_HALLUCINATIONWALK:
+			if( sc && sc->data[SC_NPC_HALLUCINATIONWALK] ) {
+				return false;
+			}
+			break;
 		case RA_WUGMASTERY:
 			if( (pc_isfalcon(sd) && !battle_config.warg_can_falcon) || pc_isridingwug(sd) || sd->sc.data[SC__GROOMY]) {
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
@@ -16216,10 +16232,13 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
 			}
 			break;
 		case SO_FIREWALK:
-		case SO_ELECTRICWALK:	// Can't be casted until you've walked all cells.
+		case SO_ELECTRICWALK:
+		case NPC_FIREWALK:
+		case NPC_ELECTRICWALK:	// Can't be casted until you've walked all cells.
 			if( sc && sc->data[SC_PROPERTYWALK] &&
 			   sc->data[SC_PROPERTYWALK]->val3 < skill_get_maxcount(sc->data[SC_PROPERTYWALK]->val1,sc->data[SC_PROPERTYWALK]->val2) ) {
-				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
+				if( sd )
+					clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return false;
 			}
 			break;
@@ -18026,6 +18045,7 @@ int skill_clear_group(struct block_list *bl, int flag)
 					group[count++] = ud->skillunit[i];
 				break;
 			case SO_CLOUD_KILL:
+			case NPC_CLOUD_KILL:
 				if( flag&4 )
 					group[count++] = ud->skillunit[i];
 				break;
@@ -18068,6 +18088,7 @@ struct skill_unit_group *skill_locate_element_field(struct block_list *bl)
 			case SA_LANDPROTECTOR:
 			case NJ_SUITON:
 			case SO_CLOUD_KILL:
+			case NPC_CLOUD_KILL:
 			case SO_WARMER:
 			case SC_CHAOSPANIC:
 				return ud->skillunit[i];

+ 9 - 1
src/map/status.cpp

@@ -712,6 +712,10 @@ void initChangeTables(void)
 	set_sc( NPC_COMET			, SC_BURNING		, EFST_BURNT		, SCB_MDEF );
 	set_sc_with_vfx( NPC_MAXPAIN	,	 SC_MAXPAIN	, EFST_MAXPAIN	, SCB_NONE );
 	add_sc( NPC_JACKFROST        , SC_FREEZE		  );
+	add_sc( NPC_ELECTRICWALK	, SC_PROPERTYWALK		);
+	add_sc( NPC_FIREWALK		, SC_PROPERTYWALK		);
+	add_sc( NPC_CLOUD_KILL   	, SC_POISON		);
+	set_sc( NPC_HALLUCINATIONWALK	, SC_NPC_HALLUCINATIONWALK	, EFST_NPC_HALLUCINATIONWALK	, SCB_FLEE );
 
 	set_sc( CASH_BLESSING		, SC_BLESSING		, EFST_BLESSING		, SCB_STR|SCB_INT|SCB_DEX );
 	set_sc( CASH_INCAGI		, SC_INCREASEAGI	, EFST_INC_AGI, SCB_AGI|SCB_SPEED );
@@ -6916,6 +6920,8 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change
 		flee += sc->data[SC_MERC_FLEEUP]->val2;
 	if( sc->data[SC_HALLUCINATIONWALK] )
 		flee += sc->data[SC_HALLUCINATIONWALK]->val2;
+	if( sc->data[SC_NPC_HALLUCINATIONWALK] )
+		flee += sc->data[SC_NPC_HALLUCINATIONWALK]->val2;
 	if(sc->data[SC_MTF_HITFLEE])
 		flee += sc->data[SC_MTF_HITFLEE]->val2;
 	if( sc->data[SC_WATER_BARRIER] )
@@ -9216,7 +9222,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		)
 			return 0;
 	case SC_VACUUM_EXTREME:
-		if (sc && (sc->data[SC_HALLUCINATIONWALK] || sc->data[SC_HOVERING] || sc->data[SC_VACUUM_EXTREME] ||
+		if (sc && (sc->data[SC_HALLUCINATIONWALK] || sc->data[SC_NPC_HALLUCINATIONWALK] || sc->data[SC_HOVERING] || sc->data[SC_VACUUM_EXTREME] ||
 			(sc->data[SC_VACUUM_EXTREME_POSTDELAY] && sc->data[SC_VACUUM_EXTREME_POSTDELAY]->val2 == val2))) // Ignore post delay from other vacuum (this will make stack effect enabled)
 			return 0;
 		break;
@@ -11264,6 +11270,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			tick_time = 1000; // [GodLesZ] tick time
 			break;
 		case SC_HALLUCINATIONWALK:
+		case SC_NPC_HALLUCINATIONWALK:
 			val2 = 50 * val1; // Evasion rate of physical attacks. Flee
 			val3 = 10 * val1; // Evasion rate of magical attacks.
 			break;
@@ -12272,6 +12279,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		// Start |1|2|4 val_flag setting
 		case SC_POISONINGWEAPON:
 		case SC_CLOAKINGEXCEED:
+		case SC_NPC_HALLUCINATIONWALK:
 		case SC_HALLUCINATIONWALK:
 		case SC__SHADOWFORM:
 		case SC__GROOMY:

+ 2 - 0
src/map/status.hpp

@@ -942,6 +942,8 @@ enum sc_type : int16 {
 	SC_EMERGENCY_MOVE,
 	SC_MADOGEAR,
 
+	SC_NPC_HALLUCINATIONWALK,
+
 #ifdef RENEWAL
 	SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
 #endif