瀏覽代碼

Merge of Rytech's 4CrAM (#6414)

Merged Rytech2/4CrAM-Open@978d4fc40697faed61a68598657320bd88281a1d

Original author is @Rytech2 and all credits belong to him.
Cleanups by @Lemongrass3110, @aleos89 and @Atemo.

Co-authored-by: Rytech2 <rytech16@gmail.com>
Co-authored-by: aleos <aleos89@users.noreply.github.com>
Co-authored-by: Atemo <capucrath@gmail.com>
Lemongrass3110 3 年之前
父節點
當前提交
7556453dfc
共有 78 個文件被更改,包括 16901 次插入645 次删除
  1. 7 0
      conf/atcommands.yml
  2. 5 0
      conf/battle/exp.conf
  3. 43 4
      conf/battle/player.conf
  4. 7 2
      conf/battle/skill.conf
  5. 7 7
      conf/msg_conf/char_msg.conf
  6. 22 2
      conf/msg_conf/map_msg.conf
  7. 3 1
      db/import-tmpl/mob_db.yml
  8. 10 1
      db/import-tmpl/skill_db.yml
  9. 2 1
      db/import-tmpl/statpoint.yml
  10. 3 1
      db/mob_db.yml
  11. 3 1
      db/pre-re/mob_db.yml
  12. 10 1
      db/pre-re/skill_db.yml
  13. 2 1
      db/pre-re/statpoint.yml
  14. 70 0
      db/re/elemental_db.yml
  15. 3 0
      db/re/item_db_equip.yml
  16. 31 14
      db/re/item_db_etc.yml
  17. 107 1
      db/re/item_db_usable.yml
  18. 4210 14
      db/re/job_basepoints.yml
  19. 30 1
      db/re/job_noenter_map.txt
  20. 203 17
      db/re/mob_db.yml
  21. 14 0
      db/re/mob_skill_db.txt
  22. 38 0
      db/re/produce_db.txt
  23. 6309 173
      db/re/skill_db.yml
  24. 3 0
      db/re/skill_nocast_db.txt
  25. 1187 0
      db/re/skill_tree.yml
  26. 127 76
      db/re/statpoint.yml
  27. 10 1
      db/skill_db.yml
  28. 2 1
      db/statpoint.yml
  29. 140 0
      db/status_disabled.txt
  30. 18 11
      doc/item_bonus.txt
  31. 1 1
      doc/item_db.txt
  32. 8 0
      doc/mob_db.txt
  33. 28 0
      doc/script_commands.txt
  34. 63 0
      doc/skill_db.txt
  35. 2 0
      doc/yaml/db/mob_db.yml
  36. 9 0
      doc/yaml/db/skill_db.yml
  37. 1 0
      doc/yaml/db/statpoint.yml
  38. 2 0
      doc/yaml/sql/mob_db2_re.sql
  39. 2 0
      doc/yaml/sql/mob_db_re.sql
  40. 41 13
      npc/custom/jobmaster.txt
  41. 25 0
      npc/other/CashShop_Functions.txt
  42. 9 0
      sql-files/main.sql
  43. 2 0
      sql-files/mob_db2_re.sql
  44. 2 0
      sql-files/mob_db_re.sql
  45. 11 0
      sql-files/upgrades/upgrade_20211230.sql
  46. 35 7
      src/char/char.cpp
  47. 4 0
      src/char/char_logif.cpp
  48. 4 1
      src/char/inter.cpp
  49. 10 4
      src/common/mmo.hpp
  50. 2 2
      src/config/packets.hpp
  51. 206 25
      src/map/atcommand.cpp
  52. 741 17
      src/map/battle.cpp
  53. 13 1
      src/map/battle.hpp
  54. 34 23
      src/map/chrif.cpp
  55. 247 3
      src/map/clif.cpp
  56. 6 1
      src/map/clif.hpp
  57. 4 0
      src/map/clif_packetdb.hpp
  58. 60 10
      src/map/elemental.cpp
  59. 8 0
      src/map/elemental.hpp
  60. 1 1
      src/map/itemdb.hpp
  61. 3 0
      src/map/map.cpp
  62. 5 0
      src/map/map.hpp
  63. 38 2
      src/map/mob.cpp
  64. 9 1
      src/map/mob.hpp
  65. 7 0
      src/map/packets.hpp
  66. 3 0
      src/map/party.cpp
  67. 529 92
      src/map/pc.cpp
  68. 36 13
      src/map/pc.hpp
  69. 75 0
      src/map/script.cpp
  70. 4 0
      src/map/script.hpp
  71. 160 1
      src/map/script_constants.hpp
  72. 685 25
      src/map/skill.cpp
  73. 270 3
      src/map/skill.hpp
  74. 591 36
      src/map/status.cpp
  75. 228 26
      src/map/status.hpp
  76. 41 2
      src/map/unit.cpp
  77. 4 4
      src/tool/csv2yaml.cpp
  78. 6 0
      src/tool/yaml2sql.cpp

+ 7 - 0
conf/atcommands.yml

@@ -335,6 +335,10 @@ Body:
     Help: |
       Params: [<HP> <SP>]
       Heals the desired amount of HP and SP. No value specified will do a full heal.
+  - Command: healap
+    Help: |
+      Params: [<AP>]
+      Heals the desired amount of AP. No value specified will do a full AP heal.
   - Command: dye
     Aliases:
       - ccolor
@@ -480,6 +484,9 @@ Body:
   - Command: stpoint
     Help: |
       Params: <number of points> - Gives you the desired number of stat points.
+  - Command: trpoint
+    Help: |
+      Params: <number of points> - Gives you the desired number of trait stat points.
   - Command: skpoint
     Help: |
       Params: <number of points> - Gives you the desired number of skill points.

+ 5 - 0
conf/battle/exp.conf

@@ -102,6 +102,11 @@ disp_zeny: no
 // through external means (ie: stat point buyers/sellers)
 use_statpoint_table: yes
 
+// Use the contents of db/statpoint.yml when doing a stats reset and leveling up? (Note 1)
+// If no, an equation will be used which preserves trait points earned/lost 
+// through external means (ie: trait point buyers/sellers)
+use_traitpoint_table: yes
+
 // EXP cost for cast PR_REDEMPTIO (Note 2)
 exp_cost_redemptio: 1
 

+ 43 - 4
conf/battle/player.conf

@@ -108,14 +108,11 @@ max_baby_parameter: 80
 max_baby_third_parameter: 117
 max_extended_parameter: 125
 max_summoner_parameter: 120
-max_fourth_parameter: 135
+max_fourth_parameter: 130
 
 // Status points bonus for transcendent class
 transcendent_status_points: 52
 
-// Maximum traits for fourth class. (pow, sta, wis, spl, con, and crt)
-max_fourth_trait: 100
-
 // Max armor def/mdef
 // NOTE: This setting have no effect if server is run on Renewal Mode (RENEWAL) 
 // NOTE: does not affects skills and status effects like Mental Strength
@@ -288,3 +285,45 @@ idletime_option: 0x7C1F
 // - Summoners are small size (0) instead of medium (1)
 summoner_race: 11
 summoner_size: 0
+
+//================================
+// 4th Job Systems
+//================================
+// How many trait points do players get when changing to a 4th job?
+// Default: 7
+trait_points_job_change: 7
+
+// Max trait stats cap.
+// Trait Stats: POW, STA, WIS, SPL, CON, CRT
+// Official is 100.
+max_trait_parameter: 100
+
+// Max amount of RES/MRES to take into the resistance damage reduction formula.
+// A setting of 625 means the max reduction of damage allowed is 50.0%.
+// Formula is 100 - 100 * (5000 + RES) / (5000 + 10 * RES)
+// Note: Best to leave this setting alone unless you know what your doing.
+// Default: 625
+max_res_mres_reduction: 625
+
+// Maximum AP
+// Default: 1000
+max_ap: 1000
+
+// Players' maximum AP rate? (Default is 100)
+ap_rate: 100
+
+// The amount of AP a player will respawn with, 0 is default.
+// (Unit is in percentage of total AP, 100 is full heal of AP, 0 is respawn with 0 AP total.)
+restart_ap_rate: 0
+
+// Is AP lost when the player dies?
+// Default: yes
+loose_ap_on_death: yes
+
+// Is AP lost when the player enters a PVP/GVG/WoE/Battleground maps?
+// Default: yes
+loose_ap_on_map: yes
+
+// Do player's keep their AP when logging out?
+// Default: yes
+keep_ap_on_logout: yes

+ 7 - 2
conf/battle/skill.conf

@@ -274,8 +274,9 @@ sg_miracle_skill_duration: 3600000
 sg_angel_skill_ratio: 10
 
 // Skills that bHealPower has effect on
-// 1: Heal, 2: Sanctuary, 4: Potion Pitcher, 8: Slim Pitcher, 16: Apple of Idun
-skill_add_heal_rate: 7
+// 1: Heal, 2: Sanctuary, 4: Potion Pitcher, 8: Slim Pitcher, 16: Apple of Idun,
+// 32: Coluceo Heal, 64: Highness Heal, 128: Mediale Votum, 256: Dilectio Heal
+skill_add_heal_rate: 487
 
 // Whether the damage of EarthQuake with a single target on screen is able to be reflected.
 // Note: On official servers, EQ is reflectable when there is only one target on the screen, 
@@ -410,3 +411,7 @@ skill_drop_items_full: no
 // 2: Enabled on renewal.
 // 3: 1+2
 switch_remove_edp: 2
+
+// Max Level Difference when casting Meister's Attack Machine on other party members.
+// Default: 15
+attack_machine_level_difference: 15

+ 7 - 7
conf/msg_conf/char_msg.conf

@@ -142,13 +142,13 @@
 132: Inquisitor
 133: Troubadour
 134: Trouvere
-144: Sky Emperor
-145: Soul Ascetic
-146: Shinkiro
-147: Shiranui
-148: Night Watch
-149: Hyper Novice
-150: Spirit Handler
+135: Sky Emperor
+136: Soul Ascetic
+137: Shinkiro
+138: Shiranui
+139: Night Watch
+140: Hyper Novice
+141: Spirit Handler
 
 199: Unknown Job
 

+ 22 - 2
conf/msg_conf/map_msg.conf

@@ -899,7 +899,27 @@
 818: Hyper Novice
 819: Spirit Handler
 
-//820-899 free
+// @trpoint
+820: Please enter a number (usage: @trpoint <number of points>).
+
+// @chargeap
+821: AP recovered.
+822: AP modified.
+823: AP have already been recovered.
+
+// @displayskillcast
+824: Usage: @displayskillcast <skill ID> {<skill level> <ground target flag> <cast time>}
+
+// @displayskill (2nd Message Line)
+825: Effect Types: 0: All, 1: Damage, 2: Splash Dmg, 3: No Damage, 4: Ground
+
+// @displayskillunit
+826: Usage: @displayskillunit <unit ID> {<skill level> <range>}
+
+// @mobinfo RES/MRES
+827:  RES:%d  MRES:%d
+
+//828-899 free
 
 //------------------------------------
 // More atcommands message
@@ -1220,7 +1240,7 @@
 1165: Usage: @useskill <skill ID> <skill level> <char name>
 
 // @displayskill
-1166: Usage: @displayskill <skill ID> {<skill level>}
+1166: Usage: @displayskill <skill ID> {<skill level> <type>}
 
 // @skilltree
 1167: Usage: @skilltree <skill ID> <char name>

+ 3 - 1
db/import-tmpl/mob_db.yml

@@ -36,6 +36,8 @@
 #   Attack2                 Maximum attack in pre-renewal and base magic attack in renewal. (Default: 0)
 #   Defense                 Physical defense of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
 #   MagicDefense            Magic defense of the monster, reduces magical skill damage. (Default: 0)
+#   Resistance              Physical resistance of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
+#   MagicResistance         Magic resistance of the monster, reduces magical skill damage. (Default: 0)
 #   Str                     Strength which affects attack. (Default: 1)
 #   Agi                     Agility which affects flee. (Default: 1)
 #   Vit                     Vitality which affects defense. (Default: 1)
@@ -75,7 +77,7 @@
 
 Header:
   Type: MOB_DB
-  Version: 2
+  Version: 3
 
 #Body:
 # eAthena Dev Team

+ 10 - 1
db/import-tmpl/skill_db.yml

@@ -49,6 +49,9 @@
 #   Knockback:                Amount of tiles the skill knockbacks. (Default: 0)
 #     - Level                 Skill level.
 #       Amount                Knockback count at specific skill level.
+#   GiveAp:                   Gives AP on successful skill cast. (Default: 0)
+#     - Level                 Skill level.
+#       Amount                AP gained at specific skill level.
 #   CopyFlags:                Determines if the skill is copyable. (Optional)
 #     Skill:                  Type of skill that can copy.
 #     RemoveRequirement:      Remove a requirement type. (Optional)
@@ -87,12 +90,18 @@
 #     SpCost:                 SP required to cast. (Default: 0)
 #       - Level               Skill level.
 #         Amount              SP required at specific skill level.
+#     ApCost:                 AP required to cast. (Default: 0)
+#       - Level               Skill level.
+#         Amount              AP required at specific skill level.
 #     HpRateCost:             HP rate required to cast. If positive, uses current HP, else uses Max HP. (Default: 0)
 #       - Level               Skill level.
 #         Amount              HP rate required at specific skill level.
 #     SpRateCost:             SP rate required to cast. If positive, uses current SP, else uses Max SP. (Default: 0)
 #       - Level               Skill level.
 #         Amount              SP rate required at specific skill level.
+#     ApRateCost:             AP rate required to cast. If positive, uses current AP, else uses Max AP. (Default: 0)
+#       - Level               Skill level.
+#         Amount              AP rate required at specific skill level.
 #     MaxHpTrigger:           Maximum amount of HP to cast the skill. (Default: 0)
 #       - Level               Skill level.
 #         Amount              Maximum HP trigger required at specific skill level.
@@ -130,4 +139,4 @@
 
 Header:
   Type: SKILL_DB
-  Version: 2
+  Version: 3

+ 2 - 1
db/import-tmpl/statpoint.yml

@@ -24,8 +24,9 @@
 ###########################################################################
 # - Level             BaseLevel required.
 #   Points            Total status points given from BaseLevel 1 to 'Level'.
+#   TraitPoints       Total trait points given from BaseLevel 1 to 'Level'.
 ###########################################################################
 
 Header:
   Type: STATPOINT_DB
-  Version: 1
+  Version: 2

+ 3 - 1
db/mob_db.yml

@@ -36,6 +36,8 @@
 #   Attack2                 Maximum attack in pre-renewal and base magic attack in renewal. (Default: 0)
 #   Defense                 Physical defense of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
 #   MagicDefense            Magic defense of the monster, reduces magical skill damage. (Default: 0)
+#   Resistance              Physical resistance of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
+#   MagicResistance         Magic resistance of the monster, reduces magical skill damage. (Default: 0)
 #   Str                     Strength which affects attack. (Default: 1)
 #   Agi                     Agility which affects flee. (Default: 1)
 #   Vit                     Vitality which affects defense. (Default: 1)
@@ -75,7 +77,7 @@
 
 Header:
   Type: MOB_DB
-  Version: 2
+  Version: 3
 
 Footer:
   Imports:

+ 3 - 1
db/pre-re/mob_db.yml

@@ -36,6 +36,8 @@
 #   Attack2                 Maximum attack in pre-renewal and base magic attack in renewal. (Default: 0)
 #   Defense                 Physical defense of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
 #   MagicDefense            Magic defense of the monster, reduces magical skill damage. (Default: 0)
+#   Resistance              Physical resistance of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
+#   MagicResistance         Magic resistance of the monster, reduces magical skill damage. (Default: 0)
 #   Str                     Strength which affects attack. (Default: 1)
 #   Agi                     Agility which affects flee. (Default: 1)
 #   Vit                     Vitality which affects defense. (Default: 1)
@@ -75,7 +77,7 @@
 
 Header:
   Type: MOB_DB
-  Version: 2
+  Version: 3
 
 Body:
   - Id: 1001

+ 10 - 1
db/pre-re/skill_db.yml

@@ -49,6 +49,9 @@
 #   Knockback:                Amount of tiles the skill knockbacks. (Default: 0)
 #     - Level                 Skill level.
 #       Amount                Knockback count at specific skill level.
+#   GiveAp:                   Gives AP on successful skill cast. (Default: 0)
+#     - Level                 Skill level.
+#       Amount                AP gained at specific skill level.
 #   CopyFlags:                Determines if the skill is copyable. (Optional)
 #     Skill:                  Type of skill that can copy.
 #     RemoveRequirement:      Remove a requirement type. (Optional)
@@ -87,12 +90,18 @@
 #     SpCost:                 SP required to cast. (Default: 0)
 #       - Level               Skill level.
 #         Amount              SP required at specific skill level.
+#     ApCost:                 AP required to cast. (Default: 0)
+#       - Level               Skill level.
+#         Amount              AP required at specific skill level.
 #     HpRateCost:             HP rate required to cast. If positive, uses current HP, else uses Max HP. (Default: 0)
 #       - Level               Skill level.
 #         Amount              HP rate required at specific skill level.
 #     SpRateCost:             SP rate required to cast. If positive, uses current SP, else uses Max SP. (Default: 0)
 #       - Level               Skill level.
 #         Amount              SP rate required at specific skill level.
+#     ApRateCost:             AP rate required to cast. If positive, uses current AP, else uses Max AP. (Default: 0)
+#       - Level               Skill level.
+#         Amount              AP rate required at specific skill level.
 #     MaxHpTrigger:           Maximum amount of HP to cast the skill. (Default: 0)
 #       - Level               Skill level.
 #         Amount              Maximum HP trigger required at specific skill level.
@@ -130,7 +139,7 @@
 
 Header:
   Type: SKILL_DB
-  Version: 2
+  Version: 3
 
 Body:
   - Id: 1

+ 2 - 1
db/pre-re/statpoint.yml

@@ -24,11 +24,12 @@
 ###########################################################################
 # - Level             BaseLevel required.
 #   Points            Total status points given from BaseLevel 1 to 'Level'.
+#   TraitPoints       Total trait points given from BaseLevel 1 to 'Level'.
 ###########################################################################
 
 Header:
   Type: STATPOINT_DB
-  Version: 1
+  Version: 2
 
 Body:
   - Level: 1

+ 70 - 0
db/re/elemental_db.yml

@@ -234,3 +234,73 @@ Body:
         Skill: EL_POWER_OF_GAIA
       Aggressive:
         Skill: EL_STONE_RAIN
+  - Id: 20816
+    AegisName: EM_DILUVIO
+    Name: Diluvio
+    Level: 200
+    Size: Large
+    Element: Water
+    ElementLevel: 4
+    Mode:
+      Passive:
+        Skill: EM_EL_COLD_FORCE
+      Assist:
+        Skill: EM_EL_CRYSTAL_ARMOR
+      Aggressive:
+        Skill: EM_EL_AGE_OF_ICE
+  - Id: 20817
+    AegisName: EM_ARDOR
+    Name: Ardor
+    Level: 200
+    Size: Large
+    Element: Fire
+    ElementLevel: 4
+    Mode:
+      Passive:
+        Skill: EM_EL_FLAMETECHNIC
+      Assist:
+        Skill: EM_EL_FLAMEARMOR
+      Aggressive:
+        Skill: EM_EL_FLAMEROCK
+  - Id: 20818
+    AegisName: EM_PROCELLA
+    Name: Procella
+    Level: 200
+    Size: Large
+    Element: Wind
+    ElementLevel: 4
+    Mode:
+      Passive:
+        Skill: EM_EL_GRACE_BREEZE
+      Assist:
+        Skill: EM_EL_EYES_OF_STORM
+      Aggressive:
+        Skill: EM_EL_STORM_WIND
+  - Id: 20819
+    AegisName: EM_TERREMOTUS
+    Name: Terremotus
+    Level: 200
+    Size: Large
+    Element: Earth
+    ElementLevel: 4
+    Mode:
+      Passive:
+        Skill: EM_EL_EARTH_CARE
+      Assist:
+        Skill: EM_EL_STRONG_PROTECTION
+      Aggressive:
+        Skill: EM_EL_AVALANCHE
+  - Id: 20820
+    AegisName: EM_SERPENS
+    Name: Serpens
+    Level: 200
+    Size: Large
+    Element: Poison
+    ElementLevel: 4
+    Mode:
+      Passive:
+        Skill: EM_EL_DEEP_POISONING
+      Assist:
+        Skill: EM_EL_POISON_SHIELD
+      Aggressive:
+        Skill: EM_EL_DEADLY_POISON

+ 3 - 0
db/re/item_db_equip.yml

@@ -144377,6 +144377,7 @@ Body:
     AegisName: 4th_Q_Necklace
     Name: Hourglass Necklace
     Type: Armor
+    Buy: 20
     Locations:
       Both_Accessory: true
     ArmorLevel: 1
@@ -144390,6 +144391,8 @@ Body:
       NoGuildStorage: true
       NoMail: true
       NoAuction: true
+    Script: |
+      bonus bAllTraits,6-(JobLevel/5);
   - Id: 490090
     AegisName: aegis_490090
     Name: Aegir Ring

+ 31 - 14
db/re/item_db_etc.yml

@@ -31918,7 +31918,7 @@ Body:
     Name: Special Alloy Trap
     Type: Etc
     Buy: 300
-    Weight: 1
+    Weight: 2
     Flags:
       BuyingStore: true
   - Id: 7941
@@ -56651,36 +56651,43 @@ Body:
     AegisName: Beaker
     Name: Beaker
     Type: Etc
+    Buy: 1000
     Weight: 1
   - Id: 1000276
     AegisName: Flame_Acid_Bottle
     Name: Flame Acid Bottle
     Type: Etc
+    Buy: 20
     Weight: 1
   - Id: 1000277
     AegisName: Earth_Acid_Bottle
     Name: Earth Acid Bottle
     Type: Etc
+    Buy: 20
     Weight: 1
   - Id: 1000278
     AegisName: Gale_Acid_Bottle
     Name: Gale Acid Bottle
     Type: Etc
+    Buy: 20
     Weight: 1
   - Id: 1000279
     AegisName: Icicle_Acid_Bottle
     Name: Icicle Acid Bottle
     Type: Etc
+    Buy: 20
     Weight: 1
   - Id: 1000280
     AegisName: High_Coating_Bottle
-    Name: Advanced Coating Potion
+    Name: High Coating Bottle
     Type: Etc
+    Buy: 20
     Weight: 1
   - Id: 1000281
     AegisName: High_Plant_Bottle
-    Name: Greater Plant Bottle
+    Name: High Plant Bottle
     Type: Etc
+    Buy: 20
     Weight: 1
   - Id: 1000282
     AegisName: EpisodClear16
@@ -56724,38 +56731,45 @@ Body:
       NoAuction: true
   - Id: 1000289
     AegisName: Device_Capsule
-    Name: Machine Capsule
+    Name: Device Capsule
     Type: Etc
+    Buy: 20
     Weight: 5
   - Id: 1000290
     AegisName: Auto_Battle_Capsule
-    Name: ABR Capsule
+    Name: Auto Battle Capsule
     Type: Etc
+    Buy: 20
     Weight: 10
   - Id: 1000291
     AegisName: Wind_Stone_4th
-    Name: Lightning Stone
+    Name: Wind Stone 4th
     Type: Etc
+    Buy: 1000
     Weight: 1
   - Id: 1000292
     AegisName: Earth_Stone_4th
-    Name: Earth Stone
+    Name: Earth Stone 4th
     Type: Etc
+    Buy: 1000
     Weight: 1
   - Id: 1000293
     AegisName: Flame_Stone_4th
-    Name: Fire Stone
+    Name: Flame Stone 4th
     Type: Etc
+    Buy: 1000
     Weight: 1
   - Id: 1000294
     AegisName: Poison_Stone_4th
-    Name: Poison Stone
+    Name: Poison Stone 4th
     Type: Etc
+    Buy: 1000
     Weight: 1
   - Id: 1000295
     AegisName: Ice_Stone_4th
-    Name: Ice Stone
+    Name: Ice Stone 4th
     Type: Etc
+    Buy: 1000
     Weight: 1
   - Id: 1000296
     AegisName: RuneknightStone_Robe2
@@ -56821,6 +56835,7 @@ Body:
     AegisName: Hawk_Flute
     Name: Hawk Flute
     Type: Etc
+    Buy: 20
     Trade:
       Override: 100
       NoDrop: true
@@ -56952,13 +56967,15 @@ Body:
     Flags:
       BuyingStore: true
   - Id: 1000346
-    AegisName: aegis_1000346
-    Name: Guide for 4th Job Change
+    AegisName: 4th_Job_Guide
+    Name: 4th Job Guide
     Type: Etc
+    Buy: 20
   - Id: 1000352
-    AegisName: aegis_1000352
-    Name: Machine Creation Guide
+    AegisName: Device_Creation_Guide
+    Name: Device Creation Guide
     Type: Etc
+    Buy: 20
     Weight: 10
   - Id: 1000363
     AegisName: MD_Airboat_Tokken

+ 107 - 1
db/re/item_db_usable.yml

@@ -1857,7 +1857,7 @@ Body:
     Flags:
       BuyingStore: true
     Script: |
-      if (Class == Job_Assassin_Cross || Class == Job_Guillotine_Cross || Class == Job_Guillotine_Cross_T) {
+      if (Class == Job_Assassin_Cross || Class == Job_Guillotine_Cross || Class == Job_Guillotine_Cross_T || Class == Job_Shadow_Cross) {
          sc_start SC_DPOISON,60000,0;
          sc_start SC_ASPDPOTION3,60000,9;
       }
@@ -50841,6 +50841,48 @@ Body:
       BuyingStore: true
     Script: |
       /* upgradeui 100436; */
+  - Id: 100452
+    AegisName: Minus_POW
+    Name: POW Reduction Potion
+    Type: Delayconsume
+    Buy: 10
+    Script: |
+      callfunc "F_CashReduceTraitStat",bPow,-1,100452;
+  - Id: 100453
+    AegisName: Minus_SPL
+    Name: SPL Reduction Potion
+    Type: Delayconsume
+    Buy: 10
+    Script: |
+      callfunc "F_CashReduceTraitStat",bSpl,-1,100453;
+  - Id: 100454
+    AegisName: Minus_STA
+    Name: STA Reduction Potion
+    Type: Delayconsume
+    Buy: 10
+    Script: |
+      callfunc "F_CashReduceTraitStat",bSta,-1,100454;
+  - Id: 100455
+    AegisName: Minus_WIS
+    Name: WIS Reduction Potion
+    Type: Delayconsume
+    Buy: 10
+    Script: |
+      callfunc "F_CashReduceTraitStat",bWis,-1,100455;
+  - Id: 100456
+    AegisName: Minus_CON
+    Name: CON Reduction Potion
+    Type: Delayconsume
+    Buy: 10
+    Script: |
+      callfunc "F_CashReduceTraitStat",bCon,-1,100456;
+  - Id: 100457
+    AegisName: Minus_CRT
+    Name: CRT Reduction Potion
+    Type: Delayconsume
+    Buy: 10
+    Script: |
+      callfunc "F_CashReduceTraitStat",bCrt,-1,100457;
   - Id: 100466
     AegisName: Egir_Power_Box
     Name: Aegir's Power Box
@@ -50921,6 +50963,70 @@ Body:
       Container: true
     Script: |
       /* getgroupitem(IG_Enchant_Stone_Box22); */
+  - Id: 100516
+    AegisName: Eye_Cleaner
+    Name: Eye Cleaner
+    Type: Healing
+    Buy: 20
+    Weight: 50
+    Script: |
+      sc_end SC_HANDICAPSTATE_DEEPBLIND;
+  - Id: 100517
+    AegisName: Ear_Cleaner
+    Name: Ear Cleaner
+    Type: Healing
+    Buy: 20
+    Weight: 50
+    Script: |
+      sc_end SC_HANDICAPSTATE_DEEPSILENCE;
+  - Id: 100518
+    AegisName: Tonics
+    Name: Tonics
+    Type: Healing
+    Buy: 20
+    Weight: 50
+    Script: |
+      sc_end SC_HANDICAPSTATE_LASSITUDE;
+  - Id: 100519
+    AegisName: Mini_Extinguisher
+    Name: Mini Extinguisher
+    Type: Healing
+    Buy: 20
+    Weight: 50
+    Script: |
+      sc_end SC_HANDICAPSTATE_CONFLAGRATION;
+  - Id: 100520
+    AegisName: Water_Of_Lucky
+    Name: Water Of Lucky
+    Type: Healing
+    Buy: 20
+    Weight: 50
+    Script: |
+      sc_end SC_HANDICAPSTATE_MISFORTUNE;
+  - Id: 100521
+    AegisName: Strong_Antidote
+    Name: Strong Antidote
+    Type: Healing
+    Buy: 20
+    Weight: 50
+    Script: |
+      sc_end SC_HANDICAPSTATE_DEADLYPOISON;
+  - Id: 100522
+    AegisName: High_Energy_Chocolate
+    Name: High Energy Chocolate
+    Type: Healing
+    Buy: 20
+    Weight: 50
+    Script: |
+      sc_end SC_HANDICAPSTATE_DEPRESSION;
+  - Id: 100523
+    AegisName: Refined_Holy_Water
+    Name: Refined Holy Water
+    Type: Healing
+    Buy: 20
+    Weight: 50
+    Script: |
+      sc_end SC_HANDICAPSTATE_HOLYFLAME;
   - Id: 100572
     AegisName: FullPeneShadow_Mix
     Name: Full Penetration Shadow Thump Box

+ 4210 - 14
db/re/job_basepoints.yml

@@ -289,7 +289,6 @@ Body:
       Super_Baby: true
       Super_Novice_E: true
       Super_Baby_E: true
-      Hyper_Novice: true
     BaseHp:
       - Level: 1
         Hp: 40
@@ -7505,7 +7504,6 @@ Body:
   - Jobs:
       Rebellion: true
       Baby_Rebellion: true
-      Night_Watch: true
     BaseHp:
       - Level: 99
         Hp: 4938
@@ -7916,7 +7914,6 @@ Body:
   - Jobs:
       Kagerou: true
       Baby_Kagerou: true
-      Shinkiro: true
     BaseHp:
       - Level: 99
         Hp: 4250
@@ -8125,7 +8122,6 @@ Body:
   - Jobs:
       Oboro: true
       Baby_Oboro: true
-      Shiranui: true
     BaseHp:
       - Level: 99
         Hp: 4250
@@ -9545,7 +9541,6 @@ Body:
   - Jobs:
       Summoner: true
       Baby_Summoner: true
-      Spirit_Handler: true
     BaseHp:
       - Level: 1
         Hp: 40
@@ -9906,7 +9901,6 @@ Body:
       Super_Baby: true
       Super_Novice_E: true
       Super_Baby_E: true
-      Hyper_Novice: true
     BaseSp:
       - Level: 1
         Sp: 11
@@ -16922,7 +16916,6 @@ Body:
       Rebellion: true
       Baby_Gunslinger: true
       Baby_Rebellion: true
-      Night_Watch: true
     BaseSp:
       - Level: 1
         Sp: 12
@@ -17529,7 +17522,6 @@ Body:
   - Jobs:
       Kagerou: true
       Baby_Kagerou: true
-      Shinkiro: true
     BaseSp:
       - Level: 99
         Sp: 522
@@ -17738,7 +17730,6 @@ Body:
   - Jobs:
       Oboro: true
       Baby_Oboro: true
-      Shiranui: true
     BaseSp:
       - Level: 99
         Sp: 522
@@ -19158,7 +19149,6 @@ Body:
   - Jobs:
       Summoner: true
       Baby_Summoner: true
-      Spirit_Handler: true
     BaseSp:
       - Level: 1
         Sp: 8
@@ -19516,7 +19506,6 @@ Body:
       Baby_Star_Emperor: true
       Star_Emperor2: true
       Baby_Star_Emperor2: true
-      Sky_Emperor: true
     BaseHp:
       - Level: 99
         Hp: 4300
@@ -19676,7 +19665,6 @@ Body:
   - Jobs:
       Soul_Reaper: true
       Baby_Soul_Reaper: true
-      Soul_Ascetic: true
     BaseHp:
       - Level: 99
         Hp: 4300
@@ -19838,7 +19826,6 @@ Body:
       Baby_Star_Emperor: true
       Star_Emperor2: true
       Baby_Star_Emperor2: true
-      Sky_Emperor: true
     BaseSp:
       - Level: 99
         Sp: 522
@@ -19998,7 +19985,6 @@ Body:
   - Jobs:
       Soul_Reaper: true
       Baby_Soul_Reaper: true
-      Soul_Ascetic: true
     BaseSp:
       - Level: 99
         Sp: 900
@@ -20155,3 +20141,4213 @@ Body:
       - Level: 175
         Sp: 1615
       # Levels 176-200 are unknown
+  - Jobs:
+      Dragon_Knight: true
+      Dragon_Knight2: true
+    BaseHp:
+      - Level: 200
+        Hp: 22875
+      - Level: 201
+        Hp: 23050
+      - Level: 202
+        Hp: 23225
+      - Level: 203
+        Hp: 23400
+      - Level: 204
+        Hp: 23575
+      - Level: 205
+        Hp: 23750
+      - Level: 206
+        Hp: 23925
+      - Level: 207
+        Hp: 24100
+      - Level: 208
+        Hp: 24275
+      - Level: 209
+        Hp: 24450
+      - Level: 210
+        Hp: 24625
+      - Level: 211
+        Hp: 24800
+      - Level: 212
+        Hp: 24975
+      - Level: 213
+        Hp: 25150
+      - Level: 214
+        Hp: 25325
+      - Level: 215
+        Hp: 25500
+      - Level: 216
+        Hp: 25675
+      - Level: 217
+        Hp: 25850
+      - Level: 218
+        Hp: 26025
+      - Level: 219
+        Hp: 26200
+      - Level: 220
+        Hp: 26375
+      - Level: 221
+        Hp: 26550
+      - Level: 222
+        Hp: 26725
+      - Level: 223
+        Hp: 26900
+      - Level: 224
+        Hp: 27075
+      - Level: 225
+        Hp: 27250
+      - Level: 226
+        Hp: 27425
+      - Level: 227
+        Hp: 27600
+      - Level: 228
+        Hp: 27775
+      - Level: 229
+        Hp: 27950
+      - Level: 230
+        Hp: 28125
+      - Level: 231
+        Hp: 28300
+      - Level: 232
+        Hp: 28475
+      - Level: 233
+        Hp: 28650
+      - Level: 234
+        Hp: 28825
+      - Level: 235
+        Hp: 29000
+      - Level: 236
+        Hp: 29175
+      - Level: 237
+        Hp: 29350
+      - Level: 238
+        Hp: 29525
+      - Level: 239
+        Hp: 29700
+      - Level: 240
+        Hp: 29875
+      - Level: 241
+        Hp: 30050
+      - Level: 242
+        Hp: 30225
+      - Level: 243
+        Hp: 30400
+      - Level: 244
+        Hp: 30575
+      - Level: 245
+        Hp: 30750
+      - Level: 246
+        Hp: 30925
+      - Level: 247
+        Hp: 31100
+      - Level: 248
+        Hp: 31275
+      - Level: 249
+        Hp: 31450
+      - Level: 250
+        Hp: 31625
+  - Jobs:
+      Meister: true
+      Meister2: true
+    BaseHp:
+      - Level: 200
+        Hp: 21000
+      - Level: 201
+        Hp: 21175
+      - Level: 202
+        Hp: 21350
+      - Level: 203
+        Hp: 21525
+      - Level: 204
+        Hp: 21700
+      - Level: 205
+        Hp: 21875
+      - Level: 206
+        Hp: 22050
+      - Level: 207
+        Hp: 22225
+      - Level: 208
+        Hp: 22400
+      - Level: 209
+        Hp: 22575
+      - Level: 210
+        Hp: 22750
+      - Level: 211
+        Hp: 22925
+      - Level: 212
+        Hp: 23100
+      - Level: 213
+        Hp: 23275
+      - Level: 214
+        Hp: 23450
+      - Level: 215
+        Hp: 23625
+      - Level: 216
+        Hp: 23800
+      - Level: 217
+        Hp: 23975
+      - Level: 218
+        Hp: 24150
+      - Level: 219
+        Hp: 24325
+      - Level: 220
+        Hp: 24500
+      - Level: 221
+        Hp: 24675
+      - Level: 222
+        Hp: 24850
+      - Level: 223
+        Hp: 25025
+      - Level: 224
+        Hp: 25200
+      - Level: 225
+        Hp: 25375
+      - Level: 226
+        Hp: 25550
+      - Level: 227
+        Hp: 25725
+      - Level: 228
+        Hp: 25900
+      - Level: 229
+        Hp: 26075
+      - Level: 230
+        Hp: 26250
+      - Level: 231
+        Hp: 26425
+      - Level: 232
+        Hp: 26600
+      - Level: 233
+        Hp: 26775
+      - Level: 234
+        Hp: 26950
+      - Level: 235
+        Hp: 27125
+      - Level: 236
+        Hp: 27300
+      - Level: 237
+        Hp: 27475
+      - Level: 238
+        Hp: 27650
+      - Level: 239
+        Hp: 27825
+      - Level: 240
+        Hp: 28000
+      - Level: 241
+        Hp: 28175
+      - Level: 242
+        Hp: 28350
+      - Level: 243
+        Hp: 28525
+      - Level: 244
+        Hp: 28700
+      - Level: 245
+        Hp: 28875
+      - Level: 246
+        Hp: 29050
+      - Level: 247
+        Hp: 29225
+      - Level: 248
+        Hp: 29400
+      - Level: 249
+        Hp: 29575
+      - Level: 250
+        Hp: 29750
+  - Jobs:
+      Shadow_Cross: true
+    BaseHp:
+      - Level: 200
+        Hp: 20725
+      - Level: 201
+        Hp: 20875
+      - Level: 202
+        Hp: 21025
+      - Level: 203
+        Hp: 21175
+      - Level: 204
+        Hp: 21325
+      - Level: 205
+        Hp: 21475
+      - Level: 206
+        Hp: 21625
+      - Level: 207
+        Hp: 21775
+      - Level: 208
+        Hp: 21925
+      - Level: 209
+        Hp: 22075
+      - Level: 210
+        Hp: 22225
+      - Level: 211
+        Hp: 22375
+      - Level: 212
+        Hp: 22525
+      - Level: 213
+        Hp: 22675
+      - Level: 214
+        Hp: 22825
+      - Level: 215
+        Hp: 22975
+      - Level: 216
+        Hp: 23125
+      - Level: 217
+        Hp: 23275
+      - Level: 218
+        Hp: 23425
+      - Level: 219
+        Hp: 23575
+      - Level: 220
+        Hp: 23725
+      - Level: 221
+        Hp: 23875
+      - Level: 222
+        Hp: 24025
+      - Level: 223
+        Hp: 24175
+      - Level: 224
+        Hp: 24325
+      - Level: 225
+        Hp: 24475
+      - Level: 226
+        Hp: 24625
+      - Level: 227
+        Hp: 24775
+      - Level: 228
+        Hp: 24925
+      - Level: 229
+        Hp: 25075
+      - Level: 230
+        Hp: 25225
+      - Level: 231
+        Hp: 25375
+      - Level: 232
+        Hp: 25525
+      - Level: 233
+        Hp: 25675
+      - Level: 234
+        Hp: 25825
+      - Level: 235
+        Hp: 25975
+      - Level: 236
+        Hp: 26125
+      - Level: 237
+        Hp: 26275
+      - Level: 238
+        Hp: 26425
+      - Level: 239
+        Hp: 26575
+      - Level: 240
+        Hp: 26725
+      - Level: 241
+        Hp: 26875
+      - Level: 242
+        Hp: 27025
+      - Level: 243
+        Hp: 27175
+      - Level: 244
+        Hp: 27325
+      - Level: 245
+        Hp: 27475
+      - Level: 246
+        Hp: 27625
+      - Level: 247
+        Hp: 27775
+      - Level: 248
+        Hp: 27925
+      - Level: 249
+        Hp: 28075
+      - Level: 250
+        Hp: 28225
+  - Jobs:
+      Arch_Mage: true
+    BaseHp:
+      - Level: 200
+        Hp: 15625
+      - Level: 201
+        Hp: 15800
+      - Level: 202
+        Hp: 15975
+      - Level: 203
+        Hp: 16150
+      - Level: 204
+        Hp: 16325
+      - Level: 205
+        Hp: 16500
+      - Level: 206
+        Hp: 16675
+      - Level: 207
+        Hp: 16850
+      - Level: 208
+        Hp: 17025
+      - Level: 209
+        Hp: 17200
+      - Level: 210
+        Hp: 17375
+      - Level: 211
+        Hp: 17550
+      - Level: 212
+        Hp: 17725
+      - Level: 213
+        Hp: 17900
+      - Level: 214
+        Hp: 18075
+      - Level: 215
+        Hp: 18250
+      - Level: 216
+        Hp: 18425
+      - Level: 217
+        Hp: 18600
+      - Level: 218
+        Hp: 18775
+      - Level: 219
+        Hp: 18950
+      - Level: 220
+        Hp: 19125
+      - Level: 221
+        Hp: 19300
+      - Level: 222
+        Hp: 19475
+      - Level: 223
+        Hp: 19650
+      - Level: 224
+        Hp: 19825
+      - Level: 225
+        Hp: 20000
+      - Level: 226
+        Hp: 20175
+      - Level: 227
+        Hp: 20350
+      - Level: 228
+        Hp: 20525
+      - Level: 229
+        Hp: 20700
+      - Level: 230
+        Hp: 20875
+      - Level: 231
+        Hp: 21050
+      - Level: 232
+        Hp: 21225
+      - Level: 233
+        Hp: 21400
+      - Level: 234
+        Hp: 21575
+      - Level: 235
+        Hp: 21750
+      - Level: 236
+        Hp: 21925
+      - Level: 237
+        Hp: 22100
+      - Level: 238
+        Hp: 22275
+      - Level: 239
+        Hp: 22450
+      - Level: 240
+        Hp: 22625
+      - Level: 241
+        Hp: 22800
+      - Level: 242
+        Hp: 22975
+      - Level: 243
+        Hp: 23150
+      - Level: 244
+        Hp: 23325
+      - Level: 245
+        Hp: 23500
+      - Level: 246
+        Hp: 23675
+      - Level: 247
+        Hp: 23850
+      - Level: 248
+        Hp: 24025
+      - Level: 249
+        Hp: 24200
+      - Level: 250
+        Hp: 24375
+  - Jobs:
+      Cardinal: true
+    BaseHp:
+      - Level: 200
+        Hp: 16010
+      - Level: 201
+        Hp: 16185
+      - Level: 202
+        Hp: 16360
+      - Level: 203
+        Hp: 16535
+      - Level: 204
+        Hp: 16710
+      - Level: 205
+        Hp: 16885
+      - Level: 206
+        Hp: 17060
+      - Level: 207
+        Hp: 17235
+      - Level: 208
+        Hp: 17410
+      - Level: 209
+        Hp: 17585
+      - Level: 210
+        Hp: 17760
+      - Level: 211
+        Hp: 17935
+      - Level: 212
+        Hp: 18110
+      - Level: 213
+        Hp: 18285
+      - Level: 214
+        Hp: 18460
+      - Level: 215
+        Hp: 18635
+      - Level: 216
+        Hp: 18810
+      - Level: 217
+        Hp: 18985
+      - Level: 218
+        Hp: 19160
+      - Level: 219
+        Hp: 19335
+      - Level: 220
+        Hp: 19510
+      - Level: 221
+        Hp: 19685
+      - Level: 222
+        Hp: 19860
+      - Level: 223
+        Hp: 20035
+      - Level: 224
+        Hp: 20210
+      - Level: 225
+        Hp: 20385
+      - Level: 226
+        Hp: 20560
+      - Level: 227
+        Hp: 20735
+      - Level: 228
+        Hp: 20910
+      - Level: 229
+        Hp: 21085
+      - Level: 230
+        Hp: 21260
+      - Level: 231
+        Hp: 21435
+      - Level: 232
+        Hp: 21610
+      - Level: 233
+        Hp: 21785
+      - Level: 234
+        Hp: 21960
+      - Level: 235
+        Hp: 22135
+      - Level: 236
+        Hp: 22310
+      - Level: 237
+        Hp: 22485
+      - Level: 238
+        Hp: 22660
+      - Level: 239
+        Hp: 22835
+      - Level: 240
+        Hp: 23010
+      - Level: 241
+        Hp: 23185
+      - Level: 242
+        Hp: 23360
+      - Level: 243
+        Hp: 23535
+      - Level: 244
+        Hp: 23710
+      - Level: 245
+        Hp: 23885
+      - Level: 246
+        Hp: 24060
+      - Level: 247
+        Hp: 24235
+      - Level: 248
+        Hp: 24410
+      - Level: 249
+        Hp: 24585
+      - Level: 250
+        Hp: 24760
+  - Jobs:
+      Windhawk: true
+      Windhawk2: true
+    BaseHp:
+      - Level: 200
+        Hp: 17685
+      - Level: 201
+        Hp: 17835
+      - Level: 202
+        Hp: 17985
+      - Level: 203
+        Hp: 18135
+      - Level: 204
+        Hp: 18285
+      - Level: 205
+        Hp: 18435
+      - Level: 206
+        Hp: 18585
+      - Level: 207
+        Hp: 18735
+      - Level: 208
+        Hp: 18885
+      - Level: 209
+        Hp: 19035
+      - Level: 210
+        Hp: 19185
+      - Level: 211
+        Hp: 19335
+      - Level: 212
+        Hp: 19485
+      - Level: 213
+        Hp: 19635
+      - Level: 214
+        Hp: 19785
+      - Level: 215
+        Hp: 19935
+      - Level: 216
+        Hp: 20085
+      - Level: 217
+        Hp: 20235
+      - Level: 218
+        Hp: 20385
+      - Level: 219
+        Hp: 20535
+      - Level: 220
+        Hp: 20685
+      - Level: 221
+        Hp: 20835
+      - Level: 222
+        Hp: 20985
+      - Level: 223
+        Hp: 21135
+      - Level: 224
+        Hp: 21285
+      - Level: 225
+        Hp: 21435
+      - Level: 226
+        Hp: 21585
+      - Level: 227
+        Hp: 21735
+      - Level: 228
+        Hp: 21885
+      - Level: 229
+        Hp: 22035
+      - Level: 230
+        Hp: 22185
+      - Level: 231
+        Hp: 22335
+      - Level: 232
+        Hp: 22485
+      - Level: 233
+        Hp: 22635
+      - Level: 234
+        Hp: 22785
+      - Level: 235
+        Hp: 22935
+      - Level: 236
+        Hp: 23085
+      - Level: 237
+        Hp: 23235
+      - Level: 238
+        Hp: 23385
+      - Level: 239
+        Hp: 23535
+      - Level: 240
+        Hp: 23685
+      - Level: 241
+        Hp: 23835
+      - Level: 242
+        Hp: 23985
+      - Level: 243
+        Hp: 24135
+      - Level: 244
+        Hp: 24285
+      - Level: 245
+        Hp: 24435
+      - Level: 246
+        Hp: 24585
+      - Level: 247
+        Hp: 24735
+      - Level: 248
+        Hp: 24885
+      - Level: 249
+        Hp: 25035
+      - Level: 250
+        Hp: 25185
+  - Jobs:
+      Imperial_Guard: true
+      Imperial_Guard2: true
+    BaseHp:
+      - Level: 200
+        Hp: 21755
+      - Level: 201
+        Hp: 21930
+      - Level: 202
+        Hp: 22105
+      - Level: 203
+        Hp: 22280
+      - Level: 204
+        Hp: 22455
+      - Level: 205
+        Hp: 22630
+      - Level: 206
+        Hp: 22805
+      - Level: 207
+        Hp: 22980
+      - Level: 208
+        Hp: 23155
+      - Level: 209
+        Hp: 23330
+      - Level: 210
+        Hp: 23505
+      - Level: 211
+        Hp: 23680
+      - Level: 212
+        Hp: 23855
+      - Level: 213
+        Hp: 24030
+      - Level: 214
+        Hp: 24205
+      - Level: 215
+        Hp: 24380
+      - Level: 216
+        Hp: 24555
+      - Level: 217
+        Hp: 24730
+      - Level: 218
+        Hp: 24905
+      - Level: 219
+        Hp: 25080
+      - Level: 220
+        Hp: 25255
+      - Level: 221
+        Hp: 25430
+      - Level: 222
+        Hp: 25605
+      - Level: 223
+        Hp: 25780
+      - Level: 224
+        Hp: 25955
+      - Level: 225
+        Hp: 26130
+      - Level: 226
+        Hp: 26305
+      - Level: 227
+        Hp: 26480
+      - Level: 228
+        Hp: 26655
+      - Level: 229
+        Hp: 26830
+      - Level: 230
+        Hp: 27005
+      - Level: 231
+        Hp: 27180
+      - Level: 232
+        Hp: 27355
+      - Level: 233
+        Hp: 27530
+      - Level: 234
+        Hp: 27705
+      - Level: 235
+        Hp: 27880
+      - Level: 236
+        Hp: 28055
+      - Level: 237
+        Hp: 28230
+      - Level: 238
+        Hp: 28405
+      - Level: 239
+        Hp: 28580
+      - Level: 240
+        Hp: 28755
+      - Level: 241
+        Hp: 28930
+      - Level: 242
+        Hp: 29105
+      - Level: 243
+        Hp: 29280
+      - Level: 244
+        Hp: 29455
+      - Level: 245
+        Hp: 29630
+      - Level: 246
+        Hp: 29805
+      - Level: 247
+        Hp: 29980
+      - Level: 248
+        Hp: 30155
+      - Level: 249
+        Hp: 30330
+      - Level: 250
+        Hp: 30505
+  - Jobs:
+      Biolo: true
+    BaseHp:
+      - Level: 200
+        Hp: 16875
+      - Level: 201
+        Hp: 17050
+      - Level: 202
+        Hp: 17225
+      - Level: 203
+        Hp: 17400
+      - Level: 204
+        Hp: 17575
+      - Level: 205
+        Hp: 17750
+      - Level: 206
+        Hp: 17925
+      - Level: 207
+        Hp: 18100
+      - Level: 208
+        Hp: 18275
+      - Level: 209
+        Hp: 18450
+      - Level: 210
+        Hp: 18625
+      - Level: 211
+        Hp: 18800
+      - Level: 212
+        Hp: 18975
+      - Level: 213
+        Hp: 19150
+      - Level: 214
+        Hp: 19325
+      - Level: 215
+        Hp: 19500
+      - Level: 216
+        Hp: 19675
+      - Level: 217
+        Hp: 19850
+      - Level: 218
+        Hp: 20025
+      - Level: 219
+        Hp: 20200
+      - Level: 220
+        Hp: 20375
+      - Level: 221
+        Hp: 20550
+      - Level: 222
+        Hp: 20725
+      - Level: 223
+        Hp: 20900
+      - Level: 224
+        Hp: 21075
+      - Level: 225
+        Hp: 21250
+      - Level: 226
+        Hp: 21425
+      - Level: 227
+        Hp: 21600
+      - Level: 228
+        Hp: 21775
+      - Level: 229
+        Hp: 21950
+      - Level: 230
+        Hp: 22125
+      - Level: 231
+        Hp: 22300
+      - Level: 232
+        Hp: 22475
+      - Level: 233
+        Hp: 22650
+      - Level: 234
+        Hp: 22825
+      - Level: 235
+        Hp: 23000
+      - Level: 236
+        Hp: 23175
+      - Level: 237
+        Hp: 23350
+      - Level: 238
+        Hp: 23525
+      - Level: 239
+        Hp: 23700
+      - Level: 240
+        Hp: 23875
+      - Level: 241
+        Hp: 24050
+      - Level: 242
+        Hp: 24225
+      - Level: 243
+        Hp: 24400
+      - Level: 244
+        Hp: 24575
+      - Level: 245
+        Hp: 24750
+      - Level: 246
+        Hp: 24925
+      - Level: 247
+        Hp: 25100
+      - Level: 248
+        Hp: 25275
+      - Level: 249
+        Hp: 25450
+      - Level: 250
+        Hp: 25625
+  - Jobs:
+      Abyss_Chaser: true
+    BaseHp:
+      - Level: 200
+        Hp: 18695
+      - Level: 201
+        Hp: 18810
+      - Level: 202
+        Hp: 18925
+      - Level: 203
+        Hp: 19040
+      - Level: 204
+        Hp: 19155
+      - Level: 205
+        Hp: 19270
+      - Level: 206
+        Hp: 19385
+      - Level: 207
+        Hp: 19500
+      - Level: 208
+        Hp: 19615
+      - Level: 209
+        Hp: 19730
+      - Level: 210
+        Hp: 19845
+      - Level: 211
+        Hp: 19960
+      - Level: 212
+        Hp: 20075
+      - Level: 213
+        Hp: 20190
+      - Level: 214
+        Hp: 20305
+      - Level: 215
+        Hp: 20420
+      - Level: 216
+        Hp: 20535
+      - Level: 217
+        Hp: 20650
+      - Level: 218
+        Hp: 20765
+      - Level: 219
+        Hp: 20880
+      - Level: 220
+        Hp: 20995
+      - Level: 221
+        Hp: 21110
+      - Level: 222
+        Hp: 21225
+      - Level: 223
+        Hp: 21340
+      - Level: 224
+        Hp: 21455
+      - Level: 225
+        Hp: 21570
+      - Level: 226
+        Hp: 21685
+      - Level: 227
+        Hp: 21800
+      - Level: 228
+        Hp: 21915
+      - Level: 229
+        Hp: 22030
+      - Level: 230
+        Hp: 22145
+      - Level: 231
+        Hp: 22260
+      - Level: 232
+        Hp: 22375
+      - Level: 233
+        Hp: 22490
+      - Level: 234
+        Hp: 22605
+      - Level: 235
+        Hp: 22720
+      - Level: 236
+        Hp: 22835
+      - Level: 237
+        Hp: 22950
+      - Level: 238
+        Hp: 23065
+      - Level: 239
+        Hp: 23180
+      - Level: 240
+        Hp: 23295
+      - Level: 241
+        Hp: 23410
+      - Level: 242
+        Hp: 23525
+      - Level: 243
+        Hp: 23640
+      - Level: 244
+        Hp: 23755
+      - Level: 245
+        Hp: 23870
+      - Level: 246
+        Hp: 23985
+      - Level: 247
+        Hp: 24100
+      - Level: 248
+        Hp: 24215
+      - Level: 249
+        Hp: 24330
+      - Level: 250
+        Hp: 24445
+  - Jobs:
+      Elemental_Master: true
+    BaseHp:
+      - Level: 200
+        Hp: 15210
+      - Level: 201
+        Hp: 15345
+      - Level: 202
+        Hp: 15480
+      - Level: 203
+        Hp: 15615
+      - Level: 204
+        Hp: 15750
+      - Level: 205
+        Hp: 15885
+      - Level: 206
+        Hp: 16020
+      - Level: 207
+        Hp: 16155
+      - Level: 208
+        Hp: 16290
+      - Level: 209
+        Hp: 16425
+      - Level: 210
+        Hp: 16560
+      - Level: 211
+        Hp: 16695
+      - Level: 212
+        Hp: 16830
+      - Level: 213
+        Hp: 16965
+      - Level: 214
+        Hp: 17100
+      - Level: 215
+        Hp: 17235
+      - Level: 216
+        Hp: 17370
+      - Level: 217
+        Hp: 17505
+      - Level: 218
+        Hp: 17640
+      - Level: 219
+        Hp: 17775
+      - Level: 220
+        Hp: 17910
+      - Level: 221
+        Hp: 18045
+      - Level: 222
+        Hp: 18180
+      - Level: 223
+        Hp: 18315
+      - Level: 224
+        Hp: 18450
+      - Level: 225
+        Hp: 18585
+      - Level: 226
+        Hp: 18720
+      - Level: 227
+        Hp: 18855
+      - Level: 228
+        Hp: 18990
+      - Level: 229
+        Hp: 19125
+      - Level: 230
+        Hp: 19260
+      - Level: 231
+        Hp: 19395
+      - Level: 232
+        Hp: 19530
+      - Level: 233
+        Hp: 19665
+      - Level: 234
+        Hp: 19800
+      - Level: 235
+        Hp: 19935
+      - Level: 236
+        Hp: 20070
+      - Level: 237
+        Hp: 20205
+      - Level: 238
+        Hp: 20340
+      - Level: 239
+        Hp: 20475
+      - Level: 240
+        Hp: 20610
+      - Level: 241
+        Hp: 20745
+      - Level: 242
+        Hp: 20880
+      - Level: 243
+        Hp: 21015
+      - Level: 244
+        Hp: 21150
+      - Level: 245
+        Hp: 21285
+      - Level: 246
+        Hp: 21420
+      - Level: 247
+        Hp: 21555
+      - Level: 248
+        Hp: 21690
+      - Level: 249
+        Hp: 21825
+      - Level: 250
+        Hp: 21960
+  - Jobs:
+      Inquisitor: true
+    BaseHp:
+      - Level: 200
+        Hp: 18360
+      - Level: 201
+        Hp: 18515
+      - Level: 202
+        Hp: 18670
+      - Level: 203
+        Hp: 18825
+      - Level: 204
+        Hp: 18980
+      - Level: 205
+        Hp: 19135
+      - Level: 206
+        Hp: 19290
+      - Level: 207
+        Hp: 19445
+      - Level: 208
+        Hp: 19600
+      - Level: 209
+        Hp: 19755
+      - Level: 210
+        Hp: 19910
+      - Level: 211
+        Hp: 20065
+      - Level: 212
+        Hp: 20220
+      - Level: 213
+        Hp: 20375
+      - Level: 214
+        Hp: 20530
+      - Level: 215
+        Hp: 20685
+      - Level: 216
+        Hp: 20840
+      - Level: 217
+        Hp: 20995
+      - Level: 218
+        Hp: 21150
+      - Level: 219
+        Hp: 21305
+      - Level: 220
+        Hp: 21460
+      - Level: 221
+        Hp: 21615
+      - Level: 222
+        Hp: 21770
+      - Level: 223
+        Hp: 21925
+      - Level: 224
+        Hp: 22080
+      - Level: 225
+        Hp: 22235
+      - Level: 226
+        Hp: 22390
+      - Level: 227
+        Hp: 22545
+      - Level: 228
+        Hp: 22700
+      - Level: 229
+        Hp: 22855
+      - Level: 230
+        Hp: 23010
+      - Level: 231
+        Hp: 23165
+      - Level: 232
+        Hp: 23320
+      - Level: 233
+        Hp: 23475
+      - Level: 234
+        Hp: 23630
+      - Level: 235
+        Hp: 23785
+      - Level: 236
+        Hp: 23940
+      - Level: 237
+        Hp: 24095
+      - Level: 238
+        Hp: 24250
+      - Level: 239
+        Hp: 24405
+      - Level: 240
+        Hp: 24560
+      - Level: 241
+        Hp: 24715
+      - Level: 242
+        Hp: 24870
+      - Level: 243
+        Hp: 25025
+      - Level: 244
+        Hp: 25180
+      - Level: 245
+        Hp: 25335
+      - Level: 246
+        Hp: 25490
+      - Level: 247
+        Hp: 25645
+      - Level: 248
+        Hp: 25800
+      - Level: 249
+        Hp: 25955
+      - Level: 250
+        Hp: 26110
+  - Jobs:
+      Troubadour: true
+    BaseHp:
+      - Level: 200
+        Hp: 17680
+      - Level: 201
+        Hp: 17830
+      - Level: 202
+        Hp: 17980
+      - Level: 203
+        Hp: 18130
+      - Level: 204
+        Hp: 18280
+      - Level: 205
+        Hp: 18430
+      - Level: 206
+        Hp: 18580
+      - Level: 207
+        Hp: 18730
+      - Level: 208
+        Hp: 18880
+      - Level: 209
+        Hp: 19030
+      - Level: 210
+        Hp: 19180
+      - Level: 211
+        Hp: 19330
+      - Level: 212
+        Hp: 19480
+      - Level: 213
+        Hp: 19630
+      - Level: 214
+        Hp: 19780
+      - Level: 215
+        Hp: 19930
+      - Level: 216
+        Hp: 20080
+      - Level: 217
+        Hp: 20230
+      - Level: 218
+        Hp: 20380
+      - Level: 219
+        Hp: 20530
+      - Level: 220
+        Hp: 20680
+      - Level: 221
+        Hp: 20830
+      - Level: 222
+        Hp: 20980
+      - Level: 223
+        Hp: 21130
+      - Level: 224
+        Hp: 21280
+      - Level: 225
+        Hp: 21430
+      - Level: 226
+        Hp: 21580
+      - Level: 227
+        Hp: 21730
+      - Level: 228
+        Hp: 21880
+      - Level: 229
+        Hp: 22030
+      - Level: 230
+        Hp: 22180
+      - Level: 231
+        Hp: 22330
+      - Level: 232
+        Hp: 22480
+      - Level: 233
+        Hp: 22630
+      - Level: 234
+        Hp: 22780
+      - Level: 235
+        Hp: 22930
+      - Level: 236
+        Hp: 23080
+      - Level: 237
+        Hp: 23230
+      - Level: 238
+        Hp: 23380
+      - Level: 239
+        Hp: 23530
+      - Level: 240
+        Hp: 23680
+      - Level: 241
+        Hp: 23830
+      - Level: 242
+        Hp: 23980
+      - Level: 243
+        Hp: 24130
+      - Level: 244
+        Hp: 24280
+      - Level: 245
+        Hp: 24430
+      - Level: 246
+        Hp: 24580
+      - Level: 247
+        Hp: 24730
+      - Level: 248
+        Hp: 24880
+      - Level: 249
+        Hp: 25030
+      - Level: 250
+        Hp: 25180
+  - Jobs:
+      Trouvere: true
+    BaseHp:
+      - Level: 200
+        Hp: 17680
+      - Level: 201
+        Hp: 17830
+      - Level: 202
+        Hp: 17980
+      - Level: 203
+        Hp: 18130
+      - Level: 204
+        Hp: 18280
+      - Level: 205
+        Hp: 18430
+      - Level: 206
+        Hp: 18580
+      - Level: 207
+        Hp: 18730
+      - Level: 208
+        Hp: 18880
+      - Level: 209
+        Hp: 19030
+      - Level: 210
+        Hp: 19180
+      - Level: 211
+        Hp: 19330
+      - Level: 212
+        Hp: 19480
+      - Level: 213
+        Hp: 19630
+      - Level: 214
+        Hp: 19780
+      - Level: 215
+        Hp: 19930
+      - Level: 216
+        Hp: 20080
+      - Level: 217
+        Hp: 20230
+      - Level: 218
+        Hp: 20380
+      - Level: 219
+        Hp: 20530
+      - Level: 220
+        Hp: 20680
+      - Level: 221
+        Hp: 20830
+      - Level: 222
+        Hp: 20980
+      - Level: 223
+        Hp: 21130
+      - Level: 224
+        Hp: 21280
+      - Level: 225
+        Hp: 21430
+      - Level: 226
+        Hp: 21580
+      - Level: 227
+        Hp: 21730
+      - Level: 228
+        Hp: 21880
+      - Level: 229
+        Hp: 22030
+      - Level: 230
+        Hp: 22180
+      - Level: 231
+        Hp: 22330
+      - Level: 232
+        Hp: 22480
+      - Level: 233
+        Hp: 22630
+      - Level: 234
+        Hp: 22780
+      - Level: 235
+        Hp: 22930
+      - Level: 236
+        Hp: 23080
+      - Level: 237
+        Hp: 23230
+      - Level: 238
+        Hp: 23380
+      - Level: 239
+        Hp: 23530
+      - Level: 240
+        Hp: 23680
+      - Level: 241
+        Hp: 23830
+      - Level: 242
+        Hp: 23980
+      - Level: 243
+        Hp: 24130
+      - Level: 244
+        Hp: 24280
+      - Level: 245
+        Hp: 24430
+      - Level: 246
+        Hp: 24580
+      - Level: 247
+        Hp: 24730
+      - Level: 248
+        Hp: 24880
+      - Level: 249
+        Hp: 25030
+      - Level: 250
+        Hp: 25180
+  - Jobs:
+      Sky_Emperor: true
+      Sky_Emperor2: true
+    BaseHp:
+      - Level: 200
+        Hp: 10762
+      - Level: 201
+        Hp: 10824
+      - Level: 202
+        Hp: 10886
+      - Level: 203
+        Hp: 10948
+      - Level: 204
+        Hp: 11010
+      - Level: 205
+        Hp: 11072
+      - Level: 206
+        Hp: 11134
+      - Level: 207
+        Hp: 11196
+      - Level: 208
+        Hp: 11258
+      - Level: 209
+        Hp: 11320
+      - Level: 210
+        Hp: 11382
+      - Level: 211
+        Hp: 11444
+      - Level: 212
+        Hp: 11506
+      - Level: 213
+        Hp: 11568
+      - Level: 214
+        Hp: 11630
+      - Level: 215
+        Hp: 11692
+      - Level: 216
+        Hp: 11754
+      - Level: 217
+        Hp: 11816
+      - Level: 218
+        Hp: 11878
+      - Level: 219
+        Hp: 11940
+      - Level: 220
+        Hp: 12002
+      - Level: 221
+        Hp: 12064
+      - Level: 222
+        Hp: 12126
+      - Level: 223
+        Hp: 12188
+      - Level: 224
+        Hp: 12250
+      - Level: 225
+        Hp: 12312
+      - Level: 226
+        Hp: 12374
+      - Level: 227
+        Hp: 12436
+      - Level: 228
+        Hp: 12498
+      - Level: 229
+        Hp: 12560
+      - Level: 230
+        Hp: 12622
+      - Level: 231
+        Hp: 12684
+      - Level: 232
+        Hp: 12746
+      - Level: 233
+        Hp: 12808
+      - Level: 234
+        Hp: 12870
+      - Level: 235
+        Hp: 12932
+      - Level: 236
+        Hp: 12994
+      - Level: 237
+        Hp: 13056
+      - Level: 238
+        Hp: 13118
+      - Level: 239
+        Hp: 13180
+      - Level: 240
+        Hp: 13242
+      - Level: 241
+        Hp: 13304
+      - Level: 242
+        Hp: 13366
+      - Level: 243
+        Hp: 13428
+      - Level: 244
+        Hp: 13490
+      - Level: 245
+        Hp: 13552
+      - Level: 246
+        Hp: 13614
+      - Level: 247
+        Hp: 13676
+      - Level: 248
+        Hp: 13738
+      - Level: 249
+        Hp: 13800
+      - Level: 250
+        Hp: 13862
+  - Jobs:
+      Soul_Ascetic: true
+    BaseHp:
+      - Level: 200
+        Hp: 9805
+      - Level: 201
+        Hp: 9860
+      - Level: 202
+        Hp: 9915
+      - Level: 203
+        Hp: 9970
+      - Level: 204
+        Hp: 10025
+      - Level: 205
+        Hp: 10080
+      - Level: 206
+        Hp: 10135
+      - Level: 207
+        Hp: 10190
+      - Level: 208
+        Hp: 10245
+      - Level: 209
+        Hp: 10300
+      - Level: 210
+        Hp: 10355
+      - Level: 211
+        Hp: 10410
+      - Level: 212
+        Hp: 10465
+      - Level: 213
+        Hp: 10520
+      - Level: 214
+        Hp: 10575
+      - Level: 215
+        Hp: 10630
+      - Level: 216
+        Hp: 10685
+      - Level: 217
+        Hp: 10740
+      - Level: 218
+        Hp: 10795
+      - Level: 219
+        Hp: 10850
+      - Level: 220
+        Hp: 10905
+      - Level: 221
+        Hp: 10960
+      - Level: 222
+        Hp: 11015
+      - Level: 223
+        Hp: 11070
+      - Level: 224
+        Hp: 11125
+      - Level: 225
+        Hp: 11180
+      - Level: 226
+        Hp: 11235
+      - Level: 227
+        Hp: 11290
+      - Level: 228
+        Hp: 11345
+      - Level: 229
+        Hp: 11400
+      - Level: 230
+        Hp: 11455
+      - Level: 231
+        Hp: 11510
+      - Level: 232
+        Hp: 11565
+      - Level: 233
+        Hp: 11620
+      - Level: 234
+        Hp: 11675
+      - Level: 235
+        Hp: 11730
+      - Level: 236
+        Hp: 11785
+      - Level: 237
+        Hp: 11840
+      - Level: 238
+        Hp: 11895
+      - Level: 239
+        Hp: 11950
+      - Level: 240
+        Hp: 12005
+      - Level: 241
+        Hp: 12060
+      - Level: 242
+        Hp: 12115
+      - Level: 243
+        Hp: 12170
+      - Level: 244
+        Hp: 12225
+      - Level: 245
+        Hp: 12280
+      - Level: 246
+        Hp: 12335
+      - Level: 247
+        Hp: 12390
+      - Level: 248
+        Hp: 12445
+      - Level: 249
+        Hp: 12500
+      - Level: 250
+        Hp: 12555
+  - Jobs:
+      Shinkiro: true
+    BaseHp:
+      - Level: 200
+        Hp: 15205
+      - Level: 201
+        Hp: 15360
+      - Level: 202
+        Hp: 15515
+      - Level: 203
+        Hp: 15670
+      - Level: 204
+        Hp: 15825
+      - Level: 205
+        Hp: 15980
+      - Level: 206
+        Hp: 16135
+      - Level: 207
+        Hp: 16290
+      - Level: 208
+        Hp: 16445
+      - Level: 209
+        Hp: 16600
+      - Level: 210
+        Hp: 16755
+      - Level: 211
+        Hp: 16910
+      - Level: 212
+        Hp: 17065
+      - Level: 213
+        Hp: 17220
+      - Level: 214
+        Hp: 17375
+      - Level: 215
+        Hp: 17530
+      - Level: 216
+        Hp: 17685
+      - Level: 217
+        Hp: 17840
+      - Level: 218
+        Hp: 17995
+      - Level: 219
+        Hp: 18150
+      - Level: 220
+        Hp: 18305
+      - Level: 221
+        Hp: 18460
+      - Level: 222
+        Hp: 18615
+      - Level: 223
+        Hp: 18770
+      - Level: 224
+        Hp: 18925
+      - Level: 225
+        Hp: 19080
+      - Level: 226
+        Hp: 19235
+      - Level: 227
+        Hp: 19390
+      - Level: 228
+        Hp: 19545
+      - Level: 229
+        Hp: 19700
+      - Level: 230
+        Hp: 19855
+      - Level: 231
+        Hp: 20010
+      - Level: 232
+        Hp: 20165
+      - Level: 233
+        Hp: 20320
+      - Level: 234
+        Hp: 20475
+      - Level: 235
+        Hp: 20630
+      - Level: 236
+        Hp: 20785
+      - Level: 237
+        Hp: 20940
+      - Level: 238
+        Hp: 21095
+      - Level: 239
+        Hp: 21250
+      - Level: 240
+        Hp: 21405
+      - Level: 241
+        Hp: 21560
+      - Level: 242
+        Hp: 21715
+      - Level: 243
+        Hp: 21870
+      - Level: 244
+        Hp: 22025
+      - Level: 245
+        Hp: 22180
+      - Level: 246
+        Hp: 22335
+      - Level: 247
+        Hp: 22490
+      - Level: 248
+        Hp: 22645
+      - Level: 249
+        Hp: 22800
+      - Level: 250
+        Hp: 22955
+  - Jobs:
+      Shiranui: true
+    BaseHp:
+      - Level: 200
+        Hp: 14905
+      - Level: 201
+        Hp: 15060
+      - Level: 202
+        Hp: 15215
+      - Level: 203
+        Hp: 15370
+      - Level: 204
+        Hp: 15525
+      - Level: 205
+        Hp: 15680
+      - Level: 206
+        Hp: 15835
+      - Level: 207
+        Hp: 15990
+      - Level: 208
+        Hp: 16145
+      - Level: 209
+        Hp: 16300
+      - Level: 210
+        Hp: 16455
+      - Level: 211
+        Hp: 16610
+      - Level: 212
+        Hp: 16765
+      - Level: 213
+        Hp: 16920
+      - Level: 214
+        Hp: 17075
+      - Level: 215
+        Hp: 17230
+      - Level: 216
+        Hp: 17385
+      - Level: 217
+        Hp: 17540
+      - Level: 218
+        Hp: 17695
+      - Level: 219
+        Hp: 17850
+      - Level: 220
+        Hp: 18005
+      - Level: 221
+        Hp: 18160
+      - Level: 222
+        Hp: 18315
+      - Level: 223
+        Hp: 18470
+      - Level: 224
+        Hp: 18625
+      - Level: 225
+        Hp: 18780
+      - Level: 226
+        Hp: 18935
+      - Level: 227
+        Hp: 19090
+      - Level: 228
+        Hp: 19245
+      - Level: 229
+        Hp: 19400
+      - Level: 230
+        Hp: 19555
+      - Level: 231
+        Hp: 19710
+      - Level: 232
+        Hp: 19865
+      - Level: 233
+        Hp: 20020
+      - Level: 234
+        Hp: 20175
+      - Level: 235
+        Hp: 20330
+      - Level: 236
+        Hp: 20485
+      - Level: 237
+        Hp: 20640
+      - Level: 238
+        Hp: 20795
+      - Level: 239
+        Hp: 20950
+      - Level: 240
+        Hp: 21105
+      - Level: 241
+        Hp: 21260
+      - Level: 242
+        Hp: 21415
+      - Level: 243
+        Hp: 21570
+      - Level: 244
+        Hp: 21725
+      - Level: 245
+        Hp: 21880
+      - Level: 246
+        Hp: 22035
+      - Level: 247
+        Hp: 22190
+      - Level: 248
+        Hp: 22345
+      - Level: 249
+        Hp: 22500
+      - Level: 250
+        Hp: 22655
+  - Jobs:
+      Night_Watch: true
+    BaseHp:
+      - Level: 200
+        Hp: 19417
+      - Level: 201
+        Hp: 19558
+      - Level: 202
+        Hp: 19699
+      - Level: 203
+        Hp: 19840
+      - Level: 204
+        Hp: 19981
+      - Level: 205
+        Hp: 20122
+      - Level: 206
+        Hp: 20263
+      - Level: 207
+        Hp: 20404
+      - Level: 208
+        Hp: 20545
+      - Level: 209
+        Hp: 20686
+      - Level: 210
+        Hp: 20827
+      - Level: 211
+        Hp: 20968
+      - Level: 212
+        Hp: 21109
+      - Level: 213
+        Hp: 21250
+      - Level: 214
+        Hp: 21391
+      - Level: 215
+        Hp: 21532
+      - Level: 216
+        Hp: 21673
+      - Level: 217
+        Hp: 21814
+      - Level: 218
+        Hp: 21955
+      - Level: 219
+        Hp: 22096
+      - Level: 220
+        Hp: 22237
+      - Level: 221
+        Hp: 22378
+      - Level: 222
+        Hp: 22519
+      - Level: 223
+        Hp: 22660
+      - Level: 224
+        Hp: 22801
+      - Level: 225
+        Hp: 22942
+      - Level: 226
+        Hp: 23083
+      - Level: 227
+        Hp: 23224
+      - Level: 228
+        Hp: 23365
+      - Level: 229
+        Hp: 23506
+      - Level: 230
+        Hp: 23647
+      - Level: 231
+        Hp: 23788
+      - Level: 232
+        Hp: 23929
+      - Level: 233
+        Hp: 24070
+      - Level: 234
+        Hp: 24211
+      - Level: 235
+        Hp: 24352
+      - Level: 236
+        Hp: 24493
+      - Level: 237
+        Hp: 24634
+      - Level: 238
+        Hp: 24775
+      - Level: 239
+        Hp: 24916
+      - Level: 240
+        Hp: 25057
+      - Level: 241
+        Hp: 25198
+      - Level: 242
+        Hp: 25339
+      - Level: 243
+        Hp: 25480
+      - Level: 244
+        Hp: 25621
+      - Level: 245
+        Hp: 25762
+      - Level: 246
+        Hp: 25903
+      - Level: 247
+        Hp: 26044
+      - Level: 248
+        Hp: 26185
+      - Level: 249
+        Hp: 26326
+      - Level: 250
+        Hp: 26467
+  - Jobs:
+      Hyper_Novice: true
+    BaseHp:
+      - Level: 200
+        Hp: 5035
+      - Level: 201
+        Hp: 5040
+      - Level: 202
+        Hp: 5045
+      - Level: 203
+        Hp: 5050
+      - Level: 204
+        Hp: 5055
+      - Level: 205
+        Hp: 5060
+      - Level: 206
+        Hp: 5065
+      - Level: 207
+        Hp: 5070
+      - Level: 208
+        Hp: 5075
+      - Level: 209
+        Hp: 5080
+      - Level: 210
+        Hp: 5085
+      - Level: 211
+        Hp: 5090
+      - Level: 212
+        Hp: 5095
+      - Level: 213
+        Hp: 5100
+      - Level: 214
+        Hp: 5105
+      - Level: 215
+        Hp: 5110
+      - Level: 216
+        Hp: 5115
+      - Level: 217
+        Hp: 5120
+      - Level: 218
+        Hp: 5125
+      - Level: 219
+        Hp: 5130
+      - Level: 220
+        Hp: 5135
+      - Level: 221
+        Hp: 5140
+      - Level: 222
+        Hp: 5145
+      - Level: 223
+        Hp: 5150
+      - Level: 224
+        Hp: 5155
+      - Level: 225
+        Hp: 5160
+      - Level: 226
+        Hp: 5165
+      - Level: 227
+        Hp: 5170
+      - Level: 228
+        Hp: 5175
+      - Level: 229
+        Hp: 5180
+      - Level: 230
+        Hp: 5185
+      - Level: 231
+        Hp: 5190
+      - Level: 232
+        Hp: 5195
+      - Level: 233
+        Hp: 5200
+      - Level: 234
+        Hp: 5205
+      - Level: 235
+        Hp: 5210
+      - Level: 236
+        Hp: 5215
+      - Level: 237
+        Hp: 5220
+      - Level: 238
+        Hp: 5225
+      - Level: 239
+        Hp: 5230
+      - Level: 240
+        Hp: 5235
+      - Level: 241
+        Hp: 5240
+      - Level: 242
+        Hp: 5245
+      - Level: 243
+        Hp: 5250
+      - Level: 244
+        Hp: 5255
+      - Level: 245
+        Hp: 5260
+      - Level: 246
+        Hp: 5265
+      - Level: 247
+        Hp: 5270
+      - Level: 248
+        Hp: 5275
+      - Level: 249
+        Hp: 5280
+      - Level: 250
+        Hp: 5285
+  - Jobs:
+      Spirit_Handler: true
+    BaseHp:
+      - Level: 200
+        Hp: 22347
+      - Level: 201
+        Hp: 22539
+      - Level: 202
+        Hp: 22731
+      - Level: 203
+        Hp: 22923
+      - Level: 204
+        Hp: 23115
+      - Level: 205
+        Hp: 23307
+      - Level: 206
+        Hp: 23499
+      - Level: 207
+        Hp: 23691
+      - Level: 208
+        Hp: 23883
+      - Level: 209
+        Hp: 24075
+      - Level: 210
+        Hp: 24267
+      - Level: 211
+        Hp: 24459
+      - Level: 212
+        Hp: 24651
+      - Level: 213
+        Hp: 24843
+      - Level: 214
+        Hp: 25035
+      - Level: 215
+        Hp: 25227
+      - Level: 216
+        Hp: 25419
+      - Level: 217
+        Hp: 25611
+      - Level: 218
+        Hp: 25803
+      - Level: 219
+        Hp: 25995
+      - Level: 220
+        Hp: 26187
+      - Level: 221
+        Hp: 26379
+      - Level: 222
+        Hp: 26571
+      - Level: 223
+        Hp: 26763
+      - Level: 224
+        Hp: 26955
+      - Level: 225
+        Hp: 27147
+      - Level: 226
+        Hp: 27339
+      - Level: 227
+        Hp: 27531
+      - Level: 228
+        Hp: 27723
+      - Level: 229
+        Hp: 27915
+      - Level: 230
+        Hp: 28107
+      - Level: 231
+        Hp: 28299
+      - Level: 232
+        Hp: 28491
+      - Level: 233
+        Hp: 28683
+      - Level: 234
+        Hp: 28875
+      - Level: 235
+        Hp: 29067
+      - Level: 236
+        Hp: 29259
+      - Level: 237
+        Hp: 29451
+      - Level: 238
+        Hp: 29643
+      - Level: 239
+        Hp: 29835
+      - Level: 240
+        Hp: 30027
+      - Level: 241
+        Hp: 30219
+      - Level: 242
+        Hp: 30411
+      - Level: 243
+        Hp: 30603
+      - Level: 244
+        Hp: 30795
+      - Level: 245
+        Hp: 30987
+      - Level: 246
+        Hp: 31179
+      - Level: 247
+        Hp: 31371
+      - Level: 248
+        Hp: 31563
+      - Level: 249
+        Hp: 31755
+      - Level: 250
+        Hp: 31947
+  - Jobs:
+      Dragon_Knight: true
+      Dragon_Knight2: true
+    BaseSp:
+      - Level: 200
+        Sp: 1115
+      - Level: 201
+        Sp: 1121
+      - Level: 202
+        Sp: 1127
+      - Level: 203
+        Sp: 1133
+      - Level: 204
+        Sp: 1139
+      - Level: 205
+        Sp: 1145
+      - Level: 206
+        Sp: 1151
+      - Level: 207
+        Sp: 1157
+      - Level: 208
+        Sp: 1163
+      - Level: 209
+        Sp: 1169
+      - Level: 210
+        Sp: 1175
+      - Level: 211
+        Sp: 1181
+      - Level: 212
+        Sp: 1187
+      - Level: 213
+        Sp: 1193
+      - Level: 214
+        Sp: 1199
+      - Level: 215
+        Sp: 1205
+      - Level: 216
+        Sp: 1211
+      - Level: 217
+        Sp: 1217
+      - Level: 218
+        Sp: 1223
+      - Level: 219
+        Sp: 1229
+      - Level: 220
+        Sp: 1235
+      - Level: 221
+        Sp: 1241
+      - Level: 222
+        Sp: 1247
+      - Level: 223
+        Sp: 1253
+      - Level: 224
+        Sp: 1259
+      - Level: 225
+        Sp: 1265
+      - Level: 226
+        Sp: 1271
+      - Level: 227
+        Sp: 1277
+      - Level: 228
+        Sp: 1283
+      - Level: 229
+        Sp: 1289
+      - Level: 230
+        Sp: 1295
+      - Level: 231
+        Sp: 1301
+      - Level: 232
+        Sp: 1307
+      - Level: 233
+        Sp: 1313
+      - Level: 234
+        Sp: 1319
+      - Level: 235
+        Sp: 1325
+      - Level: 236
+        Sp: 1331
+      - Level: 237
+        Sp: 1337
+      - Level: 238
+        Sp: 1343
+      - Level: 239
+        Sp: 1349
+      - Level: 240
+        Sp: 1355
+      - Level: 241
+        Sp: 1361
+      - Level: 242
+        Sp: 1367
+      - Level: 243
+        Sp: 1373
+      - Level: 244
+        Sp: 1379
+      - Level: 245
+        Sp: 1385
+      - Level: 246
+        Sp: 1391
+      - Level: 247
+        Sp: 1397
+      - Level: 248
+        Sp: 1403
+      - Level: 249
+        Sp: 1409
+      - Level: 250
+        Sp: 1415
+  - Jobs:
+      Meister: true
+      Meister2: true
+    BaseSp:
+      - Level: 200
+        Sp: 1495
+      - Level: 201
+        Sp: 1502
+      - Level: 202
+        Sp: 1509
+      - Level: 203
+        Sp: 1516
+      - Level: 204
+        Sp: 1523
+      - Level: 205
+        Sp: 1530
+      - Level: 206
+        Sp: 1537
+      - Level: 207
+        Sp: 1544
+      - Level: 208
+        Sp: 1551
+      - Level: 209
+        Sp: 1558
+      - Level: 210
+        Sp: 1565
+      - Level: 211
+        Sp: 1572
+      - Level: 212
+        Sp: 1579
+      - Level: 213
+        Sp: 1586
+      - Level: 214
+        Sp: 1593
+      - Level: 215
+        Sp: 1600
+      - Level: 216
+        Sp: 1607
+      - Level: 217
+        Sp: 1614
+      - Level: 218
+        Sp: 1621
+      - Level: 219
+        Sp: 1628
+      - Level: 220
+        Sp: 1635
+      - Level: 221
+        Sp: 1642
+      - Level: 222
+        Sp: 1649
+      - Level: 223
+        Sp: 1656
+      - Level: 224
+        Sp: 1663
+      - Level: 225
+        Sp: 1670
+      - Level: 226
+        Sp: 1677
+      - Level: 227
+        Sp: 1684
+      - Level: 228
+        Sp: 1691
+      - Level: 229
+        Sp: 1698
+      - Level: 230
+        Sp: 1705
+      - Level: 231
+        Sp: 1712
+      - Level: 232
+        Sp: 1719
+      - Level: 233
+        Sp: 1726
+      - Level: 234
+        Sp: 1733
+      - Level: 235
+        Sp: 1740
+      - Level: 236
+        Sp: 1747
+      - Level: 237
+        Sp: 1754
+      - Level: 238
+        Sp: 1761
+      - Level: 239
+        Sp: 1768
+      - Level: 240
+        Sp: 1775
+      - Level: 241
+        Sp: 1782
+      - Level: 242
+        Sp: 1789
+      - Level: 243
+        Sp: 1796
+      - Level: 244
+        Sp: 1803
+      - Level: 245
+        Sp: 1810
+      - Level: 246
+        Sp: 1817
+      - Level: 247
+        Sp: 1824
+      - Level: 248
+        Sp: 1831
+      - Level: 249
+        Sp: 1838
+      - Level: 250
+        Sp: 1845
+  - Jobs:
+      Shadow_Cross: true
+    BaseSp:
+      - Level: 200
+        Sp: 1070
+      - Level: 201
+        Sp: 1077
+      - Level: 202
+        Sp: 1084
+      - Level: 203
+        Sp: 1091
+      - Level: 204
+        Sp: 1098
+      - Level: 205
+        Sp: 1105
+      - Level: 206
+        Sp: 1112
+      - Level: 207
+        Sp: 1119
+      - Level: 208
+        Sp: 1126
+      - Level: 209
+        Sp: 1133
+      - Level: 210
+        Sp: 1140
+      - Level: 211
+        Sp: 1147
+      - Level: 212
+        Sp: 1154
+      - Level: 213
+        Sp: 1161
+      - Level: 214
+        Sp: 1168
+      - Level: 215
+        Sp: 1175
+      - Level: 216
+        Sp: 1182
+      - Level: 217
+        Sp: 1189
+      - Level: 218
+        Sp: 1196
+      - Level: 219
+        Sp: 1203
+      - Level: 220
+        Sp: 1210
+      - Level: 221
+        Sp: 1217
+      - Level: 222
+        Sp: 1224
+      - Level: 223
+        Sp: 1231
+      - Level: 224
+        Sp: 1238
+      - Level: 225
+        Sp: 1245
+      - Level: 226
+        Sp: 1252
+      - Level: 227
+        Sp: 1259
+      - Level: 228
+        Sp: 1266
+      - Level: 229
+        Sp: 1273
+      - Level: 230
+        Sp: 1280
+      - Level: 231
+        Sp: 1287
+      - Level: 232
+        Sp: 1294
+      - Level: 233
+        Sp: 1301
+      - Level: 234
+        Sp: 1308
+      - Level: 235
+        Sp: 1315
+      - Level: 236
+        Sp: 1322
+      - Level: 237
+        Sp: 1329
+      - Level: 238
+        Sp: 1336
+      - Level: 239
+        Sp: 1343
+      - Level: 240
+        Sp: 1350
+      - Level: 241
+        Sp: 1357
+      - Level: 242
+        Sp: 1364
+      - Level: 243
+        Sp: 1371
+      - Level: 244
+        Sp: 1378
+      - Level: 245
+        Sp: 1385
+      - Level: 246
+        Sp: 1392
+      - Level: 247
+        Sp: 1399
+      - Level: 248
+        Sp: 1406
+      - Level: 249
+        Sp: 1413
+      - Level: 250
+        Sp: 1420
+  - Jobs:
+      Arch_Mage: true
+    BaseSp:
+      - Level: 200
+        Sp: 1915
+      - Level: 201
+        Sp: 1927
+      - Level: 202
+        Sp: 1939
+      - Level: 203
+        Sp: 1951
+      - Level: 204
+        Sp: 1963
+      - Level: 205
+        Sp: 1975
+      - Level: 206
+        Sp: 1987
+      - Level: 207
+        Sp: 1999
+      - Level: 208
+        Sp: 2011
+      - Level: 209
+        Sp: 2023
+      - Level: 210
+        Sp: 2035
+      - Level: 211
+        Sp: 2047
+      - Level: 212
+        Sp: 2059
+      - Level: 213
+        Sp: 2071
+      - Level: 214
+        Sp: 2083
+      - Level: 215
+        Sp: 2095
+      - Level: 216
+        Sp: 2107
+      - Level: 217
+        Sp: 2119
+      - Level: 218
+        Sp: 2131
+      - Level: 219
+        Sp: 2143
+      - Level: 220
+        Sp: 2155
+      - Level: 221
+        Sp: 2167
+      - Level: 222
+        Sp: 2179
+      - Level: 223
+        Sp: 2191
+      - Level: 224
+        Sp: 2203
+      - Level: 225
+        Sp: 2215
+      - Level: 226
+        Sp: 2227
+      - Level: 227
+        Sp: 2239
+      - Level: 228
+        Sp: 2251
+      - Level: 229
+        Sp: 2263
+      - Level: 230
+        Sp: 2275
+      - Level: 231
+        Sp: 2287
+      - Level: 232
+        Sp: 2299
+      - Level: 233
+        Sp: 2311
+      - Level: 234
+        Sp: 2323
+      - Level: 235
+        Sp: 2335
+      - Level: 236
+        Sp: 2347
+      - Level: 237
+        Sp: 2359
+      - Level: 238
+        Sp: 2371
+      - Level: 239
+        Sp: 2383
+      - Level: 240
+        Sp: 2395
+      - Level: 241
+        Sp: 2407
+      - Level: 242
+        Sp: 2419
+      - Level: 243
+        Sp: 2431
+      - Level: 244
+        Sp: 2443
+      - Level: 245
+        Sp: 2455
+      - Level: 246
+        Sp: 2467
+      - Level: 247
+        Sp: 2479
+      - Level: 248
+        Sp: 2491
+      - Level: 249
+        Sp: 2503
+      - Level: 250
+        Sp: 2515
+  - Jobs:
+      Cardinal: true
+    BaseSp:
+      - Level: 200
+        Sp: 1915
+      - Level: 201
+        Sp: 1926
+      - Level: 202
+        Sp: 1937
+      - Level: 203
+        Sp: 1948
+      - Level: 204
+        Sp: 1959
+      - Level: 205
+        Sp: 1970
+      - Level: 206
+        Sp: 1981
+      - Level: 207
+        Sp: 1992
+      - Level: 208
+        Sp: 2003
+      - Level: 209
+        Sp: 2014
+      - Level: 210
+        Sp: 2025
+      - Level: 211
+        Sp: 2036
+      - Level: 212
+        Sp: 2047
+      - Level: 213
+        Sp: 2058
+      - Level: 214
+        Sp: 2069
+      - Level: 215
+        Sp: 2080
+      - Level: 216
+        Sp: 2091
+      - Level: 217
+        Sp: 2102
+      - Level: 218
+        Sp: 2113
+      - Level: 219
+        Sp: 2124
+      - Level: 220
+        Sp: 2135
+      - Level: 221
+        Sp: 2146
+      - Level: 222
+        Sp: 2157
+      - Level: 223
+        Sp: 2168
+      - Level: 224
+        Sp: 2179
+      - Level: 225
+        Sp: 2190
+      - Level: 226
+        Sp: 2201
+      - Level: 227
+        Sp: 2212
+      - Level: 228
+        Sp: 2223
+      - Level: 229
+        Sp: 2234
+      - Level: 230
+        Sp: 2245
+      - Level: 231
+        Sp: 2256
+      - Level: 232
+        Sp: 2267
+      - Level: 233
+        Sp: 2278
+      - Level: 234
+        Sp: 2289
+      - Level: 235
+        Sp: 2300
+      - Level: 236
+        Sp: 2311
+      - Level: 237
+        Sp: 2322
+      - Level: 238
+        Sp: 2333
+      - Level: 239
+        Sp: 2344
+      - Level: 240
+        Sp: 2355
+      - Level: 241
+        Sp: 2366
+      - Level: 242
+        Sp: 2377
+      - Level: 243
+        Sp: 2388
+      - Level: 244
+        Sp: 2399
+      - Level: 245
+        Sp: 2410
+      - Level: 246
+        Sp: 2421
+      - Level: 247
+        Sp: 2432
+      - Level: 248
+        Sp: 2443
+      - Level: 249
+        Sp: 2454
+      - Level: 250
+        Sp: 2465
+  - Jobs:
+      Windhawk: true
+      Windhawk2: true
+    BaseSp:
+      - Level: 200
+        Sp: 1050
+      - Level: 201
+        Sp: 1057
+      - Level: 202
+        Sp: 1064
+      - Level: 203
+        Sp: 1071
+      - Level: 204
+        Sp: 1078
+      - Level: 205
+        Sp: 1085
+      - Level: 206
+        Sp: 1092
+      - Level: 207
+        Sp: 1099
+      - Level: 208
+        Sp: 1106
+      - Level: 209
+        Sp: 1113
+      - Level: 210
+        Sp: 1120
+      - Level: 211
+        Sp: 1127
+      - Level: 212
+        Sp: 1134
+      - Level: 213
+        Sp: 1141
+      - Level: 214
+        Sp: 1148
+      - Level: 215
+        Sp: 1155
+      - Level: 216
+        Sp: 1162
+      - Level: 217
+        Sp: 1169
+      - Level: 218
+        Sp: 1176
+      - Level: 219
+        Sp: 1183
+      - Level: 220
+        Sp: 1190
+      - Level: 221
+        Sp: 1197
+      - Level: 222
+        Sp: 1204
+      - Level: 223
+        Sp: 1211
+      - Level: 224
+        Sp: 1218
+      - Level: 225
+        Sp: 1225
+      - Level: 226
+        Sp: 1232
+      - Level: 227
+        Sp: 1239
+      - Level: 228
+        Sp: 1246
+      - Level: 229
+        Sp: 1253
+      - Level: 230
+        Sp: 1260
+      - Level: 231
+        Sp: 1267
+      - Level: 232
+        Sp: 1274
+      - Level: 233
+        Sp: 1281
+      - Level: 234
+        Sp: 1288
+      - Level: 235
+        Sp: 1295
+      - Level: 236
+        Sp: 1302
+      - Level: 237
+        Sp: 1309
+      - Level: 238
+        Sp: 1316
+      - Level: 239
+        Sp: 1323
+      - Level: 240
+        Sp: 1330
+      - Level: 241
+        Sp: 1337
+      - Level: 242
+        Sp: 1344
+      - Level: 243
+        Sp: 1351
+      - Level: 244
+        Sp: 1358
+      - Level: 245
+        Sp: 1365
+      - Level: 246
+        Sp: 1372
+      - Level: 247
+        Sp: 1379
+      - Level: 248
+        Sp: 1386
+      - Level: 249
+        Sp: 1393
+      - Level: 250
+        Sp: 1400
+  - Jobs:
+      Imperial_Guard: true
+      Imperial_Guard2: true
+    BaseSp:
+      - Level: 200
+        Sp: 1495
+      - Level: 201
+        Sp: 1502
+      - Level: 202
+        Sp: 1509
+      - Level: 203
+        Sp: 1516
+      - Level: 204
+        Sp: 1523
+      - Level: 205
+        Sp: 1530
+      - Level: 206
+        Sp: 1537
+      - Level: 207
+        Sp: 1544
+      - Level: 208
+        Sp: 1551
+      - Level: 209
+        Sp: 1558
+      - Level: 210
+        Sp: 1565
+      - Level: 211
+        Sp: 1572
+      - Level: 212
+        Sp: 1579
+      - Level: 213
+        Sp: 1586
+      - Level: 214
+        Sp: 1593
+      - Level: 215
+        Sp: 1600
+      - Level: 216
+        Sp: 1607
+      - Level: 217
+        Sp: 1614
+      - Level: 218
+        Sp: 1621
+      - Level: 219
+        Sp: 1628
+      - Level: 220
+        Sp: 1635
+      - Level: 221
+        Sp: 1642
+      - Level: 222
+        Sp: 1649
+      - Level: 223
+        Sp: 1656
+      - Level: 224
+        Sp: 1663
+      - Level: 225
+        Sp: 1670
+      - Level: 226
+        Sp: 1677
+      - Level: 227
+        Sp: 1684
+      - Level: 228
+        Sp: 1691
+      - Level: 229
+        Sp: 1698
+      - Level: 230
+        Sp: 1705
+      - Level: 231
+        Sp: 1712
+      - Level: 232
+        Sp: 1719
+      - Level: 233
+        Sp: 1726
+      - Level: 234
+        Sp: 1733
+      - Level: 235
+        Sp: 1740
+      - Level: 236
+        Sp: 1747
+      - Level: 237
+        Sp: 1754
+      - Level: 238
+        Sp: 1761
+      - Level: 239
+        Sp: 1768
+      - Level: 240
+        Sp: 1775
+      - Level: 241
+        Sp: 1782
+      - Level: 242
+        Sp: 1789
+      - Level: 243
+        Sp: 1796
+      - Level: 244
+        Sp: 1803
+      - Level: 245
+        Sp: 1810
+      - Level: 246
+        Sp: 1817
+      - Level: 247
+        Sp: 1824
+      - Level: 248
+        Sp: 1831
+      - Level: 249
+        Sp: 1838
+      - Level: 250
+        Sp: 1845
+  - Jobs:
+      Biolo: true
+    BaseSp:
+      - Level: 200
+        Sp: 1915
+      - Level: 201
+        Sp: 1927
+      - Level: 202
+        Sp: 1939
+      - Level: 203
+        Sp: 1951
+      - Level: 204
+        Sp: 1963
+      - Level: 205
+        Sp: 1975
+      - Level: 206
+        Sp: 1987
+      - Level: 207
+        Sp: 1999
+      - Level: 208
+        Sp: 2011
+      - Level: 209
+        Sp: 2023
+      - Level: 210
+        Sp: 2035
+      - Level: 211
+        Sp: 2047
+      - Level: 212
+        Sp: 2059
+      - Level: 213
+        Sp: 2071
+      - Level: 214
+        Sp: 2083
+      - Level: 215
+        Sp: 2095
+      - Level: 216
+        Sp: 2107
+      - Level: 217
+        Sp: 2119
+      - Level: 218
+        Sp: 2131
+      - Level: 219
+        Sp: 2143
+      - Level: 220
+        Sp: 2155
+      - Level: 221
+        Sp: 2167
+      - Level: 222
+        Sp: 2179
+      - Level: 223
+        Sp: 2191
+      - Level: 224
+        Sp: 2203
+      - Level: 225
+        Sp: 2215
+      - Level: 226
+        Sp: 2227
+      - Level: 227
+        Sp: 2239
+      - Level: 228
+        Sp: 2251
+      - Level: 229
+        Sp: 2263
+      - Level: 230
+        Sp: 2275
+      - Level: 231
+        Sp: 2287
+      - Level: 232
+        Sp: 2299
+      - Level: 233
+        Sp: 2311
+      - Level: 234
+        Sp: 2323
+      - Level: 235
+        Sp: 2335
+      - Level: 236
+        Sp: 2347
+      - Level: 237
+        Sp: 2359
+      - Level: 238
+        Sp: 2371
+      - Level: 239
+        Sp: 2383
+      - Level: 240
+        Sp: 2395
+      - Level: 241
+        Sp: 2407
+      - Level: 242
+        Sp: 2419
+      - Level: 243
+        Sp: 2431
+      - Level: 244
+        Sp: 2443
+      - Level: 245
+        Sp: 2455
+      - Level: 246
+        Sp: 2467
+      - Level: 247
+        Sp: 2479
+      - Level: 248
+        Sp: 2491
+      - Level: 249
+        Sp: 2503
+      - Level: 250
+        Sp: 2515
+  - Jobs:
+      Abyss_Chaser: true
+    BaseSp:
+      - Level: 200
+        Sp: 915
+      - Level: 201
+        Sp: 922
+      - Level: 202
+        Sp: 929
+      - Level: 203
+        Sp: 936
+      - Level: 204
+        Sp: 943
+      - Level: 205
+        Sp: 950
+      - Level: 206
+        Sp: 957
+      - Level: 207
+        Sp: 964
+      - Level: 208
+        Sp: 971
+      - Level: 209
+        Sp: 978
+      - Level: 210
+        Sp: 985
+      - Level: 211
+        Sp: 992
+      - Level: 212
+        Sp: 999
+      - Level: 213
+        Sp: 1006
+      - Level: 214
+        Sp: 1013
+      - Level: 215
+        Sp: 1020
+      - Level: 216
+        Sp: 1027
+      - Level: 217
+        Sp: 1034
+      - Level: 218
+        Sp: 1041
+      - Level: 219
+        Sp: 1048
+      - Level: 220
+        Sp: 1055
+      - Level: 221
+        Sp: 1062
+      - Level: 222
+        Sp: 1069
+      - Level: 223
+        Sp: 1076
+      - Level: 224
+        Sp: 1083
+      - Level: 225
+        Sp: 1090
+      - Level: 226
+        Sp: 1097
+      - Level: 227
+        Sp: 1104
+      - Level: 228
+        Sp: 1111
+      - Level: 229
+        Sp: 1118
+      - Level: 230
+        Sp: 1125
+      - Level: 231
+        Sp: 1132
+      - Level: 232
+        Sp: 1139
+      - Level: 233
+        Sp: 1146
+      - Level: 234
+        Sp: 1153
+      - Level: 235
+        Sp: 1160
+      - Level: 236
+        Sp: 1167
+      - Level: 237
+        Sp: 1174
+      - Level: 238
+        Sp: 1181
+      - Level: 239
+        Sp: 1188
+      - Level: 240
+        Sp: 1195
+      - Level: 241
+        Sp: 1202
+      - Level: 242
+        Sp: 1209
+      - Level: 243
+        Sp: 1216
+      - Level: 244
+        Sp: 1223
+      - Level: 245
+        Sp: 1230
+      - Level: 246
+        Sp: 1237
+      - Level: 247
+        Sp: 1244
+      - Level: 248
+        Sp: 1251
+      - Level: 249
+        Sp: 1258
+      - Level: 250
+        Sp: 1265
+  - Jobs:
+      Elemental_Master: true
+    BaseSp:
+      - Level: 200
+        Sp: 1915
+      - Level: 201
+        Sp: 1927
+      - Level: 202
+        Sp: 1939
+      - Level: 203
+        Sp: 1951
+      - Level: 204
+        Sp: 1963
+      - Level: 205
+        Sp: 1975
+      - Level: 206
+        Sp: 1987
+      - Level: 207
+        Sp: 1999
+      - Level: 208
+        Sp: 2011
+      - Level: 209
+        Sp: 2023
+      - Level: 210
+        Sp: 2035
+      - Level: 211
+        Sp: 2047
+      - Level: 212
+        Sp: 2059
+      - Level: 213
+        Sp: 2071
+      - Level: 214
+        Sp: 2083
+      - Level: 215
+        Sp: 2095
+      - Level: 216
+        Sp: 2107
+      - Level: 217
+        Sp: 2119
+      - Level: 218
+        Sp: 2131
+      - Level: 219
+        Sp: 2143
+      - Level: 220
+        Sp: 2155
+      - Level: 221
+        Sp: 2167
+      - Level: 222
+        Sp: 2179
+      - Level: 223
+        Sp: 2191
+      - Level: 224
+        Sp: 2203
+      - Level: 225
+        Sp: 2215
+      - Level: 226
+        Sp: 2227
+      - Level: 227
+        Sp: 2239
+      - Level: 228
+        Sp: 2251
+      - Level: 229
+        Sp: 2263
+      - Level: 230
+        Sp: 2275
+      - Level: 231
+        Sp: 2287
+      - Level: 232
+        Sp: 2299
+      - Level: 233
+        Sp: 2311
+      - Level: 234
+        Sp: 2323
+      - Level: 235
+        Sp: 2335
+      - Level: 236
+        Sp: 2347
+      - Level: 237
+        Sp: 2359
+      - Level: 238
+        Sp: 2371
+      - Level: 239
+        Sp: 2383
+      - Level: 240
+        Sp: 2395
+      - Level: 241
+        Sp: 2407
+      - Level: 242
+        Sp: 2419
+      - Level: 243
+        Sp: 2431
+      - Level: 244
+        Sp: 2443
+      - Level: 245
+        Sp: 2455
+      - Level: 246
+        Sp: 2467
+      - Level: 247
+        Sp: 2479
+      - Level: 248
+        Sp: 2491
+      - Level: 249
+        Sp: 2503
+      - Level: 250
+        Sp: 2515
+  - Jobs:
+      Inquisitor: true
+    BaseSp:
+      - Level: 200
+        Sp: 915
+      - Level: 201
+        Sp: 922
+      - Level: 202
+        Sp: 929
+      - Level: 203
+        Sp: 936
+      - Level: 204
+        Sp: 943
+      - Level: 205
+        Sp: 950
+      - Level: 206
+        Sp: 957
+      - Level: 207
+        Sp: 964
+      - Level: 208
+        Sp: 971
+      - Level: 209
+        Sp: 978
+      - Level: 210
+        Sp: 985
+      - Level: 211
+        Sp: 992
+      - Level: 212
+        Sp: 999
+      - Level: 213
+        Sp: 1006
+      - Level: 214
+        Sp: 1013
+      - Level: 215
+        Sp: 1020
+      - Level: 216
+        Sp: 1027
+      - Level: 217
+        Sp: 1034
+      - Level: 218
+        Sp: 1041
+      - Level: 219
+        Sp: 1048
+      - Level: 220
+        Sp: 1055
+      - Level: 221
+        Sp: 1062
+      - Level: 222
+        Sp: 1069
+      - Level: 223
+        Sp: 1076
+      - Level: 224
+        Sp: 1083
+      - Level: 225
+        Sp: 1090
+      - Level: 226
+        Sp: 1097
+      - Level: 227
+        Sp: 1104
+      - Level: 228
+        Sp: 1111
+      - Level: 229
+        Sp: 1118
+      - Level: 230
+        Sp: 1125
+      - Level: 231
+        Sp: 1132
+      - Level: 232
+        Sp: 1139
+      - Level: 233
+        Sp: 1146
+      - Level: 234
+        Sp: 1153
+      - Level: 235
+        Sp: 1160
+      - Level: 236
+        Sp: 1167
+      - Level: 237
+        Sp: 1174
+      - Level: 238
+        Sp: 1181
+      - Level: 239
+        Sp: 1188
+      - Level: 240
+        Sp: 1195
+      - Level: 241
+        Sp: 1202
+      - Level: 242
+        Sp: 1209
+      - Level: 243
+        Sp: 1216
+      - Level: 244
+        Sp: 1223
+      - Level: 245
+        Sp: 1230
+      - Level: 246
+        Sp: 1237
+      - Level: 247
+        Sp: 1244
+      - Level: 248
+        Sp: 1251
+      - Level: 249
+        Sp: 1258
+      - Level: 250
+        Sp: 1265
+  - Jobs:
+      Troubadour: true
+    BaseSp:
+      - Level: 200
+        Sp: 1115
+      - Level: 201
+        Sp: 1122
+      - Level: 202
+        Sp: 1129
+      - Level: 203
+        Sp: 1136
+      - Level: 204
+        Sp: 1143
+      - Level: 205
+        Sp: 1150
+      - Level: 206
+        Sp: 1157
+      - Level: 207
+        Sp: 1164
+      - Level: 208
+        Sp: 1171
+      - Level: 209
+        Sp: 1178
+      - Level: 210
+        Sp: 1185
+      - Level: 211
+        Sp: 1192
+      - Level: 212
+        Sp: 1199
+      - Level: 213
+        Sp: 1206
+      - Level: 214
+        Sp: 1213
+      - Level: 215
+        Sp: 1220
+      - Level: 216
+        Sp: 1227
+      - Level: 217
+        Sp: 1234
+      - Level: 218
+        Sp: 1241
+      - Level: 219
+        Sp: 1248
+      - Level: 220
+        Sp: 1255
+      - Level: 221
+        Sp: 1262
+      - Level: 222
+        Sp: 1269
+      - Level: 223
+        Sp: 1276
+      - Level: 224
+        Sp: 1283
+      - Level: 225
+        Sp: 1290
+      - Level: 226
+        Sp: 1297
+      - Level: 227
+        Sp: 1304
+      - Level: 228
+        Sp: 1311
+      - Level: 229
+        Sp: 1318
+      - Level: 230
+        Sp: 1325
+      - Level: 231
+        Sp: 1332
+      - Level: 232
+        Sp: 1339
+      - Level: 233
+        Sp: 1346
+      - Level: 234
+        Sp: 1353
+      - Level: 235
+        Sp: 1360
+      - Level: 236
+        Sp: 1367
+      - Level: 237
+        Sp: 1374
+      - Level: 238
+        Sp: 1381
+      - Level: 239
+        Sp: 1388
+      - Level: 240
+        Sp: 1395
+      - Level: 241
+        Sp: 1402
+      - Level: 242
+        Sp: 1409
+      - Level: 243
+        Sp: 1416
+      - Level: 244
+        Sp: 1423
+      - Level: 245
+        Sp: 1430
+      - Level: 246
+        Sp: 1437
+      - Level: 247
+        Sp: 1444
+      - Level: 248
+        Sp: 1451
+      - Level: 249
+        Sp: 1458
+      - Level: 250
+        Sp: 1465
+  - Jobs:
+      Trouvere: true
+    BaseSp:
+      - Level: 200
+        Sp: 1115
+      - Level: 201
+        Sp: 1122
+      - Level: 202
+        Sp: 1129
+      - Level: 203
+        Sp: 1136
+      - Level: 204
+        Sp: 1143
+      - Level: 205
+        Sp: 1150
+      - Level: 206
+        Sp: 1157
+      - Level: 207
+        Sp: 1164
+      - Level: 208
+        Sp: 1171
+      - Level: 209
+        Sp: 1178
+      - Level: 210
+        Sp: 1185
+      - Level: 211
+        Sp: 1192
+      - Level: 212
+        Sp: 1199
+      - Level: 213
+        Sp: 1206
+      - Level: 214
+        Sp: 1213
+      - Level: 215
+        Sp: 1220
+      - Level: 216
+        Sp: 1227
+      - Level: 217
+        Sp: 1234
+      - Level: 218
+        Sp: 1241
+      - Level: 219
+        Sp: 1248
+      - Level: 220
+        Sp: 1255
+      - Level: 221
+        Sp: 1262
+      - Level: 222
+        Sp: 1269
+      - Level: 223
+        Sp: 1276
+      - Level: 224
+        Sp: 1283
+      - Level: 225
+        Sp: 1290
+      - Level: 226
+        Sp: 1297
+      - Level: 227
+        Sp: 1304
+      - Level: 228
+        Sp: 1311
+      - Level: 229
+        Sp: 1318
+      - Level: 230
+        Sp: 1325
+      - Level: 231
+        Sp: 1332
+      - Level: 232
+        Sp: 1339
+      - Level: 233
+        Sp: 1346
+      - Level: 234
+        Sp: 1353
+      - Level: 235
+        Sp: 1360
+      - Level: 236
+        Sp: 1367
+      - Level: 237
+        Sp: 1374
+      - Level: 238
+        Sp: 1381
+      - Level: 239
+        Sp: 1388
+      - Level: 240
+        Sp: 1395
+      - Level: 241
+        Sp: 1402
+      - Level: 242
+        Sp: 1409
+      - Level: 243
+        Sp: 1416
+      - Level: 244
+        Sp: 1423
+      - Level: 245
+        Sp: 1430
+      - Level: 246
+        Sp: 1437
+      - Level: 247
+        Sp: 1444
+      - Level: 248
+        Sp: 1451
+      - Level: 249
+        Sp: 1458
+      - Level: 250
+        Sp: 1465
+  - Jobs:
+      Sky_Emperor: true
+      Sky_Emperor2: true
+    BaseSp:
+      - Level: 200
+        Sp: 500
+      - Level: 201
+        Sp: 500
+      - Level: 202
+        Sp: 500
+      - Level: 203
+        Sp: 500
+      - Level: 204
+        Sp: 500
+      - Level: 205
+        Sp: 500
+      - Level: 206
+        Sp: 500
+      - Level: 207
+        Sp: 500
+      - Level: 208
+        Sp: 500
+      - Level: 209
+        Sp: 500
+      - Level: 210
+        Sp: 500
+      - Level: 211
+        Sp: 500
+      - Level: 212
+        Sp: 500
+      - Level: 213
+        Sp: 500
+      - Level: 214
+        Sp: 500
+      - Level: 215
+        Sp: 500
+      - Level: 216
+        Sp: 500
+      - Level: 217
+        Sp: 500
+      - Level: 218
+        Sp: 500
+      - Level: 219
+        Sp: 500
+      - Level: 220
+        Sp: 500
+      - Level: 221
+        Sp: 500
+      - Level: 222
+        Sp: 500
+      - Level: 223
+        Sp: 500
+      - Level: 224
+        Sp: 500
+      - Level: 225
+        Sp: 500
+      - Level: 226
+        Sp: 500
+      - Level: 227
+        Sp: 500
+      - Level: 228
+        Sp: 500
+      - Level: 229
+        Sp: 500
+      - Level: 230
+        Sp: 500
+      - Level: 231
+        Sp: 500
+      - Level: 232
+        Sp: 500
+      - Level: 233
+        Sp: 500
+      - Level: 234
+        Sp: 500
+      - Level: 235
+        Sp: 500
+      - Level: 236
+        Sp: 500
+      - Level: 237
+        Sp: 500
+      - Level: 238
+        Sp: 500
+      - Level: 239
+        Sp: 500
+      - Level: 240
+        Sp: 500
+      - Level: 241
+        Sp: 500
+      - Level: 242
+        Sp: 500
+      - Level: 243
+        Sp: 500
+      - Level: 244
+        Sp: 500
+      - Level: 245
+        Sp: 500
+      - Level: 246
+        Sp: 500
+      - Level: 247
+        Sp: 500
+      - Level: 248
+        Sp: 500
+      - Level: 249
+        Sp: 500
+      - Level: 250
+        Sp: 500
+  - Jobs:
+      Soul_Ascetic: true
+    BaseSp:
+      - Level: 200
+        Sp: 900
+      - Level: 201
+        Sp: 900
+      - Level: 202
+        Sp: 900
+      - Level: 203
+        Sp: 900
+      - Level: 204
+        Sp: 900
+      - Level: 205
+        Sp: 900
+      - Level: 206
+        Sp: 900
+      - Level: 207
+        Sp: 900
+      - Level: 208
+        Sp: 900
+      - Level: 209
+        Sp: 900
+      - Level: 210
+        Sp: 900
+      - Level: 211
+        Sp: 900
+      - Level: 212
+        Sp: 900
+      - Level: 213
+        Sp: 900
+      - Level: 214
+        Sp: 900
+      - Level: 215
+        Sp: 900
+      - Level: 216
+        Sp: 900
+      - Level: 217
+        Sp: 900
+      - Level: 218
+        Sp: 900
+      - Level: 219
+        Sp: 900
+      - Level: 220
+        Sp: 900
+      - Level: 221
+        Sp: 900
+      - Level: 222
+        Sp: 900
+      - Level: 223
+        Sp: 900
+      - Level: 224
+        Sp: 900
+      - Level: 225
+        Sp: 900
+      - Level: 226
+        Sp: 900
+      - Level: 227
+        Sp: 900
+      - Level: 228
+        Sp: 900
+      - Level: 229
+        Sp: 900
+      - Level: 230
+        Sp: 900
+      - Level: 231
+        Sp: 900
+      - Level: 232
+        Sp: 900
+      - Level: 233
+        Sp: 900
+      - Level: 234
+        Sp: 900
+      - Level: 235
+        Sp: 900
+      - Level: 236
+        Sp: 900
+      - Level: 237
+        Sp: 900
+      - Level: 238
+        Sp: 900
+      - Level: 239
+        Sp: 900
+      - Level: 240
+        Sp: 900
+      - Level: 241
+        Sp: 900
+      - Level: 242
+        Sp: 900
+      - Level: 243
+        Sp: 900
+      - Level: 244
+        Sp: 900
+      - Level: 245
+        Sp: 900
+      - Level: 246
+        Sp: 900
+      - Level: 247
+        Sp: 900
+      - Level: 248
+        Sp: 900
+      - Level: 249
+        Sp: 900
+      - Level: 250
+        Sp: 900
+  - Jobs:
+      Shinkiro: true
+    BaseSp:
+      - Level: 200
+        Sp: 1330
+      - Level: 201
+        Sp: 1338
+      - Level: 202
+        Sp: 1346
+      - Level: 203
+        Sp: 1354
+      - Level: 204
+        Sp: 1362
+      - Level: 205
+        Sp: 1370
+      - Level: 206
+        Sp: 1378
+      - Level: 207
+        Sp: 1386
+      - Level: 208
+        Sp: 1394
+      - Level: 209
+        Sp: 1402
+      - Level: 210
+        Sp: 1410
+      - Level: 211
+        Sp: 1418
+      - Level: 212
+        Sp: 1426
+      - Level: 213
+        Sp: 1434
+      - Level: 214
+        Sp: 1442
+      - Level: 215
+        Sp: 1450
+      - Level: 216
+        Sp: 1458
+      - Level: 217
+        Sp: 1466
+      - Level: 218
+        Sp: 1474
+      - Level: 219
+        Sp: 1482
+      - Level: 220
+        Sp: 1490
+      - Level: 221
+        Sp: 1498
+      - Level: 222
+        Sp: 1506
+      - Level: 223
+        Sp: 1514
+      - Level: 224
+        Sp: 1522
+      - Level: 225
+        Sp: 1530
+      - Level: 226
+        Sp: 1538
+      - Level: 227
+        Sp: 1546
+      - Level: 228
+        Sp: 1554
+      - Level: 229
+        Sp: 1562
+      - Level: 230
+        Sp: 1570
+      - Level: 231
+        Sp: 1578
+      - Level: 232
+        Sp: 1586
+      - Level: 233
+        Sp: 1594
+      - Level: 234
+        Sp: 1602
+      - Level: 235
+        Sp: 1610
+      - Level: 236
+        Sp: 1618
+      - Level: 237
+        Sp: 1626
+      - Level: 238
+        Sp: 1634
+      - Level: 239
+        Sp: 1642
+      - Level: 240
+        Sp: 1650
+      - Level: 241
+        Sp: 1658
+      - Level: 242
+        Sp: 1666
+      - Level: 243
+        Sp: 1674
+      - Level: 244
+        Sp: 1682
+      - Level: 245
+        Sp: 1690
+      - Level: 246
+        Sp: 1698
+      - Level: 247
+        Sp: 1706
+      - Level: 248
+        Sp: 1714
+      - Level: 249
+        Sp: 1722
+      - Level: 250
+        Sp: 1730
+  - Jobs:
+      Shiranui: true
+    BaseSp:
+      - Level: 200
+        Sp: 1420
+      - Level: 201
+        Sp: 1428
+      - Level: 202
+        Sp: 1436
+      - Level: 203
+        Sp: 1444
+      - Level: 204
+        Sp: 1452
+      - Level: 205
+        Sp: 1460
+      - Level: 206
+        Sp: 1468
+      - Level: 207
+        Sp: 1476
+      - Level: 208
+        Sp: 1484
+      - Level: 209
+        Sp: 1492
+      - Level: 210
+        Sp: 1500
+      - Level: 211
+        Sp: 1508
+      - Level: 212
+        Sp: 1516
+      - Level: 213
+        Sp: 1524
+      - Level: 214
+        Sp: 1532
+      - Level: 215
+        Sp: 1540
+      - Level: 216
+        Sp: 1548
+      - Level: 217
+        Sp: 1556
+      - Level: 218
+        Sp: 1564
+      - Level: 219
+        Sp: 1572
+      - Level: 220
+        Sp: 1580
+      - Level: 221
+        Sp: 1588
+      - Level: 222
+        Sp: 1596
+      - Level: 223
+        Sp: 1604
+      - Level: 224
+        Sp: 1612
+      - Level: 225
+        Sp: 1620
+      - Level: 226
+        Sp: 1628
+      - Level: 227
+        Sp: 1636
+      - Level: 228
+        Sp: 1644
+      - Level: 229
+        Sp: 1652
+      - Level: 230
+        Sp: 1660
+      - Level: 231
+        Sp: 1668
+      - Level: 232
+        Sp: 1676
+      - Level: 233
+        Sp: 1684
+      - Level: 234
+        Sp: 1692
+      - Level: 235
+        Sp: 1700
+      - Level: 236
+        Sp: 1708
+      - Level: 237
+        Sp: 1716
+      - Level: 238
+        Sp: 1724
+      - Level: 239
+        Sp: 1732
+      - Level: 240
+        Sp: 1740
+      - Level: 241
+        Sp: 1748
+      - Level: 242
+        Sp: 1756
+      - Level: 243
+        Sp: 1764
+      - Level: 244
+        Sp: 1772
+      - Level: 245
+        Sp: 1780
+      - Level: 246
+        Sp: 1788
+      - Level: 247
+        Sp: 1796
+      - Level: 248
+        Sp: 1804
+      - Level: 249
+        Sp: 1812
+      - Level: 250
+        Sp: 1820
+  - Jobs:
+      Night_Watch: true
+    BaseSp:
+      - Level: 200
+        Sp: 1062
+      - Level: 201
+        Sp: 1068
+      - Level: 202
+        Sp: 1074
+      - Level: 203
+        Sp: 1080
+      - Level: 204
+        Sp: 1086
+      - Level: 205
+        Sp: 1092
+      - Level: 206
+        Sp: 1098
+      - Level: 207
+        Sp: 1104
+      - Level: 208
+        Sp: 1110
+      - Level: 209
+        Sp: 1116
+      - Level: 210
+        Sp: 1122
+      - Level: 211
+        Sp: 1128
+      - Level: 212
+        Sp: 1134
+      - Level: 213
+        Sp: 1140
+      - Level: 214
+        Sp: 1146
+      - Level: 215
+        Sp: 1152
+      - Level: 216
+        Sp: 1158
+      - Level: 217
+        Sp: 1164
+      - Level: 218
+        Sp: 1170
+      - Level: 219
+        Sp: 1176
+      - Level: 220
+        Sp: 1182
+      - Level: 221
+        Sp: 1188
+      - Level: 222
+        Sp: 1194
+      - Level: 223
+        Sp: 1200
+      - Level: 224
+        Sp: 1206
+      - Level: 225
+        Sp: 1212
+      - Level: 226
+        Sp: 1218
+      - Level: 227
+        Sp: 1224
+      - Level: 228
+        Sp: 1230
+      - Level: 229
+        Sp: 1236
+      - Level: 230
+        Sp: 1242
+      - Level: 231
+        Sp: 1248
+      - Level: 232
+        Sp: 1254
+      - Level: 233
+        Sp: 1260
+      - Level: 234
+        Sp: 1266
+      - Level: 235
+        Sp: 1272
+      - Level: 236
+        Sp: 1278
+      - Level: 237
+        Sp: 1284
+      - Level: 238
+        Sp: 1290
+      - Level: 239
+        Sp: 1296
+      - Level: 240
+        Sp: 1302
+      - Level: 241
+        Sp: 1308
+      - Level: 242
+        Sp: 1314
+      - Level: 243
+        Sp: 1320
+      - Level: 244
+        Sp: 1326
+      - Level: 245
+        Sp: 1332
+      - Level: 246
+        Sp: 1338
+      - Level: 247
+        Sp: 1344
+      - Level: 248
+        Sp: 1350
+      - Level: 249
+        Sp: 1356
+      - Level: 250
+        Sp: 1362
+  - Jobs:
+      Hyper_Novice: true
+    BaseSp:
+      - Level: 200
+        Sp: 200
+      - Level: 201
+        Sp: 201
+      - Level: 202
+        Sp: 202
+      - Level: 203
+        Sp: 203
+      - Level: 204
+        Sp: 204
+      - Level: 205
+        Sp: 205
+      - Level: 206
+        Sp: 206
+      - Level: 207
+        Sp: 207
+      - Level: 208
+        Sp: 208
+      - Level: 209
+        Sp: 209
+      - Level: 210
+        Sp: 210
+      - Level: 211
+        Sp: 211
+      - Level: 212
+        Sp: 212
+      - Level: 213
+        Sp: 213
+      - Level: 214
+        Sp: 214
+      - Level: 215
+        Sp: 215
+      - Level: 216
+        Sp: 216
+      - Level: 217
+        Sp: 217
+      - Level: 218
+        Sp: 218
+      - Level: 219
+        Sp: 219
+      - Level: 220
+        Sp: 220
+      - Level: 221
+        Sp: 221
+      - Level: 222
+        Sp: 222
+      - Level: 223
+        Sp: 223
+      - Level: 224
+        Sp: 224
+      - Level: 225
+        Sp: 225
+      - Level: 226
+        Sp: 226
+      - Level: 227
+        Sp: 227
+      - Level: 228
+        Sp: 228
+      - Level: 229
+        Sp: 229
+      - Level: 230
+        Sp: 230
+      - Level: 231
+        Sp: 231
+      - Level: 232
+        Sp: 232
+      - Level: 233
+        Sp: 233
+      - Level: 234
+        Sp: 234
+      - Level: 235
+        Sp: 235
+      - Level: 236
+        Sp: 236
+      - Level: 237
+        Sp: 237
+      - Level: 238
+        Sp: 238
+      - Level: 239
+        Sp: 239
+      - Level: 240
+        Sp: 240
+      - Level: 241
+        Sp: 241
+      - Level: 242
+        Sp: 242
+      - Level: 243
+        Sp: 243
+      - Level: 244
+        Sp: 244
+      - Level: 245
+        Sp: 245
+      - Level: 246
+        Sp: 246
+      - Level: 247
+        Sp: 247
+      - Level: 248
+        Sp: 248
+      - Level: 249
+        Sp: 249
+      - Level: 250
+        Sp: 250
+  - Jobs:
+      Spirit_Handler: true
+    BaseSp:
+      - Level: 200
+        Sp: 505
+      - Level: 201
+        Sp: 508
+      - Level: 202
+        Sp: 510
+      - Level: 203
+        Sp: 513
+      - Level: 204
+        Sp: 515
+      - Level: 205
+        Sp: 518
+      - Level: 206
+        Sp: 520
+      - Level: 207
+        Sp: 523
+      - Level: 208
+        Sp: 525
+      - Level: 209
+        Sp: 528
+      - Level: 210
+        Sp: 530
+      - Level: 211
+        Sp: 533
+      - Level: 212
+        Sp: 535
+      - Level: 213
+        Sp: 538
+      - Level: 214
+        Sp: 540
+      - Level: 215
+        Sp: 543
+      - Level: 216
+        Sp: 545
+      - Level: 217
+        Sp: 548
+      - Level: 218
+        Sp: 550
+      - Level: 219
+        Sp: 553
+      - Level: 220
+        Sp: 555
+      - Level: 221
+        Sp: 558
+      - Level: 222
+        Sp: 560
+      - Level: 223
+        Sp: 563
+      - Level: 224
+        Sp: 565
+      - Level: 225
+        Sp: 568
+      - Level: 226
+        Sp: 570
+      - Level: 227
+        Sp: 573
+      - Level: 228
+        Sp: 575
+      - Level: 229
+        Sp: 578
+      - Level: 230
+        Sp: 580
+      - Level: 231
+        Sp: 583
+      - Level: 232
+        Sp: 585
+      - Level: 233
+        Sp: 588
+      - Level: 234
+        Sp: 590
+      - Level: 235
+        Sp: 593
+      - Level: 236
+        Sp: 595
+      - Level: 237
+        Sp: 598
+      - Level: 238
+        Sp: 600
+      - Level: 239
+        Sp: 603
+      - Level: 240
+        Sp: 605
+      - Level: 241
+        Sp: 608
+      - Level: 242
+        Sp: 610
+      - Level: 243
+        Sp: 613
+      - Level: 244
+        Sp: 615
+      - Level: 245
+        Sp: 618
+      - Level: 246
+        Sp: 620
+      - Level: 247
+        Sp: 623
+      - Level: 248
+        Sp: 625
+      - Level: 249
+        Sp: 628
+      - Level: 250
+        Sp: 630

+ 30 - 1
db/re/job_noenter_map.txt

@@ -104,4 +104,33 @@ JOB_SOUL_REAPER,4112,100
 JOB_BABY_STAR_EMPEROR,4112,100
 JOB_BABY_SOUL_REAPER,4112,100
 JOB_STAR_EMPEROR2,4112,100
-JOB_BABY_STAR_EMPEROR2,4112,100
+JOB_BABY_STAR_EMPEROR2,4112,100
+
+JOB_DRAGON_KNIGHT,4112,100
+JOB_MEISTER,4112,100
+JOB_SHADOW_CROSS,4112,100
+JOB_ARCH_MAGE,4112,100
+JOB_CARDINAL,4112,100
+JOB_WINDHAWK,4112,100
+JOB_IMPERIAL_GUARD,4112,100
+JOB_BIOLO,4112,100
+JOB_ABYSS_CHASER,4112,100
+JOB_ELEMENTAL_MASTER,4112,100
+JOB_INQUISITOR,4112,100
+JOB_TROUBADOUR,4112,100
+JOB_TROUVERE,4112,100
+
+JOB_WINDHAWK2,4112,100
+JOB_MEISTER2,4112,100
+JOB_DRAGON_KNIGHT2,4112,100
+JOB_IMPERIAL_GUARD2,4112,100
+
+JOB_SKY_EMPEROR,4112,100
+JOB_SOUL_ASCETIC,4112,100
+JOB_SHINKIRO,4112,100
+JOB_SHIRANUI,4112,100
+JOB_NIGHT_WATCH,4112,100
+JOB_HYPER_NOVICE,4112,100
+JOB_SPIRIT_HANDLER,4112,100
+
+JOB_SKY_EMPEROR2,4112,100

+ 203 - 17
db/re/mob_db.yml

@@ -36,6 +36,8 @@
 #   Attack2                 Maximum attack in pre-renewal and base magic attack in renewal. (Default: 0)
 #   Defense                 Physical defense of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
 #   MagicDefense            Magic defense of the monster, reduces magical skill damage. (Default: 0)
+#   Resistance              Physical resistance of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
+#   MagicResistance         Magic resistance of the monster, reduces magical skill damage. (Default: 0)
 #   Str                     Strength which affects attack. (Default: 1)
 #   Agi                     Agility which affects flee. (Default: 1)
 #   Vit                     Vitality which affects defense. (Default: 1)
@@ -75,7 +77,7 @@
 
 Header:
   Type: MOB_DB
-  Version: 2
+  Version: 3
 
 Body:
   - Id: 1001
@@ -88910,14 +88912,106 @@ Body:
 #    AegisName: 4JOB_R_FALCON
 #  - Id: 20833
 #    AegisName: 4JOB_WORG
-#  - Id: 20834
-#    AegisName: MEISTER_ABR1
-#  - Id: 20835
-#    AegisName: MEISTER_ABR2
-#  - Id: 20836
-#    AegisName: MEISTER_ABR3
-#  - Id: 20837
-#    AegisName: MEISTER_ABR4
+  - Id: 20834
+    AegisName: ABR_BATTLE_WARIOR
+    Name: ABR Battle Warrior
+    Level: 200
+    Hp: 20000
+    Defense: 200
+    MagicDefense: 40
+    Str: 10
+    Agi: 10
+    Vit: 10
+    Int: 10
+    Dex: 10
+    Luk: 10
+    AttackRange: 1
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Formless
+    Element: Neutral
+    ElementLevel: 1
+    WalkSpeed: 200
+    AttackDelay: 1000
+    AttackMotion: 500
+    DamageMotion: 300
+    Ai: 20
+  - Id: 20835
+    AegisName: ABR_DUAL_CANNON
+    Name: ABR Duel Cannon
+    Level: 200
+    Hp: 20000
+    Defense: 200
+    MagicDefense: 40
+    Str: 10
+    Agi: 10
+    Vit: 10
+    Int: 10
+    Dex: 10
+    Luk: 10
+    AttackRange: 6
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Formless
+    Element: Neutral
+    ElementLevel: 1
+    WalkSpeed: 200
+    AttackDelay: 1000
+    AttackMotion: 500
+    DamageMotion: 300
+    Ai: 20
+  - Id: 20836
+    AegisName: ABR_MOTHER_NET
+    Name: ABR Mother Net
+    Level: 200
+    Hp: 20000
+    Defense: 200
+    MagicDefense: 40
+    Str: 10
+    Agi: 10
+    Vit: 10
+    Int: 10
+    Dex: 10
+    Luk: 10
+    AttackRange: 6
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Formless
+    Element: Neutral
+    ElementLevel: 1
+    WalkSpeed: 200
+    AttackDelay: 1000
+    AttackMotion: 500
+    DamageMotion: 300
+    Ai: 20
+  - Id: 20837
+    AegisName: ABR_INFINITY
+    Name: ABR Infinity
+    Level: 200
+    Hp: 20000
+    Defense: 200
+    MagicDefense: 40
+    Str: 10
+    Agi: 10
+    Vit: 10
+    Int: 10
+    Dex: 10
+    Luk: 10
+    AttackRange: 6
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Large
+    Race: Formless
+    Element: Neutral
+    ElementLevel: 1
+    WalkSpeed: 200
+    AttackDelay: 1000
+    AttackMotion: 500
+    DamageMotion: 300
+    Ai: 20
 #  - Id: 20838
 #    AegisName: ELEMETAL_MASTER_S1
 #  - Id: 20839
@@ -88938,14 +89032,106 @@ Body:
 #    AegisName: MD_HIDDEN_GROUND01
 #  - Id: 20847
 #    AegisName: MD_HIDDEN_GROUND02
-#  - Id: 20848
-#    AegisName: SUMMON_WOODENWARRIOR
-#  - Id: 20849
-#    AegisName: SUMMON_WOODEN_FAIRY
-#  - Id: 20850
-#    AegisName: SUMMON_CREEPER
-#  - Id: 20851
-#    AegisName: SUMMON_HELLTREE
+  - Id: 20848
+    AegisName: SUMMON_WOODENWARRIOR
+    Name: Wooden Warrior
+    Level: 200
+    Hp: 20000
+    Defense: 200
+    MagicDefense: 40
+    Str: 10
+    Agi: 10
+    Vit: 10
+    Int: 10
+    Dex: 10
+    Luk: 10
+    AttackRange: 3
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Plant
+    Element: Earth
+    ElementLevel: 1
+    WalkSpeed: 200
+    AttackDelay: 1000
+    AttackMotion: 500
+    DamageMotion: 300
+    Ai: 20
+  - Id: 20849
+    AegisName: SUMMON_WOODEN_FAIRY
+    Name: Wooden Fairy
+    Level: 200
+    Hp: 20000
+    Defense: 200
+    MagicDefense: 40
+    Str: 10
+    Agi: 10
+    Vit: 10
+    Int: 10
+    Dex: 10
+    Luk: 10
+    AttackRange: 5
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Plant
+    Element: Earth
+    ElementLevel: 1
+    WalkSpeed: 200
+    AttackDelay: 1000
+    AttackMotion: 500
+    DamageMotion: 300
+    Ai: 20
+  - Id: 20850
+    AegisName: SUMMON_CREEPER
+    Name: Creeper
+    Level: 200
+    Hp: 20000
+    Defense: 200
+    MagicDefense: 40
+    Str: 10
+    Agi: 10
+    Vit: 10
+    Int: 10
+    Dex: 10
+    Luk: 10
+    AttackRange: 5
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Plant
+    Element: Earth
+    ElementLevel: 1
+    WalkSpeed: 200
+    AttackDelay: 1000
+    AttackMotion: 500
+    DamageMotion: 300
+    Ai: 20
+  - Id: 20851
+    AegisName: SUMMON_HELLTREE
+    Name: Hell Tree
+    Level: 200
+    Hp: 20000
+    Defense: 200
+    MagicDefense: 40
+    Str: 10
+    Agi: 10
+    Vit: 10
+    Int: 10
+    Dex: 10
+    Luk: 10
+    AttackRange: 5
+    SkillRange: 10
+    ChaseRange: 12
+    Size: Medium
+    Race: Plant
+    Element: Earth
+    ElementLevel: 1
+    WalkSpeed: 200
+    AttackDelay: 1000
+    AttackMotion: 500
+    DamageMotion: 300
+    Ai: 20
 #  - Id: 20856
 #    AegisName: MD_N_ARENA_1
 #  - Id: 20857

+ 14 - 0
db/re/mob_skill_db.txt

@@ -12192,3 +12192,17 @@
 3633,EP16_2_VENOM_KIMERA@NPC_WIDESIGHT,attack,669,1,10000,0,30000,yes,self,always,0,,,,,,,
 3633,EP16_2_VENOM_KIMERA@NPC_ACIDBREATH,attack,657,6,10000,3000,25000,no,target,always,0,,,,,,,
 3633,EP16_2_VENOM_KIMERA@RG_STRIPARMOR,attack,217,5,500,1000,5000,no,target,always,0,,,,,,,
+
+// Meister ABR's (Automated Battle Robot)
+20834,ABR_BATTLE_WARIOR@ABR_BATTLE_BUSTER,chase,8601,1,10000,500,5000,yes,target,always,0,,,,,,,
+20834,ABR_BATTLE_WARIOR@ABR_BATTLE_BUSTER,attack,8601,1,10000,500,5000,yes,target,always,0,,,,,,,
+20835,ABR_DUAL_CANNON@ABR_DUAL_CANNON_FIRE,chase,8602,1,10000,500,5000,yes,target,always,0,,,,,,,
+20835,ABR_DUAL_CANNON@ABR_DUAL_CANNON_FIRE,attack,8602,1,10000,500,5000,yes,target,always,0,,,,,,,
+20836,ABR_MOTHER_NET@ABR_NET_REPAIR,idle,8603,1,10000,500,5000,yes,self,always,0,,,,,,,
+20836,ABR_MOTHER_NET@ABR_NET_REPAIR,chase,8603,1,10000,500,5000,yes,self,always,0,,,,,,,
+20836,ABR_MOTHER_NET@ABR_NET_REPAIR,attack,8603,1,10000,500,5000,yes,self,always,0,,,,,,,
+20836,ABR_MOTHER_NET@ABR_NET_SUPPORT,idle,8604,1,10000,500,5000,yes,self,always,0,,,,,,,
+20836,ABR_MOTHER_NET@ABR_NET_SUPPORT,chase,8604,1,10000,500,5000,yes,self,always,0,,,,,,,
+20836,ABR_MOTHER_NET@ABR_NET_SUPPORT,attack,8604,1,10000,500,5000,yes,self,always,0,,,,,,,
+20837,ABR_INFINITY@ABR_INFINITY_BUSTER,chase,8605,1,10000,500,5000,yes,target,always,0,,,,,,,
+20837,ABR_INFINITY@ABR_INFINITY_BUSTER,attack,8605,1,10000,500,5000,yes,target,always,0,,,,,,,

+ 38 - 0
db/re/produce_db.txt

@@ -694,3 +694,41 @@
 280,533,30,0,0,11058,0,514,1,519,1
 // Unripe Apple (619) <-- 10 Sticky Mucus, 20 Green Herbs, 10 Apples
 281,619,30,0,0,11058,0,938,10,511,20,512,10
+
+//===== Manufacture Machine === ItemLV=31 ======
+// Device Capsule (1000289) <-- MT_M_MACHINE Lvl, Device Creation Guide, 5 Mini Furnace, 5 Oridecon Hammer, 50 Magic Gear Fuel
+282,1000289,31,5297,1,1000352,0,612,5,615,5,6146,50
+// Auto Battle Capsule (1000290) <-- MT_M_MACHINE Lvl, Device Creation Guide, 5 Mini Furnace, 5 Oridecon Hammer, 75 Magic Gear Fuel
+283,1000290,31,5297,1,1000352,0,612,5,615,5,6146,75
+//==============================================
+
+//===== Bionic Pharmacy === ItemLV=32 ==========
+// Flame Acid Bottle (1000276) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 5 Fire Bottle, 5 Acid Bottle, 2 Bloody Red
+284,1000276,32,5336,1,1000275,1,7135,5,7136,5,990,2
+// Earth Acid Bottle (1000277) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 5 Fire Bottle, 5 Acid Bottle, 2 Yellow Live
+285,1000277,32,5336,1,1000275,1,7135,5,7136,5,993,2
+// Gale Acid Bottle (1000278) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 5 Fire Bottle, 5 Acid Bottle, 2 Wind of Verdure
+286,1000278,32,5336,1,1000275,1,7135,5,7136,5,992,2
+// Icicle Acid Bottle (1000279) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 5 Fire Bottle, 5 Acid Bottle, 2 Crystal Blue
+287,1000279,32,5336,1,1000275,1,7135,5,7136,5,991,2
+// High Coating Bottle (1000280) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 5 Empty Bottle, 10 Coating Bottle
+288,1000280,32,5336,1,1000275,1,713,5,7139,10
+// High Plant Bottle (1000281) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 2 Seed Of Thorny Plant, 2 Bloodsuck Plant Seed, 5 Mandragora Flowerpot, 10 Plant Bottle
+289,1000281,32,5336,1,1000275,1,6210,2,6211,2,6217,5,7137,10
+// Eye Cleaner (100516) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 3 White Herb, 3 Green Herb
+290,100516,32,5336,1,1000275,1,713,10,523,5,509,3,511,3
+// Ear Cleaner (100517) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 2 Blue Herb, 3 Green Herb
+291,100517,32,5336,1,1000275,1,713,10,523,5,510,2,511,3
+// Tonics (100518) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 2 Yggdrasilberry, 3 Royal Jelly
+292,100518,32,5336,1,1000275,1,713,10,523,5,607,2,526,3
+// Mini Extinguisher (100519) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 5 Crystal Blue, 3 Iron
+293,100519,32,5336,1,1000275,1,713,10,523,5,991,5,998,3
+// Water Of Lucky (100520) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 10 Clover, 3 Green Herb
+294,100520,32,5336,1,1000275,1,713,10,523,5,705,10,511,3
+// Strong Antidote (100521) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 3 Poison Bottle, 10 Green Herb
+295,100521,32,5336,1,1000275,1,713,10,523,5,678,3,511,10
+// High Energy Chocolate (100522) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 3 Cacao, 3 Royal Jelly, 5 Yggdrasil Seed
+296,100522,32,5336,1,1000275,1,713,10,7182,3,526,3,608,5
+// Refined Holy Water (100523) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 10 Holy Water, 3 Royal Jelly
+297,100523,32,5336,1,1000275,1,713,10,523,10,526,3
+//==============================================

文件差異過大導致無法顯示
+ 6309 - 173
db/re/skill_db.yml


+ 3 - 0
db/re/skill_nocast_db.txt

@@ -41,6 +41,9 @@
 2433,1	//WM_BEYOND_OF_WARCRY
 2455,1	//SO_ARRULLO
 2299,1	//SC_MANHOLE
+5359,1	//TR_ROKI_CAPRICCIO
+5363,1	//TR_NIPELHEIM_REQUIEM
+5367,1	//EM_ACTIVITY_BURN
 
 //----------------------------------------------------------------------------
 // PVP

+ 1187 - 0
db/re/skill_tree.yml

@@ -6643,3 +6643,1190 @@ Body:
       Taekwon: true
       Star_Gladiator: true
       Star_Emperor: true
+  - Job: Dragon_Knight
+    Inherit:
+      Novice: true
+      Swordman: true
+      Knight: true
+      Lord_Knight: true
+      Rune_Knight: true
+      Rune_Knight_T: true
+    Tree:
+      - Name: DK_SERVANTWEAPON
+        MaxLevel: 5
+      - Name: DK_SERVANT_W_SIGN
+        MaxLevel: 5
+        Requires:
+          - Name: DK_SERVANTWEAPON
+            Level: 3
+      - Name: DK_SERVANT_W_PHANTOM
+        MaxLevel: 5
+        Requires:
+          - Name: DK_SERVANTWEAPON
+            Level: 5
+          - Name: DK_SERVANT_W_SIGN
+            Level: 5
+      - Name: DK_SERVANT_W_DEMOL
+        MaxLevel: 5
+        Requires:
+          - Name: DK_SERVANT_W_PHANTOM
+            Level: 5
+      - Name: DK_CHARGINGPIERCE
+        MaxLevel: 10
+        Requires:
+          - Name: RK_HUNDREDSPEAR
+            Level: 5
+      - Name: DK_TWOHANDDEF
+        MaxLevel: 10
+      - Name: DK_HACKANDSLASHER
+        MaxLevel: 10
+        Requires:
+          - Name: DK_TWOHANDDEF
+            Level: 5
+      - Name: DK_DRAGONIC_AURA
+        MaxLevel: 10
+        Requires:
+          - Name: DK_CHARGINGPIERCE
+            Level: 10
+          - Name: RK_DRAGONBREATH
+            Level: 10
+          - Name: RK_DRAGONBREATH_WATER
+            Level: 10
+      - Name: DK_MADNESS_CRUSHER
+        MaxLevel: 5
+        Requires:
+          - Name: DK_CHARGINGPIERCE
+            Level: 5
+          - Name: DK_HACKANDSLASHER
+            Level: 10
+      - Name: DK_VIGOR
+        MaxLevel: 10
+        Requires:
+          - Name: DK_SERVANT_W_DEMOL
+            Level: 3
+          - Name: DK_STORMSLASH
+            Level: 5
+      - Name: DK_STORMSLASH
+        MaxLevel: 5
+        Requires:
+          - Name: DK_HACKANDSLASHER
+            Level: 5
+          - Name: DK_TWOHANDDEF
+            Level: 10
+  - Job: Meister
+    Inherit:
+      Novice: true
+      Merchant: true
+      Blacksmith: true
+      Whitesmith: true
+      Mechanic: true
+      Mechanic_T: true
+    Tree:
+      - Name: MT_AXE_STOMP
+        MaxLevel: 5
+        Requires:
+          - Name: MT_TWOAXEDEF
+            Level: 5
+      - Name: MT_RUSH_QUAKE
+        MaxLevel: 10
+        Requires:
+          - Name: MT_AXE_STOMP
+            Level: 5
+      - Name: MT_M_MACHINE
+        MaxLevel: 5
+      - Name: MT_A_MACHINE
+        MaxLevel: 5
+        Requires:
+          - Name: MT_AXE_STOMP
+            Level: 3
+          - Name: MT_M_MACHINE
+            Level: 3
+      - Name: MT_D_MACHINE
+        MaxLevel: 5
+        Requires:
+          - Name: MT_M_MACHINE
+            Level: 1
+      - Name: MT_TWOAXEDEF
+        MaxLevel: 10
+      - Name: MT_ABR_M
+        MaxLevel: 10
+        Requires:
+          - Name: MT_M_MACHINE
+            Level: 1
+      - Name: MT_SUMMON_ABR_BATTLE_WARIOR
+        MaxLevel: 4
+        Requires:
+          - Name: MT_ABR_M
+            Level: 1
+      - Name: MT_SUMMON_ABR_DUAL_CANNON
+        MaxLevel: 4
+        Requires:
+          - Name: MT_ABR_M
+            Level: 3
+          - Name: MT_SUMMON_ABR_BATTLE_WARIOR
+            Level: 2
+      - Name: MT_SUMMON_ABR_MOTHER_NET
+        MaxLevel: 4
+        Requires:
+          - Name: MT_ABR_M
+            Level: 5
+          - Name: MT_SUMMON_ABR_BATTLE_WARIOR
+            Level: 3
+          - Name: MT_SUMMON_ABR_DUAL_CANNON
+            Level: 3
+      - Name: MT_SUMMON_ABR_INFINITY
+        MaxLevel: 4
+        Requires:
+          - Name: MT_ABR_M
+            Level: 10
+          - Name: MT_SUMMON_ABR_BATTLE_WARIOR
+            Level: 4
+          - Name: MT_SUMMON_ABR_DUAL_CANNON
+            Level: 4
+          - Name: MT_SUMMON_ABR_MOTHER_NET
+            Level: 4
+  - Job: Shadow_Cross
+    Inherit:
+      Novice: true
+      Thief: true
+      Assassin: true
+      Assassin_Cross: true
+      Guillotine_Cross: true
+      Guillotine_Cross_T: true
+    Tree:
+      - Name: SHC_SHADOW_EXCEED
+        MaxLevel: 10
+        Requires:
+          - Name: SHC_ENCHANTING_SHADOW
+            Level: 5
+          - Name: SHC_POTENT_VENOM
+            Level: 3
+          - Name: SHC_SHADOW_SENSE
+            Level: 7
+      - Name: SHC_DANCING_KNIFE
+        MaxLevel: 5
+        Requires:
+          - Name: SHC_SHADOW_SENSE
+            Level: 3
+      - Name: SHC_SAVAGE_IMPACT
+        MaxLevel: 10
+        Requires:
+          - Name: GC_CROSSIMPACT
+            Level: 5
+          - Name: SHC_SHADOW_SENSE
+            Level: 3
+      - Name: SHC_SHADOW_SENSE
+        MaxLevel: 10
+      - Name: SHC_ETERNAL_SLASH
+        MaxLevel: 5
+        Requires:
+          - Name: GC_WEAPONBLOCKING
+            Level: 3
+          - Name: SHC_DANCING_KNIFE
+            Level: 3
+          - Name: SHC_SHADOW_SENSE
+            Level: 5
+      - Name: SHC_POTENT_VENOM
+        MaxLevel: 10
+        Requires:
+          - Name: SHC_ENCHANTING_SHADOW
+            Level: 3
+          - Name: SHC_SHADOW_SENSE
+            Level: 5
+      - Name: SHC_SHADOW_STAB
+        MaxLevel: 5
+        Requires:
+          - Name: GC_CLOAKINGEXCEED
+            Level: 5
+          - Name: SHC_DANCING_KNIFE
+            Level: 5
+          - Name: SHC_ETERNAL_SLASH
+            Level: 3
+          - Name: SHC_SHADOW_SENSE
+            Level: 5
+      - Name: SHC_IMPACT_CRATER
+        MaxLevel: 5
+        Requires:
+          - Name: GC_ROLLINGCUTTER
+            Level: 5
+          - Name: GC_WEAPONBLOCKING
+            Level: 3
+          - Name: SHC_SAVAGE_IMPACT
+            Level: 5
+          - Name: SHC_SHADOW_SENSE
+            Level: 5
+      - Name: SHC_ENCHANTING_SHADOW
+        MaxLevel: 5
+        Requires:
+          - Name: GC_POISONINGWEAPON
+            Level: 5
+          - Name: SHC_SHADOW_SENSE
+            Level: 3
+      - Name: SHC_FATAL_SHADOW_CROW
+        MaxLevel: 10
+        Requires:
+          - Name: SHC_IMPACT_CRATER
+            Level: 5
+          - Name: SHC_SHADOW_STAB
+            Level: 5
+  - Job: Arch_Mage
+    Inherit:
+      Novice: true
+      Mage: true
+      Wizard: true
+      High_Wizard: true
+      Warlock: true
+      Warlock_T: true
+    Tree:
+      - Name: AG_DEADLY_PROJECTION
+        MaxLevel: 5
+        Requires:
+          - Name: AG_MYSTERY_ILLUSION
+            Level: 3
+      - Name: AG_DESTRUCTIVE_HURRICANE
+        MaxLevel: 5
+        Requires:
+          - Name: AG_TORNADO_STORM
+            Level: 3
+      - Name: AG_RAIN_OF_CRYSTAL
+        MaxLevel: 5
+        Requires:
+          - Name: WL_FROSTMISTY
+            Level: 3
+      - Name: AG_MYSTERY_ILLUSION
+        MaxLevel: 5
+        Requires:
+          - Name: AG_SOUL_VC_STRIKE
+            Level: 3
+          - Name: WL_HELLINFERNO
+            Level: 3
+      - Name: AG_VIOLENT_QUAKE
+        MaxLevel: 5
+        Requires:
+          - Name: AG_STRANTUM_TREMOR
+            Level: 3
+      - Name: AG_SOUL_VC_STRIKE
+        MaxLevel: 5
+        Requires:
+          - Name: AG_TWOHANDSTAFF
+            Level: 3
+          - Name: WL_SOULEXPANSION
+            Level: 5
+      - Name: AG_STRANTUM_TREMOR
+        MaxLevel: 5
+        Requires:
+          - Name: WL_SIENNAEXECRATE
+            Level: 3
+      - Name: AG_ALL_BLOOM
+        MaxLevel: 5
+        Requires:
+          - Name: AG_FLORAL_FLARE_ROAD
+            Level: 3
+      - Name: AG_CRYSTAL_IMPACT
+        MaxLevel: 5
+        Requires:
+          - Name: AG_RAIN_OF_CRYSTAL
+            Level: 3
+      - Name: AG_TORNADO_STORM
+        MaxLevel: 5
+        Requires:
+          - Name: WL_CHAINLIGHTNING
+            Level: 3
+      - Name: AG_TWOHANDSTAFF
+        MaxLevel: 10
+      - Name: AG_FLORAL_FLARE_ROAD
+        MaxLevel: 5
+        Requires:
+          - Name: WL_CRIMSONROCK
+            Level: 3
+      - Name: AG_ASTRAL_STRIKE
+        MaxLevel: 10
+        Requires:
+          - Name: AG_DEADLY_PROJECTION
+            Level: 3
+          - Name: AG_MYSTERY_ILLUSION
+            Level: 3
+          - Name: WL_COMET
+            Level: 5
+      - Name: AG_CLIMAX
+        MaxLevel: 5
+        Requires:
+          - Name: AG_TWOHANDSTAFF
+            Level: 3
+          - Name: WL_TETRAVORTEX
+            Level: 5
+      - Name: AG_ROCK_DOWN
+        MaxLevel: 5
+        Requires:
+          - Name: AG_STRANTUM_TREMOR
+            Level: 1
+      - Name: AG_STORM_CANNON
+        MaxLevel: 5
+        Requires:
+          - Name: AG_TORNADO_STORM
+            Level: 1
+      - Name: AG_CRIMSON_ARROW
+        MaxLevel: 5
+        Requires:
+          - Name: AG_FLORAL_FLARE_ROAD
+            Level: 1
+      - Name: AG_FROZEN_SLASH
+        MaxLevel: 5
+        Requires:
+          - Name: AG_RAIN_OF_CRYSTAL
+            Level: 1
+  - Job: Cardinal
+    Inherit:
+      Novice: true
+      Acolyte: true
+      Priest: true
+      High_Priest: true
+      Arch_Bishop: true
+      Arch_Bishop_T: true
+    Tree:
+      - Name: CD_REPARATIO
+        MaxLevel: 5
+        Requires:
+          - Name: CD_MEDIALE_VOTUM
+            Level: 3
+      - Name: CD_MEDIALE_VOTUM
+        MaxLevel: 5
+        Requires:
+          - Name: CD_DILECTIO_HEAL
+            Level: 3
+      - Name: CD_MACE_BOOK_M
+        MaxLevel: 10
+      - Name: CD_ARGUTUS_VITA
+        MaxLevel: 5
+        Requires:
+          - Name: CD_MEDIALE_VOTUM
+            Level: 3
+          - Name: CD_REPARATIO
+            Level: 3
+      - Name: CD_ARGUTUS_TELUM
+        MaxLevel: 5
+        Requires:
+          - Name: CD_MEDIALE_VOTUM
+            Level: 3
+          - Name: CD_REPARATIO
+            Level: 3
+      - Name: CD_ARBITRIUM
+        MaxLevel: 10
+        Requires:
+          - Name: AB_ADORAMUS
+            Level: 5
+          - Name: CD_FRAMEN
+            Level: 3
+      - Name: CD_PRESENS_ACIES
+        MaxLevel: 5
+        Requires:
+          - Name: CD_MEDIALE_VOTUM
+            Level: 3
+          - Name: CD_REPARATIO
+            Level: 3
+      - Name: CD_FIDUS_ANIMUS
+        MaxLevel: 10
+      - Name: CD_EFFLIGO
+        MaxLevel: 10
+        Requires:
+          - Name: AB_ORATIO
+            Level: 5
+          - Name: CD_PETITIO
+            Level: 10
+      - Name: CD_COMPETENTIA
+        MaxLevel: 5
+        Requires:
+          - Name: CD_ARGUTUS_TELUM
+            Level: 2
+          - Name: CD_ARGUTUS_VITA
+            Level: 2
+          - Name: CD_PRESENS_ACIES
+            Level: 2
+      - Name: CD_PNEUMATICUS_PROCELLA
+        MaxLevel: 10
+        Requires:
+          - Name: CD_ARBITRIUM
+            Level: 10
+          - Name: CD_FRAMEN
+            Level: 5
+      - Name: CD_DILECTIO_HEAL
+        MaxLevel: 5
+        Requires:
+          - Name: AB_CHEAL
+            Level: 3
+          - Name: AB_HIGHNESSHEAL
+            Level: 3
+      - Name: CD_RELIGIO
+        MaxLevel: 5
+        Requires:
+          - Name: AB_CLEMENTIA
+            Level: 3
+          - Name: CD_DILECTIO_HEAL
+            Level: 2
+      - Name: CD_BENEDICTUM
+        MaxLevel: 5
+        Requires:
+          - Name: AB_CANTO
+            Level: 3
+          - Name: CD_DILECTIO_HEAL
+            Level: 2
+      - Name: CD_PETITIO
+        MaxLevel: 10
+        Requires:
+          - Name: AB_DUPLELIGHT
+            Level: 10
+          - Name: CD_MACE_BOOK_M
+            Level: 5
+      - Name: CD_FRAMEN
+        MaxLevel: 5
+        Requires:
+          - Name: AB_JUDEX
+            Level: 10
+          - Name: CD_FIDUS_ANIMUS
+            Level: 5
+  - Job: Windhawk
+    Inherit:
+      Novice: true
+      Archer: true
+      Hunter: true
+      Sniper: true
+      Ranger: true
+      Ranger_T: true
+    Tree:
+      - Name: WH_ADVANCED_TRAP
+        MaxLevel: 5
+        Requires:
+          - Name: RA_RESEARCHTRAP
+            Level: 3
+      - Name: WH_WIND_SIGN
+        MaxLevel: 5
+        Requires:
+          - Name: WH_NATUREFRIENDLY
+            Level: 5
+      - Name: WH_NATUREFRIENDLY
+        MaxLevel: 5
+      - Name: WH_HAWKRUSH
+        MaxLevel: 5
+        Requires:
+          - Name: WH_HAWK_M
+            Level: 1
+      - Name: WH_HAWK_M
+        MaxLevel: 1
+        Requires:
+          - Name: HT_STEELCROW
+            Level: 1
+      - Name: WH_CALAMITYGALE
+        MaxLevel: 1
+        Requires:
+          - Name: WH_GALESTORM
+            Level: 5
+          - Name: WH_WIND_SIGN
+            Level: 5
+      - Name: WH_HAWKBOOMERANG
+        MaxLevel: 5
+        Requires:
+          - Name: WH_HAWKRUSH
+            Level: 5
+      - Name: WH_GALESTORM
+        MaxLevel: 10
+        Requires:
+          - Name: WH_CRESCIVE_BOLT
+            Level: 3
+      - Name: WH_DEEPBLINDTRAP
+        MaxLevel: 5
+        Requires:
+          - Name: WH_ADVANCED_TRAP
+            Level: 3
+      - Name: WH_SOLIDTRAP
+        MaxLevel: 5
+        Requires:
+          - Name: WH_ADVANCED_TRAP
+            Level: 3
+      - Name: WH_SWIFTTRAP
+        MaxLevel: 5
+        Requires:
+          - Name: WH_DEEPBLINDTRAP
+            Level: 1
+      - Name: WH_CRESCIVE_BOLT
+        MaxLevel: 10
+        Requires:
+          - Name: RA_AIMEDBOLT
+            Level: 5
+      - Name: WH_FLAMETRAP
+        MaxLevel: 5
+        Requires:
+          - Name: WH_SOLIDTRAP
+            Level: 1
+  - Job: Imperial_Guard
+    Inherit:
+      Novice: true
+      Swordman: true
+      Crusader: true
+      Paladin: true
+      Royal_Guard: true
+      Royal_Guard_T: true
+    Tree:
+      - Name: IG_GUARD_STANCE
+        MaxLevel: 5
+        Requires:
+          - Name: IG_SHIELD_MASTERY
+            Level: 3
+      - Name: IG_GUARDIAN_SHIELD
+        MaxLevel: 5
+        Requires:
+          - Name: IG_GUARD_STANCE
+            Level: 2
+      - Name: IG_REBOUND_SHIELD
+        MaxLevel: 5
+        Requires:
+          - Name: IG_GUARD_STANCE
+            Level: 4
+      - Name: IG_SHIELD_MASTERY
+        MaxLevel: 10
+      - Name: IG_SPEAR_SWORD_M
+        MaxLevel: 10
+      - Name: IG_ATTACK_STANCE
+        MaxLevel: 5
+        Requires:
+          - Name: IG_SPEAR_SWORD_M
+            Level: 3
+      - Name: IG_ULTIMATE_SACRIFICE
+        MaxLevel: 5
+        Requires:
+          - Name: IG_GUARDIAN_SHIELD
+            Level: 3
+          - Name: IG_REBOUND_SHIELD
+            Level: 3
+      - Name: IG_HOLY_SHIELD
+        MaxLevel: 5
+        Requires:
+          - Name: IG_CROSS_RAIN
+            Level: 3
+          - Name: IG_SHIELD_MASTERY
+            Level: 5
+      - Name: IG_GRAND_JUDGEMENT
+        MaxLevel: 10
+        Requires:
+          - Name: IG_OVERSLASH
+            Level: 5
+          - Name: IG_SPEAR_SWORD_M
+            Level: 5
+      - Name: IG_JUDGEMENT_CROSS
+        MaxLevel: 10
+        Requires:
+          - Name: IG_CROSS_RAIN
+            Level: 5
+          - Name: IG_HOLY_SHIELD
+            Level: 3
+      - Name: IG_SHIELD_SHOOTING
+        MaxLevel: 5
+        Requires:
+          - Name: IG_ATTACK_STANCE
+            Level: 2
+          - Name: IG_SHIELD_MASTERY
+            Level: 5
+      - Name: IG_OVERSLASH
+        MaxLevel: 10
+        Requires:
+          - Name: IG_ATTACK_STANCE
+            Level: 3
+      - Name: IG_CROSS_RAIN
+        MaxLevel: 10
+        Requires:
+          - Name: IG_SHIELD_MASTERY
+            Level: 1
+  - Job: Biolo
+    Inherit:
+      Novice: true
+      Merchant: true
+      Alchemist: true
+      Creator: true
+      Genetic: true
+      Genetic_T: true
+    Tree:
+      - Name: BO_BIONIC_PHARMACY
+        MaxLevel: 5
+        Requires:
+          - Name: GN_S_PHARMACY
+            Level: 5
+      - Name: BO_BIONICS_M
+        MaxLevel: 10
+      - Name: BO_THE_WHOLE_PROTECTION
+        MaxLevel: 5
+        Requires:
+          - Name: BO_BIONIC_PHARMACY
+            Level: 5
+      - Name: BO_ADVANCE_PROTECTION
+        MaxLevel: 4
+        Requires:
+          - Name: BO_BIONIC_PHARMACY
+            Level: 5
+      - Name: BO_ACIDIFIED_ZONE_WATER
+        MaxLevel: 5
+        Requires:
+          - Name: BO_ACIDIFIED_ZONE_WIND
+            Level: 1
+      - Name: BO_ACIDIFIED_ZONE_GROUND
+        MaxLevel: 5
+        Requires:
+          - Name: BO_BIONICS_M
+            Level: 3
+          - Name: BO_BIONIC_PHARMACY
+            Level: 5
+      - Name: BO_ACIDIFIED_ZONE_WIND
+        MaxLevel: 5
+        Requires:
+          - Name: BO_BIONICS_M
+            Level: 3
+          - Name: BO_BIONIC_PHARMACY
+            Level: 5
+      - Name: BO_ACIDIFIED_ZONE_FIRE
+        MaxLevel: 5
+        Requires:
+          - Name: BO_ACIDIFIED_ZONE_GROUND
+            Level: 1
+      - Name: BO_WOODENWARRIOR
+        MaxLevel: 5
+        Requires:
+          - Name: BO_CREEPER
+            Level: 3
+      - Name: BO_WOODEN_FAIRY
+        MaxLevel: 5
+        Requires:
+          - Name: BO_CREEPER
+            Level: 3
+      - Name: BO_CREEPER
+        MaxLevel: 5
+        Requires:
+          - Name: BO_BIONICS_M
+            Level: 5
+      - Name: BO_RESEARCHREPORT
+        MaxLevel: 1
+        Requires:
+          - Name: BO_ACIDIFIED_ZONE_FIRE
+            Level: 3
+          - Name: BO_ACIDIFIED_ZONE_WATER
+            Level: 3
+      - Name: BO_HELLTREE
+        MaxLevel: 5
+        Requires:
+          - Name: BO_WOODENWARRIOR
+            Level: 3
+          - Name: BO_WOODEN_FAIRY
+            Level: 3
+  - Job: Abyss_Chaser
+    Inherit:
+      Novice: true
+      Thief: true
+      Rogue: true
+      Stalker: true
+      Shadow_Chaser: true
+      Shadow_Chaser_T: true
+    Tree:
+      - Name: ABC_DAGGER_AND_BOW_M
+        MaxLevel: 10
+      - Name: ABC_MAGIC_SWORD_M
+        MaxLevel: 10
+        Requires:
+          - Name: SC_AUTOSHADOWSPELL
+            Level: 5
+          - Name: SC_REPRODUCE
+            Level: 5
+      - Name: ABC_STRIP_SHADOW
+        MaxLevel: 5
+        Requires:
+          - Name: ABC_DAGGER_AND_BOW_M
+            Level: 7
+          - Name: SC_STRIPACCESSARY
+            Level: 1
+      - Name: ABC_ABYSS_DAGGER
+        MaxLevel: 5
+        Requires:
+          - Name: ABC_DAGGER_AND_BOW_M
+            Level: 3
+          - Name: SC_FATALMENACE
+            Level: 5
+      - Name: ABC_UNLUCKY_RUSH
+        MaxLevel: 5
+        Requires:
+          - Name: ABC_ABYSS_DAGGER
+            Level: 3
+          - Name: ABC_DAGGER_AND_BOW_M
+            Level: 4
+      - Name: ABC_CHAIN_REACTION_SHOT
+        MaxLevel: 5
+        Requires:
+          - Name: ABC_DAGGER_AND_BOW_M
+            Level: 3
+          - Name: SC_TRIANGLESHOT
+            Level: 5
+      - Name: ABC_FROM_THE_ABYSS
+        MaxLevel: 5
+        Requires:
+          - Name: ABC_MAGIC_SWORD_M
+            Level: 3
+      - Name: ABC_ABYSS_SLAYER
+        MaxLevel: 10
+        Requires:
+          - Name: ABC_ABYSS_DAGGER
+            Level: 5
+          - Name: ABC_DEFT_STAB
+            Level: 5
+      - Name: ABC_ABYSS_STRIKE
+        MaxLevel: 10
+        Requires:
+          - Name: ABC_ABYSS_SQUARE
+            Level: 3
+          - Name: ABC_FROM_THE_ABYSS
+            Level: 3
+      - Name: ABC_DEFT_STAB
+        MaxLevel: 10
+        Requires:
+          - Name: ABC_ABYSS_DAGGER
+            Level: 3
+          - Name: ABC_DAGGER_AND_BOW_M
+            Level: 5
+      - Name: ABC_ABYSS_SQUARE
+        MaxLevel: 5
+        Requires:
+          - Name: ABC_FROM_THE_ABYSS
+            Level: 1
+          - Name: ABC_MAGIC_SWORD_M
+            Level: 5
+      - Name: ABC_FRENZY_SHOT
+        MaxLevel: 10
+        Requires:
+          - Name: ABC_CHAIN_REACTION_SHOT
+            Level: 3
+          - Name: ABC_DAGGER_AND_BOW_M
+            Level: 5
+  - Job: Elemental_Master
+    Inherit:
+      Novice: true
+      Mage: true
+      Sage: true
+      Professor: true
+      Sorcerer: true
+      Sorcerer_T: true
+    Tree:
+      - Name: EM_MAGIC_BOOK_M
+        MaxLevel: 10
+      - Name: EM_SPELL_ENCHANTING
+        MaxLevel: 5
+        Requires:
+          - Name: EM_MAGIC_BOOK_M
+            Level: 5
+      - Name: EM_ACTIVITY_BURN
+        MaxLevel: 5
+        Requires:
+          - Name: EM_SPELL_ENCHANTING
+            Level: 3
+      - Name: EM_INCREASING_ACTIVITY
+        MaxLevel: 5
+        Requires:
+          - Name: EM_ACTIVITY_BURN
+            Level: 5
+      - Name: EM_DIAMOND_STORM
+        MaxLevel: 5
+        Requires:
+          - Name: EM_MAGIC_BOOK_M
+            Level: 2
+      - Name: EM_LIGHTNING_LAND
+        MaxLevel: 5
+        Requires:
+          - Name: EM_MAGIC_BOOK_M
+            Level: 2
+      - Name: EM_VENOM_SWAMP
+        MaxLevel: 5
+        Requires:
+          - Name: EM_MAGIC_BOOK_M
+            Level: 2
+      - Name: EM_CONFLAGRATION
+        MaxLevel: 5
+        Requires:
+          - Name: EM_MAGIC_BOOK_M
+            Level: 2
+      - Name: EM_TERRA_DRIVE
+        MaxLevel: 5
+        Requires:
+          - Name: EM_MAGIC_BOOK_M
+            Level: 2
+      - Name: EM_ELEMENTAL_SPIRIT_M
+        MaxLevel: 10
+        Requires:
+          - Name: SO_EL_SYMPATHY
+            Level: 1
+      - Name: EM_SUMMON_ELEMENTAL_ARDOR
+        MaxLevel: 1
+        Requires:
+          - Name: EM_CONFLAGRATION
+            Level: 1
+          - Name: EM_ELEMENTAL_SPIRIT_M
+            Level: 1
+          - Name: SO_SUMMON_AGNI
+            Level: 3
+      - Name: EM_SUMMON_ELEMENTAL_DILUVIO
+        MaxLevel: 1
+        Requires:
+          - Name: EM_DIAMOND_STORM
+            Level: 1
+          - Name: EM_ELEMENTAL_SPIRIT_M
+            Level: 1
+          - Name: SO_SUMMON_AQUA
+            Level: 3
+      - Name: EM_SUMMON_ELEMENTAL_PROCELLA
+        MaxLevel: 1
+        Requires:
+          - Name: EM_ELEMENTAL_SPIRIT_M
+            Level: 1
+          - Name: EM_LIGHTNING_LAND
+            Level: 1
+          - Name: SO_SUMMON_VENTUS
+            Level: 3
+      - Name: EM_SUMMON_ELEMENTAL_TERREMOTUS
+        MaxLevel: 1
+        Requires:
+          - Name: EM_ELEMENTAL_SPIRIT_M
+            Level: 1
+          - Name: EM_TERRA_DRIVE
+            Level: 1
+          - Name: SO_SUMMON_TERA
+            Level: 3
+      - Name: EM_SUMMON_ELEMENTAL_SERPENS
+        MaxLevel: 1
+        Requires:
+          - Name: EM_ELEMENTAL_SPIRIT_M
+            Level: 1
+          - Name: EM_VENOM_SWAMP
+            Level: 1
+          - Name: SO_SUMMON_AGNI
+            Level: 3
+          - Name: SO_SUMMON_AQUA
+            Level: 3
+          - Name: SO_SUMMON_TERA
+            Level: 3
+          - Name: SO_SUMMON_VENTUS
+            Level: 3
+      - Name: EM_ELEMENTAL_BUSTER
+        MaxLevel: 10
+        Requires:
+          - Name: EM_ELEMENTAL_SPIRIT_M
+            Level: 5
+          - Name: EM_SUMMON_ELEMENTAL_ARDOR
+            Level: 1
+          - Name: EM_SUMMON_ELEMENTAL_DILUVIO
+            Level: 1
+          - Name: EM_SUMMON_ELEMENTAL_PROCELLA
+            Level: 1
+          - Name: EM_SUMMON_ELEMENTAL_SERPENS
+            Level: 1
+          - Name: EM_SUMMON_ELEMENTAL_TERREMOTUS
+            Level: 1
+      - Name: EM_ELEMENTAL_VEIL
+        MaxLevel: 5
+        Requires:
+          - Name: EM_ELEMENTAL_SPIRIT_M
+            Level: 3
+  - Job: Inquisitor
+    Inherit:
+      Novice: true
+      Acolyte: true
+      Monk: true
+      Champion: true
+      Sura: true
+      Sura_T: true
+    Tree:
+      - Name: IQ_POWERFUL_FAITH
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_WILL_OF_FAITH
+            Level: 1
+      - Name: IQ_FIRM_FAITH
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_WILL_OF_FAITH
+            Level: 1
+      - Name: IQ_WILL_OF_FAITH
+        MaxLevel: 10
+      - Name: IQ_OLEUM_SANCTUM
+        MaxLevel: 5
+        Requires:
+          - Name: AL_HOLYWATER
+            Level: 1
+          - Name: IQ_WILL_OF_FAITH
+            Level: 3
+      - Name: IQ_SINCERE_FAITH
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_WILL_OF_FAITH
+            Level: 1
+      - Name: IQ_MASSIVE_F_BLASTER
+        MaxLevel: 10
+        Requires:
+          - Name: IQ_EXPOSION_BLASTER
+            Level: 3
+          - Name: IQ_OLEUM_SANCTUM
+            Level: 3
+          - Name: IQ_WILL_OF_FAITH
+            Level: 5
+      - Name: IQ_EXPOSION_BLASTER
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_OLEUM_SANCTUM
+            Level: 1
+      - Name: IQ_FIRST_BRAND
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_WILL_OF_FAITH
+            Level: 2
+      - Name: IQ_FIRST_FAITH_POWER
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_FIRST_BRAND
+            Level: 1
+          - Name: IQ_WILL_OF_FAITH
+            Level: 3
+      - Name: IQ_JUDGE
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_FIRST_FAITH_POWER
+            Level: 1
+      - Name: IQ_SECOND_FLAME
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_THIRD_EXOR_FLAME
+            Level: 1
+      - Name: IQ_SECOND_FAITH
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_FIRST_FAITH_POWER
+            Level: 1
+      - Name: IQ_SECOND_JUDGEMENT
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_JUDGE
+            Level: 1
+      - Name: IQ_THIRD_PUNISH
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_SECOND_FAITH
+            Level: 2
+      - Name: IQ_THIRD_FLAME_BOMB
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_SECOND_FLAME
+            Level: 2
+      - Name: IQ_THIRD_CONSECRATION
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_SECOND_JUDGEMENT
+            Level: 2
+      - Name: IQ_THIRD_EXOR_FLAME
+        MaxLevel: 5
+        Requires:
+          - Name: IQ_JUDGE
+            Level: 1
+  - Job: Troubadour
+    Inherit:
+      Novice: true
+      Archer: true
+      Bard: true
+      Clown: true
+      Minstrel: true
+      Minstrel_T: true
+    Tree:
+      - Name: TR_STAGE_MANNER
+        MaxLevel: 5
+      - Name: TR_RETROSPECTION
+        MaxLevel: 1
+        Requires:
+          - Name: TR_STAGE_MANNER
+            Level: 1
+      - Name: TR_MYSTIC_SYMPHONY
+        MaxLevel: 1
+        Requires:
+          - Name: TR_METALIC_FURY
+            Level: 1
+          - Name: TR_ROSEBLOSSOM
+            Level: 5
+      - Name: TR_KVASIR_SONATA
+        MaxLevel: 1
+        Requires:
+          - Name: TR_NIPELHEIM_REQUIEM
+            Level: 1
+          - Name: TR_ROKI_CAPRICCIO
+            Level: 1
+      - Name: TR_ROSEBLOSSOM
+        MaxLevel: 5
+        Requires:
+          - Name: TR_RHYTHMSHOOTING
+            Level: 3
+      - Name: TR_RHYTHMSHOOTING
+        MaxLevel: 5
+      - Name: TR_METALIC_FURY
+        MaxLevel: 5
+        Requires:
+          - Name: TR_SOUNDBLEND
+            Level: 1
+      - Name: TR_SOUNDBLEND
+        MaxLevel: 5
+        Requires:
+          - Name: WM_METALICSOUND
+            Level: 5
+      - Name: TR_GEF_NOCTURN
+        MaxLevel: 5
+        Requires:
+          - Name: TR_STAGE_MANNER
+            Level: 3
+      - Name: TR_ROKI_CAPRICCIO
+        MaxLevel: 5
+        Requires:
+          - Name: TR_JAWAII_SERENADE
+            Level: 1
+      - Name: TR_AIN_RHAPSODY
+        MaxLevel: 5
+        Requires:
+          - Name: TR_STAGE_MANNER
+            Level: 3
+      - Name: TR_MUSICAL_INTERLUDE
+        MaxLevel: 5
+        Requires:
+          - Name: TR_AIN_RHAPSODY
+            Level: 1
+      - Name: TR_JAWAII_SERENADE
+        MaxLevel: 5
+        Requires:
+          - Name: TR_GEF_NOCTURN
+            Level: 1
+      - Name: TR_NIPELHEIM_REQUIEM
+        MaxLevel: 5
+        Requires:
+          - Name: TR_MUSICAL_INTERLUDE
+            Level: 1
+          - Name: TR_PRON_MARCH
+            Level: 1
+      - Name: TR_PRON_MARCH
+        MaxLevel: 5
+        Requires:
+          - Name: TR_AIN_RHAPSODY
+            Level: 1
+  - Job: Trouvere
+    Inherit:
+      Novice: true
+      Archer: true
+      Dancer: true
+      Gypsy: true
+      Wanderer: true
+      Wanderer_T: true
+    Tree:
+      - Name: TR_STAGE_MANNER
+        MaxLevel: 5
+      - Name: TR_RETROSPECTION
+        MaxLevel: 1
+        Requires:
+          - Name: TR_STAGE_MANNER
+            Level: 1
+      - Name: TR_MYSTIC_SYMPHONY
+        MaxLevel: 1
+        Requires:
+          - Name: TR_METALIC_FURY
+            Level: 1
+          - Name: TR_ROSEBLOSSOM
+            Level: 5
+      - Name: TR_KVASIR_SONATA
+        MaxLevel: 1
+        Requires:
+          - Name: TR_NIPELHEIM_REQUIEM
+            Level: 1
+          - Name: TR_ROKI_CAPRICCIO
+            Level: 1
+      - Name: TR_ROSEBLOSSOM
+        MaxLevel: 5
+        Requires:
+          - Name: TR_RHYTHMSHOOTING
+            Level: 3
+      - Name: TR_RHYTHMSHOOTING
+        MaxLevel: 5
+      - Name: TR_METALIC_FURY
+        MaxLevel: 5
+        Requires:
+          - Name: TR_SOUNDBLEND
+            Level: 1
+      - Name: TR_SOUNDBLEND
+        MaxLevel: 5
+        Requires:
+          - Name: WM_METALICSOUND
+            Level: 5
+      - Name: TR_GEF_NOCTURN
+        MaxLevel: 5
+        Requires:
+          - Name: TR_STAGE_MANNER
+            Level: 3
+      - Name: TR_ROKI_CAPRICCIO
+        MaxLevel: 5
+        Requires:
+          - Name: TR_JAWAII_SERENADE
+            Level: 1
+      - Name: TR_AIN_RHAPSODY
+        MaxLevel: 5
+        Requires:
+          - Name: TR_STAGE_MANNER
+            Level: 3
+      - Name: TR_MUSICAL_INTERLUDE
+        MaxLevel: 5
+        Requires:
+          - Name: TR_AIN_RHAPSODY
+            Level: 1
+      - Name: TR_JAWAII_SERENADE
+        MaxLevel: 5
+        Requires:
+          - Name: TR_GEF_NOCTURN
+            Level: 1
+      - Name: TR_NIPELHEIM_REQUIEM
+        MaxLevel: 5
+        Requires:
+          - Name: TR_MUSICAL_INTERLUDE
+            Level: 1
+          - Name: TR_PRON_MARCH
+            Level: 1
+      - Name: TR_PRON_MARCH
+        MaxLevel: 5
+        Requires:
+          - Name: TR_AIN_RHAPSODY
+            Level: 1
+  - Job: Windhawk2
+    Inherit:
+      Novice: true
+      Archer: true
+      Hunter: true
+      Sniper: true
+      Ranger: true
+      Ranger_T: true
+      Windhawk: true
+  - Job: Meister2
+    Inherit:
+      Novice: true
+      Merchant: true
+      Blacksmith: true
+      Whitesmith: true
+      Mechanic: true
+      Mechanic_T: true
+      Meister: true
+  - Job: Dragon_Knight2
+    Inherit:
+      Novice: true
+      Swordman: true
+      Knight: true
+      Lord_Knight: true
+      Rune_Knight: true
+      Rune_Knight_T: true
+      Dragon_Knight: true
+  - Job: Imperial_Guard2
+    Inherit:
+      Novice: true
+      Swordman: true
+      Crusader: true
+      Paladin: true
+      Royal_Guard: true
+      Royal_Guard_T: true
+      Imperial_Guard: true

+ 127 - 76
db/re/statpoint.yml

@@ -24,11 +24,12 @@
 ###########################################################################
 # - Level             BaseLevel required.
 #   Points            Total status points given from BaseLevel 1 to 'Level'.
+#   TraitPoints       Total trait points given from BaseLevel 1 to 'Level'.
 ###########################################################################
 
 Header:
   Type: STATPOINT_DB
-  Version: 1
+  Version: 2
 
 Body:
   - Level: 1
@@ -382,152 +383,202 @@ Body:
   - Level: 175
     Points: 3278
   - Level: 176
-    Points: 3295
+    Points: 3309
   - Level: 177
-    Points: 3325
+    Points: 3340
   - Level: 178
-    Points: 3355
+    Points: 3371
   - Level: 179
-    Points: 3385
+    Points: 3403
   - Level: 180
-    Points: 3415
+    Points: 3435
   - Level: 181
-    Points: 3446
+    Points: 3467
   - Level: 182
-    Points: 3477
+    Points: 3499
   - Level: 183
-    Points: 3508
+    Points: 3531
   - Level: 184
-    Points: 3539
+    Points: 3563
   - Level: 185
-    Points: 3570
+    Points: 3595
   - Level: 186
-    Points: 3601
+    Points: 3628
   - Level: 187
-    Points: 3632
+    Points: 3661
   - Level: 188
-    Points: 3663
-  - Level: 189
     Points: 3694
+  - Level: 189
+    Points: 3727
   - Level: 190
-    Points: 3725
+    Points: 3760
   - Level: 191
-    Points: 3757
+    Points: 3793
   - Level: 192
-    Points: 3789
+    Points: 3826
   - Level: 193
-    Points: 3821
+    Points: 3860
   - Level: 194
-    Points: 3853
+    Points: 3894
   - Level: 195
-    Points: 3885
+    Points: 3928
   - Level: 196
-    Points: 3917
+    Points: 3962
   - Level: 197
-    Points: 3949
+    Points: 3996
   - Level: 198
-    Points: 3981
+    Points: 4030
   - Level: 199
-    Points: 4013
+    Points: 4064
   - Level: 200
-    Points: 4045
+    Points: 4099
   - Level: 201
-    Points: 4045
+    Points: 4099
+    TraitPoints: 3
   - Level: 202
-    Points: 4045
+    Points: 4099
+    TraitPoints: 6
   - Level: 203
-    Points: 4045
+    Points: 4099
+    TraitPoints: 9
   - Level: 204
-    Points: 4045
+    Points: 4099
+    TraitPoints: 12
   - Level: 205
-    Points: 4045
+    Points: 4099
+    TraitPoints: 19
   - Level: 206
-    Points: 4045
+    Points: 4099
+    TraitPoints: 22
   - Level: 207
-    Points: 4045
+    Points: 4099
+    TraitPoints: 25
   - Level: 208
-    Points: 4045
+    Points: 4099
+    TraitPoints: 28
   - Level: 209
-    Points: 4045
+    Points: 4099
+    TraitPoints: 31
   - Level: 210
-    Points: 4045
+    Points: 4099
+    TraitPoints: 38
   - Level: 211
-    Points: 4045
+    Points: 4099
+    TraitPoints: 41
   - Level: 212
-    Points: 4045
+    Points: 4099
+    TraitPoints: 44
   - Level: 213
-    Points: 4045
+    Points: 4099
+    TraitPoints: 47
   - Level: 214
-    Points: 4045
+    Points: 4099
+    TraitPoints: 50
   - Level: 215
-    Points: 4045
+    Points: 4099
+    TraitPoints: 57
   - Level: 216
-    Points: 4045
+    Points: 4099
+    TraitPoints: 60
   - Level: 217
-    Points: 4045
+    Points: 4099
+    TraitPoints: 63
   - Level: 218
-    Points: 4045
+    Points: 4099
+    TraitPoints: 66
   - Level: 219
-    Points: 4045
+    Points: 4099
+    TraitPoints: 69
   - Level: 220
-    Points: 4045
+    Points: 4099
+    TraitPoints: 76
   - Level: 221
-    Points: 4045
+    Points: 4099
+    TraitPoints: 79
   - Level: 222
-    Points: 4045
+    Points: 4099
+    TraitPoints: 82
   - Level: 223
-    Points: 4045
+    Points: 4099
+    TraitPoints: 85
   - Level: 224
-    Points: 4045
+    Points: 4099
+    TraitPoints: 88
   - Level: 225
-    Points: 4045
+    Points: 4099
+    TraitPoints: 95
   - Level: 226
-    Points: 4045
+    Points: 4099
+    TraitPoints: 98
   - Level: 227
-    Points: 4045
+    Points: 4099
+    TraitPoints: 101
   - Level: 228
-    Points: 4045
+    Points: 4099
+    TraitPoints: 104
   - Level: 229
-    Points: 4045
+    Points: 4099
+    TraitPoints: 107
   - Level: 230
-    Points: 4045
+    Points: 4099
+    TraitPoints: 114
   - Level: 231
-    Points: 4045
+    Points: 4099
+    TraitPoints: 117
   - Level: 232
-    Points: 4045
+    Points: 4099
+    TraitPoints: 120
   - Level: 233
-    Points: 4045
+    Points: 4099
+    TraitPoints: 123
   - Level: 234
-    Points: 4045
+    Points: 4099
+    TraitPoints: 126
   - Level: 235
-    Points: 4045
+    Points: 4099
+    TraitPoints: 133
   - Level: 236
-    Points: 4045
+    Points: 4099
+    TraitPoints: 136
   - Level: 237
-    Points: 4045
+    Points: 4099
+    TraitPoints: 139
   - Level: 238
-    Points: 4045
+    Points: 4099
+    TraitPoints: 142
   - Level: 239
-    Points: 4045
+    Points: 4099
+    TraitPoints: 145
   - Level: 240
-    Points: 4045
+    Points: 4099
+    TraitPoints: 152
   - Level: 241
-    Points: 4045
+    Points: 4099
+    TraitPoints: 155
   - Level: 242
-    Points: 4045
+    Points: 4099
+    TraitPoints: 158
   - Level: 243
-    Points: 4045
+    Points: 4099
+    TraitPoints: 161
   - Level: 244
-    Points: 4045
+    Points: 4099
+    TraitPoints: 164
   - Level: 245
-    Points: 4045
+    Points: 4099
+    TraitPoints: 171
   - Level: 246
-    Points: 4045
+    Points: 4099
+    TraitPoints: 174
   - Level: 247
-    Points: 4045
+    Points: 4099
+    TraitPoints: 177
   - Level: 248
-    Points: 4045
+    Points: 4099
+    TraitPoints: 180
   - Level: 249
-    Points: 4045
+    Points: 4099
+    TraitPoints: 183
   - Level: 250
-    Points: 4045
+    Points: 4099
+    TraitPoints: 190

+ 10 - 1
db/skill_db.yml

@@ -49,6 +49,9 @@
 #   Knockback:                Amount of tiles the skill knockbacks. (Default: 0)
 #     - Level                 Skill level.
 #       Amount                Knockback count at specific skill level.
+#   GiveAp:                   Gives AP on successful skill cast. (Default: 0)
+#     - Level                 Skill level.
+#       Amount                AP gained at specific skill level.
 #   CopyFlags:                Determines if the skill is copyable. (Optional)
 #     Skill:                  Type of skill that can copy.
 #     RemoveRequirement:      Remove a requirement type. (Optional)
@@ -87,12 +90,18 @@
 #     SpCost:                 SP required to cast. (Default: 0)
 #       - Level               Skill level.
 #         Amount              SP required at specific skill level.
+#     ApCost:                 AP required to cast. (Default: 0)
+#       - Level               Skill level.
+#         Amount              AP required at specific skill level.
 #     HpRateCost:             HP rate required to cast. If positive, uses current HP, else uses Max HP. (Default: 0)
 #       - Level               Skill level.
 #         Amount              HP rate required at specific skill level.
 #     SpRateCost:             SP rate required to cast. If positive, uses current SP, else uses Max SP. (Default: 0)
 #       - Level               Skill level.
 #         Amount              SP rate required at specific skill level.
+#     ApRateCost:             AP rate required to cast. If positive, uses current AP, else uses Max AP. (Default: 0)
+#       - Level               Skill level.
+#         Amount              AP rate required at specific skill level.
 #     MaxHpTrigger:           Maximum amount of HP to cast the skill. (Default: 0)
 #       - Level               Skill level.
 #         Amount              Maximum HP trigger required at specific skill level.
@@ -130,7 +139,7 @@
 
 Header:
   Type: SKILL_DB
-  Version: 2
+  Version: 3
 
 Footer:
   Imports:

+ 2 - 1
db/statpoint.yml

@@ -24,11 +24,12 @@
 ###########################################################################
 # - Level             BaseLevel required.
 #   Points            Total status points given from BaseLevel 1 to 'Level'.
+#   TraitPoints       Total trait points given from BaseLevel 1 to 'Level'.
 ###########################################################################
 
 Header:
   Type: STATPOINT_DB
-  Version: 1
+  Version: 2
 
 Footer:
   Imports:

+ 140 - 0
db/status_disabled.txt

@@ -363,3 +363,143 @@ SC_FREEZING,16
 SC_TEARGAS_SOB,16
 SC__FEINTBOMB,16
 SC__CHAOS,16
+
+// 4th Job Common Status
+SC_HANDICAPSTATE_DEEPBLIND,16
+SC_HANDICAPSTATE_DEEPSILENCE,16
+SC_HANDICAPSTATE_LASSITUDE,16
+SC_HANDICAPSTATE_FROSTBITE,16
+SC_HANDICAPSTATE_SWOONING,16
+SC_HANDICAPSTATE_LIGHTNINGSTRIKE,16
+SC_HANDICAPSTATE_CRYSTALLIZATION,16
+SC_HANDICAPSTATE_CONFLAGRATION,16
+SC_HANDICAPSTATE_MISFORTUNE,16
+SC_HANDICAPSTATE_DEADLYPOISON,16
+SC_HANDICAPSTATE_DEPRESSION,16
+SC_HANDICAPSTATE_HOLYFLAME,16
+
+// Dragon Knight
+SC_SERVANTWEAPON,16
+SC_SERVANT_SIGN,16
+SC_CHARGINGPIERCE,16
+SC_CHARGINGPIERCE_COUNT,16
+SC_DRAGONIC_AURA,16
+SC_VIGOR,16
+
+// Arch Mage
+SC_DEADLY_DEFEASANCE,16
+SC_CLIMAX_DES_HU,16
+SC_CLIMAX,16
+SC_CLIMAX_EARTH,16
+SC_CLIMAX_BLOOM,16
+SC_CLIMAX_CRYIMP,16
+
+// Windhawk
+SC_WINDSIGN,16
+SC_CRESCIVEBOLT,16
+SC_CALAMITYGALE,16
+
+// Cardinal
+SC_MEDIALE,16
+SC_A_VITA,16
+SC_A_TELUM,16
+SC_PRE_ACIES,16
+SC_COMPETENTIA,16
+SC_RELIGIO,16
+SC_BENEDICTUM,16
+
+// Meister
+SC_AXE_STOMP,16
+SC_A_MACHINE,16
+SC_D_MACHINE,16
+SC_ABR_BATTLE_WARIOR,16
+SC_ABR_DUAL_CANNON,16
+SC_ABR_MOTHER_NET,16
+SC_ABR_INFINITY,16
+
+// Shadow Cross
+SC_SHADOW_EXCEED,16
+SC_DANCING_KNIFE,16
+SC_POTENT_VENOM,16
+SC_SHADOW_SCAR,16
+SC_E_SLASH_COUNT,16
+SC_SHADOW_WEAPON,16
+
+// Imperial Guard
+SC_GUARD_STANCE,16
+SC_ATTACK_STANCE,16
+SC_GUARDIAN_S,16
+SC_REBOUND_S,16
+SC_HOLY_S,16
+SC_ULTIMATE_S,16
+SC_SPEAR_SCAR,16
+SC_SHIELD_POWER,16
+
+// Elemental Master
+SC_SPELL_ENCHANTING,16
+SC_SUMMON_ELEMENTAL_ARDOR,16
+SC_SUMMON_ELEMENTAL_DILUVIO,16
+SC_SUMMON_ELEMENTAL_PROCELLA,16
+SC_SUMMON_ELEMENTAL_TERREMOTUS,16
+SC_SUMMON_ELEMENTAL_SERPENS,16
+SC_ELEMENTAL_VEIL,16
+
+// Troubadour/Trouvere
+SC_MYSTIC_SYMPHONY,16
+SC_KVASIR_SONATA,16
+SC_SOUNDBLEND,16
+SC_GEF_NOCTURN,16
+SC_AIN_RHAPSODY,16
+SC_MUSICAL_INTERLUDE,16
+SC_JAWAII_SERENADE,16
+SC_PRON_MARCH,16
+SC_ROSEBLOSSOM,16
+
+// Inquisitor
+SC_POWERFUL_FAITH,16
+SC_SINCERE_FAITH,16
+SC_FIRM_FAITH,16
+SC_HOLY_OIL,16
+SC_FIRST_BRAND,16
+SC_SECOND_BRAND,16
+SC_SECOND_JUDGE,16
+SC_THIRD_EXOR_FLAME,16
+SC_FIRST_FAITH_POWER,16
+SC_MASSIVE_F_BLASTER,16
+
+// Biolo
+SC_PROTECTSHADOWEQUIP,16
+SC_RESEARCHREPORT,16
+SC_BO_HELL_DUSTY,16
+SC_BIONIC_WOODENWARRIOR,16
+SC_BIONIC_WOODEN_FAIRY,16
+SC_BIONIC_CREEPER,16
+SC_BIONIC_HELLTREE,16
+
+// Abyss Chaser
+SC_SHADOW_STRIP,16
+SC_ABYSS_DAGGER,16
+SC_ABYSSFORCEWEAPON,16
+SC_ABYSS_SLAYER,16
+
+// Super Elementals
+SC_FLAMETECHNIC,16
+SC_FLAMETECHNIC_OPTION,16
+SC_FLAMEARMOR,16
+SC_FLAMEARMOR_OPTION,16
+SC_COLD_FORCE,16
+SC_COLD_FORCE_OPTION,16
+SC_CRYSTAL_ARMOR,16
+SC_CRYSTAL_ARMOR_OPTION,16
+SC_GRACE_BREEZE,16
+SC_GRACE_BREEZE_OPTION,16
+SC_EYES_OF_STORM,16
+SC_EYES_OF_STORM_OPTION,16
+SC_EARTH_CARE,16
+SC_EARTH_CARE_OPTION,16
+SC_STRONG_PROTECTION,16
+SC_STRONG_PROTECTION_OPTION,16
+SC_DEEP_POISONING,16
+SC_DEEP_POISONING_OPTION,16
+SC_POISON_SHIELD,16
+SC_POISON_SHIELD_OPTION,16

+ 18 - 11
doc/item_bonus.txt

@@ -106,22 +106,16 @@ bonus bWis,n;      			WIS + n
 bonus bSpl,n;      			SPL + n
 bonus bCon,n;      			CON + n
 bonus bCrt,n;      			CRT + n
+bonus bAllTraitStats,n; 		POW + n, STA + n, WIS + n, SPL + n, CON + n, CRT + n
 
-Sub-Trait Stats
----------------
-bonus bPatk,n;      		Power Attack (P.ATK) + n
-bonus bSmatk,n;      		Spell Magic Attack (S.MATK) + n
-bonus bHplus,n;      		Heal Plus (H.PLUS) + n
-bonus bCrate,n;      		Critical Rate (C.RATE) + n
-bonus bRes,n;      			Physical Resistance (RES) + n
-bonus bMres,n;      		Magic Resistance (MRES)  + n
-
-HP/SP
+HP/SP/AP
 -----
 bonus bMaxHP,n;    			MaxHP + n
 bonus bMaxHPrate,n;			MaxHP + n% 
 bonus bMaxSP,n;    			MaxSP + n
 bonus bMaxSPrate,n;			MaxSP + n%
+bonus bMaxAP,n;    			MaxAP + n
+bonus bMaxAPrate,n;			MaxAP + n%
 
 Atk/Def
 -------
@@ -162,6 +156,18 @@ bonus bAspd,n;        			Attack speed + n
 bonus bAspdRate,n;    			Attack speed + n%
 bonus bAtkRange,n;    			Attack range + n
 bonus bAddMaxWeight,n;			MaxWeight + n (in units of 0.1)
+bonus bPAtk,n;         			PAtk + n
+bonus bPAtkRate,n;     			PAtk + n%
+bonus bSMatk,n;         		SMatk + n
+bonus bSMatkRate,n;     		SMatk + n%
+bonus bRes,n;         			Res + n
+bonus bResRate,n;     			Res + n%
+bonus bMRes,n;         			MRes + n
+bonus bMResRate,n;     			MRes + n%
+bonus bHPlus,n;         		HPlus + n
+bonus bHPlusRate,n;     		HPlus + n%
+bonus bCRate,n;         		CRate + n
+bonus bCRateRate,n;     		CRate + n%
 
 =======================
 | 2. Extended Bonuses |
@@ -264,7 +270,8 @@ bonus2 bSubClass,c,x;     		+x% damage reduction against class c
 bonus2 bAddSize,s,x;      		+x% physical damage against size s
 bonus2 bMagicAddSize,s,x; 		+x% magical damage against size s
 bonus2 bSubSize,s,x;      		+x% damage reduction against size s
-bonus2 bMagicSubSize,s,x;      	+x% magic damage reduction against size s
+bonus2 bWeaponSubSize,s,x;		+x% physical damage reduction against size s
+bonus2 bMagicSubSize,s,x;		+x% magic damage reduction against size s
 bonus bNoSizeFix;       		Ignores the size modifier when calculating damage
 
 bonus2 bAddDamageClass,mid,x;     	+x% physical damage against monster mid

+ 1 - 1
doc/item_db.txt

@@ -159,10 +159,10 @@ Baby        - Baby classes (no Third-Baby classes).
 Third       - Third classes (no Transcedent-Third or Third-Baby classes).
 Third_Upper - Transcedent-Third classes.
 Third_Baby  - Third-Baby classes.
+Fourth      - Fourth classes.
 All_Upper   - All Transcedent classes
 All_Baby    - All baby classes
 All_Third   - Applies to all Third classes.
-Fourth      - Fourth classes.
 
 ---------------------------------------
 

+ 8 - 0
doc/mob_db.txt

@@ -68,6 +68,14 @@ MagicDefense: Magic defense of the monster, reduce magical skill.
 
 ---------------------------------------
 
+Resistance: Physical resistance of the monster, reduce melee and ranged physical attack/skill.
+
+---------------------------------------
+
+MagicResistance: Magic resistance of the monster, reduce magical skill.
+
+---------------------------------------
+
 Str: Strength of the monster. Affects ATK.
 
 ---------------------------------------

+ 28 - 0
doc/script_commands.txt

@@ -3586,6 +3586,8 @@ Valid types are:
 	MOB_ATK2 - monster's atk2
 	MOB_DEF - monster's def
 	MOB_MDEF - monster's mdef
+	MOB_RES - monster's res
+	MOB_MRES - monster's mres
 	MOB_STR - monster's str
 	MOB_AGI - monster's agi
 	MOB_VIT - monster's vit
@@ -6031,6 +6033,30 @@ specified amount permanently. The amount can be negative. See 'statusup'.
 
 	// This will decrease a character's Vit forever.
 	statusup2 bVit,-1;
+---------------------------------------
+
+*traitstatusup <stat>{,<char_id>};
+
+This command will change a specified trait stat of the invoking character up by one
+permanently. Trait stats are to be given as number, but you can use these constants to
+replace them:
+
+bPow -  Power
+bSta -  Stamina
+bWis -  Wisdom
+bSpl -  Spell
+bCon -  Concentration
+bCrt -  Creative
+
+---------------------------------------
+
+*traitstatusup2 <stat>,<amount>{,<char_id>};
+
+This command will change a specified trait stat of the invoking character by the
+specified amount permanently. The amount can be negative. See 'statusup'.
+
+	// This will decrease a character's Sta forever.
+	traitstatusup2 bSta,-1;
 
 ---------------------------------------
 
@@ -8269,6 +8295,8 @@ Parameters (indexes) for monsters are:
 	UMOB_BODY2
 	UMOB_GROUP_ID
 	UMOB_IGNORE_CELL_STACK_LIMIT
+	UMOB_RES
+	UMOB_MRES
 
 -----
 

+ 63 - 0
doc/skill_db.txt

@@ -525,6 +525,27 @@ Sequence Map Form
 
 ------------------
 
+ApCost: AP required to cast.
+
+Can be defined in scalar form or sequence map form:
+Scalar Form
+  ApCost: 10
+
+Sequence Map Form
+  ApCost:
+    - Level: 1
+      Amount: 10
+    - Level: 2
+      Amount: 20
+    - Level: 3
+      Amount: 30
+    - Level: 4
+      Amount: 40
+    - Level: 5
+      Amount: 50
+
+------------------
+
 HpRateCost: HP rate required to cast. If positive, uses current HP, else uses Max HP.
 
 Can be defined in scalar form or sequence map form:
@@ -567,6 +588,27 @@ Sequence Map Form
 
 ------------------
 
+ApRateCost: AP rate required to cast. If positive, uses current AP, else uses Max AP.
+
+Can be defined in scalar form or sequence map form:
+Scalar Form
+  ApRateCost: 10
+
+Sequence Map Form
+  ApRateCost:
+    - Level: 1
+      Amount: 10
+    - Level: 2
+      Amount: 20
+    - Level: 3
+      Amount: 30
+    - Level: 4
+      Amount: 40
+    - Level: 5
+      Amount: 50
+
+------------------
+
 MaxHpTrigger: Maximum amount of HP to cast the skill.
 
 Can be defined in scalar form or sequence map form:
@@ -754,6 +796,27 @@ Levels 1 - 5 have no item cost but levels 6 - 10 require a Blue Gemstone.
 
 ------------------
 
+GiveAp: AP given on successful casting.
+
+Can be defined in scalar form or sequence map form:
+Scalar Form
+  GiveAp: 10
+
+Sequence Map Form
+  GiveAp:
+    - Level: 1
+      Amount: 10
+    - Level: 2
+      Amount: 20
+    - Level: 3
+      Amount: 30
+    - Level: 4
+      Amount: 40
+    - Level: 5
+      Amount: 50
+
+------------------
+
 Equipment: Equipped item required to cast.
 
 ---------------------------------------

+ 2 - 0
doc/yaml/db/mob_db.yml

@@ -19,6 +19,8 @@
 #   Attack2                 Maximum attack in pre-renewal and base magic attack in renewal. (Default: 0)
 #   Defense                 Physical defense of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
 #   MagicDefense            Magic defense of the monster, reduces magical skill damage. (Default: 0)
+#   Resistance              Physical resistance of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
+#   MagicResistance         Magic resistance of the monster, reduces magical skill damage. (Default: 0)
 #   Str                     Strength which affects attack. (Default: 1)
 #   Agi                     Agility which affects flee. (Default: 1)
 #   Vit                     Vitality which affects defense. (Default: 1)

+ 9 - 0
doc/yaml/db/skill_db.yml

@@ -32,6 +32,9 @@
 #   Knockback:                Amount of tiles the skill knockbacks. (Default: 0)
 #     - Level                 Skill level.
 #       Amount                Knockback count at specific skill level.
+#   GiveAp:                   Gives AP on successful skill cast. (Default: 0)
+#     - Level                 Skill level.
+#       Amount                AP gained at specific skill level.
 #   CopyFlags:                Determines if the skill is copyable. (Optional)
 #     Skill:                  Type of skill that can copy.
 #     RemoveRequirement:      Remove a requirement type. (Optional)
@@ -70,12 +73,18 @@
 #     SpCost:                 SP required to cast. (Default: 0)
 #       - Level               Skill level.
 #         Amount              SP required at specific skill level.
+#     ApCost:                 AP required to cast. (Default: 0)
+#       - Level               Skill level.
+#         Amount              AP required at specific skill level.
 #     HpRateCost:             HP rate required to cast. If positive, uses current HP, else uses Max HP. (Default: 0)
 #       - Level               Skill level.
 #         Amount              HP rate required at specific skill level.
 #     SpRateCost:             SP rate required to cast. If positive, uses current SP, else uses Max SP. (Default: 0)
 #       - Level               Skill level.
 #         Amount              SP rate required at specific skill level.
+#     ApRateCost:             AP rate required to cast. If positive, uses current AP, else uses Max AP. (Default: 0)
+#       - Level               Skill level.
+#         Amount              AP rate required at specific skill level.
 #     MaxHpTrigger:           Maximum amount of HP to cast the skill. (Default: 0)
 #       - Level               Skill level.
 #         Amount              Maximum HP trigger required at specific skill level.

+ 1 - 0
doc/yaml/db/statpoint.yml

@@ -7,4 +7,5 @@
 ###########################################################################
 # - Level             BaseLevel required.
 #   Points            Total status points given from BaseLevel 1 to 'Level'.
+#   TraitPoints       Total trait points given from BaseLevel 1 to 'Level'.
 ###########################################################################

+ 2 - 0
doc/yaml/sql/mob_db2_re.sql

@@ -18,6 +18,8 @@ CREATE TABLE `mob_db2_re` (
   `attack2` smallint(6) unsigned DEFAULT NULL,
   `defense` smallint(6) unsigned DEFAULT NULL,
   `magic_defense` smallint(6) unsigned DEFAULT NULL,
+  `resistance` smallint(6) unsigned DEFAULT NULL,
+  `magic_resistance` smallint(6) unsigned DEFAULT NULL,
   `str` smallint(6) unsigned DEFAULT NULL,
   `agi` smallint(6) unsigned DEFAULT NULL,
   `vit` smallint(6) unsigned DEFAULT NULL,

+ 2 - 0
doc/yaml/sql/mob_db_re.sql

@@ -18,6 +18,8 @@ CREATE TABLE `mob_db_re` (
   `attack2` smallint(6) unsigned DEFAULT NULL,
   `defense` smallint(6) unsigned DEFAULT NULL,
   `magic_defense` smallint(6) unsigned DEFAULT NULL,
+  `resistance` smallint(6) unsigned DEFAULT NULL,
+  `magic_resistance` smallint(6) unsigned DEFAULT NULL,
   `str` smallint(6) unsigned DEFAULT NULL,
   `agi` smallint(6) unsigned DEFAULT NULL,
   `vit` smallint(6) unsigned DEFAULT NULL,

+ 41 - 13
npc/custom/jobmaster.txt

@@ -13,6 +13,7 @@
 //= 1.7 Readability changes. Also added BabyExpanded and BabySummoner classes. [Jey]
 //= 1.8 Added option to disable Baby Novice Only but Baby Class can be Enabled [mazvi]
 //= 1.9 Migrate/Integrate to Global Functions Platinum Skills. [mazvi]
+//= 2.0 Added 4th class [Lemongrass]
 //============================================================
 
 prontera,153,193,6	script	Job Master	123,{
@@ -42,6 +43,22 @@ function Is_Baby	{
 	return ((getarg(0, eaclass())&EAJL_BABY)>0);
 }
 
+// Checks if the player can change to fourth class.
+// Note: This does not include the level checks.
+function	Can_Change_Fourth	{
+	// To change to third class you need to be:
+	// * Transcendent Third Class
+	if( !.FourthClass )
+		return false; // Fourth job change disabled
+	if( (eaclass()&(EAJL_THIRD|EAJL_UPPER)) != (EAJL_THIRD|EAJL_UPPER) )
+		return false; // Not Transcendent Third Class
+	if( eaclass()&EAJL_FOURTH )
+		return false; // Already Fourth Class
+	if( roclass(eaclass()|EAJL_FOURTH) < 0 )
+		return false; // Job has no Fourth Class
+	return true;
+}
+
 // Checks if the player can change to third class.
 // Note: This does not include the level checks.
 function	Can_Change_Third	{
@@ -127,6 +144,7 @@ function	Job_Options	{
 
 	// initialisation
 	.@eac = eaclass();
+	.@fourth_possible = Can_Change_Fourth();
 	.@third_possible = Can_Change_Third();
 	.@rebirth_possible = Can_Rebirth();
 	.@first_eac = .@eac&EAJ_BASEMASK;
@@ -150,6 +168,11 @@ function	Job_Options	{
 		Require_Level(.Req_Third[0], .Req_Third[1]);
 		Job_Options(.@job_opt, roclass(.@eac|EAJL_THIRD));
 	}
+	if( .@fourth_possible ) {
+		// Fourth Job change (displayed below rebirth)
+		Require_Level(.Req_Fourth[0], .Req_Fourth[1]);
+		Job_Options(.@job_opt, roclass(.@eac|EAJL_FOURTH));
+	}
 	 
 	if (.SecondExpanded && 
 	   (.@eac&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE && // is Super Novice
@@ -353,7 +376,10 @@ function	Get_Job_Equip	{
 	// Note: The item is dropping, when the player can't hold it.
 	// But that's better than not giving the item at all.
 	.@eac = eaclass();
-	if( .@eac&EAJL_THIRD ) {
+	if( .@eac&EAJL_FOURTH ) {
+		// Fourth Class Items
+		getitem 490087,1; // Hourglass Necklace
+	} else if( .@eac&EAJL_THIRD ) {
 		// Third Class Items
 		getitem 2795,1;	//	Green Apple Ring for every 3rd Class
 		switch(BaseJob) {
@@ -456,24 +482,26 @@ OnInit:
 	.NPCName$ = "[Job Master]";
 	
 	// Settings
-	.ThirdClass = true;			// Enable third classes?
-	.RebirthClass = true;			// Enable rebirth classes?
-	.SecondExpanded = true;		// Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion?
-	.BabyNovice = true;	// Enable Baby novice classes? Disable it if you like player must have parent to get job baby.
-	.BabyClass = true;				// Enable Baby classes?
-	.BabyThird = true;				// Enable Baby third classes?
-	.BabyExpanded = true;			// Enable Baby Expanded classes: Ex. Baby Ninja, Baby Taekwon, etc.
-	.BabySummoner = true;			// Enable Baby Summoner?
-	.LastJob = true;				// Enforce linear class changes?
-	.SkillPointCheck = true;		// Force player to use up all skill points?
-	.Platinum = true;				// Get platinum skills automatically?
-	.GetJobEquip = false;			// Get job equipment (mostly weapons) on job change?
+	.FourthClass = true;				// Enable fourth classes?
+	.ThirdClass = true;					// Enable third classes?
+	.RebirthClass = true;				// Enable rebirth classes?
+	.SecondExpanded = true;				// Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion?
+	.BabyNovice = true;					// Enable Baby novice classes? Disable it if you like player must have parent to get job baby.
+	.BabyClass = true;					// Enable Baby classes?
+	.BabyThird = true;					// Enable Baby third classes?
+	.BabyExpanded = true;				// Enable Baby Expanded classes: Ex. Baby Ninja, Baby Taekwon, etc.
+	.BabySummoner = true;				// Enable Baby Summoner?
+	.LastJob = true;					// Enforce linear class changes?
+	.SkillPointCheck = true;			// Force player to use up all skill points?
+	.Platinum = true;					// Get platinum skills automatically?
+	.GetJobEquip = false;				// Get job equipment (mostly weapons) on job change?
 
 	// Level Requirements
 	setarray .Req_First[0],1,10; 		// Minimum base level, job level to turn into 1st class
 	setarray .Req_Second[0],1,40; 		// Minimum base level, job level to turn into 2nd class
 	setarray .Req_Rebirth[0],99,50;		// Minimum base level, job level to rebirth
 	setarray .Req_Third[0],99,50;		// Minimum base level, job level to change to third class
+	setarray .Req_Fourth[0],200,70;		// Minimum base level, job level to change to fourth class
 	setarray .Req_Exp_NJ_GS[0],99,70; 	// Minimum base level, job level to turn into Expanded Ninja and Gunslinger
 	setarray .Req_Exp_SNOVI[0],99,99; 	// Minimum base level, job level to turn into Expanded Super Novice
 	.SNovice = 45;						// Minimum base level to turn into Super Novice

+ 25 - 0
npc/other/CashShop_Functions.txt

@@ -328,3 +328,28 @@ function	script	F_CashReduceStat	{
 	statusup2 .@type,.@amount;
 	return;
 }
+
+// Trait Status reduction potion
+//============================================================
+// - Permanently reduces base trait stat <type> by <val>.
+// - Returns trait status points equals to points needed to raise
+//   that trait stat to original value.
+// - Doesn't work if base trait status <type> would become lower than 0 after reduction.
+// * callfunc("F_CashReduceTraitStat",<type>{,<val>,<itemid>});
+function	script	F_CashReduceTraitStat	{
+	.@type = getarg(0);
+	.@amount = getarg(1, -1);
+	.@itemid = getarg(2, 0);
+	
+	if((readparam(.@type) + .@amount) < 0) return;
+	
+	if(.@itemid) {
+		if(countitem(.@itemid))
+			delitem .@itemid,1;
+		else
+			return;
+	}
+	TraitPoint += needed_trait_point(.@type, .@amount);
+	traitstatusup2 .@type,.@amount;
+	return;
+}

+ 9 - 0
sql-files/main.sql

@@ -212,12 +212,21 @@ CREATE TABLE IF NOT EXISTS `char` (
   `int` smallint(4) unsigned NOT NULL default '0',
   `dex` smallint(4) unsigned NOT NULL default '0',
   `luk` smallint(4) unsigned NOT NULL default '0',
+  `pow` smallint(4) unsigned NOT NULL default '0',
+  `sta` smallint(4) unsigned NOT NULL default '0',
+  `wis` smallint(4) unsigned NOT NULL default '0',
+  `spl` smallint(4) unsigned NOT NULL default '0',
+  `con` smallint(4) unsigned NOT NULL default '0',
+  `crt` smallint(4) unsigned NOT NULL default '0',
   `max_hp` int(11) unsigned NOT NULL default '0',
   `hp` int(11) unsigned NOT NULL default '0',
   `max_sp` int(11) unsigned NOT NULL default '0',
   `sp` int(11) unsigned NOT NULL default '0',
+  `max_ap` int(11) unsigned NOT NULL default '0',
+  `ap` int(11) unsigned NOT NULL default '0',
   `status_point` int(11) unsigned NOT NULL default '0',
   `skill_point` int(11) unsigned NOT NULL default '0',
+  `trait_point` int(11) unsigned NOT NULL default '0',
   `option` int(11) NOT NULL default '0',
   `karma` tinyint(3) NOT NULL default '0',
   `manner` smallint(6) NOT NULL default '0',

+ 2 - 0
sql-files/mob_db2_re.sql

@@ -18,6 +18,8 @@ CREATE TABLE `mob_db2_re` (
   `attack2` smallint(6) unsigned DEFAULT NULL,
   `defense` smallint(6) unsigned DEFAULT NULL,
   `magic_defense` smallint(6) unsigned DEFAULT NULL,
+  `resistance` smallint(6) unsigned DEFAULT NULL,
+  `magic_resistance` smallint(6) unsigned DEFAULT NULL,
   `str` smallint(6) unsigned DEFAULT NULL,
   `agi` smallint(6) unsigned DEFAULT NULL,
   `vit` smallint(6) unsigned DEFAULT NULL,

+ 2 - 0
sql-files/mob_db_re.sql

@@ -18,6 +18,8 @@ CREATE TABLE `mob_db_re` (
   `attack2` smallint(6) unsigned DEFAULT NULL,
   `defense` smallint(6) unsigned DEFAULT NULL,
   `magic_defense` smallint(6) unsigned DEFAULT NULL,
+  `resistance` smallint(6) unsigned DEFAULT NULL,
+  `magic_resistance` smallint(6) unsigned DEFAULT NULL,
   `str` smallint(6) unsigned DEFAULT NULL,
   `agi` smallint(6) unsigned DEFAULT NULL,
   `vit` smallint(6) unsigned DEFAULT NULL,

+ 11 - 0
sql-files/upgrades/upgrade_20211230.sql

@@ -0,0 +1,11 @@
+ALTER TABLE `char` 
+	ADD COLUMN `pow` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `luk`,
+	ADD COLUMN `sta` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `pow`,
+	ADD COLUMN `wis` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `sta`,
+	ADD COLUMN `spl` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `wis`,
+	ADD COLUMN `con` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `spl`,
+	ADD COLUMN `crt` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `con`,
+	ADD COLUMN `max_ap` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `sp`,
+	ADD COLUMN `ap` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `max_ap`,
+	ADD COLUMN `trait_point` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `status_point
+;

+ 35 - 7
src/char/char.cpp

@@ -299,7 +299,10 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){
 		(p->rename != cp->rename) || (p->robe != cp->robe) || (p->character_moves != cp->character_moves) ||
 		(p->unban_time != cp->unban_time) || (p->font != cp->font) || (p->uniqueitem_counter != cp->uniqueitem_counter) ||
 		(p->hotkey_rowshift != cp->hotkey_rowshift) || (p->clan_id != cp->clan_id ) || (p->title_id != cp->title_id) ||
-		(p->show_equip != cp->show_equip) || (p->hotkey_rowshift2 != cp->hotkey_rowshift2)
+		(p->show_equip != cp->show_equip) || (p->hotkey_rowshift2 != cp->hotkey_rowshift2) ||
+		(p->max_ap != cp->max_ap) || (p->ap != cp->ap) || (p->trait_point != cp->trait_point) ||
+		(p->pow != cp->pow) || (p->sta != cp->sta) || (p->wis != cp->wis) ||
+		(p->spl != cp->spl) || (p->con != cp->con) || (p->crt != cp->crt)
 	)
 	{	//Save status
 		if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `base_level`='%d', `job_level`='%d',"
@@ -310,7 +313,9 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){
 			"`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d',"
 			"`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `rename`='%d',"
 			"`delete_date`='%lu',`robe`='%d',`moves`='%d',`font`='%u',`uniqueitem_counter`='%u',"
-			"`hotkey_rowshift`='%d', `clan_id`='%d', `title_id`='%lu', `show_equip`='%d', `hotkey_rowshift2`='%d'"
+			"`hotkey_rowshift`='%d', `clan_id`='%d', `title_id`='%lu', `show_equip`='%d', `hotkey_rowshift2`='%d',"
+			"`max_ap`='%u',`ap`='%u',`trait_point`='%d',"
+			"`pow`='%d',`sta`='%d',`wis`='%d',`spl`='%d',`con`='%d',`crt`='%d'"
 			" WHERE `account_id`='%d' AND `char_id` = '%d'",
 			schema_config.char_db, p->base_level, p->job_level,
 			p->base_exp, p->job_exp, p->zeny,
@@ -323,6 +328,8 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){
 			(unsigned long)p->delete_date, // FIXME: platform-dependent size
 			p->robe, p->character_moves, p->font, p->uniqueitem_counter,
 			p->hotkey_rowshift, p->clan_id, p->title_id, p->show_equip, p->hotkey_rowshift2,
+			p->max_ap, p->ap, p->trait_point,
+			p->pow, p->sta, p->wis, p->spl, p->con, p->crt,
 			p->account_id, p->char_id) )
 		{
 			Sql_ShowDebug(sql_handle);
@@ -924,7 +931,8 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf, uint8* coun
 		"`status_point`,`skill_point`,`option`,`karma`,`manner`,`hair`,`hair_color`,"
 		"`clothes_color`,`body`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`rename`,`delete_date`,"
 		"`robe`,`moves`,`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`title_id`,`show_equip`,"
-		"`hotkey_rowshift2`"
+		"`hotkey_rowshift2`,"
+		"`max_ap`,`ap`,`trait_point`,`pow`,`sta`,`wis`,`spl`,`con`,`crt`"
 		" FROM `%s` WHERE `account_id`='%d' AND `char_num` < '%d'", schema_config.char_db, sd->account_id, MAX_CHARS)
 	||	SQL_ERROR == SqlStmt_Execute(stmt)
 	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 0,  SQLDT_INT,    &p.char_id, 0, NULL, NULL)
@@ -973,6 +981,15 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf, uint8* coun
 	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 43, SQLDT_ULONG,  &p.title_id, 0, NULL, NULL)
 	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 44, SQLDT_UINT16, &p.show_equip, 0, NULL, NULL)
 	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 45, SQLDT_UCHAR,  &p.hotkey_rowshift2, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 46, SQLDT_UINT,   &p.max_ap, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 47, SQLDT_UINT,   &p.ap, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 48, SQLDT_UINT,   &p.trait_point, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 49, SQLDT_SHORT,  &p.pow, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 50, SQLDT_SHORT,  &p.sta, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 51, SQLDT_SHORT,  &p.wis, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 52, SQLDT_SHORT,  &p.spl, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 53, SQLDT_SHORT,  &p.con, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 54, SQLDT_SHORT,  &p.crt, 0, NULL, NULL)
 	)
 	{
 		SqlStmt_ShowDebug(stmt);
@@ -1040,7 +1057,8 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev
 		"`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`elemental_id`,`hair`,"
 		"`hair_color`,`clothes_color`,`body`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`last_x`,`last_y`,"
 		"`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`,`robe`, `moves`,"
-		"`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`clan_id`,`title_id`,`show_equip`,`hotkey_rowshift2`"
+		"`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`clan_id`,`title_id`,`show_equip`,`hotkey_rowshift2`,"
+		"`max_ap`,`ap`,`trait_point`,`pow`,`sta`,`wis`,`spl`,`con`,`crt`"
 		" FROM `%s` WHERE `char_id`=? LIMIT 1", schema_config.char_db)
 	||	SQL_ERROR == SqlStmt_BindParam(stmt, 0, SQLDT_INT, &char_id, 0)
 	||	SQL_ERROR == SqlStmt_Execute(stmt)
@@ -1107,6 +1125,15 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev
 	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 60, SQLDT_ULONG,  &p->title_id, 0, NULL, NULL)
 	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 61, SQLDT_UINT16, &p->show_equip, 0, NULL, NULL)
 	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 62, SQLDT_UCHAR,  &p->hotkey_rowshift2, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 63, SQLDT_UINT,   &p->max_ap, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 64, SQLDT_UINT,   &p->ap, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 65, SQLDT_UINT,   &p->trait_point, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 66, SQLDT_SHORT,  &p->pow, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 67, SQLDT_SHORT,  &p->sta, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 68, SQLDT_SHORT,  &p->wis, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 69, SQLDT_SHORT,  &p->spl, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 70, SQLDT_SHORT,  &p->con, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 71, SQLDT_SHORT,  &p->crt, 0, NULL, NULL)
 	)
 	{
 		SqlStmt_ShowDebug(stmt);
@@ -2017,7 +2044,7 @@ void char_read_fame_list(void)
 	memset(chemist_fame_list, 0, sizeof(chemist_fame_list));
 	memset(taekwon_fame_list, 0, sizeof(taekwon_fame_list));
 	// Build Blacksmith ranking list
-	if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", schema_config.char_db, JOB_BLACKSMITH, JOB_WHITESMITH, JOB_BABY_BLACKSMITH, JOB_MECHANIC, JOB_MECHANIC_T, JOB_BABY_MECHANIC, fame_list_size_smith) )
+	if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", schema_config.char_db, JOB_BLACKSMITH, JOB_WHITESMITH, JOB_BABY_BLACKSMITH, JOB_MECHANIC, JOB_MECHANIC_T, JOB_BABY_MECHANIC, JOB_MEISTER, fame_list_size_smith) )
 		Sql_ShowDebug(sql_handle);
 	for( i = 0; i < fame_list_size_smith && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
 	{
@@ -2032,7 +2059,7 @@ void char_read_fame_list(void)
 		memcpy(smith_fame_list[i].name, data, zmin(len, NAME_LENGTH));
 	}
 	// Build Alchemist ranking list
-	if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", schema_config.char_db, JOB_ALCHEMIST, JOB_CREATOR, JOB_BABY_ALCHEMIST, JOB_GENETIC, JOB_GENETIC_T, JOB_BABY_GENETIC, fame_list_size_chemist) )
+	if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", schema_config.char_db, JOB_ALCHEMIST, JOB_CREATOR, JOB_BABY_ALCHEMIST, JOB_GENETIC, JOB_GENETIC_T, JOB_BABY_GENETIC, JOB_BIOLO, fame_list_size_chemist) )
 		Sql_ShowDebug(sql_handle);
 	for( i = 0; i < fame_list_size_chemist && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
 	{
@@ -2316,7 +2343,8 @@ bool char_checkdb(void){
 		"`shield`,`head_top`,`head_mid`,`head_bottom`,`robe`,`last_map`,`last_x`,`last_y`,`save_map`,"
 		"`save_x`,`save_y`,`partner_id`,`online`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`,"
 		"`moves`,`unban_time`,`font`,`sex`,`hotkey_rowshift`,`clan_id`,`last_login`,`title_id`,`show_equip`,"
-		"`hotkey_rowshift2`"
+		"`hotkey_rowshift2`,"
+		"`max_ap`,`ap`,`trait_point`,`pow`,`sta`,`wis`,`spl`,`con`,`crt`"
 		" FROM `%s` LIMIT 1;", schema_config.char_db) ){
 		Sql_ShowDebug(sql_handle);
 		return false;

+ 4 - 0
src/char/char_logif.cpp

@@ -414,6 +414,10 @@ void chlogif_parse_change_sex_sub(int sex, int acc, int char_id, int class_, int
 		class_ = (sex == SEX_MALE ? JOB_KAGEROU : JOB_OBORO);
 	else if (class_ == JOB_BABY_KAGEROU || class_ == JOB_BABY_OBORO)
 		class_ = (sex == SEX_MALE ? JOB_BABY_KAGEROU : JOB_BABY_OBORO);
+	else if (class_ == JOB_TROUBADOUR || class_ == JOB_TROUVERE)
+		class_ = (sex == SEX_MALE ? JOB_TROUBADOUR : JOB_TROUVERE);
+	else if (class_ == JOB_SHINKIRO || class_ == JOB_SHIRANUI)
+		class_ = (sex == SEX_MALE ? JOB_SHINKIRO : JOB_SHIRANUI);
 
 	if (SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `equip` = '0' WHERE `char_id` = '%d'", schema_config.inventory_db, char_id))
 		Sql_ShowDebug(sql_handle);

+ 4 - 1
src/char/inter.cpp

@@ -356,7 +356,10 @@ const char* job_name(int class_) {
 		case JOB_NIGHT_WATCH:
 		case JOB_HYPER_NOVICE:
 		case JOB_SPIRIT_HANDLER:
-			return msg_txt( 143 - JOB_SKY_EMPEROR + class_ );
+			return msg_txt( 135 - JOB_SKY_EMPEROR + class_ );
+
+		case JOB_SKY_EMPEROR2:
+			return msg_txt( 135 );
 
 		default:
 			return msg_txt(199);

+ 10 - 4
src/common/mmo.hpp

@@ -63,7 +63,7 @@ typedef uint32 t_itemid;
 #define MAX_BANK_ZENY SINT32_MAX ///Max zeny in Bank
 #define MAX_FAME 1000000000 ///Max fame points
 #define MAX_CART 100 ///Maximum item in cart
-#define MAX_SKILL 1250 ///Maximum skill can be hold by Player, Homunculus, & Mercenary (skill list) AND skill_db limit
+#define MAX_SKILL 1450 ///Maximum skill can be hold by Player, Homunculus, & Mercenary (skill list) AND skill_db limit
 #define DEFAULT_WALK_SPEED 150 ///Default walk speed
 #define MIN_WALK_SPEED 20 ///Min walk speed
 #define MAX_WALK_SPEED 1000 ///Max walk speed
@@ -165,9 +165,13 @@ const t_itemid WEDDING_RING_F = 2635;
 #define MAX_MERCSKILL 41
 
 //Elemental System
-#define MAX_ELEMENTALSKILL 42
+#define MAX_ELEMENTALSKILL 57
 #define EL_SKILLBASE 8401
 
+//Automated Battle Robot System
+#define ABR_SKILLBASE 8601
+#define MAX_ABRSKILL 5
+
 //Achievement System
 #define MAX_ACHIEVEMENT_OBJECTIVES 10 /// Maximum different objectives in achievement_db.yml
 #define MAX_ACHIEVEMENT_DEPENDENTS 20 /// Maximum different dependents in achievement_db.yml
@@ -516,8 +520,8 @@ struct mmo_charstatus {
 	int zeny;
 
 	short class_; ///< Player's JobID
-	unsigned int status_point,skill_point;
-	int hp,max_hp,sp,max_sp;
+	unsigned int status_point,skill_point,trait_point;
+	int hp,max_hp,sp,max_sp,ap,max_ap;
 	unsigned int option;
 	short manner; // Defines how many minutes a char will be muted, each negative point is equivalent to a minute.
 	unsigned char karma;
@@ -1022,6 +1026,8 @@ enum e_job {
 	JOB_HYPER_NOVICE,
 	JOB_SPIRIT_HANDLER,
 
+	JOB_SKY_EMPEROR2 = 4316,
+
 	JOB_MAX,
 };
 

+ 2 - 2
src/config/packets.hpp

@@ -13,13 +13,13 @@
 	/// Do NOT edit this line! To set your client version, please do this instead:
 	/// In Windows: Add this line in your src\custom\defines_pre.hpp file: #define PACKETVER YYYYMMDD
 	/// In Linux: The same as above or run the following command: ./configure --enable-packetver=YYYYMMDD
-	#define PACKETVER 20200401
+	#define PACKETVER 20200902
 #endif
 
 #ifndef PACKETVER_RE
 	/// From November 2015 only RagexeRE are supported.
 	/// After July 2018 only Ragexe are supported.
-	#if PACKETVER > 20151104 && PACKETVER < 20180704
+	#if ( PACKETVER > 20151104 && PACKETVER < 20180704 ) || PACKETVER >= 20200902
 		#define PACKETVER_RE
 	#endif
 #endif

+ 206 - 25
src/map/atcommand.cpp

@@ -1170,7 +1170,7 @@ ACMD_FUNC(jobchange)
 			}
 		}
 
-		// High Jobs, Babys and Third
+		// High Jobs, Babys, Third, and Fourth
 		for( i = JOB_NOVICE_HIGH; i < JOB_MAX && !found; i++ ) {
 			if (strncmpi(message, job_name(i), 16) == 0) {
 				job = i;
@@ -1189,7 +1189,8 @@ ACMD_FUNC(jobchange)
 	if (job == JOB_KNIGHT2 || job == JOB_CRUSADER2 || job == JOB_WEDDING || job == JOB_XMAS || job == JOB_SUMMER || job == JOB_HANBOK || job == JOB_OKTOBERFEST
 		|| job == JOB_LORD_KNIGHT2 || job == JOB_PALADIN2 || job == JOB_BABY_KNIGHT2 || job == JOB_BABY_CRUSADER2 || job == JOB_STAR_GLADIATOR2
 		|| (job >= JOB_RUNE_KNIGHT2 && job <= JOB_MECHANIC_T2) || (job >= JOB_BABY_RUNE_KNIGHT2 && job <= JOB_BABY_MECHANIC2) || job == JOB_BABY_STAR_GLADIATOR2
-		|| job == JOB_STAR_EMPEROR2 || job == JOB_BABY_STAR_EMPEROR2 || job == JOB_SUMMER2)
+		|| job == JOB_STAR_EMPEROR2 || job == JOB_BABY_STAR_EMPEROR2 || job == JOB_SUMMER2
+		|| (job >= JOB_WINDHAWK2 && job <= JOB_IMPERIAL_GUARD2) || job == JOB_SKY_EMPEROR2)
 	{ // Deny direct transformation into dummy jobs
 		clif_displaymessage(fd, msg_txt(sd,923)); //"You can not change to this job by command."
 		return 0;
@@ -1336,6 +1337,38 @@ ACMD_FUNC(heal)
 	return 0;
 }
 
+/*==========================================
+* Recover's AP and allows exact adjustments. [Rytech]
+*------------------------------------------*/
+ACMD_FUNC(healap)
+{
+	int ap = 0;
+	nullpo_retr(-1, sd);
+
+	sscanf(message, "%11d", &ap);
+
+	// Overflow check.
+	if (ap == INT_MIN) ap++;
+
+	if (ap == 0) {
+		if (!status_percent_heal(&sd->bl, 0, 0, 100))
+			clif_displaymessage(fd, msg_txt(sd, 823));// AP have already been recovered.
+		else
+			clif_displaymessage(fd, msg_txt(sd, 821));// AP recovered.
+		return 0;
+	}else if (ap > 0) {
+		if (!status_heal(&sd->bl, 0, 0, ap, 0))
+			clif_displaymessage(fd, msg_txt(sd, 823));// AP have already been recovered.
+		else
+			clif_displaymessage(fd, msg_txt(sd, 821));// AP recovered.
+		return 0;
+	}else{
+		status_damage(NULL, &sd->bl, 0, 0, -ap, 0, 0, 0);
+		clif_displaymessage(fd, msg_txt(sd, 822));// AP modified.
+		return 0;
+	}
+}
+
 /*==========================================
  * @item command (usage: @item <itemdid1:itemid2:itemname:..> <quantity>) (modified by [Yor] for pet_egg)
  * @itembound command (usage: @itembound <name/id_of_item> <quantity> <bound_type>)
@@ -1544,7 +1577,7 @@ ACMD_FUNC(itemreset)
  *------------------------------------------*/
 ACMD_FUNC(baselevelup)
 {
-	int level=0, i=0, status_point=0;
+	int level=0, i=0, status_point=0, trait_point=0;
 	nullpo_retr(-1, sd);
 	level = atoi(message);
 
@@ -1561,9 +1594,12 @@ ACMD_FUNC(baselevelup)
 		if ((unsigned int)level > pc_maxbaselv(sd) || (unsigned int)level > pc_maxbaselv(sd) - sd->status.base_level) // fix positive overflow
 			level = pc_maxbaselv(sd) - sd->status.base_level;
 		for (i = 0; i < level; i++)
+		{
 			status_point += statpoint_db.pc_gets_status_point(sd->status.base_level + i);
-
+			trait_point += statpoint_db.pc_gets_trait_point(sd->status.base_level + i);
+		}
 		sd->status.status_point += status_point;
+		sd->status.trait_point += trait_point;
 		sd->status.base_level += (unsigned int)level;
 		status_calc_pc(sd, SCO_FORCE);
 		status_percent_heal(&sd->bl, 100, 100);
@@ -1582,13 +1618,20 @@ ACMD_FUNC(baselevelup)
 		if ((unsigned int)level >= sd->status.base_level)
 			level = sd->status.base_level-1;
 		for (i = 0; i > -level; i--)
+		{
 			status_point += statpoint_db.pc_gets_status_point(sd->status.base_level + i - 1);
-		if (sd->status.status_point < status_point)
+			trait_point += statpoint_db.pc_gets_trait_point(sd->status.base_level + i - 1);
+		}
+		if (sd->status.status_point < status_point || sd->status.trait_point < trait_point)
 			pc_resetstate(sd);
 		if (sd->status.status_point < status_point)
 			sd->status.status_point = 0;
 		else
 			sd->status.status_point -= status_point;
+		if (sd->status.trait_point < trait_point)
+			sd->status.trait_point = 0;
+		else
+			sd->status.trait_point -= trait_point;
 		sd->status.base_level -= (unsigned int)level;
 		clif_displaymessage(fd, msg_txt(sd,22)); // Base level lowered.
 		status_calc_pc(sd, SCO_FORCE);
@@ -1596,6 +1639,7 @@ ACMD_FUNC(baselevelup)
 	}
 	sd->status.base_exp = 0;
 	clif_updatestatus(sd, SP_STATUSPOINT);
+	clif_updatestatus(sd, SP_TRAITPOINT);
 	clif_updatestatus(sd, SP_BASELEVEL);
 	clif_updatestatus(sd, SP_BASEEXP);
 	clif_updatestatus(sd, SP_NEXTBASEEXP);
@@ -1842,7 +1886,7 @@ ACMD_FUNC(bodystyle)
 
 	memset(atcmd_output, '\0', sizeof(atcmd_output));
 
-	if (!(sd->class_ & JOBL_THIRD) || (sd->class_ & MAPID_THIRDMASK) == MAPID_SUPER_NOVICE_E || (sd->class_ & MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || (sd->class_ & MAPID_THIRDMASK) == MAPID_SOUL_REAPER) {
+	if ( (sd->class_ & JOBL_FOURTH) || !(sd->class_ & JOBL_THIRD) || (sd->class_ & MAPID_THIRDMASK) == MAPID_SUPER_NOVICE_E || (sd->class_ & MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || (sd->class_ & MAPID_THIRDMASK) == MAPID_SOUL_REAPER) {
 		clif_displaymessage(fd, msg_txt(sd,740));	// This job has no alternate body styles.
 		return -1;
 	}
@@ -2574,6 +2618,55 @@ ACMD_FUNC(statuspoint)
 	return 0;
 }
 
+/*==========================================
+* @trpoint
+*------------------------------------------*/
+ACMD_FUNC(traitpoint)
+{
+	int point;
+	unsigned int new_trait_point;
+
+	if (!message || !*message || (point = atoi(message)) == 0) {
+		clif_displaymessage(fd, msg_txt(sd, 820)); // Please enter a number (usage: @trpoint <number of points>).
+		return -1;
+	}
+
+	if (point < 0)
+	{
+		if (sd->status.trait_point < (unsigned int)(-point))
+		{
+			new_trait_point = 0;
+		}
+		else
+		{
+			new_trait_point = sd->status.trait_point + point;
+		}
+	}
+	else if (UINT_MAX - sd->status.trait_point < (unsigned int)point)
+	{
+		new_trait_point = UINT_MAX;
+	}
+	else
+	{
+		new_trait_point = sd->status.trait_point + point;
+	}
+
+	if (new_trait_point != sd->status.trait_point) {
+		sd->status.trait_point = new_trait_point;
+		clif_updatestatus(sd, SP_TRAITPOINT);
+		clif_displaymessage(fd, msg_txt(sd, 174)); // Number of status points changed.
+	}
+	else {
+		if (point < 0)
+			clif_displaymessage(fd, msg_txt(sd, 41)); // Unable to decrease the number/value.
+		else
+			clif_displaymessage(fd, msg_txt(sd, 149)); // Unable to increase the number/value.
+		return -1;
+	}
+
+	return 0;
+}
+
 /*==========================================
  * @skpoint (Rewritten by [Yor])
  *------------------------------------------*/
@@ -2757,7 +2850,7 @@ ACMD_FUNC(stat_all)
 	}
 	
 	count = 0;
-	for (i = PARAM_STR; i <= PARAM_LUK; i++) {
+	for (i = PARAM_STR; i < PARAM_POW; i++) {
 		short new_value;
 
 		if (value > 0 && status[i] + value >= max_status[i])
@@ -2842,7 +2935,7 @@ ACMD_FUNC(trait_all) {
 			new_value = status[i] + value;
 
 		if (new_value != status[i]) {
-			pc_setstat( sd, SP_POW + i, new_value );
+			pc_setstat( sd, SP_POW + i - PARAM_POW, new_value );
 			clif_updatestatus(sd, SP_POW + i - PARAM_POW);
 			clif_updatestatus(sd, SP_UPOW + i - PARAM_POW);
 			count++;
@@ -4536,7 +4629,7 @@ ACMD_FUNC(mount_peco)
 		}
 		return 0;
 	}
-	if( (sd->class_&MAPID_THIRDMASK) == MAPID_RANGER && pc_checkskill(sd,RA_WUGRIDER) > 0 && (!pc_isfalcon(sd) || battle_config.warg_can_falcon) ) {
+	if( (sd->class_&MAPID_THIRDMASK) == MAPID_RANGER && pc_checkskill(sd,RA_WUGRIDER) > 0 && (!pc_isfalcon(sd) || (pc_checkskill(sd, WH_HAWK_M) || battle_config.warg_can_falcon)) ) {
 		if( !pc_isridingwug(sd) ) {
 			clif_displaymessage(sd->fd,msg_txt(sd,1121)); // You have mounted your Warg.
 			pc_setoption(sd, sd->sc.option|OPTION_WUGRIDER);
@@ -6035,18 +6128,76 @@ ACMD_FUNC(displayskill)
 	t_tick tick;
 	uint16 skill_id;
 	uint16 skill_lv = 1;
+	uint16 type = 0;
 	nullpo_retr(-1, sd);
 
-	if (!message || !*message || sscanf(message, "%6hu %6hu", &skill_id, &skill_lv) < 1)
+	if (!message || !*message || sscanf(message, "%6hu %6hu %6hu", &skill_id, &skill_lv, &type) < 1)
 	{
-		clif_displaymessage(fd, msg_txt(sd,1166)); // Usage: @displayskill <skill ID> {<skill level>}
+		clif_displaymessage(fd, msg_txt(sd,1166));// Usage: @displayskill <skill ID> {<skill level> <type>}
+		clif_displaymessage(fd, msg_txt(sd,825));// Effect Types: 0: All, 1: Damage, 2: Splash Dmg, 3: No Damage, 4: Ground
 		return -1;
 	}
 	status = status_get_status_data(&sd->bl);
 	tick = gettick();
-	clif_skill_damage(&sd->bl,&sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH);
-	clif_skill_nodamage(&sd->bl, &sd->bl, skill_id, skill_lv, 1);
-	clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick);
+	if (type == 0 || type == 1)
+		clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SINGLE);
+	if (type == 0 || type == 2)
+		clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH);
+	if (type == 0 || type == 3)
+		clif_skill_nodamage(&sd->bl, &sd->bl, skill_id, skill_lv, 1);
+	if (type == 0 || type == 4)
+		clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick);
+	return 0;
+}
+
+/*==========================================
+* @displayskillcast by [Rytech]
+* Debug command to view casting animations for skills.
+* Can target self or the ground. Ground target can be
+* useful for seeing casting circle size.
+*------------------------------------------*/
+ACMD_FUNC(displayskillcast)
+{
+	uint16 skill_id;
+	uint16 skill_lv = 1;
+	uint16 cast_time = 5000;
+	uint16 target_type = 0;
+	nullpo_retr(-1, sd);
+
+	if (!message || !*message || sscanf(message, "%6hu %6hu %6hu %6hu", &skill_id, &skill_lv, &target_type, &cast_time) < 1)
+	{
+		clif_displaymessage(fd, msg_txt(sd, 824));// Usage: @displayskillcast <skill ID> {<skill level> <ground target flag> <cast time>}
+		return -1;
+	}
+
+	if ( target_type == 1)
+		clif_skillcasting(&sd->bl, sd->bl.id, 0, sd->bl.x, sd->bl.y, skill_id, skill_lv, 0, cast_time);
+	else
+		clif_skillcasting(&sd->bl, sd->bl.id, sd->bl.id, 0, 0, skill_id, skill_lv, 0, cast_time);
+
+	return 0;
+}
+
+/*==========================================
+* @displayskillunit by [Rytech]
+* Debug command to view unit animations for skills.
+*------------------------------------------*/
+ACMD_FUNC(displayskillunit)
+{
+	uint16 unit_id;
+	uint16 range = 0;
+	uint16 skill_lv = 1;
+
+	nullpo_retr(-1, sd);
+
+	if (!message || !*message || sscanf(message, "%6hu %6hu %6hu", &unit_id, &skill_lv, &range) < 1)
+	{
+		clif_displaymessage(fd, msg_txt(sd, 826));// Usage: @displayskillunit <unit ID> {<skill level> <range>}
+		return -1;
+	}
+
+	clif_skill_unit_test(&sd->bl, sd->bl.x, sd->bl.y, unit_id, range, skill_lv);
+
 	return 0;
 }
 
@@ -7538,6 +7689,10 @@ ACMD_FUNC(mobinfo)
 			mob->range2 , mob->range3, msize[mob->status.size],
 			mrace[mob->status.race], melement[mob->status.def_ele], mob->status.ele_lv);
 		clif_displaymessage(fd, atcmd_output);
+#ifdef RENEWAL
+		sprintf(atcmd_output, msg_txt(sd, 827), mob->status.res, mob->status.mres);//  MDEF:%d  RES:%d  MRES:%d
+		clif_displaymessage(fd, atcmd_output);
+#endif
 		// drops
 		clif_displaymessage(fd, msg_txt(sd,1245)); //  Drops:
 		strcpy(atcmd_output, " ");
@@ -9209,16 +9364,27 @@ ACMD_FUNC(stats)
 		{ "MaxHp - %d", 0 },
 		{ "Sp - %d", 0 },
 		{ "MaxSp - %d", 0 },
+		{ "Ap - %d", 0 },
+		{ "MaxAp - %d", 0 },
 		{ "Str - %3d", 0 },
 		{ "Agi - %3d", 0 },
 		{ "Vit - %3d", 0 },
 		{ "Int - %3d", 0 },
 		{ "Dex - %3d", 0 },
 		{ "Luk - %3d", 0 },
+		{ "Pow - %3d", 0 },
+		{ "Sta - %3d", 0 },
+		{ "Wis - %3d", 0 },
+		{ "Spl - %3d", 0 },
+		{ "Con - %3d", 0 },
+		{ "Crt - %3d", 0 },
 		{ "Zeny - %d", 0 },
-		{ "Free SK Points - %d", 0 },
+		{ "Free Status Points - %d", 0 },
+		{ "Free Trait Points - %d", 0 },
+		{ "Free Skill Points - %d", 0 },
 		{ "JobChangeLvl (2nd) - %d", 0 },
 		{ "JobChangeLvl (3rd) - %d", 0 },
+		{ "JobChangeLvl (4th) - %d", 0 },
 		{ NULL, 0 }
 	};
 
@@ -9233,16 +9399,27 @@ ACMD_FUNC(stats)
 	output_table[3].value = sd->status.max_hp;
 	output_table[4].value = sd->status.sp;
 	output_table[5].value = sd->status.max_sp;
-	output_table[6].value = sd->status.str;
-	output_table[7].value = sd->status.agi;
-	output_table[8].value = sd->status.vit;
-	output_table[9].value = sd->status.int_;
-	output_table[10].value = sd->status.dex;
-	output_table[11].value = sd->status.luk;
-	output_table[12].value = sd->status.zeny;
-	output_table[13].value = sd->status.skill_point;
-	output_table[14].value = sd->change_level_2nd;
-	output_table[15].value = sd->change_level_3rd;
+	output_table[6].value = sd->status.ap;
+	output_table[7].value = sd->status.max_ap;
+	output_table[8].value = sd->status.str;
+	output_table[9].value = sd->status.agi;
+	output_table[10].value = sd->status.vit;
+	output_table[11].value = sd->status.int_;
+	output_table[12].value = sd->status.dex;
+	output_table[13].value = sd->status.luk;
+	output_table[14].value = sd->status.pow;
+	output_table[15].value = sd->status.sta;
+	output_table[16].value = sd->status.wis;
+	output_table[17].value = sd->status.spl;
+	output_table[18].value = sd->status.con;
+	output_table[19].value = sd->status.crt;
+	output_table[20].value = sd->status.zeny;
+	output_table[21].value = sd->status.status_point;
+	output_table[22].value = sd->status.trait_point;
+	output_table[23].value = sd->status.skill_point;
+	output_table[24].value = sd->change_level_2nd;
+	output_table[25].value = sd->change_level_3rd;
+	output_table[26].value = sd->change_level_4th;
 
 	sprintf(job_jobname, "Job - %s %s", job_name(sd->status.class_), "(level %d)");
 	sprintf(output, msg_txt(sd,53), sd->status.name); // '%s' stats:
@@ -10521,6 +10698,7 @@ void atcommand_basecommands(void) {
 		ACMD_DEF2("kamic", kami),
 		ACMD_DEF2("lkami", kami),
 		ACMD_DEF(heal),
+		ACMD_DEF(healap),
 		ACMD_DEF(item),
 		ACMD_DEF(item2),
 		ACMD_DEF2("itembound",item),
@@ -10549,6 +10727,7 @@ void atcommand_basecommands(void) {
 		ACMD_DEF(gat),
 		ACMD_DEF(displaystatus),
 		ACMD_DEF2("stpoint", statuspoint),
+		ACMD_DEF2("trpoint", traitpoint),
 		ACMD_DEF2("skpoint", skillpoint),
 		ACMD_DEF(zeny),
 		ACMD_DEF2("str", param),
@@ -10655,6 +10834,8 @@ void atcommand_basecommands(void) {
 		ACMD_DEF(skillid),
 		ACMD_DEF(useskill),
 		ACMD_DEF(displayskill),
+		ACMD_DEF(displayskillcast),
+		ACMD_DEF(displayskillunit),
 		ACMD_DEF(snow),
 		ACMD_DEF(sakura),
 		ACMD_DEF(clouds),

文件差異過大導致無法顯示
+ 741 - 17
src/map/battle.cpp


+ 13 - 1
src/map/battle.hpp

@@ -525,7 +525,6 @@ struct Battle_Config
 	int max_extended_parameter;
 	int max_summoner_parameter;
 	int max_fourth_parameter;
-	int max_fourth_trait;
 	int max_third_aspd;
 	int max_summoner_aspd;
 	int vcast_stat_scale;
@@ -693,6 +692,19 @@ struct Battle_Config
 	int feature_refineui;
 	int rndopt_drop_pillar;
 
+	// 4th Jobs Stuff
+	int trait_points_job_change;
+	int use_traitpoint_table;
+	int max_trait_parameter;
+	int max_res_mres_reduction;
+	int max_ap;
+	int ap_rate;
+	int restart_ap_rate;
+	int loose_ap_on_death;
+	int loose_ap_on_map;
+	int keep_ap_on_logout;
+	int attack_machine_level_difference;
+
 #include "../custom/battle_config_struct.inc"
 };
 

+ 34 - 23
src/map/chrif.cpp

@@ -1000,34 +1000,45 @@ int chrif_changedsex(int fd) {
 			return 0; //Do nothing? Likely safe.
 		sd->status.sex = !sd->status.sex;
 
-		// reset skill of some job
-		if ((sd->class_&MAPID_UPPERMASK) == MAPID_BARDDANCER) {
-			int i;
-			// remove specifical skills of Bard classes
-			for(i = BA_MUSICALLESSON; i <= BA_APPLEIDUN; i++) {
-				uint16 sk_idx = skill_get_index(i);
-				if (sd->status.skill[sk_idx].id > 0 && sd->status.skill[sk_idx].flag == SKILL_FLAG_PERMANENT) {
-					sd->status.skill_point += sd->status.skill[sk_idx].lv;
-					sd->status.skill[sk_idx].id = 0;
-					sd->status.skill[sk_idx].lv = 0;
-				}
-			}
-			// remove specifical skills of Dancer classes
-			for(i = DC_DANCINGLESSON; i <= DC_SERVICEFORYOU; i++) {
-				uint16 sk_idx = skill_get_index(i);
-				if (sd->status.skill[sk_idx].id > 0 && sd->status.skill[sk_idx].flag == SKILL_FLAG_PERMANENT) {
-					sd->status.skill_point += sd->status.skill[sk_idx].lv;
-					sd->status.skill[sk_idx].id = 0;
-					sd->status.skill[sk_idx].lv = 0;
+		// Reset skills of gender split jobs.
+		if ((sd->class_&MAPID_UPPERMASK) == MAPID_BARDDANCER || (sd->class_&MAPID_UPPERMASK) == MAPID_KAGEROUOBORO) {
+			const static struct {
+				e_skill start;
+				e_skill end;
+			} ranges[] = {
+				// Bard class exclusive skills
+				{ BA_MUSICALLESSON, BA_APPLEIDUN },
+				// Dancer class exclusive skills
+				{ DC_DANCINGLESSON, DC_SERVICEFORYOU },
+				// Minstrel class exclusive skills
+				{ MI_RUSH_WINDMILL, MI_HARMONIZE },
+				// Wanderer class exclusive skills
+				{ WA_SWING_DANCE, WA_MOONLIT_SERENADE },
+				// Kagerou class exclusive skills
+				{ KG_KAGEHUMI, KG_KAGEMUSYA },
+				// Oboro class exclusive skills
+				{ OB_ZANGETSU, OB_AKAITSUKI },
+			};
+
+			for( const auto& range : ranges ){
+				for( uint16 skill_id = range.start; skill_id <= range.end; skill_id++ ){
+					uint16 sk_idx = skill_get_index( skill_id );
+
+					if( sd->status.skill[sk_idx].id > 0 && sd->status.skill[sk_idx].flag == SKILL_FLAG_PERMANENT ){
+						sd->status.skill_point += sd->status.skill[sk_idx].lv;
+						sd->status.skill[sk_idx].id = 0;
+						sd->status.skill[sk_idx].lv = 0;
+					}
 				}
 			}
+
 			clif_updatestatus(sd, SP_SKILLPOINT);
-			// change job if necessary
-			if (sd->status.sex) //Changed from Dancer
+			// Change to other gender version of the job if needed.
+			if (sd->status.sex)// Changed from female version of job.
 				sd->status.class_ -= 1;
-			else	//Changed from Bard
+			else// Changed from male version of job.
 				sd->status.class_ += 1;
-			//sd->class_ needs not be updated as both Dancer/Bard are the same.
+			//sd->class_ Does not need to be updated as both versions of the job are the same.
 		}
 		// save character
 		sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters

+ 247 - 3
src/map/clif.cpp

@@ -358,7 +358,19 @@ static inline unsigned char clif_bl_type(struct block_list *bl, bool walking) {
 	case BL_ITEM:  return 0x2; //ITEM_TYPE
 	case BL_SKILL: return 0x3; //SKILL_TYPE
 	case BL_CHAT:  return 0x4; //UNKNOWN_TYPE
-	case BL_MOB:   return pcdb_checkid(status_get_viewdata(bl)->class_)?0x0:0x5; //NPC_MOB_TYPE
+	case BL_MOB:
+		if( pcdb_checkid( status_get_viewdata( bl )->class_ ) ){
+			return 0x0; //PC_TYPE
+		}else{
+			switch( ( (mob_data*)bl )->special_state.ai ){
+				case AI_ABR:
+					return 0xd; //NPC_ABR_TYPE
+				case AI_BIONIC:
+					return 0xe; //NPC_BIONIC_TYPE
+				default:
+					return 0x5; //NPC_MOB_TYPE
+			}
+		}
 	case BL_NPC:
 // From 2017-07-26 on NPC type units can also use player sprites.
 // There is one exception and this is if they are walking.
@@ -1511,6 +1523,34 @@ void clif_class_change_target(struct block_list *bl,int class_,int type, enum se
 	}
 }
 
+void clif_servantball( struct map_session_data& sd, struct block_list* target, enum send_target send_target ){
+	struct PACKET_ZC_SPIRITS p = {};
+
+	p.packetType = HEADER_ZC_SPIRITS;
+	p.GID = sd.bl.id;
+	p.amount = sd.servantball;
+
+	if( target == nullptr ){
+		target = &sd.bl;
+	}
+
+	clif_send( &p, sizeof( p ), target, send_target );
+}
+
+void clif_abyssball( struct map_session_data& sd, struct block_list* target, enum send_target send_target ){
+	struct PACKET_ZC_SPIRITS p = {};
+
+	p.packetType = HEADER_ZC_SPIRITS;
+	p.GID = sd.bl.id;
+	p.amount = sd.abyssball;
+
+	if( target == nullptr ){
+		target = &sd.bl;
+	}
+
+	clif_send( &p, sizeof( p ), target, send_target );
+}
+
 /// Notifies the client of an object's Millenium Shields.
 static void clif_millenniumshield_single(int fd, map_session_data *sd)
 {
@@ -1649,6 +1689,10 @@ int clif_spawn( struct block_list *bl, bool walking ){
 				clif_millenniumshield(&sd->bl, sd->sc.data[SC_MILLENNIUMSHIELD]->val2);
 			if (sd->soulball > 0)
 				clif_soulball(sd);
+			if (sd->servantball > 0)
+				clif_servantball( *sd );
+			if (sd->abyssball > 0)
+				clif_abyssball( *sd );
 			if(sd->state.size==SZ_BIG) // tiny/big players [Valaris]
 				clif_specialeffect(bl,EF_GIANTBODY2,AREA);
 			else if(sd->state.size==SZ_MEDIUM)
@@ -3522,6 +3566,115 @@ void clif_updatestatus(struct map_session_data *sd,int type)
 		len=14;
 		break;
 
+#if PACKETVER_MAIN_NUM >= 20200916 || PACKETVER_RE_NUM >= 20200724
+	case SP_AP:
+		WFIFOL(fd, 4) = sd->battle_status.ap;
+		break;
+	case SP_TRAITPOINT:
+		WFIFOL(fd, 4) = sd->status.trait_point;
+		break;
+	case SP_MAXAP:
+		WFIFOL(fd, 4) = sd->battle_status.max_ap;
+		break;
+
+	case SP_POW:
+		WFIFOW(fd, 0) = 0x141;
+		WFIFOL(fd, 2) = type;
+		WFIFOL(fd, 6) = sd->status.pow;
+		WFIFOL(fd, 10) = sd->battle_status.pow - sd->status.pow;
+		len = 14;
+		break;
+	case SP_STA:
+		WFIFOW(fd, 0) = 0x141;
+		WFIFOL(fd, 2) = type;
+		WFIFOL(fd, 6) = sd->status.sta;
+		WFIFOL(fd, 10) = sd->battle_status.sta - sd->status.sta;
+		len = 14;
+		break;
+	case SP_WIS:
+		WFIFOW(fd, 0) = 0x141;
+		WFIFOL(fd, 2) = type;
+		WFIFOL(fd, 6) = sd->status.wis;
+		WFIFOL(fd, 10) = sd->battle_status.wis - sd->status.wis;
+		len = 14;
+		break;
+	case SP_SPL:
+		WFIFOW(fd, 0) = 0x141;
+		WFIFOL(fd, 2) = type;
+		WFIFOL(fd, 6) = sd->status.spl;
+		WFIFOL(fd, 10) = sd->battle_status.spl - sd->status.spl;
+		len = 14;
+		break;
+	case SP_CON:
+		WFIFOW(fd, 0) = 0x141;
+		WFIFOL(fd, 2) = type;
+		WFIFOL(fd, 6) = sd->status.con;
+		WFIFOL(fd, 10) = sd->battle_status.con - sd->status.con;
+		len = 14;
+		break;
+	case SP_CRT:
+		WFIFOW(fd, 0) = 0x141;
+		WFIFOL(fd, 2) = type;
+		WFIFOL(fd, 6) = sd->status.crt;
+		WFIFOL(fd, 10) = sd->battle_status.crt - sd->status.crt;
+		len = 14;
+		break;
+
+	case SP_UPOW:
+	case SP_USTA:
+	case SP_UWIS:
+	case SP_USPL:
+	case SP_UCON:
+	case SP_UCRT:
+		WFIFOW(fd, 0) = 0xbe;
+		WFIFOB(fd, 4) = pc_need_trait_point(sd,type-SP_UPOW+SP_POW, 1);
+		len = 5;
+		break;
+
+	case SP_PATK:
+		WFIFOL(fd, 4) = sd->battle_status.patk;
+		break;
+	case SP_SMATK:
+		WFIFOL(fd, 4) = sd->battle_status.smatk;
+		break;
+	case SP_RES:
+		WFIFOL(fd, 4) = sd->battle_status.res;
+		break;
+	case SP_MRES:
+		WFIFOL(fd, 4) = sd->battle_status.mres;
+		break;
+	case SP_HPLUS:
+		WFIFOL(fd, 4) = sd->battle_status.hplus;
+		break;
+	case SP_CRATE:
+		WFIFOL(fd, 4) = sd->battle_status.crate;
+		break;
+#else
+	case SP_AP:
+	case SP_TRAITPOINT:
+	case SP_MAXAP:
+	case SP_POW:
+	case SP_STA:
+	case SP_WIS:
+	case SP_SPL:
+	case SP_CON:
+	case SP_CRT:
+	case SP_UPOW:
+	case SP_USTA:
+	case SP_UWIS:
+	case SP_USPL:
+	case SP_UCON:
+	case SP_UCRT:
+	case SP_PATK:
+	case SP_SMATK:
+	case SP_RES:
+	case SP_MRES:
+	case SP_HPLUS:
+	case SP_CRATE:
+		// 4th job status are not supported by older clients
+		return;
+#endif
+
 	default:
 		ShowError("clif_updatestatus : unrecognized type %d\n",type);
 		return;
@@ -3824,6 +3977,30 @@ void clif_initialstatus(struct map_session_data *sd) {
 
 	clif_updatestatus(sd, SP_ATTACKRANGE);
 	clif_updatestatus(sd, SP_ASPD);
+
+#ifdef RENEWAL
+	clif_updatestatus(sd, SP_POW);
+	clif_updatestatus(sd, SP_STA);
+	clif_updatestatus(sd, SP_WIS);
+	clif_updatestatus(sd, SP_SPL);
+	clif_updatestatus(sd, SP_CON);
+	clif_updatestatus(sd, SP_CRT);
+	clif_updatestatus(sd, SP_PATK);
+	clif_updatestatus(sd, SP_SMATK);
+	clif_updatestatus(sd, SP_RES);
+	clif_updatestatus(sd, SP_MRES);
+	clif_updatestatus(sd, SP_HPLUS);
+	clif_updatestatus(sd, SP_CRATE);
+	clif_updatestatus(sd, SP_TRAITPOINT);
+	clif_updatestatus(sd, SP_AP);
+	clif_updatestatus(sd, SP_MAXAP);
+	clif_updatestatus(sd, SP_UPOW);
+	clif_updatestatus(sd, SP_USTA);
+	clif_updatestatus(sd, SP_UWIS);
+	clif_updatestatus(sd, SP_USPL);
+	clif_updatestatus(sd, SP_UCON);
+	clif_updatestatus(sd, SP_UCRT);
+#endif
 }
 
 
@@ -3916,7 +4093,7 @@ void clif_arrow_create_list( struct map_session_data *sd ){
 /// Notifies the client, about the result of an status change request (ZC_STATUS_CHANGE_ACK).
 /// 00bc <status id>.W <result>.B <value>.B
 /// status id:
-///     SP_STR ~ SP_LUK
+///     SP_STR ~ SP_LUK and SP_POW ~ SP_CRT
 /// result:
 ///     0 = failure
 ///     1 = success
@@ -4732,6 +4909,10 @@ static void clif_getareachar_pc(struct map_session_data* sd,struct map_session_d
 		clif_spiritcharm_single(sd->fd, dstsd);
 	if (dstsd->soulball > 0)
 		clif_soulball( dstsd, &sd->bl, SELF );
+	if (dstsd->servantball > 0)
+		clif_servantball( *dstsd, &sd->bl, SELF );
+	if (dstsd->abyssball > 0)
+		clif_abyssball( *dstsd, &sd->bl, SELF );
 	if( (sd->status.party_id && dstsd->status.party_id == sd->status.party_id) || //Party-mate, or hpdisp setting.
 		(sd->bg_id && sd->bg_id == dstsd->bg_id) || //BattleGround
 		pc_has_permission(sd, PC_PERM_VIEW_HPMETER)
@@ -5209,6 +5390,25 @@ void clif_getareachar_skillunit(struct block_list *bl, struct skill_unit *unit,
 		clif_changemapcell(fd, unit->bl.m, unit->bl.x, unit->bl.y, 5, SELF);
 }
 
+/// 09ca <lenght>.W <id> L <creator id>.L <x>.W <y>.W <unit id>.L <range>.B <visible>.B <skill level>.B (ZC_SKILL_ENTRY5)
+void clif_skill_unit_test(struct block_list *bl, short x, short y, int unit_id, short range, short skill_lv) {
+	unsigned char buf[128];
+
+	nullpo_retv(bl);
+
+	WBUFW(buf, 0) = 0x09ca;
+	WBUFW(buf, 2) = packet_len(0x09ca);
+	WBUFL(buf, 4) = 1000;
+	WBUFL(buf, 8) = 2000;
+	WBUFW(buf, 12) = x;
+	WBUFW(buf, 14) = y;
+	WBUFL(buf, 16) = unit_id;
+	WBUFB(buf, 20) = (unsigned char)range;
+	WBUFB(buf, 21) = 1;
+	WBUFB(buf, 22) = (unsigned char)skill_lv;
+
+	clif_send(buf, packet_len(0x09ca), bl, AREA);
+}
 
 /*==========================================
  * Server tells client to remove unit of id 'unit->bl.id'
@@ -6096,6 +6296,8 @@ void clif_skill_produce_mix_list( struct map_session_data *sd, int skill_id, int
 ///     4 = GN_MIX_COOKING
 ///     5 = GN_MAKEBOMB
 ///     6 = GN_S_PHARMACY
+///     7 = MT_M_MACHINE - Unconfirmed
+///     8 = BO_BIONIC_PHARMACY - Unconfirmed
 void clif_cooking_list( struct map_session_data *sd, int trigger, uint16 skill_id, int qty, int list_type ){
 	nullpo_retv( sd );
 
@@ -8368,7 +8570,6 @@ void clif_spiritball( struct block_list *bl, struct block_list* target, enum sen
 	clif_send( &p, sizeof( p ), target == nullptr ? bl : target, send_target );
 }
 
-
 /// Notifies clients in area of a character's combo delay (ZC_COMBODELAY).
 /// 01d2 <account id>.L <delay>.L
 void clif_combo_delay(struct block_list *bl,t_tick wait)
@@ -9714,6 +9915,14 @@ void clif_refresh(struct map_session_data *sd)
 	clif_updatestatus(sd,SP_INT);
 	clif_updatestatus(sd,SP_DEX);
 	clif_updatestatus(sd,SP_LUK);
+#ifdef RENEWAL
+	clif_updatestatus(sd,SP_POW);
+	clif_updatestatus(sd,SP_STA);
+	clif_updatestatus(sd,SP_WIS);
+	clif_updatestatus(sd,SP_SPL);
+	clif_updatestatus(sd,SP_CON);
+	clif_updatestatus(sd,SP_CRT);
+#endif
 	if (sd->spiritball)
 		clif_spiritball( &sd->bl, &sd->bl, SELF );
 	if (sd->sc.data[SC_MILLENNIUMSHIELD])
@@ -9722,6 +9931,10 @@ void clif_refresh(struct map_session_data *sd)
 		clif_spiritcharm_single(sd->fd, sd);
 	if (sd->soulball)
 		clif_soulball( sd, &sd->bl, SELF );
+	if (sd->servantball)
+		clif_servantball( *sd, &sd->bl, SELF );
+	if (sd->abyssball)
+		clif_abyssball( *sd, &sd->bl, SELF );
 	if (sd->vd.cloth_color)
 		clif_refreshlook(&sd->bl,sd->bl.id,LOOK_CLOTHES_COLOR,sd->vd.cloth_color,SELF);
 	if (sd->vd.body_style)
@@ -10810,6 +11023,14 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 		clif_updatestatus(sd,SP_INT);
 		clif_updatestatus(sd,SP_DEX);
 		clif_updatestatus(sd,SP_LUK);
+#ifdef RENEWAL
+		clif_updatestatus(sd,SP_POW);
+		clif_updatestatus(sd,SP_STA);
+		clif_updatestatus(sd,SP_WIS);
+		clif_updatestatus(sd,SP_SPL);
+		clif_updatestatus(sd,SP_CON);
+		clif_updatestatus(sd,SP_CRT);
+#endif
 
 		// abort currently running script
 		sd->state.using_fake_npc = 0;
@@ -11208,6 +11429,7 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd)
 	if (sd->sc.data[SC_CLOAKING])
 		skill_check_cloaking(&sd->bl, sd->sc.data[SC_CLOAKING]);
 	status_change_end(&sd->bl, SC_ROLLINGCUTTER, INVALID_TIMER); // If you move, you lose your counters. [malufett]
+	status_change_end(&sd->bl, SC_CRESCIVEBOLT, INVALID_TIMER);
 
 	pc_delinvincibletimer(sd);
 
@@ -12488,6 +12710,26 @@ void clif_parse_StatusUp(int fd,struct map_session_data *sd)
 }
 
 
+/// Request to increase trait status.
+/// 0b24 <status id>.W <amount>.W
+/// status id:
+///     SP_POW ~ SP_CON
+/// amount:
+///     The amount to increase the trait status
+void clif_parse_traitstatus_up( int fd, struct map_session_data *sd ){
+#if PACKETVER_MAIN_NUM >= 20200916 || PACKETVER_RE_NUM >= 20200724
+	struct PACKET_CZ_UNCONFIRMED_TSTATUS_UP* p = (struct PACKET_CZ_UNCONFIRMED_TSTATUS_UP*)RFIFOP( fd, 0 );
+
+	if( p->amount < 0 ){
+		ShowDebug( "clif_parse_traitstatus_up: Negative 'increase' value sent by client! %s (AID: %d, CID: %d, value: %d)\n", sd->status.name, sd->status.account_id, sd->status.char_id, p->amount );
+		return;
+	}
+
+	pc_traitstatusup( sd, p->type, p->amount );
+#endif
+}
+
+
 /// Request to increase level of a skill (CZ_UPGRADE_SKILLLEVEL).
 /// 0112 <skill id>.W
 void clif_parse_SkillUp(int fd,struct map_session_data *sd)
@@ -12947,6 +13189,8 @@ void clif_parse_ProduceMix(int fd,struct map_session_data *sd){
 ///     4 = GN_MIX_COOKING
 ///     5 = GN_MAKEBOMB
 ///     6 = GN_S_PHARMACY
+///     7 = MT_M_MACHINE - Unconfirmed
+///     8 = BO_BIONIC_PHARMACY - Unconfirmed
 void clif_parse_Cooking(int fd,struct map_session_data *sd) {
 	const struct PACKET_CZ_REQ_MAKINGITEM *p = (struct PACKET_CZ_REQ_MAKINGITEM *)RFIFOP( fd, 0 );
 

+ 6 - 1
src/map/clif.hpp

@@ -478,7 +478,8 @@ enum useskill_fail_cause : uint8_t
 	USESKILL_FAIL_THERE_ARE_NPC_AROUND = 83,
 	USESKILL_FAIL_NEED_MORE_BULLET = 84,
 	USESKILL_FAIL_COINS = 85,
-
+	// 86-99 unknown
+	USESKILL_FAIL_AP_INSUFFICIENT = 100,
 	USESKILL_FAIL_MAX
 };
 
@@ -719,10 +720,14 @@ void clif_getareachar_skillunit(struct block_list *bl, struct skill_unit *unit,
 void clif_skill_delunit(struct skill_unit *unit);
 void clif_skillunit_update(struct block_list* bl);
 
+void clif_skill_unit_test(struct block_list *bl, short x, short y, int unit_id, short range, short skill_lv);
+
 void clif_autospell(struct map_session_data *sd,uint16 skill_lv);
 void clif_devotion(struct block_list *src, struct map_session_data *tsd);
 void clif_spiritball( struct block_list *bl, struct block_list* target = nullptr, enum send_target send_target = AREA );
 void clif_soulball( struct map_session_data *sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
+void clif_servantball( struct map_session_data& sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
+void clif_abyssball( struct map_session_data& sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
 void clif_combo_delay(struct block_list *bl,t_tick wait);
 void clif_bladestop(struct block_list *src, int dst_id, int active);
 void clif_changemapcell(int fd, int16 m, int x, int y, int type, enum send_target target);

+ 4 - 0
src/map/clif_packetdb.hpp

@@ -2431,4 +2431,8 @@
 	parseable_packet( HEADER_CZ_SE_CASHSHOP_OPEN2, sizeof( struct PACKET_CZ_SE_CASHSHOP_OPEN2 ), clif_parse_cashshop_open_request, 0 );
 #endif
 
+#if PACKETVER_MAIN_NUM >= 20200916 || PACKETVER_RE_NUM >= 20200724
+	parseable_packet( HEADER_CZ_UNCONFIRMED_TSTATUS_UP, sizeof( PACKET_CZ_UNCONFIRMED_TSTATUS_UP ), clif_parse_traitstatus_up, 0 );
+#endif
+
 #endif /* CLIF_PACKETDB_HPP */

+ 60 - 10
src/map/elemental.cpp

@@ -79,24 +79,33 @@ int elemental_create(map_session_data *sd, int class_, unsigned int lifetime) {
 
 	//per individual bonuses
 	switch(db->class_){
-	case ELEMENTALID_AGNI_S:	case ELEMENTALID_AGNI_M:
-	case ELEMENTALID_AGNI_L: //ATK + (Summon Agni Skill Level x 20) / HIT + (Summon Agni Skill Level x 10)
+	case ELEMENTALID_AGNI_S:
+	case ELEMENTALID_AGNI_M:
+	case ELEMENTALID_AGNI_L:
+	case ELEMENTALID_ARDOR://ATK + (Summon Agni Skill Level x 20) / HIT + (Summon Agni Skill Level x 10)
 		ele.atk += i * 20;
 		ele.atk2 += i * 20;
 		ele.hit += i * 10;
 		break;
-	case ELEMENTALID_AQUA_S:	case ELEMENTALID_AQUA_M:
-	case ELEMENTALID_AQUA_L: //MDEF + (Summon Aqua Skill Level x 10) / MATK + (Summon Aqua Skill Level x 20)
+	case ELEMENTALID_AQUA_S:
+	case ELEMENTALID_AQUA_M:
+	case ELEMENTALID_AQUA_L:
+	case ELEMENTALID_DILUVIO://MDEF + (Summon Aqua Skill Level x 10) / MATK + (Summon Aqua Skill Level x 20)
 		ele.mdef += i * 10;
 		ele.matk += i * 20;
 		break;
-	case ELEMENTALID_VENTUS_S:	case ELEMENTALID_VENTUS_M:
-	case ELEMENTALID_VENTUS_L: //FLEE + (Summon Ventus Skill Level x 20) / MATK + (Summon Ventus Skill Level x 10)
+	case ELEMENTALID_VENTUS_S:
+	case ELEMENTALID_VENTUS_M:
+	case ELEMENTALID_VENTUS_L:
+	case ELEMENTALID_PROCELLA://FLEE + (Summon Ventus Skill Level x 20) / MATK + (Summon Ventus Skill Level x 10)
 		ele.flee += i * 20;
 		ele.matk += i * 10;
 		break;
-	case ELEMENTALID_TERA_S:	case ELEMENTALID_TERA_M:
-	case ELEMENTALID_TERA_L: //DEF + (Summon Tera Skill Level x 25) / ATK + (Summon Tera Skill Level x 5)
+	case ELEMENTALID_TERA_S:
+	case ELEMENTALID_TERA_M:
+	case ELEMENTALID_TERA_L:
+	case ELEMENTALID_TERREMOTUS:
+	case ELEMENTALID_SERPENS://DEF + (Summon Tera Skill Level x 25) / ATK + (Summon Tera Skill Level x 5)
 		ele.def += i * 25;
 		ele.atk += i * 5;
 		ele.atk2 += i * 5;
@@ -111,6 +120,17 @@ int elemental_create(map_session_data *sd, int class_, unsigned int lifetime) {
 		ele.matk += 25 * i;
 	}
 
+	if ((i = pc_checkskill(sd, EM_ELEMENTAL_SPIRIT_M)) > 0 && db->class_ >= ELEMENTALID_DILUVIO && db->class_ <= ELEMENTALID_SERPENS) {
+		ele.hp = ele.max_hp += 10000 + 3000 * i;
+		ele.sp = ele.max_sp += 100 * i;
+		ele.atk += 100 + 20 * i;
+		ele.atk2 += 100 + 20 * i;
+		ele.matk += 20 * i;
+		ele.def += 20 * i;
+		ele.mdef += 4 * i;
+		ele.flee += 10 * i;
+	}
+
 	ele.life_time = lifetime;
 
 	// Request Char Server to create this elemental
@@ -296,6 +316,16 @@ int elemental_clean_single_effect(s_elemental_data *ed, uint16 skill_id) {
 			case SC_UPHEAVAL_OPTION:
 			case SC_CIRCLE_OF_FIRE_OPTION:
 			case SC_TIDAL_WEAPON_OPTION:
+			case SC_FLAMETECHNIC_OPTION:
+			case SC_FLAMEARMOR_OPTION:
+			case SC_COLD_FORCE_OPTION:
+			case SC_CRYSTAL_ARMOR_OPTION:
+			case SC_GRACE_BREEZE_OPTION:
+			case SC_EYES_OF_STORM_OPTION:
+			case SC_EARTH_CARE_OPTION:
+			case SC_STRONG_PROTECTION_OPTION:
+			case SC_DEEP_POISONING_OPTION:
+			case SC_POISON_SHIELD_OPTION:
 				if( bl ) status_change_end(bl,type,INVALID_TIMER);	// Master
 				status_change_end(&ed->bl,static_cast<sc_type>(type-1),INVALID_TIMER);	// Elemental Spirit
 				break;
@@ -338,6 +368,16 @@ int elemental_clean_effect(s_elemental_data *ed) {
 	status_change_end(&ed->bl, SC_UPHEAVAL, INVALID_TIMER);
 	status_change_end(&ed->bl, SC_CIRCLE_OF_FIRE, INVALID_TIMER);
 	status_change_end(&ed->bl, SC_TIDAL_WEAPON, INVALID_TIMER);
+	status_change_end(&ed->bl, SC_FLAMETECHNIC, INVALID_TIMER);
+	status_change_end(&ed->bl, SC_FLAMEARMOR, INVALID_TIMER);
+	status_change_end(&ed->bl, SC_COLD_FORCE, INVALID_TIMER);
+	status_change_end(&ed->bl, SC_CRYSTAL_ARMOR, INVALID_TIMER);
+	status_change_end(&ed->bl, SC_GRACE_BREEZE, INVALID_TIMER);
+	status_change_end(&ed->bl, SC_EYES_OF_STORM, INVALID_TIMER);
+	status_change_end(&ed->bl, SC_EARTH_CARE, INVALID_TIMER);
+	status_change_end(&ed->bl, SC_STRONG_PROTECTION, INVALID_TIMER);
+	status_change_end(&ed->bl, SC_DEEP_POISONING, INVALID_TIMER);
+	status_change_end(&ed->bl, SC_POISON_SHIELD, INVALID_TIMER);
 
 	if( (sd = ed->master) == NULL )
 		return 0;
@@ -367,6 +407,16 @@ int elemental_clean_effect(s_elemental_data *ed) {
 	status_change_end(&sd->bl, SC_UPHEAVAL_OPTION, INVALID_TIMER);
 	status_change_end(&sd->bl, SC_CIRCLE_OF_FIRE_OPTION, INVALID_TIMER);
 	status_change_end(&sd->bl, SC_TIDAL_WEAPON_OPTION, INVALID_TIMER);
+	status_change_end(&sd->bl, SC_FLAMETECHNIC_OPTION, INVALID_TIMER);
+	status_change_end(&sd->bl, SC_FLAMEARMOR_OPTION, INVALID_TIMER);
+	status_change_end(&sd->bl, SC_COLD_FORCE_OPTION, INVALID_TIMER);
+	status_change_end(&sd->bl, SC_CRYSTAL_ARMOR_OPTION, INVALID_TIMER);
+	status_change_end(&sd->bl, SC_GRACE_BREEZE_OPTION, INVALID_TIMER);
+	status_change_end(&sd->bl, SC_EYES_OF_STORM_OPTION, INVALID_TIMER);
+	status_change_end(&sd->bl, SC_EARTH_CARE_OPTION, INVALID_TIMER);
+	status_change_end(&sd->bl, SC_STRONG_PROTECTION_OPTION, INVALID_TIMER);
+	status_change_end(&sd->bl, SC_DEEP_POISONING_OPTION, INVALID_TIMER);
+	status_change_end(&sd->bl, SC_POISON_SHIELD_OPTION, INVALID_TIMER);
 
 	return 1;
 }
@@ -745,8 +795,8 @@ uint64 ElementalDatabase::parseBodyNode(const YAML::Node &node) {
 	if (!this->asInt32(node, "Id", id))
 		return 0;
 
-	if (id < ELEMENTALID_AGNI_S || id > ELEMENTALID_TERA_L) {
-		this->invalidWarning(node["Id"], "Invalid Id %d (valid range: %d-%d).\n", id, ELEMENTALID_AGNI_S, ELEMENTALID_TERA_L);
+	if( !( ( id >= ELEMENTALID_AGNI_S && id <= ELEMENTALID_TERA_L ) || ( id >= ELEMENTALID_DILUVIO && id <= ELEMENTALID_SERPENS ) ) ) {
+		this->invalidWarning( node["Id"], "Invalid Id %d (valid ranges: %d-%d and %d-%d).\n", id, ELEMENTALID_AGNI_S, ELEMENTALID_TERA_L, ELEMENTALID_DILUVIO, ELEMENTALID_SERPENS );
 		return 0;
 	}
 

+ 8 - 0
src/map/elemental.hpp

@@ -28,6 +28,7 @@ enum e_elemental_skillmode : uint8 {
 
 ///Enum of Elemental ID
 enum elemental_elementalid  : uint16 {
+	// Sorcerer's Elementals
 	ELEMENTALID_AGNI_S = 2114,
 	ELEMENTALID_AGNI_M,
 	ELEMENTALID_AGNI_L,
@@ -40,6 +41,13 @@ enum elemental_elementalid  : uint16 {
 	ELEMENTALID_TERA_S,
 	ELEMENTALID_TERA_M,
 	ELEMENTALID_TERA_L,
+
+	// Elemental Master's Elementals
+	ELEMENTALID_DILUVIO = 20816,
+	ELEMENTALID_ARDOR,
+	ELEMENTALID_PROCELLA,
+	ELEMENTALID_TERREMOTUS,
+	ELEMENTALID_SERPENS,
 };
 
 struct s_elemental_skill {

+ 1 - 1
src/map/itemdb.hpp

@@ -230,7 +230,7 @@ enum e_item_job : uint16
 	ITEMJ_FOURTH      = 0x40,
 	ITEMJ_MAX         = 0xFF,
 
-	ITEMJ_ALL_UPPER = ITEMJ_UPPER | ITEMJ_THIRD_UPPER,
+	ITEMJ_ALL_UPPER = ITEMJ_UPPER | ITEMJ_THIRD_UPPER | ITEMJ_FOURTH,
 	ITEMJ_ALL_BABY = ITEMJ_BABY | ITEMJ_THIRD_BABY,
 	ITEMJ_ALL_THIRD = ITEMJ_THIRD | ITEMJ_THIRD_UPPER | ITEMJ_THIRD_BABY,
 

+ 3 - 0
src/map/map.cpp

@@ -2112,6 +2112,8 @@ int map_quit(struct map_session_data *sd) {
 		status_change_end(&sd->bl, SC_EQC, INVALID_TIMER);
 		status_change_end(&sd->bl, SC_SPRITEMABLE, INVALID_TIMER);
 		status_change_end(&sd->bl, SC_SV_ROOTTWIST, INVALID_TIMER);
+		status_change_end(&sd->bl, SC_GUARD_STANCE, INVALID_TIMER);
+		status_change_end(&sd->bl, SC_ATTACK_STANCE, INVALID_TIMER);
 		// Remove visuals effect from headgear
 		status_change_end(&sd->bl, SC_MOONSTAR, INVALID_TIMER); 
 		status_change_end(&sd->bl, SC_SUPER_STAR, INVALID_TIMER); 
@@ -2135,6 +2137,7 @@ int map_quit(struct map_session_data *sd) {
 			status_change_end(&sd->bl, SC_H_MINE, INVALID_TIMER);
 			status_change_end(&sd->bl, SC_ANTI_M_BLAST, INVALID_TIMER);
 			status_change_end(&sd->bl, SC_B_TRAP, INVALID_TIMER);
+			status_change_end(&sd->bl, SC_SHADOW_STRIP, INVALID_TIMER);
 		}
 		if (battle_config.debuff_on_logout&2) { //Remove positive buffs
 			status_change_end(&sd->bl, SC_MAXIMIZEPOWER, INVALID_TIMER);

+ 5 - 0
src/map/map.hpp

@@ -75,6 +75,7 @@ void map_msg_reload(void);
 #define MAPID_BASEMASK 0x00ff
 #define MAPID_UPPERMASK 0x0fff
 #define MAPID_THIRDMASK (JOBL_THIRD|MAPID_UPPERMASK)
+#define MAPID_FOURTHMASK (JOBL_FOURTH|MAPID_THIRDMASK|JOBL_UPPER)
 
 //First Jobs
 //Note the oddity of the novice:
@@ -403,6 +404,8 @@ enum mob_ai {
 	AI_FAW,
 	AI_GUILD,
 	AI_WAVEMODE,
+	AI_ABR,
+	AI_BIONIC,
 	AI_MAX
 };
 
@@ -517,6 +520,7 @@ enum _sp {
 	SP_DELAYRATE,SP_HP_DRAIN_VALUE_RACE, SP_SP_DRAIN_VALUE_RACE, // 1083-1085
 	SP_IGNORE_MDEF_RACE_RATE,SP_IGNORE_DEF_RACE_RATE,SP_SKILL_HEAL2,SP_ADDEFF_ONSKILL, //1086-1089
 	SP_ADD_HEAL_RATE,SP_ADD_HEAL2_RATE, SP_EQUIP_ATK, //1090-1092
+	SP_PATK_RATE,SP_SMATK_RATE,SP_RES_RATE,SP_MRES_RATE,SP_HPLUS_RATE,SP_CRATE_RATE,SP_ALL_TRAIT_STATS,SP_MAXAPRATE,// 1093-1100
 
 	SP_RESTART_FULL_RECOVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005
 	SP_NO_CASTCANCEL2,SP_NO_MISC_DAMAGE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR, SP_UNBREAKABLE_HELM, // 2006-2010
@@ -544,6 +548,7 @@ enum _sp {
 	SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY, SP_NO_WALK_DELAY, //2088-2092
 	SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE, SP_SHORT_ATK_RATE, SP_MAGIC_SUBSIZE, SP_CRIT_DEF_RATE, // 2093-2097
 	SP_MAGIC_SUBDEF_ELE, SP_REDUCE_DAMAGE_RETURN, SP_ADD_ITEM_SPHEAL_RATE, SP_ADD_ITEMGROUP_SPHEAL_RATE, // 2098-2101
+	SP_WEAPON_SUBSIZE // 2102
 };
 
 enum _look {

+ 38 - 2
src/map/mob.cpp

@@ -1437,7 +1437,7 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,t_tick tick)
 		// Distance with between slave and master is measured.
 		md->master_dist = distance_bl(&md->bl, bl);
 
-		if (battle_config.slave_stick_with_master) {
+		if (battle_config.slave_stick_with_master || md->special_state.ai == AI_ABR || md->special_state.ai == AI_BIONIC) {
 			// Since the master was in near immediately before, teleport is carried out and it pursues.
 			if (bl->m != md->bl.m || (old_dist < 10 && md->master_dist > 18) || md->master_dist > MAX_MINCHASE) {
 				md->master_dist = 0;
@@ -3056,7 +3056,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
 		//Emperium destroyed by script. Discard mvp character. [Skotlex]
 		mvp_sd = NULL;
 
-	rebirth =  ( md->sc.data[SC_KAIZEL] || (md->sc.data[SC_REBIRTH] && !md->state.rebirth) );
+	rebirth =  ( md->sc.data[SC_KAIZEL] || md->sc.data[SC_ULTIMATE_S] || (md->sc.data[SC_REBIRTH] && !md->state.rebirth) );
 	if( !rebirth ) { // Only trigger event on final kill
 		if( src ) {
 			switch( src->type ) { //allowed type
@@ -4509,6 +4509,32 @@ uint64 MobDatabase::parseBodyNode(const YAML::Node &node) {
 			mob->status.mdef = 0;
 	}
 
+	if (this->nodeExists(node, "Resistance")) {
+		uint16 res;
+
+		if (!this->asUInt16(node, "Resistance", res))
+			return 0;
+
+		mob->status.res = res;
+	}
+	else {
+		if (!exists)
+			mob->status.res = 0;
+	}
+
+	if (this->nodeExists(node, "MagicResistance")) {
+		uint16 mres;
+
+		if (!this->asUInt16(node, "MagicResistance", mres))
+			return 0;
+
+		mob->status.mres = mres;
+	}
+	else {
+		if (!exists)
+			mob->status.mres = 0;
+	}
+
 	if (this->nodeExists(node, "Str")) {
 		uint16 stat;
 
@@ -5140,6 +5166,13 @@ static bool mob_read_sqldb_sub(std::vector<std::string> str) {
 			node["Drops"][i] = drops;
 	}
 
+#ifdef RENEWAL
+	if (!str[++index].empty())
+		node["Resistance"] = std::stoi(str[index]);
+	if (!str[++index].empty())
+		node["MagicResistance"] = std::stoi(str[index]);
+#endif
+
 	return mob_db.parseBodyNode(node) > 0;
 }
 
@@ -5161,6 +5194,9 @@ static int mob_read_sqldb(void)
 			"`mode_canmove`,`mode_looter`,`mode_aggressive`,`mode_assist`,`mode_castsensoridle`,`mode_norandomwalk`,`mode_nocast`,`mode_canattack`,`mode_castsensorchase`,`mode_changechase`,`mode_angry`,`mode_changetargetmelee`,`mode_changetargetchase`,`mode_targetweak`,`mode_randomtarget`,`mode_ignoremelee`,`mode_ignoremagic`,`mode_ignoreranged`,`mode_mvp`,`mode_ignoremisc`,`mode_knockbackimmune`,`mode_teleportblock`,`mode_fixeditemdrop`,`mode_detector`,`mode_statusimmune`,`mode_skillimmune`,"
 			"`mvpdrop1_item`,`mvpdrop1_rate`,`mvpdrop1_option`,`mvpdrop1_index`,`mvpdrop2_item`,`mvpdrop2_rate`,`mvpdrop2_option`,`mvpdrop2_index`,`mvpdrop3_item`,`mvpdrop3_rate`,`mvpdrop3_option`,`mvpdrop3_index`,"
 			"`drop1_item`,`drop1_rate`,`drop1_nosteal`,`drop1_option`,`drop1_index`,`drop2_item`,`drop2_rate`,`drop2_nosteal`,`drop2_option`,`drop2_index`,`drop3_item`,`drop3_rate`,`drop3_nosteal`,`drop3_option`,`drop3_index`,`drop4_item`,`drop4_rate`,`drop4_nosteal`,`drop4_option`,`drop4_index`,`drop5_item`,`drop5_rate`,`drop5_nosteal`,`drop5_option`,`drop5_index`,`drop6_item`,`drop6_rate`,`drop6_nosteal`,`drop6_option`,`drop6_index`,`drop7_item`,`drop7_rate`,`drop7_nosteal`,`drop7_option`,`drop7_index`,`drop8_item`,`drop8_rate`,`drop8_nosteal`,`drop8_option`,`drop8_index`,`drop9_item`,`drop9_rate`,`drop9_nosteal`,`drop9_option`,`drop9_index`,`drop10_item`,`drop10_rate`,`drop10_nosteal`,`drop10_option`,`drop10_index`"
+#ifdef RENEWAL
+			",`resistance`,`magic_resistance`"
+#endif
 			" FROM `%s`", mob_db_name[fi]) ) {
 			Sql_ShowDebug(mmysql_handle);
 			continue;

+ 9 - 1
src/map/mob.hpp

@@ -74,6 +74,14 @@ enum MOBID {
 	MOBID_S_GIANT_HORNET,
 	MOBID_S_LUCIOLA_VESPA,
 	MOBID_GUILD_SKILL_FLAG	= 20269,
+	MOBID_ABR_BATTLE_WARIOR = 20834,
+	MOBID_ABR_DUAL_CANNON,
+	MOBID_ABR_MOTHER_NET,
+	MOBID_ABR_INFINITY,
+	MOBID_BIONIC_WOODENWARRIOR = 20848,
+	MOBID_BIONIC_WOODEN_FAIRY,
+	MOBID_BIONIC_CREEPER,
+	MOBID_BIONIC_HELLTREE,
 };
 
 ///Mob skill states.
@@ -265,7 +273,7 @@ private:
 	bool parseDropNode(std::string nodeName, YAML::Node node, uint8 max, s_mob_drop *drops);
 
 public:
-	MobDatabase() : TypesafeCachedYamlDatabase("MOB_DB", 2, 1) {
+	MobDatabase() : TypesafeCachedYamlDatabase("MOB_DB", 3, 1) {
 
 	}
 

+ 7 - 0
src/map/packets.hpp

@@ -159,6 +159,12 @@ struct PACKET_ZC_ACK_GUILDSTORAGE_LOG{
 	struct PACKET_ZC_ACK_GUILDSTORAGE_LOG_sub items[];
 } __attribute__((packed));
 
+struct PACKET_CZ_UNCONFIRMED_TSTATUS_UP{
+	int16 packetType;
+	int16 type;
+	int16 amount;
+} __attribute__((packed));
+
 struct PACKET_CZ_GUILD_EMBLEM_CHANGE2 {
 	int16 packetType;
 	uint32 guild_id;
@@ -265,6 +271,7 @@ DEFINE_PACKET_HEADER(ZC_ACK_GUILDSTORAGE_LOG, 0x9da)
 DEFINE_PACKET_HEADER(CZ_NPC_MARKET_PURCHASE, 0x9d6)
 DEFINE_PACKET_HEADER(CZ_REQ_APPLY_BARGAIN_SALE_ITEM2, 0xa3d)
 DEFINE_PACKET_HEADER(ZC_REMOVE_EFFECT, 0x0b0d)
+DEFINE_PACKET_HEADER(CZ_UNCONFIRMED_TSTATUS_UP, 0x0b24)
 DEFINE_PACKET_HEADER(CZ_GUILD_EMBLEM_CHANGE2, 0x0b46)
 DEFINE_PACKET_HEADER(ZC_UNCONFIRMED_SPIRITS3, 0xb73)
 

+ 3 - 0
src/map/party.cpp

@@ -242,18 +242,21 @@ static void party_check_state(struct party_data *p)
 			case JOB_SURA:
 			case JOB_SURA_T:
 			case JOB_BABY_SURA:
+			case JOB_INQUISITOR:
 				p->state.monk = 1;
 			break;
 			case JOB_STAR_GLADIATOR:
 			case JOB_BABY_STAR_GLADIATOR:
 			case JOB_STAR_EMPEROR:
 			case JOB_BABY_STAR_EMPEROR:
+			case JOB_SKY_EMPEROR:
 				p->state.sg = 1;
 			break;
 			case JOB_SUPER_NOVICE:
 			case JOB_SUPER_BABY:
 			case JOB_SUPER_NOVICE_E:
 			case JOB_SUPER_BABY_E:
+			case JOB_HYPER_NOVICE:
 				p->state.snovice = 1;
 			break;
 			case JOB_TAEKWON:

文件差異過大導致無法顯示
+ 529 - 92
src/map/pc.cpp


+ 36 - 13
src/map/pc.hpp

@@ -40,6 +40,9 @@ enum sc_type : int16;
 #define MAX_SOUL_BALL 20 /// Max soul ball
 #define MAX_STELLAR_MARKS 5 /// Max stellar marks
 #define MAX_UNITED_SOULS 12 /// Max united souls
+#define MAX_SERVANTBALL 5 /// Max servant weapons
+#define MAX_SERVANT_SIGN 5 /// Max servant signs
+#define MAX_ABYSSBALL 5 /// Max abyss spheres
 
 #define LANGTYPE_VAR "#langtype"
 #define CASHPOINT_VAR "#CASHPOINTS"
@@ -52,6 +55,7 @@ enum sc_type : int16;
 #define PCDIECOUNTER_VAR "PC_DIE_COUNTER"
 #define JOBCHANGE2ND_VAR "jobchange_level"
 #define JOBCHANGE3RD_VAR "jobchange_level_3rd"
+#define JOBCHANGE4TH_VAR "jobchange_level_4th"
 #define TKMISSIONID_VAR "TK_MISSION_ID"
 #define TKMISSIONCOUNT_VAR "TK_MISSION_COUNT"
 #define ATTENDANCE_DATE_VAR "#AttendanceDate"
@@ -449,6 +453,7 @@ struct map_session_data {
 	bool skillitem_keep_requirement;
 	uint16 skill_id_old,skill_lv_old;
 	uint16 skill_id_dance,skill_lv_dance;
+	uint16 skill_id_song, skill_lv_song;
 	short cook_mastery; // range: [0,1999] [Inkfish]
 	struct skill_cooldown_entry * scd[MAX_SKILLCOOLDOWN]; // Skill Cooldown
 	uint16 cloneskill_idx, ///Stores index of copied skill by Intimidate/Plagiarism
@@ -503,6 +508,7 @@ struct map_session_data {
 		int magic_addclass[CLASS_MAX];
 		int magic_addsize[SZ_MAX];
 		int magic_atk_ele[ELE_MAX];
+		int weapon_subsize[SZ_MAX];
 		int magic_subsize[SZ_MAX];
 		int critaddrace[RC_MAX];
 		int expaddrace[RC_MAX];
@@ -549,7 +555,7 @@ struct map_session_data {
 
 	// zeroed vars start here.
 	struct s_bonus {
-		int hp, sp;
+		int hp, sp, ap;
 		int atk_rate;
 		int arrow_atk,arrow_ele,arrow_cri,arrow_hit;
 		int nsshealhp,nsshealsp;
@@ -594,10 +600,11 @@ struct map_session_data {
 	} bonus;
 	// zeroed vars end here.
 
-	int castrate,hprate,sprate,dsprate;
+	int castrate,hprate,sprate,aprate,dsprate;
 	int hprecov_rate,sprecov_rate;
 	int matk_rate;
 	int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_rate;
+	int patk_rate,smatk_rate,res_rate,mres_rate,hplus_rate,crate_rate;
 
 	t_itemid itemid;
 	short itemindex;	//Used item's index in sd->inventory [Skotlex]
@@ -610,6 +617,8 @@ struct map_session_data {
 	int spiritcharm_type; //Spirit type
 	int spiritcharm_timer[MAX_SPIRITCHARM];
 	int8 soulball, soulball_old;
+	int8 servantball, servantball_old;
+	int8 abyssball, abyssball_old;
 
 	unsigned char potion_success_counter; //Potion successes in row counter
 	unsigned char mission_count; //Stores the bounty kill count for TK_MISSION
@@ -618,6 +627,7 @@ struct map_session_data {
 	int devotion[MAX_DEVOTION]; //Stores the account IDs of chars devoted to.
 	int stellar_mark[MAX_STELLAR_MARKS]; // Stores the account ID's of character's with a stellar mark.
 	int united_soul[MAX_UNITED_SOULS]; // Stores the account ID's of character's who's soul is united.
+	int servant_sign[MAX_SERVANT_SIGN]; // Stores the account ID's of character's with a servant sign.
 
 	int trade_partner;
 	struct s_deal {
@@ -676,6 +686,7 @@ struct map_session_data {
 
 	uint16 change_level_2nd; // job level when changing from 1st to 2nd class [jobchange_level in global_reg_value]
 	uint16 change_level_3rd; // job level when changing from 2nd to 3rd class [jobchange_level_3rd in global_reg_value]
+	uint16 change_level_4th; // job level when changing from 3rd to 4th class [jobchange_level_4rd in global_reg_value]
 
 	char fakename[NAME_LENGTH]; // fake names [Valaris]
 
@@ -1110,7 +1121,8 @@ enum e_mado_type : uint16 {
 	( (class_) >= JOB_BABY_STAR_GLADIATOR2	&& (class_) <= JOB_BABY_STAR_EMPEROR2 ) || \
 	( (class_) >= JOB_DRAGON_KNIGHT			&& (class_) <= JOB_TROUVERE       ) || \
 	( (class_) >= JOB_WINDHAWK2				&& (class_) <= JOB_IMPERIAL_GUARD2 ) || \
-	( (class_) >= JOB_SKY_EMPEROR			&& (class_) <= JOB_SPIRIT_HANDLER ) \
+	( (class_) >= JOB_SKY_EMPEROR			&& (class_) <= JOB_SPIRIT_HANDLER ) || \
+	  (class_) == JOB_SKY_EMPEROR2 \
 )
 #define pcdb_checkid(class_) pcdb_checkid_sub((unsigned int)class_)
 
@@ -1168,24 +1180,26 @@ public:
 
 extern AttendanceDatabase attendance_db;
 
-class PlayerStatPointDatabase : public YamlDatabase {
-private:
-	std::unordered_map<uint16, uint32> statpoint_table;
+struct s_statpoint_entry{
+	uint16 level;
+	uint32 statpoints;
+	uint32 traitpoints;
+};
 
+class PlayerStatPointDatabase : public TypesafeCachedYamlDatabase<uint16, s_statpoint_entry>{
 public:
-	PlayerStatPointDatabase() : YamlDatabase("STATPOINT_DB", 1) {
+	PlayerStatPointDatabase() : TypesafeCachedYamlDatabase("STATPOINT_DB", 2, 1) {
 
 	}
 
-	void clear(){
-		statpoint_table.clear();
-	}
 	const std::string getDefaultLocation();
 	uint64 parseBodyNode(const YAML::Node& node);
 	void loadingFinished();
 
 	uint32 pc_gets_status_point(uint16 level);
 	uint32 get_table_point(uint16 level);
+	uint32 pc_gets_trait_point(uint16 level);
+	uint32 get_trait_table_point(uint16 level);
 };
 
 extern PlayerStatPointDatabase statpoint_db;
@@ -1229,6 +1243,7 @@ void pc_setinventorydata(struct map_session_data *sd);
 int pc_get_skillcooldown(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
 uint8 pc_checkskill(struct map_session_data *sd,uint16 skill_id);
 uint8 pc_checkskill_summoner(map_session_data *sd, e_summoner_power_type type);
+uint8 pc_checkskill_imperial_guard(struct map_session_data *sd, short flag);
 short pc_checkequip(struct map_session_data *sd,int pos,bool checkall=false);
 bool pc_checkequip2(struct map_session_data *sd, t_itemid nameid, int min, int max);
 
@@ -1339,6 +1354,10 @@ bool pc_statusup(struct map_session_data*,int,int);
 int pc_statusup2(struct map_session_data*,int,int);
 int pc_getstat(map_session_data *sd, int type);
 int pc_setstat(struct map_session_data* sd, int type, int val);
+int pc_need_trait_point(struct map_session_data *, int, int);
+int pc_maxtraitparameterincrease(struct map_session_data*, int);
+bool pc_traitstatusup(struct map_session_data*, int, int);
+int pc_traitstatusup2(struct map_session_data*, int, int);
 void pc_skillup(struct map_session_data*,uint16 skill_id);
 int pc_allskillup(struct map_session_data*);
 int pc_resetlvl(struct map_session_data*,int type);
@@ -1359,11 +1378,11 @@ int pc_sub_skillatk_bonus(struct map_session_data *sd, uint16 skill_id);
 int pc_skillheal_bonus(struct map_session_data *sd, uint16 skill_id);
 int pc_skillheal2_bonus(struct map_session_data *sd, uint16 skill_id);
 
-void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int hp, unsigned int sp);
+void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int hp, unsigned int sp, unsigned int ap);
 int pc_dead(struct map_session_data *sd,struct block_list *src);
-void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp);
+void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp, unsigned int ap = 0);
 bool pc_revive_item(struct map_session_data *sd);
-void pc_heal(struct map_session_data *sd,unsigned int hp,unsigned int sp, int type);
+void pc_heal(struct map_session_data *sd,unsigned int hp,unsigned int sp, unsigned int ap, int type);
 int pc_itemheal(struct map_session_data *sd, t_itemid itemid, int hp,int sp);
 int pc_percentheal(struct map_session_data *sd,int,int);
 bool pc_jobchange(struct map_session_data *sd, int job, char upper);
@@ -1479,6 +1498,10 @@ void pc_addspiritball(struct map_session_data *sd,int interval,int max);
 void pc_delspiritball(struct map_session_data *sd,int count,int type);
 int pc_addsoulball(map_session_data *sd, int max);
 int pc_delsoulball(map_session_data *sd, int count, bool type);
+void pc_addservantball( struct map_session_data& sd, int count = 1 );
+void pc_delservantball( struct map_session_data& sd, int count = 1 );
+void pc_addabyssball( struct map_session_data& sd, int count = 1 );
+void pc_delabyssball( struct map_session_data& sd, int count = 1 );
 
 void pc_addfame(struct map_session_data *sd,int count);
 unsigned char pc_famerank(uint32 char_id, int job);

+ 75 - 0
src/map/script.cpp

@@ -9583,6 +9583,50 @@ BUILDIN_FUNC(statusup2)
 	return SCRIPT_CMD_SUCCESS;
 }
 
+/**
+* traitstatusup <stat>{,<char_id>};
+**/
+BUILDIN_FUNC(traitstatusup)
+{
+	struct map_session_data *sd;
+
+	if (!script_charid2sd(3, sd))
+		return SCRIPT_CMD_FAILURE;
+
+	int type = script_getnum( st, 2 );
+
+	if( type < SP_POW || type > SP_CRT ){
+		ShowError( "buildin_traitstatusup: Unknown trait type %d\n", type );
+		return SCRIPT_CMD_FAILURE;
+	}
+
+	pc_traitstatusup( sd, type, 1 );
+
+	return SCRIPT_CMD_SUCCESS;
+}
+
+/**
+* traitstatusup2 <stat>,<amount>{,<char_id>};
+**/
+BUILDIN_FUNC(traitstatusup2)
+{
+	struct map_session_data *sd;
+
+	if (!script_charid2sd(4, sd))
+		return SCRIPT_CMD_FAILURE;
+
+	int type = script_getnum( st, 2 );
+
+	if( type < SP_POW || type > SP_CRT ){
+		ShowError( "buildin_traitstatusup2: Unknown trait type %d\n", type );
+		return SCRIPT_CMD_FAILURE;
+	}
+
+	pc_traitstatusup2( sd, type, script_getnum( st, 3 ) );
+
+	return SCRIPT_CMD_SUCCESS;
+}
+
 /// See 'doc/item_bonus.txt'
 ///
 /// bonus <bonus type>,<val1>;
@@ -17842,6 +17886,8 @@ BUILDIN_FUNC(getmonsterinfo)
 		case MOB_ATK2:		script_pushint(st,mob->status.rhw.atk2); break;
 		case MOB_DEF:		script_pushint(st,mob->status.def); break;
 		case MOB_MDEF:		script_pushint(st,mob->status.mdef); break;
+		case MOB_RES:		script_pushint(st, mob->status.res); break;
+		case MOB_MRES:		script_pushint(st, mob->status.mres); break;
 		case MOB_STR:		script_pushint(st,mob->status.str); break;
 		case MOB_AGI:		script_pushint(st,mob->status.agi); break;
 		case MOB_VIT:		script_pushint(st,mob->status.vit); break;
@@ -18267,6 +18313,8 @@ BUILDIN_FUNC(getunitdata)
 			getunitdata_sub(UMOB_BODY2, md->vd->body_style);
 			getunitdata_sub(UMOB_GROUP_ID, md->ud.group_id);
 			getunitdata_sub(UMOB_IGNORE_CELL_STACK_LIMIT, md->ud.state.ignore_cell_stack_limit);
+			getunitdata_sub(UMOB_RES, md->status.res);
+			getunitdata_sub(UMOB_MRES, md->status.mres);
 			break;
 
 		case BL_HOM:
@@ -18672,6 +18720,8 @@ BUILDIN_FUNC(setunitdata)
 			case UMOB_BODY2: clif_changelook(bl, LOOK_BODY2, (unsigned short)value); break;
 			case UMOB_GROUP_ID: md->ud.group_id = value; unit_refresh(bl); break;
 			case UMOB_IGNORE_CELL_STACK_LIMIT: md->ud.state.ignore_cell_stack_limit = value > 0; break;
+			case UMOB_RES: md->base_status->res = (short)value; calc_status = true; break;
+			case UMOB_MRES: md->base_status->mres = (short)value; calc_status = true; break;
 			default:
 				ShowError("buildin_setunitdata: Unknown data identifier %d for BL_MOB.\n", type);
 				return SCRIPT_CMD_FAILURE;
@@ -23863,6 +23913,28 @@ BUILDIN_FUNC(needed_status_point) {
 	return SCRIPT_CMD_SUCCESS;
 }
 
+/// Returns the number of trait stat points needed to change the specified trait stat by val.
+/// If val is negative, returns the number of trait stat points that would be needed to
+/// raise the specified trait stat from (current value - val) to current value.
+/// *needed_trait_point(<type>,<val>{,<char id>});
+BUILDIN_FUNC(needed_trait_point) {
+	struct map_session_data *sd;
+
+	if (!script_charid2sd(4, sd))
+		return SCRIPT_CMD_FAILURE;
+
+	int type = script_getnum( st, 2 );
+
+	if( type < SP_POW || type > SP_CRT ){
+		ShowError( "buildin_needed_trait_point: Unknown trait type %d\n", type );
+		return SCRIPT_CMD_FAILURE;
+	}
+
+	script_pushint( st, pc_need_trait_point( sd, type, script_getnum( st, 3 ) ) );
+
+	return SCRIPT_CMD_SUCCESS;
+}
+
 /**
  * jobcanentermap("<mapname>"{,<JobID>});
  * Check if (player with) JobID can enter the map.
@@ -25664,6 +25736,8 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(downrefitem,"i??"),
 	BUILDIN_DEF(statusup,"i?"),
 	BUILDIN_DEF(statusup2,"ii?"),
+	BUILDIN_DEF(traitstatusup,"i?"),
+	BUILDIN_DEF(traitstatusup2,"ii?"),
 	BUILDIN_DEF(bonus,"i?"),
 	BUILDIN_DEF2(bonus,"bonus2","ivi"),
 	BUILDIN_DEF2(bonus,"bonus3","ivii"),
@@ -26146,6 +26220,7 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(getequiprandomoption, "iii?"),
 	BUILDIN_DEF(setrandomoption,"iiiii?"),
 	BUILDIN_DEF(needed_status_point,"ii?"),
+	BUILDIN_DEF(needed_trait_point, "ii?"),
 	BUILDIN_DEF(jobcanentermap,"s?"),
 	BUILDIN_DEF(openstorage2,"ii?"),
 	BUILDIN_DEF(unloadnpc, "s"),

+ 4 - 0
src/map/script.hpp

@@ -356,6 +356,8 @@ enum monsterinfo_types {
 	MOB_ATK2,
 	MOB_DEF,
 	MOB_MDEF,
+	MOB_RES,
+	MOB_MRES,
 	MOB_STR,
 	MOB_AGI,
 	MOB_VIT,
@@ -481,6 +483,8 @@ enum unitdata_mobtypes {
 	UMOB_BODY2,
 	UMOB_GROUP_ID,
 	UMOB_IGNORE_CELL_STACK_LIMIT,
+	UMOB_RES,
+	UMOB_MRES,
 };
 
 enum unitdata_homuntypes {

+ 160 - 1
src/map/script_constants.hpp

@@ -256,6 +256,8 @@
 	export_constant(JOB_HYPER_NOVICE);
 	export_constant(JOB_SPIRIT_HANDLER);
 
+	export_constant(JOB_SKY_EMPEROR2);
+
 	/* EA jobs */
 	export_constant2("EAJL_2_1",JOBL_2_1);
 	export_constant2("EAJL_2_2",JOBL_2_2);
@@ -263,10 +265,12 @@
 	export_constant2("EAJL_UPPER",JOBL_UPPER);
 	export_constant2("EAJL_BABY",JOBL_BABY);
 	export_constant2("EAJL_THIRD",JOBL_THIRD);
+	export_constant2("EAJL_FOURTH",JOBL_FOURTH);
 
 	export_constant2("EAJ_BASEMASK",MAPID_BASEMASK);
 	export_constant2("EAJ_UPPERMASK",MAPID_UPPERMASK);
 	export_constant2("EAJ_THIRDMASK",MAPID_THIRDMASK);
+	export_constant2("EAJ_FOURTHMASK",MAPID_FOURTHMASK);
 
 	export_constant2("EAJ_NOVICE",MAPID_NOVICE);
 	export_constant2("EAJ_SWORDMAN",MAPID_SWORDMAN);
@@ -603,6 +607,7 @@
 
 	export_constant2("bMaxHP",SP_MAXHP);
 	export_constant2("bMaxSP",SP_MAXSP);
+	export_constant2("bMaxAP",SP_MAXAP);
 	export_constant2("bStr",SP_STR);
 	export_constant2("bAgi",SP_AGI);
 	export_constant2("bVit",SP_VIT);
@@ -696,6 +701,12 @@
 	export_constant2("bDef2Rate",SP_DEF2_RATE);
 	export_constant2("bMdefRate",SP_MDEF_RATE);
 	export_constant2("bMdef2Rate",SP_MDEF2_RATE);
+	export_constant2("bPAtkRate", SP_PATK_RATE);
+	export_constant2("bSMatkRate", SP_SMATK_RATE);
+	export_constant2("bResRate", SP_RES_RATE);
+	export_constant2("bMResRate", SP_MRES_RATE);
+	export_constant2("bHPlusRate", SP_HPLUS_RATE);
+	export_constant2("bCRateRate", SP_CRATE_RATE);
 	export_constant2("bSplashRange",SP_SPLASH_RANGE);
 	export_constant2("bSplashAddRange",SP_SPLASH_ADD_RANGE);
 	export_constant2("bAutoSpell",SP_AUTOSPELL);
@@ -711,6 +722,7 @@
 	export_constant2("bAddStealRate",SP_ADD_STEAL_RATE);
 	export_constant2("bMagicDamageReturn",SP_MAGIC_DAMAGE_RETURN);
 	export_constant2("bAllStats",SP_ALL_STATS);
+	export_constant2("bAllTraitStats", SP_ALL_TRAIT_STATS);
 	export_constant2("bAgiVit",SP_AGI_VIT);
 	export_constant2("bAgiDexStr",SP_AGI_DEX_STR);
 	export_constant2("bPerfectHide",SP_PERFECT_HIDE);
@@ -1698,6 +1710,119 @@
 	export_constant(SC_WIDEWEB);
 	export_constant(SC_BURNT);
 	export_constant(SC_CHILL);
+	export_constant(SC_HANDICAPSTATE_DEEPBLIND);
+	export_constant(SC_HANDICAPSTATE_DEEPSILENCE);
+	export_constant(SC_HANDICAPSTATE_LASSITUDE);
+	export_constant(SC_HANDICAPSTATE_FROSTBITE);
+	export_constant(SC_HANDICAPSTATE_SWOONING);
+	export_constant(SC_HANDICAPSTATE_LIGHTNINGSTRIKE);
+	export_constant(SC_HANDICAPSTATE_CRYSTALLIZATION);
+	export_constant(SC_HANDICAPSTATE_CONFLAGRATION);
+	export_constant(SC_HANDICAPSTATE_MISFORTUNE);
+	export_constant(SC_HANDICAPSTATE_DEADLYPOISON);
+	export_constant(SC_HANDICAPSTATE_DEPRESSION);
+	export_constant(SC_HANDICAPSTATE_HOLYFLAME);
+	export_constant(SC_SERVANTWEAPON);
+	export_constant(SC_SERVANT_SIGN);
+	export_constant(SC_CHARGINGPIERCE);
+	export_constant(SC_CHARGINGPIERCE_COUNT);
+	export_constant(SC_DRAGONIC_AURA);
+	export_constant(SC_VIGOR);
+	export_constant(SC_DEADLY_DEFEASANCE);
+	export_constant(SC_CLIMAX_DES_HU);
+	export_constant(SC_CLIMAX);
+	export_constant(SC_CLIMAX_EARTH);
+	export_constant(SC_CLIMAX_BLOOM);
+	export_constant(SC_CLIMAX_CRYIMP);
+	export_constant(SC_WINDSIGN);
+	export_constant(SC_CRESCIVEBOLT);
+	export_constant(SC_CALAMITYGALE);
+	export_constant(SC_MEDIALE);
+	export_constant(SC_A_VITA);
+	export_constant(SC_A_TELUM);
+	export_constant(SC_PRE_ACIES);
+	export_constant(SC_COMPETENTIA);
+	export_constant(SC_RELIGIO);
+	export_constant(SC_BENEDICTUM);
+	export_constant(SC_AXE_STOMP);
+	export_constant(SC_A_MACHINE);
+	export_constant(SC_D_MACHINE);
+	export_constant(SC_ABR_BATTLE_WARIOR);
+	export_constant(SC_ABR_DUAL_CANNON);
+	export_constant(SC_ABR_MOTHER_NET);
+	export_constant(SC_ABR_INFINITY);
+	export_constant(SC_SHADOW_EXCEED);
+	export_constant(SC_DANCING_KNIFE);
+	export_constant(SC_POTENT_VENOM);
+	export_constant(SC_SHADOW_SCAR);
+	export_constant(SC_E_SLASH_COUNT);
+	export_constant(SC_SHADOW_WEAPON);
+	export_constant(SC_GUARD_STANCE);
+	export_constant(SC_ATTACK_STANCE);
+	export_constant(SC_GUARDIAN_S);
+	export_constant(SC_REBOUND_S);
+	export_constant(SC_HOLY_S);
+	export_constant(SC_ULTIMATE_S);
+	export_constant(SC_SPEAR_SCAR);
+	export_constant(SC_SHIELD_POWER);
+	export_constant(SC_SPELL_ENCHANTING);
+	export_constant(SC_SUMMON_ELEMENTAL_ARDOR);
+	export_constant(SC_SUMMON_ELEMENTAL_DILUVIO);
+	export_constant(SC_SUMMON_ELEMENTAL_PROCELLA);
+	export_constant(SC_SUMMON_ELEMENTAL_TERREMOTUS);
+	export_constant(SC_SUMMON_ELEMENTAL_SERPENS);
+	export_constant(SC_ELEMENTAL_VEIL);
+	export_constant(SC_MYSTIC_SYMPHONY);
+	export_constant(SC_KVASIR_SONATA);
+	export_constant(SC_SOUNDBLEND);
+	export_constant(SC_GEF_NOCTURN);
+	export_constant(SC_AIN_RHAPSODY);
+	export_constant(SC_MUSICAL_INTERLUDE);
+	export_constant(SC_JAWAII_SERENADE);
+	export_constant(SC_PRON_MARCH);
+	export_constant(SC_ROSEBLOSSOM);
+	export_constant(SC_POWERFUL_FAITH);
+	export_constant(SC_SINCERE_FAITH);
+	export_constant(SC_FIRM_FAITH);
+	export_constant(SC_HOLY_OIL);
+	export_constant(SC_FIRST_BRAND);
+	export_constant(SC_SECOND_BRAND);
+	export_constant(SC_SECOND_JUDGE);
+	export_constant(SC_THIRD_EXOR_FLAME);
+	export_constant(SC_FIRST_FAITH_POWER);
+	export_constant(SC_MASSIVE_F_BLASTER);
+	export_constant(SC_PROTECTSHADOWEQUIP);
+	export_constant(SC_RESEARCHREPORT);
+	export_constant(SC_BO_HELL_DUSTY);
+	export_constant(SC_BIONIC_WOODENWARRIOR);
+	export_constant(SC_BIONIC_WOODEN_FAIRY);
+	export_constant(SC_BIONIC_CREEPER);
+	export_constant(SC_BIONIC_HELLTREE);
+	export_constant(SC_SHADOW_STRIP);
+	export_constant(SC_ABYSS_DAGGER);
+	export_constant(SC_ABYSSFORCEWEAPON);
+	export_constant(SC_ABYSS_SLAYER);
+	export_constant(SC_FLAMETECHNIC);
+	export_constant(SC_FLAMETECHNIC_OPTION);
+	export_constant(SC_FLAMEARMOR);
+	export_constant(SC_FLAMEARMOR_OPTION);
+	export_constant(SC_COLD_FORCE);
+	export_constant(SC_COLD_FORCE_OPTION);
+	export_constant(SC_CRYSTAL_ARMOR);
+	export_constant(SC_CRYSTAL_ARMOR_OPTION);
+	export_constant(SC_GRACE_BREEZE);
+	export_constant(SC_GRACE_BREEZE_OPTION);
+	export_constant(SC_EYES_OF_STORM);
+	export_constant(SC_EYES_OF_STORM_OPTION);
+	export_constant(SC_EARTH_CARE);
+	export_constant(SC_EARTH_CARE_OPTION);
+	export_constant(SC_STRONG_PROTECTION);
+	export_constant(SC_STRONG_PROTECTION_OPTION);
+	export_constant(SC_DEEP_POISONING);
+	export_constant(SC_DEEP_POISONING_OPTION);
+	export_constant(SC_POISON_SHIELD);
+	export_constant(SC_POISON_SHIELD_OPTION);
+
 #ifdef RENEWAL
 	export_constant(SC_EXTREMITYFIST2);
 #endif
@@ -3967,6 +4092,8 @@
 	export_constant(AI_FAW);
 	export_constant(AI_GUILD);
 	export_constant(AI_WAVEMODE);
+	export_constant(AI_ABR);
+	export_constant(AI_BIONIC);
 
 	/* battle flags */
 	export_constant(BF_NONE);
@@ -4294,6 +4421,8 @@
 	export_constant(MOB_ATK2);
 	export_constant(MOB_DEF);
 	export_constant(MOB_MDEF);
+	export_constant(MOB_RES);
+	export_constant(MOB_MRES);
 	export_constant(MOB_STR);
 	export_constant(MOB_AGI);
 	export_constant(MOB_VIT);
@@ -4506,6 +4635,8 @@
 	export_constant(UMOB_BODY2);
 	export_constant(UMOB_GROUP_ID);
 	export_constant(UMOB_IGNORE_CELL_STACK_LIMIT);
+	export_constant(UMOB_RES);
+	export_constant(UMOB_MRES);
 
 	/* unit control - homunculus */
 	export_constant(UHOM_SIZE);
@@ -8113,6 +8244,8 @@
 	export_constant(SKILL_REQ_SPIRITSPHERECOST);
 	export_constant(SKILL_REQ_ITEMCOST);
 	export_constant(SKILL_REQ_EQUIPMENT);
+	export_constant(SKILL_REQ_APCOST);
+	export_constant(SKILL_REQ_APRATECOST);
 
 	/* skill require state */
 	export_constant(ST_NONE);
@@ -8302,6 +8435,32 @@
 	export_constant(UNT_CATNIPPOWDER);
 	export_constant(UNT_NYANGGRASS);
 	export_constant(UNT_CREATINGSTAR);
+	export_constant(UNT_DUMMY_0);
+	export_constant(UNT_RAIN_OF_CRYSTAL);
+	export_constant(UNT_MYSTERY_ILLUSION);
+	export_constant(UNT_UNKNOWN_1);
+	export_constant(UNT_STRANTUM_TREMOR);
+	export_constant(UNT_VIOLENT_QUAKE);
+	export_constant(UNT_ALL_BLOOM);
+	export_constant(UNT_TORNADO_STORM);
+	export_constant(UNT_FLORAL_FLARE_ROAD);
+	export_constant(UNT_ASTRAL_STRIKE);
+	export_constant(UNT_CROSS_RAIN);
+	export_constant(UNT_PNEUMATICUS_PROCELLA);
+	export_constant(UNT_ABYSS_SQUARE);
+	export_constant(UNT_ACIDIFIED_ZONE_WATER);
+	export_constant(UNT_ACIDIFIED_ZONE_GROUND);
+	export_constant(UNT_ACIDIFIED_ZONE_WIND);
+	export_constant(UNT_ACIDIFIED_ZONE_FIRE);
+	export_constant(UNT_LIGHTNING_LAND);
+	export_constant(UNT_VENOM_SWAMP);
+	export_constant(UNT_CONFLAGRATION);
+
+	export_constant(UNT_DEEPBLINDTRAP);
+	export_constant(UNT_SOLIDTRAP);
+	export_constant(UNT_SWIFTTRAP);
+	export_constant(UNT_FLAMETRAP);
+
 	export_constant(UNT_GD_LEADERSHIP);
 	export_constant(UNT_GD_GLORYWOUNDS);
 	export_constant(UNT_GD_SOULCOLD);
@@ -8323,10 +8482,10 @@
 	export_constant(ITEMJ_THIRD);
 	export_constant(ITEMJ_THIRD_UPPER);
 	export_constant(ITEMJ_THIRD_BABY);
+	export_constant(ITEMJ_FOURTH);
 	export_constant(ITEMJ_ALL_UPPER);
 	export_constant(ITEMJ_ALL_BABY);
 	export_constant(ITEMJ_ALL_THIRD);
-	export_constant(ITEMJ_FOURTH);
 
 	/* item drop effects */
 	export_constant(DROPEFFECT_NONE);

文件差異過大導致無法顯示
+ 685 - 25
src/map/skill.cpp


+ 270 - 3
src/map/skill.hpp

@@ -27,7 +27,7 @@ struct skill_unit;
 struct s_skill_unit_group;
 struct status_change_entry;
 
-#define MAX_SKILL_PRODUCE_DB	282 /// Max Produce DB
+#define MAX_SKILL_PRODUCE_DB	300 /// Max Produce DB
 #define MAX_PRODUCE_RESOURCE	12 /// Max Produce requirements
 #define MAX_SKILL_LEVEL 13 /// Max Skill Level (for skill_db storage)
 #define MAX_MOBSKILL_LEVEL 100	/// Max monster skill level (on skill usage)
@@ -125,6 +125,8 @@ enum e_skill_require : uint16 {
 	SKILL_REQ_SPIRITSPHERECOST = 0x400,
 	SKILL_REQ_ITEMCOST = 0x800,
 	SKILL_REQ_EQUIPMENT = 0x1000,
+	SKILL_REQ_APCOST = 0x2000,
+	SKILL_REQ_APRATECOST = 0x4000,
 };
 
 /// Constants for skill cast near NPC.
@@ -197,8 +199,10 @@ struct s_skill_condition {
 	int32 hp;								///< HP cost
 	int32 mhp;								///< Max HP to trigger
 	int32 sp;								/// SP cost
+	int32 ap;								/// AP cost
 	int32 hp_rate;							/// HP cost (%)
 	int32 sp_rate;							/// SP cost (%)
+	int32 ap_rate;							/// AP cost (%)
 	int32 zeny;								/// Zeny cost
 	int32 weapon;							/// Weapon type. Combined bitmask of enum weapon_type (1<<weapon)
 	int32 ammo;								/// Ammo type. Combine bitmask of enum ammo_type (1<<ammo)
@@ -216,8 +220,10 @@ struct s_skill_require {
 	int32 hp[MAX_SKILL_LEVEL];				///< HP cost
 	int32 mhp[MAX_SKILL_LEVEL];				///< Max HP to trigger
 	int32 sp[MAX_SKILL_LEVEL];				/// SP cost
+	int32 ap[MAX_SKILL_LEVEL];				/// AP cost
 	int32 hp_rate[MAX_SKILL_LEVEL];			/// HP cost (%)
 	int32 sp_rate[MAX_SKILL_LEVEL];			/// SP cost (%)
+	int32 ap_rate[MAX_SKILL_LEVEL];			/// AP cost (%)
 	int32 zeny[MAX_SKILL_LEVEL];			/// Zeny cost
 	int32 weapon;							/// Weapon type. Combined bitmask of enum weapon_type (1<<weapon)
 	int32 ammo;								/// Ammo type. Combine bitmask of enum ammo_type (1<<ammo)
@@ -268,6 +274,8 @@ struct s_skill_db {
 	// skill_nocast_db.txt
 	uint32 nocast;								///< Skill cannot be casted at this zone
 
+	int32 giveap[MAX_SKILL_LEVEL];				///< AP Given On Use
+
 	uint16 unit_id;								///< Unit ID. @see enum e_skill_unit_id
 	uint16 unit_id2;							///< Alternate unit ID. @see enum e_skill_unit_id
 	int32 unit_layout_type[MAX_SKILL_LEVEL];	///< Layout type. -1 is special layout, others are square with lenght*width: (val*2+1)^2
@@ -301,7 +309,7 @@ struct s_skill_db {
 
 class SkillDatabase : public TypesafeCachedYamlDatabase <uint16, s_skill_db> {
 public:
-	SkillDatabase() : TypesafeCachedYamlDatabase("SKILL_DB", 2, 1) {
+	SkillDatabase() : TypesafeCachedYamlDatabase("SKILL_DB", 3, 1) {
 
 	}
 
@@ -517,6 +525,7 @@ int skill_get_castcancel( uint16 skill_id );
 int skill_get_maxcount( uint16 skill_id ,uint16 skill_lv );
 int skill_get_blewcount( uint16 skill_id ,uint16 skill_lv );
 int skill_get_cooldown( uint16 skill_id, uint16 skill_lv );
+int skill_get_giveap( uint16 skill_id, uint16 skill_lv );
 int skill_get_unit_target( uint16 skill_id );
 #define skill_get_nk(skill_id, nk) skill_get_nk_(skill_id, { nk })
 bool skill_get_nk_(uint16 skill_id, std::vector<e_skill_nk> nk);
@@ -529,9 +538,11 @@ int skill_get_unit_range(uint16 skill_id, uint16 skill_lv);
 int skill_get_hp( uint16 skill_id ,uint16 skill_lv );
 int skill_get_mhp( uint16 skill_id ,uint16 skill_lv );
 int skill_get_sp( uint16 skill_id ,uint16 skill_lv );
+int skill_get_ap( uint16 skill_id, uint16 skill_lv );
 int skill_get_status_count( uint16 skill_id );
 int skill_get_hp_rate( uint16 skill_id, uint16 skill_lv );
 int skill_get_sp_rate( uint16 skill_id, uint16 skill_lv );
+int skill_get_ap_rate( uint16 skill_id, uint16 skill_lv );
 int skill_get_zeny( uint16 skill_id ,uint16 skill_lv );
 int skill_get_weapontype( uint16 skill_id );
 int skill_get_ammotype( uint16 skill_id );
@@ -1983,6 +1994,213 @@ enum e_skill {
 	NV_TRANSCENDENCE,
 	WL_READING_SB_READING,
 
+	DK_SERVANTWEAPON = 5201,
+	DK_SERVANTWEAPON_ATK,
+	DK_SERVANT_W_SIGN,
+	DK_SERVANT_W_PHANTOM,
+	DK_SERVANT_W_DEMOL,
+	DK_CHARGINGPIERCE,
+	DK_TWOHANDDEF,
+	DK_HACKANDSLASHER,
+	DK_HACKANDSLASHER_ATK,
+	DK_DRAGONIC_AURA,
+	DK_MADNESS_CRUSHER,
+	DK_VIGOR,
+	DK_STORMSLASH,
+
+	AG_DEADLY_PROJECTION,
+	AG_DESTRUCTIVE_HURRICANE,
+	AG_RAIN_OF_CRYSTAL,
+	AG_MYSTERY_ILLUSION,
+	AG_VIOLENT_QUAKE,
+	AG_VIOLENT_QUAKE_ATK,
+	AG_SOUL_VC_STRIKE,
+	AG_STRANTUM_TREMOR,
+	AG_ALL_BLOOM,
+	AG_ALL_BLOOM_ATK,
+	AG_ALL_BLOOM_ATK2,
+	AG_CRYSTAL_IMPACT,
+	AG_CRYSTAL_IMPACT_ATK,
+	AG_TORNADO_STORM,
+	AG_TWOHANDSTAFF,
+	AG_FLORAL_FLARE_ROAD,
+	AG_ASTRAL_STRIKE,
+	AG_ASTRAL_STRIKE_ATK,
+	AG_CLIMAX,
+	AG_ROCK_DOWN,
+	AG_STORM_CANNON,
+	AG_CRIMSON_ARROW,
+	AG_CRIMSON_ARROW_ATK,
+	AG_FROZEN_SLASH,
+
+	IQ_POWERFUL_FAITH,
+	IQ_FIRM_FAITH,
+	IQ_WILL_OF_FAITH,
+	IQ_OLEUM_SANCTUM,
+	IQ_SINCERE_FAITH,
+	IQ_MASSIVE_F_BLASTER,
+	IQ_EXPOSION_BLASTER,
+	IQ_FIRST_BRAND,
+	IQ_FIRST_FAITH_POWER,
+	IQ_JUDGE,
+	IQ_SECOND_FLAME,
+	IQ_SECOND_FAITH,
+	IQ_SECOND_JUDGEMENT,
+	IQ_THIRD_PUNISH,
+	IQ_THIRD_FLAME_BOMB,
+	IQ_THIRD_CONSECRATION,
+	IQ_THIRD_EXOR_FLAME,
+
+	IG_GUARD_STANCE,
+	IG_GUARDIAN_SHIELD,
+	IG_REBOUND_SHIELD,
+	IG_SHIELD_MASTERY,
+	IG_SPEAR_SWORD_M,
+	IG_ATTACK_STANCE,
+	IG_ULTIMATE_SACRIFICE,
+	IG_HOLY_SHIELD,
+	IG_GRAND_JUDGEMENT,
+	IG_JUDGEMENT_CROSS,
+	IG_SHIELD_SHOOTING,
+	IG_OVERSLASH,
+	IG_CROSS_RAIN,
+
+	CD_REPARATIO,
+	CD_MEDIALE_VOTUM,
+	CD_MACE_BOOK_M,
+	CD_ARGUTUS_VITA,
+	CD_ARGUTUS_TELUM,
+	CD_ARBITRIUM,
+	CD_ARBITRIUM_ATK,
+	CD_PRESENS_ACIES,
+	CD_FIDUS_ANIMUS,
+	CD_EFFLIGO,
+	CD_COMPETENTIA,
+	CD_PNEUMATICUS_PROCELLA,
+	CD_DILECTIO_HEAL,
+	CD_RELIGIO,
+	CD_BENEDICTUM,
+	CD_PETITIO,
+	CD_FRAMEN,
+
+	SHC_SHADOW_EXCEED,
+	SHC_DANCING_KNIFE,
+	SHC_SAVAGE_IMPACT,
+	SHC_SHADOW_SENSE,
+	SHC_ETERNAL_SLASH,
+	SHC_POTENT_VENOM,
+	SHC_SHADOW_STAB,
+	SHC_IMPACT_CRATER,
+	SHC_ENCHANTING_SHADOW,
+	SHC_FATAL_SHADOW_CROW,
+
+	MT_AXE_STOMP,
+	MT_RUSH_QUAKE,
+	MT_M_MACHINE,
+	MT_A_MACHINE,
+	MT_D_MACHINE,
+	MT_TWOAXEDEF,
+	MT_ABR_M,
+	MT_SUMMON_ABR_BATTLE_WARIOR,
+	MT_SUMMON_ABR_DUAL_CANNON,
+	MT_SUMMON_ABR_MOTHER_NET,
+	MT_SUMMON_ABR_INFINITY,
+
+	AG_DESTRUCTIVE_HURRICANE_CLIMAX,
+	BO_ACIDIFIED_ZONE_WATER_ATK,
+	BO_ACIDIFIED_ZONE_GROUND_ATK,
+	BO_ACIDIFIED_ZONE_WIND_ATK,
+	BO_ACIDIFIED_ZONE_FIRE_ATK,
+
+	ABC_DAGGER_AND_BOW_M,
+	ABC_MAGIC_SWORD_M,
+	ABC_STRIP_SHADOW,
+	ABC_ABYSS_DAGGER,
+	ABC_UNLUCKY_RUSH,
+	ABC_CHAIN_REACTION_SHOT,
+	ABC_FROM_THE_ABYSS,
+	ABC_ABYSS_SLAYER,
+	ABC_ABYSS_STRIKE,
+	ABC_DEFT_STAB,
+	ABC_ABYSS_SQUARE,
+	ABC_FRENZY_SHOT,
+
+	WH_ADVANCED_TRAP,
+	WH_WIND_SIGN,
+	WH_NATUREFRIENDLY,
+	WH_HAWKRUSH,
+	WH_HAWK_M,
+	WH_CALAMITYGALE,
+	WH_HAWKBOOMERANG,
+	WH_GALESTORM,
+	WH_DEEPBLINDTRAP,
+	WH_SOLIDTRAP,
+	WH_SWIFTTRAP,
+	WH_CRESCIVE_BOLT,
+	WH_FLAMETRAP,
+
+	BO_BIONIC_PHARMACY,
+	BO_BIONICS_M,
+	BO_THE_WHOLE_PROTECTION,
+	BO_ADVANCE_PROTECTION,
+	BO_ACIDIFIED_ZONE_WATER,
+	BO_ACIDIFIED_ZONE_GROUND,
+	BO_ACIDIFIED_ZONE_WIND,
+	BO_ACIDIFIED_ZONE_FIRE,
+	BO_WOODENWARRIOR,
+	BO_WOODEN_FAIRY,
+	BO_CREEPER,
+	BO_RESEARCHREPORT,
+	BO_HELLTREE,
+
+	TR_STAGE_MANNER,
+	TR_RETROSPECTION,
+	TR_MYSTIC_SYMPHONY,
+	TR_KVASIR_SONATA,
+	TR_ROSEBLOSSOM,
+	TR_ROSEBLOSSOM_ATK,
+	TR_RHYTHMSHOOTING,
+	TR_METALIC_FURY,
+	TR_SOUNDBLEND,
+	TR_GEF_NOCTURN,
+	TR_ROKI_CAPRICCIO,
+	TR_AIN_RHAPSODY,
+	TR_MUSICAL_INTERLUDE,
+	TR_JAWAII_SERENADE,
+	TR_NIPELHEIM_REQUIEM,
+	TR_PRON_MARCH,
+
+	EM_MAGIC_BOOK_M,
+	EM_SPELL_ENCHANTING,
+	EM_ACTIVITY_BURN,
+	EM_INCREASING_ACTIVITY,
+	EM_DIAMOND_STORM,
+	EM_LIGHTNING_LAND,
+	EM_VENOM_SWAMP,
+	EM_CONFLAGRATION,
+	EM_TERRA_DRIVE,
+	EM_ELEMENTAL_SPIRIT_M,
+	EM_SUMMON_ELEMENTAL_ARDOR,
+	EM_SUMMON_ELEMENTAL_DILUVIO,
+	EM_SUMMON_ELEMENTAL_PROCELLA,
+	EM_SUMMON_ELEMENTAL_TERREMOTUS,
+	EM_SUMMON_ELEMENTAL_SERPENS,
+	EM_ELEMENTAL_BUSTER,
+	EM_ELEMENTAL_VEIL,
+
+	ABC_CHAIN_REACTION_SHOT_ATK,
+	ABC_FROM_THE_ABYSS_ATK,
+	BO_WOODEN_THROWROCK,
+	BO_WOODEN_ATTACK,
+	BO_HELL_HOWLING,
+	BO_HELL_DUSTY,
+	BO_FAIRY_DUSTY,
+	EM_ELEMENTAL_BUSTER_FIRE,
+	EM_ELEMENTAL_BUSTER_WATER,
+	EM_ELEMENTAL_BUSTER_WIND,
+	EM_ELEMENTAL_BUSTER_GROUND,
+	EM_ELEMENTAL_BUSTER_POISON,
+
 	HLIF_HEAL = 8001,
 	HLIF_AVOID,
 	HLIF_BRAIN,
@@ -2111,6 +2329,27 @@ enum e_skill {
 	EL_ROCK_CRUSHER,
 	EL_ROCK_CRUSHER_ATK,
 	EL_STONE_RAIN,
+	EM_EL_FLAMETECHNIC,
+	EM_EL_FLAMEARMOR,
+	EM_EL_FLAMEROCK,
+	EM_EL_COLD_FORCE,
+	EM_EL_CRYSTAL_ARMOR,
+	EM_EL_AGE_OF_ICE,
+	EM_EL_GRACE_BREEZE,
+	EM_EL_EYES_OF_STORM,
+	EM_EL_STORM_WIND,
+	EM_EL_EARTH_CARE,
+	EM_EL_STRONG_PROTECTION,
+	EM_EL_AVALANCHE,
+	EM_EL_DEEP_POISONING,
+	EM_EL_POISON_SHIELD,
+	EM_EL_DEADLY_POISON,
+
+	ABR_BATTLE_BUSTER = 8601,
+	ABR_DUAL_CANNON_FIRE,
+	ABR_NET_REPAIR,
+	ABR_NET_SUPPORT,
+	ABR_INFINITY_BUSTER,
 };
 
 /// The client view ids for land skills.
@@ -2256,7 +2495,34 @@ enum e_skill_unit_id : uint16 {
 	UNT_CATNIPPOWDER,
 	UNT_NYANGGRASS,
 
-	UNT_CREATINGSTAR,
+	UNT_CREATINGSTAR,// Should be GROUNDDRIFT_NEUTRAL
+	UNT_DUMMY_0,// CREATINGSTAR
+
+	UNT_RAIN_OF_CRYSTAL,
+	UNT_MYSTERY_ILLUSION,
+	UNT_UNKNOWN_1,// No idea. Makes a old style plant appear for a second.
+	UNT_STRANTUM_TREMOR,
+	UNT_VIOLENT_QUAKE,
+	UNT_ALL_BLOOM,
+	UNT_TORNADO_STORM,
+	UNT_FLORAL_FLARE_ROAD,
+	UNT_ASTRAL_STRIKE,
+	UNT_CROSS_RAIN,
+	UNT_PNEUMATICUS_PROCELLA,
+	UNT_ABYSS_SQUARE,
+	UNT_ACIDIFIED_ZONE_WATER,
+	UNT_ACIDIFIED_ZONE_GROUND,
+	UNT_ACIDIFIED_ZONE_WIND,
+	UNT_ACIDIFIED_ZONE_FIRE,
+	UNT_LIGHTNING_LAND,
+	UNT_VENOM_SWAMP,
+	UNT_CONFLAGRATION,
+
+	// Skill units outside the normal unit range.
+	UNT_DEEPBLINDTRAP = 20852,
+	UNT_SOLIDTRAP,
+	UNT_SWIFTTRAP,
+	UNT_FLAMETRAP,
 
 	/**
 	 * Guild Auras
@@ -2373,6 +2639,7 @@ int skill_get_time3(struct map_data *mapdata, uint16 skill_id, uint16 skill_lv);
 #define SKILL_CHK_HOMUN(skill_id) ( (skill_id) >= HM_SKILLBASE && (skill_id) < HM_SKILLBASE+MAX_HOMUNSKILL )
 #define SKILL_CHK_MERC(skill_id)  ( (skill_id) >= MC_SKILLBASE && (skill_id) < MC_SKILLBASE+MAX_MERCSKILL )
 #define SKILL_CHK_ELEM(skill_id)  ( (skill_id) >= EL_SKILLBASE && (skill_id) < EL_SKILLBASE+MAX_ELEMENTALSKILL )
+#define SKILL_CHK_ABR(skill_id)   ( (skill_id) >= ABR_SKILLBASE && (skill_id) < ABR_SKILLBASE+MAX_ABRSKILL )
 #define SKILL_CHK_GUILD(skill_id) ( (skill_id) >= GD_SKILLBASE && (skill_id) < GD_SKILLBASE+MAX_GUILDSKILL )
 
 #endif /* SKILL_HPP */

文件差異過大導致無法顯示
+ 591 - 36
src/map/status.cpp


+ 228 - 26
src/map/status.hpp

@@ -1027,6 +1027,146 @@ enum sc_type : int16 {
 	SC_BURNT,
 	SC_CHILL,
 
+	// 4th Job Common Status
+	SC_HANDICAPSTATE_DEEPBLIND,
+	SC_HANDICAPSTATE_DEEPSILENCE,
+	SC_HANDICAPSTATE_LASSITUDE,
+	SC_HANDICAPSTATE_FROSTBITE,
+	SC_HANDICAPSTATE_SWOONING,
+	SC_HANDICAPSTATE_LIGHTNINGSTRIKE,
+	SC_HANDICAPSTATE_CRYSTALLIZATION,
+	SC_HANDICAPSTATE_CONFLAGRATION,
+	SC_HANDICAPSTATE_MISFORTUNE,
+	SC_HANDICAPSTATE_DEADLYPOISON,
+	SC_HANDICAPSTATE_DEPRESSION,
+	SC_HANDICAPSTATE_HOLYFLAME,
+
+	// Dragon Knight
+	SC_SERVANTWEAPON,
+	SC_SERVANT_SIGN,
+	SC_CHARGINGPIERCE,
+	SC_CHARGINGPIERCE_COUNT,
+	SC_DRAGONIC_AURA,
+	SC_VIGOR,
+
+	// Arch Mage
+	SC_DEADLY_DEFEASANCE,
+	SC_CLIMAX_DES_HU,
+	SC_CLIMAX,
+	SC_CLIMAX_EARTH,
+	SC_CLIMAX_BLOOM,
+	SC_CLIMAX_CRYIMP,
+
+	// Windhawk
+	SC_WINDSIGN,
+	SC_CRESCIVEBOLT,
+	SC_CALAMITYGALE,
+
+	// Cardinal
+	SC_MEDIALE,
+	SC_A_VITA,
+	SC_A_TELUM,
+	SC_PRE_ACIES,
+	SC_COMPETENTIA,
+	SC_RELIGIO,
+	SC_BENEDICTUM,
+
+	// Meister
+	SC_AXE_STOMP,
+	SC_A_MACHINE,
+	SC_D_MACHINE,
+	SC_ABR_BATTLE_WARIOR,
+	SC_ABR_DUAL_CANNON,
+	SC_ABR_MOTHER_NET,
+	SC_ABR_INFINITY,
+
+	// Shadow Cross
+	SC_SHADOW_EXCEED,
+	SC_DANCING_KNIFE,
+	SC_POTENT_VENOM,
+	SC_SHADOW_SCAR,
+	SC_E_SLASH_COUNT,
+	SC_SHADOW_WEAPON,
+
+	// Imperial Guard
+	SC_GUARD_STANCE,
+	SC_ATTACK_STANCE,
+	SC_GUARDIAN_S,
+	SC_REBOUND_S,
+	SC_HOLY_S,
+	SC_ULTIMATE_S,
+	SC_SPEAR_SCAR,
+	SC_SHIELD_POWER,
+
+	// Elemental Master
+	SC_SPELL_ENCHANTING,
+	SC_SUMMON_ELEMENTAL_ARDOR,
+	SC_SUMMON_ELEMENTAL_DILUVIO,
+	SC_SUMMON_ELEMENTAL_PROCELLA,
+	SC_SUMMON_ELEMENTAL_TERREMOTUS,
+	SC_SUMMON_ELEMENTAL_SERPENS,
+	SC_ELEMENTAL_VEIL,
+
+	// Troubadour/Trouvere
+	SC_MYSTIC_SYMPHONY,
+	SC_KVASIR_SONATA,
+	SC_SOUNDBLEND,
+	SC_GEF_NOCTURN,
+	SC_AIN_RHAPSODY,
+	SC_MUSICAL_INTERLUDE,
+	SC_JAWAII_SERENADE,
+	SC_PRON_MARCH,
+	SC_ROSEBLOSSOM,
+
+	// Inquisitor
+	SC_POWERFUL_FAITH,
+	SC_SINCERE_FAITH,
+	SC_FIRM_FAITH,
+	SC_HOLY_OIL,
+	SC_FIRST_BRAND,
+	SC_SECOND_BRAND,
+	SC_SECOND_JUDGE,
+	SC_THIRD_EXOR_FLAME,
+	SC_FIRST_FAITH_POWER,
+	SC_MASSIVE_F_BLASTER,
+
+	// Biolo
+	SC_PROTECTSHADOWEQUIP,
+	SC_RESEARCHREPORT,
+	SC_BO_HELL_DUSTY,
+	SC_BIONIC_WOODENWARRIOR,
+	SC_BIONIC_WOODEN_FAIRY,
+	SC_BIONIC_CREEPER,
+	SC_BIONIC_HELLTREE,
+
+	// Abyss Chaser
+	SC_SHADOW_STRIP,
+	SC_ABYSS_DAGGER,
+	SC_ABYSSFORCEWEAPON,
+	SC_ABYSS_SLAYER,
+
+	// Super Elementals
+	SC_FLAMETECHNIC,
+	SC_FLAMETECHNIC_OPTION,
+	SC_FLAMEARMOR,
+	SC_FLAMEARMOR_OPTION,
+	SC_COLD_FORCE,
+	SC_COLD_FORCE_OPTION,
+	SC_CRYSTAL_ARMOR,
+	SC_CRYSTAL_ARMOR_OPTION,
+	SC_GRACE_BREEZE,
+	SC_GRACE_BREEZE_OPTION,
+	SC_EYES_OF_STORM,
+	SC_EYES_OF_STORM_OPTION,
+	SC_EARTH_CARE,
+	SC_EARTH_CARE_OPTION,
+	SC_STRONG_PROTECTION,
+	SC_STRONG_PROTECTION_OPTION,
+	SC_DEEP_POISONING,
+	SC_DEEP_POISONING_OPTION,
+	SC_POISON_SHIELD,
+	SC_POISON_SHIELD_OPTION,
+
 #ifdef RENEWAL
 	SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
 #endif
@@ -2532,8 +2672,8 @@ enum scs_flag {
 };
 
 ///Define flags for the status_calc_bl function. [Skotlex]
-enum scb_flag
-{
+enum scb_flag : uint64
+{	// Main Flags
 	SCB_NONE	= 0x00000000,
 	SCB_BASE	= 0x00000001,
 	SCB_MAXHP	= 0x00000002,
@@ -2565,10 +2705,29 @@ enum scb_flag
 	SCB_RACE	= 0x08000000,
 	SCB_RANGE	= 0x10000000,
 	SCB_REGEN	= 0x20000000,
-	SCB_DYE		= 0x40000000, // force cloth-dye change to 0 to avoid client crashes.
 
-	SCB_BATTLE	= 0x3FFFFFFE,
-	SCB_ALL		= 0x3FFFFFFF
+	// 4th Job T.Stat/T.Sub-Stat Flags
+	SCB_MAXAP	= 0x40000000,
+	SCB_POW		= 0x80000000,
+	SCB_STA		= 0x000100000000,
+	SCB_WIS		= 0x000200000000,
+	SCB_SPL		= 0x000400000000,
+	SCB_CON		= 0x000800000000,
+	SCB_CRT		= 0x001000000000,
+	SCB_PATK	= 0x002000000000,
+	SCB_SMATK	= 0x004000000000,
+	SCB_RES		= 0x008000000000,
+	SCB_MRES	= 0x010000000000,
+	SCB_HPLUS	= 0x020000000000,
+	SCB_CRATE	= 0x040000000000,
+
+	// Extra Flags
+	// These are flags not sent through battle/all flags. Always keep these last.
+	SCB_DYE		= 0x080000000000, // force cloth-dye change to 0 to avoid client crashes.
+
+	// Special flags for updating all stat/sub-stat stuff on request.
+	SCB_BATTLE	= 0x07FFFFFFFFFE,// All except BASE and extra flags.
+	SCB_ALL		= 0x07FFFFFFFFFF// All except extra flags.
 };
 
 enum e_status_calc_opt {
@@ -2664,7 +2823,7 @@ struct weapon_atk {
 
 extern sc_type SkillStatusChangeTable[MAX_SKILL];   /// skill  -> status
 extern int StatusIconChangeTable[SC_MAX];           /// status -> "icon" (icon is a bit of a misnomer, since there exist values with no icon associated)
-extern unsigned int StatusChangeFlagTable[SC_MAX];  /// status -> flags
+extern uint64 StatusChangeFlagTable[SC_MAX];  /// status -> flags
 extern int StatusSkillChangeTable[SC_MAX];          /// status -> skill
 extern int StatusRelevantBLTypes[EFST_MAX];           /// "icon" -> enum bl_type (for clif->status_change to identify for which bl types to send packets)
 extern unsigned int StatusChangeStateTable[SC_MAX]; /// status -> flags
@@ -2673,10 +2832,11 @@ extern unsigned int StatusDisplayType[SC_MAX];
 ///For holding basic status (which can be modified by status changes)
 struct status_data {
 	unsigned int
-		hp, sp,  // see status_cpy before adding members before hp and sp
-		max_hp, max_sp;
+		hp, sp, ap, // see status_cpy before adding members before hp and sp
+		max_hp, max_sp, max_ap;
 	short
 		str, agi, vit, int_, dex, luk,
+		pow, sta, wis, spl, con, crt,
 		eatk;
 	unsigned short
 		batk,
@@ -2694,7 +2854,10 @@ struct status_data {
 #ifdef RENEWAL_ASPD
 		aspd_rate2,
 #endif
-		aspd_rate;
+		aspd_rate,
+		patk, smatk,
+		res, mres,
+		hplus, crate;
 	/**
 	 * defType is RENEWAL dependent and defined in src/config/const.hpp
 	 **/
@@ -2707,8 +2870,6 @@ struct status_data {
 		class_; /// see enum e_classAE
 
 	struct weapon_atk rhw, lhw; //Right Hand/Left Hand Weapon.
-
-	uint16 pow, sta, wis, spl, con, crt;
 };
 
 ///Additional regen data that only players have.
@@ -2807,32 +2968,59 @@ static const std::vector<sc_type> mado_statuses = {
 // for looking up associated data
 sc_type status_skill2sc(int skill);
 int status_sc2skill(sc_type sc);
-unsigned int status_sc2scb_flag(sc_type sc);
+uint64 status_sc2scb_flag(sc_type sc);
 int status_type2relevant_bl_types(int type);
 
-int status_damage(struct block_list *src,struct block_list *target,int64 dhp,int64 dsp, t_tick walkdelay, int flag, uint16 skill_id);
+int status_damage( struct block_list *src, struct block_list *target, int64 dhp, int64 dsp, int64 dap, t_tick walkdelay, int flag, uint16 skill_id );
+static int status_damage( struct block_list *src, struct block_list *target, int64 dhp, int64 dsp, t_tick walkdelay, int flag, uint16 skill_id ){
+	return status_damage( src, target, dhp, dsp, 0, walkdelay, flag, skill_id );
+}
 //Define for standard HP damage attacks.
-#define status_fix_damage(src, target, hp, walkdelay, skill) status_damage(src, target, hp, 0, walkdelay, 0, skill)
+static int status_fix_damage( struct block_list *src, struct block_list *target, int64 hp, t_tick walkdelay, uint16 skill_id ){
+	return status_damage( src, target, hp, 0, walkdelay, 0, skill_id );
+}
 //Define for standard SP damage attacks.
-#define status_fix_spdamage(src, target, sp, walkdelay, skill) status_damage(src, target, 0, sp, walkdelay, 0, skill)
-//Define for standard HP/SP damage triggers.
-#define status_zap(bl, hp, sp) status_damage(NULL, bl, hp, sp, 0, 1, 0)
-//Define for standard HP/SP skill-related cost triggers (mobs require no HP/SP to use skills)
+static int status_fix_spdamage( struct block_list *src, struct block_list *target, int64 sp, t_tick walkdelay, uint16 skill_id ){
+	return status_damage( src, target, 0, sp, walkdelay, 0, skill_id );
+}
+//Define for standard AP damage attacks.
+static int status_fix_apdamage( struct block_list *src, struct block_list *target, int64 ap, t_tick walkdelay, uint16 skill_id ){
+	return status_damage( src, target, 0, 0, ap, walkdelay, 0, skill_id );
+}
+//Define for standard HP/SP/AP damage triggers.
+static int status_zap( struct block_list* bl, int64 hp, int64 sp, int64 ap = 0 ){
+	return status_damage( nullptr, bl, hp, sp, ap, 0, 1, 0 );
+}
+//Define for standard HP/SP skill-related cost triggers (mobs require no HP/SP/AP to use skills)
 int64 status_charge(struct block_list* bl, int64 hp, int64 sp);
-int status_percent_change(struct block_list *src, struct block_list *target, int8 hp_rate, int8 sp_rate, uint8 flag);
+int status_percent_change(struct block_list *src, struct block_list *target, int8 hp_rate, int8 sp_rate, int8 ap_rate, uint8 flag);
 //Easier handling of status_percent_change
-#define status_percent_heal(bl, hp_rate, sp_rate) status_percent_change(NULL, bl, -(hp_rate), -(sp_rate), 0)
-/// Deals % damage from 'src' to 'target'. If rate is > 0 is % of current HP/SP, < 0 % of MaxHP/MaxSP
-#define status_percent_damage(src, target, hp_rate, sp_rate, kill) status_percent_change(src, target, hp_rate, sp_rate, (kill)?1:2)
+static int status_percent_heal( struct block_list* bl, int8 hp_rate, int8 sp_rate, int8 ap_rate = 0 ){
+	return status_percent_change( nullptr, bl, -(hp_rate), -(sp_rate), -(ap_rate), 0 );
+}
+/// Deals % damage from 'src' to 'target'. If rate is > 0 is % of current HP/SP/AP, < 0 % of MaxHP/MaxSP/MaxAP
+static int status_percent_damage( struct block_list* src, struct block_list* target, int8 hp_rate, int8 sp_rate, bool kill ){
+	return status_percent_change( src, target, hp_rate, sp_rate, 0, kill ? 1 : 2 );
+}
+static int status_percent_damage( struct block_list* src, struct block_list* target, int8 hp_rate, int8 sp_rate, int8 ap_rate, bool kill ){
+	return status_percent_change( src, target, hp_rate, sp_rate, ap_rate, kill ? 1 : 2 );
+}
 //Instant kill with no drops/exp/etc
-#define status_kill(bl) status_percent_damage(NULL, bl, 100, 0, true)
-//Used to set the hp/sp of an object to an absolute value (can't kill)
+static int status_kill( struct block_list* bl ){
+	return status_percent_damage( nullptr, bl, 100, 0, 0, true );
+}
+//Used to set the hp/sp/ap of an object to an absolute value (can't kill)
 int status_set_hp(struct block_list *bl, unsigned int hp, int flag);
 int status_set_maxhp(struct block_list *bl, unsigned int hp, int flag);
 int status_set_sp(struct block_list *bl, unsigned int sp, int flag);
 int status_set_maxsp(struct block_list *bl, unsigned int hp, int flag);
-int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int flag);
-int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp);
+int status_set_ap(struct block_list *bl, unsigned int ap, int flag);
+int status_set_maxap(struct block_list *bl, unsigned int ap, int flag);
+int status_heal( struct block_list *bl,int64 hhp,int64 hsp, int64 hap, int flag );
+static int status_heal( struct block_list *bl,int64 hhp,int64 hsp, int flag ){
+	return status_heal( bl, hhp, hsp, 0, flag );
+}
+int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp, unsigned char per_ap = 0);
 
 struct regen_data *status_get_regen_data(struct block_list *bl);
 struct status_data *status_get_status_data(struct block_list *bl);
@@ -2845,12 +3033,20 @@ int status_get_lv(struct block_list *bl);
 #define status_get_max_hp(bl) status_get_status_data(bl)->max_hp
 #define status_get_sp(bl) status_get_status_data(bl)->sp
 #define status_get_max_sp(bl) status_get_status_data(bl)->max_sp
+#define status_get_ap(bl) status_get_status_data(bl)->ap
+#define status_get_max_ap(bl) status_get_status_data(bl)->max_ap
 #define status_get_str(bl) status_get_status_data(bl)->str
 #define status_get_agi(bl) status_get_status_data(bl)->agi
 #define status_get_vit(bl) status_get_status_data(bl)->vit
 #define status_get_int(bl) status_get_status_data(bl)->int_
 #define status_get_dex(bl) status_get_status_data(bl)->dex
 #define status_get_luk(bl) status_get_status_data(bl)->luk
+#define status_get_pow(bl) status_get_status_data(bl)->pow
+#define status_get_sta(bl) status_get_status_data(bl)->sta
+#define status_get_wis(bl) status_get_status_data(bl)->wis
+#define status_get_spl(bl) status_get_status_data(bl)->spl
+#define status_get_con(bl) status_get_status_data(bl)->con
+#define status_get_crt(bl) status_get_status_data(bl)->crt
 #define status_get_hit(bl) status_get_status_data(bl)->hit
 #define status_get_flee(bl) status_get_status_data(bl)->flee
 defType status_get_def(struct block_list *bl);
@@ -2870,6 +3066,12 @@ unsigned short status_get_speed(struct block_list *bl);
 #define status_get_adelay(bl) status_get_status_data(bl)->adelay
 #define status_get_amotion(bl) status_get_status_data(bl)->amotion
 #define status_get_dmotion(bl) status_get_status_data(bl)->dmotion
+#define status_get_patk(bl) status_get_status_data(bl)->patk
+#define status_get_smatk(bl) status_get_status_data(bl)->smatk
+#define status_get_res(bl) status_get_status_data(bl)->res
+#define status_get_mres(bl) status_get_status_data(bl)->mres
+#define status_get_hplus(bl) status_get_status_data(bl)->hplus
+#define status_get_crate(bl) status_get_status_data(bl)->crate
 #define status_get_element(bl) status_get_status_data(bl)->def_ele
 #define status_get_element_level(bl) status_get_status_data(bl)->ele_lv
 unsigned char status_calc_attack_element(struct block_list *bl, struct status_change *sc, int element);

+ 41 - 2
src/map/unit.cpp

@@ -1815,6 +1815,34 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
 					}
 				}
 				break;
+			case DK_SERVANT_W_SIGN: {
+					uint8 i = 0, count = min(skill_lv, MAX_SERVANT_SIGN);
+
+					ARR_FIND( 0, count, i, sd->servant_sign[i] == target_id );
+
+					// Already targetted
+					if( i < count ){
+						break;
+					}
+
+					ARR_FIND( 0, count, i, sd->servant_sign[i] == 0 );
+
+					// No free slots
+					if( i == count ){
+						clif_skill_fail( sd, skill_id, USESKILL_FAIL_LEVEL, 0 );
+						return 0;
+					}
+				}
+				break;
+			case TR_RETROSPECTION:
+				// Prevent using the song skill if you no longer have the skill in your tree.
+				if (!sd->skill_id_song || pc_checkskill(sd, sd->skill_id_song) <= 0) {
+					clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
+					return 0;
+				}
+
+				sd->skill_id_old = skill_id;
+				break;
 		}
 
 		if (!skill_check_condition_castbegin(sd, skill_id, skill_lv))
@@ -1935,6 +1963,16 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
 			if (sc && sc->data[SC_WUGDASH])
 				casttime = -1;
 			break;
+		case DK_SERVANT_W_PHANTOM: { // Stops servants from being consumed on unmarked targets.
+				status_change *tsc = status_get_sc(target);
+
+				// Only allow to attack if the enemy has a sign mark given by the caster.
+				if( tsc == nullptr || tsc->data[SC_SERVANT_SIGN] == nullptr || tsc->data[SC_SERVANT_SIGN]->val1 != src->id ){
+					clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
+					return 0;
+				}
+			}
+			break;
 		case EL_WIND_SLASH:
 		case EL_HURRICANE:
 		case EL_TYPOON_MIS:
@@ -2023,12 +2061,12 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
 
 	if( sc ) {
 		// These 3 status do not stack, so it's efficient to use if-else
- 		if( sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4&4) && skill_id != AS_CLOAKING ) {
+ 		if( sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4&4) && skill_id != AS_CLOAKING && skill_id != SHC_SHADOW_STAB) {
 			status_change_end(src, SC_CLOAKING, INVALID_TIMER);
 
 			if (!src->prev)
 				return 0; // Warped away!
-		} else if( sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4&4) && skill_id != GC_CLOAKINGEXCEED ) {
+		} else if( sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4&4) && skill_id != GC_CLOAKINGEXCEED && skill_id != SHC_SHADOW_STAB) {
 			status_change_end(src,SC_CLOAKINGEXCEED, INVALID_TIMER);
 
 			if (!src->prev)
@@ -3041,6 +3079,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
 		status_change_end(bl, SC_TINDER_BREAKER, INVALID_TIMER);
 		status_change_end(bl, SC_TINDER_BREAKER2, INVALID_TIMER);
 		status_change_end(bl, SC_FLASHKICK, INVALID_TIMER);
+		status_change_end(bl, SC_SERVANT_SIGN, INVALID_TIMER);
 		status_change_end(bl, SC_HIDING, INVALID_TIMER);
 		// Ensure the bl is a PC; if so, we'll handle the removal of cloaking and cloaking exceed later
 		if ( bl->type != BL_PC ) {

+ 4 - 4
src/tool/csv2yaml.cpp

@@ -275,14 +275,14 @@ int do_init( int argc, char** argv ){
 	}
 
 	skill_txt_data( path_db_mode, path_db );
-	if (!process("SKILL_DB", 2, { path_db_mode }, "skill_db", [](const std::string& path, const std::string& name_ext) -> bool {
+	if (!process("SKILL_DB", 3, { path_db_mode }, "skill_db", [](const std::string& path, const std::string& name_ext) -> bool {
 		return sv_readdb(path.c_str(), name_ext.c_str(), ',', 18, 18, -1, &skill_parse_row_skilldb, false);
 	})){
 		return 0;
 	}
 
 	skill_txt_data( path_db_import, path_db_import );
-	if (!process("SKILL_DB", 2, { path_db_import }, "skill_db", [](const std::string& path, const std::string& name_ext) -> bool {
+	if (!process("SKILL_DB", 3, { path_db_import }, "skill_db", [](const std::string& path, const std::string& name_ext) -> bool {
 		return sv_readdb(path.c_str(), name_ext.c_str(), ',', 18, 18, -1, &skill_parse_row_skilldb, false);
 	})){
 		return 0;
@@ -345,14 +345,14 @@ int do_init( int argc, char** argv ){
 #endif
 
 	mob_txt_data(path_db_mode, path_db);
-	if (!process("MOB_DB", 2, { path_db_mode }, "mob_db", [](const std::string &path, const std::string &name_ext) -> bool {
+	if (!process("MOB_DB", 3, { path_db_mode }, "mob_db", [](const std::string &path, const std::string &name_ext) -> bool {
 		return sv_readdb(path.c_str(), name_ext.c_str(), ',', 31 + 2 * MAX_MVP_DROP + 2 * MAX_MOB_DROP, 31 + 2 * MAX_MVP_DROP + 2 * MAX_MOB_DROP, -1, &mob_readdb_sub, false);
 	})) {
 		return 0;
 	}
 
 	mob_txt_data(path_db_import, path_db_import);
-	if (!process("MOB_DB", 2, { path_db_import }, "mob_db", [](const std::string &path, const std::string &name_ext) -> bool {
+	if (!process("MOB_DB", 3, { path_db_import }, "mob_db", [](const std::string &path, const std::string &name_ext) -> bool {
 		return sv_readdb(path.c_str(), name_ext.c_str(), ',', 31 + 2 * MAX_MVP_DROP + 2 * MAX_MOB_DROP, 31 + 2 * MAX_MVP_DROP + 2 * MAX_MOB_DROP, -1, &mob_readdb_sub, false);
 	})) {
 		return 0;

+ 6 - 0
src/tool/yaml2sql.cpp

@@ -756,6 +756,12 @@ static bool mob_db_yaml2sql(const std::string &file, const std::string &table) {
 			column.append("`defense`,");
 		if (appendEntry(input["MagicDefense"], value))
 			column.append("`magic_defense`,");
+#ifdef RENEWAL
+		if (appendEntry(input["Resistance"], value))
+			column.append("`resistance`,");
+		if (appendEntry(input["MagicResistance"], value))
+			column.append("`magic_resistance`,");
+#endif
 		if (appendEntry(input["Str"], value))
 			column.append("`str`,");
 		if (appendEntry(input["Agi"], value))

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