diff --git a/conf/battle/client.conf b/conf/battle/client.conf
index dee9760e4d..d49b645edb 100644
--- a/conf/battle/client.conf
+++ b/conf/battle/client.conf
@@ -38,7 +38,7 @@ hide_woe_damage: no
pet_hair_style: 100
// Visible area size (how many squares away from a player they can see)
-area_size: 14
+area_size: 15
// Maximum walk path (how many cells a player can walk going to cursor)
max_walk_path: 17
diff --git a/db/import-tmpl/size_fix.txt b/db/import-tmpl/size_fix.txt
deleted file mode 100644
index 2532744590..0000000000
--- a/db/import-tmpl/size_fix.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-// Size Fix Tables
-// Contains size fixes for weapon damage.
-//
-// Struture of Database:
-// Columns - Weapon type
-// Rows - Target size
-
diff --git a/db/import-tmpl/size_fix.yml b/db/import-tmpl/size_fix.yml
new file mode 100644
index 0000000000..f6c615e8e6
--- /dev/null
+++ b/db/import-tmpl/size_fix.yml
@@ -0,0 +1,33 @@
+# This file is a part of rAthena.
+# Copyright(C) 2019 rAthena Development Team
+# https://rathena.org - https://github.com/rathena
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+###########################################################################
+# Size Fix Database
+###########################################################################
+#
+# Size Fix Settings
+#
+###########################################################################
+# - Weapon Weapon type.
+# Small Small size modifier. (Default: 100)
+# Medium Medium size modifier. (Default: 100)
+# Large Large size modifier. (Default: 100)
+###########################################################################
+
+Header:
+ Type: SIZE_FIX_DB
+ Version: 1
diff --git a/db/pre-re/size_fix.yml b/db/pre-re/size_fix.yml
new file mode 100644
index 0000000000..51774f6936
--- /dev/null
+++ b/db/pre-re/size_fix.yml
@@ -0,0 +1,38 @@
+# This file is a part of rAthena.
+# Copyright(C) 2019 rAthena Development Team
+# https://rathena.org - https://github.com/rathena
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+###########################################################################
+# Size Fix Database
+###########################################################################
+#
+# Size Fix Settings
+#
+###########################################################################
+# - Weapon Weapon type.
+# Small Small size modifier. (Default: 100)
+# Medium Medium size modifier. (Default: 100)
+# Large Large size modifier. (Default: 100)
+###########################################################################
+
+Header:
+ Type: SIZE_FIX_DB
+ Version: 1
+
+Body:
+ - Weapon: Knuckle
+ Medium: 75
+ Large: 50
diff --git a/db/re/size_fix.yml b/db/re/size_fix.yml
new file mode 100644
index 0000000000..12f7822a7d
--- /dev/null
+++ b/db/re/size_fix.yml
@@ -0,0 +1,37 @@
+# This file is a part of rAthena.
+# Copyright(C) 2019 rAthena Development Team
+# https://rathena.org - https://github.com/rathena
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+###########################################################################
+# Size Fix Database
+###########################################################################
+#
+# Size Fix Settings
+#
+###########################################################################
+# - Weapon Weapon type.
+# Small Small size modifier. (Default: 100)
+# Medium Medium size modifier. (Default: 100)
+# Large Large size modifier. (Default: 100)
+###########################################################################
+
+Header:
+ Type: SIZE_FIX_DB
+ Version: 1
+
+Body:
+ - Weapon: Knuckle
+ Large: 75
diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml
index 25d4529f1a..1ae176c88d 100644
--- a/db/re/skill_db.yml
+++ b/db/re/skill_db.yml
@@ -283,7 +283,7 @@ Body:
Skill:
Plagiarism: true
Reproduce: true
- AfterCastActDelay: 2000
+ AfterCastActDelay: 500
Duration2: 10000
Cooldown: 2000
Requires:
@@ -577,27 +577,7 @@ Body:
Reproduce: true
CastCancel: true
CastTime: 400
- AfterCastActDelay:
- - Level: 1
- Time: 1200
- - Level: 2
- Time: 1200
- - Level: 3
- Time: 1600
- - Level: 4
- Time: 1600
- - Level: 5
- Time: 2000
- - Level: 6
- Time: 2000
- - Level: 7
- Time: 2400
- - Level: 8
- Time: 2400
- - Level: 9
- Time: 2800
- - Level: 10
- Time: 2500
+ AfterCastActDelay: 1400
FixedCastTime: 100
Requires:
SpCost:
@@ -678,28 +658,8 @@ Body:
- Level: 9
Time: 3200
- Level: 10
- Time: 3520
- AfterCastActDelay:
- - Level: 1
- Time: 1000
- - Level: 2
- Time: 1200
- - Level: 3
- Time: 1400
- - Level: 4
- Time: 1600
- - Level: 5
- Time: 1800
- - Level: 6
- Time: 2000
- - Level: 7
- Time: 2200
- - Level: 8
- Time: 2400
- - Level: 9
- Time: 2600
- - Level: 10
- Time: 2800
+ Time: 3200
+ AfterCastActDelay: 300
FixedCastTime:
- Level: 1
Time: 160
@@ -720,7 +680,7 @@ Body:
- Level: 9
Time: 800
- Level: 10
- Time: 880
+ Time: 1200
Requires:
SpCost:
- Level: 1
@@ -761,7 +721,7 @@ Body:
Reproduce: true
CastCancel: true
CastTime: 640
- AfterCastActDelay: 1500
+ AfterCastActDelay: 500
Duration2:
- Level: 1
Time: 5500
@@ -871,69 +831,9 @@ Body:
Plagiarism: true
Reproduce: true
CastCancel: true
- CastTime:
- - Level: 1
- Time: 1280
- - Level: 2
- Time: 1280
- - Level: 3
- Time: 1280
- - Level: 4
- Time: 1280
- - Level: 5
- Time: 1280
- - Level: 6
- Time: 800
- - Level: 7
- Time: 800
- - Level: 8
- Time: 800
- - Level: 9
- Time: 800
- - Level: 10
- Time: 800
- AfterCastActDelay:
- - Level: 1
- Time: 1500
- - Level: 2
- Time: 1500
- - Level: 3
- Time: 1500
- - Level: 4
- Time: 1500
- - Level: 5
- Time: 1500
- - Level: 6
- Time: 1000
- - Level: 7
- Time: 1000
- - Level: 8
- Time: 1000
- - Level: 9
- Time: 1000
- - Level: 10
- Time: 1000
- FixedCastTime:
- - Level: 1
- Time: 320
- - Level: 2
- Time: 320
- - Level: 3
- Time: 320
- - Level: 4
- Time: 320
- - Level: 5
- Time: 320
- - Level: 6
- Time: 200
- - Level: 7
- Time: 200
- - Level: 8
- Time: 200
- - Level: 9
- Time: 200
- - Level: 10
- Time: 200
+ CastTime: 800
+ AfterCastActDelay: 700
+ FixedCastTime: 200
Requires:
SpCost: 25
- Id: 18
@@ -1085,28 +985,8 @@ Body:
- Level: 9
Time: 3200
- Level: 10
- Time: 3520
- AfterCastActDelay:
- - Level: 1
- Time: 1000
- - Level: 2
- Time: 1200
- - Level: 3
- Time: 1400
- - Level: 4
- Time: 1600
- - Level: 5
- Time: 1800
- - Level: 6
- Time: 2000
- - Level: 7
- Time: 2200
- - Level: 8
- Time: 2400
- - Level: 9
- Time: 2600
- - Level: 10
- Time: 2800
+ Time: 3200
+ AfterCastActDelay: 300
FixedCastTime:
- Level: 1
Time: 160
@@ -1127,7 +1007,7 @@ Body:
- Level: 9
Time: 800
- Level: 10
- Time: 880
+ Time: 1200
Requires:
SpCost:
- Level: 1
@@ -1207,28 +1087,8 @@ Body:
- Level: 9
Time: 3200
- Level: 10
- Time: 3520
- AfterCastActDelay:
- - Level: 1
- Time: 1000
- - Level: 2
- Time: 1200
- - Level: 3
- Time: 1400
- - Level: 4
- Time: 1600
- - Level: 5
- Time: 1800
- - Level: 6
- Time: 2000
- - Level: 7
- Time: 2200
- - Level: 8
- Time: 2400
- - Level: 9
- Time: 2600
- - Level: 10
- Time: 2800
+ Time: 3200
+ AfterCastActDelay: 300
FixedCastTime:
- Level: 1
Time: 160
@@ -1249,7 +1109,7 @@ Body:
- Level: 9
Time: 800
- Level: 10
- Time: 880
+ Time: 1200
Requires:
SpCost:
- Level: 1
@@ -1329,7 +1189,7 @@ Body:
- Level: 9
Time: 5760
- Level: 10
- Time: 6400
+ Time: 4500
AfterCastActDelay: 2000
Duration1: 100
FixedCastTime:
@@ -1352,7 +1212,7 @@ Body:
- Level: 9
Time: 1440
- Level: 10
- Time: 1600
+ Time: 1500
Requires:
SpCost:
- Level: 1
@@ -2259,10 +2119,12 @@ Body:
SplashArea: 2
ActiveInstance: 5
Knockback: 2
- CastTime: 350
+ CastTime: 500
+ Duration1: 1000
+ Cooldown: 1000
FixedCastTime: 350
Requires:
- SpCost: 12
+ SpCost: 24
Weapon:
1hSpear: true
2hSpear: true
@@ -2429,15 +2291,18 @@ Body:
TargetTrap: true
Range: -2
Hit: Single
- HitCount: 1
+ HitCount: 2
Element: Weapon
- SplashArea: 1
+ SplashArea: 2
Knockback: 1
CopyFlags:
Skill:
Plagiarism: true
Reproduce: true
CastTime: 350
+ AfterCastActDelay: 300
+ Duration1: 1000
+ Cooldown: 1000
FixedCastTime: 350
Requires:
SpCost:
@@ -2481,15 +2346,28 @@ Body:
Description: Impositio Manus
MaxLevel: 5
Type: Magic
- TargetType: Support
+ TargetType: Self
DamageFlags:
NoDamage: true
- Range: 9
Hit: Single
HitCount: 1
+ SplashArea:
+ - Level: 1
+ Area: 3
+ - Level: 2
+ Area: 3
+ - Level: 3
+ Area: 7
+ - Level: 4
+ Area: 7
+ - Level: 5
+ Area: 15
CastCancel: true
- AfterCastActDelay: 3000
- Duration1: 60000
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ Duration1: 120000
+ Cooldown: 30000
+ FixedCastTime: 500
Requires:
SpCost:
- Level: 1
@@ -2510,20 +2388,19 @@ Body:
TargetType: Support
DamageFlags:
NoDamage: true
+ Splash: true
Flags:
NoTargetSelf: true
Range: 9
Hit: Single
HitCount: 1
+ SplashArea: -1
CastCancel: true
- AfterCastActDelay: 2000
- Duration1:
- - Level: 1
- Time: 30000
- - Level: 2
- Time: 20000
- - Level: 3
- Time: 10000
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ Duration1: 60000
+ Cooldown: 30000
+ FixedCastTime: 500
Requires:
SpCost: 8
- Id: 68
@@ -2952,30 +2829,31 @@ Body:
Plagiarism: true
Reproduce: true
CastCancel: true
- CastTime: 12000
- AfterCastActDelay: 4000
+ CastTime: 4000
+ AfterCastActDelay: 1000
Duration1:
- Level: 1
- Time: 5000
+ Time: 4000
- Level: 2
- Time: 6000
+ Time: 5000
- Level: 3
- Time: 7000
+ Time: 6000
- Level: 4
- Time: 8000
+ Time: 7000
- Level: 5
- Time: 9000
+ Time: 8000
- Level: 6
- Time: 10000
+ Time: 9000
- Level: 7
- Time: 11000
+ Time: 10000
- Level: 8
- Time: 12000
+ Time: 11000
- Level: 9
- Time: 13000
+ Time: 12000
- Level: 10
- Time: 14000
- FixedCastTime: 3000
+ Time: 13000
+ Cooldown: 6000
+ FixedCastTime: 1000
Requires:
SpCost:
- Level: 1
@@ -3211,25 +3089,25 @@ Body:
Hit: Multi_Hit
HitCount:
- Level: 1
- Count: 1
+ Count: 2
- Level: 2
- Count: 1
+ Count: 3
- Level: 3
- Count: 2
+ Count: 3
- Level: 4
- Count: 2
+ Count: 4
- Level: 5
- Count: 3
+ Count: 4
- Level: 6
- Count: 3
+ Count: 5
- Level: 7
- Count: 4
+ Count: 5
- Level: 8
- Count: 4
+ Count: 6
- Level: 9
- Count: 5
+ Count: 6
- Level: 10
- Count: 5
+ Count: 7
- Level: 11
Count: 15
Element: Fire
@@ -3261,28 +3139,28 @@ Body:
Plagiarism: true
Reproduce: true
CastCancel: true
- CastTime: 9600
- AfterCastActDelay:
+ CastTime:
- Level: 1
- Time: 2000
+ Time: 9600
- Level: 2
- Time: 3000
+ Time: 9600
- Level: 3
- Time: 3000
+ Time: 9600
- Level: 4
- Time: 4000
+ Time: 9600
- Level: 5
- Time: 4000
+ Time: 9600
- Level: 6
- Time: 5000
+ Time: 9600
- Level: 7
- Time: 5000
+ Time: 9600
- Level: 8
- Time: 6000
+ Time: 9600
- Level: 9
- Time: 6000
+ Time: 9600
- Level: 10
- Time: 7000
+ Time: 6300
+ AfterCastActDelay: 1000
Duration1:
- Level: 1
Time: 2000
@@ -3305,7 +3183,28 @@ Body:
- Level: 10
Time: 7000
Duration2: 5000
- FixedCastTime: 2400
+ Cooldown: 7000
+ FixedCastTime:
+ - Level: 1
+ Time: 2400
+ - Level: 2
+ Time: 2400
+ - Level: 3
+ Time: 2400
+ - Level: 4
+ Time: 2400
+ - Level: 5
+ Time: 2400
+ - Level: 6
+ Time: 2400
+ - Level: 7
+ Time: 2400
+ - Level: 8
+ Time: 2400
+ - Level: 9
+ Time: 2400
+ - Level: 10
+ Time: 1500
Requires:
SpCost:
- Level: 1
@@ -3413,7 +3312,7 @@ Body:
- Level: 9
Time: 4160
- Level: 10
- Time: 4480
+ Time: 3800
FixedCastTime:
- Level: 1
Time: 400
@@ -3434,7 +3333,7 @@ Body:
- Level: 9
Time: 1040
- Level: 10
- Time: 1120
+ Time: 500
Requires:
SpCost:
- Level: 1
@@ -3467,7 +3366,7 @@ Body:
IsAutoShadowSpell: true
Range: 9
Hit: Multi_Hit
- HitCount: -10
+ HitCount: -20
Element: Wind
CopyFlags:
Skill:
@@ -3494,10 +3393,11 @@ Body:
- Level: 9
Time: 7040
- Level: 10
- Time: 6720
- AfterCastActDelay: 5000
- Duration1: 4000
+ Time: 4500
+ AfterCastActDelay: 1000
+ Duration1: 1000
Duration2: 20000
+ Cooldown: 5000
FixedCastTime:
- Level: 1
Time: 2400
@@ -3518,7 +3418,7 @@ Body:
- Level: 9
Time: 1760
- Level: 10
- Time: 1680
+ Time: 1500
Requires:
SpCost:
- Level: 1
@@ -3545,25 +3445,25 @@ Body:
Id: Dummyskill
Layout:
- Level: 1
- Size: 5
+ Size: 6
- Level: 2
- Size: 5
+ Size: 6
- Level: 3
- Size: 5
+ Size: 6
- Level: 4
- Size: 5
+ Size: 6
- Level: 5
- Size: 5
+ Size: 6
- Level: 6
- Size: 5
+ Size: 6
- Level: 7
- Size: 5
+ Size: 6
- Level: 8
- Size: 5
+ Size: 6
- Level: 9
- Size: 5
+ Size: 6
- Level: 10
- Size: 5
+ Size: 6
- Level: 11
Size: 7
- Level: 12
@@ -3837,10 +3737,11 @@ Body:
- Level: 9
Time: 8960
- Level: 10
- Time: 9600
- AfterCastActDelay: 5000
- Duration1: 4600
+ Time: 6300
+ AfterCastActDelay: 1000
+ Duration1: 4500
Duration2: 30000
+ Cooldown: 6000
FixedCastTime:
- Level: 1
Time: 960
@@ -3861,7 +3762,7 @@ Body:
- Level: 9
Time: 2240
- Level: 10
- Time: 2400
+ Time: 1500
Requires:
SpCost: 78
Unit:
@@ -3910,7 +3811,7 @@ Body:
- Level: 4
Time: 1792
- Level: 5
- Time: 2240
+ Time: 3200
AfterCastActDelay:
- Level: 1
Time: 1000
@@ -3921,7 +3822,7 @@ Body:
- Level: 4
Time: 1600
- Level: 5
- Time: 1800
+ Time: 1400
- Level: 6
Time: 2000
- Level: 7
@@ -3942,19 +3843,19 @@ Body:
- Level: 4
Time: 448
- Level: 5
- Time: 560
+ Time: 1200
Requires:
SpCost:
- Level: 1
- Amount: 12
- - Level: 2
Amount: 14
- - Level: 3
- Amount: 16
- - Level: 4
+ - Level: 2
Amount: 18
+ - Level: 3
+ Amount: 22
+ - Level: 4
+ Amount: 26
- Level: 5
- Amount: 20
+ Amount: 30
- Id: 91
Name: WZ_HEAVENDRIVE
Description: Heaven's Drive
@@ -3993,8 +3894,18 @@ Body:
- Level: 4
Time: 2560
- Level: 5
- Time: 3200
- AfterCastActDelay: 1000
+ Time: 1900
+ AfterCastActDelay:
+ - Level: 1
+ Time: 1000
+ - Level: 2
+ Time: 1000
+ - Level: 3
+ Time: 1000
+ - Level: 4
+ Time: 1000
+ - Level: 5
+ Time: 500
Duration1: 100
FixedCastTime:
- Level: 1
@@ -4468,6 +4379,7 @@ Body:
Skill:
Plagiarism: true
Reproduce: true
+ CastTime: 500
AfterCastActDelay: 1000
Duration1:
- Level: 1
@@ -4481,7 +4393,7 @@ Body:
- Level: 5
Time: 40000
Duration2: 5000
- FixedCastTime: 1000
+ FixedCastTime: 300
Requires:
SpCost: 10
ItemCost:
@@ -4766,6 +4678,7 @@ Body:
Skill:
Plagiarism: true
Reproduce: true
+ CastTime: 500
AfterCastActDelay: 1000
Duration1:
- Level: 1
@@ -4778,7 +4691,7 @@ Body:
Time: 10000
- Level: 5
Time: 5000
- FixedCastTime: 1000
+ FixedCastTime: 300
Requires:
SpCost: 10
ItemCost:
@@ -4819,6 +4732,7 @@ Body:
Skill:
Plagiarism: true
Reproduce: true
+ CastTime: 500
AfterCastActDelay: 1000
Duration1:
- Level: 1
@@ -4831,7 +4745,7 @@ Body:
Time: 80000
- Level: 5
Time: 100000
- FixedCastTime: 1000
+ FixedCastTime: 300
Requires:
SpCost: 15
ItemCost:
@@ -5056,8 +4970,8 @@ Body:
Hit: Multi_Hit
HitCount: -8
Element: Weapon
- AfterCastWalkDelay: 2000
Duration2: 5000
+ Cooldown: 1000
CastDelayFlags:
IgnoreStatus: true
Requires:
@@ -5295,25 +5209,25 @@ Body:
CastTime: 500
Duration1:
- Level: 1
- Time: 5000
+ Time: 11000
- Level: 2
- Time: 5500
+ Time: 10000
- Level: 3
- Time: 6000
+ Time: 9000
- Level: 4
- Time: 6500
+ Time: 8000
- Level: 5
Time: 7000
- Level: 6
- Time: 7500
+ Time: 6000
- Level: 7
- Time: 8000
+ Time: 5000
- Level: 8
- Time: 8500
+ Time: 4000
- Level: 9
- Time: 9000
+ Time: 3000
- Level: 10
- Time: 9500
+ Time: 2000
Duration2: 20000
Cooldown:
- Level: 1
@@ -5335,7 +5249,7 @@ Body:
- Level: 9
Time: 11500
- Level: 10
- Time: 12000
+ Time: 2000
FixedCastTime: 500
Requires:
SpCost:
@@ -5359,9 +5273,6 @@ Body:
Amount: 28
- Level: 10
Amount: 30
- ItemCost:
- - Item: Red_Gemstone
- Amount: 1
- Id: 142
Name: NV_FIRSTAID
Description: First Aid
@@ -5573,12 +5484,17 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
+ Splash: true
Flags:
IsQuest: true
AllowOnMado: true
Hit: Single
HitCount: 1
+ SplashArea: -1
+ CastTime: 1000
Duration1: 300000
+ Cooldown: 30000
+ FixedCastTime: 300
Requires:
SpCost: 8
- Id: 156
@@ -5598,8 +5514,8 @@ Body:
Plagiarism: true
Reproduce: true
CastCancel: true
- CastTime: 1600
- FixedCastTime: 400
+ CastTime: 800
+ FixedCastTime: 200
Requires:
SpCost: 15
- Id: 157
@@ -6402,6 +6318,7 @@ Body:
Reproduce: true
AfterCastActDelay: 500
Duration1: 5000
+ Cooldown: 500
Requires:
SpCost: 16
- Id: 213
@@ -6422,11 +6339,11 @@ Body:
Hit: Single
HitCount: 1
Element: Weapon
- SplashArea: 4
+ SplashArea: 2
Duration1: 5000
Duration2: 20000
Requires:
- SpCost: 20
+ SpCost: 15
Status:
Hiding: true
- Id: 215
@@ -7297,12 +7214,13 @@ Body:
Plagiarism: true
Reproduce: true
CastDefenseReduction: 33
- CastTime: 1500
- AfterCastActDelay: 1500
+ CastTime: 1000
+ AfterCastActDelay: 500
AfterCastWalkDelay: 800
Duration1: 800
Duration2: 20000
- FixedCastTime: 1500
+ Cooldown: 1000
+ FixedCastTime: 500
Requires:
SpCost:
- Level: 1
@@ -7497,8 +7415,7 @@ Body:
Hit: Single
HitCount: 1
CastCancel: true
- CastTime: 1000
- FixedCastTime: 1000
+ FixedCastTime: 500
Requires:
SpCost: 5
- Id: 263
@@ -7609,18 +7526,18 @@ Body:
Time: 800
FixedCastTime: 500
Requires:
- SpCost: 10
- SpiritSphereCost:
+ SpCost:
- Level: 1
- Amount: 1
+ Amount: 12
- Level: 2
- Amount: 2
+ Amount: 16
- Level: 3
- Amount: 3
+ Amount: 20
- Level: 4
- Amount: 4
+ Amount: 24
- Level: 5
- Amount: 5
+ Amount: 28
+ SpiritSphereCost: 1
- Id: 268
Name: MO_STEELBODY
Description: Mental Strength
@@ -7669,17 +7586,7 @@ Body:
Time: 1100
- Level: 5
Time: 1300
- Duration2:
- - Level: 1
- Time: 20000
- - Level: 2
- Time: 30000
- - Level: 3
- Time: 40000
- - Level: 4
- Time: 50000
- - Level: 5
- Time: 60000
+ Duration2: 10000
Requires:
SpCost: 10
Weapon:
@@ -7760,7 +7667,7 @@ Body:
Time: 1500
- Level: 5
Time: 1000
- Duration1: 10000
+ Duration1: 3000
Duration2: 300000
FixedCastTime:
- Level: 1
@@ -7822,15 +7729,15 @@ Body:
Requires:
SpCost:
- Level: 1
- Amount: 11
+ Amount: 5
- Level: 2
- Amount: 12
+ Amount: 6
- Level: 3
- Amount: 13
+ Amount: 7
- Level: 4
- Amount: 14
+ Amount: 8
- Level: 5
- Amount: 15
+ Amount: 9
Weapon:
Fist: true
Dagger: true
@@ -7875,15 +7782,15 @@ Body:
Requires:
SpCost:
- Level: 1
- Amount: 11
+ Amount: 3
- Level: 2
- Amount: 12
+ Amount: 4
- Level: 3
- Amount: 13
+ Amount: 5
- Level: 4
- Amount: 14
+ Amount: 6
- Level: 5
- Amount: 15
+ Amount: 7
Weapon:
Fist: true
Dagger: true
@@ -8022,22 +7929,23 @@ Body:
HitCount: 1
Element: Fire
CastCancel: true
+ CastTime: 1000
Duration1:
- Level: 1
- Time: 1200000
+ Time: 600000
- Level: 2
- Time: 1200000
+ Time: 900000
- Level: 3
Time: 1200000
- Level: 4
- Time: 1200000
+ Time: 1500000
- Level: 5
Time: 1800000
- FixedCastTime: 3000
+ FixedCastTime: 1000
Requires:
SpCost: 40
ItemCost:
- - Item: Boody_Red
+ - Item: Scarlet_Pts
Amount: 1
- Id: 281
Name: SA_FROSTWEAPON
@@ -8055,22 +7963,23 @@ Body:
HitCount: 1
Element: Water
CastCancel: true
+ CastTime: 1000
Duration1:
- Level: 1
- Time: 1200000
+ Time: 600000
- Level: 2
- Time: 1200000
+ Time: 900000
- Level: 3
Time: 1200000
- Level: 4
- Time: 1200000
+ Time: 1500000
- Level: 5
Time: 1800000
- FixedCastTime: 3000
+ FixedCastTime: 1000
Requires:
SpCost: 40
ItemCost:
- - Item: Crystal_Blue
+ - Item: Indigo_Pts
Amount: 1
- Id: 282
Name: SA_LIGHTNINGLOADER
@@ -8088,22 +7997,23 @@ Body:
HitCount: 1
Element: Wind
CastCancel: true
+ CastTime: 1000
Duration1:
- Level: 1
- Time: 1200000
+ Time: 600000
- Level: 2
- Time: 1200000
+ Time: 900000
- Level: 3
Time: 1200000
- Level: 4
- Time: 1200000
+ Time: 1500000
- Level: 5
Time: 1800000
- FixedCastTime: 3000
+ FixedCastTime: 1000
Requires:
SpCost: 40
ItemCost:
- - Item: Wind_Of_Verdure
+ - Item: Yellow_Wish_Pts
Amount: 1
- Id: 283
Name: SA_SEISMICWEAPON
@@ -8121,22 +8031,23 @@ Body:
HitCount: 1
Element: Earth
CastCancel: true
+ CastTime: 1000
Duration1:
- Level: 1
- Time: 1200000
+ Time: 600000
- Level: 2
- Time: 1200000
+ Time: 900000
- Level: 3
Time: 1200000
- Level: 4
- Time: 1200000
+ Time: 1500000
- Level: 5
Time: 1800000
- FixedCastTime: 3000
+ FixedCastTime: 1000
Requires:
SpCost: 40
ItemCost:
- - Item: Yellow_Live
+ - Item: Lime_Green_Pts
Amount: 1
- Id: 284
Name: SA_DRAGONOLOGY
@@ -8184,7 +8095,7 @@ Body:
- Level: 5
Amount: 40
ItemCost:
- - Item: Yellow_Gemstone
+ - Item: Blue_Gemstone
Amount: 1
Unit:
Id: Volcano
@@ -8234,7 +8145,7 @@ Body:
- Level: 5
Amount: 40
ItemCost:
- - Item: Yellow_Gemstone
+ - Item: Blue_Gemstone
Amount: 1
Unit:
Id: Deluge
@@ -8284,7 +8195,7 @@ Body:
- Level: 5
Amount: 40
ItemCost:
- - Item: Yellow_Gemstone
+ - Item: Blue_Gemstone
Amount: 1
Unit:
Id: Violentgale
@@ -8624,9 +8535,11 @@ Body:
AllowWhenPerforming: true
Hit: Single
HitCount: 1
- Duration2: 5000
+ AfterCastActDelay: 300
+ Duration1: 300000
+ Cooldown: 300000
Requires:
- SpCost: 1
+ SpCost: 10
- Id: 305
Name: BD_ENCORE
Description: Encore
@@ -8636,6 +8549,8 @@ Body:
NoDamage: true
Hit: Single
HitCount: 1
+ AfterCastActDelay: 300
+ Cooldown: 10000
Requires:
SpCost: 1
Weapon:
@@ -8653,20 +8568,16 @@ Body:
IsEnsemble: true
Hit: Single
HitCount: 1
+ SplashArea: 4
+ CastTime: 1000
Duration1: 60000
Duration2: 15000
+ Cooldown: 20000
Requires:
- SpCost: 20
+ SpCost: 40
Weapon:
Musical: true
Whip: true
- Unit:
- Id: Lullaby
- Layout: 4
- Interval: 6000
- Target: Enemy
- Flag:
- Ensemble: true
- Id: 307
Name: BD_RICHMANKIM
Description: Mental Sensing
@@ -8679,21 +8590,26 @@ Body:
IsEnsemble: true
Hit: Single
HitCount: 1
+ SplashArea: -1
+ CastTime: 1000
Duration1: 60000
Duration2: 60000
+ Cooldown: 20000
Requires:
- SpCost: 20
+ SpCost:
+ - Level: 1
+ Amount: 62
+ - Level: 2
+ Amount: 68
+ - Level: 3
+ Amount: 74
+ - Level: 4
+ Amount: 80
+ - Level: 5
+ Amount: 86
Weapon:
Musical: true
Whip: true
- Unit:
- Id: Richmankim
- Layout: 4
- Interval: -1
- Target: Enemy
- Flag:
- NoPc: true
- Ensemble: true
- Id: 308
Name: BD_ETERNALCHAOS
Description: Down Tempo
@@ -8706,21 +8622,16 @@ Body:
IsEnsemble: true
Hit: Single
HitCount: 1
+ SplashArea: 4
+ CastTime: 1000
Duration1: 60000
Duration2: 60000
+ Cooldown: 60000
Requires:
- SpCost: 30
+ SpCost: 120
Weapon:
Musical: true
Whip: true
- Unit:
- Id: Eternalchaos
- Layout: 4
- Interval: -1
- Target: Enemy
- Flag:
- Ensemble: true
- RemovedByFireRain: true
- Id: 309
Name: BD_DRUMBATTLEFIELD
Description: Battle Theme
@@ -8733,30 +8644,26 @@ Body:
IsEnsemble: true
Hit: Single
HitCount: 1
+ SplashArea: -1
+ CastTime: 1000
Duration1: 60000
Duration2: 60000
+ Cooldown: 20000
Requires:
SpCost:
- Level: 1
- Amount: 38
- - Level: 2
- Amount: 41
- - Level: 3
- Amount: 44
- - Level: 4
- Amount: 47
- - Level: 5
Amount: 50
+ - Level: 2
+ Amount: 54
+ - Level: 3
+ Amount: 58
+ - Level: 4
+ Amount: 62
+ - Level: 5
+ Amount: 66
Weapon:
Musical: true
Whip: true
- Unit:
- Id: Drumbattlefield
- Layout: 4
- Interval: -1
- Target: Party
- Flag:
- Ensemble: true
- Id: 310
Name: BD_RINGNIBELUNGEN
Description: Harmonic Lick
@@ -8769,30 +8676,26 @@ Body:
IsEnsemble: true
Hit: Single
HitCount: 1
+ SplashArea: -1
+ CastTime: 1000
Duration1: 60000
Duration2: 60000
+ Cooldown: 20000
Requires:
SpCost:
- Level: 1
- Amount: 38
+ Amount: 64
- Level: 2
- Amount: 41
+ Amount: 60
- Level: 3
- Amount: 44
+ Amount: 56
- Level: 4
- Amount: 47
+ Amount: 52
- Level: 5
- Amount: 50
+ Amount: 48
Weapon:
Musical: true
Whip: true
- Unit:
- Id: Ringnibelungen
- Layout: 4
- Interval: -1
- Target: Party
- Flag:
- Ensemble: true
- Id: 311
Name: BD_ROKISWEIL
Description: Classical Pluck
@@ -8805,20 +8708,16 @@ Body:
IsEnsemble: true
Hit: Single
HitCount: 1
- Duration1: 60000
+ SplashArea: 4
+ CastTime: 1000
+ Duration1: 30000
Duration2: 60000
+ Cooldown: 180000
Requires:
- SpCost: 15
+ SpCost: 180
Weapon:
Musical: true
Whip: true
- Unit:
- Id: Rokisweil
- Layout: 4
- Interval: -1
- Flag:
- Ensemble: true
- RemovedByFireRain: true
- Id: 312
Name: BD_INTOABYSS
Description: Power Chord
@@ -8831,21 +8730,16 @@ Body:
IsEnsemble: true
Hit: Single
HitCount: 1
+ SplashArea: -1
+ CastTime: 1000
Duration1: 60000
Duration2: 60000
+ Cooldown: 20000
Requires:
- SpCost: 10
+ SpCost: 70
Weapon:
Musical: true
Whip: true
- Unit:
- Id: Intoabyss
- Layout: 4
- Interval: -1
- Target: Party
- Flag:
- NoMob: true
- Ensemble: true
- Id: 313
Name: BD_SIEGFRIED
Description: Acoustic Rhythm
@@ -8858,20 +8752,26 @@ Body:
IsEnsemble: true
Hit: Single
HitCount: 1
+ SplashArea: -1
+ CastTime: 1000
Duration1: 60000
Duration2: 60000
+ Cooldown: 20000
Requires:
- SpCost: 20
+ SpCost:
+ - Level: 1
+ Amount: 40
+ - Level: 2
+ Amount: 44
+ - Level: 3
+ Amount: 48
+ - Level: 4
+ Amount: 52
+ - Level: 5
+ Amount: 56
Weapon:
Musical: true
Whip: true
- Unit:
- Id: Siegfried
- Layout: 4
- Interval: -1
- Target: Party
- Flag:
- Ensemble: true
- Id: 315
Name: BA_MUSICALLESSON
Description: Music Lessons
@@ -8887,22 +8787,13 @@ Body:
AllowWhenPerforming: true
Range: 9
Hit: Single
- HitCount: 1
+ HitCount: 2
Element: Weapon
- CastTime: 1200
+ CastTime: 500
+ AfterCastActDelay: 3000
FixedCastTime: 300
Requires:
- SpCost:
- - Level: 1
- Amount: 1
- - Level: 2
- Amount: 3
- - Level: 3
- Amount: 5
- - Level: 4
- Amount: 7
- - Level: 5
- Amount: 9
+ SpCost: 12
Weapon:
Musical: true
Ammo:
@@ -8912,40 +8803,34 @@ Body:
Name: BA_DISSONANCE
Description: Unchained Serenade
MaxLevel: 5
- Type: Misc
+ Type: Magic
TargetType: Self
DamageFlags:
NoDamage: true
IgnoreFlee: true
Flags:
IsSong: true
- IgnoreLandProtector: true
Hit: Multi_Hit
HitCount: 1
+ SplashArea: 4
+ CastTime: 1000
Duration1: 30000
Duration2: 3000
+ Cooldown: 5000
Requires:
SpCost:
- Level: 1
- Amount: 18
+ Amount: 35
- Level: 2
- Amount: 21
+ Amount: 38
- Level: 3
- Amount: 24
+ Amount: 41
- Level: 4
- Amount: 27
+ Amount: 44
- Level: 5
- Amount: 30
+ Amount: 47
Weapon:
Musical: true
- Unit:
- Id: Dissonance
- Layout: 3
- Interval: 3000
- Target: Enemy
- Flag:
- Song: true
- RemovedByFireRain: true
- Id: 318
Name: BA_FROSTJOKER
Description: Unbarring Octave
@@ -8958,8 +8843,9 @@ Body:
Hit: Single
HitCount: 1
SplashArea: -1
- AfterCastActDelay: 4000
+ AfterCastActDelay: 300
Duration2: 30000
+ Cooldown: 4000
Requires:
SpCost:
- Level: 1
@@ -8982,298 +8868,13 @@ Body:
NoDamage: true
Flags:
IsSong: true
- IgnoreLandProtector: true
- Hit: Single
- HitCount: 1
- Duration1: 60000
- Duration2: 20000
- Requires:
- SpCost:
- - Level: 1
- Amount: 24
- - Level: 2
- Amount: 28
- - Level: 3
- Amount: 32
- - Level: 4
- Amount: 36
- - Level: 5
- Amount: 40
- - Level: 6
- Amount: 44
- - Level: 7
- Amount: 48
- - Level: 8
- Amount: 52
- - Level: 9
- Amount: 56
- - Level: 10
- Amount: 60
- Weapon:
- Musical: true
- Whip: true
- Unit:
- Id: Whistle
- Layout: 3
- Interval: -1
- Flag:
- NoMob: true
- Song: true
- - Id: 320
- Name: BA_ASSASSINCROSS
- Description: Impressive Riff
- MaxLevel: 10
- Type: Misc
- TargetType: Self
- DamageFlags:
- NoDamage: true
- Flags:
- IsSong: true
- IgnoreLandProtector: true
- Hit: Single
- HitCount: 1
- Duration1: 120000
- Duration2: 20000
- Requires:
- SpCost:
- - Level: 1
- Amount: 38
- - Level: 2
- Amount: 41
- - Level: 3
- Amount: 44
- - Level: 4
- Amount: 47
- - Level: 5
- Amount: 50
- - Level: 6
- Amount: 53
- - Level: 7
- Amount: 56
- - Level: 8
- Amount: 59
- - Level: 9
- Amount: 62
- - Level: 10
- Amount: 65
- Weapon:
- Musical: true
- Whip: true
- Unit:
- Id: Assassincross
- Layout: 3
- Interval: -1
- Flag:
- NoMob: true
- Song: true
- - Id: 321
- Name: BA_POEMBRAGI
- Description: Magic Strings
- MaxLevel: 10
- Type: Misc
- TargetType: Self
- DamageFlags:
- NoDamage: true
- Flags:
- IsSong: true
- IgnoreLandProtector: true
- Hit: Single
- HitCount: 1
- Duration1: 180000
- Duration2: 20000
- Requires:
- SpCost:
- - Level: 1
- Amount: 40
- - Level: 2
- Amount: 45
- - Level: 3
- Amount: 50
- - Level: 4
- Amount: 55
- - Level: 5
- Amount: 60
- - Level: 6
- Amount: 65
- - Level: 7
- Amount: 70
- - Level: 8
- Amount: 75
- - Level: 9
- Amount: 80
- - Level: 10
- Amount: 85
- Weapon:
- Musical: true
- Whip: true
- Unit:
- Id: Poembragi
- Layout: 3
- Interval: -1
- Flag:
- NoMob: true
- Song: true
- - Id: 322
- Name: BA_APPLEIDUN
- Description: Song of Lutie
- MaxLevel: 10
- Type: Misc
- TargetType: Self
- DamageFlags:
- NoDamage: true
- Flags:
- IsSong: true
- IgnoreLandProtector: true
- Hit: Single
- HitCount: 1
- Duration1: 180000
- Duration2: 20000
- Requires:
- SpCost:
- - Level: 1
- Amount: 40
- - Level: 2
- Amount: 45
- - Level: 3
- Amount: 50
- - Level: 4
- Amount: 55
- - Level: 5
- Amount: 60
- - Level: 6
- Amount: 65
- - Level: 7
- Amount: 70
- - Level: 8
- Amount: 75
- - Level: 9
- Amount: 80
- - Level: 10
- Amount: 85
- Weapon:
- Musical: true
- Whip: true
- Unit:
- Id: Appleidun
- Layout: 3
- Interval: 6000
- Flag:
- NoMob: true
- Song: true
- DualMode: true
- - Id: 323
- Name: DC_DANCINGLESSON
- Description: Dance Lessons
- MaxLevel: 10
- Type: Weapon
- - Id: 324
- Name: DC_THROWARROW
- Description: Slinging Arrow
- MaxLevel: 5
- Type: Weapon
- TargetType: Attack
- Flags:
- AllowWhenPerforming: true
- Range: 9
- Hit: Single
- HitCount: 1
- Element: Weapon
- CastTime: 1200
- FixedCastTime: 300
- Requires:
- SpCost:
- - Level: 1
- Amount: 1
- - Level: 2
- Amount: 3
- - Level: 3
- Amount: 5
- - Level: 4
- Amount: 7
- - Level: 5
- Amount: 9
- Weapon:
- Whip: true
- Ammo:
- Arrow: true
- AmmoAmount: 1
- - Id: 325
- Name: DC_UGLYDANCE
- Description: Hip Shaker
- MaxLevel: 5
- Type: Misc
- TargetType: Self
- DamageFlags:
- NoDamage: true
- Flags:
- IsSong: true
- IgnoreLandProtector: true
- Hit: Multi_Hit
- HitCount: 1
- Duration1: 30000
- Duration2: 3000
- Requires:
- SpCost:
- - Level: 1
- Amount: 23
- - Level: 2
- Amount: 26
- - Level: 3
- Amount: 29
- - Level: 4
- Amount: 32
- - Level: 5
- Amount: 35
- Weapon:
- Whip: true
- Unit:
- Id: Uglydance
- Layout: 3
- Interval: 3000
- Target: Enemy
- Flag:
- Dance: true
- - Id: 326
- Name: DC_SCREAM
- Description: Dazzler
- MaxLevel: 5
- Type: Misc
- TargetType: Self
- DamageFlags:
- NoDamage: true
- Splash: true
Hit: Single
HitCount: 1
SplashArea: -1
- AfterCastActDelay: 4000
- Duration2: 5000
- Requires:
- SpCost:
- - Level: 1
- Amount: 12
- - Level: 2
- Amount: 14
- - Level: 3
- Amount: 16
- - Level: 4
- Amount: 18
- - Level: 5
- Amount: 20
- - Id: 327
- Name: DC_HUMMING
- Description: Focus Ballet
- MaxLevel: 10
- Type: Misc
- TargetType: Self
- DamageFlags:
- NoDamage: true
- Flags:
- IsSong: true
- IgnoreLandProtector: true
- Hit: Single
- HitCount: 1
+ CastTime: 1000
Duration1: 60000
Duration2: 20000
+ Cooldown: 20000
Requires:
SpCost:
- Level: 1
@@ -9299,16 +8900,9 @@ Body:
Weapon:
Musical: true
Whip: true
- Unit:
- Id: Humming
- Layout: 3
- Interval: -1
- Flag:
- NoMob: true
- Dance: true
- - Id: 328
- Name: DC_DONTFORGETME
- Description: Slow Grace
+ - Id: 320
+ Name: BA_ASSASSINCROSS
+ Description: Impressive Riff
MaxLevel: 10
Type: Misc
TargetType: Self
@@ -9316,105 +8910,13 @@ Body:
NoDamage: true
Flags:
IsSong: true
- IgnoreLandProtector: true
Hit: Single
HitCount: 1
- Duration1: 180000
- Duration2: 20000
- Requires:
- SpCost:
- - Level: 1
- Amount: 28
- - Level: 2
- Amount: 31
- - Level: 3
- Amount: 34
- - Level: 4
- Amount: 37
- - Level: 5
- Amount: 40
- - Level: 6
- Amount: 43
- - Level: 7
- Amount: 46
- - Level: 8
- Amount: 49
- - Level: 9
- Amount: 52
- - Level: 10
- Amount: 55
- Weapon:
- Musical: true
- Whip: true
- Unit:
- Id: Dontforgetme
- Layout: 3
- Interval: -1
- Target: Enemy
- Flag:
- Dance: true
- - Id: 329
- Name: DC_FORTUNEKISS
- Description: Lady Luck
- MaxLevel: 10
- Type: Misc
- TargetType: Self
- DamageFlags:
- NoDamage: true
- Flags:
- IsSong: true
- IgnoreLandProtector: true
- Hit: Single
- HitCount: 1
- Duration1: 120000
- Duration2: 20000
- Requires:
- SpCost:
- - Level: 1
- Amount: 43
- - Level: 2
- Amount: 46
- - Level: 3
- Amount: 49
- - Level: 4
- Amount: 52
- - Level: 5
- Amount: 55
- - Level: 6
- Amount: 58
- - Level: 7
- Amount: 61
- - Level: 8
- Amount: 64
- - Level: 9
- Amount: 67
- - Level: 10
- Amount: 70
- Weapon:
- Musical: true
- Whip: true
- Unit:
- Id: Fortunekiss
- Layout: 3
- Interval: -1
- Flag:
- NoMob: true
- Dance: true
- - Id: 330
- Name: DC_SERVICEFORYOU
- Description: Gypsy's Kiss
- MaxLevel: 10
- Type: Misc
- TargetType: Self
- DamageFlags:
- NoDamage: true
- Flags:
- IsSong: true
- IgnoreLandProtector: true
- Hit: Single
- HitCount: 1
- Duration1: 180000
+ SplashArea: -1
+ CastTime: 1000
+ Duration1: 60000
Duration2: 20000
+ Cooldown: 20000
Requires:
SpCost:
- Level: 1
@@ -9440,13 +8942,342 @@ Body:
Weapon:
Musical: true
Whip: true
- Unit:
- Id: Serviceforyou
- Layout: 3
- Interval: -1
- Flag:
- NoMob: true
- Dance: true
+ - Id: 321
+ Name: BA_POEMBRAGI
+ Description: Magic Strings
+ MaxLevel: 10
+ Type: Misc
+ TargetType: Self
+ DamageFlags:
+ NoDamage: true
+ Flags:
+ IsSong: true
+ Hit: Single
+ HitCount: 1
+ SplashArea: -1
+ CastTime: 1000
+ Duration1: 60000
+ Duration2: 20000
+ Cooldown: 20000
+ Requires:
+ SpCost:
+ - Level: 1
+ Amount: 65
+ - Level: 2
+ Amount: 70
+ - Level: 3
+ Amount: 75
+ - Level: 4
+ Amount: 80
+ - Level: 5
+ Amount: 85
+ - Level: 6
+ Amount: 90
+ - Level: 7
+ Amount: 95
+ - Level: 8
+ Amount: 100
+ - Level: 9
+ Amount: 105
+ - Level: 10
+ Amount: 110
+ Weapon:
+ Musical: true
+ Whip: true
+ - Id: 322
+ Name: BA_APPLEIDUN
+ Description: Song of Lutie
+ MaxLevel: 10
+ Type: Misc
+ TargetType: Self
+ DamageFlags:
+ NoDamage: true
+ Flags:
+ IsSong: true
+ Hit: Single
+ HitCount: 1
+ SplashArea: -1
+ CastTime: 1000
+ Duration1: 60000
+ Duration2: 20000
+ Cooldown: 20000
+ Requires:
+ SpCost:
+ - Level: 1
+ Amount: 40
+ - Level: 2
+ Amount: 45
+ - Level: 3
+ Amount: 50
+ - Level: 4
+ Amount: 55
+ - Level: 5
+ Amount: 60
+ - Level: 6
+ Amount: 65
+ - Level: 7
+ Amount: 70
+ - Level: 8
+ Amount: 75
+ - Level: 9
+ Amount: 80
+ - Level: 10
+ Amount: 85
+ Weapon:
+ Musical: true
+ Whip: true
+ - Id: 323
+ Name: DC_DANCINGLESSON
+ Description: Dance Lessons
+ MaxLevel: 10
+ Type: Weapon
+ - Id: 324
+ Name: DC_THROWARROW
+ Description: Slinging Arrow
+ MaxLevel: 5
+ Type: Weapon
+ TargetType: Attack
+ Flags:
+ AllowWhenPerforming: true
+ Range: 9
+ Hit: Single
+ HitCount: 2
+ Element: Weapon
+ CastTime: 1200
+ FixedCastTime: 300
+ Requires:
+ SpCost: 12
+ Weapon:
+ Whip: true
+ Ammo:
+ Arrow: true
+ AmmoAmount: 1
+ - Id: 325
+ Name: DC_UGLYDANCE
+ Description: Hip Shaker
+ MaxLevel: 5
+ Type: Misc
+ TargetType: Self
+ DamageFlags:
+ NoDamage: true
+ Flags:
+ IsSong: true
+ Hit: Multi_Hit
+ HitCount: 1
+ SplashArea: 4
+ CastTime: 1000
+ Duration1: 30000
+ Duration2: 3000
+ Cooldown: 20000
+ Requires:
+ SpCost:
+ - Level: 1
+ Amount: 23
+ - Level: 2
+ Amount: 26
+ - Level: 3
+ Amount: 29
+ - Level: 4
+ Amount: 32
+ - Level: 5
+ Amount: 35
+ Weapon:
+ Whip: true
+ - Id: 326
+ Name: DC_SCREAM
+ Description: Dazzler
+ MaxLevel: 5
+ Type: Misc
+ TargetType: Self
+ DamageFlags:
+ NoDamage: true
+ Splash: true
+ Hit: Single
+ HitCount: 1
+ SplashArea: -1
+ AfterCastActDelay: 300
+ Duration2: 5000
+ Cooldown: 4000
+ Requires:
+ SpCost:
+ - Level: 1
+ Amount: 12
+ - Level: 2
+ Amount: 14
+ - Level: 3
+ Amount: 16
+ - Level: 4
+ Amount: 18
+ - Level: 5
+ Amount: 20
+ - Id: 327
+ Name: DC_HUMMING
+ Description: Focus Ballet
+ MaxLevel: 10
+ Type: Misc
+ TargetType: Self
+ DamageFlags:
+ NoDamage: true
+ Flags:
+ IsSong: true
+ Hit: Single
+ HitCount: 1
+ SplashArea: -1
+ CastTime: 1000
+ Duration1: 60000
+ Duration2: 20000
+ Cooldown: 20000
+ Requires:
+ SpCost:
+ - Level: 1
+ Amount: 33
+ - Level: 2
+ Amount: 36
+ - Level: 3
+ Amount: 39
+ - Level: 4
+ Amount: 42
+ - Level: 5
+ Amount: 45
+ - Level: 6
+ Amount: 48
+ - Level: 7
+ Amount: 51
+ - Level: 8
+ Amount: 54
+ - Level: 9
+ Amount: 57
+ - Level: 10
+ Amount: 60
+ Weapon:
+ Musical: true
+ Whip: true
+ - Id: 328
+ Name: DC_DONTFORGETME
+ Description: Slow Grace
+ MaxLevel: 10
+ Type: Misc
+ TargetType: Self
+ DamageFlags:
+ NoDamage: true
+ Flags:
+ IsSong: true
+ Hit: Single
+ HitCount: 1
+ SplashArea: 4
+ CastTime: 1000
+ Duration1: 60000
+ Duration2: 20000
+ Cooldown: 20000
+ Requires:
+ SpCost:
+ - Level: 1
+ Amount: 38
+ - Level: 2
+ Amount: 41
+ - Level: 3
+ Amount: 44
+ - Level: 4
+ Amount: 47
+ - Level: 5
+ Amount: 50
+ - Level: 6
+ Amount: 53
+ - Level: 7
+ Amount: 56
+ - Level: 8
+ Amount: 59
+ - Level: 9
+ Amount: 62
+ - Level: 10
+ Amount: 65
+ Weapon:
+ Musical: true
+ Whip: true
+ - Id: 329
+ Name: DC_FORTUNEKISS
+ Description: Lady Luck
+ MaxLevel: 10
+ Type: Misc
+ TargetType: Self
+ DamageFlags:
+ NoDamage: true
+ Flags:
+ IsSong: true
+ Hit: Single
+ HitCount: 1
+ SplashArea: -1
+ CastTime: 1000
+ Duration1: 60000
+ Duration2: 20000
+ Cooldown: 20000
+ Requires:
+ SpCost:
+ - Level: 1
+ Amount: 40
+ - Level: 2
+ Amount: 45
+ - Level: 3
+ Amount: 50
+ - Level: 4
+ Amount: 55
+ - Level: 5
+ Amount: 60
+ - Level: 6
+ Amount: 65
+ - Level: 7
+ Amount: 70
+ - Level: 8
+ Amount: 75
+ - Level: 9
+ Amount: 80
+ - Level: 10
+ Amount: 85
+ Weapon:
+ Musical: true
+ Whip: true
+ - Id: 330
+ Name: DC_SERVICEFORYOU
+ Description: Gypsy's Kiss
+ MaxLevel: 10
+ Type: Misc
+ TargetType: Self
+ DamageFlags:
+ NoDamage: true
+ Flags:
+ IsSong: true
+ Hit: Single
+ HitCount: 1
+ SplashArea: -1
+ CastTime: 1000
+ Duration1: 60000
+ Duration2: 20000
+ Cooldown: 20000
+ Requires:
+ SpCost:
+ - Level: 1
+ Amount: 60
+ - Level: 2
+ Amount: 63
+ - Level: 3
+ Amount: 66
+ - Level: 4
+ Amount: 69
+ - Level: 5
+ Amount: 72
+ - Level: 6
+ Amount: 75
+ - Level: 7
+ Amount: 78
+ - Level: 8
+ Amount: 81
+ - Level: 9
+ Amount: 84
+ - Level: 10
+ Amount: 87
+ Weapon:
+ Musical: true
+ Whip: true
- Id: 331
Name: NPC_RANDOMMOVE
Description: Random Move
@@ -9958,7 +9789,7 @@ Body:
- Level: 4
Time: 40000
- Level: 5
- Time: 45000
+ Time: 60000
Requires:
SpCost:
- Level: 1
@@ -10043,7 +9874,7 @@ Body:
- Level: 4
Time: 1400
- Level: 5
- Time: 1500
+ Time: 500
Duration1:
- Level: 1
Time: 20000
@@ -10086,23 +9917,21 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
- Range: 4
Hit: Single
HitCount: 1
- ActiveInstance: 1
- Knockback: 2
CastCancel: true
+ CastTime: 3000
AfterCastActDelay:
- Level: 1
- Time: 2000
+ Time: 200
- Level: 2
- Time: 3000
+ Time: 400
- Level: 3
- Time: 4000
+ Time: 600
- Level: 4
- Time: 5000
+ Time: 800
- Level: 5
- Time: 6000
+ Time: 1000
Duration1:
- Level: 1
Time: 20000
@@ -10125,44 +9954,30 @@ Body:
Time: 35000
- Level: 5
Time: 40000
+ Cooldown: 30000
FixedCastTime:
- Level: 1
- Time: 5000
+ Time: 200
- Level: 2
- Time: 6000
+ Time: 400
- Level: 3
- Time: 7000
+ Time: 600
- Level: 4
- Time: 8000
+ Time: 800
- Level: 5
- Time: 9000
+ Time: 1000
Requires:
SpCost:
- Level: 1
- Amount: 80
+ Amount: 40
- Level: 2
- Amount: 90
+ Amount: 50
- Level: 3
- Amount: 100
+ Amount: 60
- Level: 4
- Amount: 110
+ Amount: 70
- Level: 5
- Amount: 120
- ItemCost:
- - Item: Yellow_Gemstone
- Amount: 1
- - Item: Red_Gemstone
- Amount: 1
- - Item: Blue_Gemstone
- Amount: 1
- - Item: Holy_Water
- Amount: 1
- Unit:
- Id: Basilica
- Layout: 2
- Interval: 300
- Flag:
- RangedSingleUnit: true
+ Amount: 80
- Id: 363
Name: HP_MEDITATIO
Description: Meditatio
@@ -10231,19 +10046,13 @@ Body:
Name: PA_PRESSURE
Description: Gloria Domini
MaxLevel: 5
- Type: Misc
+ Type: Magic
TargetType: Attack
- DamageFlags:
- IgnoreElement: true
- IgnoreFlee: true
- IgnoreDefCard: true
- Flags:
- IgnoreBgReduction: true
- IgnoreGvgReduction: true
Range: 9
Hit: Multi_Hit
HitCount: 1
- CastTime: 1600
+ Element: Holy
+ CastTime: 1000
AfterCastActDelay:
- Level: 1
Time: 2000
@@ -10254,7 +10063,7 @@ Body:
- Level: 4
Time: 3500
- Level: 5
- Time: 4000
+ Time: 1000
Duration2:
- Level: 1
Time: 2000
@@ -10463,7 +10272,7 @@ Body:
Amount: 20
- Level: 10
Amount: 22
- SpiritSphereCost: 2
+ SpiritSphereCost: 1
- Id: 373
Name: PF_HPCONVERSION
Description: Indulge
@@ -10474,17 +10283,7 @@ Body:
NoDamage: true
Hit: Single
HitCount: 1
- AfterCastActDelay:
- - Level: 1
- Time: 1000
- - Level: 2
- Time: 1200
- - Level: 3
- Time: 1400
- - Level: 4
- Time: 1600
- - Level: 5
- Time: 1800
+ AfterCastActDelay: 500
Requires:
SpCost:
- Level: 1
@@ -10571,7 +10370,6 @@ Body:
Hit: Single
HitCount: 1
Element: Poison
- AfterCastActDelay: 2000
Duration1:
- Level: 1
Time: 40000
@@ -10582,7 +10380,7 @@ Body:
- Level: 4
Time: 55000
- Level: 5
- Time: 60000
+ Time: 120000
Duration2:
- Level: 1
Time: 20000
@@ -10594,6 +10392,7 @@ Body:
Time: 50000
- Level: 5
Time: 60000
+ Cooldown: 2000
Requires:
SpCost:
- Level: 1
@@ -10748,9 +10547,9 @@ Body:
SplashArea: 1
ActiveInstance: 14
CastCancel: true
- CastTime: 1000
- AfterCastActDelay: 1500
- FixedCastTime: 1000
+ CastTime: 500
+ AfterCastActDelay: 500
+ FixedCastTime: 500
Requires:
SpCost:
- Level: 1
@@ -11098,9 +10897,10 @@ Body:
- Level: 9
Time: 2880
- Level: 10
- Time: 3040
- AfterCastActDelay: 2000
+ Time: 1500
+ AfterCastActDelay: 500
AfterCastWalkDelay: 2000
+ Cooldown: 1500
FixedCastTime:
- Level: 1
Time: 400
@@ -11121,7 +10921,7 @@ Body:
- Level: 9
Time: 720
- Level: 10
- Time: 760
+ Time: 500
CastDelayFlags:
IgnoreStatus: true
Requires:
@@ -11239,7 +11039,7 @@ Body:
- Level: 4
Time: 450
- Level: 5
- Time: 500
+ Time: 250
AfterCastActDelay:
- Level: 1
Time: 1200
@@ -11262,7 +11062,7 @@ Body:
- Level: 4
Time: 450
- Level: 5
- Time: 500
+ Time: 300
Requires:
SpCost:
- Level: 1
@@ -11349,7 +11149,6 @@ Body:
TargetType: Attack
DamageFlags:
Splash: true
- SplashSplit: true
Flags:
TargetTrap: true
Range: 9
@@ -11369,19 +11168,20 @@ Body:
SplashArea: 1
CastCancel: true
CastTime: 800
- AfterCastActDelay: 1000
+ AfterCastActDelay: 500
Duration2: 20000
+ Cooldown: 1000
FixedCastTime: 200
Requires:
SpCost:
- Level: 1
- Amount: 10
+ Amount: 30
- Level: 2
- Amount: 25
- - Level: 3
Amount: 40
+ - Level: 3
+ Amount: 50
- Level: 4
- Amount: 55
+ Amount: 60
- Level: 5
Amount: 70
- Id: 401
@@ -11395,7 +11195,7 @@ Body:
HitCount: 1
CastCancel: true
Duration1: 600000
- FixedCastTime: 2000
+ FixedCastTime: 1000
Requires:
SpCost: 20
- Id: 402
@@ -11442,7 +11242,7 @@ Body:
NoDamage: true
HitCount: 1
CastCancel: true
- FixedCastTime: 5000
+ FixedCastTime: 2500
CastTimeFlags:
IgnoreDex: true
IgnoreStatus: true
@@ -11518,7 +11318,6 @@ Body:
Element: Weapon
SplashArea: 2
CastTime: 250
- AfterCastActDelay: 500
Duration2:
- Level: 1
Time: 20000
@@ -11526,6 +11325,7 @@ Body:
Time: 5000
- Level: 3
Time: 120000
+ Cooldown: 500
FixedCastTime: 250
Requires:
SpCost:
@@ -13460,7 +13260,17 @@ Body:
TargetType: Attack
Flags:
IncreaseGloomyDayDamage: true
- Range: 4
+ Range:
+ - Level: 1
+ Size: 7
+ - Level: 2
+ Size: 7
+ - Level: 3
+ Size: 9
+ - Level: 4
+ Size: 9
+ - Level: 5
+ Size: 11
Hit: Multi_Hit
HitCount: 5
Element: Weapon
@@ -13545,47 +13355,43 @@ Body:
Name: HW_GRAVITATION
Description: Gravitation Field
MaxLevel: 5
- Type: Misc
+ Type: Magic
TargetType: Ground
DamageFlags:
NoDamage: true
- IgnoreElement: true
- IgnoreFlee: true
- IgnoreDefCard: true
Flags:
- IgnoreBgReduction: true
- IgnoreGvgReduction: true
TargetEmperium: true
IgnoreHovering: true
TargetHidden: true
Range: 18
Hit: Single
HitCount: 1
- Element: Earth
CastCancel: true
- AfterCastActDelay: 2000
+ CastTime: 5000
+ AfterCastActDelay: 1000
Duration1:
- Level: 1
- Time: 5000
+ Time: 2000
- Level: 2
- Time: 6000
+ Time: 2400
- Level: 3
- Time: 7000
+ Time: 2800
- Level: 4
- Time: 8000
+ Time: 3200
- Level: 5
- Time: 9000
- FixedCastTime: 5000
+ Time: 3600
+ Cooldown: 5000
+ FixedCastTime: 1000
Requires:
SpCost:
- Level: 1
- Amount: 20
- - Level: 2
- Amount: 40
- - Level: 3
Amount: 60
- - Level: 4
+ - Level: 2
+ Amount: 70
+ - Level: 3
Amount: 80
+ - Level: 4
+ Amount: 90
- Level: 5
Amount: 100
ItemCost:
@@ -13594,12 +13400,10 @@ Body:
Unit:
Id: Gravitation
Layout: 2
- Interval: 500
+ Interval: 200
Target: Enemy
Flag:
- NoOverlap: true
PathCheck: true
- DualMode: true
RemovedByFireRain: true
- Id: 485
Name: WS_CARTTERMINATION
@@ -13711,20 +13515,6 @@ Body:
Shotgun: true
Grenade: true
Huuma: true
- - Id: 487
- Name: CG_LONGINGFREEDOM
- Description: Longing for Freedom
- MaxLevel: 5
- TargetType: Self
- DamageFlags:
- NoDamage: true
- Flags:
- AllowWhenPerforming: true
- Hit: Single
- HitCount: 1
- Duration1: 180000
- Requires:
- SpCost: 15
- Id: 488
Name: CG_HERMODE
Description: Wand of Hermode
@@ -13738,7 +13528,7 @@ Body:
IgnoreLandProtector: true
Hit: Single
HitCount: 1
- SplashArea: 1
+ SplashArea: 3
Duration1:
- Level: 1
Time: 10000
@@ -13776,12 +13566,6 @@ Body:
Weapon:
Musical: true
Whip: true
- Unit:
- Id: Hermode
- Layout: 3
- Interval: -1
- Flag:
- Ensemble: true
- Id: 489
Name: CG_TAROTCARD
Description: Tarot Card of Fate
@@ -17326,8 +17110,7 @@ Body:
Skill:
Plagiarism: true
Reproduce: true
- CastTime: 250
- FixedCastTime: 250
+ Cooldown: 500
Requires:
SpCost: 40
- Id: 1002
@@ -17533,7 +17316,7 @@ Body:
Duration2: 17000
FixedCastTime: 200
Requires:
- SpCost: 40
+ SpCost: 20
- Id: 1012
Name: BS_UNFAIRLYTRICK
Description: Unfair Trick
@@ -33111,6 +32894,18 @@ Body:
IgnoreDex: true
IgnoreStatus: true
IgnoreItemBonus: true
+ - Id: 5068
+ Name: CG_SPECIALSINGER
+ Description: Skilled Special Singer
+ MaxLevel: 1
+ TargetType: Self
+ DamageFlags:
+ NoDamage: true
+ Range: 1
+ Duration1: 10000
+ Cooldown: 60000
+ Requires:
+ SpCost: 1
- Id: 5072
Name: AB_VITUPERATUM
Description: Vituperatum
diff --git a/db/re/skill_nocast_db.txt b/db/re/skill_nocast_db.txt
index 6d4213ef4e..43a1de57e1 100644
--- a/db/re/skill_nocast_db.txt
+++ b/db/re/skill_nocast_db.txt
@@ -26,6 +26,11 @@
//----------------------------------------------------------------------------
// Normal
//----------------------------------------------------------------------------
+308,1 //BD_ETERNALCHAOS
+311,1 //BD_ROKISWEIL
+317,1 //BA_DISSONANCE
+325,1 //DC_UGLYDANCE
+328,1 //DC_DONTFORGETME
2422,1 //WM_LULLABY_DEEPSLEEP
2423,1 //WM_SIRCLEOFNATURE
2430,1 //WM_SATURDAY_NIGHT_FEVER
diff --git a/db/re/skill_tree.txt b/db/re/skill_tree.txt
index aed125a33d..775d3aafb7 100644
--- a/db/re/skill_tree.txt
+++ b/db/re/skill_tree.txt
@@ -1306,7 +1306,8 @@
4020,394,10,47,5,316,1,46,5,0,0,0,0 //CG_ARROWVULCAN#Vulcan Arrow#
4020,395,5,45,5,315,7,0,0,0,0,0,0 //CG_MOONLIT#Sheltering Bliss#
4020,396,1,45,10,315,5,0,0,0,0,0,0 //CG_MARIONETTE#Marionette Control#
-4020,487,5,315,10,396,1,317,3,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom#
+//4020,487,5,315,10,396,1,317,3,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom# // Replaced with Skilled Special Singer
+4020,5068,1,315,10,396,1,317,3,0,0,0,0 //CG_SPECIALSINGER#Skilled Special Singer#
4020,488,5,45,10,315,10,0,0,0,0,0,0 //CG_HERMODE#Wand of Hermod#
4020,489,5,45,10,317,3,0,0,0,0,0,0 //CG_TAROTCARD#Tarot Card of Fate#
4020,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
@@ -1342,7 +1343,8 @@
4021,394,10,47,5,324,1,46,5,0,0,0,0 //CG_ARROWVULCAN#Vulcan Arrow#
4021,395,5,45,5,323,7,0,0,0,0,0,0 //CG_MOONLIT#Sheltering Bliss#
4021,396,1,45,10,323,5,0,0,0,0,0,0 //CG_MARIONETTE#Marionette Control#
-4021,487,5,323,10,396,1,325,3,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom#
+//4021,487,5,323,10,396,1,325,3,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom# // Replaced with Skilled Special Singer
+4021,5068,1,323,10,396,1,325,3,0,0,0,0 //CG_SPECIALSINGER#Skilled Special Singer#
4021,488,5,45,10,323,10,0,0,0,0,0,0 //CG_HERMODE#Wand of Hermod#
4021,489,5,45,10,325,3,0,0,0,0,0,0 //CG_TAROTCARD#Tarot Card of Fate#
4021,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
@@ -3668,7 +3670,8 @@
4075,394,10,47,5,316,1,46,5,0,0,0,0 //CG_ARROWVULCAN#Vulcan Arrow#
4075,395,5,45,5,315,7,0,0,0,0,0,0 //CG_MOONLIT#Sheltering Bliss#
4075,396,1,45,10,315,5,0,0,0,0,0,0 //CG_MARIONETTE#Marionette Control#
-4075,487,5,315,10,396,1,317,3,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom#
+//4075,487,5,315,10,396,1,317,3,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom# // Replaced with Skilled Special Singer
+4075,5068,1,315,10,396,1,317,3,0,0,0,0 //CG_SPECIALSINGER#Skilled Special Singer#
4075,488,5,45,10,315,10,0,0,0,0,0,0 //CG_HERMODE#Wand of Hermod#
4075,489,5,45,10,317,3,0,0,0,0,0,0 //CG_TAROTCARD#Tarot Card of Fate#
4075,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
@@ -3730,7 +3733,8 @@
4076,394,10,47,5,324,1,46,5,0,0,0,0 //CG_ARROWVULCAN#Vulcan Arrow#
4076,395,5,45,5,323,7,0,0,0,0,0,0 //CG_MOONLIT#Sheltering Bliss#
4076,396,1,45,10,323,5,0,0,0,0,0,0 //CG_MARIONETTE#Marionette Control#
-4076,487,5,323,10,396,1,325,3,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom#
+//4076,487,5,323,10,396,1,325,3,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom# // Replaced with Skilled Special Singer
+4076,5068,1,323,10,396,1,325,3,0,0,0,0 //CG_SPECIALSINGER#Skilled Special Singer#
4076,488,5,45,10,323,10,0,0,0,0,0,0 //CG_HERMODE#Wand of Hermod#
4076,489,5,45,10,325,3,0,0,0,0,0,0 //CG_TAROTCARD#Tarot Card of Fate#
4076,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
diff --git a/db/size_fix.txt b/db/size_fix.txt
deleted file mode 100644
index 435338cd34..0000000000
--- a/db/size_fix.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-// Size Fix Tables
-// Contains size fixes for weapon damage.
-//
-// Struture of Database:
-// Columns - Weapon type
-// Rows - Target size
-
-//Unarmed, Knife, 1H Sword, 2H Sword, 1H Spear, 2H Spears, 1H Axe, 2H Axe, Mace, 2H Mace, Staff, Bow, Knuckle, Musical Instrument, Whip, Book, Katar, Revolver, Rifle, Shotgun, Gatling Gun, Grenade Launcher, Fuuma Shuriken, 2H Staff
-100,100, 75, 75, 75, 75, 50, 50, 75,100,100,100,100, 75, 75,100, 75,100,100,100,100,100,100,100 // Size: Small
-100, 75,100, 75, 75, 75, 75, 75,100,100,100,100, 75,100,100,100,100,100,100,100,100,100,100,100 // Size: Medium
-100, 50, 75,100,100,100,100,100,100,100,100, 75, 50, 75, 50, 50, 75,100,100,100,100,100,100,100 // Size: Large
diff --git a/db/size_fix.yml b/db/size_fix.yml
new file mode 100644
index 0000000000..f288bdc0c2
--- /dev/null
+++ b/db/size_fix.yml
@@ -0,0 +1,89 @@
+# This file is a part of rAthena.
+# Copyright(C) 2019 rAthena Development Team
+# https://rathena.org - https://github.com/rathena
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+###########################################################################
+# Size Fix Database
+###########################################################################
+#
+# Size Fix Settings
+#
+###########################################################################
+# - Weapon Weapon type.
+# Small Small size modifier. (Default: 100)
+# Medium Medium size modifier. (Default: 100)
+# Large Large size modifier. (Default: 100)
+###########################################################################
+
+Header:
+ Type: SIZE_FIX_DB
+ Version: 1
+
+Body:
+ - Weapon: Fist
+ - Weapon: Dagger
+ Medium: 75
+ Large: 50
+ - Weapon: 1hSword
+ Small: 75
+ Large: 75
+ - Weapon: 2hSword
+ Small: 75
+ Medium: 75
+ - Weapon: 1hSpear
+ Small: 75
+ Medium: 75
+ - Weapon: 2hSpear
+ Small: 75
+ Medium: 75
+ - Weapon: 1hAxe
+ Small: 50
+ Medium: 75
+ - Weapon: 2hAxe
+ Small: 50
+ Medium: 75
+ - Weapon: Mace
+ Small: 75
+ - Weapon: 2hMace
+ - Weapon: Staff
+ - Weapon: Bow
+ Large: 75
+ - Weapon: Musical
+ Small: 75
+ Large: 75
+ - Weapon: Whip
+ Small: 75
+ Large: 50
+ - Weapon: Book
+ Large: 50
+ - Weapon: Katar
+ Small: 75
+ Large: 75
+ - Weapon: Revolver
+ - Weapon: Rifle
+ - Weapon: Gatling
+ - Weapon: Shotgun
+ - Weapon: Grenade
+ - Weapon: Huuma
+ - Weapon: 2hStaff
+
+Footer:
+ Imports:
+ - Path: db/pre-re/size_fix.yml
+ Mode: Prerenewal
+ - Path: db/re/size_fix.yml
+ Mode: Renewal
+ - Path: db/import/size_fix.yml
diff --git a/src/map/battle.cpp b/src/map/battle.cpp
index 4da3a504f7..684c833006 100644
--- a/src/map/battle.cpp
+++ b/src/map/battle.cpp
@@ -352,7 +352,11 @@ int battle_delay_damage(t_tick tick, int amotion, struct block_list *src, struct
}
if( ((d_tbl && check_distance_bl(target, d_tbl, sc->data[SC_DEVOTION]->val3)) || e_tbl) &&
- damage > 0 && skill_id != PA_PRESSURE && skill_id != CR_REFLECTSHIELD ){
+ damage > 0 && skill_id != CR_REFLECTSHIELD
+#ifndef RENEWAL
+ && skill_id != PA_PRESSURE
+#endif
+ ) {
struct map_session_data* tsd = BL_CAST( BL_PC, target );
if( tsd && pc_issit( tsd ) && battle_config.devotion_standup_fix ){
@@ -416,6 +420,7 @@ int battle_attr_ratio(int atk_elem, int def_type, int def_lv)
* @param atk_elem
* @param def_type
* @param def_lv
+ * @param flag
* @return damage
*/
int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 damage,int atk_elem,int def_type, int def_lv)
@@ -1091,15 +1096,24 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
if (sc && sc->data[SC_MAXPAIN])
return 0;
- if (skill_id == PA_PRESSURE || skill_id == HW_GRAVITATION)
+#ifndef RENEWAL
+ if (skill_id == PA_PRESSURE
+ || skill_id == HW_GRAVITATION
+ )
return damage; //These skills bypass everything else.
+#endif
if( sc && sc->count ) { // SC_* that reduce damage to 0.
- if( sc->data[SC_BASILICA] && !status_bl_has_mode(src,MD_STATUS_IMMUNE) ) {
+#ifdef RENEWAL
+ if (sc->data[SC_BASILICA_CELL]
+#else
+ if (sc->data[SC_BASILICA]
+#endif
+ && !status_bl_has_mode(src,MD_STATUS_IMMUNE) ) {
d->dmg_lv = ATK_BLOCK;
return 0;
}
- if( sc->data[SC_WHITEIMPRISON] ) { // Gravitation and Pressure do damage without removing the effect
+ if( sc->data[SC_WHITEIMPRISON] ) { // Pre-Renewal: Gravitation and Pressure do damage without removing the effect
if( skill_id == MG_NAPALMBEAT ||
skill_id == MG_SOULSTRIKE ||
skill_id == WL_SOULEXPANSION ||
@@ -1258,12 +1272,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
#ifdef RENEWAL
if( sc->data[SC_RAID] ) {
if (status_get_class_(bl) == CLASS_BOSS)
- damage += damage * 10 / 100;
+ damage += damage * 15 / 100;
else
- damage += damage * 20 / 100;
-
- if (--sc->data[SC_RAID]->val1 == 0)
- status_change_end(bl, SC_RAID, INVALID_TIMER);
+ damage += damage * 30 / 100;
}
#endif
@@ -1303,7 +1314,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
}
// Damage reductions
- // Assumptio doubles the def & mdef on RE mode, otherwise gives a reduction on the final damage. [Igniz]
+ // Assumptio increases DEF on RE mode, otherwise gives a reduction on the final damage. [Igniz]
#ifndef RENEWAL
if( sc->data[SC_ASSUMPTIO] ) {
if( map_flag_vs(bl->m) )
@@ -2276,6 +2287,10 @@ static int battle_skill_damage(struct block_list *src, struct block_list *target
* @return Bonus value based on party count
*/
int battle_calc_chorusbonus(struct map_session_data *sd) {
+#ifdef RENEWAL // No bonus in renewal
+ return 0;
+#endif
+
int members = 0;
if (!sd || !sd->status.party_id)
@@ -2468,7 +2483,11 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
break;
case SN_SHARPSHOOTING:
case MA_SHARPSHOOTING:
+#ifdef RENEWAL
+ cri += 300; // !TODO: Confirm new bonus
+#else
cri += 200;
+#endif
break;
case NJ_KIRIKAGE:
cri += 250 + 50*skill_lv;
@@ -2657,6 +2676,11 @@ static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct
if(sd && pc_checkskill(sd,AS_SONICACCEL) > 0)
hitrate += hitrate * 50 / 100;
break;
+#ifdef RENEWAL
+ case RG_BACKSTAP:
+ hitrate += skill_lv; // !TODO: What's the rate increase?
+ break;
+#endif
case RK_SONICWAVE:
hitrate += hitrate * 3 * skill_lv / 100; // !TODO: Confirm the hitrate bonus
break;
@@ -3152,6 +3176,7 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *
}
switch (tstatus->size) { //Size-fix. Is this modified by weapon perfection?
+ // !TODO: Confirm new size modifiers
case SZ_SMALL: //Small: 125%
ATK_RATE(wd->damage, wd->damage2, 125);
RE_ALLATK_RATE(wd, 125);
@@ -3547,7 +3572,11 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
break;
case KN_BRANDISHSPEAR:
case ML_BRANDISH: {
+#ifdef RENEWAL
+ int ratio = 100 + 20 * skill_lv + sstatus->str; // !TODO: Confirm STR role
+#else
int ratio = 100 + 20 * skill_lv;
+#endif
skillratio += -100 + ratio;
if(skill_lv > 3 && wd->miscflag == 0)
@@ -3576,6 +3605,10 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
break;
case AS_SONICBLOW:
skillratio += 300 + 40 * skill_lv;
+#ifdef RENEWAL
+ if (tstatus->hp < tstatus->max_hp >> 1)
+ skillratio += skillratio / 2;
+#endif
break;
case TF_SPRINKLESAND:
skillratio += 30;
@@ -3621,13 +3654,17 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += (200 + 40 * skill_lv) / 2;
else
skillratio += 200 + 40 * skill_lv;
+#ifdef RENEWAL
+ if (sd && sd->status.weapon == W_DAGGER)
+ skillratio *= 2;
+#endif
break;
case RG_RAID:
#ifdef RENEWAL
if (status_get_class_(target) == CLASS_BOSS)
- skillratio += 10 * skill_lv;
+ skillratio += 10 * skill_lv; // !TODO: Did this change as well?
else
- skillratio += 20 * skill_lv;
+ skillratio += 50 + skill_lv * 150;
#else
skillratio += 40 * skill_lv;
#endif
@@ -3639,7 +3676,11 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += 20 * skill_lv;
break;
case CR_SHIELDBOOMERANG:
+#ifdef RENEWAL
+ skillratio += -100 + skill_lv * 80;
+#else
skillratio += 30 * skill_lv;
+#endif
break;
case NPC_DARKCROSS:
case CR_HOLYCROSS:
@@ -3655,18 +3696,36 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
break;
case AM_ACIDTERROR:
#ifdef RENEWAL
- skillratio += 200 + 80 * skill_lv;
+ skillratio += -100 + 200 * skill_lv;
+ if (sd && pc_checkskill(sd, AM_LEARNINGPOTION))
+ skillratio += 100; // !TODO: What's this bonus increase?
#else
skillratio += 40 * skill_lv;
#endif
break;
case MO_FINGEROFFENSIVE:
+#ifdef RENEWAL
+ skillratio += 500 + skill_lv * 2;
+ if (tsc && tsc->data[SC_BLADESTOP])
+ skillratio += skillratio / 2;
+#else
skillratio += 50 * skill_lv;
+#endif
break;
case MO_INVESTIGATE:
+#ifdef RENEWAL
+ skillratio += -100 + 100 * skill_lv;
+ if (tsc && tsc->data[SC_BLADESTOP])
+ skillratio += skillratio / 2;
+#else
skillratio += 75 * skill_lv;
+#endif
break;
case MO_EXTREMITYFIST:
+#ifdef RENEWAL
+ if (wd->miscflag&1)
+ skillratio += 100; // More than 5 spirit balls active
+#endif
skillratio += 100 * (7 + sstatus->sp / 10);
skillratio = min(500000,skillratio); //We stop at roughly 50k SP for overflow protection
break;
@@ -3674,29 +3733,56 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += 20 * skill_lv;
break;
case MO_CHAINCOMBO:
+#ifdef RENEWAL
+ skillratio += 150 + 50 * skill_lv;
+#else
skillratio += 50 + 50 * skill_lv;
+#endif
break;
case MO_COMBOFINISH:
+#ifdef RENEWAL
+ skillratio += 450 + 50 * skill_lv + sstatus->str; // !TODO: How does STR play a role?
+#else
skillratio += 140 + 60 * skill_lv;
+#endif
if (sc->data[SC_GT_ENERGYGAIN])
skillratio += skillratio * 50 / 100;
break;
case BA_MUSICALSTRIKE:
case DC_THROWARROW:
+#ifdef RENEWAL
+ skillratio += 10 + 40 * skill_lv;
+#else
skillratio += 25 + 25 * skill_lv;
+#endif
break;
case CH_TIGERFIST:
+#ifdef RENEWAL
+ skillratio += 400 + 150 * skill_lv;
+ RE_LVL_DMOD(100);
+#else
skillratio += -60 + 100 * skill_lv;
+#endif
if (sc->data[SC_GT_ENERGYGAIN])
skillratio += skillratio * 50 / 100;
break;
case CH_CHAINCRUSH:
+#ifdef RENEWAL
+ skillratio += -100 + 200 * skill_lv;
+ RE_LVL_DMOD(100);
+#else
skillratio += 300 + 100 * skill_lv;
+#endif
if (sc->data[SC_GT_ENERGYGAIN])
skillratio += skillratio * 50 / 100;
break;
case CH_PALMSTRIKE:
+#ifdef RENEWAL
+ skillratio += 100 + 100 * skill_lv + sstatus->str; // !TODO: How does STR play a role?
+ RE_LVL_DMOD(100);
+#else
skillratio += 100 + 100 * skill_lv;
+#endif
break;
case LK_HEADCRUSH:
skillratio += 40 * skill_lv;
@@ -3710,21 +3796,41 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
// Renewal: skill ratio applies to entire damage [helvetica]
case LK_SPIRALPIERCE:
case ML_SPIRALPIERCE:
- skillratio += 50 * skill_lv;
+ skillratio += 50 + 50 * skill_lv;
+ RE_LVL_DMOD(100);
break;
#endif
case ASC_METEORASSAULT:
+#ifdef RENEWAL
+ skillratio += 100 + 120 * skill_lv;
+ RE_LVL_DMOD(100);
+#else
skillratio += -60 + 40 * skill_lv;
+#endif
break;
case SN_SHARPSHOOTING:
case MA_SHARPSHOOTING:
+#ifdef RENEWAL
+ skillratio += 50 + 200 * skill_lv;
+ RE_LVL_DMOD(100);
+#else
skillratio += 100 + 50 * skill_lv;
+#endif
break;
case CG_ARROWVULCAN:
+#ifdef RENEWAL
+ skillratio += 400 + 100 * skill_lv;
+ RE_LVL_DMOD(100);
+#else
skillratio += 100 + 100 * skill_lv;
+#endif
break;
case AS_SPLASHER:
+#ifdef RENEWAL
+ skillratio += 400 + 100 * skill_lv;
+#else
skillratio += 400 + 50 * skill_lv;
+#endif
if(sd)
skillratio += 20 * pc_checkskill(sd,AS_POISONREACT);
break;
@@ -3738,7 +3844,12 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += -10 + 10 * skill_lv;
break;
case PA_SHIELDCHAIN:
+#ifdef RENEWAL
+ skillratio = 60 + 40 * skill_lv;
+ RE_LVL_DMOD(100);
+#else
skillratio += 30 * skill_lv;
+#endif
break;
case WS_CARTTERMINATION:
i = 10 * (16 - skill_lv);
@@ -4529,10 +4640,6 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st
#ifdef RENEWAL
if (sc->data[SC_WATK_ELEMENT] && skill_id != ASC_METEORASSAULT)
ATK_ADDRATE(wd->weaponAtk, wd->weaponAtk2, sc->data[SC_WATK_ELEMENT]->val2);
- if (sc->data[SC_IMPOSITIO])
- ATK_ADD(wd->equipAtk, wd->equipAtk2, sc->data[SC_IMPOSITIO]->val2);
- if (sc->data[SC_VOLCANO])
- ATK_ADD(wd->equipAtk, wd->equipAtk2, sc->data[SC_VOLCANO]->val2);
if (sc->data[SC_DRUMBATTLE])
ATK_ADD(wd->equipAtk, wd->equipAtk2, sc->data[SC_DRUMBATTLE]->val2);
if (sc->data[SC_MADNESSCANCEL])
@@ -4579,18 +4686,6 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st
break; // skills above have no effect with EDP
#ifdef RENEWAL
- // renewal EDP mode requires renewal enabled as well
- // Renewal EDP: damage gets a half modifier on top of EDP bonus for skills [helvetica]
- // * Sonic Blow
- // * Soul Breaker
- // * Counter Slash
- // * Cross Impact
- case AS_SONICBLOW:
- case ASC_BREAKER:
- case GC_COUNTERSLASH:
- case GC_CROSSIMPACT:
- ATK_RATE(wd->weaponAtk, wd->weaponAtk2, 50);
- ATK_RATE(wd->equipAtk, wd->equipAtk2, 50);
default: // fall through to apply EDP bonuses
// Renewal EDP formula [helvetica]
// weapon atk * (1 + (edp level * .8))
@@ -4729,11 +4824,6 @@ static void battle_calc_defense_reduction(struct Damage* wd, struct block_list *
defType def1 = status_get_def(target); //Don't use tstatus->def1 due to skill timer reductions.
short def2 = tstatus->def2;
-#ifdef RENEWAL
- if( tsc && tsc->data[SC_ASSUMPTIO] )
- def1 <<= 1; // only eDEF is doubled
-#endif
-
if (sd) {
int i = sd->ignore_def_by_race[tstatus->race] + sd->ignore_def_by_race[RC_ALL];
i += sd->ignore_def_by_class[tstatus->class_] + sd->ignore_def_by_class[CLASS_ALL];
@@ -4894,11 +4984,11 @@ static void battle_calc_attack_post_defense(struct Damage* wd, struct block_list
&& skill_id != LK_SPIRALPIERCE && skill_id != ML_SPIRALPIERCE
#endif
) {
- int lv = sc->data[SC_AURABLADE]->val1;
#ifdef RENEWAL
- lv *= ((skill_id == LK_SPIRALPIERCE || skill_id == ML_SPIRALPIERCE)?wd->div_:1); // +100 per hit in lv 5
+ ATK_ADD(wd->damage, wd->damage2, (3 + sc->data[SC_AURABLADE]->val1) * status_get_lv(src)); // !TODO: Confirm formula
+#else
+ ATK_ADD(wd->damage, wd->damage2, 20 * sc->data[SC_AURABLADE]->val1);
#endif
- ATK_ADD(wd->damage, wd->damage2, 20*lv);
}
}
@@ -5274,12 +5364,8 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
}
break;
case MO_FINGEROFFENSIVE:
- if(sd) {
- if (battle_config.finger_offensive_type)
- wd.div_ = 1;
- else
- wd.div_ = sd->spiritball_old;
- }
+ if (sd && battle_config.finger_offensive_type)
+ wd.div_ = 1;
break;
case KN_PIERCE:
@@ -5297,6 +5383,10 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
//Fall through
case KN_SPEARSTAB:
case KN_BOWLINGBASH:
+#ifdef RENEWAL
+ if (skill_id == KN_BOWLINGBASH && sd && sd->status.weapon == W_2HSWORD)
+ wd.div_ = cap_value(wd.miscflag, 2, 4);
+#endif
case MS_BOWLINGBASH:
case MO_BALKYOUNG:
case TK_TURNKICK:
@@ -5960,10 +6050,25 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
skillratio += 30 * skill_lv;
break;
case WZ_STORMGUST:
+#ifdef RENEWAL
+ skillratio -= 30; // Offset only once
+ skillratio += 50 * skill_lv;
+#else
skillratio += 40 * skill_lv;
+#endif
break;
+#ifdef RENEWAL
+ case WZ_EARTHSPIKE:
+ skillratio += 100;
+ break;
+#endif
case HW_NAPALMVULCAN:
+#ifdef RENEWAL
+ skillratio += -100 + 70 * skill_lv;
+ RE_LVL_DMOD(100);
+#else
skillratio += 25;
+#endif
break;
case SL_STIN: //Target size must be small (0) for full damage
skillratio += (tstatus->size != SZ_SMALL ? -99 : 10 * skill_lv);
@@ -6032,22 +6137,38 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
break;
#ifdef RENEWAL
case WZ_HEAVENDRIVE:
+ skillratio += -100 + skill_lv * 100 + skill_lv * 25;
+ break;
case WZ_METEOR:
skillratio += 25;
break;
case WZ_VERMILION:
- if(sd) {
- int per = 0;
- while ((++per) < skill_lv)
- skillratio += per * 5; //100% 105% 115% 130% 150% 175% 205% 240% 280% 325%
- } else {
+ if(sd)
+ skillratio += 25 + skill_lv * 5;
+ else
skillratio += 20 * skill_lv - 20; //Monsters use old formula
- }
+ break;
+ case BA_DISSONANCE:
+ skillratio += skill_lv * 10;
+ if (sd)
+ skillratio += 3 * pc_checkskill(sd, BA_MUSICALLESSON);
+ break;
+ case HW_GRAVITATION:
+ skillratio += -100 + 50 * skill_lv;
+ RE_LVL_DMOD(100);
+ break;
+ case PA_PRESSURE:
+ skillratio += -100 + 500 + 150 * skill_lv;
+ RE_LVL_DMOD(100);
break;
#else
case WZ_VERMILION:
skillratio += 20 * skill_lv - 20;
break;
+ case PR_MAGNUS:
+ if (battle_check_undead(tstatus->race, tstatus->def_ele) || tstatus->race == RC_DEMON)
+ skillratio += 30;
+ break;
#endif
case AB_JUDEX:
skillratio += -100 + 300 + 40 * skill_lv;
@@ -6333,10 +6454,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
if(!flag.imdef){
defType mdef = tstatus->mdef;
int mdef2= tstatus->mdef2;
-#ifdef RENEWAL
- if(tsc && tsc->data[SC_ASSUMPTIO])
- mdef <<= 1; // only eMDEF is doubled
-#endif
+
if (sc && sc->data[SC_EXPIATIO]) {
i = 5 * sc->data[SC_EXPIATIO]->val1; // 5% per level
@@ -6419,12 +6537,17 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
struct Damage wd = battle_calc_weapon_attack(src,target,skill_id,skill_lv,mflag);
ad.damage = battle_attr_fix(src, target, wd.damage + ad.damage, s_ele, tstatus->def_ele, tstatus->ele_lv) * (100 + 40 * skill_lv) / 100;
+#ifdef RENEWAL
+ if (src == target)
+ ad.damage = 0;
+#else
if(src == target) {
if(src->type == BL_PC)
ad.damage = ad.damage / 2;
else
ad.damage = 0;
}
+#endif
}
break;
}
@@ -6553,9 +6676,14 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
//Blitz-beat Damage
if(!sd || !(skill = pc_checkskill(sd,HT_STEELCROW)))
skill = 0;
+#ifdef RENEWAL
+ md.damage = (sstatus->dex / 10 + sstatus->agi / 2 + skill * 3 + 40) * 2;
+ RE_LVL_MDMOD(100);
+#else
md.damage = (sstatus->dex / 10 + sstatus->int_ / 2 + skill * 3 + 40) * 2;
if(mflag > 1) //Autocasted Blitz
nk.set(NK_SPLASHSPLIT);
+#endif
if (skill_id == SN_FALCONASSAULT) {
//Div fix of Blitzbeat
DAMAGE_DIV_FIX2(md.damage, skill_get_num(HT_BLITZBEAT, 5));
@@ -6564,11 +6692,13 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
}
}
break;
+#ifndef RENEWAL
case BA_DISSONANCE:
md.damage = 30 + skill_lv * 10;
if (sd)
md.damage += 3 * pc_checkskill(sd,BA_MUSICALLESSON);
break;
+#endif
case NPC_SELFDESTRUCTION:
md.damage = sstatus->hp;
break;
@@ -6609,17 +6739,15 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
nk.set(NK_IGNOREELEMENT); //These two are not properties of the weapon based part.
#endif
break;
+#ifndef RENEWAL
case HW_GRAVITATION:
-#ifdef RENEWAL
- md.damage = 500 + 100 * skill_lv;
-#else
md.damage = 200 + 200 * skill_lv;
-#endif
md.dmotion = 0; //No flinch animation
break;
case PA_PRESSURE:
md.damage = 500 + 300 * skill_lv;
break;
+#endif
case PA_GOSPEL:
if (mflag > 0)
md.damage = (rnd() % 4000) + 1500;
@@ -7284,10 +7412,19 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
}
}
- if( tsc && tsc->data[SC_BLADESTOP_WAIT] && status_get_class_(src) != CLASS_BOSS && (src->type == BL_PC || tsd == NULL || distance_bl(src, target) <= (tsd->status.weapon == W_FIST ? 1 : 2)) )
+ if( tsc && tsc->data[SC_BLADESTOP_WAIT] &&
+#ifndef RENEWAL
+ status_get_class_(src) != CLASS_BOSS &&
+#endif
+ (src->type == BL_PC || tsd == NULL || distance_bl(src, target) <= (tsd->status.weapon == W_FIST ? 1 : 2)) )
{
uint16 skill_lv = tsc->data[SC_BLADESTOP_WAIT]->val1;
int duration = skill_get_time2(MO_BLADESTOP,skill_lv);
+
+#ifdef RENEWAL
+ if (status_get_class_(src) == CLASS_BOSS)
+ duration = 2000; // Only lasts 2 seconds for Boss monsters
+#endif
status_change_end(target, SC_BLADESTOP_WAIT, INVALID_TIMER);
if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration))
{ //Target locked.
@@ -7299,7 +7436,12 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
}
if(sd && (skillv = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0) {
- int triple_rate= 30 - skillv; //Base Rate
+#ifdef RENEWAL
+ int triple_rate = 30; //Base Rate
+#else
+ int triple_rate = 30 - skillv; //Base Rate
+#endif
+
if (sc && sc->data[SC_SKILLRATE_UP] && sc->data[SC_SKILLRATE_UP]->val1 == MO_TRIPLEATTACK) {
triple_rate+= triple_rate*(sc->data[SC_SKILLRATE_UP]->val2)/100;
status_change_end(src, SC_SKILLRATE_UP, INVALID_TIMER);
diff --git a/src/map/clif.cpp b/src/map/clif.cpp
index 74bf7f0715..1ebfd87d55 100644
--- a/src/map/clif.cpp
+++ b/src/map/clif.cpp
@@ -8030,11 +8030,34 @@ void clif_pet_food(struct map_session_data *sd,int foodid,int fail)
/// 01cd { .L }*7
void clif_autospell(struct map_session_data *sd,uint16 skill_lv)
{
- int fd;
-
nullpo_retv(sd);
- fd=sd->fd;
+ int fd = sd->fd;
+
+#ifdef RENEWAL
+ uint16 autospell_skill[][2] = {
+ { MG_FIREBOLT, 0 }, { MG_COLDBOLT, 0 }, { MG_LIGHTNINGBOLT, 0 },
+ { MG_SOULSTRIKE, 3 }, { MG_FIREBALL, 3 },
+ { WZ_EARTHSPIKE, 6 }, { MG_FROSTDIVER, 6 },
+ { MG_THUNDERSTORM, 9 }, { WZ_HEAVENDRIVE, 9 }
+ };
+ int count = 0;
+
+ WFIFOHEAD(fd, 2 * 6 + 4);
+ WFIFOW(fd, 0) = 0x442;
+
+ for (int i = 0; i < ARRAYLENGTH(autospell_skill); i++) {
+ if (skill_lv > autospell_skill[i][1] && pc_checkskill(sd, autospell_skill[i][0])) {
+ WFIFOW(fd, 8 + count * 2) = autospell_skill[i][0];
+ count++;
+ }
+ }
+
+ WFIFOW(fd, 2) = 8 + count * 2;
+ WFIFOL(fd, 4) = count;
+
+ WFIFOSET(fd, WFIFOW(fd, 2));
+#else
WFIFOHEAD(fd,packet_len(0x1cd));
WFIFOW(fd, 0)=0x1cd;
@@ -8068,6 +8091,8 @@ void clif_autospell(struct map_session_data *sd,uint16 skill_lv)
WFIFOL(fd,26)= 0x00000000;
WFIFOSET(fd,packet_len(0x1cd));
+#endif
+
sd->menuskill_id = SA_AUTOSPELL;
sd->menuskill_val = skill_lv;
}
@@ -12190,7 +12215,11 @@ static void clif_parse_UseSkillToPos_homun(struct homun_data *hd, struct map_ses
return;
}
- if( hd->sc.data[SC_BASILICA] )
+#ifdef RENEWAL
+ if (hd->sc.data[SC_BASILICA_CELL])
+#else
+ if (hd->sc.data[SC_BASILICA])
+#endif
return;
lv = hom_checkskill(hd, skill_id);
if( skill_lv > lv )
@@ -12239,7 +12268,11 @@ static void clif_parse_UseSkillToPos_mercenary(struct mercenary_data *md, struct
return;
}
- if( md->sc.data[SC_BASILICA] )
+#ifdef RENEWAL
+ if (md->sc.data[SC_BASILICA_CELL])
+#else
+ if (md->sc.data[SC_BASILICA])
+#endif
return;
lv = mercenary_checkskill(md, skill_id);
if( skill_lv > lv )
@@ -12317,8 +12350,10 @@ void clif_parse_skill_toid( struct map_session_data* sd, uint16 skill_id, uint16
if( sd->sc.option&OPTION_COSTUME )
return;
+#ifndef RENEWAL
if( sd->sc.data[SC_BASILICA] && (skill_id != HP_BASILICA || sd->sc.data[SC_BASILICA]->val4 != sd->bl.id) )
return; // On basilica only caster can use Basilica again to stop it.
+#endif
if( sd->menuskill_id ) {
if( sd->menuskill_id == SA_TAMINGMONSTER ) {
@@ -12427,8 +12462,10 @@ static void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, uin
if( sd->sc.option&OPTION_COSTUME )
return;
+#ifndef RENEWAL
if( sd->sc.data[SC_BASILICA] && (skill_id != HP_BASILICA || sd->sc.data[SC_BASILICA]->val4 != sd->bl.id) )
return; // On basilica only caster can use Basilica again to stop it.
+#endif
if( sd->menuskill_id ) {
if( sd->menuskill_id == SA_TAMINGMONSTER ) {
@@ -18740,23 +18777,27 @@ int clif_skill_itemlistwindow( struct map_session_data *sd, uint16 skill_id, uin
}
/*==========================================
- * Select a skill into a given list (used by SC_AUTOSHADOWSPELL)
+ * Select a skill into a given list (used by SA_AUTOSPELL/SC_AUTOSHADOWSPELL)
* 0443 .L .W (CZ_SKILL_SELECT_RESPONSE)
* RFIFOL(fd,2) - type (currently not used)
*------------------------------------------*/
void clif_parse_SkillSelectMenu(int fd, struct map_session_data *sd) {
struct s_packet_db* info = &packet_db[RFIFOW(fd,0)];
//int type = RFIFOL(fd,info->pos[0]); //WHY_LOWERVER_COMPATIBILITY = 0x0, WHY_SC_AUTOSHADOWSPELL = 0x1,
- if( sd->menuskill_id != SC_AUTOSHADOWSPELL )
- return;
- if( pc_istrading(sd) ) {
- clif_skill_fail(sd,sd->ud.skill_id,USESKILL_FAIL_LEVEL,0);
- clif_menuskill_clear(sd);
- return;
- }
+ if (sd->menuskill_id == SA_AUTOSPELL) {
+ sd->state.workinprogress = WIP_DISABLE_NONE;
+ skill_autospell(sd, RFIFOW(fd, info->pos[1]));
+ } else if (sd->menuskill_id == SC_AUTOSHADOWSPELL) {
+ if (pc_istrading(sd)) {
+ clif_skill_fail(sd, sd->ud.skill_id, USESKILL_FAIL_LEVEL, 0);
+ clif_menuskill_clear(sd);
+ return;
+ }
- skill_select_menu(sd,RFIFOW(fd,info->pos[1]));
+ skill_select_menu(sd, RFIFOW(fd, info->pos[1]));
+ } else
+ return;
clif_menuskill_clear(sd);
}
diff --git a/src/map/map-server.vcxproj b/src/map/map-server.vcxproj
index a26460272b..a223dd92b5 100644
--- a/src/map/map-server.vcxproj
+++ b/src/map/map-server.vcxproj
@@ -359,6 +359,7 @@
+
diff --git a/src/map/mob.cpp b/src/map/mob.cpp
index f48c4d942d..ccc310e037 100644
--- a/src/map/mob.cpp
+++ b/src/map/mob.cpp
@@ -2534,8 +2534,13 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
) { //Experience calculation.
int bonus = 100; //Bonus on top of your share (common to all attackers).
int pnum = 0;
+#ifndef RENEWAL
if (md->sc.data[SC_RICHMANKIM])
bonus += md->sc.data[SC_RICHMANKIM]->val2;
+#else
+ if (sd && sd->sc.data[SC_RICHMANKIM])
+ bonus += sd->sc.data[SC_RICHMANKIM]->val2;
+#endif
if(sd) {
temp = status_get_class(&md->bl);
if(sd->sc.data[SC_MIRACLE]) i = 2; //All mobs are Star Targets
diff --git a/src/map/pc.cpp b/src/map/pc.cpp
index 8f609f5059..658984bd83 100755
--- a/src/map/pc.cpp
+++ b/src/map/pc.cpp
@@ -8851,6 +8851,11 @@ int pc_itemheal(struct map_session_data *sd, int itemid, int hp, int sp)
sp += sp / 10;
}
+#ifdef RENEWAL
+ if (sd->sc.data[SC_APPLEIDUN])
+ hp += sd->sc.data[SC_APPLEIDUN]->val3 / 100;
+#endif
+
if (penalty > 0) {
hp -= hp * penalty / 100;
sp -= sp * penalty / 100;
@@ -9449,7 +9454,12 @@ bool pc_can_attack( struct map_session_data *sd, int target_id ) {
if (sd->state.block_action & PCBLOCK_ATTACK)
return false;
- if( sd->sc.data[SC_BASILICA] ||
+ if(
+#ifdef RENEWAL
+ sd->sc.data[SC_BASILICA_CELL] ||
+#else
+ sd->sc.data[SC_BASILICA] ||
+#endif
sd->sc.data[SC__SHADOWFORM] ||
sd->sc.data[SC_CURSEDCIRCLE_ATKER] ||
sd->sc.data[SC_CURSEDCIRCLE_TARGET] ||
@@ -10560,6 +10570,12 @@ bool pc_unequipitem(struct map_session_data *sd, int n, int flag) {
status_change_end(&sd->bl, SC_ARMOR_RESIST, INVALID_TIMER);
}
+ // On equipment change
+#ifndef RENEWAL
+ if (!(flag&4))
+ status_change_end(&sd->bl, SC_CONCENTRATION, INVALID_TIMER);
+#endif
+
// On ammo change
if (sd->inventory_data[n]->type == IT_AMMO && (sd->inventory_data[n]->nameid != ITEMID_SILVER_BULLET || sd->inventory_data[n]->nameid != ITEMID_PURIFICATION_BULLET || sd->inventory_data[n]->nameid != ITEMID_SILVER_BULLET_))
status_change_end(&sd->bl, SC_P_ALTER, INVALID_TIMER);
@@ -12702,13 +12718,19 @@ void pc_bonus_script_clear(struct map_session_data *sd, uint16 flag) {
*/
void pc_cell_basilica(struct map_session_data *sd) {
nullpo_retv(sd);
-
+
+#ifdef RENEWAL
+ enum sc_type type = SC_BASILICA_CELL;
+#else
+ enum sc_type type = SC_BASILICA;
+#endif
+
if (!map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKBASILICA)) {
- if (sd->sc.data[SC_BASILICA])
- status_change_end(&sd->bl,SC_BASILICA,INVALID_TIMER);
+ if (sd->sc.data[type])
+ status_change_end(&sd->bl, type,INVALID_TIMER);
}
- else if (!sd->sc.data[SC_BASILICA])
- sc_start(&sd->bl,&sd->bl,SC_BASILICA,100,0,INFINITE_TICK);
+ else if (!sd->sc.data[type])
+ sc_start(&sd->bl,&sd->bl, type,100,0,INFINITE_TICK);
}
/** [Cydh]
diff --git a/src/map/pc.hpp b/src/map/pc.hpp
index 60505ba55c..b52784b686 100644
--- a/src/map/pc.hpp
+++ b/src/map/pc.hpp
@@ -148,7 +148,7 @@ struct s_addele2 {
};
struct weapon_data {
- int atkmods[3];
+ int atkmods[SZ_ALL];
// all the variables except atkmods get zero'ed in each call of status_calc_pc
// NOTE: if you want to add a non-zeroed variable, you need to update the memset call
// in status_calc_pc as well! All the following are automatically zero'ed. [Skotlex]
diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp
index b3cecde103..2d0171ff73 100644
--- a/src/map/script_constants.hpp
+++ b/src/map/script_constants.hpp
@@ -1544,6 +1544,8 @@
export_constant(SC_WEAPONBLOCK_ON);
export_constant(SC_ENTRY_QUEUE_APPLY_DELAY);
export_constant(SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT);
+ export_constant(SC_ADAPTATION);
+ export_constant(SC_BASILICA_CELL);
#ifdef RENEWAL
export_constant(SC_EXTREMITYFIST2);
#endif
diff --git a/src/map/skill.cpp b/src/map/skill.cpp
index f940df7f89..475aa08760 100755
--- a/src/map/skill.cpp
+++ b/src/map/skill.cpp
@@ -532,15 +532,13 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk
tsc = status_get_sc(target);
switch( skill_id ) {
+#ifndef RENEWAL
case BA_APPLEIDUN:
-#ifdef RENEWAL
- hp = 100 + 5 * skill_lv + (status_get_vit(src) / 2); // HP recovery
-#else
hp = 30 + 5 * skill_lv + (status_get_vit(src) / 2); // HP recovery
-#endif
if (sd)
hp += 5 * pc_checkskill(sd, BA_MUSICALLESSON);
break;
+#endif
case PR_SANCTUARY:
hp = (skill_lv > 6) ? 777 : skill_lv * 100;
break;
@@ -638,6 +636,10 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk
hp_bonus += sc->data[SC_GLASTHEIM_HEAL]->val1;
#else
hp += hp * sc->data[SC_GLASTHEIM_HEAL]->val1 / 100;
+#endif
+#ifdef RENEWAL
+ if (sc->data[SC_ASSUMPTIO])
+ hp_bonus += sc->data[SC_ASSUMPTIO]->val1 * 2;
#endif
}
@@ -1386,7 +1388,11 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
break;
case WZ_VERMILION:
+#ifdef RENEWAL
+ sc_start(src,bl,SC_BLIND,10 + 5 * skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv));
+#else
sc_start(src,bl,SC_BLIND,min(4*skill_lv,40),skill_lv,skill_get_time2(skill_id,skill_lv));
+#endif
break;
case WZ_HEAVENDRIVE:
@@ -1444,18 +1450,27 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
case AM_ACIDTERROR:
sc_start2(src,bl,SC_BLEEDING,(skill_lv*3),skill_lv,src->id,skill_get_time2(skill_id,skill_lv));
+#ifdef RENEWAL
+ if (skill_break_equip(src,bl, EQP_ARMOR, (1000 * skill_lv + 500) - 1000, BCT_ENEMY))
+#else
if (skill_break_equip(src,bl, EQP_ARMOR, 100*skill_get_time(skill_id,skill_lv), BCT_ENEMY))
+#endif
clif_emotion(bl,ET_HUK);
break;
case AM_DEMONSTRATION:
+#ifdef RENEWAL
+ skill_break_equip(src,bl, EQP_WEAPON, 300 * skill_lv, BCT_ENEMY);
+#else
skill_break_equip(src,bl, EQP_WEAPON, 100*skill_lv, BCT_ENEMY);
+#endif
break;
case CR_SHIELDCHARGE:
sc_start(src,bl,SC_STUN,(15+skill_lv*5),skill_lv,skill_get_time2(skill_id,skill_lv));
break;
+#ifndef RENEWAL
case PA_PRESSURE:
status_percent_damage(src, bl, 0, 15+5*skill_lv, false);
//Fall through
@@ -1464,13 +1479,13 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
attack_type |= BF_NORMAL;
attack_type |= BF_WEAPON;
break;
+#endif
case RG_RAID:
sc_start(src,bl,SC_STUN,(10+3*skill_lv),skill_lv,skill_get_time(skill_id,skill_lv));
sc_start(src,bl,SC_BLIND,(10+3*skill_lv),skill_lv,skill_get_time2(skill_id,skill_lv));
-
#ifdef RENEWAL
- sc_start(src,bl,SC_RAID,100,7,5000);
+ sc_start(src, bl, SC_RAID, 100, skill_lv, 10000); // Hardcoded to 10 seconds since skill_cast_db is full
break;
case RG_BACKSTAP:
@@ -1494,7 +1509,11 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
rate = 5+5*skill_lv;
if(sd && (skill=pc_checkskill(sd,DC_DANCINGLESSON)))
rate += 5+skill;
+#ifdef RENEWAL
+ status_zap(bl, 0, 2 * skill_lv + 10); // !TODO: How does caster's DEX/AGI play a role?
+#else
status_zap(bl, 0, rate);
+#endif
break;
case SL_STUN:
if (tstatus->size==SZ_MEDIUM) //Only stuns mid-sized mobs.
@@ -1813,7 +1832,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
status_change_end(bl, SC_HUMMING, INVALID_TIMER);
status_change_end(bl, SC_FORTUNE, INVALID_TIMER);
status_change_end(bl, SC_SERVICE4U, INVALID_TIMER);
+#ifndef RENEWAL
status_change_end(bl, SC_LONGING, INVALID_TIMER);
+#endif
status_change_end(bl, SC_SWINGDANCE, INVALID_TIMER);
status_change_end(bl, SC_SYMPHONYOFLOVER, INVALID_TIMER);
status_change_end(bl, SC_MOONLITSERENADE, INVALID_TIMER);
@@ -2105,6 +2126,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
if( sd && battle_config.equip_self_break_rate )
{ // Self weapon breaking
rate = battle_config.equip_natural_break_rate;
+#ifndef RENEWAL
if( sc )
{
if(sc->data[SC_OVERTHRUST])
@@ -2112,6 +2134,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
if(sc->data[SC_MAXOVERTHRUST])
rate += 10;
}
+#endif
if( rate )
skill_break_equip(src,src, EQP_WEAPON, rate, BCT_SELF);
}
@@ -2805,7 +2828,7 @@ bool skill_strip_equip(struct block_list *src, struct block_list *target, uint16
BLOWN_NO_KNOCKBACK_MAP - at WOE/BG map
BLOWN_MD_KNOCKBACK_IMMUNE - if target is MD_KNOCKBACK_IMMUNE
BLOWN_TARGET_NO_KNOCKBACK - if target has 'special_state.no_knockback'
- BLOWN_TARGET_BASILICA - if target is in Basilica area
+ BLOWN_TARGET_BASILICA - if target is in Basilica area (Pre-Renewal)
* @return Number of knocked back cells done
*/
short skill_blown(struct block_list* src, struct block_list* target, char count, int8 dir, enum e_skill_blown flag)
@@ -3304,9 +3327,11 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
if (tsc && tsc->data[SC_TRICKDEAD])
return 0;
+#ifndef RENEWAL
//When Gravitational Field is active, damage can only be dealt by Gravitational Field and Autospells
if(sd && sc && sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF && skill_id != HW_GRAVITATION && !sd->state.autocast)
return 0;
+#endif
dmg = battle_calc_attack(attack_type,src,bl,skill_id,skill_lv,flag&0xFFF);
@@ -3649,7 +3674,11 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
// Instant damage
if( !dmg.amotion ) {
- if( (!tsc || (!tsc->data[SC_DEVOTION] && skill_id != CR_REFLECTSHIELD && !tsc->data[SC_WATER_SCREEN_OPTION]) || skill_id == HW_GRAVITATION || skill_id == NPC_EVILLAND) && !shadow_flag )
+ if( (!tsc || (!tsc->data[SC_DEVOTION] && skill_id != CR_REFLECTSHIELD && !tsc->data[SC_WATER_SCREEN_OPTION])
+#ifndef RENEWAL
+ || skill_id == HW_GRAVITATION
+#endif
+ || skill_id == NPC_EVILLAND) && !shadow_flag )
status_fix_damage(src,bl,damage,dmg.dmotion); //Deal damage before knockback to allow stuff like firewall+storm gust combo.
if( !status_isdead(bl) && additional_effects )
skill_additional_effect(src,bl,skill_id,skill_lv,dmg.flag,dmg.dmg_lv,tick);
@@ -3672,7 +3701,11 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
battle_delay_damage(tick, dmg.amotion,src,bl,dmg.flag,skill_id,skill_lv,damage,dmg.dmg_lv,dmg.dmotion, additional_effects, false);
}
- if (tsc && skill_id != PA_PRESSURE && skill_id != HW_GRAVITATION && skill_id != NPC_EVILLAND) {
+ if (tsc && skill_id != NPC_EVILLAND
+#ifndef RENEWAL
+ && skill_id != PA_PRESSURE && skill_id != HW_GRAVITATION
+#endif
+ ) {
if (tsc->data[SC_DEVOTION]) {
struct status_change_entry *sce = tsc->data[SC_DEVOTION];
struct block_list *d_bl = map_id2bl(sce->val1);
@@ -3867,7 +3900,9 @@ static int skill_check_unit_range_sub(struct block_list *bl, va_list ap)
case HT_BLASTMINE:
case HT_CLAYMORETRAP:
case HT_TALKIEBOX:
+#ifndef RENEWAL
case HP_BASILICA:
+#endif
case RA_ELECTRICSHOCKER:
case RA_CLUSTERBOMB:
case RA_MAGENTATRAP:
@@ -3923,8 +3958,10 @@ static int skill_check_unit_range2_sub (struct block_list *bl, va_list ap)
if( status_isdead(bl) && skill_id != AL_WARP )
return 0;
+#ifndef RENEWAL
if( skill_id == HP_BASILICA && bl->type == BL_PC )
return 0;
+#endif
if( skill_id == AM_DEMONSTRATION && bl->type == BL_MOB && ((TBL_MOB*)bl)->mob_id == MOBID_EMPERIUM )
return 0; //Allow casting Bomb/Demonstration Right under emperium [Skotlex]
@@ -4931,23 +4968,49 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case RG_BACKSTAP:
{
- uint8 dir = map_calc_dir(src, bl->x, bl->y), t_dir = unit_getdir(bl);
- if ((!check_distance_bl(src, bl, 0) && !map_check_dir(dir, t_dir)) || bl->type == BL_SKILL) {
- status_change_end(src, SC_HIDING, INVALID_TIMER);
- skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
- dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest]
- unit_setdir(bl,dir);
+ if (!check_distance_bl(src, bl, 0)) {
+#ifdef RENEWAL
+ uint8 dir = map_calc_dir(src, bl->x, bl->y);
+ short x, y;
+
+ if (dir > 0 && dir < 4)
+ x = -1;
+ else if (dir > 4)
+ x = 1;
+ else
+ x = 0;
+
+ if (dir > 2 && dir < 6)
+ y = -1;
+ else if (dir == 7 || dir < 2)
+ y = 1;
+ else
+ y = 0;
+
+ if (battle_check_target(src, bl, BCT_ENEMY) > 0 && unit_movepos(src, bl->x + x, bl->y + y, 2, true)) { // Display movement + animation.
+#else
+ uint8 dir = map_calc_dir(src, bl->x, bl->y), t_dir = unit_getdir(bl);
+
+ if (!map_check_dir(dir, t_dir) || bl->type == BL_SKILL) {
+#endif
+ status_change_end(src, SC_HIDING, INVALID_TIMER);
+ dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest]
+ unit_setdir(bl,dir);
+#ifdef RENEWAL
+ clif_blown(src);
+#endif
+ skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
+ }
+ else if (sd)
+ clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
}
- else if (sd)
- clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
}
break;
case MO_FINGEROFFENSIVE:
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
if (battle_config.finger_offensive_type && sd) {
- int i;
- for (i = 1; i < sd->spiritball_old; i++)
+ for (int i = 1; i < sd->spiritball_old; i++)
skill_addtimerskill(src, tick + i * 200, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag);
}
status_change_end(src, SC_BLADESTOP, INVALID_TIMER);
@@ -4967,6 +5030,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
short x, y, i = 2; // Move 2 cells (From target)
short dir = map_calc_dir(src,bl->x,bl->y);
+#ifdef RENEWAL
+ if (skill_id == MO_EXTREMITYFIST && sd && sd->spiritball_old > 5)
+ flag |= 1; // Give +100% damage increase
+#endif
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
if (skill_id == MO_EXTREMITYFIST) {
status_set_sp(src, 0, 0);
@@ -5251,15 +5318,18 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
if(map_getcell(bl->m,tx,ty,CELL_CHKWALL))
break;
skill_blown(src,bl,1,dir,BLOWN_NONE);
+
+ int count;
+
// Splash around target cell, but only cells inside area; we first have to check the area is not negative
if((max(min_x,tx-1) <= min(max_x,tx+1)) &&
(max(min_y,ty-1) <= min(max_y,ty+1)) &&
- (map_foreachinallarea(skill_area_sub, bl->m, max(min_x,tx-1), max(min_y,ty-1), min(max_x,tx+1), min(max_y,ty+1), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY, skill_area_sub_count))) {
+ (count = map_foreachinallarea(skill_area_sub, bl->m, max(min_x,tx-1), max(min_y,ty-1), min(max_x,tx+1), min(max_y,ty+1), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY, skill_area_sub_count))) {
// Recursive call
map_foreachinallarea(skill_area_sub, bl->m, max(min_x,tx-1), max(min_y,ty-1), min(max_x,tx+1), min(max_y,ty+1), splash_target(src), src, skill_id, skill_lv, tick, (flag|BCT_ENEMY)+1, skill_castend_damage_id);
// Self-collision
if(bl->x >= min_x && bl->x <= max_x && bl->y >= min_y && bl->y <= max_y)
- skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,(flag&0xFFF)>0?SD_ANIMATION:0);
+ skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,(flag&0xFFF)>0?SD_ANIMATION|count:count);
break;
}
}
@@ -5329,6 +5399,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case MG_FROSTDIVER:
case WZ_SIGHTBLASTER:
case WZ_SIGHTRASHER:
+#ifdef RENEWAL
+ case PA_PRESSURE:
+#endif
case NJ_KOUENKA:
case NJ_HYOUSENSOU:
case NJ_HUUJIN:
@@ -5392,7 +5465,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
case NPC_DARKBREATH:
clif_emotion(src,ET_ANGER);
case SN_FALCONASSAULT:
+#ifndef RENEWAL
case PA_PRESSURE:
+#endif
case CR_ACIDDEMONSTRATION:
case TF_THROWSTONE:
#ifdef RENEWAL
@@ -6148,6 +6223,97 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
return 0;
}
+/**
+ * Give a song's buff/debuff or damage to all targets around
+ * @param target: Target
+ * @param ap: Argument list
+ * @return 1 on success or 0 otherwise
+ */
+static int skill_apply_songs(struct block_list* target, va_list ap)
+{
+ int flag = va_arg(ap, int);
+ struct block_list* src = va_arg(ap, struct block_list*);
+ uint16 skill_id = static_cast(va_arg(ap, int));
+ uint16 skill_lv = static_cast(va_arg(ap, int));
+ t_tick tick = va_arg(ap, t_tick);
+
+ if (flag & BCT_WOS && src == target)
+ return 0;
+
+ if (battle_check_target(src, target, flag) > 0) {
+ switch (skill_id) {
+ // Attack type songs
+ case BA_DISSONANCE:
+ skill_attack(BF_MAGIC, src, src, target, skill_id, skill_lv, tick, 0);
+ return 1;
+ case DC_UGLYDANCE:
+ case BD_LULLABY:
+ return skill_additional_effect(src, target, skill_id, skill_lv, BF_LONG | BF_SKILL | BF_MISC, ATK_DEF, tick);
+ default: // Buff/Debuff type songs
+ if (skill_id == CG_HERMODE && src->id != target->id)
+ status_change_clear_buffs(target, SCCB_BUFFS); // Should dispell only allies.
+ return sc_start(src, target, status_skill2sc(skill_id), 100, skill_lv, skill_get_time(skill_id, skill_lv));
+ }
+ }
+
+ return 0;
+}
+
+/**
+ * Calculate a song's bonus values
+ * @param src: Caster
+ * @param skill_id: Song skill ID
+ * @param skill_lv: Song skill level
+ * @param tick: Timer tick
+ * @return Number of targets or 0 otherwise
+ */
+static int skill_castend_song(struct block_list* src, uint16 skill_id, uint16 skill_lv, t_tick tick)
+{
+ nullpo_ret(src);
+
+ if (src->type != BL_PC) {
+ ShowWarning("skill_castend_song: Expected player type for src!\n");
+ return 0;
+ }
+
+ if (!(skill_get_inf2_(skill_id, { INF2_ISSONG, INF2_ISENSEMBLE }))) {
+ ShowWarning("skill_castend_song: Unknown song skill ID: %u\n", skill_id);
+ return 0;
+ }
+
+ struct map_session_data* sd = BL_CAST(BL_PC, src);
+ int flag = BCT_PARTY;
+
+ switch (skill_id) {
+ case BD_ROKISWEIL:
+ flag = BCT_ENEMY | BCT_WOS;
+ break;
+ case BD_LULLABY:
+ case BD_ETERNALCHAOS:
+ case BA_DISSONANCE:
+ case DC_UGLYDANCE:
+ case DC_DONTFORGETME:
+ flag = BCT_ENEMY;
+ break;
+ case CG_HERMODE:
+ flag |= BCT_GUILD;
+ break;
+ }
+
+ clif_skill_nodamage(src, src, skill_id, skill_lv, 1);
+ sd->skill_id_dance = skill_id;
+ sd->skill_lv_dance = skill_lv;
+
+ if (skill_get_inf2(skill_id, INF2_ISENSEMBLE)) {
+ sc_start(src, src, status_skill2sc(CG_SPECIALSINGER), 100, 1, skill_get_time(CG_SPECIALSINGER, skill_lv));
+ skill_check_pc_partner(sd, skill_id, &skill_lv, 3, 1);
+ // todo, apply ensemble fatigue if it hits you + ensemble partner.. ??
+ // or maybe we do that in skill_check_pc_partner or something ??
+ }
+
+ return map_foreachinrange(skill_apply_songs, src, skill_get_splash(skill_id, skill_lv), splash_target(src), flag, src, skill_id, skill_lv, tick);
+}
+
/**
* Use no-damage skill from 'src' to 'bl
* @param src Caster
@@ -6615,6 +6781,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
clif_skill_nodamage(src,bl,skill_id,skill_lv,0);
break;
}
+#ifdef RENEWAL
+ clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)));
+#else
// 100% success rate at lv4 & 5, but lasts longer at lv5
if(!clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start(src,bl,type,(60+skill_lv*10),skill_lv, skill_get_time(skill_id,skill_lv)))) {
if (dstsd){
@@ -6625,6 +6794,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
if (sd)
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
}
+#endif
break;
case PR_ASPERSIO:
@@ -6700,9 +6870,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break;
}
case PR_SLOWPOISON:
- case PR_IMPOSITIO:
case PR_LEXAETERNA:
+#ifndef RENEWAL
+ case PR_IMPOSITIO:
case PR_SUFFRAGIUM:
+#endif
case LK_BERSERK:
case MS_BERSERK:
case KN_TWOHANDQUICKEN:
@@ -6712,7 +6884,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case CR_REFLECTSHIELD:
case MS_REFLECTSHIELD:
case AS_POISONREACT:
+#ifndef RENEWAL
case MC_LOUD:
+#endif
case MG_ENERGYCOAT:
case MO_EXPLOSIONSPIRITS:
case MO_STEELBODY:
@@ -6721,6 +6895,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case LK_PARRYING:
case MS_PARRYING:
case LK_CONCENTRATION:
+#ifdef RENEWAL
+ case HP_BASILICA:
+#endif
case WS_CARTBOOST:
case SN_SIGHT:
case WS_MELTDOWN:
@@ -7238,6 +7415,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break;
case AL_ANGELUS:
+#ifdef RENEWAL
+ case MC_LOUD:
+ case PR_SUFFRAGIUM:
+#endif
case PR_MAGNIFICAT:
case PR_GLORIA:
case SN_WINDWALK:
@@ -7374,11 +7555,23 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
break;
+ case CG_SPECIALSINGER:
+ if (tsc && tsc->data[SC_LONGING]) {
+ clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
+ status_change_end(bl, SC_LONGING, INVALID_TIMER);
+ }
+ break;
+
case BD_ADAPTATION:
+#ifdef RENEWAL
+ clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
+ sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
+#else
if(tsc && tsc->data[SC_DANCING]){
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
status_change_end(bl, SC_DANCING, INVALID_TIMER);
}
+#endif
break;
case BA_FROSTJOKER:
@@ -7417,6 +7610,29 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
}
break;
+#ifdef RENEWAL
+ case BD_LULLABY:
+ case BD_RICHMANKIM:
+ case BD_ETERNALCHAOS:
+ case BD_DRUMBATTLEFIELD:
+ case BD_RINGNIBELUNGEN:
+ case BD_ROKISWEIL:
+ case BD_INTOABYSS:
+ case BD_SIEGFRIED:
+ case BA_DISSONANCE:
+ case BA_POEMBRAGI:
+ case BA_WHISTLE:
+ case BA_ASSASSINCROSS:
+ case BA_APPLEIDUN:
+ case DC_UGLYDANCE:
+ case DC_HUMMING:
+ case DC_DONTFORGETME:
+ case DC_FORTUNEKISS:
+ case DC_SERVICEFORYOU:
+ skill_castend_song(src, skill_id, skill_lv, tick);
+ break;
+#endif
+
case TF_STEAL:
if(sd) {
if(pc_steal_item(sd,bl,skill_lv))
@@ -8151,6 +8367,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
} else {
int maxlv=1,spellid=0;
static const int spellarray[3] = { MG_COLDBOLT,MG_FIREBOLT,MG_LIGHTNINGBOLT };
+
if(skill_lv >= 10) {
spellid = MG_FROSTDIVER;
// if (tsc && tsc->data[SC_SPIRIT] && tsc->data[SC_SPIRIT]->val2 == SA_SAGE)
@@ -8175,6 +8392,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
spellid = MG_NAPALMBEAT;
maxlv = 3;
}
+
if(spellid > 0)
sc_start4(src,src,SC_AUTOSPELL,100,skill_lv,spellid,maxlv,0,
skill_get_time(SA_AUTOSPELL,skill_lv));
@@ -8720,6 +8938,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
break;
+#ifndef RENEWAL
case CG_LONGINGFREEDOM:
{
if (tsc && !tsce && (tsce=tsc->data[SC_DANCING]) && tsce->val4
@@ -8730,6 +8949,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
}
}
break;
+#endif
case CG_TAROTCARD:
{
@@ -8739,7 +8959,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
map_freeblock_unlock();
return 0;
}
- if( rnd() % 100 > skill_lv * 8 || (tsc && tsc->data[SC_BASILICA]) ||
+ if( rnd() % 100 > skill_lv * 8 ||
+#ifndef RENEWAL
+ (tsc && tsc->data[SC_BASILICA]) ||
+#endif
(dstmd && ((dstmd->guardian_data && dstmd->mob_id == MOBID_EMPERIUM) || status_get_class_(bl) == CLASS_BATTLEFIELD)) ) {
if( sd )
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
@@ -9282,6 +9505,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case AB_PRAEFATIO:
case AB_RENOVATIO:
+#ifdef RENEWAL
+ case PR_IMPOSITIO:
+#endif
if( !sd || sd->status.party_id == 0 || flag&1 ) {
if (skill_id == AB_PRAEFATIO)
clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start4(src, bl, type, 100, skill_lv, 0, 0, (sd && sd->status.party_id ? party_foreachsamemap(party_sub_count, sd, 0) : 1 ), skill_get_time(skill_id, skill_lv)));
@@ -11155,8 +11381,14 @@ static int8 skill_castend_id_check(struct block_list *src, struct block_list *ta
break;
case RG_BACKSTAP:
{
- uint8 dir = map_calc_dir(src,target->x,target->y),t_dir = unit_getdir(target);
- if (check_distance_bl(src, target, 0) || map_check_dir(dir,t_dir))
+#ifndef RENEWAL
+ uint8 dir = map_calc_dir(src,target->x,target->y), t_dir = unit_getdir(target);
+
+ if (map_check_dir(dir, t_dir))
+ return USESKILL_FAIL_MAX;
+#endif
+
+ if (check_distance_bl(src, target, 0))
return USESKILL_FAIL_MAX;
}
break;
@@ -11466,17 +11698,27 @@ TIMER_FUNC(skill_castend_id){
case RL_FIREDANCE:
sd->canequip_tick = tick + skill_get_time(ud->skill_id, ud->skill_lv);
break;
+ case KN_BRANDISHSPEAR:
+ case KN_BOWLINGBASH:
case CR_GRANDCROSS:
- case NPC_GRANDDARKNESS:
- if( (sc = status_get_sc(src)) && sc->data[SC_STRIPSHIELD] )
- {
- const struct TimerData *timer = get_timer(sc->data[SC_STRIPSHIELD]->timer);
- if( timer && timer->func == status_change_timer && DIFF_TICK(timer->tick,gettick()+skill_get_time(ud->skill_id, ud->skill_lv)) > 0 )
+ case NPC_GRANDDARKNESS: {
+ sc_type type;
+
+ if (ud->skill_id == KN_BRANDISHSPEAR || ud->skill_id == KN_BOWLINGBASH)
+ type = SC_STRIPWEAPON;
+ else
+ type = SC_STRIPSHIELD;
+
+ if ((sc = status_get_sc(src)) && sc->data[type]) {
+ const struct TimerData* timer = get_timer(sc->data[type]->timer);
+
+ if (timer && timer->func == status_change_timer && DIFF_TICK(timer->tick, gettick() + skill_get_time(ud->skill_id, ud->skill_lv)) > 0)
break;
}
- sc_start2(src,src, SC_STRIPSHIELD, 100, 0, 1, skill_get_time(ud->skill_id, ud->skill_lv));
+ sc_start2(src, src, type, 100, 0, 1, skill_get_time(ud->skill_id, ud->skill_lv));
break;
}
+ }
}
if (skill_get_state(ud->skill_id) != ST_MOVE_ENABLE)
unit_set_walkdelay(src, tick, battle_config.default_walk_delay+skill_get_walkdelay(ud->skill_id, ud->skill_lv), 1);
@@ -11502,9 +11744,10 @@ TIMER_FUNC(skill_castend_id){
sc->data[SC_SPIRIT]->val3 == ud->skill_id &&
ud->skill_id != WZ_WATERBALL)
sc->data[SC_SPIRIT]->val3 = 0; //Clear bounced spell check.
-
+#ifndef RENEWAL
if( sc->data[SC_DANCING] && sd && skill_get_inf2(ud->skill_id, INF2_ISSONG) )
skill_blockpc_start(sd,BD_ADAPTATION,3000);
+#endif
}
if (sd && ud->skill_id != SA_ABRACADABRA && ud->skill_id != WM_RANDOMIZESPELL) // they just set the data so leave it as it is.[Inkfish]
@@ -11846,6 +12089,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
case WE_CALLPARENT:
case WE_CALLBABY:
case SA_LANDPROTECTOR:
+#ifndef RENEWAL
case BD_LULLABY:
case BD_RICHMANKIM:
case BD_ETERNALCHAOS:
@@ -11864,6 +12108,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
case DC_DONTFORGETME:
case DC_FORTUNEKISS:
case DC_SERVICEFORYOU:
+#endif
case CG_MOONLIT:
case GS_DESPERADO:
case NJ_KAENSIN:
@@ -11872,6 +12117,9 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
case NJ_HYOUSYOURAKU:
case NJ_RAIGEKISAI:
case NJ_KAMAITACHI:
+#ifdef RENEWAL
+ case HW_GRAVITATION:
+#endif
case NPC_EVILLAND:
case NPC_VENOMFOG:
case NPC_ICEMINE:
@@ -11927,6 +12175,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
skill_unitsetting(src,skill_id,skill_lv,x,y,0);
flag|=1;
break;
+#ifndef RENEWAL
case HP_BASILICA:
if( sc->data[SC_BASILICA] ) {
status_change_end(src, SC_BASILICA, INVALID_TIMER); // Cancel Basilica and return so requirement isn't consumed again
@@ -11941,12 +12190,17 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
flag|=1;
}
break;
+#endif
case CG_HERMODE:
+#ifdef RENEWAL
+ skill_castend_song(src, skill_id, skill_lv, tick);
+#else
skill_clear_unitgroup(src);
if ((sg = skill_unitsetting(src,skill_id,skill_lv,x,y,0)))
sc_start4(src,src,SC_DANCING,100,
skill_id,0,skill_lv,sg->group_id,skill_get_time(skill_id,skill_lv));
flag|=1;
+#endif
break;
case RG_CLEANER: // [Valaris]
i = skill_get_splash(skill_id, skill_lv);
@@ -12109,11 +12363,13 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
}
break;
+#ifndef RENEWAL
case HW_GRAVITATION:
if ((sg = skill_unitsetting(src,skill_id,skill_lv,x,y,0)))
sc_start4(src,src,type,100,skill_lv,0,BCT_SELF,sg->group_id,skill_get_time(skill_id,skill_lv));
flag|=1;
break;
+#endif
// Plant Cultivation [Celest]
case CR_CULTIVATION:
@@ -12850,9 +13106,11 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
val3 = group->val3; //as well as the mapindex to warp to.
}
break;
+#ifndef RENEWAL
case HP_BASILICA:
val1 = src->id; // Store caster id.
break;
+#endif
case PR_SANCTUARY:
case NPC_EVILLAND:
@@ -12942,11 +13200,7 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
}
case BA_WHISTLE:
-#ifdef RENEWAL
- val1 = 3 * skill_lv + status->agi / 15; // Flee increase
-#else
val1 = skill_lv + status->agi / 10; // Flee increase
-#endif
val2 = (skill_lv + 1) / 2 + status->luk / 30; // Perfect dodge increase
if (sd) {
val1 += pc_checkskill(sd, BA_MUSICALLESSON) / 2;
@@ -12954,11 +13208,7 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
}
break;
case DC_HUMMING:
-#ifdef RENEWAL
- val1 = 20 + 2 * skill_lv + status->dex / 15; // Hit increase
-#else
val1 = 1 + 2 * skill_lv + status->dex / 10; // Hit increase
-#endif
if (sd)
val1 += pc_checkskill(sd, DC_DANCINGLESSON);
break;
@@ -13000,12 +13250,8 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
case BA_ASSASSINCROSS:
if (sd)
val1 = pc_checkskill(sd, BA_MUSICALLESSON) / 2;
-#ifdef RENEWAL // ASPD increase
- val1 += skill_lv + (status->agi / 20);
-#else
val1 += 5 + skill_lv + (status->agi / 20);
val1 *= 10; // ASPD works with 1000 as 100%
-#endif
break;
case DC_FORTUNEKISS:
val1 = 10 + skill_lv + (status->luk / 10); // Critical increase
@@ -13014,13 +13260,8 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
val1 += 5 * pc_checkskill(sd, DC_DANCINGLESSON);
break;
case BD_DRUMBATTLEFIELD:
- #ifdef RENEWAL
- val1 = (skill_lv+5)*25; //Atk increase
- val2 = skill_lv*10; //Def increase
- #else
val1 = (skill_lv+1)*25; //Atk increase
val2 = (skill_lv+1)*2; //Def increase
- #endif
break;
case BD_RINGNIBELUNGEN:
val1 = (skill_lv+2)*25; //Atk increase
@@ -13148,10 +13389,12 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
pc_delspiritcharm(sd,sd->spiritcharm,sd->spiritcharm_type);
}
break;
+#ifndef RENEWAL
case HW_GRAVITATION:
if(sc && sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF)
link_group_id = sc->data[SC_GRAVITATION]->val4;
break;
+#endif
case SO_VACUUM_EXTREME:
// Coordinates
val1 = x;
@@ -13575,6 +13818,7 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, t_
}
break;
+#ifndef RENEWAL
case UNT_GRAVITATION:
if (!sce)
sc_start4(ss, bl,type,100,sg->skill_lv,0,BCT_ENEMY,sg->group_id,sg->limit);
@@ -13592,6 +13836,7 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, t_
sc_start4(ss, bl, type, 100, 0, 0, sg->group_id, ss->id, sg->limit);
}
break;
+#endif
case UNT_MOONLIT:
//Knockback out of area if affected char isn't in Moonlit effect
@@ -13874,8 +14119,10 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
break;
case UNT_MAGNUS:
+#ifndef RENEWAL
if (!battle_check_undead(tstatus->race,tstatus->def_ele) && tstatus->race!=RC_DEMON)
break;
+#endif
skill_attack(BF_MAGIC,ss,&unit->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
break;
@@ -14137,6 +14384,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
}
break;
+#ifndef RENEWAL
case UNT_BASILICA:
{
int i = battle_check_target(&unit->bl, bl, BCT_ENEMY);
@@ -14149,6 +14397,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
sc_start4(ss, bl, type, 100, 0, 0, sg->group_id, ss->id, sg->limit);
}
break;
+#endif
case UNT_GROUNDDRIFT_WIND:
case UNT_GROUNDDRIFT_DARK:
@@ -14434,10 +14683,12 @@ int skill_unit_onout(struct skill_unit *src, struct block_list *bl, t_tick tick)
status_change_end(bl, type, INVALID_TIMER);
break;
+#ifndef RENEWAL
case UNT_BASILICA:
if (sce && sce->val4 != bl->id)
status_change_end(bl, type, INVALID_TIMER);
break;
+#endif
case UNT_HERMODE: //Clear Hermode if the owner moved.
if (sce && sce->val3 == BCT_SELF && sce->val4 == sg->group_id)
@@ -14522,8 +14773,10 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, t_tick tick)
case SA_DELUGE:
case SA_VIOLENTGALE:
case CG_HERMODE:
+#ifndef RENEWAL
case HW_GRAVITATION:
case HP_BASILICA:
+#endif
case NJ_SUITON:
case SC_MAELSTROM:
case EL_WATER_BARRIER:
@@ -14828,15 +15081,17 @@ int skill_check_pc_partner(struct map_session_data *sd, uint16 skill_id, uint16
status_charge(&tsd->bl, 0, i);
}
break;
- default: //Warning: Assuming Ensemble skills here (for speed)
+ default:
if( is_chorus )
- break;//Chorus skills are not to be parsed as ensambles
- if (c > 0 && sd->sc.data[SC_DANCING] && (tsd = map_id2sd(p_sd[0])) != NULL) {
- sd->sc.data[SC_DANCING]->val4 = tsd->bl.id;
- sc_start4(&sd->bl,&tsd->bl,SC_DANCING,100,skill_id,sd->sc.data[SC_DANCING]->val2,*skill_lv,sd->bl.id,skill_get_time(skill_id,*skill_lv)+1000);
- clif_skill_nodamage(&tsd->bl, &sd->bl, skill_id, *skill_lv, 1);
- tsd->skill_id_dance = skill_id;
- tsd->skill_lv_dance = *skill_lv;
+ break;//Chorus skills are not to be parsed as ensembles
+ if (skill_get_inf2(skill_id, INF2_ISENSEMBLE)) {
+ if (c > 0 && sd->sc.data[SC_DANCING] && (tsd = map_id2sd(p_sd[0])) != NULL) {
+ sd->sc.data[SC_DANCING]->val4 = tsd->bl.id;
+ sc_start4(&sd->bl,&tsd->bl,SC_DANCING,100,skill_id,sd->sc.data[SC_DANCING]->val2,*skill_lv,sd->bl.id,skill_get_time(skill_id,*skill_lv)+1000);
+ clif_skill_nodamage(&tsd->bl, &sd->bl, skill_id, *skill_lv, 1);
+ tsd->skill_id_dance = skill_id;
+ tsd->skill_lv_dance = *skill_lv;
+ }
}
return c;
}
@@ -15193,6 +15448,9 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
return false;
}
+#ifdef RENEWAL
+ sd->spiritball_old = sd->spiritball;
+#endif
break;
case TK_MISSION:
if( (sd->class_&MAPID_UPPERMASK) != MAPID_TAEKWON ) { // Cannot be used by Non-Taekwon classes
@@ -15241,6 +15499,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
return false;
}
break; //Combo ready.
+#ifndef RENEWAL
case BD_ADAPTATION:
{
int time;
@@ -15259,6 +15518,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
}
}
break;
+#endif
case PR_BENEDICTIO:
if (skill_check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 2) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
@@ -15273,12 +15533,14 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
if(!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == AC_DOUBLE))
return false;
break;
+#ifndef RENEWAL
case CG_HERMODE:
if(!npc_check_areanpc(1,sd->bl.m,sd->bl.x,sd->bl.y,skill_get_splash(skill_id, skill_lv))) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
return false;
}
break;
+#endif
case CG_MOONLIT: //Check there's no wall in the range+1 area around the caster. [Skotlex]
{
int s,range = skill_get_splash(skill_id, skill_lv)+1;
@@ -15311,6 +15573,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
}
break;
}
+#ifndef RENEWAL
case HP_BASILICA:
if( !sc || (sc && !sc->data[SC_BASILICA])) {
if( sd ) {
@@ -15332,6 +15595,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
}
}
break;
+#endif
case AM_TWILIGHT2:
case AM_TWILIGHT3:
if (!party_skill_check(sd, sd->status.party_id, skill_id, skill_lv)) {
@@ -16280,6 +16544,12 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint
req.sp += req.sp * sc->data[SC_OFFERTORIUM]->val3 / 100;
if( sc->data[SC_TELEKINESIS_INTENSE] && skill_get_ele(skill_id, skill_lv) == ELE_GHOST)
req.sp -= req.sp * sc->data[SC_TELEKINESIS_INTENSE]->val2 / 100;
+#ifdef RENEWAL
+ if (sc->data[SC_ADAPTATION] && (skill_get_inf2(skill_id, INF2_ISSONG)))
+ req.sp -= req.sp * 20 / 100;
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_SPCONSUM)
+ req.sp -= req.sp * 30 / 100;
+#endif
}
req.zeny = skill->require.zeny[skill_lv-1];
@@ -16440,6 +16710,7 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint
if( sc->data[SC_BLADESTOP] )
req.spiritball--;
else if( sc->data[SC_COMBO] ) {
+#ifndef RENEWAL
switch( sc->data[SC_COMBO]->val1 ) {
case MO_COMBOFINISH:
req.spiritball = 4;
@@ -16447,10 +16718,13 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint
case CH_TIGERFIST:
req.spiritball = 3;
break;
- case CH_CHAINCRUSH: //It should consume whatever is left as long as it's at least 1.
+ case CH_CHAINCRUSH: //It should consume whatever is left as long as it's at least 1.
req.spiritball = sd->spiritball?sd->spiritball:1;
break;
}
+#else
+ req.spiritball = sd->spiritball ? sd->spiritball : 1;
+#endif
} else if( sc->data[SC_RAISINGDRAGON] && sd->spiritball > 5)
req.spiritball = sd->spiritball; // must consume all regardless of the amount required
}
@@ -16723,7 +16997,9 @@ int skill_vfcastfix(struct block_list *bl, double time, uint16 skill_id, uint16
VARCAST_REDUCTION(-sc->data[SC__LAZINESS]->val2);
if (sc->data[SC_SUFFRAGIUM]) {
VARCAST_REDUCTION(sc->data[SC_SUFFRAGIUM]->val2);
+#ifndef RENEWAL
status_change_end(bl, SC_SUFFRAGIUM, INVALID_TIMER);
+#endif
}
if (sc->data[SC_MEMORIZE]) {
reduce_cast_rate += 50;
@@ -16810,10 +17086,12 @@ int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv)
time = 1000;
time -= (4 * status_get_agi(bl) + 2 * status_get_dex(bl));
break;
+#ifndef RENEWAL
case HP_BASILICA:
if (sc && !sc->data[SC_BASILICA])
time = 0; // There is no Delay on Basilica creation, only on cancel
break;
+#endif
default:
if (battle_config.delay_dependon_dex && !(delaynodex&1)) { // if skill delay is allowed to be reduced by dex
int scale = battle_config.castrate_dex_scale - status_get_dex(bl);
@@ -17036,18 +17314,21 @@ int skill_autospell(struct map_session_data *sd, uint16 skill_id)
{
nullpo_ret(sd);
- uint16 skill_lv = sd->menuskill_val;
-
if (SKILL_CHK_GUILD(skill_id))
return 0;
- uint16 idx = skill_get_index(skill_id);
- uint16 lv = (sd->status.skill[idx].id == skill_id) ? sd->status.skill[idx].lv : 0;
+ uint16 lv = pc_checkskill(sd, skill_id), skill_lv = sd->menuskill_val;
if(!skill_lv || !lv) return 0; // Player must learn the skill before doing auto-spell [Lance]
uint16 maxlv = 1;
+#ifdef RENEWAL
+ if ((skill_id == MG_COLDBOLT || skill_id == MG_FIREBOLT || skill_id == MG_LIGHTNINGBOLT) && sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SAGE)
+ maxlv = 10; //Soul Linker bonus. [Skotlex]
+ else
+ maxlv = skill_lv / 2; // Half of Autospell's level unless player learned a lower level (capped below)
+#else
if(skill_id==MG_NAPALMBEAT) maxlv=3;
else if(skill_id==MG_COLDBOLT || skill_id==MG_FIREBOLT || skill_id==MG_LIGHTNINGBOLT){
if (sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SAGE)
@@ -17067,9 +17348,9 @@ int skill_autospell(struct map_session_data *sd, uint16 skill_id)
}
else if(skill_id==MG_FROSTDIVER) maxlv=1;
else return 0;
+#endif
- if(maxlv > lv)
- maxlv = lv;
+ maxlv = min(lv, maxlv);
sc_start4(&sd->bl,&sd->bl,SC_AUTOSPELL,100,skill_lv,skill_id,maxlv,0,
skill_get_time(SA_AUTOSPELL,skill_lv));
@@ -17617,8 +17898,10 @@ static int skill_cell_overlap(struct block_list *bl, va_list ap)
}
break;
case WZ_ICEWALL:
+#ifndef RENEWAL
case HP_BASILICA:
case HW_GRAVITATION:
+#endif
//These can't be placed on top of themselves (duration can't be refreshed)
if (unit->group->skill_id == skill_id)
{
@@ -18074,9 +18357,11 @@ struct skill_unit *skill_initunit(struct skill_unit_group *group, int idx, int x
case SA_LANDPROTECTOR:
skill_unitsetmapcell(unit,SA_LANDPROTECTOR,group->skill_lv,CELL_LANDPROTECTOR,true);
break;
+#ifndef RENEWAL
case HP_BASILICA:
skill_unitsetmapcell(unit,HP_BASILICA,group->skill_lv,CELL_BASILICA,true);
break;
+#endif
case SC_MAELSTROM:
skill_unitsetmapcell(unit,SC_MAELSTROM,group->skill_lv,CELL_MAELSTROM,true);
break;
@@ -18134,9 +18419,11 @@ int skill_delunit(struct skill_unit* unit)
case SA_LANDPROTECTOR:
skill_unitsetmapcell(unit,SA_LANDPROTECTOR,group->skill_lv,CELL_LANDPROTECTOR,false);
break;
+#ifndef RENEWAL
case HP_BASILICA:
skill_unitsetmapcell(unit,HP_BASILICA,group->skill_lv,CELL_BASILICA,false);
break;
+#endif
case RA_ELECTRICSHOCKER: {
struct block_list* target = map_id2bl(group->val2);
@@ -18328,7 +18615,9 @@ int skill_delunitgroup_(struct skill_unit_group *group, const char* file, int li
i = SC_NONE;
switch (group->unit_id) {
case UNT_GOSPEL: i = SC_GOSPEL; break;
+#ifndef RENEWAL
case UNT_BASILICA: i = SC_BASILICA; break;
+#endif
}
if (i != SC_NONE) {
struct status_change *sc = status_get_sc(src);
diff --git a/src/map/skill.hpp b/src/map/skill.hpp
index 73f09c8cc4..c51e4f45e9 100644
--- a/src/map/skill.hpp
+++ b/src/map/skill.hpp
@@ -387,6 +387,22 @@ struct skill_unit_group_tickset {
int id;
};
+/// Ring of Nibelungen bonuses
+enum e_nibelungen_status : uint8 {
+ RINGNBL_ASPDRATE = 1, ///< ASPD + 20%
+ RINGNBL_ATKRATE, ///< Physical damage + 20%
+ RINGNBL_MATKRATE, ///< MATK + 20%
+ RINGNBL_HPRATE, ///< Maximum HP + 30%
+ RINGNBL_SPRATE, ///< Maximum SP + 30%
+ RINGNBL_ALLSTAT, ///< All stats + 15
+ RINGNBL_HIT, ///< HIT + 50
+ RINGNBL_FLEE, ///< FLEE + 50
+ RINGNBL_SPCONSUM, ///< SP consumption - 30%
+ RINGNBL_HPREGEN, ///< HP recovery + 100%
+ RINGNBL_SPREGEN, ///< SP recovery + 100%
+ RINGNBL_MAX,
+};
+
/// Enum for skill_blown
enum e_skill_blown {
BLOWN_NONE = 0x00,
@@ -1933,6 +1949,8 @@ enum e_skill {
ALL_EQSWITCH = 5067,
+ CG_SPECIALSINGER,
+
AB_VITUPERATUM = 5072,
AB_CONVENIO,
diff --git a/src/map/status.cpp b/src/map/status.cpp
index f6a365bbf9..09317fd749 100644
--- a/src/map/status.cpp
+++ b/src/map/status.cpp
@@ -56,8 +56,6 @@ static struct {
struct refine_cost cost[REFINE_COST_MAX];
} refine_info[REFINE_TYPE_MAX];
-static int atkmods[SZ_ALL][MAX_WEAPON_TYPE]; /// ATK weapon modification for size (size_fix.txt)
-
static struct eri *sc_data_ers; /// For sc_data entries
static struct status_data dummy_status;
@@ -118,6 +116,100 @@ static int status_get_sc_interval(enum sc_type type);
static bool status_change_isDisabledOnMap_(sc_type type, bool mapIsVS, bool mapIsPVP, bool mapIsGVG, bool mapIsBG, unsigned int mapZone, bool mapIsTE);
#define status_change_isDisabledOnMap(type, m) ( status_change_isDisabledOnMap_((type), mapdata_flag_vs2((m)), m->flag[MF_PVP] != 0, mapdata_flag_gvg2_no_te((m)), m->flag[MF_BATTLEGROUND] != 0, (m->zone << 3) != 0, mapdata_flag_gvg2_te((m))) )
+const std::string SizeFixDatabase::getDefaultLocation() {
+ return std::string(db_path) + "/size_fix.yml";
+}
+
+/**
+ * Reads and parses an entry from size_fix.
+ * @param node: YAML node containing the entry.
+ * @return count of successfully parsed rows
+ */
+uint64 SizeFixDatabase::parseBodyNode(const YAML::Node &node) {
+ std::string weapon_name;
+
+ if (!this->asString(node, "Weapon", weapon_name))
+ return 0;
+
+ std::string weapon_name_constant = "W_" + weapon_name;
+ int64 constant;
+
+ if (!script_get_constant(weapon_name_constant.c_str(), &constant)) {
+ this->invalidWarning(node["Weapon"], "Size Fix unknown weapon %s, skipping.\n", weapon_name.c_str());
+ return 0;
+ }
+
+ if (constant < W_FIST || constant > W_2HSTAFF) {
+ this->invalidWarning(node["Weapon"], "Size Fix weapon %s is an invalid weapon, skipping.\n", weapon_name.c_str());
+ return 0;
+ }
+
+ int weapon_id = static_cast(constant);
+ std::shared_ptr size = this->find(weapon_id);
+ bool exists = size != nullptr;
+
+ if (!exists)
+ size = std::make_shared();
+
+ if (this->nodeExists(node, "Small")) {
+ uint16 small;
+
+ if (!this->asUInt16(node, "Small", small))
+ return 0;
+
+ if (small > 100) {
+ this->invalidWarning(node["Small"], "Small Size Fix %d for %s is out of bounds, defaulting to 100.\n", small, weapon_name.c_str());
+ small = 100;
+ }
+
+ size->small = small;
+ } else {
+ if (!exists)
+ size->small = 100;
+ }
+
+ if (this->nodeExists(node, "Medium")) {
+ uint16 medium;
+
+ if (!this->asUInt16(node, "Medium", medium))
+ return 0;
+
+ if (medium > 100) {
+ this->invalidWarning(node["Medium"], "Medium Size Fix %d for %s is out of bounds, defaulting to 100.\n", medium, weapon_name.c_str());
+ medium = 100;
+ }
+
+ size->medium = medium;
+ } else {
+ if (!exists)
+ size->medium = 100;
+ }
+
+ if (this->nodeExists(node, "Large")) {
+ uint16 large;
+
+ if (!this->asUInt16(node, "Large", large))
+ return 0;
+
+ if (large > 100) {
+ this->invalidWarning(node["Large"], "Large Size Fix %d for %s is out of bounds, defaulting to 100.\n", large, weapon_name.c_str());
+ large = 100;
+ }
+
+ size->large = large;
+ } else {
+ if (!exists)
+ size->large = 100;
+ }
+
+ if (!exists)
+ this->put(weapon_id, size);
+
+ return 1;
+}
+
+SizeFixDatabase size_fix_db;
+
/**
* Returns the status change associated with a skill.
* @param skill The skill to look up
@@ -259,21 +351,41 @@ void initChangeTables(void)
add_sc( MG_STONECURSE , SC_STONE );
add_sc( AL_RUWACH , SC_RUWACH );
add_sc( AL_PNEUMA , SC_PNEUMA );
- set_sc( AL_INCAGI , SC_INCREASEAGI , EFST_INC_AGI, SCB_AGI|SCB_SPEED );
+ set_sc( AL_INCAGI , SC_INCREASEAGI , EFST_INC_AGI, SCB_AGI|SCB_SPEED
+#ifdef RENEWAL
+ |SCB_ASPD );
+#else
+ );
+#endif
set_sc( AL_DECAGI , SC_DECREASEAGI , EFST_DEC_AGI, SCB_AGI|SCB_SPEED );
set_sc( AL_CRUCIS , SC_SIGNUMCRUCIS , EFST_CRUCIS, SCB_DEF );
- set_sc( AL_ANGELUS , SC_ANGELUS , EFST_ANGELUS , SCB_DEF2 );
- set_sc( AL_BLESSING , SC_BLESSING , EFST_BLESSING , SCB_STR|SCB_INT|SCB_DEX );
+ set_sc( AL_ANGELUS , SC_ANGELUS , EFST_ANGELUS , SCB_DEF2
+#ifdef RENEWAL
+ |SCB_MAXHP );
+#else
+ );
+#endif
+ set_sc( AL_BLESSING , SC_BLESSING , EFST_BLESSING , SCB_STR|SCB_INT|SCB_DEX
+#ifdef RENEWAL
+ |SCB_HIT );
+#else
+ );
+#endif
set_sc( AC_CONCENTRATION , SC_CONCENTRATE , EFST_CONCENTRATION, SCB_AGI|SCB_DEX );
set_sc( TF_HIDING , SC_HIDING , EFST_HIDING , SCB_SPEED );
add_sc( TF_POISON , SC_POISON );
- set_sc( KN_TWOHANDQUICKEN , SC_TWOHANDQUICKEN , EFST_TWOHANDQUICKEN , SCB_ASPD );
- set_sc( KN_AUTOCOUNTER , SC_AUTOCOUNTER , EFST_AUTOCOUNTER , SCB_NONE );
- set_sc( PR_IMPOSITIO , SC_IMPOSITIO , EFST_IMPOSITIO ,
-#ifndef RENEWAL
- SCB_WATK );
+ set_sc( KN_TWOHANDQUICKEN , SC_TWOHANDQUICKEN , EFST_TWOHANDQUICKEN , SCB_ASPD
+#ifdef RENEWAL
+ |SCB_HIT|SCB_CRI );
#else
- SCB_NONE );
+ );
+#endif
+ set_sc( KN_AUTOCOUNTER , SC_AUTOCOUNTER , EFST_AUTOCOUNTER , SCB_NONE );
+ set_sc( PR_IMPOSITIO , SC_IMPOSITIO , EFST_IMPOSITIO , SCB_WATK
+#ifdef RENEWAL
+ |SCB_MATK );
+#else
+ );
#endif
set_sc( PR_SUFFRAGIUM , SC_SUFFRAGIUM , EFST_SUFFRAGIUM , SCB_NONE );
set_sc( PR_ASPERSIO , SC_ASPERSIO , EFST_ASPERSIO , SCB_ATK_ELE );
@@ -291,7 +403,12 @@ void initChangeTables(void)
add_sc( WZ_STORMGUST , SC_FREEZE );
set_sc( WZ_QUAGMIRE , SC_QUAGMIRE , EFST_QUAGMIRE , SCB_AGI|SCB_DEX|SCB_ASPD|SCB_SPEED );
add_sc( BS_HAMMERFALL , SC_STUN );
- set_sc( BS_ADRENALINE , SC_ADRENALINE , EFST_ADRENALINE , SCB_ASPD );
+ set_sc( BS_ADRENALINE , SC_ADRENALINE , EFST_ADRENALINE , SCB_ASPD
+#ifdef RENEWAL
+ |SCB_HIT );
+#else
+ );
+#endif
set_sc( BS_WEAPONPERFECT , SC_WEAPONPERFECTION , EFST_WEAPONPERFECT, SCB_NONE );
set_sc( BS_OVERTHRUST , SC_OVERTHRUST , EFST_OVERTHRUST , SCB_NONE );
set_sc( BS_MAXIMIZE , SC_MAXIMIZEPOWER , EFST_MAXIMIZE, SCB_REGEN );
@@ -310,7 +427,12 @@ void initChangeTables(void)
set_sc( SM_AUTOBERSERK , SC_AUTOBERSERK , EFST_AUTOBERSERK , SCB_NONE );
add_sc( TF_SPRINKLESAND , SC_BLIND );
add_sc( TF_THROWSTONE , SC_STUN );
- set_sc( MC_LOUD , SC_LOUD , EFST_SHOUT, SCB_STR );
+ set_sc( MC_LOUD , SC_LOUD , EFST_SHOUT, SCB_STR
+#ifdef RENEWAL
+ |SCB_BATK );
+#else
+ );
+#endif
set_sc( MG_ENERGYCOAT , SC_ENERGYCOAT , EFST_ENERGYCOAT , SCB_NONE );
set_sc( NPC_EMOTION , SC_MODECHANGE , EFST_BLANK , SCB_MODE );
add_sc( NPC_EMOTION_ON , SC_MODECHANGE );
@@ -371,15 +493,43 @@ void initChangeTables(void)
#endif
set_sc( SA_MAGICROD , SC_MAGICROD , EFST_MAGICROD , SCB_NONE );
set_sc( SA_AUTOSPELL , SC_AUTOSPELL , EFST_AUTOSPELL , SCB_NONE );
- set_sc( SA_FLAMELAUNCHER , SC_FIREWEAPON , EFST_PROPERTYFIRE, SCB_ATK_ELE );
- set_sc( SA_FROSTWEAPON , SC_WATERWEAPON , EFST_PROPERTYWATER, SCB_ATK_ELE );
- set_sc( SA_LIGHTNINGLOADER , SC_WINDWEAPON , EFST_PROPERTYWIND, SCB_ATK_ELE );
- set_sc( SA_SEISMICWEAPON , SC_EARTHWEAPON , EFST_PROPERTYGROUND, SCB_ATK_ELE );
- set_sc( SA_VOLCANO , SC_VOLCANO , EFST_GROUNDMAGIC, SCB_WATK );
+ set_sc( SA_FLAMELAUNCHER , SC_FIREWEAPON , EFST_PROPERTYFIRE,
+#ifndef RENEWAL
+ SCB_ATK_ELE );
+#else
+ SCB_ALL );
+#endif
+ set_sc( SA_FROSTWEAPON , SC_WATERWEAPON , EFST_PROPERTYWATER,
+#ifndef RENEWAL
+ SCB_ATK_ELE);
+#else
+ SCB_ALL);
+#endif
+ set_sc( SA_LIGHTNINGLOADER , SC_WINDWEAPON , EFST_PROPERTYWIND,
+#ifndef RENEWAL
+ SCB_ATK_ELE);
+#else
+ SCB_ALL);
+#endif
+ set_sc( SA_SEISMICWEAPON , SC_EARTHWEAPON , EFST_PROPERTYGROUND,
+#ifndef RENEWAL
+ SCB_ATK_ELE);
+#else
+ SCB_ALL );
+#endif
+ set_sc( SA_VOLCANO , SC_VOLCANO , EFST_GROUNDMAGIC, SCB_WATK
+#ifdef RENEWAL
+ |SCB_MATK );
+#else
+ );
+#endif
set_sc( SA_DELUGE , SC_DELUGE , EFST_GROUNDMAGIC, SCB_MAXHP );
set_sc( SA_VIOLENTGALE , SC_VIOLENTGALE , EFST_GROUNDMAGIC, SCB_FLEE );
add_sc( SA_REVERSEORCISH , SC_ORCISH );
add_sc( SA_COMA , SC_COMA );
+#ifdef RENEWAL
+ set_sc( BD_ADAPTATION , SC_ADAPTATION , EFST_ADAPTATION, SCB_NONE );
+#endif
set_sc( BD_ENCORE , SC_DANCING , EFST_BDPLAYING , SCB_SPEED|SCB_REGEN );
set_sc( BD_RICHMANKIM , SC_RICHMANKIM , EFST_RICHMANKIM , SCB_NONE );
set_sc( BD_ETERNALCHAOS , SC_ETERNALCHAOS , EFST_ETERNALCHAOS , SCB_DEF2 );
@@ -393,7 +543,7 @@ void initChangeTables(void)
#ifndef RENEWAL
SCB_WATK );
#else
- SCB_NONE );
+ SCB_ALL );
#endif
set_sc( BD_ROKISWEIL , SC_ROKISWEIL , EFST_ROKISWEIL , SCB_NONE );
set_sc( BD_INTOABYSS , SC_INTOABYSS , EFST_INTOABYSS , SCB_NONE );
@@ -406,7 +556,7 @@ void initChangeTables(void)
add_sc( DC_SCREAM , SC_STUN );
set_sc( DC_HUMMING , SC_HUMMING , EFST_HUMMING , SCB_HIT );
set_sc( DC_DONTFORGETME , SC_DONTFORGETME , EFST_DONTFORGETME , SCB_SPEED|SCB_ASPD );
- set_sc( DC_FORTUNEKISS , SC_FORTUNE , EFST_FORTUNEKISS , SCB_CRI );
+ set_sc( DC_FORTUNEKISS , SC_FORTUNE , EFST_FORTUNEKISS , SCB_ALL );
set_sc( DC_SERVICEFORYOU , SC_SERVICE4U , EFST_SERVICEFORYOU , SCB_ALL );
add_sc( NPC_DARKCROSS , SC_BLIND );
add_sc( NPC_GRANDDARKNESS , SC_BLIND );
@@ -431,9 +581,13 @@ void initChangeTables(void)
#ifndef RENEWAL
EFST_ASSUMPTIO , SCB_NONE );
#else
- EFST_ASSUMPTIO2 , SCB_NONE );
+ EFST_ASSUMPTIO_BUFF , SCB_DEF2 );
#endif
+#ifdef RENEWAL
+ set_sc( HP_BASILICA , SC_BASILICA , EFST_BASILICA_BUFF , SCB_ALL );
+#else
add_sc( HP_BASILICA , SC_BASILICA );
+#endif
set_sc( HW_MAGICPOWER , SC_MAGICPOWER , EFST_MAGICPOWER , SCB_MATK );
add_sc( PA_SACRIFICE , SC_SACRIFICE );
set_sc( PA_GOSPEL , SC_GOSPEL , EFST_GOSPEL , SCB_SPEED|SCB_ASPD );
@@ -492,10 +646,16 @@ void initChangeTables(void)
set_sc( SM_SELFPROVOKE , SC_PROVOKE , EFST_PROVOKE , SCB_DEF|SCB_DEF2|SCB_BATK|SCB_WATK );
set_sc( ST_PRESERVE , SC_PRESERVE , EFST_PRESERVE , SCB_NONE );
set_sc( PF_DOUBLECASTING , SC_DOUBLECAST , EFST_DOUBLECASTING, SCB_NONE );
+#ifndef RENEWAL
set_sc( HW_GRAVITATION , SC_GRAVITATION , EFST_GRAVITATION , SCB_ASPD );
+#endif
add_sc( WS_CARTTERMINATION , SC_STUN );
set_sc( WS_OVERTHRUSTMAX , SC_MAXOVERTHRUST , EFST_OVERTHRUSTMAX, SCB_NONE );
+#ifdef RENEWAL
+ set_sc( CG_SPECIALSINGER , SC_LONGING , EFST_ENSEMBLEFATIGUE , SCB_NONE );
+#else
set_sc( CG_LONGINGFREEDOM , SC_LONGING , EFST_LONGING , SCB_SPEED|SCB_ASPD );
+#endif
set_sc( CG_HERMODE , SC_HERMODE , EFST_HERMODE , SCB_NONE );
set_sc( CG_TAROTCARD , SC_TAROTCARD , EFST_TAROTCARD, SCB_NONE );
set_sc( ITEM_ENCHANTARMS , SC_ENCHANTARMS , EFST_WEAPONPROPERTY, SCB_ATK_ELE );
@@ -1422,14 +1582,18 @@ void initChangeTables(void)
StatusChangeStateTable[SC_BLADESTOP] |= SCS_NOMOVE;
StatusChangeStateTable[SC_BLADESTOP_WAIT] |= SCS_NOMOVE;
StatusChangeStateTable[SC_GOSPEL] |= SCS_NOMOVE|SCS_NOMOVECOND;
+#ifndef RENEWAL
StatusChangeStateTable[SC_BASILICA] |= SCS_NOMOVE|SCS_NOMOVECOND;
+#endif
StatusChangeStateTable[SC_STOP] |= SCS_NOMOVE;
StatusChangeStateTable[SC_CLOSECONFINE] |= SCS_NOMOVE;
StatusChangeStateTable[SC_CLOSECONFINE2] |= SCS_NOMOVE;
StatusChangeStateTable[SC_TINDER_BREAKER] |= SCS_NOMOVE;
StatusChangeStateTable[SC_TINDER_BREAKER2] |= SCS_NOMOVE;
StatusChangeStateTable[SC_MADNESSCANCEL] |= SCS_NOMOVE;
+#ifndef RENEWAL
StatusChangeStateTable[SC_GRAVITATION] |= SCS_NOMOVE|SCS_NOMOVECOND;
+#endif
StatusChangeStateTable[SC_WHITEIMPRISON] |= SCS_NOMOVE;
StatusChangeStateTable[SC_DEEPSLEEP] |= SCS_NOMOVE;
StatusChangeStateTable[SC_ELECTRICSHOCKER] |= SCS_NOMOVE;
@@ -1449,6 +1613,9 @@ void initChangeTables(void)
StatusChangeStateTable[SC_VACUUM_EXTREME] |= SCS_NOMOVE;
StatusChangeStateTable[SC_SUHIDE] |= SCS_NOMOVE;
StatusChangeStateTable[SC_SV_ROOTTWIST] |= SCS_NOMOVE;
+#ifdef RENEWAL
+ StatusChangeStateTable[SC_LONGING] |= SCS_NOMOVE;
+#endif
/* StatusChangeState (SCS_) NOPICKUPITEMS */
StatusChangeStateTable[SC_HIDING] |= SCS_NOPICKITEM;
@@ -1469,6 +1636,10 @@ void initChangeTables(void)
StatusChangeStateTable[SC_SILENCE] |= SCS_NOCAST;
StatusChangeStateTable[SC_STEELBODY] |= SCS_NOCAST;
StatusChangeStateTable[SC_BERSERK] |= SCS_NOCAST;
+#ifdef RENEWAL
+ StatusChangeStateTable[SC_BASILICA_CELL] |= SCS_NOCAST;
+ StatusChangeStateTable[SC_ROKISWEIL] |= SCS_NOCAST;
+#endif
StatusChangeStateTable[SC__BLOODYLUST] |= SCS_NOCAST;
StatusChangeStateTable[SC_DEATHBOUND] |= SCS_NOCAST;
StatusChangeStateTable[SC_OBLIVIONCURSE] |= SCS_NOCAST;
@@ -1742,6 +1913,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
if (src && src->type != BL_PC && !map_flag_gvg2(target->m) && !map_getmapflag(target->m, MF_BATTLEGROUND) && --(sce->val2) <= 0)
status_change_end(target, SC_ENDURE, INVALID_TIMER);
}
+#ifndef RENEWAL
if ((sce=sc->data[SC_GRAVITATION]) && sce->val3 == BCT_SELF) {
struct skill_unit_group* sg = skill_id2group(sce->val4);
if (sg) {
@@ -1750,6 +1922,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
status_change_end(target, SC_GRAVITATION, INVALID_TIMER);
}
}
+#endif
if(sc->data[SC_DANCING] && (unsigned int)hp > status->max_hp>>2)
status_change_end(target, SC_DANCING, INVALID_TIMER);
if(sc->data[SC_CLOAKINGEXCEED] && --(sc->data[SC_CLOAKINGEXCEED]->val2) <= 0)
@@ -2121,6 +2294,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
}
switch( skill_id ) {
+#ifndef RENEWAL
case PA_PRESSURE:
if( flag && target ) {
// Gloria Avoids pretty much everything....
@@ -2129,6 +2303,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
return false;
}
break;
+#endif
case GN_WALLOFTHORN:
if( target && status_isdead(target) )
return false;
@@ -2208,13 +2383,17 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
{ // Lvl 5 Lesson or higher allow you use 3rd job skills while dancing.
if( pc_checkskill((TBL_PC*)src,WM_LESSON) < 5 )
return false;
+#ifndef RENEWAL
} else if(sc->data[SC_LONGING]) { // Allow everything except dancing/re-dancing. [Skotlex]
if (skill_id == BD_ENCORE || skill->inf2[INF2_ISSONG] || skill->inf2[INF2_ISENSEMBLE])
return false;
+#endif
} else if(!skill->inf2[INF2_ALLOWWHENPERFORMING]) // Skills that can be used in dancing state
return false;
+#ifndef RENEWAL
if ((sc->data[SC_DANCING]->val1&0xFFFF) == CG_HERMODE && skill_id == BD_ADAPTATION)
return false; // Can't amp out of Wand of Hermode :/ [Skotlex]
+#endif
}
if (skill_id && // Do not block item-casted skills.
@@ -2222,7 +2401,9 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
) { // Skills blocked through status changes...
if (!flag && ( // Blocked only from using the skill (stuff like autospell may still go through
sc->cant.cast ||
+#ifndef RENEWAL
(sc->data[SC_BASILICA] && (sc->data[SC_BASILICA]->val4 != src->id || skill_id != HP_BASILICA)) || // Only Basilica caster that can cast, and only Basilica to cancel it
+#endif
(sc->data[SC_MARIONETTE] && skill_id != CG_MARIONETTE) || // Only skill you can use is marionette again to cancel it
(sc->data[SC_MARIONETTE2] && skill_id == CG_MARIONETTE) || // Cannot use marionette if you are being buffed by another
(sc->data[SC_ANKLE] && skill_block_check(src, SC_ANKLE, skill_id)) ||
@@ -2235,7 +2416,9 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
// Skill blocking.
if (
(sc->data[SC_VOLCANO] && skill_id == WZ_ICEWALL) ||
+#ifndef RENEWAL
(sc->data[SC_ROKISWEIL] && skill_id != BD_ADAPTATION) ||
+#endif
(sc->data[SC_HERMODE] && skill_get_inf(skill_id) & INF_SUPPORT_SKILL) ||
(sc->data[SC_NOCHAT] && sc->data[SC_NOCHAT]->val1&MANNER_NOSKILL)
)
@@ -2423,6 +2606,8 @@ int status_base_amotion_pc(struct map_session_data* sd, struct status_data* stat
val += 1 + skill_lv;
if ((skill_lv = pc_checkskill(sd,GS_SINGLEACTION)) > 0 && (sd->status.weapon >= W_REVOLVER && sd->status.weapon <= W_GRENADE))
val += ((skill_lv + 1) / 2);
+ if ((skill_lv = pc_checkskill(sd, RG_PLAGIARISM)) > 0)
+ val += skill_lv;
if (pc_isriding(sd))
val -= 50 - 10 * pc_checkskill(sd, KN_CAVALIERMASTERY);
else if (pc_isridingdragon(sd))
@@ -3117,6 +3302,10 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) {
bonus += 30;
if(sc->data[SC_GLASTHEIM_HPSP])
bonus += sc->data[SC_GLASTHEIM_HPSP]->val1;
+#ifdef RENEWAL
+ if (sc->data[SC_ANGELUS])
+ bonus += sc->data[SC_ANGELUS]->val1 * 50;
+#endif
}
} else if (type == STATUS_BONUS_RATE) {
struct status_change *sc = status_get_sc(bl);
@@ -3167,6 +3356,10 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) {
bonus += sc->data[SC_UPHEAVAL_OPTION]->val2;
if(sc->data[SC_LAUDAAGNUS])
bonus += 2 + (sc->data[SC_LAUDAAGNUS]->val1 * 2);
+#ifdef RENEWAL
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_HPRATE)
+ bonus += 30;
+#endif
//Decreasing
if(sc->data[SC_VENOMBLEED])
@@ -3256,6 +3449,12 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) {
bonus += i;
if((i = pc_checkskill(sd,HW_SOULDRAIN)) > 0)
bonus += 2 * i;
+#ifdef RENEWAL
+ if ((i = pc_checkskill(sd, (sd->status.sex ? BA_MUSICALLESSON : DC_DANCINGLESSON))) > 0)
+ bonus += i;
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_SPRATE)
+ bonus += 30;
+#endif
}
//Bonus by SC
@@ -3870,12 +4069,15 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
sd->bonus.splash_range += sd->bonus.splash_add_range;
// Damage modifiers from weapon type
- sd->right_weapon.atkmods[SZ_SMALL] = atkmods[SZ_SMALL][sd->weapontype1];
- sd->right_weapon.atkmods[SZ_MEDIUM] = atkmods[SZ_MEDIUM][sd->weapontype1];
- sd->right_weapon.atkmods[SZ_BIG] = atkmods[SZ_BIG][sd->weapontype1];
- sd->left_weapon.atkmods[SZ_SMALL] = atkmods[SZ_SMALL][sd->weapontype2];
- sd->left_weapon.atkmods[SZ_MEDIUM] = atkmods[SZ_MEDIUM][sd->weapontype2];
- sd->left_weapon.atkmods[SZ_BIG] = atkmods[SZ_BIG][sd->weapontype2];
+ std::shared_ptr right_weapon = size_fix_db.find(sd->weapontype1);
+ std::shared_ptr left_weapon = size_fix_db.find(sd->weapontype2);
+
+ sd->right_weapon.atkmods[SZ_SMALL] = right_weapon->small;
+ sd->right_weapon.atkmods[SZ_MEDIUM] = right_weapon->medium;
+ sd->right_weapon.atkmods[SZ_BIG] = right_weapon->large;
+ sd->left_weapon.atkmods[SZ_SMALL] = left_weapon->small;
+ sd->left_weapon.atkmods[SZ_MEDIUM] = left_weapon->medium;
+ sd->left_weapon.atkmods[SZ_BIG] = left_weapon->large;
if((pc_isriding(sd) || pc_isridingdragon(sd)) &&
(sd->status.weapon==W_1HSPEAR || sd->status.weapon==W_2HSPEAR))
@@ -4092,6 +4294,15 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
if (pc_checkskill(sd, SU_POWEROFLIFE) > 0)
base_status->flee += 20;
+// ----- CRITICAL CALCULATION -----
+
+#ifdef RENEWAL
+ if ((skill = pc_checkskill(sd, DC_DANCINGLESSON)) > 0)
+ base_status->cri += skill * 10;
+ if ((skill = pc_checkskill(sd, PR_MACEMASTERY)) > 0 && (sd->status.weapon == W_MACE || sd->status.weapon == W_2HMACE))
+ base_status->cri += skill * 10;
+#endif
+
// ----- EQUIPMENT-DEF CALCULATION -----
// Apply relative modifiers from equipment
@@ -4225,12 +4436,32 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
sd->subele[ELE_EARTH] += i;
sd->subele[ELE_FIRE] += i;
sd->subele[ELE_WIND] += i;
+#ifndef RENEWAL
sd->subele[ELE_POISON] += i;
sd->subele[ELE_HOLY] += i;
sd->subele[ELE_DARK] += i;
sd->subele[ELE_GHOST] += i;
sd->subele[ELE_UNDEAD] += i;
+#endif
}
+#ifdef RENEWAL
+ if (sc->data[SC_BASILICA]) {
+ i = sc->data[SC_BASILICA]->val1 * 5;
+ sd->right_weapon.addele[ELE_DARK] += i;
+ sd->right_weapon.addele[ELE_UNDEAD] += i;
+ sd->left_weapon.addele[ELE_DARK] += i;
+ sd->left_weapon.addele[ELE_UNDEAD] += i;
+ sd->magic_atk_ele[ELE_HOLY] += sc->data[SC_BASILICA]->val1 * 3;
+ }
+ if (sc->data[SC_FIREWEAPON])
+ sd->magic_atk_ele[ELE_FIRE] += sc->data[SC_FIREWEAPON]->val1;
+ if (sc->data[SC_WINDWEAPON])
+ sd->magic_atk_ele[ELE_WIND] += sc->data[SC_WINDWEAPON]->val1;
+ if (sc->data[SC_WATERWEAPON])
+ sd->magic_atk_ele[ELE_WATER] += sc->data[SC_WATERWEAPON]->val1;
+ if (sc->data[SC_EARTHWEAPON])
+ sd->magic_atk_ele[ELE_EARTH] += sc->data[SC_EARTHWEAPON]->val1;
+#endif
if(sc->data[SC_PROVIDENCE]) {
sd->subele[ELE_HOLY] += sc->data[SC_PROVIDENCE]->val2;
sd->subrace[RC_DEMON] += sc->data[SC_PROVIDENCE]->val2;
@@ -4309,6 +4540,10 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
}
if (sc->data[SC_LAUDARAMUS])
sd->bonus.crit_atk_rate += 5 * sc->data[SC_LAUDARAMUS]->val1;
+#ifdef RENEWAL
+ if (sc->data[SC_FORTUNE])
+ sd->bonus.crit_atk_rate += 2 * sc->data[SC_FORTUNE]->val1;
+#endif
}
status_cpy(&sd->battle_status, base_status);
@@ -4803,6 +5038,14 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str
regen->rate.hp *= 2;
regen->rate.sp *= 2;
}
+#ifdef RENEWAL
+ if (sc->data[SC_NIBELUNGEN]) {
+ if (sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_HPREGEN)
+ regen->rate.hp += 100;
+ else if (sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_SPREGEN)
+ regen->rate.sp += 100;
+ }
+#endif
}
/**
@@ -4827,8 +5070,10 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, enum sc
sc->cant.move += ( start ? 1 : ((sc->cant.move)? -1:0) );
else if(
(sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF) // cannot move while gospel is in effect
+#ifndef RENEWAL
|| (sc->data[SC_BASILICA] && sc->data[SC_BASILICA]->val4 == bl->id) // Basilica caster cannot move
|| (sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF)
+#endif
|| (sc->data[SC_CAMOUFLAGE] && sc->data[SC_CAMOUFLAGE]->val1 < 3)
)
sc->cant.move += ( start ? 1 : ((sc->cant.move)? -1:0) );
@@ -5099,8 +5344,10 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
status->cri = status_calc_critical(bl, sc, b_status->cri + 3*(status->luk - b_status->luk));
/// After status_calc_critical so the bonus is applied despite if you have or not a sc bugreport:5240
- if( bl->type == BL_PC && ((TBL_PC*)bl)->status.weapon == W_KATAR )
- status->cri <<= 1;
+ if (sd) {
+ if (sd->status.weapon == W_KATAR)
+ status->cri <<= 1;
+ }
}
if(flag&SCB_FLEE2 && b_status->flee2) {
@@ -5623,6 +5870,10 @@ static unsigned short status_calc_str(struct block_list *bl, struct status_chang
str += 3;
if(sc->data[SC_GLASTHEIM_STATE])
str += sc->data[SC_GLASTHEIM_STATE]->val1;
+#ifdef RENEWAL
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT)
+ str += 15;
+#endif
return (unsigned short)cap_value(str,0,USHRT_MAX);
}
@@ -5699,6 +5950,10 @@ static unsigned short status_calc_agi(struct block_list *bl, struct status_chang
agi += 3;
if(sc->data[SC_GLASTHEIM_STATE])
agi += sc->data[SC_GLASTHEIM_STATE]->val1;
+#ifdef RENEWAL
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT)
+ agi += 15;
+#endif
return (unsigned short)cap_value(agi,0,USHRT_MAX);
}
@@ -5765,6 +6020,10 @@ static unsigned short status_calc_vit(struct block_list *bl, struct status_chang
vit += 3;
if(sc->data[SC_GLASTHEIM_STATE])
vit += sc->data[SC_GLASTHEIM_STATE]->val1;
+#ifdef RENEWAL
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT)
+ vit += 15;
+#endif
return (unsigned short)cap_value(vit,0,USHRT_MAX);
}
@@ -5846,6 +6105,10 @@ static unsigned short status_calc_int(struct block_list *bl, struct status_chang
if(sc->data[SC__STRIPACCESSORY])
int_ -= int_ * sc->data[SC__STRIPACCESSORY]->val2 / 100;
}
+#ifdef RENEWAL
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT)
+ int_ += 15;
+#endif
return (unsigned short)cap_value(int_,0,USHRT_MAX);
}
@@ -5924,6 +6187,10 @@ static unsigned short status_calc_dex(struct block_list *bl, struct status_chang
dex += 3;
if(sc->data[SC_GLASTHEIM_STATE])
dex += sc->data[SC_GLASTHEIM_STATE]->val1;
+#ifdef RENEWAL
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT)
+ dex += 15;
+#endif
return (unsigned short)cap_value(dex,0,USHRT_MAX);
}
@@ -5988,6 +6255,10 @@ static unsigned short status_calc_luk(struct block_list *bl, struct status_chang
luk += 3;
if(sc->data[SC_GLASTHEIM_STATE])
luk += sc->data[SC_GLASTHEIM_STATE]->val1;
+#ifdef RENEWAL
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT)
+ luk += 15;
+#endif
return (unsigned short)cap_value(luk,0,USHRT_MAX);
}
@@ -6059,6 +6330,12 @@ static unsigned short status_calc_batk(struct block_list *bl, struct status_chan
batk += sc->data[SC_QUEST_BUFF3]->val1;
if (sc->data[SC_SHRIMP])
batk += batk * sc->data[SC_SHRIMP]->val2 / 100;
+#ifdef RENEWAL
+ if (sc->data[SC_LOUD])
+ batk += 30;
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ATKRATE)
+ batk += batk * 20 / 100;
+#endif
return (unsigned short)cap_value(batk,0,USHRT_MAX);
}
@@ -6076,11 +6353,11 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan
return cap_value(watk,0,USHRT_MAX);
#ifndef RENEWAL
- if(sc->data[SC_IMPOSITIO])
- watk += sc->data[SC_IMPOSITIO]->val2;
if(sc->data[SC_DRUMBATTLE])
watk += sc->data[SC_DRUMBATTLE]->val2;
#endif
+ if (sc->data[SC_IMPOSITIO])
+ watk += sc->data[SC_IMPOSITIO]->val2;
if(sc->data[SC_WATKFOOD])
watk += sc->data[SC_WATKFOOD]->val1;
if(sc->data[SC_VOLCANO])
@@ -6176,6 +6453,8 @@ static unsigned short status_calc_ematk(struct block_list *bl, struct status_cha
if (!sc || !sc->count)
return cap_value(matk,0,USHRT_MAX);
+ if (sc->data[SC_IMPOSITIO])
+ matk += sc->data[SC_IMPOSITIO]->val2;
if (sc->data[SC_MATKPOTION])
matk += sc->data[SC_MATKPOTION]->val1;
if (sc->data[SC_MATKFOOD])
@@ -6277,6 +6556,12 @@ static unsigned short status_calc_matk(struct block_list *bl, struct status_chan
matk += 30;
if (sc->data[SC_SHRIMP])
matk += matk * sc->data[SC_SHRIMP]->val2 / 100;
+ if (sc->data[SC_VOLCANO])
+ matk += sc->data[SC_VOLCANO]->val2;
+#ifdef RENEWAL
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_MATKRATE)
+ matk += matk * 20 / 100;
+#endif
return (unsigned short)cap_value(matk,0,USHRT_MAX);
}
@@ -6310,6 +6595,8 @@ static signed short status_calc_critical(struct block_list *bl, struct status_ch
#ifdef RENEWAL
if (sc->data[SC_SPEARQUICKEN])
critical += 3*sc->data[SC_SPEARQUICKEN]->val1*10;
+ if (sc->data[SC_TWOHANDQUICKEN])
+ critical += (2 + sc->data[SC_TWOHANDQUICKEN]->val1) * 10;
#endif
if (sc->data[SC__INVISIBILITY])
critical += sc->data[SC__INVISIBILITY]->val3 * 10;
@@ -6371,6 +6658,16 @@ static signed short status_calc_hit(struct block_list *bl, struct status_change
hit -= sc->data[SC_ILLUSIONDOPING]->val2;
if (sc->data[SC_MTF_ASPD])
hit += sc->data[SC_MTF_ASPD]->val2;
+#ifdef RENEWAL
+ if (sc->data[SC_BLESSING])
+ hit += sc->data[SC_BLESSING]->val1 * 2;
+ if (sc->data[SC_TWOHANDQUICKEN])
+ hit += sc->data[SC_TWOHANDQUICKEN]->val1 * 2;
+ if (sc->data[SC_ADRENALINE])
+ hit += sc->data[SC_ADRENALINE]->val1 * 3 + 5;
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_HIT)
+ hit += 50;
+#endif
return (short)cap_value(hit,1,SHRT_MAX);
}
@@ -6438,6 +6735,8 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change
#ifdef RENEWAL
if( sc->data[SC_SPEARQUICKEN] )
flee += 2 * sc->data[SC_SPEARQUICKEN]->val1;
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_FLEE)
+ flee += 50;
#endif
// Rate value
@@ -6634,6 +6933,8 @@ static signed short status_calc_def2(struct block_list *bl, struct status_change
#ifdef RENEWAL
if (sc->data[SC_SKA])
def2 += 80;
+ if (sc->data[SC_ASSUMPTIO])
+ def2 += sc->data[SC_ASSUMPTIO]->val1 * 50;
#endif
if(sc->data[SC_ANGELUS])
#ifdef RENEWAL /// The VIT stat bonus is boosted by angelus [RENEWAL]
@@ -6824,10 +7125,12 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha
val = sc->data[SC_CHASEWALK]->val3;
else {
val = 0;
+#ifndef RENEWAL
// Longing for Freedom cancels song/dance penalty
if( sc->data[SC_LONGING] )
val = max( val, 50 - 10 * sc->data[SC_LONGING]->val1 );
else
+#endif
if( sd && sc->data[SC_DANCING] )
val = max( val, 500 - (40 + 10 * (sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_BARDDANCER)) * pc_checkskill(sd,(sd->status.sex?BA_MUSICALLESSON:DC_DANCINGLESSON)) );
@@ -6981,6 +7284,7 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b
enum sc_type sc_val;
if (!sc->data[SC_QUAGMIRE]) {
+ // !TODO: How does Two-Hand Quicken, Adrenaline Rush, and Spear quick change? (+10%)
if (bonus < 7 && (sc->data[SC_TWOHANDQUICKEN] || sc->data[SC_ONEHAND] || sc->data[SC_MERC_QUICKEN] || sc->data[SC_ADRENALINE] || sc->data[SC_SPEARQUICKEN]))
bonus = 7;
else if (bonus < 6 && sc->data[SC_ADRENALINE2])
@@ -7022,8 +7326,10 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b
} else {
if (sc->data[SC_DONTFORGETME])
bonus -= sc->data[SC_DONTFORGETME]->val2 / 10;
+#ifndef RENEWAL
if (sc->data[SC_LONGING])
bonus -= sc->data[SC_LONGING]->val2 / 10;
+#endif
if (sc->data[SC_STEELBODY])
bonus -= 25;
if (sc->data[SC_SKA])
@@ -7032,8 +7338,10 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b
bonus -= sc->data[SC_DEFENDER]->val4 / 10;
if (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_ENEMY)
bonus -= 75;
+#ifndef RENEWAL
if (sc->data[SC_GRAVITATION])
bonus -= sc->data[SC_GRAVITATION]->val2 / 10; // Needs more info
+#endif
if (sc->data[SC_JOINTBEAT]) { // Needs more info
if (sc->data[SC_JOINTBEAT]->val2&BREAK_WRIST)
bonus -= 25;
@@ -7080,6 +7388,16 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b
bonus += 3 * sc->data[SC_STAR_COMFORT]->val1;
if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2)
bonus += 10;
+ if (sc->data[SC_INCREASEAGI])
+ bonus += sc->data[SC_INCREASEAGI]->val1;
+ if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ASPDRATE)
+ bonus += 20;
+
+ struct map_session_data* sd = BL_CAST(BL_PC, bl);
+ uint8 skill_lv;
+
+ if (sd && (skill_lv = pc_checkskill(sd, BA_MUSICALLESSON)) > 0)
+ bonus += skill_lv;
}
return bonus;
@@ -7202,8 +7520,10 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change *
if(sc->data[SC_DONTFORGETME])
aspd_rate += sc->data[SC_DONTFORGETME]->val2;
+#ifndef RENEWAL
if(sc->data[SC_LONGING])
aspd_rate += sc->data[SC_LONGING]->val2;
+#endif
if(sc->data[SC_STEELBODY])
aspd_rate += 250;
if(sc->data[SC_SKA])
@@ -7212,8 +7532,10 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change *
aspd_rate += sc->data[SC_DEFENDER]->val4;
if(sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_ENEMY)
aspd_rate += 250;
+#ifndef RENEWAL
if(sc->data[SC_GRAVITATION])
aspd_rate += sc->data[SC_GRAVITATION]->val2;
+#endif
if(sc->data[SC_JOINTBEAT]) {
if( sc->data[SC_JOINTBEAT]->val2&BREAK_WRIST )
aspd_rate += 250;
@@ -8324,8 +8646,13 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
if (sc) {
if (sc->data[SC_SCRESIST])
sc_def += sc->data[SC_SCRESIST]->val1*100; // Status resist
+#ifdef RENEWAL
+ else if (sc->data[SC_SIEGFRIED] && (type == SC_BLIND || type == SC_STONE || type == SC_FREEZE || type == SC_STUN || type == SC_CURSE || type == SC_SLEEP || type == SC_SILENCE))
+ sc_def += sc->data[SC_SIEGFRIED]->val3 * 100; // Status resistance.
+#else
else if (sc->data[SC_SIEGFRIED])
sc_def += sc->data[SC_SIEGFRIED]->val3*100; // Status resistance.
+#endif
else if (sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 2)
sc_def += sc->data[SC_SHIELDSPELL_REF]->val3*100;
}
@@ -8818,7 +9145,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
break;
// Strip skills, need to divest something or it fails.
case SC_STRIPWEAPON:
- if (sd && !(flag&SCSTART_LOADED)) { // Apply sc anyway if loading saved sc_data
+ if (val2 == 1)
+ val2 = 0; // Brandish Spear/Bowling Bash effet. Do not take weapon off.
+ else if (sd && !(flag&SCSTART_LOADED)) { // Apply sc anyway if loading saved sc_data
short i;
opt_flag = 0; // Reuse to check success condition.
if(sd->bonus.unstripable_equip&EQP_WEAPON)
@@ -9023,7 +9352,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_DECREASEAGI:
case SC_PROVOKE:
case SC_COMA:
+#ifndef RENEWAL
case SC_GRAVITATION:
+#endif
case SC_SUITON:
case SC_STRIPWEAPON:
case SC_STRIPARMOR:
@@ -9115,7 +9446,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
status_change_end(bl, SC_CARTBOOST, INVALID_TIMER);
status_change_end(bl, SC_GN_CARTBOOST, INVALID_TIMER);
// Also blocks the ones below...
+#ifndef RENEWAL
case SC_DONTFORGETME:
+#endif
status_change_end(bl, SC_INCREASEAGI, INVALID_TIMER);
status_change_end(bl, SC_ADRENALINE, INVALID_TIMER);
status_change_end(bl, SC_ADRENALINE2, INVALID_TIMER);
@@ -9125,6 +9458,49 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
status_change_end(bl, SC_MERC_QUICKEN, INVALID_TIMER);
status_change_end(bl, SC_ACCELERATION, INVALID_TIMER);
break;
+#ifdef RENEWAL
+ case SC_RICHMANKIM:
+ case SC_ETERNALCHAOS:
+ case SC_DRUMBATTLE:
+ case SC_NIBELUNGEN:
+ case SC_ROKISWEIL:
+ case SC_INTOABYSS:
+ case SC_SIEGFRIED:
+ status_change_end(bl, SC_RICHMANKIM, INVALID_TIMER);
+ status_change_end(bl, SC_ETERNALCHAOS, INVALID_TIMER);
+ status_change_end(bl, SC_DRUMBATTLE, INVALID_TIMER);
+ status_change_end(bl, SC_NIBELUNGEN, INVALID_TIMER);
+ status_change_end(bl, SC_ROKISWEIL, INVALID_TIMER);
+ status_change_end(bl, SC_INTOABYSS, INVALID_TIMER);
+ status_change_end(bl, SC_SIEGFRIED, INVALID_TIMER);
+ break;
+ case SC_WHISTLE:
+ case SC_ASSNCROS:
+ case SC_POEMBRAGI:
+ case SC_APPLEIDUN:
+ status_change_end(bl, SC_WHISTLE, INVALID_TIMER);
+ status_change_end(bl, SC_ASSNCROS, INVALID_TIMER);
+ status_change_end(bl, SC_POEMBRAGI, INVALID_TIMER);
+ status_change_end(bl, SC_APPLEIDUN, INVALID_TIMER);
+ break;
+ case SC_DONTFORGETME:
+ status_change_end(bl, SC_INCREASEAGI, INVALID_TIMER);
+ status_change_end(bl, SC_ADRENALINE, INVALID_TIMER);
+ status_change_end(bl, SC_ADRENALINE2, INVALID_TIMER);
+ status_change_end(bl, SC_SPEARQUICKEN, INVALID_TIMER);
+ status_change_end(bl, SC_TWOHANDQUICKEN, INVALID_TIMER);
+ status_change_end(bl, SC_ONEHAND, INVALID_TIMER);
+ status_change_end(bl, SC_MERC_QUICKEN, INVALID_TIMER);
+ status_change_end(bl, SC_ACCELERATION, INVALID_TIMER);
+ case SC_HUMMING:
+ case SC_FORTUNE:
+ case SC_SERVICE4U:
+ status_change_end(bl, SC_DONTFORGETME, INVALID_TIMER);
+ status_change_end(bl, SC_HUMMING, INVALID_TIMER);
+ status_change_end(bl, SC_FORTUNE, INVALID_TIMER);
+ status_change_end(bl, SC_SERVICE4U, INVALID_TIMER);
+ break;
+#endif
case SC_ADORAMUS:
status_change_end(bl, SC_DECREASEAGI, INVALID_TIMER);
break;
@@ -9161,10 +9537,12 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
status_change_end(bl, SC_TOXIN, INVALID_TIMER);
status_change_end(bl, SC_MAGICMUSHROOM, INVALID_TIMER);
break;
+#ifndef RENEWAL
case SC_KYRIE:
// Cancels Assumptio
status_change_end(bl, SC_ASSUMPTIO, INVALID_TIMER);
break;
+#endif
case SC_DELUGE:
if (sc->data[SC_FOGWALL] && sc->data[SC_BLIND])
status_change_end(bl, SC_BLIND, INVALID_TIMER);
@@ -9198,7 +9576,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
#endif
break;
case SC_ASSUMPTIO:
+#ifndef RENEWAL
status_change_end(bl, SC_KYRIE, INVALID_TIMER);
+#endif
status_change_end(bl, SC_KAITE, INVALID_TIMER);
break;
case SC_KAITE:
@@ -9726,15 +10106,21 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
// Val1 Skill LV of Autospell
// Val2 Skill ID to cast
// Val3 Max Lv to cast
+#ifdef RENEWAL
+ val4 = val1 * 2; // Chance of casting
+#else
val4 = 5 + val1*2; // Chance of casting
+#endif
break;
case SC_VOLCANO:
{
int8 enchant_eff[] = { 10, 14, 17, 19, 20 }; // Enchant addition
uint8 i = max((val1-1)%5, 0);
+#ifdef RENEWAL
+ val2 = 5 + val1 * 5; // ATK/MATK increase
+#else
val2 = val1*10; // Watk increase
-#ifndef RENEWAL
if (status->def_ele != ELE_FIRE)
val2 = 0;
#endif
@@ -9807,9 +10193,55 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val3 = tick/1000; // Tick duration
tick_time = 1000; // [GodLesZ] tick time
break;
+#ifndef RENEWAL
case SC_LONGING:
val2 = 500-100*val1; // Aspd penalty.
break;
+#else
+ case SC_RICHMANKIM:
+ val2 = 10 + 10 * val1; // Exp increase bonus
+ break;
+ case SC_DRUMBATTLE:
+ val2 = 15 + val1 * 5; // Atk increase
+ val3 = val1 * 15; // Def increase
+ break;
+ case SC_NIBELUNGEN:
+ val2 = rnd() % RINGNBL_MAX; // See e_nibelungen_status
+ break;
+ case SC_SIEGFRIED:
+ val2 = val1 * 3; // Elemental Resistance
+ val3 = val1 * 5; // Status ailment resistance
+ break;
+ case SC_WHISTLE:
+ val2 = 18 + 2 * val1; // Flee increase
+ val3 = (val1 + 1) / 2; // Perfect dodge increase
+ break;
+ case SC_ASSNCROS:
+ val2 = val1 < 10 ? val1 * 2 - 1 : 20; // ASPD increase
+ break;
+ case SC_POEMBRAGI:
+ val2 = 2 * val1; // Cast time reduction
+ val3 = 3 * val1; // After-cast delay reduction
+ break;
+ case SC_APPLEIDUN:
+ val2 = val1 < 10 ? 9 + val1 : 20; // HP rate increase
+ val3 = 2 * val1; // Potion recovery rate
+ break;
+ case SC_HUMMING:
+ val2 = 4 * val1; // Hit increase
+ break;
+ case SC_DONTFORGETME:
+ val2 = 1 + 30 * val1; // ASPD decrease
+ val3 = 5 + 2 * val1; // Movement speed adjustment.
+ break;
+ case SC_FORTUNE:
+ val2 = val1 * 10; // Critical increase
+ break;
+ case SC_SERVICE4U:
+ val2 = val1 < 10 ? 9 + val1 : 20; // MaxSP percent increase
+ val3 = 5 + val1; // SP cost reduction
+ break;
+#endif
case SC_EXPLOSIONSPIRITS:
val2 = 75 + 25*val1; // Cri bonus
break;
@@ -10086,9 +10518,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
tick = INFINITE_TICK;
break;
+#ifndef RENEWAL
case SC_GRAVITATION:
val2 = 50*val1; // aspd reduction
break;
+#endif
case SC_REGENERATION:
if (val1 == 1)
@@ -10225,7 +10659,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
struct map_session_data * s_sd = BL_CAST(BL_PC, src);
if (type == SC_OVERTHRUST) {
// val2 holds if it was casted on self, or is bonus received from others
- val3 = (val2) ? 5 * val1 : 5; // Power increase
+#ifdef RENEWAL
+ val3 = (val2) ? 5 * val1 : (val1 > 4) ? 15 : (val1 > 2) ? 10 : 5; // Power increase
+#else
+ val3 = (val2) ? 5 * val1 : 5; // Power increase
+#endif
}
else if (type == SC_ADRENALINE2 || type == SC_ADRENALINE) {
val3 = (val2) ? 300 : 200; // Aspd increase
@@ -10235,16 +10673,21 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
}
break;
case SC_CONCENTRATION:
+#ifdef RENEWAL
+ val2 = 5 + val1 * 2; // Batk/Watk Increase
+ val4 = 5 + val1 * 2; // Def reduction
+#else
val2 = 5*val1; // Batk/Watk Increase
- val3 = 10*val1; // Hit Increase
val4 = 5*val1; // Def reduction
+#endif
+ val3 = 10*val1; // Hit Increase
sc_start(src, bl, SC_ENDURE, 100, 1, tick); // Level 1 Endure effect
break;
case SC_ANGELUS:
val2 = 5*val1; // def increase
break;
case SC_IMPOSITIO:
- val2 = 5*val1; // Watk increase
+ val2 = 5*val1; // WATK/MATK increase
break;
case SC_MELTDOWN:
val2 = 100*val1; // Chance to break weapon
@@ -10395,7 +10838,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val2 = val1*10; // Actual boost (since 100% = 1000)
break;
case SC_SUFFRAGIUM:
+#ifdef RENEWAL
+ val2 = 5 + val1 * 5; // Speed cast decrease
+#else
val2 = 15 * val1; // Speed cast decrease
+#endif
break;
case SC_INCHEALRATE:
if (val1 < 1)
@@ -11102,14 +11549,17 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if( !mobdb_checkid(val1) )
val1 = MOBID_PORING; // Default poring
break;
+#ifndef RENEWAL
case SC_APPLEIDUN:
{
struct map_session_data * s_sd = BL_CAST(BL_PC, src);
+
val2 = (5 + 2 * val1) + (status_get_vit(src) / 10); //HP Rate: (5 + 2 * skill_lv) + (vit/10) + (BA_MUSICALLESSON level)
if (s_sd)
val2 += pc_checkskill(s_sd, BA_MUSICALLESSON) / 2;
break;
}
+#endif
case SC_EPICLESIS:
val2 = 5 * val1; //HP rate bonus
break;
@@ -12431,6 +12881,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
skill_delunitgroup(group);
}
break;
+#ifndef RENEWAL
case SC_HERMODE:
if(sce->val3 == BCT_SELF)
skill_clear_unitgroup(bl);
@@ -12443,6 +12894,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
skill_delunitgroup(group);
}
break;
+#endif
case SC_TRICKDEAD:
if (vd) vd->dead_sit = 0;
break;
@@ -13199,6 +13651,7 @@ TIMER_FUNC(status_change_timer){
if (--sce->val3 <= 0)
break;
switch(sce->val1&0xFFFF) {
+#ifndef RENEWAL
case BD_RICHMANKIM:
case BD_DRUMBATTLEFIELD:
case BD_RINGNIBELUNGEN:
@@ -13223,23 +13676,24 @@ TIMER_FUNC(status_change_timer){
s=5;
break;
case BA_APPLEIDUN:
- #ifdef RENEWAL
- s=5;
- #else
- s=6;
- #endif
+ s=6;
break;
+#endif
case CG_MOONLIT:
// Moonlit's cost is 4sp*skill_lv [Skotlex]
sp= 4*(sce->val1>>16);
// Upkeep is also every 10 secs.
+#ifndef RENEWAL
case DC_DONTFORGETME:
+#endif
s=10;
break;
}
if( s != 0 && sce->val3 % s == 0 ) {
+#ifndef RENEWAL
if (sc->data[SC_LONGING])
sp*= 3;
+#endif
if (!status_charge(bl, 0, sp))
break;
}
@@ -14600,23 +15054,6 @@ static bool status_readdb_status_disabled(char **str, int columns, int current)
return true;
}
-/**
- * Read sizefix database for attack calculations
- * @param fields: Fields passed from sv_readdb
- * @param columns: Columns passed from sv_readdb function call
- * @param current: Current row being read into atkmods array
- * @return True
- */
-static bool status_readdb_sizefix(char* fields[], int columns, int current)
-{
- unsigned int i;
-
- for(i = 0; i < MAX_WEAPON_TYPE; i++)
- atkmods[current][i] = atoi(fields[i]);
-
- return true;
-}
-
/**
* Reads and parses an entry from the refine_db
* @param node: The YAML node containing the entry
@@ -14793,7 +15230,7 @@ static bool status_readdb_attrfix(const char *basedir,bool silent)
* previous functions above, separating information by delimiter
* DBs being read:
* attr_fix.txt: Attribute adjustment table for attacks
- * size_fix.txt: Size adjustment table for weapons
+ * size_fix.yml: Size adjustment table for weapons
* refine_db.txt: Refining data table
* @return 0
*/
@@ -14808,10 +15245,6 @@ int status_readdb(void)
// Initialize databases to default
memset(SCDisabled, 0, sizeof(SCDisabled));
- // size_fix.txt
- for(i=0;i 0); // !TODO use sv_readdb ?
sv_readdb(dbsubpath1, "status_disabled.txt", ',', 2, 2, -1, &status_readdb_status_disabled, i > 0);
- sv_readdb(dbsubpath1, "size_fix.txt",',',MAX_WEAPON_TYPE,MAX_WEAPON_TYPE,ARRAYLENGTH(atkmods),&status_readdb_sizefix, i > 0);
status_yaml_readdb_refine(dbsubpath2, "refine_db.yml");
aFree(dbsubpath1);
aFree(dbsubpath2);
}
+
+ size_fix_db.load();
+
return 0;
}
diff --git a/src/map/status.hpp b/src/map/status.hpp
index 2a23733c1d..14849fb367 100644
--- a/src/map/status.hpp
+++ b/src/map/status.hpp
@@ -4,6 +4,7 @@
#ifndef STATUS_HPP
#define STATUS_HPP
+#include "../common/database.hpp"
#include "../common/mmo.hpp"
#include "../common/timer.hpp"
@@ -59,6 +60,23 @@ struct refine_cost {
int status_get_refine_chance(enum refine_type wlv, int refine, bool enriched);
int status_get_refine_cost(int weapon_lv, int type, bool what);
+/// Weapon attack modification for size
+struct s_sizefix_db {
+ uint16 small, medium, large;
+};
+
+class SizeFixDatabase : public TypesafeYamlDatabase {
+public:
+ SizeFixDatabase() : TypesafeYamlDatabase("SIZE_FIX_DB", 1) {
+
+ }
+
+ const std::string getDefaultLocation();
+ uint64 parseBodyNode(const YAML::Node &node);
+};
+
+extern SizeFixDatabase size_fix_db;
+
/// Status changes listing. These code are for use by the server.
enum sc_type : int16 {
SC_NONE = -1,
@@ -863,6 +881,8 @@ enum sc_type : int16 {
SC_EARTHSHAKER,
SC_WEAPONBLOCK_ON,
SC_SPORE_EXPLOSION,
+ SC_ADAPTATION,
+ SC_BASILICA_CELL, // Used in renewal mode for cell_basilica only
SC_ENTRY_QUEUE_APPLY_DELAY,
SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT,
diff --git a/src/map/unit.cpp b/src/map/unit.cpp
index a9842a5f25..df8f5b8b5e 100644
--- a/src/map/unit.cpp
+++ b/src/map/unit.cpp
@@ -1128,7 +1128,7 @@ int unit_blown(struct block_list* bl, int dx, int dy, int count, enum e_skill_bl
* UB_KNOCKABLE - can be knocked back / stopped
* UB_NO_KNOCKBACK_MAP - at WOE/BG map
* UB_MD_KNOCKBACK_IMMUNE - target is MD_KNOCKBACK_IMMUNE
- * UB_TARGET_BASILICA - target is in Basilica area
+ * UB_TARGET_BASILICA - target is in Basilica area (Pre-Renewal)
* UB_TARGET_NO_KNOCKBACK - target has 'special_state.no_knockback'
* UB_TARGET_TRAP - target is trap that cannot be knocked back
*/
@@ -1148,9 +1148,12 @@ enum e_unit_blown unit_blown_immune(struct block_list* bl, uint8 flag)
break;
case BL_PC: {
struct map_session_data *sd = BL_CAST(BL_PC, bl);
+
+#ifndef RENEWAL
// Basilica caster can't be knocked-back by normal monsters.
if( !(flag&0x4) && sd->sc.data[SC_BASILICA] && sd->sc.data[SC_BASILICA]->val4 == sd->bl.id)
return UB_TARGET_BASILICA;
+#endif
// Target has special_state.no_knockback (equip)
if( (flag&(0x1|0x2)) && !(flag&0x8) && sd->special_state.no_knockback )
return UB_TARGET_NO_KNOCKBACK;
@@ -1389,7 +1392,9 @@ int unit_can_move(struct block_list *bl) {
if( sc->cant.move // status placed here are ones that cannot be cached by sc->cant.move for they depend on other conditions other than their availability
|| sc->data[SC_SPIDERWEB]
|| (sc->data[SC_DANCING] && sc->data[SC_DANCING]->val4 && (
+#ifndef RENEWAL
!sc->data[SC_LONGING] ||
+#endif
(sc->data[SC_DANCING]->val1&0xFFFF) == CG_MOONLIT ||
(sc->data[SC_DANCING]->val1&0xFFFF) == CG_HERMODE
) )
@@ -1799,10 +1804,12 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
if (sc && sc->data[SC_RUN])
casttime = -1;
break;
+#ifndef RENEWAL
case HP_BASILICA:
if( sc && sc->data[SC_BASILICA] )
casttime = -1; // No Casting time on basilica cancel
break;
+#endif
#ifndef RENEWAL_CAST
case KN_CHARGEATK:
{
@@ -2879,7 +2886,11 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
if(sc && sc->count ) { // map-change/warp dispells.
status_change_end(bl, SC_BLADESTOP, INVALID_TIMER);
+#ifdef RENEWAL
+ status_change_end(bl, SC_BASILICA_CELL, INVALID_TIMER);
+#else
status_change_end(bl, SC_BASILICA, INVALID_TIMER);
+#endif
status_change_end(bl, SC_ANKLE, INVALID_TIMER);
status_change_end(bl, SC_TRICKDEAD, INVALID_TIMER);
status_change_end(bl, SC_BLADESTOP_WAIT, INVALID_TIMER);