From ea8da71cdda5cddbc05cdc736683487e5c14bf08 Mon Sep 17 00:00:00 2001 From: Aleos Date: Fri, 6 Mar 2020 10:57:19 -0500 Subject: [PATCH] Rebalancing of 1st/2nd/Transcendent class skills (#4072) * Fixes #3715. * kRO changelog: http://ro.gnjoy.com/news/notice/View.asp?seq=7040 * Refactored size_fix database to YAML. Thanks to @flamefury for his translations! Thanks to @Angelic234, @mrjnumber1, @Badarosk0, @OptimusM, @attackjom, @Playtester, Melvo, @cydh, @cahya1992, Sigma, @whupdo, @teededung, @ecdarreola, @hotspicy945, @RagnaWay, @sader1992 for bug testing! --- conf/battle/client.conf | 2 +- db/import-tmpl/size_fix.txt | 7 - db/import-tmpl/size_fix.yml | 33 + db/pre-re/size_fix.yml | 38 + db/re/size_fix.yml | 37 + db/re/skill_db.yml | 1699 +++++++++++++++------------------- db/re/skill_nocast_db.txt | 5 + db/re/skill_tree.txt | 12 +- db/size_fix.txt | 11 - db/size_fix.yml | 89 ++ src/map/battle.cpp | 262 ++++-- src/map/clif.cpp | 69 +- src/map/map-server.vcxproj | 1 + src/map/mob.cpp | 5 + src/map/pc.cpp | 34 +- src/map/pc.hpp | 2 +- src/map/script_constants.hpp | 2 + src/map/skill.cpp | 417 +++++++-- src/map/skill.hpp | 18 + src/map/status.cpp | 563 +++++++++-- src/map/status.hpp | 20 + src/map/unit.cpp | 13 +- 22 files changed, 2154 insertions(+), 1185 deletions(-) delete mode 100644 db/import-tmpl/size_fix.txt create mode 100644 db/import-tmpl/size_fix.yml create mode 100644 db/pre-re/size_fix.yml create mode 100644 db/re/size_fix.yml delete mode 100644 db/size_fix.txt create mode 100644 db/size_fix.yml 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);