瀏覽代碼

Fixes HPFactor being way too high (#6909)

- Fixes #6908
- HpFactor default changed from 20000 to 0
- Renamed HPMultiplicator to HpIncrease and SPFactor to SpIncrease so the naming is more consistent
- Fixed an issue with case-sensitivity (HP/SP -> Hp/Sp)
- YAML version of JOB_STATS is now 2
- "csv2yaml" and "yamlupgrade" converters updated accordingly
- Improved documentation

Special thanks to @Lemongrass3110
Playtester 3 年之前
父節點
當前提交
64f10ed10b

+ 4 - 4
db/import-tmpl/job_stats.yml

@@ -25,9 +25,9 @@
 # - Jobs:                    List of jobs associated to group.
 #     Job                    Job name.
 #   MaxWeight                Base maximum weight. (Default: 20000)
-#   HPFactor                 HP increase per base level. Floor(HPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 20000)
-#   HPMultiplicator          Base HP value. 35 + BaseLv * (HPMultiplicator / 100). Used when macro HP_SP_TABLES is disabled. (Default: 500)
-#   SPFactor                 SP increase per job level. Floor(SPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100)]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +78,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 1
+  Version: 2
 
 #Body:
 ###########################################################################

+ 5 - 5
db/job_stats.yml

@@ -23,11 +23,11 @@
 #
 ###########################################################################
 # - Jobs:                    List of jobs associated to group.
-#     Job                    Job ID.
+#     Job                    Job name.
 #   MaxWeight                Base maximum weight. (Default: 20000)
-#   HPFactor                 HP increase per base level. Floor(HPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 20000)
-#   HPMultiplicator          Base HP value. 35 + BaseLv * (HPMultiplicator / 100). Used when macro HP_SP_TABLES is disabled. (Default: 500)
-#   SPFactor                 SP increase per job level. Floor(SPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100)]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +78,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 1
+  Version: 2
 
 Footer:
   Imports:

+ 4 - 4
db/pre-re/job_basepoints.yml

@@ -25,9 +25,9 @@
 # - Jobs:                    List of jobs associated to group.
 #     Job                    Job name.
 #   MaxWeight                Base maximum weight. (Default: 20000)
-#   HPFactor                 HP increase per base level. Floor(HPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 20000)
-#   HPMultiplicator          Base HP value. 35 + BaseLv * (HPMultiplicator / 100). Used when macro HP_SP_TABLES is disabled. (Default: 500)
-#   SPFactor                 SP increase per job level. Floor(SPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100)]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +78,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 1
+  Version: 2
 
 Body:
   - Jobs:

+ 4 - 4
db/pre-re/job_exp.yml

@@ -25,9 +25,9 @@
 # - Jobs:                    List of jobs associated to group.
 #     Job                    Job name.
 #   MaxWeight                Base maximum weight. (Default: 20000)
-#   HPFactor                 HP increase per base level. Floor(HPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 20000)
-#   HPMultiplicator          Base HP value. 35 + BaseLv * (HPMultiplicator / 100). Used when macro HP_SP_TABLES is disabled. (Default: 500)
-#   SPFactor                 SP increase per job level. Floor(SPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100)]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +78,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 1
+  Version: 2
 
 Body:
   - Jobs:

+ 81 - 81
db/pre-re/job_stats.yml

@@ -25,9 +25,9 @@
 # - Jobs:                    List of jobs associated to group.
 #     Job                    Job name.
 #   MaxWeight                Base maximum weight. (Default: 20000)
-#   HPFactor                 HP increase per base level. Floor(HPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 20000)
-#   HPMultiplicator          Base HP value. 35 + BaseLv * (HPMultiplicator / 100). Used when macro HP_SP_TABLES is disabled. (Default: 500)
-#   SPFactor                 SP increase per job level. Floor(SPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100)]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +78,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 1
+  Version: 2
 
 Body:
   - Jobs:
@@ -109,7 +109,7 @@ Body:
       Swordman: true
     MaxWeight: 28000
     HpFactor: 70
-    SpFactor: 200
+    SpIncrease: 200
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -162,7 +162,7 @@ Body:
       Mage: true
     MaxWeight: 22000
     HpFactor: 30
-    SpFactor: 600
+    SpIncrease: 600
     BaseASPD:
       Fist: 500
       Dagger: 600
@@ -209,7 +209,7 @@ Body:
       Archer: true
     MaxWeight: 26000
     HpFactor: 50
-    SpFactor: 200
+    SpIncrease: 200
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -255,7 +255,7 @@ Body:
       Acolyte: true
     MaxWeight: 24000
     HpFactor: 40
-    SpFactor: 500
+    SpIncrease: 500
     BaseASPD:
       Fist: 400
       Mace: 600
@@ -303,7 +303,7 @@ Body:
       Merchant: true
     MaxWeight: 28000
     HpFactor: 40
-    SpFactor: 300
+    SpIncrease: 300
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -353,7 +353,7 @@ Body:
       Thief: true
     MaxWeight: 24000
     HpFactor: 50
-    SpFactor: 200
+    SpIncrease: 200
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -402,7 +402,7 @@ Body:
       Knight2: true
     MaxWeight: 28000
     HpFactor: 150
-    SpFactor: 300
+    SpIncrease: 300
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -479,7 +479,7 @@ Body:
       Priest: true
     MaxWeight: 26000
     HpFactor: 75
-    SpFactor: 800
+    SpIncrease: 800
     BaseASPD:
       Fist: 400
       Mace: 600
@@ -552,7 +552,7 @@ Body:
       Wizard: true
     MaxWeight: 24000
     HpFactor: 55
-    SpFactor: 900
+    SpIncrease: 900
     BaseASPD:
       Fist: 500
       Dagger: 575
@@ -623,7 +623,7 @@ Body:
       Blacksmith: true
     MaxWeight: 30000
     HpFactor: 90
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -697,7 +697,7 @@ Body:
       Hunter: true
     MaxWeight: 27000
     HpFactor: 85
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -767,7 +767,7 @@ Body:
       Assassin: true
     MaxWeight: 24000
     HpFactor: 110
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -840,8 +840,8 @@ Body:
       Crusader2: true
     MaxWeight: 28000
     HpFactor: 110
-    HpMultiplicator: 700
-    SpFactor: 470
+    HpIncrease: 700
+    SpIncrease: 470
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -918,8 +918,8 @@ Body:
       Monk: true
     MaxWeight: 26000
     HpFactor: 90
-    HpMultiplicator: 650
-    SpFactor: 470
+    HpIncrease: 650
+    SpIncrease: 470
     BaseASPD:
       Fist: 400
       Mace: 575
@@ -992,7 +992,7 @@ Body:
       Sage: true
     MaxWeight: 24000
     HpFactor: 75
-    SpFactor: 700
+    SpIncrease: 700
     BaseASPD:
       Fist: 450
       Dagger: 525
@@ -1064,7 +1064,7 @@ Body:
       Rogue: true
     MaxWeight: 24000
     HpFactor: 85
-    SpFactor: 500
+    SpIncrease: 500
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -1135,7 +1135,7 @@ Body:
       Alchemist: true
     MaxWeight: 30000
     HpFactor: 90
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 550
@@ -1209,8 +1209,8 @@ Body:
       Bard: true
     MaxWeight: 27000
     HpFactor: 75
-    HpMultiplicator: 300
-    SpFactor: 600
+    HpIncrease: 300
+    SpIncrease: 600
     BaseASPD:
       Fist: 400
       Dagger: 550
@@ -1281,8 +1281,8 @@ Body:
       Dancer: true
     MaxWeight: 27000
     HpFactor: 75
-    HpMultiplicator: 300
-    SpFactor: 600
+    HpIncrease: 300
+    SpIncrease: 600
     BaseASPD:
       Fist: 400
       Dagger: 550
@@ -1425,8 +1425,8 @@ Body:
       Gunslinger: true
     MaxWeight: 28000
     HpFactor: 89
-    HpMultiplicator: 0
-    SpFactor: 469
+    HpIncrease: 0
+    SpIncrease: 469
     BaseASPD:
       Fist: 500
       Revolver: 700
@@ -1487,8 +1487,8 @@ Body:
       Ninja: true
     MaxWeight: 26000
     HpFactor: 80
-    HpMultiplicator: 0
-    SpFactor: 540
+    HpIncrease: 0
+    SpIncrease: 540
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -1572,7 +1572,7 @@ Body:
       Swordman_High: true
     MaxWeight: 28000
     HpFactor: 70
-    SpFactor: 200
+    SpIncrease: 200
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -1625,7 +1625,7 @@ Body:
       Mage_High: true
     MaxWeight: 22000
     HpFactor: 30
-    SpFactor: 600
+    SpIncrease: 600
     BaseASPD:
       Fist: 500
       Dagger: 600
@@ -1672,7 +1672,7 @@ Body:
       Archer_High: true
     MaxWeight: 26000
     HpFactor: 50
-    SpFactor: 200
+    SpIncrease: 200
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -1718,7 +1718,7 @@ Body:
       Acolyte_High: true
     MaxWeight: 24000
     HpFactor: 40
-    SpFactor: 500
+    SpIncrease: 500
     BaseASPD:
       Fist: 400
       Mace: 600
@@ -1766,7 +1766,7 @@ Body:
       Merchant_High: true
     MaxWeight: 28000
     HpFactor: 40
-    SpFactor: 300
+    SpIncrease: 300
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -1816,7 +1816,7 @@ Body:
       Thief_High: true
     MaxWeight: 24000
     HpFactor: 50
-    SpFactor: 200
+    SpIncrease: 200
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -1865,7 +1865,7 @@ Body:
       Lord_Knight2: true
     MaxWeight: 28000
     HpFactor: 150
-    SpFactor: 300
+    SpIncrease: 300
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -1972,7 +1972,7 @@ Body:
       High_Priest: true
     MaxWeight: 26000
     HpFactor: 75
-    SpFactor: 800
+    SpIncrease: 800
     BaseASPD:
       Fist: 400
       Mace: 600
@@ -2075,7 +2075,7 @@ Body:
       High_Wizard: true
     MaxWeight: 24000
     HpFactor: 55
-    SpFactor: 900
+    SpIncrease: 900
     BaseASPD:
       Fist: 500
       Dagger: 575
@@ -2176,7 +2176,7 @@ Body:
       Whitesmith: true
     MaxWeight: 30000
     HpFactor: 90
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -2280,7 +2280,7 @@ Body:
       Sniper: true
     MaxWeight: 27000
     HpFactor: 85
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -2380,7 +2380,7 @@ Body:
       Assassin_Cross: true
     MaxWeight: 24000
     HpFactor: 110
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -2483,8 +2483,8 @@ Body:
       Paladin2: true
     MaxWeight: 28000
     HpFactor: 110
-    HpMultiplicator: 700
-    SpFactor: 470
+    HpIncrease: 700
+    SpIncrease: 470
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -2591,8 +2591,8 @@ Body:
       Champion: true
     MaxWeight: 26000
     HpFactor: 90
-    HpMultiplicator: 650
-    SpFactor: 470
+    HpIncrease: 650
+    SpIncrease: 470
     BaseASPD:
       Fist: 400
       Mace: 575
@@ -2695,7 +2695,7 @@ Body:
       Professor: true
     MaxWeight: 24000
     HpFactor: 75
-    SpFactor: 700
+    SpIncrease: 700
     BaseASPD:
       Fist: 450
       Dagger: 525
@@ -2797,7 +2797,7 @@ Body:
       Stalker: true
     MaxWeight: 24000
     HpFactor: 85
-    SpFactor: 500
+    SpIncrease: 500
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -2898,7 +2898,7 @@ Body:
       Creator: true
     MaxWeight: 30000
     HpFactor: 90
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 550
@@ -3002,8 +3002,8 @@ Body:
       Clown: true
     MaxWeight: 27000
     HpFactor: 75
-    HpMultiplicator: 300
-    SpFactor: 600
+    HpIncrease: 300
+    SpIncrease: 600
     BaseASPD:
       Fist: 400
       Dagger: 550
@@ -3104,8 +3104,8 @@ Body:
       Gypsy: true
     MaxWeight: 27000
     HpFactor: 75
-    HpMultiplicator: 300
-    SpFactor: 600
+    HpIncrease: 300
+    SpIncrease: 600
     BaseASPD:
       Fist: 400
       Dagger: 550
@@ -3217,7 +3217,7 @@ Body:
       Baby_Swordman: true
     MaxWeight: 28000
     HpFactor: 70
-    SpFactor: 200
+    SpIncrease: 200
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -3270,7 +3270,7 @@ Body:
       Baby_Mage: true
     MaxWeight: 22000
     HpFactor: 30
-    SpFactor: 600
+    SpIncrease: 600
     BaseASPD:
       Fist: 500
       Dagger: 600
@@ -3317,7 +3317,7 @@ Body:
       Baby_Archer: true
     MaxWeight: 26000
     HpFactor: 50
-    SpFactor: 200
+    SpIncrease: 200
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -3363,7 +3363,7 @@ Body:
       Baby_Acolyte: true
     MaxWeight: 24000
     HpFactor: 40
-    SpFactor: 500
+    SpIncrease: 500
     BaseASPD:
       Fist: 400
       Mace: 600
@@ -3411,7 +3411,7 @@ Body:
       Baby_Merchant: true
     MaxWeight: 28000
     HpFactor: 40
-    SpFactor: 300
+    SpIncrease: 300
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -3461,7 +3461,7 @@ Body:
       Baby_Thief: true
     MaxWeight: 24000
     HpFactor: 50
-    SpFactor: 200
+    SpIncrease: 200
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -3510,7 +3510,7 @@ Body:
       Baby_Knight2: true
     MaxWeight: 28000
     HpFactor: 150
-    SpFactor: 300
+    SpIncrease: 300
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -3587,7 +3587,7 @@ Body:
       Baby_Priest: true
     MaxWeight: 26000
     HpFactor: 75
-    SpFactor: 800
+    SpIncrease: 800
     BaseASPD:
       Fist: 400
       Mace: 600
@@ -3660,7 +3660,7 @@ Body:
       Baby_Wizard: true
     MaxWeight: 24000
     HpFactor: 55
-    SpFactor: 900
+    SpIncrease: 900
     BaseASPD:
       Fist: 500
       Dagger: 575
@@ -3731,7 +3731,7 @@ Body:
       Baby_Blacksmith: true
     MaxWeight: 30000
     HpFactor: 90
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -3805,7 +3805,7 @@ Body:
       Baby_Hunter: true
     MaxWeight: 27000
     HpFactor: 85
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 600
@@ -3875,7 +3875,7 @@ Body:
       Baby_Assassin: true
     MaxWeight: 24000
     HpFactor: 110
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -3948,8 +3948,8 @@ Body:
       Baby_Crusader2: true
     MaxWeight: 28000
     HpFactor: 110
-    HpMultiplicator: 700
-    SpFactor: 470
+    HpIncrease: 700
+    SpIncrease: 470
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -4026,8 +4026,8 @@ Body:
       Baby_Monk: true
     MaxWeight: 26000
     HpFactor: 90
-    HpMultiplicator: 650
-    SpFactor: 470
+    HpIncrease: 650
+    SpIncrease: 470
     BaseASPD:
       Fist: 400
       Mace: 575
@@ -4100,7 +4100,7 @@ Body:
       Baby_Sage: true
     MaxWeight: 24000
     HpFactor: 75
-    SpFactor: 700
+    SpIncrease: 700
     BaseASPD:
       Fist: 450
       Dagger: 525
@@ -4172,7 +4172,7 @@ Body:
       Baby_Rogue: true
     MaxWeight: 24000
     HpFactor: 85
-    SpFactor: 500
+    SpIncrease: 500
     BaseASPD:
       Fist: 400
       Dagger: 500
@@ -4243,7 +4243,7 @@ Body:
       Baby_Alchemist: true
     MaxWeight: 30000
     HpFactor: 90
-    SpFactor: 400
+    SpIncrease: 400
     BaseASPD:
       Fist: 400
       Dagger: 550
@@ -4317,8 +4317,8 @@ Body:
       Baby_Bard: true
     MaxWeight: 27000
     HpFactor: 75
-    HpMultiplicator: 300
-    SpFactor: 600
+    HpIncrease: 300
+    SpIncrease: 600
     BaseASPD:
       Fist: 400
       Dagger: 550
@@ -4389,8 +4389,8 @@ Body:
       Baby_Dancer: true
     MaxWeight: 27000
     HpFactor: 75
-    HpMultiplicator: 300
-    SpFactor: 600
+    HpIncrease: 300
+    SpIncrease: 600
     BaseASPD:
       Fist: 400
       Dagger: 550
@@ -4533,7 +4533,7 @@ Body:
       Taekwon: true
     MaxWeight: 28000
     HpFactor: 70
-    SpFactor: 200
+    SpIncrease: 200
     BaseASPD:
       Fist: 400
     BonusStats:
@@ -4578,8 +4578,8 @@ Body:
       Star_Gladiator2: true
     MaxWeight: 28000
     HpFactor: 90
-    HpMultiplicator: 650
-    SpFactor: 470
+    HpIncrease: 650
+    SpIncrease: 470
     BaseASPD:
       Fist: 400
       Book: 500
@@ -4648,7 +4648,7 @@ Body:
       Soul_Linker: true
     MaxWeight: 24000
     HpFactor: 75
-    SpFactor: 900
+    SpIncrease: 900
     BaseASPD:
       Fist: 500
       Dagger: 575

+ 4 - 4
db/re/job_basepoints.yml

@@ -25,9 +25,9 @@
 # - Jobs:                    List of jobs associated to group.
 #     Job                    Job name.
 #   MaxWeight                Base maximum weight. (Default: 20000)
-#   HPFactor                 HP increase per base level. Floor(HPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 20000)
-#   HPMultiplicator          Base HP value. 35 + BaseLv * (HPMultiplicator / 100). Used when macro HP_SP_TABLES is disabled. (Default: 500)
-#   SPFactor                 SP increase per job level. Floor(SPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100)]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +78,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 1
+  Version: 2
 
 Body:
   - Jobs:

+ 4 - 4
db/re/job_exp.yml

@@ -25,9 +25,9 @@
 # - Jobs:                    List of jobs associated to group.
 #     Job                    Job name.
 #   MaxWeight                Base maximum weight. (Default: 20000)
-#   HPFactor                 HP increase per base level. Floor(HPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 20000)
-#   HPMultiplicator          Base HP value. 35 + BaseLv * (HPMultiplicator / 100). Used when macro HP_SP_TABLES is disabled. (Default: 500)
-#   SPFactor                 SP increase per job level. Floor(SPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100)]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +78,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 1
+  Version: 2
 
 Body:
   - Jobs:

文件差異過大導致無法顯示
+ 134 - 134
db/re/job_stats.yml


+ 3 - 3
doc/yaml/db/job_basepoints.yml

@@ -8,9 +8,9 @@
 # - Jobs:                    List of jobs associated to group.
 #     Job                    Job name.
 #   MaxWeight                Base maximum weight. (Default: 20000)
-#   HPFactor                 HP increase per base level. Floor(HPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 20000)
-#   HPMultiplicator          Base HP value. 35 + BaseLv * (HPMultiplicator / 100). Used when macro HP_SP_TABLES is disabled. (Default: 500)
-#   SPFactor                 SP increase per job level. Floor(SPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100)]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.

+ 3 - 3
doc/yaml/db/job_exp.yml

@@ -8,9 +8,9 @@
 # - Jobs:                    List of jobs associated to group.
 #     Job                    Job name.
 #   MaxWeight                Base maximum weight. (Default: 20000)
-#   HPFactor                 HP increase per base level. Floor(HPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 20000)
-#   HPMultiplicator          Base HP value. 35 + BaseLv * (HPMultiplicator / 100). Used when macro HP_SP_TABLES is disabled. (Default: 500)
-#   SPFactor                 SP increase per job level. Floor(SPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100)]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.

+ 3 - 3
doc/yaml/db/job_stats.yml

@@ -8,9 +8,9 @@
 # - Jobs:                    List of jobs associated to group.
 #     Job                    Job name.
 #   MaxWeight                Base maximum weight. (Default: 20000)
-#   HPFactor                 HP increase per base level. Floor(HPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 20000)
-#   HPMultiplicator          Base HP value. 35 + BaseLv * (HPMultiplicator / 100). Used when macro HP_SP_TABLES is disabled. (Default: 500)
-#   SPFactor                 SP increase per job level. Floor(SPFactor / 100) * BaseLv. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100)]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.

+ 13 - 13
src/map/pc.cpp

@@ -12999,7 +12999,7 @@ void SkillTreeDatabase::loadingFinished() {
  */
 static unsigned int pc_calc_basehp(uint16 level, uint16 job_id) {
 	std::shared_ptr<s_job_info> job = job_db.find(job_id);
-	double base_hp = 35 + level * (job->hp_multiplicator / 100.);
+	double base_hp = 35 + level * (job->hp_increase / 100.);
 
 #ifndef RENEWAL
 	if (level >= 10 && (job_id == JOB_NINJA || job_id == JOB_GUNSLINGER))
@@ -13021,7 +13021,7 @@ static unsigned int pc_calc_basehp(uint16 level, uint16 job_id) {
  */
 static unsigned int pc_calc_basesp(uint16 level, uint16 job_id) {
 	std::shared_ptr<s_job_info> job = job_db.find(job_id);
-	double base_sp = 10 + floor(level * (job->sp_factor / 100.));
+	double base_sp = 10 + floor(level * (job->sp_increase / 100.));
 
 	switch (job_id) {
 		case JOB_NINJA:
@@ -13100,40 +13100,40 @@ uint64 JobDatabase::parseBodyNode(const ryml::NodeRef& node) {
 					job->max_weight_base = 20000;
 			}
 
-			if (this->nodeExists(node, "HPFactor")) {
+			if (this->nodeExists(node, "HpFactor")) {
 				uint32 hp;
 
-				if (!this->asUInt32(node, "HPFactor", hp))
+				if (!this->asUInt32(node, "HpFactor", hp))
 					return 0;
 
 				job->hp_factor = hp;
 			} else {
 				if (!exists)
-					job->hp_factor = 20000;
+					job->hp_factor = 0;
 			}
 
-			if (this->nodeExists(node, "HPMultiplicator")) {
+			if (this->nodeExists(node, "HpIncrease")) {
 				uint32 hp;
 
-				if (!this->asUInt32(node, "HPMultiplicator", hp))
+				if (!this->asUInt32(node, "HpIncrease", hp))
 					return 0;
 
-				job->hp_multiplicator = hp;
+				job->hp_increase = hp;
 			} else {
 				if (!exists)
-					job->hp_multiplicator = 500;
+					job->hp_increase = 500;
 			}
 
-			if (this->nodeExists(node, "SPFactor")) {
+			if (this->nodeExists(node, "SpIncrease")) {
 				uint32 sp;
 
-				if (!this->asUInt32(node, "SPFactor", sp))
+				if (!this->asUInt32(node, "SpIncrease", sp))
 					return 0;
 
-				job->sp_factor = sp;
+				job->sp_increase = sp;
 			} else {
 				if (!exists)
-					job->sp_factor = 100;
+					job->sp_increase = 100;
 			}
 
 			if (this->nodeExists(node, "BaseASPD")) {

+ 2 - 2
src/map/pc.hpp

@@ -1002,7 +1002,7 @@ public:
 
 struct s_job_info {
 	std::vector<uint32> base_hp, base_sp, base_ap; //Storage for the first calculation with hp/sp/ap factor and multiplicator
-	uint32 hp_factor, hp_multiplicator, sp_factor, max_weight_base;
+	uint32 hp_factor, hp_increase, sp_increase, max_weight_base;
 	std::vector<std::array<uint16,PARAM_MAX>> job_bonus;
 	std::vector<int16> aspd_base;
 	t_exp base_exp[MAX_LEVEL], job_exp[MAX_LEVEL];
@@ -1016,7 +1016,7 @@ struct s_job_info {
 
 class JobDatabase : public TypesafeCachedYamlDatabase<uint16, s_job_info> {
 public:
-	JobDatabase() : TypesafeCachedYamlDatabase("JOB_STATS", 1) {
+	JobDatabase() : TypesafeCachedYamlDatabase("JOB_STATS", 2) {
 
 	}
 

+ 6 - 6
src/tool/csv2yaml.cpp

@@ -464,20 +464,20 @@ int do_init( int argc, char** argv ){
 		return 0;
 	}
 
-	if (!process("JOB_STATS", 1, root_paths, "job_exp", [](const std::string& path, const std::string& name_ext) -> bool {
+	if (!process("JOB_STATS", 2, root_paths, "job_exp", [](const std::string& path, const std::string& name_ext) -> bool {
 		return sv_readdb(path.c_str(), name_ext.c_str(), ',', 4, 1000 + 3, CLASS_COUNT * 2, &pc_readdb_job_exp, false);
 	}, "job_exp")) {
 		return 0;
 	}
 
-	if (!process("JOB_STATS", 1, root_paths, "job_basehpsp_db", [](const std::string& path, const std::string& name_ext) -> bool {
+	if (!process("JOB_STATS", 2, root_paths, "job_basehpsp_db", [](const std::string& path, const std::string& name_ext) -> bool {
 		return sv_readdb(path.c_str(), name_ext.c_str(), ',', 4, 4 + 500, CLASS_COUNT * 2, &pc_readdb_job_basehpsp, false);
 	}, "job_basepoints")) {
 		return 0;
 	}
 
 	job_txt_data(path_db_mode, path_db);
-	if (!process("JOB_STATS", 1, { path_db_mode }, "job_db1", [](const std::string& path, const std::string& name_ext) -> bool {
+	if (!process("JOB_STATS", 2, { path_db_mode }, "job_db1", [](const std::string& path, const std::string& name_ext) -> bool {
 #ifdef RENEWAL_ASPD
 		return sv_readdb(path.c_str(), name_ext.c_str(), ',', 6 + MAX_WEAPON_TYPE, 6 + MAX_WEAPON_TYPE, CLASS_COUNT, &pc_readdb_job1, false);
 #else
@@ -488,7 +488,7 @@ int do_init( int argc, char** argv ){
 	}
 
 	job_txt_data(path_db_import, path_db_import);
-	if (!process("JOB_STATS", 1, { path_db_import }, "job_db1", [](const std::string& path, const std::string& name_ext) -> bool {
+	if (!process("JOB_STATS", 2, { path_db_import }, "job_db1", [](const std::string& path, const std::string& name_ext) -> bool {
 #ifdef RENEWAL_ASPD
 		return sv_readdb(path.c_str(), name_ext.c_str(), ',', 6 + MAX_WEAPON_TYPE, 6 + MAX_WEAPON_TYPE, CLASS_COUNT, &pc_readdb_job1, false);
 #else
@@ -4390,9 +4390,9 @@ static bool pc_readdb_job1(char* fields[], int columns, int current) {
 	if (atoi(fields[2]) != 0)
 		body << YAML::Key << "HpFactor" << YAML::Value << atoi(fields[2]);
 	if (atoi(fields[3]) != 500)
-		body << YAML::Key << "HpMultiplicator" << YAML::Value << atoi(fields[3]);
+		body << YAML::Key << "HpIncrease" << YAML::Value << atoi(fields[3]);
 	if (atoi(fields[4]) != 100)
-		body << YAML::Key << "SpFactor" << YAML::Value << atoi(fields[4]);
+		body << YAML::Key << "SpIncrease" << YAML::Value << atoi(fields[4]);
 
 	body << YAML::Key << "BaseASPD";
 	body << YAML::BeginMap;

+ 45 - 0
src/tool/yamlupgrade.cpp

@@ -5,6 +5,7 @@
 
 static bool upgrade_achievement_db(std::string file, const uint32 source_version);
 static bool upgrade_item_db(std::string file, const uint32 source_version);
+static bool upgrade_job_stats(std::string file, const uint32 source_version);
 
 template<typename Func>
 bool process(const std::string &type, uint32 version, const std::vector<std::string> &paths, const std::string &name, Func lambda) {
@@ -115,6 +116,12 @@ int do_init(int argc, char** argv) {
 		return 0;
 	}
 
+	if (!process("JOB_STATS", 2, root_paths, "job_stats", [](const std::string& path, const std::string& name_ext, uint32 source_version) -> bool {
+		return upgrade_job_stats(path + name_ext, source_version);
+		})) {
+		return 0;
+	}
+
 	return 0;
 }
 
@@ -248,3 +255,41 @@ static bool upgrade_item_db(std::string file, const uint32 source_version) {
 
 	return true;
 }
+
+static bool upgrade_job_stats(std::string file, const uint32 source_version) {
+	size_t entries = 0;
+
+	for (auto input : inNode["Body"]) {
+		// If under version 2
+		if (source_version < 2) {
+			// Field name changes
+			if (input["HPFactor"].IsDefined()) {
+				input["HpFactor"] = input["HPFactor"].as<uint32>();
+				input.remove("HPFactor");
+			}
+			if (input["HpMultiplicator"].IsDefined()) {
+				input["HpIncrease"] = input["HpMultiplicator"].as<uint32>();
+				input.remove("HpMultiplicator");
+			}
+			if (input["HPMultiplicator"].IsDefined()) {
+				input["HpIncrease"] = input["HPMultiplicator"].as<uint32>();
+				input.remove("HPMultiplicator");
+			}
+			if (input["SpFactor"].IsDefined()) {
+				input["SpIncrease"] = input["SpFactor"].as<uint32>();
+				input.remove("SpFactor");
+			}
+			if (input["SPFactor"].IsDefined()) {
+				input["SpIncrease"] = input["SPFactor"].as<uint32>();
+				input.remove("SPFactor");
+			}
+		}
+
+		body << input;
+		entries++;
+	}
+
+	ShowStatus("Done converting/upgrading '" CL_WHITE "%zu" CL_RESET "' job stats in '" CL_WHITE "%s" CL_RESET "'.\n", entries, file.c_str());
+
+	return true;
+}

部分文件因文件數量過多而無法顯示