Compare commits

...

8 Commits

Author SHA1 Message Date
aleos
2e4b2b3808 Documentation fix
Thanks to @Atemo!
2023-08-09 08:11:06 -04:00
aleos
b2441ca177 Suggestion fixes
Thanks to @Lemongrass3110!
2023-08-08 18:46:39 -04:00
aleos
56c69b5da7 Documentation cleanup 2023-08-04 09:52:03 -04:00
aleos
8f6740bbb0 Convert hit rate skill storage to unordered_map
* This allows the option to store skill level for exact requirements.
2023-08-04 08:41:52 -04:00
aleos
12a516e36c Fixes a node check 2023-08-03 14:50:18 -04:00
aleos
691cdb3f79 Splits up the sequence from Skills map 2023-08-03 14:20:56 -04:00
aleos
9ab02557b8 Adds documentation for skill requirements 2023-08-03 13:26:05 -04:00
aleos
8fdac5ecfc Refactor out a lot of hard coded hit rates
* Moves skills that adjust hit rate into the skill database.
2023-08-03 13:18:00 -04:00
9 changed files with 700 additions and 92 deletions

View File

@ -37,6 +37,11 @@
# HitCount: Skill hit count. (Default: 0)
# - Level Skill level.
# Count Number of hits at specific skill level.
# HitRate Skill hit rate.
# Rates: Hit rate. (Default: 100)
# - Level Skill level.
# Rate Rate is a percentage of the caster's hit rate added to hit rate.
# Skills: Skill flagged as a requirement (players only). (Optional)
# Element: Skill element. (Default: Neutral)
# - Level Skill level.
# Element Element at specific skill level.
@ -140,4 +145,4 @@
Header:
Type: SKILL_DB
Version: 3
Version: 4

View File

@ -37,6 +37,11 @@
# HitCount: Skill hit count. (Default: 0)
# - Level Skill level.
# Count Number of hits at specific skill level.
# HitRate Skill hit rate.
# Rates: Hit rate. (Default: 100)
# - Level Skill level.
# Rate Rate is a percentage of the caster's hit rate added to hit rate.
# Skills: Skill flagged as a requirement (players only). (Optional)
# Element: Skill element. (Default: Neutral)
# - Level Skill level.
# Element Element at specific skill level.
@ -140,7 +145,7 @@
Header:
Type: SKILL_DB
Version: 3
Version: 4
Body:
- Id: 1
@ -170,6 +175,28 @@ Body:
Range: -1
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 105
- Level: 2
Rate: 110
- Level: 3
Rate: 115
- Level: 4
Rate: 120
- Level: 5
Rate: 125
- Level: 6
Rate: 130
- Level: 7
Rate: 135
- Level: 8
Rate: 140
- Level: 9
Rate: 145
- Level: 10
Rate: 150
Element: Weapon
CopyFlags:
Skill:
@ -269,6 +296,28 @@ Body:
TargetTrap: true
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 110
- Level: 2
Rate: 120
- Level: 3
Rate: 130
- Level: 4
Rate: 140
- Level: 5
Rate: 150
- Level: 6
Rate: 160
- Level: 7
Rate: 170
- Level: 8
Rate: 180
- Level: 9
Rate: 190
- Level: 10
Rate: 200
Element: Fire
SplashArea:
- Level: 1
@ -2088,6 +2137,28 @@ Body:
Range: -2
Hit: Multi_Hit
HitCount: 3
HitRate:
Rates:
- Level: 1
Rate: 105
- Level: 2
Rate: 110
- Level: 3
Rate: 115
- Level: 4
Rate: 120
- Level: 5
Rate: 125
- Level: 6
Rate: 130
- Level: 7
Rate: 135
- Level: 8
Rate: 140
- Level: 9
Rate: 145
- Level: 10
Rate: 150
Element: Weapon
Requires:
SpCost: 7
@ -2232,6 +2303,8 @@ Body:
Critical: true
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration1:
- Level: 1
@ -4768,6 +4841,30 @@ Body:
Range: 1
Hit: Multi_Hit
HitCount: -8
HitRate:
Rates:
- Level: 1
Rate: 50
- Level: 2
Rate: 50
- Level: 3
Rate: 50
- Level: 4
Rate: 50
- Level: 5
Rate: 50
- Level: 6
Rate: 50
- Level: 7
Rate: 50
- Level: 8
Rate: 50
- Level: 9
Rate: 50
- Level: 10
Rate: 50
Skills:
AS_SONICACCEL: 1
Element: Weapon
AfterCastActDelay: 2000
AfterCastWalkDelay: 2000
@ -5605,6 +5702,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 60000
Status: Poison
@ -5619,6 +5718,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 30000
Status: Blind
@ -5633,6 +5734,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 30000
Status: Silence
@ -5647,6 +5750,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 5000
Status: Stun
@ -5661,6 +5766,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration1: 100
Duration2: 20000
@ -5676,6 +5783,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Dark
Duration2: 30000
Status: Curse
@ -5690,6 +5799,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 30000
Status: Sleep
@ -5716,6 +5827,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Water
- Id: 185
Name: NPC_GROUNDATTACK
@ -5729,6 +5842,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Earth
- Id: 186
Name: NPC_FIREATTACK
@ -5741,6 +5856,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Fire
- Id: 187
Name: NPC_WINDATTACK
@ -5753,6 +5870,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Wind
- Id: 188
Name: NPC_POISONATTACK
@ -5765,6 +5884,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Poison
Status: Poison
- Id: 189
@ -5778,6 +5899,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Holy
- Id: 190
Name: NPC_DARKNESSATTACK
@ -5790,6 +5913,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Dark
- Id: 191
Name: NPC_TELEKINESISATTACK
@ -5802,6 +5927,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Ghost
- Id: 192
Name: NPC_MAGICALATTACK
@ -9380,6 +9507,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Undead
- Id: 348
Name: NPC_CHANGEUNDEAD
@ -9392,6 +9521,8 @@ Body:
Range: -2
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Undead
Duration2: 60000
Status: ChangeUndead
@ -13089,6 +13220,8 @@ Body:
Range: 4
Hit: Multi_Hit
HitCount: 5
HitRate:
Rates: 120
CastTime: 1000
AfterCastActDelay: 1000
Requires:
@ -15599,6 +15732,8 @@ Body:
IgnoreLandProtector: true
Hit: Multi_Hit
HitCount: 1
HitRate:
Rates: 120
SplashArea:
- Level: 1
Area: 5
@ -15659,6 +15794,8 @@ Body:
Range: 6
Hit: Single
HitCount: 1
HitRate:
Rates: 200
Element: Fire
SplashArea: 3
ActiveInstance: 14
@ -15673,6 +15810,8 @@ Body:
Range: 6
Hit: Single
HitCount: 1
HitRate:
Rates: 200
Element: Water
SplashArea: 3
ActiveInstance: 14
@ -15689,6 +15828,8 @@ Body:
Range: 6
Hit: Single
HitCount: 1
HitRate:
Rates: 200
Element: Wind
SplashArea: 3
ActiveInstance: 14
@ -15703,6 +15844,8 @@ Body:
Range: 6
Hit: Single
HitCount: 1
HitRate:
Rates: 200
Element: Poison
SplashArea: 3
ActiveInstance: 14
@ -15719,6 +15862,8 @@ Body:
Range: 6
Hit: Single
HitCount: 1
HitRate:
Rates: 200
Element: Dark
SplashArea: 3
ActiveInstance: 14
@ -15766,6 +15911,8 @@ Body:
Range: -9
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 120000
Status: Bleeding
@ -32261,6 +32408,28 @@ Body:
Range: -1
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 105
- Level: 2
Rate: 110
- Level: 3
Rate: 115
- Level: 4
Rate: 120
- Level: 5
Rate: 125
- Level: 6
Rate: 130
- Level: 7
Rate: 135
- Level: 8
Rate: 140
- Level: 9
Rate: 145
- Level: 10
Rate: 150
Element: Weapon
Requires:
SpCost:
@ -32319,6 +32488,28 @@ Body:
TargetTrap: true
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 110
- Level: 2
Rate: 120
- Level: 3
Rate: 130
- Level: 4
Rate: 140
- Level: 5
Rate: 150
- Level: 6
Rate: 160
- Level: 7
Rate: 170
- Level: 8
Rate: 180
- Level: 9
Rate: 190
- Level: 10
Rate: 200
Element: Fire
SplashArea: 2
Knockback: 2
@ -32773,6 +32964,28 @@ Body:
Range: -2
Hit: Multi_Hit
HitCount: 3
HitRate:
Rates:
- Level: 1
Rate: 105
- Level: 2
Rate: 110
- Level: 3
Rate: 115
- Level: 4
Rate: 120
- Level: 5
Rate: 125
- Level: 6
Rate: 130
- Level: 7
Rate: 135
- Level: 8
Rate: 140
- Level: 9
Rate: 145
- Level: 10
Rate: 150
Element: Weapon
Requires:
SpCost: 7

View File

@ -37,6 +37,11 @@
# HitCount: Skill hit count. (Default: 0)
# - Level Skill level.
# Count Number of hits at specific skill level.
# HitRate Skill hit rate.
# Rates: Hit rate. (Default: 100)
# - Level Skill level.
# Rate Rate is a percentage of the caster's hit rate added to hit rate.
# Skills: Skill flagged as a requirement (players only). (Optional)
# Element: Skill element. (Default: Neutral)
# - Level Skill level.
# Element Element at specific skill level.
@ -140,7 +145,7 @@
Header:
Type: SKILL_DB
Version: 3
Version: 4
Body:
- Id: 1
@ -170,6 +175,28 @@ Body:
Range: -1
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 105
- Level: 2
Rate: 110
- Level: 3
Rate: 115
- Level: 4
Rate: 120
- Level: 5
Rate: 125
- Level: 6
Rate: 130
- Level: 7
Rate: 135
- Level: 8
Rate: 140
- Level: 9
Rate: 145
- Level: 10
Rate: 150
Element: Weapon
CopyFlags:
Skill:
@ -268,6 +295,28 @@ Body:
TargetTrap: true
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 110
- Level: 2
Rate: 120
- Level: 3
Rate: 130
- Level: 4
Rate: 140
- Level: 5
Rate: 150
- Level: 6
Rate: 160
- Level: 7
Rate: 170
- Level: 8
Rate: 180
- Level: 9
Rate: 190
- Level: 10
Rate: 200
Element: Fire
SplashArea:
- Level: 1
@ -2102,6 +2151,28 @@ Body:
Range: -2
Hit: Multi_Hit
HitCount: 3
HitRate:
Rates:
- Level: 1
Rate: 105
- Level: 2
Rate: 110
- Level: 3
Rate: 115
- Level: 4
Rate: 120
- Level: 5
Rate: 125
- Level: 6
Rate: 130
- Level: 7
Rate: 135
- Level: 8
Rate: 140
- Level: 9
Rate: 145
- Level: 10
Rate: 150
Element: Weapon
Requires:
SpCost: 7
@ -2247,6 +2318,8 @@ Body:
Critical: true
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration1:
- Level: 1
@ -5013,6 +5086,30 @@ Body:
Range: 1
Hit: Multi_Hit
HitCount: -8
HitRate:
Rates:
- Level: 1
Rate: 90
- Level: 2
Rate: 90
- Level: 3
Rate: 90
- Level: 4
Rate: 90
- Level: 5
Rate: 90
- Level: 6
Rate: 90
- Level: 7
Rate: 90
- Level: 8
Rate: 90
- Level: 9
Rate: 90
- Level: 10
Rate: 90
Skills:
AS_SONICACCEL: 1
Element: Weapon
Duration2: 4500
Cooldown: 1000
@ -5875,6 +5972,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 18000
Status: Poison
@ -5889,6 +5988,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 18000
Status: Blind
@ -5903,6 +6004,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 18000
Status: Silence
@ -5917,6 +6020,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 4500
Status: Stun
@ -5931,6 +6036,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration1: 100
Duration2: 17000
@ -5946,6 +6053,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Dark
Duration2: 28000
Status: Curse
@ -5960,6 +6069,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 18000
Status: Sleep
@ -5986,6 +6097,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Water
- Id: 185
Name: NPC_GROUNDATTACK
@ -5999,6 +6112,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Earth
- Id: 186
Name: NPC_FIREATTACK
@ -6011,6 +6126,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Fire
- Id: 187
Name: NPC_WINDATTACK
@ -6023,6 +6140,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Wind
- Id: 188
Name: NPC_POISONATTACK
@ -6035,6 +6154,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Poison
Status: Poison
- Id: 189
@ -6048,6 +6169,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Holy
- Id: 190
Name: NPC_DARKNESSATTACK
@ -6060,6 +6183,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Dark
- Id: 191
Name: NPC_TELEKINESISATTACK
@ -6072,6 +6197,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Ghost
- Id: 192
Name: NPC_MAGICALATTACK
@ -6386,6 +6513,28 @@ Body:
Range: -1
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 105
- Level: 2
Rate: 110
- Level: 3
Rate: 115
- Level: 4
Rate: 120
- Level: 5
Rate: 125
- Level: 6
Rate: 130
- Level: 7
Rate: 135
- Level: 8
Rate: 140
- Level: 9
Rate: 145
- Level: 10
Rate: 150
Element: Weapon
CopyFlags:
Skill:
@ -9690,6 +9839,8 @@ Body:
Range: -7
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Undead
- Id: 348
Name: NPC_CHANGEUNDEAD
@ -9702,6 +9853,8 @@ Body:
Range: -2
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Undead
Duration2: 60000
Status: ChangeUndead
@ -13412,6 +13565,8 @@ Body:
Size: 11
Hit: Multi_Hit
HitCount: 5
HitRate:
Rates: 120
Element: Weapon
CastTime: 800
AfterCastActDelay: 1000
@ -15985,6 +16140,8 @@ Body:
IgnoreLandProtector: true
Hit: Multi_Hit
HitCount: 1
HitRate:
Rates: 120
SplashArea:
- Level: 1
Area: 5
@ -16046,6 +16203,8 @@ Body:
Range: 6
Hit: Single
HitCount: 1
HitRate:
Rates: 200
Element: Fire
SplashArea: 3
ActiveInstance: 14
@ -16060,6 +16219,8 @@ Body:
Range: 6
Hit: Single
HitCount: 1
HitRate:
Rates: 200
Element: Water
SplashArea: 3
ActiveInstance: 14
@ -16076,6 +16237,8 @@ Body:
Range: 6
Hit: Single
HitCount: 1
HitRate:
Rates: 200
Element: Wind
SplashArea: 3
ActiveInstance: 14
@ -16090,6 +16253,8 @@ Body:
Range: 6
Hit: Single
HitCount: 1
HitRate:
Rates: 200
Element: Poison
SplashArea: 3
ActiveInstance: 14
@ -16106,6 +16271,8 @@ Body:
Range: 6
Hit: Single
HitCount: 1
HitRate:
Rates: 200
Element: Dark
SplashArea: 3
ActiveInstance: 14
@ -16153,6 +16320,8 @@ Body:
Range: -9
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Weapon
Duration2: 108000
Status: Bleeding
@ -18229,6 +18398,8 @@ Body:
Range: -9
Hit: Single
HitCount: 1
HitRate:
Rates: 120
Element: Neutral
Duration2: 108000
Status: Bleeding
@ -18243,6 +18414,8 @@ Body:
Range: 6
Hit: Single
HitCount: 1
HitRate:
Rates: 200
Element: Water
SplashArea: 4
ActiveInstance: 14
@ -18857,6 +19030,28 @@ Body:
Size: 11
Hit: Single
HitCount: 3
HitRate: # TODO: Confirm rate
Rates:
- Level: 1
Rate: 103
- Level: 2
Rate: 106
- Level: 3
Rate: 109
- Level: 4
Rate: 112
- Level: 5
Rate: 115
- Level: 6
Rate: 118
- Level: 7
Rate: 121
- Level: 8
Rate: 124
- Level: 9
Rate: 127
- Level: 10
Rate: 130
Element: Weapon
CopyFlags:
Skill:
@ -20781,6 +20976,18 @@ Body:
Range: 1
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 114
- Level: 2
Rate: 118
- Level: 3
Rate: 122
- Level: 4
Rate: 126
- Level: 5
Rate: 130
Element: Weapon
AfterCastActDelay: 1000
Requires:
@ -23466,6 +23673,28 @@ Body:
Range: 2
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 70
- Level: 2
Rate: 75
- Level: 3
Rate: 80
- Level: 4
Rate: 85
- Level: 5
Rate: 90
- Level: 6
Rate: 100
- Level: 7
Rate: 105
- Level: 8
Rate: 110
- Level: 9
Rate: 115
- Level: 10
Rate: 120
Element: Weapon
SplashArea:
- Level: 1
@ -24443,6 +24672,28 @@ Body:
Range: 7
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 105
- Level: 2
Rate: 110
- Level: 3
Rate: 115
- Level: 4
Rate: 120
- Level: 5
Rate: 125
- Level: 6
Rate: 130
- Level: 7
Rate: 135
- Level: 8
Rate: 140
- Level: 9
Rate: 145
- Level: 10
Rate: 150
Element: Weapon
Requires:
SpCost:
@ -28738,6 +28989,18 @@ Body:
Name: GN_REMODELING_CART
Description: Cart Remodeling
MaxLevel: 5
HitRate:
Rates:
- Level: 1
Rate: 104
- Level: 2
Rate: 108
- Level: 3
Rate: 112
- Level: 4
Rate: 116
- Level: 5
Rate: 120
- Id: 2476
Name: GN_CART_TORNADO
Description: Cart Tornado
@ -30438,6 +30701,18 @@ Body:
Range: -9
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 10
- Level: 2
Rate: 9
- Level: 3
Rate: 8
- Level: 4
Rate: 7
- Level: 5
Rate: 6
Knockback: 6
CastTime:
- Level: 1
@ -44015,6 +44290,28 @@ Body:
Range: -1
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 105
- Level: 2
Rate: 110
- Level: 3
Rate: 115
- Level: 4
Rate: 120
- Level: 5
Rate: 125
- Level: 6
Rate: 130
- Level: 7
Rate: 135
- Level: 8
Rate: 140
- Level: 9
Rate: 145
- Level: 10
Rate: 150
Element: Weapon
Requires:
SpCost:
@ -44073,6 +44370,28 @@ Body:
TargetTrap: true
Hit: Single
HitCount: 1
HitRate:
Rates:
- Level: 1
Rate: 110
- Level: 2
Rate: 120
- Level: 3
Rate: 130
- Level: 4
Rate: 140
- Level: 5
Rate: 150
- Level: 6
Rate: 160
- Level: 7
Rate: 170
- Level: 8
Rate: 180
- Level: 9
Rate: 190
- Level: 10
Rate: 200
Element: Fire
SplashArea: 2
Knockback: 2
@ -44566,6 +44885,28 @@ Body:
Range: -2
Hit: Multi_Hit
HitCount: 3
HitRate:
Rates:
- Level: 1
Rate: 15
- Level: 2
Rate: 110
- Level: 3
Rate: 115
- Level: 4
Rate: 120
- Level: 5
Rate: 125
- Level: 6
Rate: 130
- Level: 7
Rate: 135
- Level: 8
Rate: 140
- Level: 9
Rate: 145
- Level: 10
Rate: 150
Element: Weapon
Requires:
SpCost: 7

View File

@ -37,6 +37,11 @@
# HitCount: Skill hit count. (Default: 0)
# - Level Skill level.
# Count Number of hits at specific skill level.
# HitRate Skill hit rate.
# Rates: Hit rate. (Default: 100)
# - Level Skill level.
# Rate Rate is a percentage of the caster's hit rate added to hit rate.
# Skills: Skill flagged as a requirement (players only). (Optional)
# Element: Skill element. (Default: Neutral)
# - Level Skill level.
# Element Element at specific skill level.
@ -140,7 +145,7 @@
Header:
Type: SKILL_DB
Version: 3
Version: 4
Footer:
Imports:

View File

@ -3,7 +3,7 @@
//===== By: ==================================================
//= rAthena Dev Team
//===== Last Updated: ========================================
//= 20220126
//= 20230803
//===== Description: =========================================
//= Explanation of the skill_db.yml file and structure.
//============================================================
@ -157,6 +157,41 @@ Sequence Map Form
---------------------------------------
HitRate: Skill hit rate.
Rates - Adjust the hit rate of the skill. Rate is 100% by default.
Can be defined in scalar form or sequence map form:
Scalar Form
HitRate:
Rates: 120 # Skill HitRate is increased by 20%.
HitRate:
Rates: 60 # Skill HitRate is decreased by 40%.
Sequence Map Form
HitRate:
Rates:
- Level: 1
Rate: 120
- Level: 2
Rate: 140
- Level: 3
Rate: 160
- Level: 4
Rate: 180
- Level: 5
Rate: 200
Skills - List of skills required to be learned before hit rate is adjusted. Set skill level to 0 to disable.
Skills: # Requires both NV_BASIC and SM_BASH to be learned. If skill check fails then default (100) value is used.
NV_BASIC: 9 # Requires level 9 of Novice's Basic Skill to be learned.
SM_BASH: 5 # Requires level 5 of Bash to be learned.
SM_MAGNUM: 0 # Remove Magnum Break from requirements. Useful for import.
---------------------------------------
Element: Skill element.
Neutral (Default)

View File

@ -20,6 +20,11 @@
# HitCount: Skill hit count. (Default: 0)
# - Level Skill level.
# Count Number of hits at specific skill level.
# HitRate Skill hit rate.
# Rates: Hit rate. (Default: 100)
# - Level Skill level.
# Rate Rate is a percentage of the caster's hit rate added to hit rate.
# Skills: Skill flagged as a requirement (players only). (Optional)
# Element: Skill element. (Default: Neutral)
# - Level Skill level.
# Element Element at specific skill level.

View File

@ -34,6 +34,8 @@
#include "pc_groups.hpp"
#include "pet.hpp"
using namespace rathena;
struct Battle_Config battle_config;
static struct eri *delay_damage_ers; //For battle delay damage structures.
@ -3097,95 +3099,49 @@ static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct
hitrate += pc_checkskill(sd,AC_VULTURE);
#endif
if(skill_id) {
switch(skill_id) { //Hit skill modifiers
if (skill_id > 0) {
switch (skill_id) { //Hit skill modifiers
//It is proven that bonus is applied on final hitrate, not hit.
case SM_BASH:
case MS_BASH:
hitrate += hitrate * 5 * skill_lv / 100;
break;
case MS_MAGNUM:
case SM_MAGNUM:
hitrate += hitrate * 10 * skill_lv / 100;
break;
case KN_AUTOCOUNTER:
case PA_SHIELDCHAIN:
case NPC_WATERATTACK:
case NPC_GROUNDATTACK:
case NPC_FIREATTACK:
case NPC_WINDATTACK:
case NPC_POISONATTACK:
case NPC_HOLYATTACK:
case NPC_DARKNESSATTACK:
case NPC_TELEKINESISATTACK:
case NPC_UNDEADATTACK:
case NPC_CHANGEUNDEAD:
case NPC_EARTHQUAKE:
case NPC_POISON:
case NPC_BLINDATTACK:
case NPC_SILENCEATTACK:
case NPC_STUNATTACK:
case NPC_PETRIFYATTACK:
case NPC_CURSEATTACK:
case NPC_SLEEPATTACK:
case NPC_BLEEDING:
case NPC_BLEEDING2:
hitrate += hitrate * 20 / 100;
break;
case NPC_FIREBREATH:
case NPC_ICEBREATH:
case NPC_ICEBREATH2:
case NPC_THUNDERBREATH:
case NPC_ACIDBREATH:
case NPC_DARKNESSBREATH:
hitrate *= 2;
break;
case KN_PIERCE:
case ML_PIERCE:
hitrate += hitrate * 5 * skill_lv / 100;
break;
case AS_SONICBLOW:
if(sd && pc_checkskill(sd,AS_SONICACCEL) > 0)
#ifdef RENEWAL
hitrate += hitrate * 90 / 100;
#else
hitrate += hitrate * 50 / 100;
#endif
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;
case MC_CARTREVOLUTION:
case GN_CART_TORNADO:
case GN_CARTCANNON:
if (sd && pc_checkskill(sd, GN_REMODELING_CART))
hitrate += pc_checkskill(sd, GN_REMODELING_CART) * 4;
break;
case LG_BANISHINGPOINT:
hitrate += 5 * skill_lv;
break;
case GC_VENOMPRESSURE:
hitrate += 10 + 4 * skill_lv;
break;
case SC_FATALMENACE:
if (skill_lv < 6)
hitrate -= 35 - 5 * skill_lv;
else if (skill_lv > 6)
hitrate += 5 * skill_lv - 30;
{
uint16 cart_remodel_lv = pc_checkskill(sd, GN_REMODELING_CART);
if (sd && cart_remodel_lv > 0)
hitrate = hitrate * static_cast<int16>(skill_get_hitrate(GN_REMODELING_CART, cart_remodel_lv)) / 100;
}
break;
case RL_SLUGSHOT:
{
int8 dist = distance_bl(src, target);
uint32 dist = distance_bl(src, target);
if (dist > 3) {
// Reduce n hitrate for each cell after initial 3 cells. Different each level
// -10:-9:-8:-7:-6
dist -= 3;
hitrate -= ((11 - skill_lv) * dist);
// Reduce n hitrate for each cell after initial 3 cells.
hitrate -= (static_cast<int16>(skill_get_hitrate(RL_SLUGSHOT, skill_lv)) * (dist - 3));
}
}
break;
default:
{
s_skill_hitrate &skill_hitrate = skill_db.find(skill_id)->hitrate;
if (skill_hitrate.rate[skill_lv] != 100) { // Hit skill modifiers
bool req_fail = false;
// List of skills required to be learned before adjusting hitrate (players only).
if (sd) {
for (const auto &skill_req : skill_hitrate.skills) {
if (pc_checkskill(sd, skill_req.first) < skill_req.second) {
req_fail = true;
break;
}
}
}
// If there were no requirements or the requirements were fulfilled successfully, apply the changed hitrate
if (!req_fail)
hitrate = hitrate * static_cast<int16>(skill_hitrate.rate[skill_lv]) / 100;
}
}
break;

View File

@ -172,6 +172,7 @@ static bool skill_check(uint16 id) {
// Skill DB
e_damage_type skill_get_hit( uint16 skill_id ) { if (!skill_check(skill_id)) return DMG_NORMAL; return skill_db.find(skill_id)->hit; }
int skill_get_hitrate( uint16 skill_id, uint16 skill_lv ) { skill_get_lv(skill_id, skill_lv, skill_db.find(skill_id)->hitrate.rate); }
int skill_get_inf( uint16 skill_id ) { skill_get(skill_id, skill_db.find(skill_id)->inf); }
int skill_get_ele( uint16 skill_id , uint16 skill_lv ) { skill_get_lv(skill_id, skill_lv, skill_db.find(skill_id)->element); }
int skill_get_max( uint16 skill_id ) { skill_get(skill_id, skill_db.find(skill_id)->max); }
@ -23641,6 +23642,45 @@ uint64 SkillDatabase::parseBodyNode(const ryml::NodeRef& node) {
memset(skill->num, 0, sizeof(skill->num));
}
if (this->nodeExists(node, "HitRate")) {
if (!this->parseNode("Rates", "Rate", node["HitRate"], skill->hitrate.rate))
return 0;
const auto &hitrateNode = node["HitRate"];
if (this->nodeExists(hitrateNode, "Skills")) {
const auto &skillsNode = hitrateNode["Skills"];
for (const auto &it : skillsNode) {
std::string req_skill_name;
c4::from_chars(it.key(), &req_skill_name);
uint16 req_skill_id = skill_name2id(req_skill_name.c_str());
if (skill_id == 0) {
this->invalidWarning(skillsNode, "HitRate requires skill %s is invalid.\n", req_skill_name.c_str());
return 0;
}
uint16 req_skill_lv;
if (!this->asUInt16(skillsNode, req_skill_name, req_skill_lv))
return 0;
if (req_skill_lv > 0)
skill->hitrate.skills.insert({ req_skill_id, req_skill_lv });
else {
auto req_exists = util::umap_find(skill->hitrate.skills, req_skill_id);
if (req_exists)
skill->hitrate.skills.erase(req_skill_id);
}
}
}
} else {
if (!exists)
memset(skill->hitrate.rate, 100, sizeof(skill->hitrate.rate));
}
if (this->nodeExists(node, "Element")) {
const auto elementNode = node["Element"];
std::string element;

View File

@ -246,6 +246,12 @@ struct s_skill_copyable { // [Cydh]
uint16 req_opt;
};
/// Skill HitRate structure.
struct s_skill_hitrate{
int32 rate[MAX_SKILL_LEVEL];
std::unordered_map<uint16, uint16> skills;
};
/// Database skills
struct s_skill_db {
uint16 nameid; ///< Skill ID
@ -259,6 +265,7 @@ struct s_skill_db {
int32 splash[MAX_SKILL_LEVEL]; ///< Splash effect
uint16 max; ///< Max level
int32 num[MAX_SKILL_LEVEL]; ///< Number of hit
struct s_skill_hitrate hitrate; ///< Hitrate
bool castcancel; ///< Cancel cast when being hit
uint16 cast_def_rate; ///< Def rate during cast a skill
e_battle_flag skill_type; ///< Skill type
@ -315,7 +322,7 @@ private:
template<typename T, size_t S> bool parseNode(const std::string& nodeName, const std::string& subNodeName, const ryml::NodeRef& node, T(&arr)[S]);
public:
SkillDatabase() : TypesafeCachedYamlDatabase("SKILL_DB", 3, 1) {
SkillDatabase() : TypesafeCachedYamlDatabase("SKILL_DB", 4, 1) {
this->clear();
}
@ -498,6 +505,7 @@ int skill_tree_get_max( uint16 skill_id, int b_class ); // Celest
#define skill_get_index(skill_id) skill_db.get_index((skill_id), false, __FUNCTION__, __FILE__, __LINE__) /// Get skill index from skill_id (common usage on source)
int skill_get_type( uint16 skill_id );
e_damage_type skill_get_hit( uint16 skill_id );
int skill_get_hitrate( uint16 skill_id, uint16 skill_lv );
int skill_get_inf( uint16 skill_id );
int skill_get_ele( uint16 skill_id , uint16 skill_lv );
int skill_get_max( uint16 skill_id );