From 95c671a95daa5118883bd02b13c3fb876e8591b5 Mon Sep 17 00:00:00 2001 From: Atemo Date: Mon, 8 Mar 2021 15:12:40 +0100 Subject: [PATCH] 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 ! --- db/pre-re/skill_db.yml | 174 +++ db/re/instance_db.yml | 18 +- db/re/item_randomopt_group.yml | 4 +- db/re/mob_db.yml | 579 ++++++++- db/re/mob_skill_db.txt | 39 + db/re/quest_db.yml | 10 + db/re/skill_db.yml | 174 +++ npc/re/instances/SkyFortress.txt | 2070 ++++++++++++++++++++++++++++++ npc/re/scripts_athena.conf | 2 + sql-files/mob_db_re.sql | 13 + src/map/battle.cpp | 23 + src/map/map.cpp | 2 + src/map/script_constants.hpp | 1 + src/map/skill.cpp | 29 +- src/map/status.cpp | 10 +- src/map/status.hpp | 2 + 16 files changed, 3108 insertions(+), 42 deletions(-) create mode 100644 npc/re/instances/SkyFortress.txt diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index 78a30a613f..1db190bd18 100644 --- a/db/pre-re/skill_db.yml +++ b/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 diff --git a/db/re/instance_db.yml b/db/re/instance_db.yml index e409c000fa..0fa118133d 100644 --- a/db/re/instance_db.yml +++ b/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: diff --git a/db/re/item_randomopt_group.yml b/db/re/item_randomopt_group.yml index cac01ffa3c..09932978a4 100644 --- a/db/re/item_randomopt_group.yml +++ b/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: diff --git a/db/re/mob_db.yml b/db/re/mob_db.yml index 5b11358965..bcbe91cb78 100644 --- a/db/re/mob_db.yml +++ b/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 diff --git a/db/re/mob_skill_db.txt b/db/re/mob_skill_db.txt index 04d2e10c49..6e1278c6c9 100644 --- a/db/re/mob_skill_db.txt +++ b/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,,,,,, diff --git a/db/re/quest_db.yml b/db/re/quest_db.yml index 24f10f6110..5d5650bb4a 100644 --- a/db/re/quest_db.yml +++ b/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 diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 6d8f106a48..50cbf31abe 100644 --- a/db/re/skill_db.yml +++ b/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 diff --git a/npc/re/instances/SkyFortress.txt b/npc/re/instances/SkyFortress.txt new file mode 100644 index 0000000000..47408bd09d --- /dev/null +++ b/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[ ] = ; + 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; +} diff --git a/npc/re/scripts_athena.conf b/npc/re/scripts_athena.conf index 7329b159a2..e507d2b5a4 100644 --- a/npc/re/scripts_athena.conf +++ b/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 diff --git a/sql-files/mob_db_re.sql b/sql-files/mob_db_re.sql index 1d6fb99273..a1ca46f979 100644 --- a/sql-files/mob_db_re.sql +++ b/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); diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 6db7af24df..6bcc8edbc6 100644 --- a/src/map/battle.cpp +++ b/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); diff --git a/src/map/map.cpp b/src/map/map.cpp index 1768200add..11f1f9c00c 100644 --- a/src/map/map.cpp +++ b/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++; } diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 8cd0441d65..590f5f5782 100644 --- a/src/map/script_constants.hpp +++ b/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 diff --git a/src/map/skill.cpp b/src/map/skill.cpp index aacbcec41f..c2d4608bec 100755 --- a/src/map/skill.cpp +++ b/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]; diff --git a/src/map/status.cpp b/src/map/status.cpp index 9fc30c635c..7f34b84207 100644 --- a/src/map/status.cpp +++ b/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: diff --git a/src/map/status.hpp b/src/map/status.hpp index a07213ae70..3ba6fd1496 100644 --- a/src/map/status.hpp +++ b/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