Merge branch 'master' into script/episode19

This commit is contained in:
Atemo 2024-08-10 15:27:57 +02:00
commit f73a858d6c
51 changed files with 27656 additions and 20750 deletions

View File

@ -17,10 +17,18 @@
// 0x10: They display luk/3+1 instead of their actual critical in the // 0x10: They display luk/3+1 instead of their actual critical in the
// stat window (by default they don't crit) // stat window (by default they don't crit)
// 0x20: Their Min-Matk is always the same as their max // 0x20: Their Min-Matk is always the same as their max
// 0x40: Skill re-use delay is reset when they are vaporized.
// 0x80: Skill re-use delay is reset when they are warped (by skill or item) with player.
hom_setting: 0x3D hom_setting: 0x3D
// Should the cooldown or aftercast delay of homunculi skills be reset when
// the homunculus is vaporized?
// Default on official servers: yes for Pre-renewal, no for Renewal
//hom_delay_reset_vaporize: no
// Should the cooldown or aftercast delay of homunculi skills be reset when
// warping or changing maps?
// Default on official servers: yes for Pre-renewal, no for Renewal
//hom_delay_reset_warp: no
// The rate a homunculus will get friendly by feeding it. (Note 2) // The rate a homunculus will get friendly by feeding it. (Note 2)
homunculus_friendly_rate: 100 homunculus_friendly_rate: 100

View File

@ -2613,7 +2613,7 @@ Body:
Flags: Flags:
BuyingStore: true BuyingStore: true
Script: | Script: |
sc_start SC_SlowDown,5000,0; sc_start SC_SLOWDOWN,5000,100;
- Id: 12018 - Id: 12018
AegisName: Fire_Cracker AegisName: Fire_Cracker
Name: Firecracker Name: Firecracker

View File

@ -3660,17 +3660,27 @@ Body:
Reproduce: true Reproduce: true
CastCancel: true CastCancel: true
CastTime: CastTime:
- Level: 1
Time: 700
- Level: 2
Time: 1400
- Level: 3
Time: 2100
- Level: 4
Time: 2800
- Level: 5
Time: 3500
AfterCastActDelay:
- Level: 1 - Level: 1
Time: 1000 Time: 1000
- Level: 2 - Level: 2
Time: 2000 Time: 1200
- Level: 3 - Level: 3
Time: 3000 Time: 1400
- Level: 4 - Level: 4
Time: 4000 Time: 1600
- Level: 5 - Level: 5
Time: 5000 Time: 1800
AfterCastActDelay: 700
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -3722,7 +3732,7 @@ Body:
Time: 4000 Time: 4000
- Level: 5 - Level: 5
Time: 5000 Time: 5000
AfterCastActDelay: 700 AfterCastActDelay: 1000
Duration1: 100 Duration1: 100
Requires: Requires:
SpCost: SpCost:
@ -30726,10 +30736,8 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Range: 9
Hit: Single
HitCount: 1
AfterCastActDelay: 2000 AfterCastActDelay: 2000
AfterCastWalkDelay: 1000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -30752,11 +30760,8 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Splash: true
Hit: Single
HitCount: 1
SplashArea: -1
AfterCastActDelay: 35000 AfterCastActDelay: 35000
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 40000 Time: 40000
@ -30785,7 +30790,6 @@ Body:
Name: HLIF_BRAIN Name: HLIF_BRAIN
Description: Brain Surgery Description: Brain Surgery
MaxLevel: 5 MaxLevel: 5
SplashArea: 1
- Id: 8004 - Id: 8004
Name: HLIF_CHANGE Name: HLIF_CHANGE
Description: Change Description: Change
@ -30793,7 +30797,14 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single AfterCastActDelay:
- Level: 1
Time: 600000
- Level: 2
Time: 900000
- Level: 3
Time: 1200000
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -30801,13 +30812,6 @@ Body:
Time: 180000 Time: 180000
- Level: 3 - Level: 3
Time: 300000 Time: 300000
Duration2:
- Level: 1
Time: 600000
- Level: 2
Time: 900000
- Level: 3
Time: 1200000
Requires: Requires:
SpCost: 100 SpCost: 100
Status: Change Status: Change
@ -30819,7 +30823,8 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
Duration2: 1000 AfterCastActDelay: 1000
AfterCastWalkDelay: 1000
Requires: Requires:
SpCost: 10 SpCost: 10
- Id: 8006 - Id: 8006
@ -30831,6 +30836,7 @@ Body:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
AfterCastActDelay: 30000 AfterCastActDelay: 30000
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 40000 Time: 40000
@ -30869,6 +30875,14 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
AfterCastActDelay:
- Level: 1
Time: 300000
- Level: 2
Time: 600000
- Level: 3
Time: 900000
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -30876,13 +30890,6 @@ Body:
Time: 180000 Time: 180000
- Level: 3 - Level: 3
Time: 300000 Time: 300000
Duration2:
- Level: 1
Time: 300000
- Level: 2
Time: 600000
- Level: 3
Time: 900000
Requires: Requires:
SpCost: 120 SpCost: 120
Status: Bloodlust Status: Bloodlust
@ -30905,7 +30912,6 @@ Body:
Count: -2 Count: -2
- Level: 5 - Level: 5
Count: -3 Count: -3
AfterCastWalkDelay: 2000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -30926,6 +30932,18 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
AfterCastActDelay:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 120000
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -30937,17 +30955,6 @@ Body:
Time: 45000 Time: 45000
- Level: 5 - Level: 5
Time: 40000 Time: 40000
Duration2:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 120000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -30971,6 +30978,18 @@ Body:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
CastCancel: true CastCancel: true
AfterCastActDelay:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 120000
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -30982,17 +31001,6 @@ Body:
Time: 45000 Time: 45000
- Level: 5 - Level: 5
Time: 40000 Time: 40000
Duration2:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 120000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -31015,7 +31023,6 @@ Body:
Range: 15 Range: 15
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
AfterCastActDelay: 1000
Requires: Requires:
SpCost: 1 SpCost: 1
- Id: 8013 - Id: 8013
@ -31037,17 +31044,6 @@ Body:
Count: 4 Count: 4
- Level: 5 - Level: 5
Count: 5 Count: 5
AfterCastActDelay:
- Level: 1
Time: 2000
- Level: 2
Time: 2200
- Level: 3
Time: 2400
- Level: 4
Time: 2600
- Level: 5
Time: 2800
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -31068,8 +31064,7 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
AfterCastActDelay: 3000 AfterCastWalkDelay: 1500
AfterCastWalkDelay: 3000
Requires: Requires:
SpCost: 40 SpCost: 40
- Id: 8015 - Id: 8015
@ -31093,7 +31088,6 @@ Body:
HitCount: 1 HitCount: 1
Element: Weapon Element: Weapon
SplashArea: 4 SplashArea: 4
AfterCastWalkDelay: 1000
Requires: Requires:
SpCost: 1 SpCost: 1
- Id: 8018 - Id: 8018

View File

@ -2478,13 +2478,17 @@ Body:
DurationLookup: HLIF_AVOID DurationLookup: HLIF_AVOID
CalcFlags: CalcFlags:
Speed: true Speed: true
Flags:
NoSave: true
RemoveFromHomOnWarp: true
- Status: Change - Status: Change
DurationLookup: HLIF_CHANGE DurationLookup: HLIF_CHANGE
CalcFlags: CalcFlags:
Vit: true Vit: true
Int: true Int: true
Flags: Flags:
RemoveOnChangeMap: true NoSave: true
RemoveFromHomOnWarp: true
Fail: Fail:
Change: true Change: true
- Status: Bloodlust - Status: Bloodlust

View File

@ -501,19 +501,19 @@ Body:
7@thts: true 7@thts: true
8@thts: true 8@thts: true
- Id: 67 - Id: 67
Name: The Maze of Oz Name: Oz Labyrinth
Enter: Enter:
Map: 1@oz Map: 1@oz
X: 284 X: 284
Y: 167 Y: 167
- Id: 68 - Id: 68
Name: Thor Gunsu Base Name: Thor Military Base
Enter: Enter:
Map: 1@tcamp Map: 1@tcamp
X: 103 X: 103
Y: 237 Y: 237
- Id: 69 - Id: 69
Name: A Gathering Place of Wolves Name: Wolves Gathering Place
Enter: Enter:
Map: 1@nyr Map: 1@nyr
X: 194 X: 194
@ -529,7 +529,7 @@ Body:
AdditionalMaps: AdditionalMaps:
2@nyr: true 2@nyr: true
- Id: 71 - Id: 71
Name: Villa of High Priest Name: High Priest's Villa
Enter: Enter:
Map: 1@adv Map: 1@adv
X: 123 X: 123

View File

@ -187652,7 +187652,7 @@ Body:
bonus2 bSkillAtk,"GC_CROSSIMPACT",20*(.@r/3); bonus2 bSkillAtk,"GC_CROSSIMPACT",20*(.@r/3);
bonus2 bSkillAtk,"GC_ROLLINGCUTTER",20*(.@r/3); bonus2 bSkillAtk,"GC_ROLLINGCUTTER",20*(.@r/3);
bonus2 bSkillAtk,"SC_TRIANGLESHOT",20*(.@r/3); bonus2 bSkillAtk,"SC_TRIANGLESHOT",20*(.@r/3);
bonus2 bSkillAtk,"SC_STARTMARK",20*(.@r/3); bonus2 bSkillAtk,"SC_FATALMENACE",20*(.@r/3);
if (.@r>=9) { if (.@r>=9) {
bonus bLongAtkRate,10; bonus bLongAtkRate,10;
bonus bShortAtkRate,10; bonus bShortAtkRate,10;

View File

@ -86200,31 +86200,31 @@ Body:
Flags: Flags:
BuyingStore: true BuyingStore: true
- Id: 1001072 - Id: 1001072
AegisName: aegis_1001072 AegisName: Evil_Black_Bid
Name: Evil Orb Name: Evil Orb
Type: Etc Type: Etc
Buy: 1480 Buy: 1480
Weight: 10 Weight: 10
- Id: 1001073 - Id: 1001073
AegisName: aegis_1001073 AegisName: Ectoplasmic_Stone
Name: Ectoplasmic Stone Name: Ectoplasmic Stone
Type: Etc Type: Etc
Buy: 1460 Buy: 1460
Weight: 10 Weight: 10
- Id: 1001074 - Id: 1001074
AegisName: aegis_1001074 AegisName: Heavy_Chain
Name: Heavy Chain Name: Heavy Chain
Type: Etc Type: Etc
Buy: 1480 Buy: 1480
Weight: 10 Weight: 10
- Id: 1001075 - Id: 1001075
AegisName: aegis_1001075 AegisName: Evil_Minded_Ruby
Name: Evil Minded Ruby Name: Evil Minded Ruby
Type: Etc Type: Etc
Buy: 1500 Buy: 1500
Weight: 10 Weight: 10
- Id: 1001076 - Id: 1001076
AegisName: aegis_1001076 AegisName: Small_Sewing_Box
Name: Small Sewing Kit Name: Small Sewing Kit
Type: Etc Type: Etc
Buy: 1640 Buy: 1640
@ -86236,37 +86236,37 @@ Body:
Buy: 1600 Buy: 1600
Weight: 10 Weight: 10
- Id: 1001078 - Id: 1001078
AegisName: aegis_1001078 AegisName: Blue_Moon_Stone
Name: Fragments of the Blue Moon Name: Fragments of the Blue Moon
Type: Etc Type: Etc
Buy: 1720 Buy: 1720
Weight: 10 Weight: 10
- Id: 1001079 - Id: 1001079
AegisName: aegis_1001079 AegisName: Weird_Tentacle
Name: Monstrous Tentacles Name: Monstrous Tentacles
Type: Etc Type: Etc
Buy: 1520 Buy: 1520
Weight: 10 Weight: 10
- Id: 1001080 - Id: 1001080
AegisName: aegis_1001080 AegisName: Congealed_Poison
Name: Congealed Poison Name: Congealed Poison
Type: Etc Type: Etc
Buy: 1600 Buy: 1600
Weight: 10 Weight: 10
- Id: 1001081 - Id: 1001081
AegisName: aegis_1001081 AegisName: Slicky_Fluid
Name: Slimy Fluid Name: Slimy Fluid
Type: Etc Type: Etc
Buy: 1560 Buy: 1560
Weight: 10 Weight: 10
- Id: 1001082 - Id: 1001082
AegisName: aegis_1001082 AegisName: Reptile_Stone
Name: Monster's Stone Name: Monster's Stone
Type: Etc Type: Etc
Buy: 1720 Buy: 1720
Weight: 10 Weight: 10
- Id: 1001083 - Id: 1001083
AegisName: aegis_1001083 AegisName: Turn_Yellow_Leaf
Name: Maple Leaves Name: Maple Leaves
Type: Etc Type: Etc
Buy: 1640 Buy: 1640
@ -86278,13 +86278,13 @@ Body:
Buy: 1480 Buy: 1480
Weight: 10 Weight: 10
- Id: 1001085 - Id: 1001085
AegisName: aegis_1001085 AegisName: Cool_Liquid
Name: Cool Liquid Name: Cool Liquid
Type: Etc Type: Etc
Buy: 1460 Buy: 1460
Weight: 10 Weight: 10
- Id: 1001086 - Id: 1001086
AegisName: aegis_1001086 AegisName: Green_Crystal_Fragment
Name: Blue Crystal Shard Name: Blue Crystal Shard
Type: Etc Type: Etc
Buy: 1480 Buy: 1480
@ -86296,7 +86296,7 @@ Body:
Buy: 1600 Buy: 1600
Weight: 10 Weight: 10
- Id: 1001088 - Id: 1001088
AegisName: aegis_1001088 AegisName: Fresh_Pear
Name: Fresh Pear Name: Fresh Pear
Type: Etc Type: Etc
Buy: 1640 Buy: 1640

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -13606,7 +13606,7 @@
20811,ILL_KRAKEN@NPC_HELLJUDGEMENT2,chase,768,2,3000,500,5000,no,target,always,0,,,,,,, 20811,ILL_KRAKEN@NPC_HELLJUDGEMENT2,chase,768,2,3000,500,5000,no,target,always,0,,,,,,,
20811,ILL_KRAKEN@NPC_HELLJUDGEMENT2,attack,768,2,3000,500,5000,no,target,always,0,,,,,,, 20811,ILL_KRAKEN@NPC_HELLJUDGEMENT2,attack,768,2,3000,500,5000,no,target,always,0,,,,,,,
20811,ILL_KRAKEN@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,, 20811,ILL_KRAKEN@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,,
20811,ILL_KRAKEN@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,target,myhpltmaxrate,10,,,,,,, 20811,ILL_KRAKEN@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,self,myhpltmaxrate,10,,,,,,,
20811,ILL_KRAKEN@NPC_PHANTOMTHRUST,chase,741,5,1000,0,5000,no,self,always,0,,,,,,, 20811,ILL_KRAKEN@NPC_PHANTOMTHRUST,chase,741,5,1000,0,5000,no,self,always,0,,,,,,,
20811,ILL_KRAKEN@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,, 20811,ILL_KRAKEN@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,,
20843,ILL_ABYSMAL_WITCH@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,, 20843,ILL_ABYSMAL_WITCH@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
@ -13638,7 +13638,7 @@
20843,ILL_ABYSMAL_WITCH@NPC_HELLJUDGEMENT2,chase,768,2,2000,500,5000,no,target,always,0,,,,,,, 20843,ILL_ABYSMAL_WITCH@NPC_HELLJUDGEMENT2,chase,768,2,2000,500,5000,no,target,always,0,,,,,,,
20843,ILL_ABYSMAL_WITCH@NPC_HELLJUDGEMENT2,attack,768,2,2000,500,5000,no,target,always,0,,,,,,, 20843,ILL_ABYSMAL_WITCH@NPC_HELLJUDGEMENT2,attack,768,2,2000,500,5000,no,target,always,0,,,,,,,
20843,ILL_ABYSMAL_WITCH@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,, 20843,ILL_ABYSMAL_WITCH@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,,
20843,ILL_ABYSMAL_WITCH@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,target,myhpltmaxrate,10,,,,,,, 20843,ILL_ABYSMAL_WITCH@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,self,myhpltmaxrate,10,,,,,,,
20843,ILL_ABYSMAL_WITCH@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,, 20843,ILL_ABYSMAL_WITCH@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,,
// Episode 17.2 - Sage's Legacy // Episode 17.2 - Sage's Legacy
@ -14239,7 +14239,7 @@
20934,R001_BESTIA@NPC_EARTHQUAKE,attack,653,5,10000,500,20000,no,self,myhpltmaxrate,40,,,,,,, 20934,R001_BESTIA@NPC_EARTHQUAKE,attack,653,5,10000,500,20000,no,self,myhpltmaxrate,40,,,,,,,
20934,R001_BESTIA@NPC_PULSESTRIKE,attack,661,5,10000,0,15000,no,self,myhpltmaxrate,60,,,,,,, 20934,R001_BESTIA@NPC_PULSESTRIKE,attack,661,5,10000,0,15000,no,self,myhpltmaxrate,60,,,,,,,
20934,R001_BESTIA@NPC_DRAGONFEAR,attack,659,5,10000,0,10000,no,self,always,0,,,,,,, 20934,R001_BESTIA@NPC_DRAGONFEAR,attack,659,5,10000,0,10000,no,self,always,0,,,,,,,
// 20934,R001_BESTIA@NPC_DAMAGE_HEAL,attack,753,1,3000,1500,40000,no,target,myhpltmaxrate,20,,,,,,, // 20934,R001_BESTIA@NPC_DAMAGE_HEAL,attack,753,1,3000,1500,40000,no,self,myhpltmaxrate,20,,,,,,,
// nif_dun // nif_dun
20935,GAN_CEANN@NPC_CRITICALSLASH,attack,170,1,1000,500,5000,no,target,always,0,,,,,,, 20935,GAN_CEANN@NPC_CRITICALSLASH,attack,170,1,1000,500,5000,no,target,always,0,,,,,,,
@ -14339,7 +14339,7 @@
20943,DEATH_WITCH@NPC_HELLJUDGEMENT,chase,662,2,2000,500,5000,no,self,always,0,,,,,,, 20943,DEATH_WITCH@NPC_HELLJUDGEMENT,chase,662,2,2000,500,5000,no,self,always,0,,,,,,,
20943,DEATH_WITCH@NPC_HELLJUDGEMENT,attack,662,2,2000,500,5000,no,self,always,0,,,,,,, 20943,DEATH_WITCH@NPC_HELLJUDGEMENT,attack,662,2,2000,500,5000,no,self,always,0,,,,,,,
20943,DEATH_WITCH@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,, 20943,DEATH_WITCH@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,,
// 20943,DEATH_WITCH@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,target,myhpltmaxrate,10,,,,,,, // 20943,DEATH_WITCH@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,self,myhpltmaxrate,10,,,,,,,
20943,DEATH_WITCH@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,, 20943,DEATH_WITCH@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,,
20943,DEATH_WITCH@NPC_CALLSLAVE,attack,352,1,5000,0,30000,yes,self,always,0,,,,,,, 20943,DEATH_WITCH@NPC_CALLSLAVE,attack,352,1,5000,0,30000,yes,self,always,0,,,,,,,
@ -14570,7 +14570,7 @@
21395,ILL_MAYA@NPC_CRITICALWOUND,attack,673,1,500,0,5000,yes,target,always,0,,,,,,, 21395,ILL_MAYA@NPC_CRITICALWOUND,attack,673,1,500,0,5000,yes,target,always,0,,,,,,,
21395,ILL_MAYA@NPC_IMMUNE_PROPERTY,chase,754,4,1500,1500,60000,no,self,casttargeted,0,,,,,,, 21395,ILL_MAYA@NPC_IMMUNE_PROPERTY,chase,754,4,1500,1500,60000,no,self,casttargeted,0,,,,,,,
21395,ILL_MAYA@NPC_IMMUNE_PROPERTY,attack,754,1,1500,1500,60000,no,self,longrangeattacked,0,,,,,,, 21395,ILL_MAYA@NPC_IMMUNE_PROPERTY,attack,754,1,1500,1500,60000,no,self,longrangeattacked,0,,,,,,,
21395,ILL_MAYA@NPC_DAMAGE_HEAL,attack,753,1,500,1500,120000,no,target,myhpltmaxrate,50,,,,,,32, 21395,ILL_MAYA@NPC_DAMAGE_HEAL,attack,753,1,500,1500,120000,no,self,myhpltmaxrate,50,,,,,,32,
21395,ILL_MAYA@NPC_ALL_STAT_DOWN,attack,751,5,5000,1500,45000,no,target,always,0,,,,,,18, 21395,ILL_MAYA@NPC_ALL_STAT_DOWN,attack,751,5,5000,1500,45000,no,target,always,0,,,,,,18,
// Episode 18 // Episode 18

View File

@ -1578,26 +1578,26 @@ Body:
- Id: 3495 - Id: 3495
Title: Conversation with Jeojin Title: Conversation with Jeojin
- Id: 3496 - Id: 3496
Title: Conversation with Squain Title: Conversation with Skuain
- Id: 3497 - Id: 3497
Title: Conversation with Senado Title: Conversation with Senado
- Id: 3498 - Id: 3498
Title: Conversation with Japer Title: Conversation with Japer
- Id: 3499 - Id: 3499
Title: Conversation with Shirouan Title: Conversation with Shiroan
- Id: 3500 - Id: 3500
Title: Conversation with Ishira Title: Conversation with Isira
- Id: 3501 - Id: 3501
Title: Conversation with Gina Title: Conversation with Dina
- Id: 3502 - Id: 3502
Title: Conversation with Hari Title: Conversation with Hari
- Id: 3503 - Id: 3503
Title: Examine the Sky Title: "[Daily] Opinion Gathering"
- Id: 3504 - Id: 3504
Title: Look at the Sky - Standby Title: "[Cooldown] Opinion Gathering"
- Id: 3505
Title: Report to Junok
TimeLimit: 4h TimeLimit: 4h
- Id: 3505
Title: Completed Opinion Gathering
- Id: 3507 - Id: 3507
Title: Illusion Investigation Team - Sheshin Title: Illusion Investigation Team - Sheshin
- Id: 3508 - Id: 3508
@ -3234,26 +3234,28 @@ Body:
Title: "[Standby] Subjugation-Yanggeochon" Title: "[Standby] Subjugation-Yanggeochon"
TimeLimit: 4h TimeLimit: 4h
- Id: 5932 - Id: 5932
Title: The Abused Child Title: Abused Child
- Id: 5933 - Id: 5933
Title: Business Plan Presentation Title: Business Plan
- Id: 5934 - Id: 5934
Title: Gathering Training (1) Title: Foraging Practice (1)
- Id: 5935 - Id: 5935
Title: Gathering Training (2) Title: Foraging Practice (2)
- Id: 5936 - Id: 5936
Title: Gathering Training (3) Title: Foraging Practice (3)
- Id: 5937 - Id: 5937
Title: "[Standby] Flower Room's work" Title: "[Cooldown] Half Flower Gathering"
TimeLimit: 4h TimeLimit: 4h
- Id: 5938 - Id: 5938
Title: Gathering Half Flower Title: "[Daily] Half Flower Gathering"
- Id: 5939 - Id: 5939
Title: Gathering Half Flower Title: "[Daily] Half Flower Gathering"
- Id: 5940 - Id: 5940
Title: Gathering Half Flower Title: "[Daily] Half Flower Gathering"
- Id: 5941 - Id: 5941
Title: Gathering Half Flower Title: "[Daily] Half Flower Gathering"
- Id: 5942
Title: Flower Room Opening Ceremony
- Id: 5972 - Id: 5972
Title: Eagle Patrol Title: Eagle Patrol
- Id: 5973 - Id: 5973
@ -6368,55 +6370,55 @@ Body:
DROSERA: true DROSERA: true
MUSCIPULAR: true MUSCIPULAR: true
- Id: 8681 - Id: 8681
Title: To Rachel (1) Title: Towards Rachel (1)
- Id: 8682 - Id: 8682
Title: To Rachel (2) Title: Towards Rachel (2)
- Id: 8683 - Id: 8683
Title: Please stop fighting Title: Heated Argument
- Id: 8684 - Id: 8684
Title: It's over Title: State of Conflict
- Id: 8685 - Id: 8685
Title: A suspicious movement detected in the temple Title: Suspicious Movement
- Id: 8686 - Id: 8686
Title: The Intruder of the Temple Title: Intruder of the Temple
- Id: 8687 - Id: 8687
Title: Did you break it? Title: Staged Plot
- Id: 8688 - Id: 8688
Title: Thanks for today's daily food Title: Today's Daily Bread
- Id: 8689 - Id: 8689
Title: Today's Daily food - Standby Title: "[Cooldown] Today's Daily Bread"
TimeLimit: 4h TimeLimit: 4h
- Id: 8690 - Id: 8690
Title: Thanks for today's daily food Title: "[Daily] Today's Daily Bread"
- Id: 8691 - Id: 8691
Title: Sacred Relics for Essence (1) Title: Water Purification (1)
- Id: 8692 - Id: 8692
Title: Sacred Relics for Essence (2) Title: Water Purification (2)
- Id: 8693 - Id: 8693
Title: Sacred Relics for Essence (3) Title: Water Purification (3)
- Id: 8694 - Id: 8694
Title: Clean Water Procurement - Standby Title: "[Cooldown] Water Purification"
TimeLimit: 4h TimeLimit: 4h
- Id: 8695 - Id: 8695
Title: Procurement of clean water (1) Title: "[Daily] Water Purification (1)"
- Id: 8696 - Id: 8696
Title: Procurement of clean water (2) Title: "[Daily] Water Purification (2)"
- Id: 8697 - Id: 8697
Title: Procurement of clean water (3) Title: "[Daily] Water Purification (3)"
- Id: 8698 - Id: 8698
Title: Late migration Title: Horim's Bizarre Adventure (1)
- Id: 8699 - Id: 8699
Title: First Step Out of the City Title: Horim's Bizarre Adventure (2)
- Id: 8700 - Id: 8700
Title: I couldn't even come halfway Title: Horim's Bizarre Adventure (3)
- Id: 8701 - Id: 8701
Title: Scenery I've Seen for the First Time Title: Horim's Bizarre Adventure (4)
- Id: 8702 - Id: 8702
Title: Smell of Volcanic Ash Title: Horim's Bizarre Adventure (5)
- Id: 8703 - Id: 8703
Title: The easy way to go Title: Horim's Bizarre Adventure (6)
- Id: 8718 - Id: 8718
Title: My friend's regards Title: Greetings from a Friend
- Id: 8719 - Id: 8719
Title: A new area somewhere in the anthill Title: A new area somewhere in the anthill
- Id: 8720 - Id: 8720
@ -8306,104 +8308,104 @@ Body:
Title: Squirrels are rats, too? Standby Title: Squirrels are rats, too? Standby
TimeLimit: 4h TimeLimit: 4h
- Id: 11696 - Id: 11696
Title: Niren's Request Title: Niren's Request (1)
- Id: 11697 - Id: 11697
Title: Niren's Request Title: Niren's Request (2)
- Id: 11698 - Id: 11698
Title: Niren's Request Title: Niren's Request (3)
- Id: 11699 - Id: 11699
Title: Niren's Request Title: Niren's Request (4)
- Id: 11700 - Id: 11700
Title: Niren's Request Title: Niren's Request (5)
- Id: 11701 - Id: 11701
Title: Niren's Request Title: Niren's Request (6)
- Id: 11702 - Id: 11702
Title: Niren's Request Title: Niren's Request (7)
- Id: 11703 - Id: 11703
Title: Niren's Request Title: Niren's Request (8)
- Id: 11704 - Id: 11704
Title: Niren's Request Title: Gray Children (1)
- Id: 11705 - Id: 11705
Title: Children of Grey Title: Gray Children (2)
- Id: 11706 - Id: 11706
Title: Children of Grey Title: Gray Children (3)
- Id: 11707 - Id: 11707
Title: Children of Grey Title: Gray Children (4)
- Id: 11708 - Id: 11708
Title: Children of Grey Title: Gray Children (5)
- Id: 11709 - Id: 11709
Title: Children of Grey Title: Gray Children (6)
- Id: 11710 - Id: 11710
Title: Children of Grey Title: Gray Children (7)
- Id: 11711 - Id: 11711
Title: Children of Grey Title: Gray Children (8)
- Id: 11712 - Id: 11712
Title: Children of Grey Title: Gray Children (9)
- Id: 11713 - Id: 11713
Title: Children of Grey Title: Gray Children (10)
- Id: 11714 - Id: 11714
Title: Children of Grey Title: Gray Children (11)
- Id: 11715 - Id: 11715
Title: Children of Grey Title: Gray Children (12)
- Id: 11716 - Id: 11716
Title: Children of Grey Title: Gray Children (13)
- Id: 11717 - Id: 11717
Title: Children of Grey Title: Gray Children (14)
- Id: 11718 - Id: 11718
Title: Children of Grey Title: Gray Children (15)
- Id: 11719 - Id: 11719
Title: Children of Grey Title: Gray Children (16)
- Id: 11720 - Id: 11720
Title: Children of Grey Title: Gray Children (17)
- Id: 11721 - Id: 11721
Title: Children of Grey Title: Gray Children (18)
- Id: 11722 - Id: 11722
Title: Children of Grey Title: Gray Children (19)
- Id: 11723 - Id: 11723
Title: Children of Grey Title: Gray Children (20)
- Id: 11724 - Id: 11724
Title: Children of Grey Title: Gray Children (21)
- Id: 11725 - Id: 11725
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (1)
- Id: 11726 - Id: 11726
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (2)
- Id: 11727 - Id: 11727
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (3)
- Id: 11728 - Id: 11728
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (4)
- Id: 11729 - Id: 11729
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (5)
- Id: 11730 - Id: 11730
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (6)
Targets: Targets:
- Id: 1 - Id: 1
Location: oz_dun01 Location: oz_dun01
Count: 10 Count: 10
- Id: 11731 - Id: 11731
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (7)
- Id: 11732 - Id: 11732
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (8)
- Id: 11733 - Id: 11733
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (9)
- Id: 11734 - Id: 11734
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (10)
- Id: 11735 - Id: 11735
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (11)
- Id: 11736 - Id: 11736
Title: Maze of Oz 1st Floor (170lv) Title: Oz Labyrinth 1F (170lv)
Targets: Targets:
- Mob: EP18_ASH_TOAD - Mob: EP18_ASH_TOAD
Count: 20 Count: 20
- Id: 11737 - Id: 11737
Title: Maze of Oz Level 1 - Standby Title: "[Cooldown] Oz Labyrinth 1F"
TimeLimit: 4h TimeLimit: 4h
- Id: 11738 - Id: 11738
Title: Maze of Oz Level 2 (200lv) Title: Oz Labyrinth 2F (200lv)
Targets: Targets:
- Mob: EP18_HOT_MOLAR - Mob: EP18_HOT_MOLAR
Count: 20 Count: 20
- Id: 11739 - Id: 11739
Title: Maze of Oz Level 2 (200lv) Title: "[Cooldown] Oz Labyrinth 2F"
TimeLimit: 4h TimeLimit: 4h
- Id: 11794 - Id: 11794
Title: The Lady of Purification Title: The Lady of Purification
@ -9795,30 +9797,30 @@ Body:
Title: Let's try again to seal the crack Title: Let's try again to seal the crack
TimeLimit: 4h TimeLimit: 4h
- Id: 12520 - Id: 12520
Title: Villa of Deception Title: "[Normal] Villa of Deception"
- Id: 12521 - Id: 12521
Title: Villa of Deception Hard Title: "[Hard] Villa of Deception"
- Id: 12522 - Id: 12522
Title: Cooldown: Villa of Deception Title: "[Cooldown] Villa of Deception"
TimeLimit: 4h TimeLimit: 4h
- Id: 12531 - Id: 12531
Title: Future General Candidate Title: Transporting Goods
- Id: 12532 - Id: 12532
Title: Trouble at the Top Title: Broken Wagon
- Id: 12533 - Id: 12533
Title: The Hidden Helper Title: Hidden Helper
- Id: 12534 - Id: 12534
Title: The Missing Camille Title: Missing Camille
- Id: 12535 - Id: 12535
Title: The Governor's Decision Title: Chief Decision
- Id: 12536 - Id: 12536
Title: The Scattered Luggage (North) Title: Scattered Goods (North)
- Id: 12537 - Id: 12537
Title: Scattered Luggage (West) Title: Scattered Goods (West)
- Id: 12538 - Id: 12538
Title: The Scattered Luggage (East) Title: Scattered Goods (East)
- Id: 12539 - Id: 12539
Title: Scattered Luggage (South) Title: Scattered Goods (South)
- Id: 12560 - Id: 12560
Title: Standby: Neutralizing Aircraft Title: Standby: Neutralizing Aircraft
TimeLimit: 4h TimeLimit: 4h
@ -11980,84 +11982,84 @@ Body:
- Mob: EP18_FIREWIND_KITE - Mob: EP18_FIREWIND_KITE
Count: 30 Count: 30
- Id: 16549 - Id: 16549
Title: I can't sleep Title: "[Daily] I can't sleep"
Targets: Targets:
- Mob: EP18_FIREWIND_KITE - Mob: EP18_FIREWIND_KITE
Count: 30 Count: 30
- Id: 16550 - Id: 16550
Title: I Can't Sleep - Wait Title: "[Cooldown] I can't sleep"
TimeLimit: 4h TimeLimit: 4h
- Id: 16551 - Id: 16551
Title: The Story of Dinar Title: Collecting Folklore (1)
- Id: 16552 - Id: 16552
Title: Amira's Story Title: Collecting Folklore (2)
- Id: 16553 - Id: 16553
Title: Shanina's Grandma's Story Title: Collecting Folklore (3)
- Id: 16554 - Id: 16554
Title: Please collect the stories Title: Collecting Folklore (4)
- Id: 16555 - Id: 16555
Title: The Story of Dinar Title: "[Daily] Dinar's Story"
- Id: 16556 - Id: 16556
Title: Amira's Story Title: "[Daily] Amira's Story"
- Id: 16557 - Id: 16557
Title: Shanina's Grandma's Story Title: "[Daily] Shanina's Story"
- Id: 16558 - Id: 16558
Title: Please collect the stories Title: "[Daily] Collecting Folklore"
- Id: 16559 - Id: 16559
Title: Please collect the stories - Standby Title: "[Cooldown] Collecting Folklore"
TimeLimit: 4h TimeLimit: 4h
- Id: 16560 - Id: 16560
Title: This is not the place Title: Ahab's Gossip (1)
- Id: 16561 - Id: 16561
Title: This is not the place Title: Ahab's Gossip (2)
- Id: 16562 - Id: 16562
Title: This is not the place Title: Ahab's Gossip (3)
- Id: 16563 - Id: 16563
Title: This is not the place Title: Ahab's Gossip (4)
- Id: 16564 - Id: 16564
Title: This is not the place Title: Ahab's Gossip (5)
- Id: 16565 - Id: 16565
Title: This is not the place Title: Ahab's Gossip (6)
- Id: 16566 - Id: 16566
Title: This is not the place Title: Ahab's Gossip (7)
- Id: 16567 - Id: 16567
Title: The Contest of the Grey Wolf Forest Title: Gray Wolf Forest Tournament (1)
- Id: 16568 - Id: 16568
Title: Everyone's Opinion Title: People's Opinion (1)
- Id: 16569 - Id: 16569
Title: Everyone's Opinion Title: People's Opinion (2)
- Id: 16570 - Id: 16570
Title: Everyone's Opinion Title: People's Opinion (3)
- Id: 16571 - Id: 16571
Title: Everyone's Opinion Title: People's Opinion (4)
- Id: 16572 - Id: 16572
Title: The Contest of the Grey Wolf Forest Title: Gray Wolf Forest Tournament (2)
- Id: 16573 - Id: 16573
Title: Source of Weapon Title: Source of Weapons (1)
- Id: 16574 - Id: 16574
Title: Source of Weapon Title: Source of Weapons (2)
- Id: 16575 - Id: 16575
Title: Source of Weapon Title: Source of Weapons (3)
- Id: 16576 - Id: 16576
Title: Source of Weapon Title: Source of Weapons (4)
- Id: 16577 - Id: 16577
Title: Source of Weapon Title: Source of Weapons (5)
- Id: 16578 - Id: 16578
Title: Source of Weapon Title: Source of Weapons (6)
- Id: 16579 - Id: 16579
Title: Source of Weapon Title: Source of Weapons (7)
- Id: 16580 - Id: 16580
Title: Source of Weapon Title: Source of Weapons (8)
- Id: 16581 - Id: 16581
Title: Children Know It Title: Even children know (1)
- Id: 16582 - Id: 16582
Title: Children Know It Title: Even children know (2)
- Id: 16583 - Id: 16583
Title: Children Know It Title: Even children know (3)
- Id: 16584 - Id: 16584
Title: The Price of Labor Title: The Price of Labor (1)
- Id: 16585 - Id: 16585
Title: The Price of Labor Title: The Price of Labor (2)
- Id: 16636 - Id: 16636
Title: Looking for clues - Juncea's Lab Title: Looking for clues - Juncea's Lab
- Id: 16637 - Id: 16637
@ -12383,62 +12385,62 @@ Body:
Title: (Standby) Thanatos Tower, 12th floor Title: (Standby) Thanatos Tower, 12th floor
TimeLimit: 4h TimeLimit: 4h
- Id: 17504 - Id: 17504
Title: Where's My Home Title: Where is My Home (1)
- Id: 17505 - Id: 17505
Title: Where's My Home Title: Where is My Home (2)
- Id: 17506 - Id: 17506
Title: Where's My Home Title: Where is My Home (3)
- Id: 17507 - Id: 17507
Title: Where's My Home Title: Where is My Home (4)
- Id: 17508 - Id: 17508
Title: Lack of Supplies Title: "[Daily] Shortage of Supplies"
Drops: Drops:
- Mob: EP18_GREY_WOLF - Mob: EP18_GREY_WOLF
Item: Ep18_Very_Ddan_Crystal Item: Ep18_Very_Ddan_Crystal
Rate: 5000 Rate: 5000
- Id: 17509 - Id: 17509
Title: (Standby) Lack of supplies Title: "[Cooldown] Shortage of Supplies"
TimeLimit: 4h TimeLimit: 4h
- Id: 17510 - Id: 17510
Title: There are no bad beasts in the world Title: There are no evil beasts in this world (1)
- Id: 17511 - Id: 17511
Title: There are no bad beasts in the world Title: There are no evil beasts in this world (2)
- Id: 17512 - Id: 17512
Title: There are no bad beasts in the world Title: There are no evil beasts in this world (3)
- Id: 17513 - Id: 17513
Title: The Unexpected Shepherd Title: An Unexpected Shepherd (1)
- Id: 17514 - Id: 17514
Title: The Unexpected Shepherd Title: An Unexpected Shepherd (2)
Targets: Targets:
- Mob: EP18_ASHRING - Mob: EP18_ASHRING
Count: 20 Count: 20
- Id: 17515 - Id: 17515
Title: The Unexpected Shepherd Title: An Unexpected Shepherd (3)
- Id: 17516 - Id: 17516
Title: (Standby) Unexpected shepherd Title: "[Cooldown] An Unexpected Shepherd"
TimeLimit: 4h TimeLimit: 4h
- Id: 17517 - Id: 17517
Title: The Rebels Title: Rebellion (1)
- Id: 17518 - Id: 17518
Title: The Rebels Title: Rebellion (2)
- Id: 17519 - Id: 17519
Title: The Rebels Title: Rebellion (3)
- Id: 17520 - Id: 17520
Title: Wolf in the Sheep Title: Wolf Among Sheep (1)
- Id: 17521 - Id: 17521
Title: When you need a conversation Title: Wolf Among Sheep (2)
- Id: 17522 - Id: 17522
Title: Cleaning the Traitors Title: Wolf Among Sheep (3)
- Id: 17523 - Id: 17523
Title: Purification of the Sanctuary Title: Sanctuary Purification
- Id: 17524 - Id: 17524
Title: Cleaning the Traitors Title: "[Completed] Renegade Cleaning"
- Id: 17525 - Id: 17525
Title: When you need a conversation Title: Aftermath
- Id: 17526 - Id: 17526
Title: Purification of the Sanctuary Title: "[Completed] Sanctuary Purification"
- Id: 17527 - Id: 17527
Title: (Standby) Cleaning strategy Title: "[Cooldown] Sanctuary Purification"
TimeLimit: 4h TimeLimit: 4h
- Id: 17566 - Id: 17566
Title: (Standby) Code name! Is it a star button? Title: (Standby) Code name! Is it a star button?
@ -12656,21 +12658,21 @@ Body:
Title: Goseong dungeon 1st floor attack Title: Goseong dungeon 1st floor attack
TimeLimit: 4h TimeLimit: 4h
- Id: 18082 - Id: 18082
Title: Eligibility to Participate in the Competition Title: Eligibility to attend the competition
- Id: 18083 - Id: 18083
Title: Investigation of Daishinkan's Villa Title: High Priest's Villa
- Id: 18084 - Id: 18084
Title: Fact Investigation Title: Fact Finding
- Id: 18085 - Id: 18085
Title: The Direction of Prayer Title: Direction of Prayer
- Id: 18086 - Id: 18086
Title: Make the Grey Wolf Forest Safer Title: "[Daily] Gray Wolf Forest Hunting"
Targets: Targets:
- Id: 1 - Id: 1
Location: gw_fild01 Location: gw_fild01
Count: 30 Count: 30
- Id: 18087 - Id: 18087
Title: Safer in the Gray Wolf Forest - Standby Title: "[Cooldown] Gray Wolf Forest Hunting"
TimeLimit: 4h TimeLimit: 4h
- Id: 18100 - Id: 18100
Title: Legends from Moscovia Title: Legends from Moscovia

View File

@ -43027,10 +43027,10 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Range: 9 Flags:
Hit: Single IgnoreGtb: true
HitCount: 1 AfterCastWalkDelay: 1000
AfterCastActDelay: 2000 Cooldown: 20000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -43053,11 +43053,7 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Splash: true AfterCastWalkDelay: 1000
Hit: Single
HitCount: 1
SplashArea: -1
AfterCastActDelay: 35000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 40000 Time: 40000
@ -43069,6 +43065,7 @@ Body:
Time: 25000 Time: 25000
- Level: 5 - Level: 5
Time: 20000 Time: 20000
Cooldown: 35000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -43086,7 +43083,6 @@ Body:
Name: HLIF_BRAIN Name: HLIF_BRAIN
Description: Brain Surgery Description: Brain Surgery
MaxLevel: 5 MaxLevel: 5
SplashArea: 1
- Id: 8004 - Id: 8004
Name: HLIF_CHANGE Name: HLIF_CHANGE
Description: Change Description: Change
@ -43094,7 +43090,7 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -43102,7 +43098,7 @@ Body:
Time: 180000 Time: 180000
- Level: 3 - Level: 3
Time: 300000 Time: 300000
Duration2: Cooldown:
- Level: 1 - Level: 1
Time: 600000 Time: 600000
- Level: 2 - Level: 2
@ -43120,7 +43116,8 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
Duration2: 1000 AfterCastWalkDelay: 1000
Cooldown: 1000
Requires: Requires:
SpCost: 10 SpCost: 10
- Id: 8006 - Id: 8006
@ -43131,7 +43128,7 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
AfterCastActDelay: 30000 AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 40000 Time: 40000
@ -43143,6 +43140,7 @@ Body:
Time: 25000 Time: 25000
- Level: 5 - Level: 5
Time: 20000 Time: 20000
Cooldown: 30000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -43170,6 +43168,7 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -43177,7 +43176,7 @@ Body:
Time: 180000 Time: 180000
- Level: 3 - Level: 3
Time: 300000 Time: 300000
Duration2: Cooldown:
- Level: 1 - Level: 1
Time: 300000 Time: 300000
- Level: 2 - Level: 2
@ -43206,7 +43205,7 @@ Body:
Count: -2 Count: -2
- Level: 5 - Level: 5
Count: -3 Count: -3
AfterCastWalkDelay: 2000 Cooldown: 2000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -43227,6 +43226,7 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -43238,7 +43238,7 @@ Body:
Time: 45000 Time: 45000
- Level: 5 - Level: 5
Time: 40000 Time: 40000
Duration2: Cooldown:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
- Level: 2 - Level: 2
@ -43272,6 +43272,7 @@ Body:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
CastCancel: true CastCancel: true
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -43283,7 +43284,7 @@ Body:
Time: 45000 Time: 45000
- Level: 5 - Level: 5
Time: 40000 Time: 40000
Duration2: Cooldown:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
- Level: 2 - Level: 2
@ -43316,7 +43317,7 @@ Body:
Range: 15 Range: 15
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
AfterCastActDelay: 1000 Cooldown: 1000
Requires: Requires:
SpCost: 1 SpCost: 1
- Id: 8013 - Id: 8013
@ -43338,7 +43339,7 @@ Body:
Count: 4 Count: 4
- Level: 5 - Level: 5
Count: 5 Count: 5
AfterCastActDelay: Cooldown:
- Level: 1 - Level: 1
Time: 2000 Time: 2000
- Level: 2 - Level: 2
@ -43369,8 +43370,8 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
AfterCastActDelay: 3000 AfterCastWalkDelay: 1500
AfterCastWalkDelay: 3000 Cooldown: 3000
Requires: Requires:
SpCost: 40 SpCost: 40
- Id: 8015 - Id: 8015
@ -43394,7 +43395,8 @@ Body:
HitCount: 1 HitCount: 1
Element: Weapon Element: Weapon
SplashArea: 4 SplashArea: 4
AfterCastWalkDelay: 1000 AfterCastActDelay: 5000
CoolDown: 1000
Requires: Requires:
SpCost: 1 SpCost: 1
- Id: 8018 - Id: 8018

View File

@ -2600,13 +2600,17 @@ Body:
DurationLookup: HLIF_AVOID DurationLookup: HLIF_AVOID
CalcFlags: CalcFlags:
Speed: true Speed: true
Flags:
NoSave: true
RemoveFromHomOnMapWarp: true
- Status: Change - Status: Change
DurationLookup: HLIF_CHANGE DurationLookup: HLIF_CHANGE
CalcFlags: CalcFlags:
Vit: true Vit: true
Int: true Int: true
Flags: Flags:
RemoveOnChangeMap: true NoSave: true
RemoveFromHomOnMapWarp: true
Fail: Fail:
Change: true Change: true
- Status: Bloodlust - Status: Bloodlust

View File

@ -490,3 +490,9 @@ Hides monster's HP bar on a map.
Ignores config value of 'monster_hp_bars_info'. Ignores config value of 'monster_hp_bars_info'.
--------------------------------------- ---------------------------------------
*specialpopup <popup ID>
Displays a special popup when a player enters the map. See script command "specialpopup" for details on different popup types.
---------------------------------------

View File

@ -6124,11 +6124,12 @@ will always return 0.
--------------------------------------- ---------------------------------------
*skilleffect <skill id>,<number>; *skilleffect <skill id>,<number>{,<game ID>};
*skilleffect "<skill name>",<number>; *skilleffect "<skill name>",<number>{,<game ID>};
This command displays visual and aural effects of given skill on currently This command displays visual and aural effects of given skill on currently
attached character. The number parameter is for skill whose visual effect attached character or, when defined, on any unit with the given ID.
The number parameter is for skill whose visual effect
involves displaying of a number (healing or damaging). Note, that this command involves displaying of a number (healing or damaging). Note, that this command
will not actually use the skill, it is intended for scripts, which simulate will not actually use the skill, it is intended for scripts, which simulate
skill usage by the NPC, such as buffs, by setting appropriate status and skill usage by the NPC, such as buffs, by setting appropriate status and
@ -8508,6 +8509,15 @@ Opens the tip box UI for the attached player or the given character ID.
This command requires packet version 2017-11-22 or newer. This command requires packet version 2017-11-22 or newer.
---------------------------------------
*specialpopup(<popup ID>);
Open popup and/or show text by ID from list defined in the client spopup.lub file.
Popup and text is only visible if the player warped from one map to another map.
This command requires packet version 2022-10-05 or newer.
--------------------------------------- ---------------------------------------
\\ \\
6,1.- Unit-related commands 6,1.- Unit-related commands
@ -10681,6 +10691,7 @@ current invoking character.
*addhomintimacy <amount>{,<char_id>}; *addhomintimacy <amount>{,<char_id>};
Increase or decrease a homunculus' intimacy value by the given <amount>. 100000 is full loyalty. Increase or decrease a homunculus' intimacy value by the given <amount>. 100000 is full loyalty.
Fails silently when no players are attached or if the player has no homunculus.
--------------------------------------- ---------------------------------------

View File

@ -254,6 +254,9 @@ Flags: Various status flags for specific status change events.
SuperNoviceAngel - Status that is given from Super Novice Angel. SuperNoviceAngel - Status that is given from Super Novice Angel.
TaekwonAngel - Status that is given from Taekwon Angel. TaekwonAngel - Status that is given from Taekwon Angel.
RemoveFromHomOnWarp - Removes the status from the Homunculus when teleporting or warping to another map.
RemoveFromHomOnMapWarp - Removes the status from the Homunculus when warping to another map.
--------------------------------------- ---------------------------------------
MinDuration: Minimum duration, in milliseconds, after reduction calculation for status resistance. MinDuration: Minimum duration, in milliseconds, after reduction calculation for status resistance.

View File

@ -1001,13 +1001,16 @@ SC_FLING ()
desc: desc:
val1: val1:
SC_AVOID () SC_AVOID (EFST_HLIF_AVOID)
desc: desc: Increase walkspeed for Players and Homunculus
val1: val1: Skill Level
val2: Walkspeed increase (10 * val1 for Players, 40 * val1 for Homunculus)
SC_CHANGE () SC_CHANGE (EFST_HLIF_CHANGE)
desc: desc: Increase some Homunculus' statuses (VIT, INT); Uses MATK for damage calculation; Sets Homunculus' HP and SP to 10 on expiration; On Pre-Renewal, sets Homunculus' HP and SP to 100% on cast
val1: val1: Skill Level
val2: VIT increase (20 * val1)
val3: INT increase (30 * val1)
SC_BLOODLUST () SC_BLOODLUST ()
desc: desc:

View File

@ -136,7 +136,7 @@ prt_in,243,168,4 script Jovovich 91,{
mes "* Fees and Information *"; mes "* Fees and Information *";
mes "- 1 Dyestuffs item of the color of hair you want."; mes "- 1 Dyestuffs item of the color of hair you want.";
mes "- 1000 zeny fee."; mes "- 1000 zeny fee.";
break; close;
case 3: case 3:
mes "[Hairdresser Jovovich]"; mes "[Hairdresser Jovovich]";

View File

@ -2,34 +2,35 @@
//= Instance: The Maze of Oz. //= Instance: The Maze of Oz.
//===== Description: ========================================= //===== Description: =========================================
//- [Walkthrough conversion] //- [Walkthrough conversion]
//- Part of the episode 18.1 main quest. //- Part of the Episode 18 main quest.
//===== Changelogs: ========================================== //===== Changelogs: ==========================================
//= 1.0 First version. [Capuche] //= 1.0 First version. [Capuche]
//============================================================ //============================================================
// Main Quest: Step 28. // Main Quest: Step 28.
ra_fild10,179,176,5 script Merchant#ep18_gorge 4_EP18_MERCHANT,{ ra_fild10,179,176,5 script Merchant#ep18_gorge 4_EP18_MERCHANT,{
.@md_name$ = "The Maze of Oz"; .@md_name$ = "Oz Labyrinth";
if (ep18_1_main == 29) { if (ep18_main == 29) {
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "From now on <FONT SIZE = 14><B>^e5555e" + .@md_name$ + "^000000</FONT></B>"; mes "We are now entering the <FONT SIZE = 14><B>^e5555eMaze of Oz^000000</FONT></B>.";
mes "^e5555ePrepare yourself and talk to me again^000000"; mes "^e5555ePlease finish your preparations^000000 and come back to me.";
cutin "ep18_merchant.png",2; cutin "ep18_merchant.png",2;
changequest 11717,11719; erasequest 11717;
ep18_1_main = 30; setquest 11719;
ep18_main = 30;
close3; close3;
} }
if (ep18_1_main == 30) { if (ep18_main == 30) {
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "Then I'll start the ^e5555e" + .@md_name$ + "^000000"; mes "Then let's head to ^e5555e" + .@md_name$ + "^000000";
next; next;
if (getcharid(1) == 0 || is_party_leader() == false) { if (getcharid(1) == 0 || is_party_leader() == false) {
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "I think it would be a good idea to form a ^ff0000party before enter ^000000.."; mes "I think it would be a good idea to form a ^ff0000party before enter^000000..";
close; close;
} }
switch( select( "Open the door", "Enter", "Stop" ) ) { switch( select( "Open the door.", "Enter.", "Quit." ) ) {
case 1: case 1:
if (instance_create(.@md_name$) < 0) { if (instance_create(.@md_name$) < 0) {
mes "Party: " + getpartyname(getcharid(1)) + ""; mes "Party: " + getpartyname(getcharid(1)) + "";
@ -37,21 +38,21 @@ ra_fild10,179,176,5 script Merchant#ep18_gorge 4_EP18_MERCHANT,{
mes "^0000ff" + .@md_name$ + " ^000000- Unknown error"; mes "^0000ff" + .@md_name$ + " ^000000- Unknown error";
close; close;
} }
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "You'd better wait a little before you go in."; mes "It's better to wait a bit before entering.";
close; close;
case 2: case 2:
switch( instance_enter(.@md_name$) ) { switch( instance_enter(.@md_name$) ) {
case IE_OTHER: case IE_OTHER:
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "^ff0000An unknown error occurred.^000000"; mes "^ff0000An unknown error occurred.^000000";
close; close;
case IE_NOINSTANCE: case IE_NOINSTANCE:
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "^ff0000Your party leader has not yet created the dungeon.^000000"; mes "Let's wait a bit and try again.";
close; close;
case IE_NOMEMBER: case IE_NOMEMBER:
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000"; mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000";
close; close;
case IE_OK: case IE_OK:
@ -62,24 +63,25 @@ ra_fild10,179,176,5 script Merchant#ep18_gorge 4_EP18_MERCHANT,{
end; end;
} }
} }
mes "[Merchant]";
mes "It seems like someone was nearby but disappeared quickly.";
mes "Where did they go?";
cutin "ep18_merchant.png",2; cutin "ep18_merchant.png",2;
mes "[Vendor]"; close3;
mes "Someone must have been around here, but they just disappeared. Where did they go?";
close3;
OnInit: OnInit:
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(11717) == 1" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(11717) == 1" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(11719) == 1" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(11719) == 1" );
end; end;
} }
// Step 1 // Step 1
1@oz,284,164,3 script Rope#outoz 4_ROPEPILE,{ 1@oz,284,164,3 script Rope#outoz 4_ROPEPILE,{
mes "I think I can climb up with a rope."; mes "I think we can use the rope to climb up.";
next; next;
if (select( "Use a rope to climb", "Do not use" ) == 2) if (select( "Use the rope to climb up.", "Do not use." ) == 2)
end; end;
warp "ra_fild10",180,174; warp "ra_fild10",173,176;
end; end;
} }
@ -88,64 +90,64 @@ OnInit:
end; end;
'event_oz = 1; 'event_oz = 1;
.@miriam1$ = instance_npcname("Miriam#ozmd1"); .@miriam1$ = instance_npcname("Miriam#ozmd1");
.@maggi1$ = instance_npcname("Magi#ozmd1"); .@maggi1$ = instance_npcname("Maggi#ozmd1");
.@mark1$ = instance_npcname("Mark#ozmd1"); .@mark1$ = instance_npcname("Mark#ozmd1");
.@tamarin1$ = instance_npcname("Tamarin#ozmd1"); .@tamarin1$ = instance_npcname("Tamarin#ozmd1");
.@miriam2$ = instance_npcname("Miriam#ozmd2"); .@miriam2$ = instance_npcname("Miriam#ozmd2");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
npctalk "Miriam: This is the entrance to the labyrinth of Oz.", .@miriam1$; npctalk "Miriam: This is the entrance to the Labyrinth of Oz.", .@miriam1$;
cutin "ep18_miriam_03.png",2; cutin "ep18_miriam_03.png",2;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Everyone, please move carefully.", .@miriam1$; npctalk "Miriam: Everyone, please move carefully.", .@miriam1$;
sleep2 2000; sleep2 2000;
npctalk "Magi: Something hot and dusty...", .@maggi1$; npctalk "Magi: Something hot and dusty...", .@maggi1$;
cutin "4job_maggi_02.PNG",2; cutin "4job_maggi_02.PNG",2;
enablenpc .@maggi1$; cloakoffnpcself( .@maggi1$ );
enablenpc .@mark1$; cloakoffnpcself( .@mark1$ );
enablenpc .@tamarin1$; cloakoffnpcself( .@tamarin1$ );
sleep2 2000; sleep2 2000;
npctalk "Mark: Are you okay?", .@mark1$; npctalk "Mark: Are you okay?", .@mark1$;
cutin "ep18_mark_01.png",2; cutin "ep18_mark_01.png",2;
sleep2 2000; sleep2 2000;
npctalk "Miriam: There is lava flowing right below it, always scattering ashes.", .@miriam1$; npctalk "Miriam: Lava is flowing right below, so ash is always flying.", .@miriam1$;
cutin "ep18_miriam_03.png",2; cutin "ep18_miriam_03.png",2;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Beware there may be embers in the lava ash.", .@miriam1$; npctalk "Miriam: There may be embers left in the lava ash, so please be careful.", .@miriam1$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: If you inhale incorrectly, you will burn your lungs.", .@miriam1$; npctalk "Miriam: If you inhale it incorrectly, it will burn your lungs.", .@miriam1$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: There don't seem to be any monsters around here, so it's better to move slowly and check the situation again.", .@miriam1$; npctalk "Miriam: There don't seem to be any monsters around here, so it would be better to move slowly and check the situation again.", .@miriam1$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Please follow the road to the north first.", .@miriam1$; npctalk "Miriam: First, please follow the road to the north.", .@miriam1$;
sleep2 2000; sleep2 2000;
cutin "",255; cutin "",255;
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
disablenpc .@maggi1$; cloakonnpcself( .@maggi1$ );
disablenpc .@mark1$; cloakonnpcself( .@mark1$ );
disablenpc .@tamarin1$; cloakonnpcself( .@tamarin1$ );
disablenpc .@miriam1$; disablenpc .@miriam1$;
enablenpc .@miriam2$; enablenpc .@miriam2$;
end; end;
} }
1@oz,279,175,5 duplicate(dummy_npc) Magi#ozmd1 4_4JOB_MAGGI 1@oz,279,175,5 duplicate(dummy_cloaked_npc) Maggi#ozmd1 4_4JOB_MAGGI
1@oz,280,175,3 duplicate(dummy_npc) Mark#ozmd1 4_EP18_MARK 1@oz,280,175,3 duplicate(dummy_cloaked_npc) Mark#ozmd1 4_EP18_MARK
1@oz,279,177,3 duplicate(dummy_npc) Tamarin#ozmd1 4_EP18_TAMARIN 1@oz,279,177,3 duplicate(dummy_cloaked_npc) Tamarin#ozmd1 4_EP18_TAMARIN
// Step 2 // Step 2
1@oz,271,272,3 script Miriam#ozmd2 4_EP18_MIRIAM,{ 1@oz,271,272,3 script(DISABLED) Miriam#ozmd2 4_EP18_MIRIAM,{
if ('event_oz != 1) if ('event_oz != 1)
end; end;
'event_oz = 2; 'event_oz = 2;
.@miriam2$ = instance_npcname("Miriam#ozmd2"); .@miriam2$ = instance_npcname("Miriam#ozmd2");
'miriam3$ = instance_npcname("Miriam#ozmd3"); 'miriam3$ = instance_npcname("Miriam#ozmd3");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
npctalk "Miriam: If you cross the bridge in front of you, it's a real maze.", .@miriam2$; npctalk "Miriam: If you cross the bridge in front of you, it's the real Maze of Oz.", .@miriam2$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: We must be very careful crossing the bridge, let's talk again after.", .@miriam2$; npctalk "Miriam: You have to be very careful when crossing the bridge, so let's talk again at the bridge.", .@miriam2$;
sleep2 2000; sleep2 2000;
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
disablenpc .@miriam2$; disablenpc .@miriam2$;
@ -153,69 +155,43 @@ OnInit:
end; end;
OnInstanceInit: OnInstanceInit:
'miriam3_id = 0;
'event_oz = 0; 'event_oz = 0;
'map_name$ = instance_mapname("1@oz"); 'map_name$ = instance_mapname("1@oz");
disablenpc instance_npcname("Miriam#ozmd2");
disablenpc instance_npcname("Miriam#ozmd3");
disablenpc instance_npcname("Miriam#ozmd4");
disablenpc instance_npcname("Maram#ozmd5");
disablenpc instance_npcname("Miriam#ozmd5");
disablenpc instance_npcname("Maram#ozmd7");
disablenpc instance_npcname("#oz_way");
disablenpc instance_npcname("Maram#ozmd6");
disablenpc instance_npcname("Magi#ozmd1");
disablenpc instance_npcname("Mark#ozmd1");
disablenpc instance_npcname("Tamarin#ozmd1");
disablenpc instance_npcname("Magi#ozmd3");
disablenpc instance_npcname("Mark#ozmd3");
disablenpc instance_npcname("Tamarin#ozmd3");
disablenpc instance_npcname("Maram#ozmd4");
disablenpc instance_npcname("Magi#ozmd5");
disablenpc instance_npcname("Mark#ozmd5");
disablenpc instance_npcname("Tamarin#ozmd5");
disablenpc instance_npcname("Maram#ozmd8");
disablenpc instance_npcname("Magi#ozmd6");
disablenpc instance_npcname("Mark#ozmd6");
disablenpc instance_npcname("Tamarin#ozmd6");
disablenpc instance_npcname("Miriam#ozmd7");
disablenpc instance_npcname("Imril#ozmd7");
end; end;
} }
// Step 3 // Step 3
1@oz,241,272,3 script Miriam#ozmd3 EP18_NPC_MIRIAM,{ 1@oz,241,272,3 script(DISABLED) Miriam#ozmd3 EP18_NPC_MIRIAM,{
if ('event_oz != 2) if ('event_oz != 2)
end; end;
'event_oz = 3; 'event_oz = 3;
'miriam3$ = instance_npcname("Miriam#ozmd3"); .@maggi3$ = instance_npcname("Maggi#ozmd3");
.@maggi3$ = instance_npcname("Magi#ozmd3");
.@mark3$ = instance_npcname("Mark#ozmd3"); .@mark3$ = instance_npcname("Mark#ozmd3");
.@tamarin3$ = instance_npcname("Tamarin#ozmd3"); .@tamarin3$ = instance_npcname("Tamarin#ozmd3");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
npctalk "Miriam: This bridge is dangerous, so it's best to split your luggage and cross in turn.", 'miriam3$; npctalk "Miriam: This bridge is dangerous, so it would be better to share the luggage and cross it one at a time.", 'miriam3$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Then I will cross first, so please follow slowly. It will help not to look under your feet.", 'miriam3$; npctalk "Miriam: Then, I will cross first, so please follow me slowly. It will be helpful not to look under your feet.", 'miriam3$;
sleep2 2000; sleep2 2000;
npctalk "Tamarin: Wow I can't see the bottom.", .@tamarin3$; npctalk "Tamarin: Wow... I can't see the bottom.", .@tamarin3$;
enablenpc .@maggi3$; cloakoffnpcself( .@maggi3$ );
enablenpc .@mark3$; cloakoffnpcself( .@mark3$ );
enablenpc .@tamarin3$; cloakoffnpcself( .@tamarin3$ );
sleep2 2000; sleep2 2000;
npctalk "Magi: Your legs look very old...", .@maggi3$; npctalk "Magi: My legs look really worn out...", .@maggi3$;
sleep2 2000; sleep2 2000;
npctalk "Mark: Everyone be careful", .@mark3$; npctalk "Mark: Everyone be careful.", .@mark3$;
sleep2 2000; sleep2 2000;
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
disablenpc .@maggi3$; cloakonnpcself( .@maggi3$ );
disablenpc .@mark3$; cloakonnpcself( .@mark3$ );
disablenpc .@tamarin3$; cloakonnpcself( .@tamarin3$ );
'miriam3_id = getnpcid(0); 'miriam3_id = getnpcid(0);
unitwalk 'miriam3_id,231,272, 'miriam3$ + "::OnEvent1"; // several events are required to palliate to our too short value of MAX_WALKPATH (32) used to calculate the pathing unitwalk 'miriam3_id,231,272, 'miriam3$ + "::OnEvent1";
end; end;
OnEvent1: OnEvent1:
unitwalk 'miriam3_id,211,272, 'miriam3$ + "::OnEvent2"; unitwalk 'miriam3_id,211,272, 'miriam3$ + "::OnEvent2";
@ -236,13 +212,13 @@ OnEvent5:
end; end;
} }
1@oz,245,272,3 duplicate(dummy_npc) Magi#ozmd3 4_4JOB_MAGGI 1@oz,245,272,3 duplicate(dummy_cloaked_npc) Maggi#ozmd3 4_4JOB_MAGGI
1@oz,244,273,3 duplicate(dummy_npc) Mark#ozmd3 4_EP18_MARK 1@oz,244,273,3 duplicate(dummy_cloaked_npc) Mark#ozmd3 4_EP18_MARK
1@oz,244,270,3 duplicate(dummy_npc) Tamarin#ozmd3 4_EP18_TAMARIN 1@oz,244,270,3 duplicate(dummy_cloaked_npc) Tamarin#ozmd3 4_EP18_TAMARIN
// Step 4 + 5 // Step 4 + 5
1@oz,157,272,3 script Miriam#ozmd4 4_EP18_MIRIAM,{ 1@oz,157,272,3 script(DISABLED) Miriam#ozmd4 4_EP18_MIRIAM,{
if ('event_oz != 3) if ('event_oz != 3)
end; end;
'event_oz = 4; 'event_oz = 4;
@ -250,25 +226,25 @@ OnEvent5:
.@miriam4$ = instance_npcname("Miriam#ozmd4"); .@miriam4$ = instance_npcname("Miriam#ozmd4");
.@tamarin4$ = instance_npcname("Tamarin#ozmd4"); .@tamarin4$ = instance_npcname("Tamarin#ozmd4");
.@ashtoad2$ = instance_npcname("Ash Toad#ozmd2"); .@ashtoad2$ = instance_npcname("Ash Toad#ozmd2");
.@maggi4$ = instance_npcname("Magi#ozmd4"); .@maggi4$ = instance_npcname("Maggi#ozmd4");
.@mark4$ = instance_npcname("Mark#ozmd4"); .@mark4$ = instance_npcname("Mark#ozmd4");
.@ashtoad3$ = instance_npcname("Ash Toad#ozmd3"); .@ashtoad3$ = instance_npcname("Ash Toad#ozmd3");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
mapannounce 'map_name$, "Miriam: Ah!! A monster!!!", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "Miriam: Ah!! A monster!!!", bc_map, 0xB7EE,FW_NORMAL,16;
sleep2 1500; sleep2 1500;
mapannounce 'map_name$, "Miriam: I'll take this rude bastard.", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "Miriam: I will take care of this rude guy.", bc_map, 0xB7EE,FW_NORMAL,16;
sleep2 1500; sleep2 1500;
mapannounce 'map_name$, "Tamarin: Appeared in the back!!!", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "Tamarin: It also appeared in the back!!!", bc_map, 0xB7EE,FW_NORMAL,16;
sleep2 2000; sleep2 2000;
enablenpc .@tamarin4$; enablenpc .@tamarin4$;
sleep2 500; sleep2 500;
enablenpc .@ashtoad2$; enablenpc .@ashtoad2$;
mapannounce 'map_name$, "Magi: Crazy!!!", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "Magi: Aaaah!!!", bc_map, 0xB7EE,FW_NORMAL,16;
sleep2 500; sleep2 500;
enablenpc .@maggi4$; enablenpc .@maggi4$;
enablenpc .@mark4$; enablenpc .@mark4$;
mapannounce 'map_name$, "Mark: Please support me in the front!!!", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "Mark: Please support the front!!!", bc_map, 0xB7EE,FW_NORMAL,16;
sleep2 1000; sleep2 1000;
'mob_count_oz = 0; 'mob_count_oz = 0;
monster 'map_name$,145,274,"Ash Toad",21295,1, .@miriam4$ + "::OnMobDead"; // EP18_ASH_TOAD monster 'map_name$,145,274,"Ash Toad",21295,1, .@miriam4$ + "::OnMobDead"; // EP18_ASH_TOAD
@ -289,7 +265,7 @@ OnMobDead:
.@tamarin4$ = instance_npcname("Tamarin#ozmd4"); .@tamarin4$ = instance_npcname("Tamarin#ozmd4");
.@ashtoad2$ = instance_npcname("Ash Toad#ozmd2"); .@ashtoad2$ = instance_npcname("Ash Toad#ozmd2");
.@maggi4$ = instance_npcname("Magi#ozmd4"); .@maggi4$ = instance_npcname("Maggi#ozmd4");
.@mark4$ = instance_npcname("Mark#ozmd4"); .@mark4$ = instance_npcname("Mark#ozmd4");
.@ashtoad3$ = instance_npcname("Ash Toad#ozmd3"); .@ashtoad3$ = instance_npcname("Ash Toad#ozmd3");
.@maram4$ = instance_npcname("Maram#ozmd4"); .@maram4$ = instance_npcname("Maram#ozmd4");
@ -301,60 +277,59 @@ OnMobDead:
npctalk "Tamarin: I did it!!!", .@tamarin4$; npctalk "Tamarin: I did it!!!", .@tamarin4$;
disablenpc .@ashtoad2$; disablenpc .@ashtoad2$;
sleep2 2000; sleep2 2000;
npctalk "Magi: Me too!!", .@maggi4$; npctalk "Magi: This way too!!", .@maggi4$;
disablenpc .@ashtoad3$; disablenpc .@ashtoad3$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Huh It wasn't a great monster, but it would have been dangerous if they were ordinary merchants.", .@miriam4$; npctalk "Miriam: Huh... It wasn't a great monster, but it would have been dangerous for ordinary merchants.", .@miriam4$;
disablenpc .@ashtoad1$; disablenpc .@ashtoad1$;
sleep2 2000; sleep2 2000;
npctalk "Maram : " + strcharinfo(0) + " Are you okay?", .@maram4$; cloakoffnpcself( .@maram4$ );
enablenpc .@maram4$; npctalk "Maram : " + strcharinfo(0) + ", are you okay?", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: You're late! Maram!!!", .@miriam4$; npctalk "Miriam: You're late! Maram!!!", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: I met a monster on the way, so I'm a little late.", .@maram4$; npctalk "Maram: I was a little late because I met a monster on the way.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: There were no monsters on the road we passed earlier.", .@miriam4$; npctalk "Miriam: There were no monsters on the road we passed earlier.", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: Yeah? Where the hell do monsters spring up like this...", .@maram4$; npctalk "Maram: Really? Where on earth do monsters like this come from?", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: It's a big deal because it's getting harder and harder to move goods because of these monsters.", .@maram4$; npctalk "Maram: It's a big problem because it's getting harder to move supplies because of these monsters.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Tamarin: If you go to the ground?", .@tamarin4$; npctalk "Tamarin: What if you travel by land?", .@tamarin4$;
sleep2 2000; sleep2 2000;
npctalk "Tamarin: I heard there used to be a bridge to cross a canyon?", .@tamarin4$; npctalk "Tamarin: I heard there used to be a bridge across the canyon?", .@tamarin4$;
sleep2 2000; sleep2 2000;
npctalk "Tamarin: Because there are still remains...", .@tamarin4$; npctalk "Tamarin: There are still remains left...", .@tamarin4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: It is said that the bridge above was destroyed when they saw the natives crossing to escape the hardliners' attacks.", .@maram4$; npctalk "Maram: It is said that the bridge above was destroyed after seeing natives crossing it while fleeing an attack by hardliners.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: The land across the bridge has become uninhabitable due to volcanic ash, so it must have been the intention to dry it to death.", .@maram4$; npctalk "Maram: The area across the bridge has become uninhabitable due to volcanic ash, so they must have been trying to kill him.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: It's not difficult to make a bridge again...", .@maram4$; npctalk "Maram: It's not difficult to build a bridge again...", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: You can't advertise that you're hiding here by making a bridge because you're in hiding.", .@maram4$; npctalk "Maram: Since we are in a hiding position, we can't build a bridge or something and advertise that we are hiding here.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: It's dangerous and inconvenient right now, but I have no choice but to use the maze of Oz.", .@maram4$; npctalk "Maram: Although it is dangerous and inconvenient now, we have no choice but to use the Maze of Oz.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: In this state, it may not have been noticed until now.", .@maram4$; npctalk "Maram: Because it's in this condition, it may be that it hasn't been discovered until now.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Without the Maze of Oz...", .@miriam4$; npctalk "Miriam: If the Maze of Oz didn't exist...", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: It must have been a lot harder than it is now.", .@miriam4$; npctalk "Miriam: It must have been much harder than it is now.", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: That's right", .@maram4$; npctalk "Maram: That's right.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: Now, shall we walk the lovely maze of Oz again?", .@maram4$; npctalk "Maram: Now then, shall we walk down the lovely maze of Oz again?", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: What do you mean", .@miriam4$; npctalk "Miriam: What do you mean...", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam : " + strcharinfo(0) + " From now on, go all the way down until you come to a fork.", .@miriam4$; npctalk "Miriam : " + strcharinfo(0) + " , from now on, just keep going down until you reach a fork in the road.", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: It would be nice if the monsters didn't appear...", .@miriam4$; npctalk "Miriam: It would be nice if monsters didn't appear, but...", .@miriam4$;
sleep2 1000; sleep2 1000;
disablenpc .@maram4$; cloakonnpcself( .@maram4$ );
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
disablenpc .@maggi4$; disablenpc .@maggi4$;
disablenpc .@mark4$; disablenpc .@mark4$;
disablenpc .@tamarin4$; disablenpc .@tamarin4$;
@ -366,43 +341,43 @@ OnMobDead:
1@oz,156,272,5 duplicate(dummy_disabled_npc) Ash Toad#ozmd1 EP18_ASH_TOAD 1@oz,156,272,5 duplicate(dummy_disabled_npc) Ash Toad#ozmd1 EP18_ASH_TOAD
1@oz,164,272,3 duplicate(dummy_disabled_npc) Ash Toad#ozmd2 EP18_ASH_TOAD 1@oz,164,272,3 duplicate(dummy_disabled_npc) Ash Toad#ozmd2 EP18_ASH_TOAD
1@oz,153,275,5 duplicate(dummy_disabled_npc) Ash Toad#ozmd3 EP18_ASH_TOAD 1@oz,153,275,5 duplicate(dummy_disabled_npc) Ash Toad#ozmd3 EP18_ASH_TOAD
1@oz,155,275,3 duplicate(dummy_disabled_npc) Magi#ozmd4 4_4JOB_MAGGI 1@oz,155,275,3 duplicate(dummy_disabled_npc) Maggi#ozmd4 4_4JOB_MAGGI
1@oz,156,274,3 duplicate(dummy_disabled_npc) Mark#ozmd4 4_EP18_MARK 1@oz,156,274,3 duplicate(dummy_disabled_npc) Mark#ozmd4 4_EP18_MARK
1@oz,161,272,5 duplicate(dummy_disabled_npc) Tamarin#ozmd4 4_EP18_TAMARIN 1@oz,161,272,5 duplicate(dummy_disabled_npc) Tamarin#ozmd4 4_EP18_TAMARIN
1@oz,162,275,3 duplicate(dummy_npc) Maram#ozmd4 4_EP18_MARAM 1@oz,162,275,3 duplicate(dummy_cloaked_npc) Maram#ozmd4 4_EP18_MARAM
// Step 6 // Step 6
1@oz,98,172,3 script Maram#ozmd5 EP18_NPC_MARAM,{ 1@oz,98,172,3 script(DISABLED) Maram#ozmd5 EP18_NPC_MARAM,{
if ('event_oz != 5) if ('event_oz != 5)
end; end;
'event_oz = 6; 'event_oz = 6;
.@miriam$ = instance_npcname("Miriam#ozmd5"); .@miriam$ = instance_npcname("Miriam#ozmd5");
.@maram$ = instance_npcname("Maram#ozmd5"); .@maram$ = instance_npcname("Maram#ozmd5");
npctalk "Maram: It wasn't like this before, but as the ground below begins to melt, perhaps due to the effects of Mount Tor, more monsters are appearing.", .@maram$;
cloakoffnpcself( "Maggi#ozmd5" );
cloakoffnpcself( "Mark#ozmd5" );
cloakoffnpcself( "Tamarin#ozmd5" );
enablenpc .@miriam$; enablenpc .@miriam$;
enablenpc instance_npcname("Magi#ozmd5");
enablenpc instance_npcname("Mark#ozmd5");
enablenpc instance_npcname("Tamarin#ozmd5");
npctalk "Maram: It wasn't like this before, but maybe it's the effect of Tor Volcano, as the ground below starts to melt, so more monsters are appearing.";
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
sleep2 2000; sleep2 2000;
npctalk "Maram: Especially in areas with a lot of molten ground, when trying to avoid monsters, the lava Because there are many people who are seriously injured or never come back... "; npctalk "Maram: Especially in areas where the ground has melted a lot, there are many people who try to avoid monsters and end up seriously injured or unable to return due to the lava...", .@maram$;
sleep2 2000; sleep2 2000;
npctalk "Maram: How long will the maze of Oz last..."; npctalk "Maram: How long will the maze of Oz endure...", .@maram$;
sleep2 3000; sleep2 3000;
mapannounce 'map_name$, "??? : ugh!!!!!!!!!!!!!!!!!!!", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "??? : Ugh!!!!!", bc_map, 0x00B7EE,FW_NORMAL,16;
sleep2 2000; sleep2 2000;
npctalk "Maram: This voice?!?!?!?!?"; npctalk "Maram: What is this voice?!?!?!?!?", .@maram$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Imril!!!!", .@miriam$; npctalk "Miriam: Imril!!!!", .@miriam$;
sleep2 2000; sleep2 2000;
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
npctalk "Maram: I think your friend is in trouble! I'll go first, so please follow me carefully!"; npctalk "Maram: I think my friend is in trouble! I'll go first, so be careful and follow me!", .@maram$;
disablenpc instance_npcname("Magi#ozmd5"); cloakonnpcself( "Maggi#ozmd5" );
disablenpc instance_npcname("Mark#ozmd5"); cloakonnpcself( "Mark#ozmd5" );
disablenpc instance_npcname("Tamarin#ozmd5"); cloakonnpcself( "Tamarin#ozmd5" );
unitwalk getnpcid(0),68,165, .@maram$ + "::OnMove"; unitwalk getnpcid(0),68,165, .@maram$ + "::OnMove";
donpcevent .@miriam$ + "::OnMove"; donpcevent .@miriam$ + "::OnMove";
end; end;
@ -413,33 +388,33 @@ OnMove:
end; end;
} }
1@oz,97,167,3 script Miriam#ozmd5 EP18_NPC_MIRIAM,{ 1@oz,97,167,3 script(DISABLED) Miriam#ozmd5 EP18_NPC_MIRIAM,{
end; end;
OnMove: OnMove:
npcwalkto 67,164; npcwalkto 67,164;
end; end;
} }
1@oz,92,170,3 duplicate(dummy_npc) Magi#ozmd5 4_4JOB_MAGGI 1@oz,92,170,3 duplicate(dummy_cloaked_npc) Maggi#ozmd5 4_4JOB_MAGGI
1@oz,91,169,3 duplicate(dummy_npc) Mark#ozmd5 4_EP18_MARK 1@oz,91,169,3 duplicate(dummy_cloaked_npc) Mark#ozmd5 4_EP18_MARK
1@oz,89,170,5 duplicate(dummy_npc) Tamarin#ozmd5 4_EP18_TAMARIN 1@oz,89,170,5 duplicate(dummy_cloaked_npc) Tamarin#ozmd5 4_EP18_TAMARIN
// Step 7 // Step 7
1@oz,68,165,3 script Maram#ozmd7 4_EP18_MARAM,{ 1@oz,68,165,3 script(DISABLED) Maram#ozmd7 4_EP18_MARAM,{
if ('event_oz != 6) if ('event_oz != 6)
end; end;
'event_oz = 7; 'event_oz = 7;
npctalk "Maram: Are you okay, Imril?"; npctalk "Maram: Imril are you okay?";
donpcevent instance_npcname("Imril#ozmd6") + "::OnStart"; donpcevent instance_npcname("Imril#ozmd6") + "::OnStart";
disablenpc instance_npcname("Maram#ozmd7"); disablenpc();
end; end;
} }
// Step 8 // Step 8
1@oz,61,163,5 script Imril#ozmd6 4_EP18_IMRIL,{ 1@oz,61,163,5 script(DISABLED) Imril#ozmd6 4_EP18_IMRIL,{
end; end;
OnStart: OnStart:
@ -460,56 +435,57 @@ OnMobDead:
.@maram8$ = instance_npcname("Maram#ozmd8"); .@maram8$ = instance_npcname("Maram#ozmd8");
.@imril6$ = instance_npcname("Imril#ozmd6"); .@imril6$ = instance_npcname("Imril#ozmd6");
.@miriam5$ = instance_npcname("Miriam#ozmd5"); .@miriam5$ = instance_npcname("Miriam#ozmd5");
.@maggi6$ = instance_npcname("Magi#ozmd6"); .@maggi6$ = instance_npcname("Maggi#ozmd6");
.@mark6$ = instance_npcname("Mark#ozmd6"); .@mark6$ = instance_npcname("Mark#ozmd6");
.@tamarin6$ = instance_npcname("Tamarin#ozmd6"); .@tamarin6$ = instance_npcname("Tamarin#ozmd6");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
enablenpc .@maram8$;
npctalk "Imril: Thanks! We almost died!", .@imril6$; cloakoffnpcself( .@maram8$ );
npctalk "Imril: Thank you! I almost died!", .@imril6$;
sleep2 2000; sleep2 2000;
npctalk "Imril: Don't go downstairs because the atmosphere isn't too bad.", .@imril6$; npctalk "Imril: The atmosphere is unusual, so don't go downstairs.", .@imril6$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: You seem to see monsters more often than last time.", .@miriam5$; npctalk "Miriam: It seems like I see monsters more often than last time.", .@miriam5$;
sleep2 2000; sleep2 2000;
npctalk "Imril: But what about those people?", .@imril6$; npctalk "Imril: And what about those people?", .@imril6$;
enablenpc .@maggi6$; cloakoffnpcself( .@maggi6$ );
enablenpc .@mark6$; cloakoffnpcself( .@mark6$ );
enablenpc .@tamarin6$; cloakoffnpcself( .@tamarin6$ );
sleep2 2000; sleep2 2000;
npctalk "Maram: They are adventurers who sometimes help with mother's work.", .@maram8$; npctalk "Maram: They are adventurers who sometimes help my mother with her work.", .@maram8$;
sleep2 2000; sleep2 2000;
npctalk "Maram: Trustworthy people, don't be so wary.", .@maram8$; npctalk "Maram: These are trustworthy people, so don't be so wary.", .@maram8$;
sleep2 2000; sleep2 2000;
npctalk "Imril: Because you trust people too easily.", .@imril6$; npctalk "Imril: I heard you trust people too easily.", .@imril6$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Yes.", .@miriam5$; npctalk "Miriam: Yes.", .@miriam5$;
sleep2 2000; sleep2 2000;
npctalk "Maram: Anyway, let's escape before more monsters come out.", .@maram8$; npctalk "Maram: Anyway, let's escape quickly before more monsters appear.", .@maram8$;
sleep2 2000; sleep2 2000;
npctalk "Maram: Not long left.", .@maram8$; npctalk "Maram: Not much left.", .@maram8$;
sleep2 2000; sleep2 2000;
npctalk "Maram: It's hard to see, but just follow the road up here!", .@maram8$; npctalk "Maram: It's hard to see, but you can follow the road up here and keep moving!", .@maram8$;
sleep2 2000; sleep2 2000;
npctalk "Tamarin: I think this is the way!", .@tamarin6$; npctalk "Tamarin: I think this is the way!", .@tamarin6$;
disablenpc .@maggi6$; cloakonnpcself( .@maggi6$ );
disablenpc .@mark6$; cloakonnpcself( .@mark6$ );
disablenpc .@tamarin6$; cloakonnpcself( .@tamarin6$ );
disablenpc .@maram8$; cloakonnpcself( .@maram8$ );
enablenpc instance_npcname("#oz_way"); enablenpc instance_npcname("#oz_way");
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
end; end;
} }
1@oz,68,165,3 duplicate(dummy_npc) Maram#ozmd8 4_EP18_MARAM 1@oz,68,165,3 duplicate(dummy_cloaked_npc) Maram#ozmd8 4_EP18_MARAM
1@oz,61,168,3 duplicate(dummy_npc) Magi#ozmd6 4_4JOB_MAGGI 1@oz,61,168,3 duplicate(dummy_cloaked_npc) Maggi#ozmd6 4_4JOB_MAGGI
1@oz,65,167,3 duplicate(dummy_npc) Mark#ozmd6 4_EP18_MARK 1@oz,65,167,3 duplicate(dummy_cloaked_npc) Mark#ozmd6 4_EP18_MARK
1@oz,59,171,3 duplicate(dummy_npc) Tamarin#ozmd6 4_EP18_TAMARIN 1@oz,59,171,3 duplicate(dummy_cloaked_npc) Tamarin#ozmd6 4_EP18_TAMARIN
// Step 9 // Step 9
1@oz,58,256,5 script #oz_way 1_SHADOW_NPC,3,3,{ 1@oz,58,256,5 script(DISABLED) #oz_way 1_SHADOW_NPC,3,3,{
end; end;
OnTouch: OnTouch:
if ('event_oz != 8) if ('event_oz != 8)
@ -520,11 +496,11 @@ OnTouch:
} }
// Step 10 (maybe not required ?) // Step 10 (maybe not required ?)
1@oz,44,255,5 script Maram#ozmd6 4_EP18_MARAM,{ 1@oz,44,255,5 script(DISABLED) Maram#ozmd6 4_EP18_MARAM,{
if ('event_oz != 9) if ('event_oz != 9)
end; end;
'event_oz = 10; 'event_oz = 10;
npctalk "Maram: This way!!!"; npctalk "Maram: Go down this road.";
initnpctimer; initnpctimer;
end; end;
OnTimer2000: OnTimer2000:
@ -536,7 +512,7 @@ OnTimer2000:
// Step 11 // Step 11
// (Step 29 on the main quest). // (Step 29 on the main quest).
1@oz,21,189,5 script Maram#ozmd9 4_EP18_MARAM,{ 1@oz,21,189,5 script(DISABLED) Maram#ozmd9 4_EP18_MARAM,{
if ('event_oz != 10) if ('event_oz != 10)
end; end;
'event_oz = 11; 'event_oz = 11;
@ -546,50 +522,47 @@ OnTimer2000:
.@imril7$ = instance_npcname("Imril#ozmd7"); .@imril7$ = instance_npcname("Imril#ozmd7");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
npctalk "Maram: Climb up the rope in front of this to get out.", .@maram9$; npctalk "Maram: If you climb up the rope in front of here, you can go outside.", .@maram9$;
enablenpc .@miriam7$; cloakoffnpcself( .@miriam7$ );
enablenpc .@imril7$; cloakoffnpcself( .@imril7$ );
sleep2 2000; sleep2 2000;
npctalk "Imril: I'll go get some hidden stuff here, so go up first.", .@imril7$; npctalk "Imril: I'll take some hidden items here, so go up first.", .@imril7$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Everyone is very tired. Let's go upstairs.", .@miriam7$; npctalk "Miriam: Everyone is very tired. Let's go up quickly.", .@miriam7$;
if (ep18_1_main == 30) { if (ep18_main == 30) {
changequest 11719,11720; erasequest 11719;
ep18_1_main = 31; setquest 11720;
ep18_main = 31;
} }
disablenpc .@miriam7$; cloakonnpcself( .@miriam7$ );
disablenpc .@imril7$; cloakonnpcself( .@imril7$ );
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
end; end;
OnInstanceInit: OnInstanceInit:
disablenpc instance_npcname("Maram#ozmd9"); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(11719) == 1" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(11719) == 1" );
end; end;
} }
1@oz,22,187,5 duplicate(dummy_npc) Miriam#ozmd7 4_EP18_MIRIAM 1@oz,22,187,5 duplicate(dummy_cloaked_npc) Miriam#ozmd7 4_EP18_MIRIAM
1@oz,16,185,3 duplicate(dummy_npc) Imril#ozmd7 4_EP18_IMRIL 1@oz,16,185,3 duplicate(dummy_cloaked_npc) Imril#ozmd7 4_EP18_IMRIL
// Step 12 // Step 12
1@oz,28,190,3 script(DISABLED) Rope#outoz2 4_ROPEPILE,{ 1@oz,28,190,3 script(DISABLED) Rope#outoz2 4_ROPEPILE,{
if ('event_oz < 11) if ('event_oz != 11) {
end; mes "It can't be used yet. Let's talk to Maram first.";
mes "I think I can climb up with a rope."; close;
next;
switch( select( "Use a rope to climb", "Do not use" ) ) {
case 1:
close2;
warp "gw_fild01",275,337;
end;
case 2:
end;
} }
mes "I think I can climb up using the rope.";
next;
if (select( "Use the rope to climb up.", "Do not use." ) == 2)
end;
warp "gw_fild01",275,337;
end; end;
OnInstanceInit: OnInstanceInit:
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(11720) == 1" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(11720) == 1" );
end; end;
} }
@ -601,7 +574,7 @@ OnTouch_:
getmapxy .@map$,.@x,.@y, BL_NPC; getmapxy .@map$,.@x,.@y, BL_NPC;
monster 'map_name$,.@x-1,.@y,"Ash Toad",21295,1; // EP18_ASH_TOAD monster 'map_name$,.@x-1,.@y,"Ash Toad",21295,1; // EP18_ASH_TOAD
monster 'map_name$,.@x+1,.@y,"Rake Hand",21296,1; // EP18_RAKEHAND monster 'map_name$,.@x+1,.@y,"Rake Hand",21296,1; // EP18_RAKEHAND
disablenpc instance_npcname( strnpcinfo(0) ); cloakonnpcself();
end; end;
} }
@ -612,4 +585,3 @@ OnTouch_:
1@oz,79,203,5 duplicate(#oz01) #oz06 1_SHADOW_NPC,4,4 1@oz,79,203,5 duplicate(#oz01) #oz06 1_SHADOW_NPC,4,4
1@oz,124,261,5 duplicate(#oz01) #oz07 1_SHADOW_NPC,4,4 1@oz,124,261,5 duplicate(#oz01) #oz07 1_SHADOW_NPC,4,4
1@oz,139,279,5 duplicate(#oz01) #oz08 1_SHADOW_NPC,4,4 1@oz,139,279,5 duplicate(#oz01) #oz08 1_SHADOW_NPC,4,4

View File

@ -2,54 +2,56 @@
//= Instance: Thor Gunsu Base. //= Instance: Thor Gunsu Base.
//===== Description: ========================================= //===== Description: =========================================
//- [Walkthrough conversion] //- [Walkthrough conversion]
//- Part of the episode 18.1 main quest. //- Part of the Episode 18 main quest.
//===== Changelogs: ========================================== //===== Changelogs: ==========================================
//= 1.0 First version. [Capuche] //= 1.0 First version. [Capuche]
//============================================================ //============================================================
// Main Quest: Step 47. // Main Quest: Step 47.
que_thr,133,53,5 script Maram#Armybase1 4_EP18_MARAM,{ que_thr,133,53,5 script Maram#Armybase1 4_EP18_MARAM,{
if (ep18_1_main != 45 && ep18_1_main != 46) if (ep18_main < 45 || ep18_main > 46)
end; end;
if (ep18_1_main == 45) { if (ep18_main == 45) {
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "You have arrived, adventurer!"; mes "You've arrived, adventurer!";
mes "You did a great job getting here."; mes "Thank you for coming all the way here.";
next; next;
cutin "ep18_maram_03.png",2; cutin "ep18_maram_03.png",2;
mes "[Maram]"; mes "[Maram]";
mes "After all, it looks like this next one is real. The guards are different from before..."; mes "It seems like this is the real deal after all. The security here is different from what it has been so far....";
mes "Let's look inside, being careful not to be caught by the guards."; mes "Let's be careful not to be caught by the guards and explore the inside.";
next; next;
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "Make sure to move out of sight of the guards as much as possible."; mes "Try to move away from the security guard's line of sight as much as possible.";
mes "If you make a mistake, you will be attacked, so if you don't break through, we'll meet again here."; mes "If you get caught, you might be attacked, so if you can't break through, we'll meet again here.";
changequest 16577,16578; erasequest 16577;
ep18_1_main = 46; setquest 16578;
ep18_main = 46;
next; next;
} }
else if (ep18_1_main == 46) { else if (ep18_main == 46) {
cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "Let's try to get in as far as possible from the guard tower."; mes "Let's try to go in while avoiding the guard tower as much as possible.";
next; next;
} }
.@md_name$ = "Thor Gunsu Base"; .@md_name$ = "Thor Military Base";
cutin "",255; cutin "",255;
mes "^FF0000 Any arbitrary processing such as taming monsters in the dungeon is not considered normal. Please note.^000000"; mes "^FF0000Caution : If you perform arbitrary processing within the dungeon, such as monster taming, it will not be considered normal progress.^000000";
next; next;
// player has party // player has party
if (is_party_leader()) { if (is_party_leader())
// player is leader of the party // player is leader of the party
.@create$ = "Open " + .@md_name$; .@create$ = "Apply for entry to " + .@md_name$ + "";
}
switch( select( .@create$, .@md_name$ + " entry" ) ) { switch( select( .@create$, "Enter " + .@md_name$ + "" ) ) {
case 1: case 1:
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "When the application is complete, talk to me again and select ^0000CD Thor military base entry^000000"; mes "When the application is complete, talk to me again and select ^0000CD" + .@md_name$ + " entry^000000";
if (instance_create(.@md_name$) < 0) { if (instance_create(.@md_name$) < 0) {
mes "Party: " + getpartyname(getcharid(1)) + ""; mes "Party: " + getpartyname(getcharid(1)) + "";
mes "Leader: " + strcharinfo(0) + ""; mes "Leader: " + strcharinfo(0) + "";
@ -67,14 +69,14 @@ que_thr,133,53,5 script Maram#Armybase1 4_EP18_MARAM,{
case IE_NOINSTANCE: case IE_NOINSTANCE:
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "I don't think the dungeon has been created yet? Please check later."; mes "It seems like you haven't created the dungeon yet. Please check again in a moment.";
close3; close3;
case IE_NOMEMBER: case IE_NOMEMBER:
mes "[Maram]"; mes "[Maram]";
mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000"; mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000";
close; close;
case IE_OK: case IE_OK:
mapannounce "que_thr", "" + strcharinfo(0) + " of the party, " + getpartyname( getcharid(1) ) + ", is entering " + .@md_name$ + ".",bc_map,"0x00ff99",FW_NORMAL,12; mapannounce "que_thr", "" + strcharinfo(0) + " of the party, " + getpartyname( getcharid(1) ) + ", is entering " + .@md_name$ + ".", bc_map, 0xFF99;
// warp 1@tcamp,103,237; // warp 1@tcamp,103,237;
end; end;
} }
@ -82,34 +84,24 @@ que_thr,133,53,5 script Maram#Armybase1 4_EP18_MARAM,{
end; end;
OnInit: OnInit:
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(16577) == 1" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(16577) == 1" );
end; end;
} }
1@tcamp,106,237,3 script Maram#base1 4_EP18_MARAM,{ 1@tcamp,106,237,3 script Maram#Base1 4_EP18_MARAM,{
cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "Be careful and explore the inside."; mes "Be careful and explore inside.";
mes "I heard from Mr. Dandelion earlier, there aren't many people, but there are Watch Towers here and there that monitor a fairly wide area."; mes "From what I heard from Dandelion earlier, there aren't many people, but there are watchtowers here and there that monitor a fairly wide area.";
next; next;
mes "[Maram]"; mes "[Maram]";
mes "If you get caught by the Watch Tower, soldiers will appear, so be careful not to get caught."; mes "If you get caught by the watchtower, soldiers will appear, so be careful not to get caught.";
mes "Well, if you find something, please contact me!"; mes "Well, if you find anything, please contact me!";
close3; close;
OnInstanceInit: OnInstanceInit:
'step = 0;
'map_tcamp$ = instance_mapname("1@tcamp"); 'map_tcamp$ = instance_mapname("1@tcamp");
disablenpc instance_npcname("Document Pile#Site1");
disablenpc instance_npcname("Document Pile#Site2");
disablenpc instance_npcname("Document Pile#Site3");
disablenpc instance_npcname("Document Pile#Site4");
disablenpc instance_npcname("Document Pile#Site5");
disablenpc instance_npcname("Maram#Lock1");
disablenpc instance_npcname("Maram#Lock2");
disablenpc instance_npcname("Maram#Lock3");
disablenpc instance_npcname("Maram#Lock4");
setcell 'map_tcamp$,137,216,142,216,cell_walkable,0; setcell 'map_tcamp$,137,216,142,216,cell_walkable,0;
setcell 'map_tcamp$,135,145,144,145,cell_walkable,0; setcell 'map_tcamp$,135,145,144,145,cell_walkable,0;
setcell 'map_tcamp$,223,105,223,110,cell_walkable,0; setcell 'map_tcamp$,223,105,223,110,cell_walkable,0;
@ -128,11 +120,11 @@ OnInstanceInit:
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Traps // Traps
//------------------------------------------------------------------- //-------------------------------------------------------------------
1@tcamp,120,228,3 script Watch Tower#Watch1 4_SYSTEM_BOX,7,7,{ 1@tcamp,120,228,3 script Watchtower#Watch1 4_SYSTEM_BOX,7,7,{
end; end;
OnTouch: // note: hidden player trigger the event OnTouch: // note: hidden player trigger the event
npctalk "Detect intruders. Exclude them."; npctalk "Intruder detected !!";
mapannounce 'map_tcamp$, "Intruder detected, intruder detected. We rule out immediately.", bc_map, 0xFF0000; mapannounce 'map_tcamp$, "Intruder found, intruder found. Ruled out immediately.", bc_map, 0xFF0000;
getmapxy .@map$,.@x,.@y, BL_NPC; getmapxy .@map$,.@x,.@y, BL_NPC;
areamonster 'map_tcamp$,.@x-2,.@y-2,.@x+2,.@y+2,"Base Soldier",21309,3; // EP18_MD_THOR_GUARD areamonster 'map_tcamp$,.@x-2,.@y-2,.@x+2,.@y+2,"Base Soldier",21309,3; // EP18_MD_THOR_GUARD
@ -147,316 +139,338 @@ OnInstanceInit:
end; end;
} }
1@tcamp,135,228,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch2 4_SYSTEM_BOX,7,7 1@tcamp,135,228,3 duplicate(Watchtower#Watch1) Watchtower#Watch2 4_SYSTEM_BOX,7,7
1@tcamp,152,133,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch3 4_SYSTEM_BOX,7,7 1@tcamp,152,133,3 duplicate(Watchtower#Watch1) Watchtower#Watch3 4_SYSTEM_BOX,7,7
1@tcamp,167,133,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch4 4_SYSTEM_BOX,7,7 1@tcamp,167,133,3 duplicate(Watchtower#Watch1) Watchtower#Watch4 4_SYSTEM_BOX,7,7
1@tcamp,182,133,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch5 4_SYSTEM_BOX,7,7 1@tcamp,182,133,3 duplicate(Watchtower#Watch1) Watchtower#Watch5 4_SYSTEM_BOX,7,7
1@tcamp,161,96,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch6 4_SYSTEM_BOX,7,7 1@tcamp,161,96,3 duplicate(Watchtower#Watch1) Watchtower#Watch6 4_SYSTEM_BOX,7,7
1@tcamp,146,96,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch7 4_SYSTEM_BOX,7,7 1@tcamp,146,96,3 duplicate(Watchtower#Watch1) Watchtower#Watch7 4_SYSTEM_BOX,7,7
1@tcamp,116,102,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch8 4_SYSTEM_BOX,7,7 1@tcamp,116,102,3 duplicate(Watchtower#Watch1) Watchtower#Watch8 4_SYSTEM_BOX,7,7
1@tcamp,88,92,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch9 4_SYSTEM_BOX,7,7 1@tcamp,88,92,3 duplicate(Watchtower#Watch1) Watchtower#Watch9 4_SYSTEM_BOX,7,7
1@tcamp,240,148,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch10 4_SYSTEM_BOX,7,7 1@tcamp,240,148,3 duplicate(Watchtower#Watch1) Watchtower#Watch10 4_SYSTEM_BOX,7,7
1@tcamp,156,71,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch11 4_SYSTEM_BOX,7,7 1@tcamp,156,71,3 duplicate(Watchtower#Watch1) Watchtower#Watch11 4_SYSTEM_BOX,7,7
1@tcamp,176,194,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch12 4_SYSTEM_BOX,7,7 1@tcamp,176,194,3 duplicate(Watchtower#Watch1) Watchtower#Watch12 4_SYSTEM_BOX,7,7
1@tcamp,192,194,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch13 4_SYSTEM_BOX,7,7 1@tcamp,192,194,3 duplicate(Watchtower#Watch1) Watchtower#Watch13 4_SYSTEM_BOX,7,7
1@tcamp,142,153,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch14 4_SYSTEM_BOX,7,7 1@tcamp,142,153,3 duplicate(Watchtower#Watch1) Watchtower#Watch14 4_SYSTEM_BOX,7,7
1@tcamp,142,168,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch15 4_SYSTEM_BOX,7,7 1@tcamp,142,168,3 duplicate(Watchtower#Watch1) Watchtower#Watch15 4_SYSTEM_BOX,7,7
1@tcamp,192,179,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch16 4_SYSTEM_BOX,7,7 1@tcamp,192,179,3 duplicate(Watchtower#Watch1) Watchtower#Watch16 4_SYSTEM_BOX,7,7
1@tcamp,237,90,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch17 4_SYSTEM_BOX,7,7 1@tcamp,237,90,3 duplicate(Watchtower#Watch1) Watchtower#Watch17 4_SYSTEM_BOX,7,7
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Walls // Walls
//------------------------------------------------------------------- //-------------------------------------------------------------------
1@tcamp,138,216,3 script Lock#1-1 4_ROPEPILE,{ 1@tcamp,138,216,3 script Lock Device#1-1 4_ROPEPILE,{
.@maram$ = instance_npcname("Maram#Lock1"); .@maram$ = instance_npcname("Maram#Lock Device1");
enablenpc .@maram$; enablenpc .@maram$;
npctalk "Maram: Wait a minute. I know how to open it.", .@maram$; npctalk "Maram: Please wait a moment. I know how to open it.", .@maram$;
progressbar_npc "3131FF",10; progressbar_npc "3131FF",10;
npctalk "Maram: Now we can pass!", .@maram$; npctalk "Maram: Well, we can pass now!", .@maram$;
disablenpc instance_npcname("Lock#1-1"); disablenpc instance_npcname("Lock Device#1-1");
disablenpc instance_npcname("Lock#1-2"); disablenpc instance_npcname("Lock Device#1-2");
disablenpc .@maram$; disablenpc .@maram$;
setcell 'map_tcamp$,137,216,142,216,cell_walkable,1; setcell 'map_tcamp$,137,216,142,216,cell_walkable,1;
end; end;
} }
1@tcamp,141,216,3 duplicate(Lock#1-1) Lock#1-2 4_ROPEPILE 1@tcamp,141,216,3 duplicate(Lock Device#1-1) Lock Device#1-2 4_ROPEPILE
1@tcamp,140,218,3 duplicate(dummy_npc) Maram#Lock1 4_EP18_MARAM 1@tcamp,140,218,3 duplicate(dummy_disabled_npc) Maram#Lock Device1 4_EP18_MARAM
1@tcamp,136,145,3 script Lock#2-1 4_ROPEPILE,{ 1@tcamp,136,145,3 script Lock Device#2-1 4_ROPEPILE,{
.@maram$ = instance_npcname("Maram#Lock2"); .@maram$ = instance_npcname("Maram#Lock Device2");
enablenpc .@maram$; enablenpc .@maram$;
progressbar_npc "3131FF",10; progressbar_npc "3131FF",10;
npctalk "It would be better to proceed with caution.", .@maram$; npctalk "It would be better to proceed with caution.", .@maram$;
disablenpc instance_npcname("Lock#2-1"); disablenpc instance_npcname("Lock Device#2-1");
disablenpc instance_npcname("Lock#2-2"); disablenpc instance_npcname("Lock Device#2-2");
disablenpc instance_npcname("Lock#2-3"); disablenpc instance_npcname("Lock Device#2-3");
disablenpc instance_npcname("Lock#2-4"); disablenpc instance_npcname("Lock Device#2-4");
disablenpc .@maram$; disablenpc .@maram$;
setcell 'map_tcamp$,135,145,144,145,cell_walkable,1; setcell 'map_tcamp$,135,145,144,145,cell_walkable,1;
end; end;
} }
1@tcamp,138,145,3 duplicate(Lock#2-1) Lock#2-2 4_ROPEPILE 1@tcamp,138,145,3 duplicate(Lock Device#2-1) Lock Device#2-2 4_ROPEPILE
1@tcamp,141,145,3 duplicate(Lock#2-1) Lock#2-3 4_ROPEPILE 1@tcamp,141,145,3 duplicate(Lock Device#2-1) Lock Device#2-3 4_ROPEPILE
1@tcamp,143,145,3 duplicate(Lock#2-1) Lock#2-4 4_ROPEPILE 1@tcamp,143,145,3 duplicate(Lock Device#2-1) Lock Device#2-4 4_ROPEPILE
1@tcamp,142,147,3 duplicate(dummy_npc) Maram#Lock2 4_EP18_MARAM 1@tcamp,142,147,3 duplicate(dummy_disabled_npc) Maram#Lock Device2 4_EP18_MARAM
1@tcamp,223,109,3 script Lock#3-1 4_ROPEPILE,{ 1@tcamp,223,109,3 script Lock Device#3-1 4_ROPEPILE,{
.@maram$ = instance_npcname("Maram#Lock3"); .@maram$ = instance_npcname("Maram#Lock Device3");
enablenpc .@maram$; enablenpc .@maram$;
npctalk "Maram: This building looks pretty suspicious, right? There must be a surveillance system in it as well.", .@maram$; npctalk "Maram: This building looks quite suspicious, right? There must be a surveillance system in here too.", .@maram$;
progressbar_npc "3131FF",10; progressbar_npc "3131FF",10;
npctalk "Maram: Let's explore carefully, being careful not to get caught this time.", .@maram$; npctalk "Maram: Let's explore carefully this time, being careful not to get caught.", .@maram$;
disablenpc instance_npcname("Lock#3-1"); disablenpc instance_npcname("Lock Device#3-1");
disablenpc instance_npcname("Lock#3-2"); disablenpc instance_npcname("Lock Device#3-2");
disablenpc .@maram$; disablenpc .@maram$;
setcell 'map_tcamp$,223,105,223,110,cell_walkable,1; setcell 'map_tcamp$,223,105,223,110,cell_walkable,1;
end; end;
} }
1@tcamp,223,106,3 duplicate(Lock#3-1) Lock#3-2 4_ROPEPILE 1@tcamp,223,106,3 duplicate(Lock Device#3-1) Lock Device#3-2 4_ROPEPILE
1@tcamp,226,114,3 duplicate(dummy_npc) Maram#Lock3 4_EP18_MARAM 1@tcamp,226,114,3 duplicate(dummy_disabled_npc) Maram#Lock Device3 4_EP18_MARAM
1@tcamp,80,99,3 script Lock#4-1 4_ROPEPILE,{ 1@tcamp,80,99,3 script Lock Device#4-1 4_ROPEPILE,{
.@maram$ = instance_npcname("Maram#Lock4"); .@maram$ = instance_npcname("Maram#Lock Device4");
enablenpc .@maram$; enablenpc .@maram$;
npctalk "Maram: I think you've gotten pretty deep. You should be able to find what you need safely.", .@maram$; npctalk "Maram: Looks like we're in pretty deep. We should be able to safely find what we need.", .@maram$;
progressbar_npc "3131FF",10; progressbar_npc "3131FF",10;
npctalk "Maram: Shall we wish you luck?", .@maram$; npctalk "Maram: Shall we wish you good luck?", .@maram$;
disablenpc instance_npcname("Lock#4-1"); disablenpc instance_npcname("Lock Device#4-1");
disablenpc instance_npcname("Lock#4-2"); disablenpc instance_npcname("Lock Device#4-2");
disablenpc instance_npcname("Lock#4-3"); disablenpc instance_npcname("Lock Device#4-3");
disablenpc .@maram$; disablenpc .@maram$;
setcell 'map_tcamp$,80,94,80,100,cell_walkable,1; setcell 'map_tcamp$,80,94,80,100,cell_walkable,1;
enablenpc instance_npcname("Document Pile#Site1"); enablenpc instance_npcname("Pile of documents#Base1");
enablenpc instance_npcname("Document Pile#Site2"); enablenpc instance_npcname("Pile of documents#Base2");
enablenpc instance_npcname("Document Pile#Site3"); enablenpc instance_npcname("Pile of documents#Base3");
enablenpc instance_npcname("Document Pile#Site4"); enablenpc instance_npcname("Pile of documents#Base4");
enablenpc instance_npcname("Document Pile#Site5"); enablenpc instance_npcname("Pile of documents#Base5");
enablenpc instance_npcname("Miriam#base1"); enablenpc instance_npcname("Miriam#Base1");
enablenpc instance_npcname("Maram#base5"); enablenpc instance_npcname("Maram#Base5");
if ('step == 0)
'step = 1;
end; end;
} }
1@tcamp,80,97,3 duplicate(Lock#4-1) Lock#4-2 4_ROPEPILE 1@tcamp,80,97,3 duplicate(Lock Device#4-1) Lock Device#4-2 4_ROPEPILE
1@tcamp,80,95,3 duplicate(Lock#4-1) Lock#4-3 4_ROPEPILE 1@tcamp,80,95,3 duplicate(Lock Device#4-1) Lock Device#4-3 4_ROPEPILE
1@tcamp,82,100,3 duplicate(dummy_npc) Maram#Lock4 4_EP18_MARAM 1@tcamp,82,100,3 duplicate(dummy_disabled_npc) Maram#Lock Device4 4_EP18_MARAM
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Final // Final
//------------------------------------------------------------------- //-------------------------------------------------------------------
1@tcamp,32,100,3 script Document Pile#Site1 4_EP18_PAPERS,{ 1@tcamp,32,100,3 script(DISABLED) Pile of documents#Base1 4_EP18_PAPERS,{
mes "[Pile of Papers]"; if ('step != 1)
mes "All the papers are jumbled up."; end;
mes "I took out a few sheets from the middle These are the expiry date of the weapon and the sales statement."; mes "[Pile of documents]";
mes "All kinds of documents are all mixed up.";
mes "I took out a few pages from the middle and found that they were weapons expiration dates and sales records.";
next; next;
mes "[Pile of Papers]"; mes "[Pile of documents]";
mes "Even the date is very recent. There is a record of handing over a large number of weapons to Mr. Dandelion."; mes "Even the date is very recent. There is also a record of handing over a large amount of weapons to Mr. Dandelion.";
mes "I think I found what I was looking for. I put the documents in my pocket."; mes "It looks like I found what I was looking for. I put the documents in my arms.";
close2; close2;
getitem 1000409,1; // Ep18_Docu_File getitem 1000409,1; // Ep18_Docu_File
cloakonnpcself( instance_npcname("Document Pile#Site1") ); cloakonnpcself();
end; end;
} }
1@tcamp,49,123,3 script Document Pile#Site2 4_EP18_PAPERS,{ 1@tcamp,49,123,3 script(DISABLED) Pile of documents#Base2 4_EP18_PAPERS,{
mes "[Pile of Papers]"; if ('step != 1)
mes "All the papers are jumbled up."; end;
mes "At the top of the page the final menu for luncheon dinner?"; mes "[Pile of documents]";
mes "All kinds of documents are all mixed up.";
mes "On the top page... is it a battle to decide the menu for lunch?";
next; next;
mes "[Pile of Papers]"; mes "[Pile of documents]";
mes "It seems that the menu is fried fish with sauce."; mes "It looks like the menu has been set on fried fish covered in sauce....";
mes "You seem to have left unimportant documents. Let's take care of them first."; mes "It looks like he left behind only unimportant documents. Let's take care of them for now.";
close2; close2;
getitem 1000409,1; // Ep18_Docu_File getitem 1000409,1; // Ep18_Docu_File
cloakonnpcself( instance_npcname("Document Pile#Site2") ); cloakonnpcself();
end; end;
} }
1@tcamp,29,86,3 script Document Pile#Site3 4_EP18_PAPERS,{ 1@tcamp,29,86,3 script(DISABLED) Pile of documents#Base3 4_EP18_PAPERS,{
mes "[Pile of Papers]"; if ('step != 1)
mes "All the papers are jumbled up."; end;
mes "I took one out of the middle The layout of the military base guards?"; mes "[Pile of documents]";
mes "All kinds of documents are all mixed up.";
mes "I took one out from the middle and saw... a map of the security guards at the military base?";
next; next;
mes "[Pile of Papers]"; mes "[Pile of documents]";
mes "Looking at the date, it was a long time ago."; mes "Looking at the date, it's a long time ago document.";
mes "You seem to have left unimportant documents. Let's take care of them first."; mes "It looks like he left behind only unimportant documents. Let's take care of them for now.";
close2; close2;
getitem 1000409,1; // Ep18_Docu_File getitem 1000409,1; // Ep18_Docu_File
cloakonnpcself( instance_npcname("Document Pile#Site3") ); cloakonnpcself();
end; end;
} }
1@tcamp,60,122,3 script Document Pile#Site4 4_EP18_PAPERS,{ 1@tcamp,60,122,3 script(DISABLED) Pile of documents#Base4 4_EP18_PAPERS,{
mes "[Pile of Papers]"; if ('step != 1)
mes "All the papers are jumbled up."; end;
mes "The top one... 'If you feed the magmaring potatoes and hunt them after a while, will they drop the baked potatoes?'"; mes "[Pile of documents]";
mes "All kinds of documents are all mixed up.";
mes "The top chapter is... ¡®If you feed a magmaring a potato and then hunt it after a while, should it drop a baked potato?'";
next; next;
mes "[Pile of Papers]"; mes "[Pile of documents]";
mes "why is this here. But I'm curious about the result!"; mes "...Why is this here? But I'm curious about the results!";
mes "You seem to have left unimportant documents. Let's take care of them first."; mes "It looks like he left behind only unimportant documents. Let's take care of them for now.";
close2; close2;
getitem 1000409,1; // Ep18_Docu_File getitem 1000409,1; // Ep18_Docu_File
cloakonnpcself( instance_npcname("Document Pile#Site4") ); cloakonnpcself();
end; end;
} }
1@tcamp,31,84,3 script Document Pile#Site5 4_EP18_PAPERS,{ 1@tcamp,31,84,3 script(DISABLED) Pile of documents#Base5 4_EP18_PAPERS,{
mes "[Pile of Papers]"; if ('step != 1)
mes "All the papers are jumbled up."; end;
mes "Picking one out of the middle I found an illustration of the Pope drawn by icing the Pope's cookie icing with a pen."; mes "[Pile of documents]";
mes "All kinds of documents are all mixed up.";
mes "When I pulled one out from the middle... I found an illustration of the Pope drawn with Pope cookie icing using a pen.";
next; next;
mes "[Pile of Papers]"; mes "[Pile of documents]";
mes "What kind of picture is it? Besides, you drew it very well."; mes "What kind of picture is this? And it's really well drawn....";
mes "You seem to have left unimportant documents. Let's take care of them first."; mes "It looks like he left behind only unimportant documents. Let's take care of them for now.";
close2; close2;
getitem 1000409,1; // Ep18_Docu_File getitem 1000409,1; // Ep18_Docu_File
cloakonnpcself( instance_npcname("Document Pile#Site5") ); cloakonnpcself();
end; end;
} }
1@tcamp,34,100,3 script Miriam#base1 4_EP18_MIRIAM,3,3,{ 1@tcamp,34,100,3 script(DISABLED) Miriam#Base1 4_EP18_MIRIAM,3,3,{
disable_items; if ('step == 1) {
if (countitem(1000409) < 5) { // Ep18_Docu_File if (countitem(1000409) < 5) { // Ep18_Docu_File
cutin "ep18_miriam_02.png",2;
mes "[Miriam]";
mes "As expected, you are talented, adventurer. I used all my connections to find out the location.";
mes "It looks like you found the adventurer and Maram right away.";
next;
mes "[Miriam]";
mes "Please read these documents. They contain what we are looking for.";
mes "Rather than having me explain everything to you, I think it would be better for you to see it for yourself.";
close3;
}
if (getequipid(EQI_HEAD_TOP) != 400127) { // Ep18_Mini_Elly
mes "[Mini Elly]";
mes "Get it out of the bag. Put it on your head.";
close;
}
mes "[Miriam]";
mes ".......";
next;
cutin "ep18_maram_01.png",2;
mes "[Maram]";
mes "No, Miriam! How are you here?";
mes "They said they would conduct a separate investigation!";
next;
cutin "ep18_miriam_01.png",2;
mes "[Miriam]";
mes "How did you and the adventurer dig this far?";
mes "As expected, your skills are good. I used all my connections to find out the location, but you found it right away.";
next;
cutin "ep18_maram_02.png",2;
mes "[Maram]";
mes "Let's do something about it, right, adventurer?";
mes "Anyway, what information did you get?";
next;
cutin "ep18_miriam_02.png",2; cutin "ep18_miriam_02.png",2;
mes "[Miriam]"; mes "[Miriam]";
mes "As expected, you are talented, adventurer. I used all sorts of connections to find the position."; mes "Look at this document here.";
mes "It seems that Adventurer and Maram found it at once."; next;
cutin "",255;
mes "[Mini Elly]";
mes "This document is a weapon sales record. Please show it to me.";
mes "All of the weapons and firearms that these people disposed of have less than a year left before their expiration date.";
next;
cutin "ep18_miriam_03.png",2;
mes "[Miriam]";
mes "You sell weapons like this so recklessly.";
mes "If a weapon is not properly maintained, it may not function properly.";
next;
cutin "ep18_maram_03.png",2;
mes "[Maram]";
mes "The quality of all weapons coming out of the back hole is the same.";
mes "...But I guess it's at this point in time.";
next;
mes "[Maram]";
mes "One year is not a long expiration date, but it is not too tight.";
mes "Why did it pour out at this moment when we were preparing for the protest?";
next;
mes "[Maram]";
mes "There wouldn't have been a need to dispose of it right away.";
next;
cutin "ep18_miriam_02.png",2;
mes "[Miriam]";
mes "This is one of the military bases managed by my adoptive father.";
mes "I was wondering if it would really pop out at a time like this.";
next;
cutin "",255;
select( "If it's your adoptive father, is it Priest Amal?", "That adoptive father who is a hardliner and pro-war?" );
cutin "ep18_miriam_02.png",2;
mes "[Miriam]";
mes "That's right, adventurer. When I looked at the ledger, it doesn't seem like my adoptive father was involved.";
mes "I think it's an isolated corruption at the lowest level, the weapons leak incident.";
next; next;
mes "[Miriam]"; mes "[Miriam]";
mes "Read some of the documents here. We have what we were looking for."; mes "I'll have to dig a little deeper, but that's my guess for now.";
mes "I think it would be better to come and see it firsthand than to explain everything."; mes "Oh, please give me the documents. I'll take them as evidence.";
close3; delitem 1000409,5; // Ep18_Docu_File
if ('step == 1)
'step = 2;
if (isbegin_quest(16578) == 1) {
erasequest 16578;
setquest 16579;
}
close2;
cutin "",255;
npctalk "Maram: Ha, this is really fun.", instance_npcname("Maram#Base5");
end;
} }
if (getequipid(EQI_HEAD_TOP) != 400127) { // Ep18_Mini_Elly if ('step == 2) {
mes "[Mini Elly]"; cutin "ep18_miriam_02.png",2;
mes "Get it out of the bag. Put it on your head."; mes "[Miriam]";
mes "...Just a moment, I'm reading the document.";
close; close;
} }
cutin "ep18_miriam_02.png",2;
mes "[Miriam]";
mes ".";
next;
cutin "ep18_maram_01.png",2;
mes "[Maram]";
mes "No, Miriam! How are you here?";
mes "They said they would investigate separately!";
next;
cutin "ep18_miriam_01.png",2;
mes "[Miriam]";
mes "How did you and the adventurer dig this far?";
mes "You have good skills, too. It was a location that I found using all kinds of connections, but you found it at once.";
next;
cutin "ep18_maram_02.png",2;
mes "[Maram]";
mes "Let's do some, right, adventurer?";
mes "Anyway, what information did you get?";
next;
cutin "ep18_miriam_02.png",2;
mes "[Miriam]";
mes "Look at this document here.";
next;
cutin "",255;
mes "[Mini Elly]";
mes "This is a sales statement for arms. Show it to me as well.";
mes "The weapons and firearms these men have disposed of are all less than a year old.";
next;
cutin "ep18_miriam_03.png",2;
mes "[Miriam]";
mes "How dare you sell such weapons.";
mes "A weapon that is not properly maintained may not function properly.";
next;
cutin "ep18_maram_03.png",2;
mes "[Maram]";
mes "The weapons that come out of the back hole are all the same.";
mes "but, at least it's at this point.";
next;
mes "[Maram]";
mes "A year is not a long term, but it is not tight.";
mes "Why did we pour out at this moment in preparation for the protest?";
next;
mes "[Maram]";
mes "You wouldn't have to dispose of it right away.";
next;
npctalk "Maram: haha, this is so funny", instance_npcname("Maram#base5");
sleep2 300;
cutin "ep18_miriam_02.png",2;
mes "[Miriam]";
mes "This is one of the military bases managed by my stepfather.";
mes "Just by chance, it really came out at a time like this.";
next;
cutin "",255;
select( "If your stepfather is a priest, Youth Amal?", "The hard-line and pro-war stepfather?" );
cutin "ep18_miriam_02.png",2;
mes "[Miriam]";
mes "That's right, adventurer. Looking at the ledger, it doesn't seem like the stepfather was involved.";
mes "I think it was a single corruption at the end, the weapon leak case.";
next;
mes "[Miriam]";
mes "I'll have to dig a little deeper, but that's my guess for now.";
mes "Oh, give me the documents. I'll take it as evidence.";
delitem 1000409,5; // Ep18_Docu_File
if (isbegin_quest(16578) == 1) {
erasequest 16578;
setquest 16579;
}
close2;
cutin "",255;
npctalk "Maram: haha, this is so funny", instance_npcname("Maram#base5");
end; end;
OnTouch: OnTouch:
npctalk "Miriam: Oh, adventurer? Maram you too!?"; if (countitem(1000409) < 5)
npctalk "Miriam: Oh, adventurer? Maram, you too!?";
end; end;
OnInstanceInit: OnInstanceInit:
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(16578) == 1 && countitem(1000409) > 4" ); // Ep18_Docu_File questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(16578) == 1 && countitem(1000409) > 4" ); // Ep18_Docu_File
disablenpc instance_npcname("Miriam#base1");
end; end;
} }
1@tcamp,32,102,3 script Maram#base5 4_EP18_MARAM,{ 1@tcamp,32,102,3 script(DISABLED) Maram#Base5 4_EP18_MARAM,{
if (isbegin_quest(16579) == 0) { if ('step == 1) {
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "I didn't know Miriam was here, right, adventurer?"; mes "I didn't know Miriam would be here. Right, adventurer?";
close3; close3;
} }
cutin "ep18_maram_02.png",2; if ('step == 2) {
mes "[Maram]"; mes "[Maram]";
mes "We moved separately, but in the end we are in the same position."; mes "They moved separately, but ended up in the same place.";
mes "Still, what I got in the process was different, so I guess it has its own meaning."; mes "Still, what I gained from the process was different, so I guess it has some meaning.";
next; next;
cutin "ep18_miriam_02.png",2; cutin "ep18_miriam_02.png",2;
mes "[Miriam]"; mes "[Miriam]";
mes "Then I must be away for a while."; mes "Then I guess I'll have to leave for a while.";
mes "I'm going to pass on my findings to my stepfather."; mes "I'll have to relay what I found out to my adoptive father.";
next; next;
mes "[Miriam]"; mes "[Miriam]";
mes "Because there is a possibility that the adoptive father may not know yet if it is a single corruption."; mes "If it's an isolated corruption, there's a chance that even my adoptive father doesn't know about it yet.";
next; next;
cutin "ep18_maram_03.png",2; cutin "ep18_maram_03.png",2;
mes "[Maram]"; mes "[Maram]";
mes "Is it really an independent corruption? That's probably what bothers me."; mes "Is this really an isolated case of corruption? That is something that bothers me.";
mes "I have something to give to Rachel, Miriam, let's go together."; mes "I also have something to deliver to Rachel, so Miriam, let's go together.";
next; next;
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "I'll give you a shortcut, so can you please tell Suad what you found out here?"; mes "I will tell you a shortcut to get out, so would you, adventurer, tell Suad what you found out here?";
mes "We will follow soon, so please go ahead and tell me."; mes "We will follow shortly, so please go and tell us first.";
if (ep18_1_main == 46) { if (ep18_main == 46) {
ep18_1_main = 47; ep18_main = 47;
erasequest 16579; erasequest 16579;
setquest 16580; setquest 16580;
getitem "Ep18_Amethyst_Fragment",50; getitem 1000405,50; // Ep18_Amethyst_Fragment
}
close2;
warp "wolfvill",162,154;
end;
} }
close2; // debug
warp "wolfvill",162,154; warp "wolfvill",162,154;
end; end;
OnInstanceInit: OnInstanceInit:
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(16579) == 1" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(16579) == 1" );
disablenpc instance_npcname("Maram#base5");
end; end;
} }

View File

@ -2,7 +2,7 @@
//= Instance Villa of Deception. //= Instance Villa of Deception.
//===== Description: ========================================= //===== Description: =========================================
//- [Walkthrough conversion] //- [Walkthrough conversion]
//- Require to complete the episode 18.1 main quest. //- Require to complete the Episode 18 main quest.
//- The function to drop an item with random option is defined in re/other/glocal_npc2.txt //- The function to drop an item with random option is defined in re/other/glocal_npc2.txt
// Notes: // Notes:
// Some of the setting can be modified in 'Optional settings'. // Some of the setting can be modified in 'Optional settings'.
@ -16,14 +16,14 @@
wolfvill,79,260,0 script #con_wp11 HIDDEN_WARP_NPC,4,4,{ wolfvill,79,260,0 script #con_wp11 HIDDEN_WARP_NPC,4,4,{
end; end;
OnTouch: OnTouch:
if (ep18_1_main < 57) if (ep18_main < 57)
end; end;
cloakoffnpcself( "Aira#con" ); cloakoffnpcself( "Aira#con" );
end; end;
} }
wolfvill,79,260,4 script(CLOAKED) Aira#con 4_M_BRZ_JACI,{ wolfvill,79,260,4 script(CLOAKED) Aira#con 4_M_BRZ_JACI,{
if (ep18_1_main < 57) if (ep18_main < 57)
end; end;
switch( checkquest(12522,PLAYTIME) ) { switch( checkquest(12522,PLAYTIME) ) {
case -1: case -1:

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,50 @@
//===== rAthena Script =======================================
//= Mapflag: special popup map setting.
//===== Description: =========================================
//= Displays a special popup when a player enters the map.
//===== Additional Comments: =================================
//= 1.0 Initial script. [eppc0330]
//============================================================
herosria mapflag specialpopup 1
hero_in1 mapflag specialpopup 1
hero_in2 mapflag specialpopup 1
hero_in3 mapflag specialpopup 1
hero_in4 mapflag specialpopup 1
hero_out1 mapflag specialpopup 1
hero_out2 mapflag specialpopup 1
hero_out3 mapflag specialpopup 1
hero_out4 mapflag specialpopup 1
hero_ent1 mapflag specialpopup 1
hero_ent2 mapflag specialpopup 1
hero_ent3 mapflag specialpopup 1
hero_tra mapflag specialpopup 2
hero_dun1 mapflag specialpopup 2
bl_ice mapflag specialpopup 3
bl_lava mapflag specialpopup 3
bl_grass mapflag specialpopup 3
bl_death mapflag specialpopup 3
bl_soul mapflag specialpopup 3
bl_venom mapflag specialpopup 3
bl_temple mapflag specialpopup 3
thana_step mapflag specialpopup 4
tha_t07 mapflag specialpopup 4
tha_t08 mapflag specialpopup 4
tha_t09 mapflag specialpopup 4
tha_t10 mapflag specialpopup 4
tha_t11 mapflag specialpopup 4
tha_t12 mapflag specialpopup 4
ama_dun01 mapflag specialpopup 5
lhz_dun_n mapflag specialpopup 6
bl_depth1 mapflag specialpopup 7
for_dun01 mapflag specialpopup 8
for_dun02 mapflag specialpopup 8
bl_depth2 mapflag specialpopup 9

View File

@ -60,5 +60,5 @@ Footer:
- Path: npc/re/merchants/barters/enchan_illusion_dungeons.yml - Path: npc/re/merchants/barters/enchan_illusion_dungeons.yml
- Path: npc/re/merchants/barters/quests_exp_175.yml - Path: npc/re/merchants/barters/quests_exp_175.yml
- Path: npc/re/merchants/barters/mysterious_cookie_shop.yml - Path: npc/re/merchants/barters/mysterious_cookie_shop.yml
- Path: npc/re/merchants/barters/quests_18_1.yml - Path: npc/re/merchants/barters/quests_18.yml
- Path: npc/re/merchants/barters/quests_19.yml - Path: npc/re/merchants/barters/quests_19.yml

View File

@ -4007,8 +4007,8 @@ OnInit:
} }
// ba_in01,26,266,3 script Smart Ellie#ep18ely01 4_EP17_TABLET,{ // ba_in01,26,266,3 script Smart Elly#ep18ely01 4_EP17_TABLET,{
ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{ ba_in01,26,266,3 script Smart Elly#ep172_ely01 4_EP17_TABLET,{
if (checkweight(1000103,15) == 0) { if (checkweight(1000103,15) == 0) {
mes "You cannot proceed with the quest because you have too many items in your possession."; mes "You cannot proceed with the quest because you have too many items in your possession.";
mes "Please clean up your inventory and try again."; mes "Please clean up your inventory and try again.";
@ -4016,39 +4016,39 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
} }
if (ep17_2_main < 32) { if (ep17_2_main < 32) {
cutin "ep172_beta.bmp", 2; cutin "ep172_beta.bmp", 2;
mes "[Ellie]"; mes "[Elly]";
mes "Hello, guest."; mes "Hello, guest.";
mes "I'm responsible for the airship hangar's information."; mes "I'm responsible for the airship hangar's information.";
mes "Please call me Ellie."; mes "Please call me Elly.";
close3; close3;
} }
if (ep17_2_main == 32) { if (ep17_2_main == 32) {
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "Hello, guest."; mes "Hello, guest.";
mes "I'm responsible for the airship hangar's information."; mes "I'm responsible for the airship hangar's information.";
mes "Please call me Ellie."; mes "Please call me Elly.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "After the master had destroyed this place, I have been doing something else for a while, but..."; mes "After the master had destroyed this place, I have been doing something else for a while, but...";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Now I'm back at Alpha's request."; mes "Now I'm back at Alpha's request.";
mes "Please leave the hangar's matters to me, Ellie."; mes "Please leave the hangar's matters to me, Elly.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "The leader of the 'intruders' had freely access the area for the master's collection 3..."; mes "The leader of the 'intruders' had freely access the area for the master's collection 3...";
mes "I returned here to manage it."; mes "I returned here to manage it.";
npctalk "Sounds troublesome.", "", bc_self; npctalk "Sounds troublesome.", "", bc_self;
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "We are currently tracking the expected path after receiving the incident report."; mes "We are currently tracking the expected path after receiving the incident report.";
mes "However, tracking it is not easy because the main system of No. 3 is completely disconnected."; mes "However, tracking it is not easy because the main system of No. 3 is completely disconnected.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "The 'invaders' which the 'guests' calls the 'Illusions' has a 99.9% chance that they made modifications on the system."; mes "The 'invaders' which the 'guests' calls the 'Illusions' has a 99.9% chance that they made modifications on the system.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Dear 'guests', are you here?"; mes "Dear 'guests', are you here?";
cloakoffnpcself( "Est#ep172_est02" ); cloakoffnpcself( "Est#ep172_est02" );
cloakoffnpcself( "Rookie#ep172_rk03" ); cloakoffnpcself( "Rookie#ep172_rk03" );
@ -4063,15 +4063,15 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
mes "I told Alpha that the analysisable data in the current state is over."; mes "I told Alpha that the analysisable data in the current state is over.";
next; next;
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "Yes. I have sent the data."; mes "Yes. I have sent the data.";
mes "Currently, there is no reception from the master's collection 3, but we have caught some unusual signals."; mes "Currently, there is no reception from the master's collection 3, but we have caught some unusual signals.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "This facility has not been used for a long time, but it has been secretly used by the 'intruders' and..."; mes "This facility has not been used for a long time, but it has been secretly used by the 'intruders' and...";
npctalk "Unusual signal?", "Rookie#ep172_rk03", bc_self; npctalk "Unusual signal?", "Rookie#ep172_rk03", bc_self;
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "There are traces of magical communication with certain places outside the mansion."; mes "There are traces of magical communication with certain places outside the mansion.";
mes "It's an intermittent signal."; mes "It's an intermittent signal.";
next; next;
@ -4081,16 +4081,16 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
mes "Where? the enterprise?"; mes "Where? the enterprise?";
next; next;
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "According to the analysis, it's a one-way reception."; mes "According to the analysis, it's a one-way reception.";
mes "It appears to be collecting reports from the outside..."; mes "It appears to be collecting reports from the outside...";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "It will take some time to completely analyze the code because it was used by the 'intruders' for one-way reception."; mes "It will take some time to completely analyze the code because it was used by the 'intruders' for one-way reception.";
next; next;
cutin "16loo_01",0; cutin "16loo_01",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Then, Ellie, I'll ask for one thing."; mes "Then, Elly, I'll ask for one thing.";
mes "Continue receiving the signals as if the 'intruders' leader is still here."; mes "Continue receiving the signals as if the 'intruders' leader is still here.";
next; next;
cutin "ep162_est01",1; cutin "ep162_est01",1;
@ -4099,7 +4099,7 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
mes "With that, we'll be able to trace back the other collaborators out there."; mes "With that, we'll be able to trace back the other collaborators out there.";
next; next;
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "I will do as you say."; mes "I will do as you say.";
mes "We will maintain information patters of the 'intruders' and collect information received from their accomplices from outside the mansion."; mes "We will maintain information patters of the 'intruders' and collect information received from their accomplices from outside the mansion.";
next; next;
@ -4135,10 +4135,10 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
cutin "16loo_03",0; cutin "16loo_03",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Then I'll let everyone and help Alpha."; mes "Then I'll let everyone and help Alpha.";
mes "Take good care of Ellie!"; mes "Take good care of Elly!";
next; next;
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "Do not worry about this place."; mes "Do not worry about this place.";
mes "Me and Almond will take care of it."; mes "Me and Almond will take care of it.";
mes "You can be rest assured."; mes "You can be rest assured.";
@ -4148,189 +4148,190 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
cloakonnpcself( "Rookie#ep172_rk03" ); cloakonnpcself( "Rookie#ep172_rk03" );
end; end;
} }
if (ep18_1_main == 0 && BaseLevel >= 170) { if (ep18_main == 0 && BaseLevel >= 170) {
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "The periodic signal has not yet been received."; mes "No regular signals have been received yet.";
mes "The whereabouts of your master's collection#3 are also being tracked."; mes "We're also tracking the whereabouts of your collection #3.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Don't worry."; mes "No worries.";
mes "Time is on our side"; mes "Time is on our side.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "I and Alpha will analyze the information properly, so if you clean up the abandoned remnants... Ah!"; mes "We'll properly analyze the information, so it would be great if the guest could clean up the remnants left behind... Oh!";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Please don't go anywhere for a moment."; mes "Just a moment, please stay here.";
mes "It will be over soon"; mes "It'll be over soon.";
mes "Time was on our side, wasn't it?"; mes "Time is on our side, right?";
next; next;
// note: progressbar_npc must be after "next" otherwise the client may crash mes "[Elly]";
progressbar_npc "FFFF00",4;
mes "[Ellie]";
mes "Wait a minute..."; mes "Wait a minute...";
mes "..."; mes "...";
mes "..."; mes "...";
// note: progressbar_npc must be after "next" otherwise the client may crash
// progressbar_npc "FFFF00",4;
next; next;
mes "[Ellie]"; progressbar_npc "FFFF00",4;
mes "As soon as the password is decrypted, it will be fast."; mes "[Elly]";
mes "The thing that took the longest is an instant."; mes "Once we decrypt the code, it'll be quick.";
mes "The longest part is over, so it feels like it went by in a flash.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "There is something in ^0000FFRachel^000000"; mes "There is something in ^0000FFRachel^000000.";
mes "Of course I've only heard of Rachel, but I've never been there."; mes "Of course, I've only heard of Rachel, and I've never been there.";
mes "The 'collaborators' there don't seem to know that their heads have moved yet."; mes "The 'collaborators' at that location seem unaware of their leaders' movements as of yet.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Although we don't know where your master's Collection#3 is yet, we'll have to keep an eye out for information coming in here..."; mes "Although we still don't know the whereabouts of Master's Collection No. 3, we need to continue to gather information coming in from here...";
mes "what if?"; mes "What should we do?";
next; next;
select( "What?" ); select( "What?" );
mes "[" + strcharinfo(0) + "]"; mes "[" + strcharinfo(0) + "]";
mes "What are you doing?"; mes "What should I do?";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "The collaborator's position has been roughly secured. Reportedly 'waiting for your next instruction',"; mes "The location of the collaborator has been roughly secured. According to the report, they are awaiting further instructions, so...";
mes "Then, before the next instruction is issued, we should catch up on that side as soon as possible..."; mes "In that case, we should thoroughly investigate that area before the next instructions are given...";
cloakoffnpcself( "Rookie#ep181_rk01" ); cloakoffnpcself( "Rookie#ep181_rk01" );
cloakoffnpcself( "EST#ep181_est01" ); cloakoffnpcself( "Est#ep181_est01" );
npctalk "Rookie: Did you call?", "Rookie#ep181_rk01", bc_self; npctalk "Rookie: Did you call me?", "Rookie#ep181_rk01", bc_self;
npctalk "EST: It ended sooner than I thought.", "EST#ep181_est01", bc_self; npctalk "Est: That was quicker than I thought.", "Est#ep181_est01", bc_self;
next; next;
cutin "ep162_est01.bmp",1; cutin "ep162_est01.bmp",1;
mes "[EST]"; mes "[Est]";
mes "Okay then Rachel..."; mes "Okay, so Rachel...";
next; next;
cutin "16loo_01.bmp",0; cutin "16loo_01.bmp",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Rachel... who's going?"; mes "Rachel... Who's going?";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "Is this a conflict of opinion?"; mes "Are we having a difference of opinion?";
next; next;
cutin "16loo_03.bmp",0; cutin "16loo_03.bmp",0;
mes "[Rookie]"; mes "[Rookie]";
mes "It's not like that..."; mes "Not really...";
mes "I think it will be a bit difficult if we all go."; mes "I think it would be a little awkward if we all went.";
next; next;
cutin "ep162_est01.bmp",1; cutin "ep162_est01.bmp",1;
mes "[EST]"; mes "[Est]";
mes "Ah... I see."; mes "Ah, I see.";
mes "Yes. If 'Rebellion' moves, it could become a diplomatic matter."; mes "Yes. If the Rebellion moves, it could become a diplomatic issue.";
next; next;
cutin "16loo_03.bmp",0; cutin "16loo_03.bmp",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Yes. Especially if it's Rachel."; mes "Yes, even more so if it's Rachel.";
mes "The problem between the mansion and the business has not yet been fully resolved..."; mes "...and the problems between the mansion and the company haven't all been solved yet.";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "Okay."; mes "I see.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Then..."; mes "If so, then...";
next; next;
select( "Why are you looking at me?" ); select( "Why are they looking at me?" );
cutin "",255; cutin "",255;
mes "[" + strcharinfo(0) + "]"; mes "[" + strcharinfo(0) + "]";
mes "what are you doing?"; mes "What do I do?";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "Let's go, Rachel."; mes "Let's go, Rachel.";
npctalk "Rookie: name.", "Rookie#ep181_rk01", bc_self; npctalk "Rookie: So it's a place name, huh?", "Rookie#ep181_rk01", bc_self;
npctalk "Est: Name.", "EST#ep181_est01", bc_self; npctalk "Est: A place name.", "Est#ep181_est01", bc_self;
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Are other guests affiliated?"; mes "But the other guests have affiliations, don't they?";
mes "It is difficult when disputes arise because of jurisdiction."; mes "It will be difficult if there is a conflict due to jurisdiction.";
mes "You never know how long it will take, so it's not suitable for a companion."; mes "You don't know how long it will take, so it's not a good idea to accompany them.";
next; next;
cutin "ep162_est01.bmp",1; cutin "ep162_est01.bmp",1;
mes "[EST]"; mes "[Est]";
mes "It sounds like you want to go there yourself."; mes "That sounds like you're saying you're definitely going to go in person.";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "Yes."; mes "Yes, it is.";
mes "Please wait a minute."; mes "Please wait a moment.";
next; next;
progressbar_npc "00CCFF",7; progressbar_npc "CCFF",7;
mes "[Ellie]"; mes "[Elly]";
mes "..."; mes "...";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "You have permission."; mes "You're authorized.";
npctalk "Meeting ended.", "", bc_self; npctalk "The meeting has ended.", "Smart Elly#ep18ely01", bc_self;
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "The purpose is support, not hindrance."; mes "The purpose is not to hinder but to support.";
mes "I will follow you without burden."; mes "We'll follow along, no pressure.";
mes "I'll give you this."; mes "I will give this to you.";
next; next;
cutin "",255; cutin "",255;
mes "What Ellie gave her was a doll with a slightly droopy feel that resembled Ellie."; mes "What Elly gave was a doll that looked exactly like Elly and felt a little stretched out.";
mes "It may not necessarily be Ellie."; mes "It may not be Elly, but...";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "We have equipment that can transmit and receive data over long distances."; mes "We also have equipment capable of long-distance data transmission and reception.";
mes "Because we are such beings."; mes "Because that's who we are.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "But things are a little different now, so I'll give you a simple beta."; mes "But things are a little different now, so I'll give you a beta version.";
npctalk "Be sure to take it with you", "", bc_self; npctalk "Don't forget to take it with you.", "Smart Elly#ep18ely01", bc_self;
next; next;
cutin "16loo_02.bmp",0; cutin "16loo_02.bmp",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Uh... Mini Ellie?"; mes "Uh... Mini Elly?";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "Okay. I'll take that name."; mes "Great, I'm adopting that name.";
mes "Using the resources of the main body, it is possible to collect visual and auditory information and communicate like a clone."; mes "I can collect information like vision and hearing and communicate like an avatar using my own resources.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "There is no individual core, so the information obtained is not shared between betas unless I update it,"; mes "There are no individual cores, so the information I get is not shared between betas unless I update it,";
mes "If communication is lost, it's just a doll."; mes "If communication is lost, it's just a puppet.";
next; next;
cutin "16loo_01.bmp",0; cutin "16loo_01.bmp",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Then call us if you need assistance."; mes "Then call us if you need our support.";
mes "Like Ellie, we will provide generous support except for the manpower."; mes "I will support you without reservation, just like Elly, except for manpower.";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "It will be so"; mes "Yes, I will do that.";
mes "Please take care of yourself."; mes "Please take care of yourself.";
npctalk "I'm going with you, but it's strange to greet you like this.", "", bc_self; npctalk "It's strange to be greeting each other like this when we're going together.", "Smart Elly#ep18ely01", bc_self;
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "The almost exact coordinates from which the signal was sent..."; mes "The nearly exact coordinates of the signal's origin are...";
mes "About <NAVI>[here]<INFO>rachel,182,176,0,101,0</INFO></NAVI>"; mes "around <NAVI>[here]<INFO>rachel,182,176,0,101,0</INFO></NAVI> or so.";
ep18_1_main = 1; ep18_main = 1;
setquest 8681; setquest 8681;
getitem 400127,1; // Ep18_Mini_Elly getitem 400127,1; // Ep18_Mini_Elly
close3; close3;
} }
if (ep18_1_main == 1) { if (ep18_main == 1) {
mes "[Ellie]"; mes "[Elly]";
mes "Please be safe."; mes "Safe travels to Rachel.";
close; close;
} }
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "No intermittent signal has been received yet."; mes "No intermittent signal has been received yet.";
mes "The whereabouts of the master's collection 3 are also being tracked at the same time."; mes "The whereabouts of the master's collection 3 are also being tracked at the same time.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Don't worry."; mes "Don't worry.";
mes "Time is on our side."; mes "Time is on our side.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Me and Alpha will analyze the information properly, so I'd like you to clean up the intruders remnant."; mes "Me and Alpha will analyze the information properly, so I'd like you to clean up the intruders remnant.";
close3; close3;
@ -4339,7 +4340,7 @@ OnInit:
// questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(18018) == 1" ); // questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(18018) == 1" );
// check for episode 17.2 completion // check for episode 17.2 completion
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(8681) == 0 && isbegin_quest(18018) == 2 && BaseLevel >= 170" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(8681) == 0 && isbegin_quest(18018) == 2 && BaseLevel >= 170" );
end; end;
} }
@ -9389,8 +9390,8 @@ ba_in01,32,250,3 script Sweety#ep172_swty 4_EP17_SWEETY,{
mes "[Almond]"; mes "[Almond]";
mes "Not possible."; mes "Not possible.";
mes "You won't be able to receieve it even if it came."; mes "You won't be able to receieve it even if it came.";
mes "Ellie took your receiving chip while we're repairing you."; mes "Elly took your receiving chip while we're repairing you.";
mes "Doesn't that mean Ellie will take the orders for you?"; mes "Doesn't that mean Elly will take the orders for you?";
npctalk "No! I'll receive my next orders soon!", "", bc_self; npctalk "No! I'll receive my next orders soon!", "", bc_self;
next; next;
mes "[Almond]"; mes "[Almond]";

13096
npc/re/quests/quests_18.txt Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1225,9 +1225,9 @@ OnInit:
rockrdg1,160,306,3 duplicate(dummy_cloaked_npc) Johnny James#revt04 4_M_JOHNNYJAMES rockrdg1,160,306,3 duplicate(dummy_cloaked_npc) Johnny James#revt04 4_M_JOHNNYJAMES
rockrdg1,168,306,3 duplicate(dummy_cloaked_npc) Albert Ford#revt08 4_M_ALBERTFORD rockrdg1,168,306,3 duplicate(dummy_cloaked_npc) Albert Ford#revt08 4_M_ALBERTFORD
rockrdg1,156,302,7 duplicate(dummy_cloaked_npc) Ivoka Skudi#revt02 4_M_EVOKASCUDI rockrdg1,156,302,7 duplicate(dummy_cloaked_npc) Ivoka Skudi#revt02 4_M_EVOKASCUDI
rockrdg1,156,306,5 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt01 4_M_EVOKASCUDI rockrdg1,156,306,5 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt05 4_M_EVOKASCUDI
rockrdg1,161,302,1 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt02 4_M_EVOKASCUDI rockrdg1,161,302,1 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt06 4_M_EVOKASCUDI
rockrdg1,164,306,3 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt03 4_M_EVOKASCUDI rockrdg1,164,306,3 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt07 4_M_EVOKASCUDI
rockrdg1,156,312,3 script Unmoving Freight Train# 4_ENERGY_RED,{ rockrdg1,156,312,3 script Unmoving Freight Train# 4_ENERGY_RED,{
if (rock_main_quest == 5) { if (rock_main_quest == 5) {

View File

@ -247,7 +247,7 @@ npc: npc/re/quests/quests_16_2.txt
npc: npc/re/quests/quests_illusion_dungeons.txt npc: npc/re/quests/quests_illusion_dungeons.txt
npc: npc/re/quests/quests_17_1.txt npc: npc/re/quests/quests_17_1.txt
npc: npc/re/quests/quests_17_2.txt npc: npc/re/quests/quests_17_2.txt
npc: npc/re/quests/quests_18_1.txt npc: npc/re/quests/quests_18.txt
npc: npc/re/quests/quests_19.txt npc: npc/re/quests/quests_19.txt
npc: npc/re/quests/quests_aldebaran.txt npc: npc/re/quests/quests_aldebaran.txt
npc: npc/re/quests/quests_dewata.txt npc: npc/re/quests/quests_dewata.txt

View File

@ -22,3 +22,4 @@ npc: npc/re/mapflag/town.txt
npc: npc/re/mapflag/reset.txt npc: npc/re/mapflag/reset.txt
npc: npc/re/mapflag/skill_duration.txt npc: npc/re/mapflag/skill_duration.txt
npc: npc/re/mapflag/nodynamicnpc.txt npc: npc/re/mapflag/nodynamicnpc.txt
npc: npc/re/mapflag/specialpopup.txt

View File

@ -0,0 +1 @@
UPDATE `char_reg_num` SET `key` = 'ep18_main' WHERE `key` = 'ep18_1_main';

View File

@ -1675,7 +1675,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
damage += damage * bonus / 100; damage += damage * bonus / 100;
} }
if (tsc->getSCE(SC_HOLY_OIL) && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) if (tsc->getSCE(SC_HOLY_OIL) && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON))
damage += damage * 50 / 100;// Need official adjustment. [Rytech] damage += damage * (3 * tsc->getSCE(SC_HOLY_OIL)->val1) / 100;
if( tsc->getSCE( SC_RUSH_QUAKE1 ) && ( flag&BF_WEAPON ) == BF_WEAPON ){ if( tsc->getSCE( SC_RUSH_QUAKE1 ) && ( flag&BF_WEAPON ) == BF_WEAPON ){
damage += damage * 50 / 100; damage += damage * 50 / 100;
@ -11529,6 +11529,13 @@ static const struct _battle_data {
#endif #endif
{ "synchronize_damage", &battle_config.synchronize_damage, 0, 0, 1, }, { "synchronize_damage", &battle_config.synchronize_damage, 0, 0, 1, },
{ "item_stacking", &battle_config.item_stacking, 1, 0, 1, }, { "item_stacking", &battle_config.item_stacking, 1, 0, 1, },
#ifdef RENEWAL
{ "hom_delay_reset_vaporize", &battle_config.hom_delay_reset_vaporize, 0, 0, 1, },
{ "hom_delay_reset_warp", &battle_config.hom_delay_reset_warp, 0, 0, 1, },
#else
{ "hom_delay_reset_vaporize", &battle_config.hom_delay_reset_vaporize, 1, 0, 1, },
{ "hom_delay_reset_warp", &battle_config.hom_delay_reset_warp, 1, 0, 1, },
#endif
#include <custom/battle_config_init.inc> #include <custom/battle_config_init.inc>
}; };

View File

@ -762,6 +762,8 @@ struct Battle_Config
int instance_allow_reconnect; int instance_allow_reconnect;
int synchronize_damage; int synchronize_damage;
int item_stacking; int item_stacking;
int hom_delay_reset_vaporize;
int hom_delay_reset_warp;
#include <custom/battle_config_struct.inc> #include <custom/battle_config_struct.inc>
}; };

View File

@ -3670,16 +3670,16 @@ void clif_updatestatus( map_session_data& sd, enum _sp type ){
break; break;
#else #else
case SP_BASEEXP: case SP_BASEEXP:
clif_par_change(sd, type, client_exp(sd.status.base_exp)); clif_longpar_change(sd, type, client_exp(sd.status.base_exp));
break; break;
case SP_JOBEXP: case SP_JOBEXP:
clif_par_change(sd, type, client_exp(sd.status.job_exp)); clif_longpar_change(sd, type, client_exp(sd.status.job_exp));
break; break;
case SP_NEXTBASEEXP: case SP_NEXTBASEEXP:
clif_par_change(sd, type, client_exp(pc_nextbaseexp(&sd))); clif_longpar_change(sd, type, client_exp(pc_nextbaseexp(&sd)));
break; break;
case SP_NEXTJOBEXP: case SP_NEXTJOBEXP:
clif_par_change(sd, type, client_exp(pc_nextjobexp(&sd))); clif_longpar_change(sd, type, client_exp(pc_nextjobexp(&sd)));
break; break;
#endif #endif
@ -10804,8 +10804,7 @@ void clif_parse_LoadEndAck(int fd,map_session_data *sd)
clif_hominfo(sd,sd->hd,1); clif_hominfo(sd,sd->hd,1);
clif_hominfo(sd,sd->hd,0); //for some reason, at least older clients want this sent twice clif_hominfo(sd,sd->hd,0); //for some reason, at least older clients want this sent twice
clif_homskillinfoblock( *sd->hd ); clif_homskillinfoblock( *sd->hd );
if( battle_config.hom_setting&HOMSET_COPY_SPEED ) status_calc_bl(&sd->hd->bl, { SCB_SPEED });
status_calc_bl(&sd->hd->bl, { SCB_SPEED }); //Homunc mimic their master's speed on each map change
if( !(battle_config.hom_setting&HOMSET_NO_INSTANT_LAND_SKILL) ) if( !(battle_config.hom_setting&HOMSET_NO_INSTANT_LAND_SKILL) )
skill_unit_move(&sd->hd->bl,gettick(),1); // apply land skills immediately skill_unit_move(&sd->hd->bl,gettick(),1); // apply land skills immediately
} }
@ -10824,9 +10823,9 @@ void clif_parse_LoadEndAck(int fd,map_session_data *sd)
return; return;
clif_spawn(&sd->ed->bl); clif_spawn(&sd->ed->bl);
clif_elemental_info(sd); clif_elemental_info(sd);
clif_elemental_updatestatus(sd,SP_HP); clif_elemental_updatestatus(*sd, SP_HP);
clif_hpmeter_single( *sd, sd->ed->bl.id, sd->ed->battle_status.hp, sd->ed->battle_status.max_hp ); clif_hpmeter_single( *sd, sd->ed->bl.id, sd->ed->battle_status.hp, sd->ed->battle_status.max_hp );
clif_elemental_updatestatus(sd,SP_SP); clif_elemental_updatestatus(*sd, SP_SP);
status_calc_bl(&sd->ed->bl, { SCB_SPEED }); //Elemental mimic their master's speed on each map change status_calc_bl(&sd->ed->bl, { SCB_SPEED }); //Elemental mimic their master's speed on each map change
} }
@ -18788,34 +18787,36 @@ void clif_parse_ItemListWindowSelected(int fd, map_session_data* sd) {
/*========================================== /*==========================================
* Elemental System * Elemental System
*==========================================*/ *==========================================*/
void clif_elemental_updatestatus(map_session_data *sd, int type) {
s_elemental_data *ed;
struct status_data *status;
int fd;
if( !clif_session_isValid(sd) || (ed = sd->ed) == nullptr ) /// Notifies client of a change in an elemental's status parameter.
/// 0x81e <type>.W <value>.L (ZC_EL_PAR_CHANGE)
void clif_elemental_updatestatus(map_session_data& sd, _sp type) {
#if PACKETVER >= 20100309
if (sd.ed == nullptr)
return; return;
fd = sd->fd; PACKET_ZC_EL_PAR_CHANGE p = {};
status = &ed->battle_status;
WFIFOHEAD(fd,8); p.packetType = HEADER_ZC_EL_PAR_CHANGE;
WFIFOW(fd,0) = 0x81e; p.type = static_cast<decltype(p.type)>(type);
WFIFOW(fd,2) = type; status_data* status = &sd.ed->battle_status;
switch( type ) { switch( type ) {
case SP_HP: case SP_HP:
WFIFOL(fd,4) = status->hp; p.value = static_cast<decltype(p.value)>(status->hp);
break; break;
case SP_MAXHP: case SP_MAXHP:
WFIFOL(fd,4) = status->max_hp; p.value = static_cast<decltype(p.value)>(status->max_hp);
break; break;
case SP_SP: case SP_SP:
WFIFOL(fd,4) = status->sp; p.value = static_cast<decltype(p.value)>(status->sp);
break; break;
case SP_MAXSP: case SP_MAXSP:
WFIFOL(fd,4) = status->max_sp; p.value = static_cast<decltype(p.value)>(status->max_sp);
break; break;
} }
WFIFOSET(fd,8);
clif_send( &p, sizeof( p ), &sd.bl, SELF );
#endif
} }
void clif_elemental_info(map_session_data *sd) { void clif_elemental_info(map_session_data *sd) {
@ -19714,6 +19715,12 @@ static void clif_loadConfirm( map_session_data *sd ){
/// 0447 /// 0447
void clif_parse_blocking_playcancel( int fd, map_session_data *sd ){ void clif_parse_blocking_playcancel( int fd, map_session_data *sd ){
clif_loadConfirm( sd ); clif_loadConfirm( sd );
int32 mf = map_getmapflag(sd->bl.m, MF_SPECIALPOPUP);
if (mf > 0) {
clif_specialpopup(*sd, mf);
}
} }
/// req world info (CZ_CLIENT_VERSION) /// req world info (CZ_CLIENT_VERSION)
@ -25120,6 +25127,20 @@ void clif_set_npc_window_pos_percent(map_session_data& sd, int x, int y)
#endif // PACKETVER_MAIN_NUM >= 20220504 #endif // PACKETVER_MAIN_NUM >= 20220504
} }
/// Displays a special popup.
/// Works only if player moved from one map to another.
/// 0bbe <popup id>.L (ZC_SPECIALPOPUP)
void clif_specialpopup(map_session_data& sd, int32 id ){
#if PACKETVER >= 20221005
PACKET_ZC_SPECIALPOPUP p = {};
p.PacketType = HEADER_ZC_SPECIALPOPUP;
p.ppId = id;
clif_send( &p, sizeof( p ), &sd.bl, SELF);
#endif
}
/*========================================== /*==========================================
* Main client packet processing function * Main client packet processing function
*------------------------------------------*/ *------------------------------------------*/

View File

@ -1299,7 +1299,7 @@ void clif_autoshadowspell_list( map_session_data& sd );
int clif_skill_itemlistwindow( map_session_data *sd, uint16 skill_id, uint16 skill_lv ); int clif_skill_itemlistwindow( map_session_data *sd, uint16 skill_id, uint16 skill_lv );
void clif_elemental_info(map_session_data *sd); void clif_elemental_info(map_session_data *sd);
void clif_elemental_updatestatus(map_session_data *sd, int type); void clif_elemental_updatestatus(map_session_data& sd, _sp type);
void clif_spiritcharm( map_session_data& sd ); void clif_spiritcharm( map_session_data& sd );
@ -1456,4 +1456,6 @@ void clif_set_npc_window_pos_percent(map_session_data& sd, int x, int y);
void clif_noask_sub( map_session_data& sd, map_session_data& tsd, int type ); void clif_noask_sub( map_session_data& sd, map_session_data& tsd, int type );
void clif_specialpopup(map_session_data& sd, int32 id);
#endif /* CLIF_HPP */ #endif /* CLIF_HPP */

View File

@ -1544,7 +1544,6 @@
//packet(0x081B,4); //packet(0x081B,4);
//packet(0x081C,6); //packet(0x081C,6);
packet(0x081d,22); packet(0x081d,22);
packet(0x081e,8);
#endif #endif
// 2010-03-23aRagexeRE // 2010-03-23aRagexeRE

View File

@ -282,9 +282,9 @@ int elemental_data_received(s_elemental *ele, bool flag) {
return 0; return 0;
clif_spawn(&ed->bl); clif_spawn(&ed->bl);
clif_elemental_info(sd); clif_elemental_info(sd);
clif_elemental_updatestatus(sd,SP_HP); clif_elemental_updatestatus(*sd, SP_HP);
clif_hpmeter_single( *sd, ed->bl.id, ed->battle_status.hp, ed->battle_status.max_hp ); clif_hpmeter_single( *sd, ed->bl.id, ed->battle_status.hp, ed->battle_status.max_hp );
clif_elemental_updatestatus(sd,SP_SP); clif_elemental_updatestatus(*sd, SP_SP);
} }
return 1; return 1;
@ -441,9 +441,9 @@ void elemental_heal(s_elemental_data *ed, int hp, int sp) {
if (ed->master == nullptr) if (ed->master == nullptr)
return; return;
if( hp ) if( hp )
clif_elemental_updatestatus(ed->master, SP_HP); clif_elemental_updatestatus(*ed->master, SP_HP);
if( sp ) if( sp )
clif_elemental_updatestatus(ed->master, SP_SP); clif_elemental_updatestatus(*ed->master, SP_SP);
} }
int elemental_dead(s_elemental_data *ed) { int elemental_dead(s_elemental_data *ed) {
@ -595,8 +595,8 @@ static int elemental_ai_sub_timer(s_elemental_data *ed, map_session_data *sd, t_
if( master_dist > AREA_SIZE ) { // Master out of vision range. if( master_dist > AREA_SIZE ) { // Master out of vision range.
elemental_unlocktarget(ed); elemental_unlocktarget(ed);
unit_warp(&ed->bl,sd->bl.m,sd->bl.x,sd->bl.y,CLR_TELEPORT); unit_warp(&ed->bl,sd->bl.m,sd->bl.x,sd->bl.y,CLR_TELEPORT);
clif_elemental_updatestatus(sd,SP_HP); clif_elemental_updatestatus(*sd, SP_HP);
clif_elemental_updatestatus(sd,SP_SP); clif_elemental_updatestatus(*sd, SP_SP);
return 0; return 0;
} else if( master_dist > MAX_ELEDISTANCE ) { // Master too far, chase. } else if( master_dist > MAX_ELEDISTANCE ) { // Master too far, chase.
short x = sd->bl.x, y = sd->bl.y; short x = sd->bl.x, y = sd->bl.y;

View File

@ -289,10 +289,11 @@ int hom_vaporize(map_session_data *sd, int flag)
//Delete timers when vaporized. //Delete timers when vaporized.
hom_hungry_timer_delete(hd); hom_hungry_timer_delete(hd);
hd->homunculus.vaporize = flag ? flag : HOM_ST_REST; hd->homunculus.vaporize = flag ? flag : HOM_ST_REST;
if (battle_config.hom_setting&HOMSET_RESET_REUSESKILL_VAPORIZED) { if (battle_config.hom_delay_reset_vaporize) {
hd->blockskill.clear(); hd->blockskill.clear();
hd->blockskill.shrink_to_fit(); hd->blockskill.shrink_to_fit();
} }
status_change_clear(&hd->bl, 1);
clif_hominfo(sd, sd->hd, 0); clif_hominfo(sd, sd->hd, 0);
hom_save(hd); hom_save(hd);
@ -1138,8 +1139,7 @@ bool hom_call(map_session_data *sd)
clif_hominfo(sd,hd,1); clif_hominfo(sd,hd,1);
clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89] clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89]
clif_homskillinfoblock( *hd ); clif_homskillinfoblock( *hd );
if (battle_config.hom_setting&HOMSET_COPY_SPEED) status_calc_bl(&hd->bl, { SCB_SPEED });
status_calc_bl(&hd->bl, { SCB_SPEED });
hom_save(hd); hom_save(hd);
} else } else
//Warp him to master. //Warp him to master.

View File

@ -168,8 +168,6 @@ enum homun_setting : uint8 {
HOMSET_COPY_SPEED = 0x08, /// Copy their master's speed on spawn/map-change HOMSET_COPY_SPEED = 0x08, /// Copy their master's speed on spawn/map-change
HOMSET_DISPLAY_LUK = 0x10, /// They display luk/3+1 instead of their actual critical in the stat window, by default they don't crit HOMSET_DISPLAY_LUK = 0x10, /// They display luk/3+1 instead of their actual critical in the stat window, by default they don't crit
HOMSET_SAME_MATK = 0x20, /// Their Min-Matk is always the same as their max HOMSET_SAME_MATK = 0x20, /// Their Min-Matk is always the same as their max
HOMSET_RESET_REUSESKILL_VAPORIZED = 0x40, /// Skill re-use delay is reset when they are vaporized.
HOMSET_RESET_REUSESKILL_TELEPORTED = 0x80, /// Skill re-use delay is reset when they are warped (by skill or item) with player.
}; };
enum e_homun_grade : uint8 { enum e_homun_grade : uint8 {

View File

@ -4785,6 +4785,14 @@ bool map_setmapflag_sub(int16 m, enum e_mapflag mapflag, bool status, union u_ma
mapdata->setMapFlag(MF_NOBASEEXP, false); mapdata->setMapFlag(MF_NOBASEEXP, false);
ShowWarning("map_setmapflag: Unable to set No Base EXP and BEXP flags for the same map! Removing No Base EXP flag from %s.\n", mapdata->name); ShowWarning("map_setmapflag: Unable to set No Base EXP and BEXP flags for the same map! Removing No Base EXP flag from %s.\n", mapdata->name);
} }
mapdata->setMapFlag(mapflag, args->flag_val);
} else
mapdata->setMapFlag(mapflag, false);
break;
case MF_SPECIALPOPUP:
if (status) {
nullpo_retr(false, args);
mapdata->setMapFlag(mapflag, args->flag_val); mapdata->setMapFlag(mapflag, args->flag_val);
} else } else
mapdata->setMapFlag(mapflag, false); mapdata->setMapFlag(mapflag, false);

View File

@ -676,6 +676,7 @@ enum e_mapflag : int16 {
MF_NOBUYINGSTORE, MF_NOBUYINGSTORE,
MF_NODYNAMICNPC, MF_NODYNAMICNPC,
MF_NOBANK, MF_NOBANK,
MF_SPECIALPOPUP,
MF_NOLOOTNORMALMOB, MF_NOLOOTNORMALMOB,
MF_NO_NPC_SELFDESTRUCTION_ON_ALL, MF_NO_NPC_SELFDESTRUCTION_ON_ALL,
MF_MAX MF_MAX

View File

@ -5507,6 +5507,16 @@ static const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, con
map_setmapflag_sub(m, mapflag, state, &args); map_setmapflag_sub(m, mapflag, state, &args);
} }
break; break;
case MF_SPECIALPOPUP: {
union u_mapflag_args args = {};
if (sscanf(w4, "%11d", &args.flag_val) < 1)
args.flag_val = 0;
map_setmapflag_sub(m, mapflag, state, &args);
}
break;
case MF_SKILL_DAMAGE: { case MF_SKILL_DAMAGE: {
char skill_name[SKILL_NAME_LENGTH]; char skill_name[SKILL_NAME_LENGTH];

View File

@ -1154,6 +1154,13 @@ struct PACKET_CZ_PARTY_JOIN_REQ_ACK{
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(CZ_PARTY_JOIN_REQ_ACK, 0x2c7); DEFINE_PACKET_HEADER(CZ_PARTY_JOIN_REQ_ACK, 0x2c7);
struct PACKET_ZC_EL_PAR_CHANGE {
int16 packetType;
uint16 type;
uint32 value;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_EL_PAR_CHANGE, 0x81e);
// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 ) #if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
#pragma pack( pop ) #pragma pack( pop )

View File

@ -7008,6 +7008,16 @@ enum e_setpos pc_setpos(map_session_data* sd, unsigned short mapindex, int x, in
if( hom_is_active(sd->hd) ) if( hom_is_active(sd->hd) )
{ {
if (sd->state.changemap)
status_db.removeByStatusFlag(&sd->hd->bl, { SCF_REMOVEFROMHOMONMAPWARP });
else
status_db.removeByStatusFlag(&sd->hd->bl, { SCF_REMOVEFROMHOMONWARP });
if (battle_config.hom_delay_reset_warp) {
sd->hd->blockskill.clear();
sd->hd->blockskill.shrink_to_fit();
}
sd->hd->bl.m = m; sd->hd->bl.m = m;
sd->hd->bl.x = sd->hd->ud.to_x = x; sd->hd->bl.x = sd->hd->ud.to_x = x;
sd->hd->bl.y = sd->hd->ud.to_y = y; sd->hd->bl.y = sd->hd->ud.to_y = y;

View File

@ -15337,18 +15337,16 @@ BUILDIN_FUNC(petskillsupport)
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
static inline void script_skill_effect(block_list *bl, uint16 skill_id, uint16 skill_lv, int16 x, int16 y) { static inline void script_skill_effect( block_list& bl, uint16 skill_id, uint16 skill_lv, int16 x, int16 y ) {
nullpo_retv(bl);
switch (skill_get_casttype(skill_id)) { switch (skill_get_casttype(skill_id)) {
case CAST_GROUND: case CAST_GROUND:
clif_skill_poseffect(bl, skill_id, skill_lv, x, y, gettick()); clif_skill_poseffect(&bl, skill_id, skill_lv, x, y, gettick());
break; break;
case CAST_NODAMAGE: case CAST_NODAMAGE:
clif_skill_nodamage(bl, bl, skill_id, skill_lv, 1); clif_skill_nodamage(&bl, &bl, skill_id, skill_lv, 1);
break; break;
case CAST_DAMAGE: case CAST_DAMAGE:
clif_skill_damage(bl, bl, gettick(), status_get_amotion(bl), status_get_dmotion(bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id)); clif_skill_damage(&bl, &bl, gettick(), status_get_amotion(&bl), status_get_dmotion(&bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id));
break; break;
} }
} }
@ -15356,32 +15354,46 @@ static inline void script_skill_effect(block_list *bl, uint16 skill_id, uint16 s
/*========================================== /*==========================================
* Scripted skill effects [Celest] * Scripted skill effects [Celest]
*------------------------------------------*/ *------------------------------------------*/
/// skilleffect <skill id>,<level> /// skilleffect <skill id>,<level>{,<game id>}
/// skilleffect "<skill name>",<level> /// skilleffect "<skill name>",<level>{,<game id>}
BUILDIN_FUNC(skilleffect) BUILDIN_FUNC(skilleffect)
{ {
TBL_PC *sd; block_list* bl;
uint16 skill_id, skill_lv; map_session_data* sd;
if( !script_rid2sd(sd) ) if (script_hasdata(st, 4)) {
return SCRIPT_CMD_FAILURE; if (!script_rid2bl(4, bl))
return SCRIPT_CMD_SUCCESS;
skill_id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); }
skill_lv = script_getnum(st,3); else {
// target is the character attached (default)
if (!script_rid2sd(sd))
return SCRIPT_CMD_SUCCESS;
bl = &sd->bl;
}
uint16 skill_id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st, 2)) : script_getnum(st, 2) );
if (skill_db.find(skill_id) == nullptr) { if (skill_db.find(skill_id) == nullptr) {
ShowError("buildin_skilleffect: Invalid skill defined (%s)!\n", script_getstr(st, 2)); ShowError("buildin_skilleffect: Invalid skill defined (%s)!\n", script_getstr(st, 2));
return SCRIPT_CMD_FAILURE; return SCRIPT_CMD_FAILURE;
} }
/* Ensure we're standing because the following packet causes the client to virtually set the char to stand, uint16 skill_lv = script_getnum(st, 3);
* which leaves the server thinking it still is sitting. */
if( pc_issit(sd) && pc_setstand(sd, false) ) { if (bl->type == BL_PC) {
skill_sit(sd, 0); /* Ensure we're standing because the following packet causes the client to virtually set the char to stand,
clif_standing(&sd->bl); * which leaves the server thinking it still is sitting. */
sd = reinterpret_cast<map_session_data*>( bl );
if (pc_issit(sd) && pc_setstand(sd, false)) {
skill_sit(sd, 0);
clif_standing(&sd->bl);
}
} }
script_skill_effect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y); script_skill_effect( *bl, skill_id, skill_lv, bl->x, bl->y );
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
@ -15413,7 +15425,7 @@ BUILDIN_FUNC(npcskilleffect)
return SCRIPT_CMD_FAILURE; return SCRIPT_CMD_FAILURE;
} }
script_skill_effect(bl, skill_id, skill_lv, bl->x, bl->y); script_skill_effect( *bl, skill_id, skill_lv, bl->x, bl->y );
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
@ -15849,7 +15861,7 @@ BUILDIN_FUNC(addhomintimacy)
homun_data *hd; homun_data *hd;
if (!script_charid2sd(3, sd) || !(hd = sd->hd)) if (!script_charid2sd(3, sd) || !(hd = sd->hd))
return SCRIPT_CMD_FAILURE; return SCRIPT_CMD_SUCCESS;
int32 value = script_getnum(st, 2); int32 value = script_getnum(st, 2);
@ -27234,6 +27246,22 @@ BUILDIN_FUNC(opentips){
#endif #endif
} }
/**
* Displays a special popup.
* specialpopup(<popup id>);
*/
BUILDIN_FUNC(specialpopup) {
map_session_data* sd;
if( !script_rid2sd(sd) )
return SCRIPT_CMD_FAILURE;
int32 id = script_getnum(st,2);
clif_specialpopup(*sd, id);
return SCRIPT_CMD_SUCCESS;
}
BUILDIN_FUNC(setdialogalign){ BUILDIN_FUNC(setdialogalign){
map_session_data *sd; map_session_data *sd;
@ -27732,7 +27760,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(petskillattack,"viii"), // [Skotlex] BUILDIN_DEF(petskillattack,"viii"), // [Skotlex]
BUILDIN_DEF(petskillattack2,"viiii"), // [Valaris] BUILDIN_DEF(petskillattack2,"viiii"), // [Valaris]
BUILDIN_DEF(petskillsupport,"viiii"), // [Skotlex] BUILDIN_DEF(petskillsupport,"viiii"), // [Skotlex]
BUILDIN_DEF(skilleffect,"vi"), // skill effect [Celest] BUILDIN_DEF(skilleffect,"vi?"), // skill effect [Celest]
BUILDIN_DEF(npcskilleffect,"viii"), // npc skill effect [Valaris] BUILDIN_DEF(npcskilleffect,"viii"), // npc skill effect [Valaris]
BUILDIN_DEF(specialeffect,"i??"), // npc skill effect [Valaris] BUILDIN_DEF(specialeffect,"i??"), // npc skill effect [Valaris]
BUILDIN_DEF(specialeffect2,"i??"), // skill effect on players[Valaris] BUILDIN_DEF(specialeffect2,"i??"), // skill effect on players[Valaris]
@ -28164,6 +28192,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(has_autoloot,"?"), BUILDIN_DEF(has_autoloot,"?"),
BUILDIN_DEF(autoloot,"??"), BUILDIN_DEF(autoloot,"??"),
BUILDIN_DEF(opentips, "i?"), BUILDIN_DEF(opentips, "i?"),
BUILDIN_DEF(specialpopup,"i"),
BUILDIN_DEF(setdialogalign, "i"), BUILDIN_DEF(setdialogalign, "i"),
BUILDIN_DEF(setdialogsize, "ii"), BUILDIN_DEF(setdialogsize, "ii"),

View File

@ -538,6 +538,7 @@
export_constant(MF_NOBUYINGSTORE); export_constant(MF_NOBUYINGSTORE);
export_constant(MF_NODYNAMICNPC); export_constant(MF_NODYNAMICNPC);
export_constant(MF_NOBANK); export_constant(MF_NOBANK);
export_constant(MF_SPECIALPOPUP);
export_constant(MF_NOLOOTNORMALMOB); export_constant(MF_NOLOOTNORMALMOB);
export_constant(MF_NO_NPC_SELFDESTRUCTION_ON_ALL); export_constant(MF_NO_NPC_SELFDESTRUCTION_ON_ALL);
@ -11300,6 +11301,8 @@
export_constant(SCF_REMOVEONUNEQUIPARMOR); export_constant(SCF_REMOVEONUNEQUIPARMOR);
export_constant(SCF_REMOVEONHERMODE); export_constant(SCF_REMOVEONHERMODE);
export_constant(SCF_REQUIRENOWEAPON); export_constant(SCF_REQUIRENOWEAPON);
export_constant(SCF_REMOVEFROMHOMONWARP);
export_constant(SCF_REMOVEFROMHOMONMAPWARP);
/* enchantgrades */ /* enchantgrades */
export_constant(ENCHANTGRADE_NONE); export_constant(ENCHANTGRADE_NONE);

View File

@ -1014,8 +1014,10 @@ bool skill_isNotOk_hom(struct homun_data *hd, uint16 skill_id, uint16 skill_lv)
if (sc && !sc->count) if (sc && !sc->count)
sc = nullptr; sc = nullptr;
if (util::vector_exists(hd->blockskill, skill_id)) if (util::vector_exists(hd->blockskill, skill_id)) {
clif_skill_fail(*sd, skill_id, USESKILL_FAIL_SKILLINTERVAL);
return true; return true;
}
switch(skill_id) { switch(skill_id) {
case HFLI_SBR44: case HFLI_SBR44:
@ -1120,9 +1122,16 @@ bool skill_isNotOk_hom(struct homun_data *hd, uint16 skill_id, uint16 skill_lv)
* @return true: Skill cannot be used, false: otherwise * @return true: Skill cannot be used, false: otherwise
*/ */
bool skill_isNotOk_mercenary( uint16 skill_id, s_mercenary_data& md ){ bool skill_isNotOk_mercenary( uint16 skill_id, s_mercenary_data& md ){
if (util::vector_exists(md.blockskill, skill_id)) map_session_data* sd = md.master;
if (sd == nullptr)
return true; return true;
if (util::vector_exists(md.blockskill, skill_id)) {
clif_skill_fail(*sd, skill_id, USESKILL_FAIL_SKILLINTERVAL);
return true;
}
if( md.master != nullptr ){ if( md.master != nullptr ){
return skill_isNotOk( skill_id, *md.master ); return skill_isNotOk( skill_id, *md.master );
}else{ }else{
@ -3580,7 +3589,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
dmg = battle_calc_attack(attack_type,src,bl,skill_id,skill_lv,flag&0xFFF); dmg = battle_calc_attack(attack_type,src,bl,skill_id,skill_lv,flag&0xFFF);
//If the damage source is a unit, the damage is not delayed //If the damage source is a unit, the damage is not delayed
if (src != dsrc && skill_id != GS_GROUNDDRIFT) if (src != dsrc)
dmg.amotion = 0; dmg.amotion = 0;
//! CHECKME: This check maybe breaks the battle_calc_attack, and maybe need better calculation. //! CHECKME: This check maybe breaks the battle_calc_attack, and maybe need better calculation.
@ -7313,12 +7322,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
//Check for undead skills that convert a no-damage skill into a damage one. [Skotlex] //Check for undead skills that convert a no-damage skill into a damage one. [Skotlex]
switch (skill_id) { switch (skill_id) {
case HLIF_HEAL: //[orn]
if (bl->type != BL_HOM) {
if (sd) clif_skill_fail( *sd, skill_id );
break ;
}
[[fallthrough]];
case AL_HEAL: case AL_HEAL:
case ALL_RESURRECTION: case ALL_RESURRECTION:
case PR_ASPERSIO: case PR_ASPERSIO:
@ -7342,8 +7345,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
ret = skill_castend_pos2(src,src->x,src->y,skill_id,skill_lv,tick,flag); //cast on homon ret = skill_castend_pos2(src,src->x,src->y,skill_id,skill_lv,tick,flag); //cast on homon
if(s_src && !skill_check_unit_range(s_src, s_src->x, s_src->y, skill_id, skill_lv)) if(s_src && !skill_check_unit_range(s_src, s_src->x, s_src->y, skill_id, skill_lv))
ret |= skill_castend_pos2(s_src,s_src->x,s_src->y,skill_id,skill_lv,tick,flag); //cast on master ret |= skill_castend_pos2(s_src,s_src->x,s_src->y,skill_id,skill_lv,tick,flag); //cast on master
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
return ret; return ret;
} }
break; break;
@ -9330,10 +9331,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break; break;
} }
if (sd->hd && battle_config.hom_setting&HOMSET_RESET_REUSESKILL_TELEPORTED) {
sd->hd->blockskill.clear();
sd->hd->blockskill.shrink_to_fit();
}
if( sd->state.autocast || ( (sd->skillitem == AL_TELEPORT || battle_config.skip_teleport_lv1_menu) && skill_lv == 1 ) || skill_lv == 3 ) if( sd->state.autocast || ( (sd->skillitem == AL_TELEPORT || battle_config.skip_teleport_lv1_menu) && skill_lv == 1 ) || skill_lv == 3 )
{ {
@ -10675,11 +10672,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break; break;
case HAMI_CASTLE: //[orn] case HAMI_CASTLE: //[orn]
if (src != bl && rnd()%100 < 20 * skill_lv) { if (src != bl && rnd_chance(20 * skill_lv, 100)) {
int x = src->x, y = src->y; int x = src->x, y = src->y;
if (hd)
skill_blockhomun_start(hd,skill_id,skill_get_time2(skill_id,skill_lv));
// Move source // Move source
if (unit_movepos(src,bl->x,bl->y,0,0)) { if (unit_movepos(src,bl->x,bl->y,0,0)) {
clif_skill_nodamage(src,src,skill_id,skill_lv,1); // Homunc clif_skill_nodamage(src,src,skill_id,skill_lv,1); // Homunc
@ -10717,17 +10712,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
status_heal(bl, i, 0, 0); status_heal(bl, i, 0, 0);
} }
break; break;
//Homun single-target support skills [orn] // Homun single-target support skills [orn]
case HLIF_CHANGE:
#ifndef RENEWAL
status_percent_heal(bl, 100, 100);
[[fallthrough]];
#endif
case HAMI_BLOODLUST: case HAMI_BLOODLUST:
case HFLI_FLEET: case HFLI_FLEET:
case HFLI_SPEED: case HFLI_SPEED:
case HLIF_CHANGE:
case MH_ANGRIFFS_MODUS: case MH_ANGRIFFS_MODUS:
case MH_GOLDENE_FERSE: case MH_GOLDENE_FERSE:
clif_skill_nodamage(src,bl,skill_id,skill_lv, clif_skill_nodamage(src,bl,skill_id,skill_lv,
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_time2(skill_id,skill_lv));
break; break;
case NPC_DRAGONFEAR: case NPC_DRAGONFEAR:
@ -11708,15 +11705,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
if( !status_isdead(bl) ) if( !status_isdead(bl) )
break; break;
status_zap(bl, 0, tstatus->sp * 10 * skill_lv / 100); tstatus->hp = max(tstatus->sp, 1);
tstatus->sp -= tstatus->sp * ( 60 - 10 * skill_lv ) / 100;
int heal = tstatus->sp;
if( heal <= 0 )
heal = 1;
tstatus->hp = heal;
clif_skill_nodamage(src,bl,skill_id,skill_lv,1); clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
pc_revive((TBL_PC*)bl,heal,0); pc_revive(reinterpret_cast<map_session_data*>(bl),true,true);
clif_resurrection( *bl ); clif_resurrection( *bl );
} }
break; break;
@ -12356,15 +12348,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
for (i = 0; i < ARRAYLENGTH(scs); i++) for (i = 0; i < ARRAYLENGTH(scs); i++)
if (tsc->getSCE(scs[i])) status_change_end(bl, scs[i]); if (tsc->getSCE(scs[i])) status_change_end(bl, scs[i]);
} }
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
} }
break; break;
case MH_OVERED_BOOST: case MH_OVERED_BOOST:
if (hd && battle_get_master(src)) { if (hd && battle_get_master(src)) {
sc_start(src, battle_get_master(src), type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src, battle_get_master(src), type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
} }
break; break;
case MH_GRANITIC_ARMOR: case MH_GRANITIC_ARMOR:
@ -12373,7 +12362,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
struct block_list *s_bl = battle_get_master(src); struct block_list *s_bl = battle_get_master(src);
if(s_bl) sc_start2(src, s_bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); //start on master if(s_bl) sc_start2(src, s_bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); //start on master
sc_start2(src, bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); sc_start2(src, bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv));
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
} }
break; break;
case MH_LIGHT_OF_REGENE: //self case MH_LIGHT_OF_REGENE: //self
@ -12381,7 +12369,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
struct block_list *s_bl = battle_get_master(src); struct block_list *s_bl = battle_get_master(src);
if(s_bl) sc_start(src, s_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); if(s_bl) sc_start(src, s_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
sc_start2(src, src, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); sc_start2(src, src, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv));
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
} }
break; break;
case MH_STYLE_CHANGE: case MH_STYLE_CHANGE:
@ -12407,21 +12394,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
clif_skill_nodamage(src,master_bl,skill_id,skill_lv,1); clif_skill_nodamage(src,master_bl,skill_id,skill_lv,1);
sc_start(src, master_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src, master_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
} }
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
} break; } break;
case MH_PAIN_KILLER: case MH_PAIN_KILLER:
bl = battle_get_master(src); bl = battle_get_master(src);
if (bl != nullptr) if (bl != nullptr)
sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
break; break;
case MH_MAGMA_FLOW: case MH_MAGMA_FLOW:
sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
break; break;
case MH_SUMMON_LEGION: { case MH_SUMMON_LEGION: {
int summons[5] = {MOBID_S_HORNET, MOBID_S_GIANT_HORNET, MOBID_S_GIANT_HORNET, MOBID_S_LUCIOLA_VESPA, MOBID_S_LUCIOLA_VESPA}; int summons[5] = {MOBID_S_HORNET, MOBID_S_GIANT_HORNET, MOBID_S_GIANT_HORNET, MOBID_S_LUCIOLA_VESPA, MOBID_S_LUCIOLA_VESPA};
@ -12448,8 +12428,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
sc_start4(&sum_md->bl,&sum_md->bl, SC_MODECHANGE, 100, 1, 0, MD_CANATTACK|MD_AGGRESSIVE, 0, 60000); sc_start4(&sum_md->bl,&sum_md->bl, SC_MODECHANGE, 100, 1, 0, MD_CANATTACK|MD_AGGRESSIVE, 0, 60000);
} }
} }
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
} }
break; break;
@ -13402,10 +13380,25 @@ TIMER_FUNC(skill_castend_id){
if (!sd || sd->skillitem != ud->skill_id || skill_get_delay(ud->skill_id, ud->skill_lv)) if (!sd || sd->skillitem != ud->skill_id || skill_get_delay(ud->skill_id, ud->skill_lv))
ud->canact_tick = i64max(tick + skill_delayfix(src, ud->skill_id, ud->skill_lv), ud->canact_tick - SECURITY_CASTTIME); ud->canact_tick = i64max(tick + skill_delayfix(src, ud->skill_id, ud->skill_lv), ud->canact_tick - SECURITY_CASTTIME);
if (sd) { //Cooldown application
int cooldown = pc_get_skillcooldown(sd,ud->skill_id, ud->skill_lv); // Increases/Decreases cooldown of a skill by item/card bonuses. // Cooldown application
if(cooldown) skill_blockpc_start(sd, ud->skill_id, cooldown); switch (src->type) {
case BL_PC:{
// Increases/Decreases cooldown of a skill by item/card bonuses.
int cooldown = pc_get_skillcooldown(sd, ud->skill_id, ud->skill_lv);
if (cooldown > 0)
skill_blockpc_start(sd, ud->skill_id, cooldown);
} break;
case BL_HOM:{
homun_data& hd = reinterpret_cast<homun_data&>(*src);
#ifdef RENEWAL
skill_blockhomun_start(&hd, ud->skill_id, skill_get_cooldown(ud->skill_id, ud->skill_lv));
#else
skill_blockhomun_start(&hd, ud->skill_id, skill_get_delay(ud->skill_id, ud->skill_lv));
#endif
} break;
} }
if( battle_config.display_status_timers && sd ) if( battle_config.display_status_timers && sd )
clif_status_change(src, EFST_POSTDELAY, 1, skill_delayfix(src, ud->skill_id, ud->skill_lv), 0, 0, 0); clif_status_change(src, EFST_POSTDELAY, 1, skill_delayfix(src, ud->skill_id, ud->skill_lv), 0, 0, 0);
if( sd ) if( sd )
@ -23073,6 +23066,9 @@ int skill_blockhomun_start(struct homun_data *hd, uint16 skill_id, int tick) //[
hd->blockskill.push_back(skill_id); hd->blockskill.push_back(skill_id);
if (battle_config.display_status_timers)
clif_skill_cooldown(*hd->master, skill_id, tick);
return add_timer(gettick() + tick, skill_blockhomun_end, hd->bl.id, skill_id); return add_timer(gettick() + tick, skill_blockhomun_end, hd->bl.id, skill_id);
} }
@ -23105,6 +23101,9 @@ int skill_blockmerc_start(s_mercenary_data *md, uint16 skill_id, int tick)
md->blockskill.push_back(skill_id); md->blockskill.push_back(skill_id);
if (battle_config.display_status_timers)
clif_skill_cooldown(*md->master, skill_id, tick);
return add_timer(gettick() + tick, skill_blockmerc_end, md->bl.id, skill_id); return add_timer(gettick() + tick, skill_blockmerc_end, md->bl.id, skill_id);
} }
/** /**

View File

@ -5593,12 +5593,12 @@ void status_calc_state( struct block_list *bl, status_change *sc, std::bitset<SC
* @param bl: Object whose status has changed [PC|MOB|HOM|MER|ELEM] * @param bl: Object whose status has changed [PC|MOB|HOM|MER|ELEM]
* @param flag: Which status has changed on bl * @param flag: Which status has changed on bl
*/ */
void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag) void status_calc_bl_main(struct block_list& bl, std::bitset<SCB_MAX> flag)
{ {
const struct status_data *b_status = status_get_base_status(bl); // Base Status const struct status_data *b_status = status_get_base_status(&bl); // Base Status
struct status_data *status = status_get_status_data(bl); // Battle Status struct status_data *status = status_get_status_data(&bl); // Battle Status
status_change *sc = status_get_sc(bl); status_change *sc = status_get_sc(&bl);
TBL_PC *sd = BL_CAST(BL_PC,bl); TBL_PC *sd = BL_CAST(BL_PC,&bl);
int temp; int temp;
if (!b_status || !status) if (!b_status || !status)
@ -5609,7 +5609,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
* we need to update the speed on the client when the last status change ends. * we need to update the speed on the client when the last status change ends.
**/ **/
if(flag[SCB_SPEED]) { if(flag[SCB_SPEED]) {
struct unit_data *ud = unit_bl2ud(bl); struct unit_data *ud = unit_bl2ud(&bl);
/** [Skotlex] /** [Skotlex]
* Re-walk to adjust speed (we do not check if walktimer != INVALID_TIMER * Re-walk to adjust speed (we do not check if walktimer != INVALID_TIMER
* because if you step on something while walking, the moment this * because if you step on something while walking, the moment this
@ -5620,60 +5620,60 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
} }
if(flag[SCB_STR]) { if(flag[SCB_STR]) {
status->str = status_calc_str(bl, sc, b_status->str); status->str = status_calc_str(&bl, sc, b_status->str);
flag.set(SCB_BATK); flag.set(SCB_BATK);
if( bl->type&BL_HOM ) if( bl.type == BL_HOM )
flag.set(SCB_WATK); flag.set(SCB_WATK);
} }
if(flag[SCB_AGI]) { if(flag[SCB_AGI]) {
status->agi = status_calc_agi(bl, sc, b_status->agi); status->agi = status_calc_agi(&bl, sc, b_status->agi);
flag.set(SCB_FLEE); flag.set(SCB_FLEE);
#ifdef RENEWAL #ifdef RENEWAL
flag.set(SCB_DEF2); flag.set(SCB_DEF2);
#endif #endif
if( bl->type&(BL_PC|BL_HOM) ) { if( bl.type&(BL_PC|BL_HOM) ) {
flag.set(SCB_ASPD); flag.set(SCB_ASPD);
flag.set(SCB_DSPD); flag.set(SCB_DSPD);
} }
} }
if(flag[SCB_VIT]) { if(flag[SCB_VIT]) {
status->vit = status_calc_vit(bl, sc, b_status->vit); status->vit = status_calc_vit(&bl, sc, b_status->vit);
flag.set(SCB_DEF2); flag.set(SCB_DEF2);
flag.set(SCB_MDEF2); flag.set(SCB_MDEF2);
if( bl->type&(BL_PC|BL_HOM|BL_MER|BL_ELEM) ) if( bl.type&(BL_PC|BL_HOM|BL_MER|BL_ELEM) )
flag.set(SCB_MAXHP); flag.set(SCB_MAXHP);
if( bl->type&BL_HOM ) if( bl.type == BL_HOM )
flag.set(SCB_DEF); flag.set(SCB_DEF);
} }
if(flag[SCB_INT]) { if(flag[SCB_INT]) {
status->int_ = status_calc_int(bl, sc, b_status->int_); status->int_ = status_calc_int(&bl, sc, b_status->int_);
flag.set(SCB_MATK); flag.set(SCB_MATK);
flag.set(SCB_MDEF2); flag.set(SCB_MDEF2);
if( bl->type&(BL_PC|BL_HOM|BL_MER|BL_ELEM) ) if( bl.type&(BL_PC|BL_HOM|BL_MER|BL_ELEM) )
flag.set(SCB_MAXSP); flag.set(SCB_MAXSP);
if( bl->type&BL_HOM ) if( bl.type == BL_HOM )
flag.set(SCB_MDEF); flag.set(SCB_MDEF);
} }
if(flag[SCB_DEX]) { if(flag[SCB_DEX]) {
status->dex = status_calc_dex(bl, sc, b_status->dex); status->dex = status_calc_dex(&bl, sc, b_status->dex);
flag.set(SCB_BATK); flag.set(SCB_BATK);
flag.set(SCB_HIT); flag.set(SCB_HIT);
#ifdef RENEWAL #ifdef RENEWAL
flag.set(SCB_MATK); flag.set(SCB_MATK);
flag.set(SCB_MDEF2); flag.set(SCB_MDEF2);
#endif #endif
if( bl->type&(BL_PC|BL_HOM) ) if( bl.type&(BL_PC|BL_HOM) )
flag.set(SCB_ASPD); flag.set(SCB_ASPD);
if( bl->type&BL_HOM ) if( bl.type == BL_HOM )
flag.set(SCB_WATK); flag.set(SCB_WATK);
} }
if(flag[SCB_LUK]) { if(flag[SCB_LUK]) {
status->luk = status_calc_luk(bl, sc, b_status->luk); status->luk = status_calc_luk(&bl, sc, b_status->luk);
flag.set(SCB_BATK); flag.set(SCB_BATK);
flag.set(SCB_CRI); flag.set(SCB_CRI);
flag.set(SCB_FLEE2); flag.set(SCB_FLEE2);
@ -5686,29 +5686,29 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
#ifdef RENEWAL #ifdef RENEWAL
if (flag[SCB_POW]) { if (flag[SCB_POW]) {
status->pow = status_calc_pow(bl, sc, b_status->pow); status->pow = status_calc_pow(&bl, sc, b_status->pow);
flag.set(SCB_BATK); flag.set(SCB_BATK);
flag.set(SCB_PATK); flag.set(SCB_PATK);
} }
if (flag[SCB_STA]) { if (flag[SCB_STA]) {
status->sta = status_calc_sta(bl, sc, b_status->sta); status->sta = status_calc_sta(&bl, sc, b_status->sta);
flag.set(SCB_RES); flag.set(SCB_RES);
} }
if (flag[SCB_WIS]) { if (flag[SCB_WIS]) {
status->wis = status_calc_wis(bl, sc, b_status->wis); status->wis = status_calc_wis(&bl, sc, b_status->wis);
flag.set(SCB_MRES); flag.set(SCB_MRES);
} }
if (flag[SCB_SPL]) { if (flag[SCB_SPL]) {
status->spl = status_calc_spl(bl, sc, b_status->spl); status->spl = status_calc_spl(&bl, sc, b_status->spl);
flag.set(SCB_MATK); flag.set(SCB_MATK);
flag.set(SCB_SMATK); flag.set(SCB_SMATK);
} }
if (flag[SCB_CON]) { if (flag[SCB_CON]) {
status->con = status_calc_con(bl, sc, b_status->con); status->con = status_calc_con(&bl, sc, b_status->con);
flag.set(SCB_HIT); flag.set(SCB_HIT);
flag.set(SCB_FLEE); flag.set(SCB_FLEE);
flag.set(SCB_PATK); flag.set(SCB_PATK);
@ -5716,47 +5716,47 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
} }
if (flag[SCB_CRT]) { if (flag[SCB_CRT]) {
status->crt = status_calc_crt(bl, sc, b_status->crt); status->crt = status_calc_crt(&bl, sc, b_status->crt);
flag.set(SCB_HPLUS); flag.set(SCB_HPLUS);
flag.set(SCB_CRATE); flag.set(SCB_CRATE);
} }
#endif #endif
if(flag[SCB_BATK] && b_status->batk) { if(flag[SCB_BATK] && b_status->batk) {
int lv = status_get_lv(bl); int lv = status_get_lv(&bl);
status->batk = status_base_atk(bl, status, lv); status->batk = status_base_atk(&bl, status, lv);
temp = b_status->batk - status_base_atk(bl, b_status, lv); temp = b_status->batk - status_base_atk(&bl, b_status, lv);
if (temp) { if (temp) {
temp += status->batk; temp += status->batk;
status->batk = cap_value(temp, 0, USHRT_MAX); status->batk = cap_value(temp, 0, USHRT_MAX);
} }
status->batk = status_calc_batk(bl, sc, status->batk); status->batk = status_calc_batk(&bl, sc, status->batk);
} }
if(flag[SCB_WATK]) { if(flag[SCB_WATK]) {
#ifndef RENEWAL #ifndef RENEWAL
status->rhw.atk = status_calc_watk(bl, sc, b_status->rhw.atk); status->rhw.atk = status_calc_watk(&bl, sc, b_status->rhw.atk);
if (!sd) // Should not affect weapon refine bonus if (!sd) // Should not affect weapon refine bonus
status->rhw.atk2 = status_calc_watk(bl, sc, b_status->rhw.atk2); status->rhw.atk2 = status_calc_watk(&bl, sc, b_status->rhw.atk2);
if (sd && sd->bonus.weapon_atk_rate) if (sd && sd->bonus.weapon_atk_rate)
status->rhw.atk += status->rhw.atk * sd->bonus.weapon_atk_rate / 100; status->rhw.atk += status->rhw.atk * sd->bonus.weapon_atk_rate / 100;
if(b_status->lhw.atk) { if(b_status->lhw.atk) {
if (sd) { if (sd) {
sd->state.lr_flag = 1; sd->state.lr_flag = 1;
status->lhw.atk = status_calc_watk(bl, sc, b_status->lhw.atk); status->lhw.atk = status_calc_watk(&bl, sc, b_status->lhw.atk);
sd->state.lr_flag = 0; sd->state.lr_flag = 0;
} else { } else {
status->lhw.atk = status_calc_watk(bl, sc, b_status->lhw.atk); status->lhw.atk = status_calc_watk(&bl, sc, b_status->lhw.atk);
status->lhw.atk2= status_calc_watk(bl, sc, b_status->lhw.atk2); status->lhw.atk2= status_calc_watk(&bl, sc, b_status->lhw.atk2);
} }
} }
#else #else
if(!b_status->watk) { // We only have left-hand weapon if(!b_status->watk) { // We only have left-hand weapon
status->watk = 0; status->watk = 0;
status->watk2 = status_calc_watk(bl, sc, b_status->watk2); status->watk2 = status_calc_watk(&bl, sc, b_status->watk2);
} }
else status->watk = status_calc_watk(bl, sc, b_status->watk); else status->watk = status_calc_watk(&bl, sc, b_status->watk);
#endif #endif
} }
@ -5766,9 +5766,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
&& status->luk == b_status->luk && status->con == b_status->con && status->luk == b_status->luk && status->con == b_status->con
#endif #endif
) )
status->hit = status_calc_hit(bl, sc, b_status->hit); status->hit = status_calc_hit(&bl, sc, b_status->hit);
else else
status->hit = status_calc_hit(bl, sc, b_status->hit + (status->dex - b_status->dex) status->hit = status_calc_hit(&bl, sc, b_status->hit + (status->dex - b_status->dex)
#ifdef RENEWAL #ifdef RENEWAL
+ (status->luk/3 - b_status->luk/3) + 2 * (status->con - b_status->con) + (status->luk/3 - b_status->luk/3) + 2 * (status->con - b_status->con)
#endif #endif
@ -5781,9 +5781,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
&& status->luk == b_status->luk && status->con == b_status->con && status->luk == b_status->luk && status->con == b_status->con
#endif #endif
) )
status->flee = status_calc_flee(bl, sc, b_status->flee); status->flee = status_calc_flee(&bl, sc, b_status->flee);
else else
status->flee = status_calc_flee(bl, sc, b_status->flee +(status->agi - b_status->agi) status->flee = status_calc_flee(&bl, sc, b_status->flee +(status->agi - b_status->agi)
#ifdef RENEWAL #ifdef RENEWAL
+ (status->luk/5 - b_status->luk/5) + 2 * (status->con - b_status->con) + (status->luk/5 - b_status->luk/5) + 2 * (status->con - b_status->con)
#endif #endif
@ -5791,9 +5791,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
} }
if(flag[SCB_DEF]) { if(flag[SCB_DEF]) {
status->def = status_calc_def(bl, sc, b_status->def); status->def = status_calc_def(&bl, sc, b_status->def);
if( bl->type&BL_HOM ) if( bl.type == BL_HOM )
status->def += (status->vit/5 - b_status->vit/5); status->def += (status->vit/5 - b_status->vit/5);
} }
@ -5803,9 +5803,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
&& status->agi == b_status->agi && status->agi == b_status->agi
#endif #endif
) )
status->def2 = status_calc_def2(bl, sc, b_status->def2); status->def2 = status_calc_def2(&bl, sc, b_status->def2);
else else
status->def2 = status_calc_def2(bl, sc, b_status->def2 status->def2 = status_calc_def2(&bl, sc, b_status->def2
#ifdef RENEWAL #ifdef RENEWAL
+ (int)( ((float)status->vit/2 - (float)b_status->vit/2) + ((float)status->agi/5 - (float)b_status->agi/5) ) + (int)( ((float)status->vit/2 - (float)b_status->vit/2) + ((float)status->agi/5 - (float)b_status->agi/5) )
#else #else
@ -5815,9 +5815,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
} }
if(flag[SCB_MDEF]) { if(flag[SCB_MDEF]) {
status->mdef = status_calc_mdef(bl, sc, b_status->mdef); status->mdef = status_calc_mdef(&bl, sc, b_status->mdef);
if( bl->type&BL_HOM ) if( bl.type == BL_HOM )
status->mdef += (status->int_/5 - b_status->int_/5); status->mdef += (status->int_/5 - b_status->int_/5);
} }
@ -5827,9 +5827,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
&& status->dex == b_status->dex && status->dex == b_status->dex
#endif #endif
) )
status->mdef2 = status_calc_mdef2(bl, sc, b_status->mdef2); status->mdef2 = status_calc_mdef2(&bl, sc, b_status->mdef2);
else else
status->mdef2 = status_calc_mdef2(bl, sc, b_status->mdef2 +(status->int_ - b_status->int_) status->mdef2 = status_calc_mdef2(&bl, sc, b_status->mdef2 +(status->int_ - b_status->int_)
#ifdef RENEWAL #ifdef RENEWAL
+ (int)( ((float)status->dex/5 - (float)b_status->dex/5) + ((float)status->vit/5 - (float)b_status->vit/5) ) + (int)( ((float)status->dex/5 - (float)b_status->dex/5) + ((float)status->vit/5 - (float)b_status->vit/5) )
#else #else
@ -5839,29 +5839,67 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
} }
if(flag[SCB_SPEED]) { if(flag[SCB_SPEED]) {
status->speed = status_calc_speed(bl, sc, b_status->speed); status->speed = status_calc_speed(&bl, sc, b_status->speed);
if( bl->type&BL_PC && !(sd && sd->state.permanent_speed) && status->speed < battle_config.max_walk_speed ) switch (bl.type) {
status->speed = battle_config.max_walk_speed; case BL_PC:
if (!sd->state.permanent_speed && status->speed < battle_config.max_walk_speed)
status->speed = battle_config.max_walk_speed;
#ifdef RENEWAL
// Recalculate homunculus speed if the player receives a speed buff/debuff
if (hom_is_active(sd->hd)) {
if (battle_config.hom_setting & HOMSET_COPY_SPEED)
sd->hd->battle_status.speed = status_get_speed(&sd->bl);
if( bl->type&BL_PET && ((TBL_PET*)bl)->master) // Homunculus speed buff/debuffs applies over the current speed
status->speed = status_get_speed(&((TBL_PET*)bl)->master->bl); sd->hd->battle_status.speed = status_calc_speed(&sd->hd->bl, &sd->hd->sc, sd->hd->battle_status.speed);
if( bl->type&BL_HOM && battle_config.hom_setting&HOMSET_COPY_SPEED && ((TBL_HOM*)bl)->master) }
status->speed = status_get_speed(&((TBL_HOM*)bl)->master->bl); #endif
if( bl->type&BL_MER && ((TBL_MER*)bl)->master) break;
status->speed = status_get_speed(&((TBL_MER*)bl)->master->bl);
if( bl->type&BL_ELEM && ((TBL_ELEM*)bl)->master) case BL_PET:{
status->speed = status_get_speed(&((TBL_ELEM*)bl)->master->bl); pet_data* pd = reinterpret_cast<pet_data*>(&bl);
if (pd->master != nullptr)
status->speed = status_get_speed(&pd->master->bl);
} break;
case BL_HOM:{
homun_data* hd = reinterpret_cast<homun_data*>(&bl);
if (hd->master != nullptr) {
if (battle_config.hom_setting & HOMSET_COPY_SPEED)
status->speed = status_get_speed(&hd->master->bl);
// Homunculus speed buff/debuffs applies over the current speed
status->speed = status_calc_speed(&bl, &hd->sc, status->speed);
}
} break;
case BL_MER:{
s_mercenary_data* mc = reinterpret_cast<s_mercenary_data*>(&bl);
if (mc->master != nullptr)
status->speed = status_get_speed(&mc->master->bl);
} break;
case BL_ELEM:{
s_elemental_data* ed = reinterpret_cast<s_elemental_data*>(&bl);
if (ed->master != nullptr)
status->speed = status_get_speed(&ed->master->bl);
} break;
}
} }
if(flag[SCB_CRI] && b_status->cri) { if(flag[SCB_CRI] && b_status->cri) {
if (status->luk == b_status->luk) if (status->luk == b_status->luk)
status->cri = status_calc_critical(bl, sc, b_status->cri); status->cri = status_calc_critical(&bl, sc, b_status->cri);
else else
#ifdef RENEWAL #ifdef RENEWAL
status->cri = status_calc_critical(bl, sc, b_status->cri + 3*(status->luk - b_status->luk)); status->cri = status_calc_critical(&bl, sc, b_status->cri + 3*(status->luk - b_status->luk));
#else #else
status->cri = status_calc_critical(bl, sc, b_status->cri + (status->luk - b_status->luk)*10/3); status->cri = status_calc_critical(&bl, sc, b_status->cri + (status->luk - b_status->luk)*10/3);
#endif #endif
/// After status_calc_critical so the bonus is applied despite if you have or not a sc bugreport:5240 /// After status_calc_critical so the bonus is applied despite if you have or not a sc bugreport:5240
@ -5873,25 +5911,25 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
if(flag[SCB_FLEE2] && b_status->flee2) { if(flag[SCB_FLEE2] && b_status->flee2) {
if (status->luk == b_status->luk) if (status->luk == b_status->luk)
status->flee2 = status_calc_flee2(bl, sc, b_status->flee2); status->flee2 = status_calc_flee2(&bl, sc, b_status->flee2);
else else
status->flee2 = status_calc_flee2(bl, sc, b_status->flee2 +(status->luk - b_status->luk)); status->flee2 = status_calc_flee2(&bl, sc, b_status->flee2 +(status->luk - b_status->luk));
} }
if(flag[SCB_ATK_ELE]) { if(flag[SCB_ATK_ELE]) {
status->rhw.ele = status_calc_attack_element(bl, sc, b_status->rhw.ele); status->rhw.ele = status_calc_attack_element(&bl, sc, b_status->rhw.ele);
if (sd) sd->state.lr_flag = 1; if (sd) sd->state.lr_flag = 1;
status->lhw.ele = status_calc_attack_element(bl, sc, b_status->lhw.ele); status->lhw.ele = status_calc_attack_element(&bl, sc, b_status->lhw.ele);
if (sd) sd->state.lr_flag = 0; if (sd) sd->state.lr_flag = 0;
} }
if(flag[SCB_DEF_ELE]) { if(flag[SCB_DEF_ELE]) {
status->def_ele = status_calc_element(bl, sc, b_status->def_ele); status->def_ele = status_calc_element(&bl, sc, b_status->def_ele);
status->ele_lv = status_calc_element_lv(bl, sc, b_status->ele_lv); status->ele_lv = status_calc_element_lv(&bl, sc, b_status->ele_lv);
} }
if(flag[SCB_MODE]) { if(flag[SCB_MODE]) {
status->mode = status_calc_mode(bl, sc, b_status->mode); status->mode = status_calc_mode(&bl, sc, b_status->mode);
if (status_has_mode(status, MD_STATUSIMMUNE|MD_SKILLIMMUNE)) if (status_has_mode(status, MD_STATUSIMMUNE|MD_SKILLIMMUNE))
status->class_ = CLASS_BATTLEFIELD; status->class_ = CLASS_BATTLEFIELD;
@ -5904,9 +5942,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
// Since mode changed, reset their state. // Since mode changed, reset their state.
if (!status_has_mode(status,MD_CANATTACK)) if (!status_has_mode(status,MD_CANATTACK))
unit_stop_attack(bl); unit_stop_attack(&bl);
if (!status_has_mode(status,MD_CANMOVE)) if (!status_has_mode(status,MD_CANMOVE))
unit_stop_walking(bl,1); unit_stop_walking(&bl,1);
} }
/** /**
@ -5920,7 +5958,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
} }
if(flag[SCB_MAXHP]) { if(flag[SCB_MAXHP]) {
if( bl->type&BL_PC ) { if( bl.type == BL_PC ) {
status->max_hp = status_calc_maxhpsp_pc(sd,status->vit,true); status->max_hp = status_calc_maxhpsp_pc(sd,status->vit,true);
if(battle_config.hp_rate != 100) if(battle_config.hp_rate != 100)
@ -5934,7 +5972,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
status->max_hp = umin(status->max_hp,(unsigned int)battle_config.max_hp); status->max_hp = umin(status->max_hp,(unsigned int)battle_config.max_hp);
} }
else else
status->max_hp = status_calc_maxhp(bl, b_status->max_hp); status->max_hp = status_calc_maxhp(&bl, b_status->max_hp);
if( status->hp > status->max_hp ) { // !FIXME: Should perhaps a status_zap should be issued? if( status->hp > status->max_hp ) { // !FIXME: Should perhaps a status_zap should be issued?
status->hp = status->max_hp; status->hp = status->max_hp;
@ -5943,7 +5981,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
} }
if(flag[SCB_MAXSP]) { if(flag[SCB_MAXSP]) {
if( bl->type&BL_PC ) { if( bl.type == BL_PC ) {
status->max_sp = status_calc_maxhpsp_pc(sd,status->int_,false); status->max_sp = status_calc_maxhpsp_pc(sd,status->int_,false);
if(battle_config.sp_rate != 100) if(battle_config.sp_rate != 100)
@ -5952,7 +5990,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
status->max_sp = umin(status->max_sp,(unsigned int)battle_config.max_sp); status->max_sp = umin(status->max_sp,(unsigned int)battle_config.max_sp);
} }
else else
status->max_sp = status_calc_maxsp(bl, b_status->max_sp); status->max_sp = status_calc_maxsp(&bl, b_status->max_sp);
if( status->sp > status->max_sp ) { if( status->sp > status->max_sp ) {
status->sp = status->max_sp; status->sp = status->max_sp;
@ -5969,11 +6007,11 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
* RE MATK Formula (from irowiki:http:// irowiki.org/wiki/MATK) * RE MATK Formula (from irowiki:http:// irowiki.org/wiki/MATK)
* MATK = (sMATK + wMATK + eMATK) * Multiplicative Modifiers * MATK = (sMATK + wMATK + eMATK) * Multiplicative Modifiers
**/ **/
int lv = status_get_lv(bl); int lv = status_get_lv(&bl);
status->matk_min = status_base_matk_min(bl, status, lv); status->matk_min = status_base_matk_min(&bl, status, lv);
status->matk_max = status_base_matk_max(bl, status, lv); status->matk_max = status_base_matk_max(&bl, status, lv);
switch( bl->type ) { switch( bl.type ) {
case BL_PC: { case BL_PC: {
int wMatk = 0; int wMatk = 0;
int variance = 0; int variance = 0;
@ -5990,7 +6028,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
status->matk_min += 15 * skill_lv + (skill_lv > 4 ? 25 : 0); status->matk_min += 15 * skill_lv + (skill_lv > 4 ? 25 : 0);
} }
status->matk_min = status_calc_ematk(bl, sc, status->matk_min); status->matk_min = status_calc_ematk(&bl, sc, status->matk_min);
status->matk_max = status->matk_min; status->matk_max = status->matk_min;
// This is the only portion in MATK that varies depending on the weapon level and refinement rate. // This is the only portion in MATK that varies depending on the weapon level and refinement rate.
@ -6025,12 +6063,12 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
} }
#endif #endif
if (bl->type&BL_PC && sd->matk_rate != 100) { if (bl.type == BL_PC && sd->matk_rate != 100) {
status->matk_max = status->matk_max * sd->matk_rate/100; status->matk_max = status->matk_max * sd->matk_rate/100;
status->matk_min = status->matk_min * sd->matk_rate/100; status->matk_min = status->matk_min * sd->matk_rate/100;
} }
if ((bl->type&BL_HOM && battle_config.hom_setting&HOMSET_SAME_MATK) /// Hom Min Matk is always the same as Max Matk if ((bl.type == BL_HOM && battle_config.hom_setting&HOMSET_SAME_MATK) /// Hom Min Matk is always the same as Max Matk
|| (sc && sc->getSCE(SC_RECOGNIZEDSPELL))) || (sc && sc->getSCE(SC_RECOGNIZEDSPELL)))
status->matk_min = status->matk_max; status->matk_min = status->matk_max;
@ -6041,35 +6079,35 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
} }
#endif #endif
status->matk_max = status_calc_matk(bl, sc, status->matk_max); status->matk_max = status_calc_matk(&bl, sc, status->matk_max);
status->matk_min = status_calc_matk(bl, sc, status->matk_min); status->matk_min = status_calc_matk(&bl, sc, status->matk_min);
} }
if(flag[SCB_ASPD]) { if(flag[SCB_ASPD]) {
int amotion; int amotion;
if ( bl->type&BL_HOM ) { if ( bl.type == BL_HOM ) {
#ifdef RENEWAL_ASPD #ifdef RENEWAL_ASPD
amotion = ((TBL_HOM*)bl)->homunculusDB->baseASPD; amotion = (reinterpret_cast<homun_data*>(&bl))->homunculusDB->baseASPD;
amotion = amotion - amotion * status_get_homdex(bl) / 1000 - status_get_homagi(bl) * amotion / 250; amotion = amotion - amotion * status_get_homdex(&bl) / 1000 - status_get_homagi(&bl) * amotion / 250;
amotion = (amotion * status_calc_aspd(bl, sc, true) + status_calc_aspd(bl, sc, false)) / - 100 + amotion; amotion = (amotion * status_calc_aspd(&bl, sc, true) + status_calc_aspd(&bl, sc, false)) / - 100 + amotion;
#else #else
amotion = (1000 - 4 * status->agi - status->dex) * ((TBL_HOM*)bl)->homunculusDB->baseASPD / 1000; amotion = (1000 - 4 * status->agi - status->dex) * (reinterpret_cast<homun_data*>(&bl))->homunculusDB->baseASPD / 1000;
amotion = status_calc_aspd_rate(bl, sc, amotion); amotion = status_calc_aspd_rate(&bl, sc, amotion);
amotion = amotion * status->aspd_rate / 1000; amotion = amotion * status->aspd_rate / 1000;
#endif #endif
amotion = status_calc_fix_aspd(bl, sc, amotion); amotion = status_calc_fix_aspd(&bl, sc, amotion);
status->amotion = cap_value(amotion, battle_config.max_aspd, 2000); status->amotion = cap_value(amotion, battle_config.max_aspd, 2000);
status->adelay = status->amotion; status->adelay = status->amotion;
} else if ( bl->type&BL_PC ) { } else if ( bl.type == BL_PC ) {
uint16 skill_lv; uint16 skill_lv;
amotion = status_base_amotion_pc(sd,status); amotion = status_base_amotion_pc(sd,status);
#ifndef RENEWAL_ASPD #ifndef RENEWAL_ASPD
status->aspd_rate = status_calc_aspd_rate(bl, sc, b_status->aspd_rate); status->aspd_rate = status_calc_aspd_rate(&bl, sc, b_status->aspd_rate);
#endif #endif
// Absolute ASPD % modifiers // Absolute ASPD % modifiers
amotion = amotion * status->aspd_rate / 1000; amotion = amotion * status->aspd_rate / 1000;
@ -6082,21 +6120,21 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
#ifdef RENEWAL_ASPD #ifdef RENEWAL_ASPD
// RE ASPD % modifier // RE ASPD % modifier
amotion += (max(0xc3 - amotion, 2) * (status->aspd_rate2 + status_calc_aspd(bl, sc, false))) / 100; amotion += (max(0xc3 - amotion, 2) * (status->aspd_rate2 + status_calc_aspd(&bl, sc, false))) / 100;
amotion = 10 * (200 - amotion); amotion = 10 * (200 - amotion);
amotion += sd->bonus.aspd_add; amotion += sd->bonus.aspd_add;
#endif #endif
amotion = status_calc_fix_aspd(bl, sc, amotion); amotion = status_calc_fix_aspd(&bl, sc, amotion);
status->amotion = cap_value(amotion,pc_maxaspd(sd),2000); status->amotion = cap_value(amotion,pc_maxaspd(sd),2000);
status->adelay = 2 * status->amotion; status->adelay = 2 * status->amotion;
} else { // Mercenary and mobs } else { // Mercenary and mobs
amotion = b_status->amotion; amotion = b_status->amotion;
status->aspd_rate = status_calc_aspd_rate(bl, sc, b_status->aspd_rate); status->aspd_rate = status_calc_aspd_rate(&bl, sc, b_status->aspd_rate);
amotion = amotion*status->aspd_rate/1000; amotion = amotion*status->aspd_rate/1000;
amotion = status_calc_fix_aspd(bl, sc, amotion); amotion = status_calc_fix_aspd(&bl, sc, amotion);
status->amotion = cap_value(amotion, battle_config.monster_max_aspd, 2000); status->amotion = cap_value(amotion, battle_config.monster_max_aspd, 2000);
temp = b_status->adelay*status->aspd_rate/1000; temp = b_status->adelay*status->aspd_rate/1000;
@ -6106,71 +6144,71 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
if(flag[SCB_DSPD]) { if(flag[SCB_DSPD]) {
int dmotion; int dmotion;
if( bl->type&BL_PC ) { if( bl.type == BL_PC ) {
if (b_status->agi == status->agi) if (b_status->agi == status->agi)
status->dmotion = status_calc_dmotion(bl, sc, b_status->dmotion); status->dmotion = status_calc_dmotion(&bl, sc, b_status->dmotion);
else { else {
dmotion = 800-status->agi*4; dmotion = 800-status->agi*4;
status->dmotion = cap_value(dmotion, 400, 800); status->dmotion = cap_value(dmotion, 400, 800);
if(battle_config.pc_damage_delay_rate != 100) if(battle_config.pc_damage_delay_rate != 100)
status->dmotion = status->dmotion*battle_config.pc_damage_delay_rate/100; status->dmotion = status->dmotion*battle_config.pc_damage_delay_rate/100;
// It's safe to ignore b_status->dmotion since no bonus affects it. // It's safe to ignore b_status->dmotion since no bonus affects it.
status->dmotion = status_calc_dmotion(bl, sc, status->dmotion); status->dmotion = status_calc_dmotion(&bl, sc, status->dmotion);
} }
} else if( bl->type&BL_HOM ) { } else if( bl.type == BL_HOM ) {
dmotion = 800-status->agi*4; dmotion = 800-status->agi*4;
status->dmotion = cap_value(dmotion, 400, 800); status->dmotion = cap_value(dmotion, 400, 800);
status->dmotion = status_calc_dmotion(bl, sc, b_status->dmotion); status->dmotion = status_calc_dmotion(&bl, sc, b_status->dmotion);
} else { // Mercenary and mobs } else { // Mercenary and mobs
status->dmotion = status_calc_dmotion(bl, sc, b_status->dmotion); status->dmotion = status_calc_dmotion(&bl, sc, b_status->dmotion);
} }
} }
#ifdef RENEWAL #ifdef RENEWAL
if (flag[SCB_PATK]) { if (flag[SCB_PATK]) {
if (status->pow == b_status->pow && status->con == b_status->con) if (status->pow == b_status->pow && status->con == b_status->con)
status->patk = status_calc_patk(bl, sc, b_status->patk); status->patk = status_calc_patk(&bl, sc, b_status->patk);
else else
status->patk = status_calc_patk(bl, sc, b_status->patk + (status->pow - b_status->pow) / 3 + (status->con - b_status->con) / 5); status->patk = status_calc_patk(&bl, sc, b_status->patk + (status->pow - b_status->pow) / 3 + (status->con - b_status->con) / 5);
} }
if (flag[SCB_SMATK]) { if (flag[SCB_SMATK]) {
if (status->spl == b_status->spl && status->con == b_status->con) if (status->spl == b_status->spl && status->con == b_status->con)
status->smatk = status_calc_smatk(bl, sc, b_status->smatk); status->smatk = status_calc_smatk(&bl, sc, b_status->smatk);
else else
status->smatk = status_calc_smatk(bl, sc, b_status->smatk) + (status->spl - b_status->spl) / 3 + (status->con - b_status->con) / 5; status->smatk = status_calc_smatk(&bl, sc, b_status->smatk) + (status->spl - b_status->spl) / 3 + (status->con - b_status->con) / 5;
} }
if (flag[SCB_RES]) { if (flag[SCB_RES]) {
if (status->sta == b_status->sta) if (status->sta == b_status->sta)
status->res = status_calc_res(bl, sc, b_status->res); status->res = status_calc_res(&bl, sc, b_status->res);
else else
status->res = status_calc_res(bl, sc, b_status->res + (status->sta - b_status->sta) + (status->sta - b_status->sta) / 3 * 5); status->res = status_calc_res(&bl, sc, b_status->res + (status->sta - b_status->sta) + (status->sta - b_status->sta) / 3 * 5);
} }
if (flag[SCB_MRES]) { if (flag[SCB_MRES]) {
if (status->wis == b_status->wis) if (status->wis == b_status->wis)
status->mres = status_calc_mres(bl, sc, b_status->mres); status->mres = status_calc_mres(&bl, sc, b_status->mres);
else else
status->mres = status_calc_mres(bl, sc, b_status->mres + (status->wis - b_status->wis) + (status->wis - b_status->wis) / 3 * 5); status->mres = status_calc_mres(&bl, sc, b_status->mres + (status->wis - b_status->wis) + (status->wis - b_status->wis) / 3 * 5);
} }
if (flag[SCB_HPLUS]) { if (flag[SCB_HPLUS]) {
if (status->crt == b_status->crt) if (status->crt == b_status->crt)
status->hplus = status_calc_hplus(bl, sc, b_status->hplus); status->hplus = status_calc_hplus(&bl, sc, b_status->hplus);
else else
status->hplus = status_calc_hplus(bl, sc, b_status->hplus + (status->crt - b_status->crt)); status->hplus = status_calc_hplus(&bl, sc, b_status->hplus + (status->crt - b_status->crt));
} }
if (flag[SCB_CRATE]) { if (flag[SCB_CRATE]) {
if (status->crt == b_status->crt) if (status->crt == b_status->crt)
status->crate = status_calc_crate(bl, sc, b_status->crate); status->crate = status_calc_crate(&bl, sc, b_status->crate);
else else
status->crate = status_calc_crate(bl, sc, b_status->crate + (status->crt - b_status->crt) / 3); status->crate = status_calc_crate(&bl, sc, b_status->crate + (status->crt - b_status->crt) / 3);
} }
if (flag[SCB_MAXAP]) { if (flag[SCB_MAXAP]) {
if (bl->type&BL_PC) { if (bl.type == BL_PC) {
status->max_ap = status_calc_maxap_pc(sd); status->max_ap = status_calc_maxap_pc(sd);
if (battle_config.ap_rate != 100) if (battle_config.ap_rate != 100)
@ -6178,7 +6216,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
status->max_ap = umin(status->max_ap, (unsigned int)battle_config.max_ap); status->max_ap = umin(status->max_ap, (unsigned int)battle_config.max_ap);
} else } else
status->max_ap = status_calc_maxap(bl, b_status->max_ap); status->max_ap = status_calc_maxap(&bl, b_status->max_ap);
if (status->ap > status->max_ap) { if (status->ap > status->max_ap) {
status->ap = status->max_ap; status->ap = status->max_ap;
@ -6187,11 +6225,11 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
} }
#endif #endif
if((flag[SCB_VIT] || flag[SCB_MAXHP] || flag[SCB_INT] || flag[SCB_MAXSP]) && bl->type &BL_REGEN) if((flag[SCB_VIT] || flag[SCB_MAXHP] || flag[SCB_INT] || flag[SCB_MAXSP]) && bl.type & BL_REGEN)
status_calc_regen(bl, status, status_get_regen_data(bl)); status_calc_regen(&bl, status, status_get_regen_data(&bl));
if(flag[SCB_REGEN] && bl->type&BL_REGEN) if(flag[SCB_REGEN] && bl.type & BL_REGEN)
status_calc_regen_rate(bl, status_get_regen_data(bl), sc); status_calc_regen_rate(&bl, status_get_regen_data(&bl), sc);
} }
/** /**
@ -6242,7 +6280,7 @@ void status_calc_bl_(struct block_list* bl, std::bitset<SCB_MAX> flag, uint8 opt
if (opt&SCO_FIRST && bl->type == BL_MOB) if (opt&SCO_FIRST && bl->type == BL_MOB)
return; // Assume there will be no statuses active return; // Assume there will be no statuses active
status_calc_bl_main(bl, flag); status_calc_bl_main(*bl, flag);
if (opt&SCO_FIRST && bl->type == BL_HOM) if (opt&SCO_FIRST && bl->type == BL_HOM)
return; // Client update handled by caller return; // Client update handled by caller
@ -6410,13 +6448,13 @@ void status_calc_bl_(struct block_list* bl, std::bitset<SCB_MAX> flag, uint8 opt
return; return;
if( b_status.max_hp != status->max_hp ) if( b_status.max_hp != status->max_hp )
clif_elemental_updatestatus(ed->master, SP_MAXHP); clif_elemental_updatestatus(*ed->master, SP_MAXHP);
if( b_status.max_sp != status->max_sp ) if( b_status.max_sp != status->max_sp )
clif_elemental_updatestatus(ed->master, SP_MAXSP); clif_elemental_updatestatus(*ed->master, SP_MAXSP);
if( b_status.hp != status->hp ) if( b_status.hp != status->hp )
clif_elemental_updatestatus(ed->master, SP_HP); clif_elemental_updatestatus(*ed->master, SP_HP);
if( b_status.sp != status->sp ) if( b_status.sp != status->sp )
clif_mercenary_updatestatus(ed->master, SP_SP); clif_elemental_updatestatus(*ed->master, SP_SP);
} }
} }
@ -8069,7 +8107,7 @@ static unsigned short status_calc_speed(struct block_list *bl, status_change *sc
if( sc->getSCE(SC_RUN) ) if( sc->getSCE(SC_RUN) )
val = max( val, 55 ); val = max( val, 55 );
if( sc->getSCE(SC_AVOID) ) if( sc->getSCE(SC_AVOID) )
val = max( val, 10 * sc->getSCE(SC_AVOID)->val1 ); val = max( val, sc->getSCE(SC_AVOID)->val2 );
if (sc->getSCE(SC_INVINCIBLE)) if (sc->getSCE(SC_INVINCIBLE))
val = max(val, sc->getSCE(SC_INVINCIBLE)->val3); val = max(val, sc->getSCE(SC_INVINCIBLE)->val3);
if( sc->getSCE(SC_CLOAKINGEXCEED) ) if( sc->getSCE(SC_CLOAKINGEXCEED) )
@ -11447,7 +11485,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
// val4 signals autoprovoke. // val4 signals autoprovoke.
break; break;
case SC_AVOID: case SC_AVOID:
// val2 = 10*val1; // Speed change rate. // Speed change rate.
if (bl->type == BL_HOM)
val2 = 40 * val1;
else
val2 = 10 * val1;
break; break;
case SC_DEFENCE: case SC_DEFENCE:
#ifdef RENEWAL #ifdef RENEWAL

View File

@ -3058,6 +3058,8 @@ enum e_status_change_flag : uint16 {
SCF_REMOVEONUNEQUIPARMOR, SCF_REMOVEONUNEQUIPARMOR,
SCF_REMOVEONHERMODE, SCF_REMOVEONHERMODE,
SCF_REQUIRENOWEAPON, SCF_REQUIRENOWEAPON,
SCF_REMOVEFROMHOMONWARP,
SCF_REMOVEFROMHOMONMAPWARP,
SCF_MAX SCF_MAX
}; };