summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--db/pre-re/job_db.conf1372
-rw-r--r--db/pre-re/job_db1.txt283
-rw-r--r--db/re/job_db.conf1714
-rw-r--r--db/re/job_db1.txt274
-rw-r--r--doc/script_commands.txt2
-rw-r--r--npc/instances/SealedShrine.txt11
-rw-r--r--npc/re/instances/WolfchevLaboratory.txt10
-rw-r--r--npc/re/merchants/ninja_craftsman.txt2
-rw-r--r--src/char/char.c108
-rw-r--r--src/char/int_auction.c12
-rw-r--r--src/char/int_elemental.c4
-rw-r--r--src/char/int_guild.c50
-rw-r--r--src/char/int_homun.c7
-rw-r--r--src/char/int_mail.c12
-rw-r--r--src/char/int_mercenary.c6
-rw-r--r--src/char/int_party.c14
-rw-r--r--src/char/int_pet.c6
-rw-r--r--src/char/int_quest.c8
-rw-r--r--src/char/int_storage.c8
-rw-r--r--src/char/inter.c24
-rw-r--r--src/char/loginif.c9
-rw-r--r--src/char/pincode.c15
-rw-r--r--src/login/account_sql.c47
-rw-r--r--src/login/ipban_sql.c13
-rw-r--r--src/login/login.c36
-rw-r--r--src/login/loginlog_sql.c5
-rw-r--r--src/map/pc.c335
-rw-r--r--src/map/pc.h2
-rw-r--r--src/map/skill.c4
-rw-r--r--src/map/status.c406
-rw-r--r--src/map/status.h13
-rw-r--r--src/map/unit.c9
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc32
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc8
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc138
35 files changed, 3963 insertions, 1036 deletions
diff --git a/db/pre-re/job_db.conf b/db/pre-re/job_db.conf
new file mode 100644
index 000000000..c07c0a767
--- /dev/null
+++ b/db/pre-re/job_db.conf
@@ -0,0 +1,1372 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://hercules.ws/board/
+//================= More Information =================
+// http://hercules.ws/board/topic/9082-job-db1txt-redesign/
+//============== pRE Structure Example ===============
+/*
+Job_Name: { // Job names as in src/map/pc.c (they are hardcoded at the moment so if you want to add a new job you should add it there)
+ Inherit: ( "Other_Job_Name" ); // Base job from which this job will inherit its max weight, base ASPD set and HP/SP table.
+ InheritHP: ( "Other_Job_Name" );// Base job from which this job will inherit its HP table.
+ InheritSP: ( "Other_Job_Name" );// Base job from which this job will inherit its SP table.
+ Weight: Max Weight (int, defaults to 20000, units in Weight/10)
+ BaseASPD: { // Base ASPD for specific weapon type
+ Fist: 0~2000 (int, defaults to 2000)
+ Dagger: 0~2000 (int, defaults to 2000)
+ Sword: 0~2000 (int, defaults to 2000)
+ TwoHandSword: 0~2000 (int, defaults to 2000)
+ Spear: 0~2000 (int, defaults to 2000)
+ TwoHandSpear: 0~2000 (int, defaults to 2000)
+ Axe: 0~2000 (int, defaults to 2000)
+ TwoHandAxe: 0~2000 (int, defaults to 2000)
+ Mace: 0~2000 (int, defaults to 2000)
+ TwoHandMace: 0~2000 (int, defaults to 2000)
+ Rod: 0~2000 (int, defaults to 2000)
+ Bow: 0~2000 (int, defaults to 2000)
+ Knuckle: 0~2000 (int, defaults to 2000)
+ Instrumen: 0~2000 (int, defaults to 2000)
+ Whip: 0~2000 (int, defaults to 2000)
+ Book: 0~2000 (int, defaults to 2000)
+ Katar: 0~2000 (int, defaults to 2000)
+ Revolver: 0~2000 (int, defaults to 2000)
+ Rifle: 0~2000 (int, defaults to 2000)
+ GatlingGun: 0~2000 (int, defaults to 2000)
+ Shotgun: 0~200 0 (int, defaults to 2000)
+ GrenadeLauncher: 0~2000 (int, defaults to 2000)
+ FuumaShuriken: 0~2000 (int, defaults to 2000)
+ TwoHandRod: 0~2000 (int, defaults to 2000)
+ }
+ HPTable:[ 1, .... 150 ] (int[]) Reference table for base HP per level
+ SPTable:[ 1, .... 150 ] (int[]) Reference table for base SP per level
+ // Note: If table index size is smaller than the max level the server will automatically generate the missing index based on the average increase per level.
+}
+*/
+//====================================================
+Novice: {
+ BaseASPD: {
+ Fist: 500
+ Dagger: 650
+ Sword: 700
+ Axe: 800
+ Mace: 700
+ TwoHandMace: 700
+ Rod: 650
+ TwoHandRod: 650
+ }
+ HPTable:[ 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, // 1 - 10
+ 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, // 11 - 20
+ 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, // 21 - 30
+ 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, // 31 - 40
+ 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, // 41 - 50
+ 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, // 51 - 60
+ 340, 345, 350, 355, 360, 365, 370, 375, 380, 385, // 61 - 70
+ 390, 395, 400, 405, 410, 415, 420, 425, 430, 435, // 71 - 80
+ 440, 445, 450, 455, 460, 465, 470, 475, 480, 485, // 81 - 90
+ 490, 495, 500, 505, 510, 515, 520, 525, 530, 535, // 91 - 100
+ 540, 545, 550, 555, 560, 565, 570, 575, 580, 585, // 101 - 110
+ 590, 595, 600, 605, 610, 615, 620, 625, 630, 635, // 111 - 120
+ 640, 645, 650, 655, 660, 665, 670, 675, 680, 685, // 121 - 130
+ 690, 695, 700, 705, 710, 715, 720, 725, 730, 735, // 131 - 140
+ 740, 745, 750, 755, 760, 765, 770, 775, 780, 785] // 141 - 150
+ SPTable:[ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 1 - 10
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 11 - 20
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 21 - 30
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 31 - 40
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 41 - 50
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 51 - 60
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 61 - 70
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 71 - 80
+ 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, // 81 - 90
+ 101, 102, 103, 104, 105, 106, 107, 108, 109, 100, // 91 - 100
+ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, // 101 - 110
+ 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, // 111 - 120
+ 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, // 121 - 130
+ 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, // 131 - 140
+ 141, 142, 143, 144, 145, 146, 147, 148, 149, 150] // 141 - 150
+}
+Swordsman: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ Sword: 550
+ TwoHandSword: 600
+ Spear: 650
+ TwoHandSpear: 700
+ Axe: 700
+ TwoHandAxe: 750
+ Mace: 650
+ TwoHandMace: 700
+ }
+ HPTable:[ 40, 46, 53, 61, 70, 79, 89, 100, 111, 123, // 1 - 10
+ 136, 149, 163, 178, 194, 210, 227, 245, 263, 282, // 11 - 20
+ 302, 322, 343, 365, 388, 411, 435, 460, 485, 511, // 21 - 30
+ 538, 565, 593, 622, 652, 682, 713, 745, 777, 810, // 31 - 40
+ 844, 878, 913, 949, 986, 1023, 1061, 1100, 1139, 1179, // 41 - 50
+ 1220, 1261, 1303, 1346, 1390, 1434, 1479, 1525, 1571, 1618, // 51 - 60
+ 1666, 1714, 1763, 1813, 1864, 1915, 1967, 2020, 2073, 2127, // 61 - 70
+ 2182, 2237, 2293, 2350, 2408, 2466, 2525, 2585, 2645, 2706, // 71 - 80
+ 2768, 2830, 2893, 2957, 3022, 3087, 3153, 3220, 3287, 3355, // 81 - 90
+ 3424, 3493, 3563, 3634, 3706, 3778, 3851, 3925, 3999, 4073, // 91 - 100
+ 4147, 4221, 4295, 4369, 4443, 4517, 4591, 4665, 4739, 4813, // 101 - 110
+ 4887, 4961, 5035, 5109, 5183, 5257, 5331, 5405, 5479, 5553, // 111 - 120
+ 5627, 5701, 5775, 5849, 5923, 5997, 6071, 6145, 6219, 6293, // 121 - 130
+ 6367, 6441, 6515, 6589, 6663, 6737, 6811, 6885, 6959, 7033, // 131 - 140
+ 7107, 7181, 7255, 7329, 7403, 7477, 7551, 7625, 7699, 7773] // 141 - 150
+ SPTable:[ 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, // 1 - 10
+ 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, // 11 - 20
+ 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, // 21 - 30
+ 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, // 31 - 40
+ 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, // 41 - 50
+ 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, // 51 - 60
+ 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, // 61 - 70
+ 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, // 71 - 80
+ 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, // 81 - 90
+ 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, // 91 - 100
+ 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, // 101 - 110
+ 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, // 111 - 120
+ 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, // 121 - 130
+ 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, // 131 - 140
+ 292, 294, 296, 298, 300, 302, 304, 306, 308, 310] // 141 - 150
+}
+Magician: {
+ Weight: 22000
+ BaseASPD: {
+ Fist: 500
+ Dagger: 600
+ Rod: 700
+ TwoHandRod: 700
+ }
+ HPTable:[ 40, 46, 52, 58, 65, 72, 79, 86, 94, 102, // 1 - 10
+ 110, 119, 128, 137, 147, 157, 167, 177, 188, 199, // 11 - 20
+ 210, 222, 234, 246, 259, 272, 285, 298, 312, 326, // 21 - 30
+ 340, 355, 370, 385, 401, 417, 433, 449, 466, 483, // 31 - 40
+ 500, 518, 536, 554, 573, 592, 611, 630, 650, 670, // 41 - 50
+ 690, 711, 732, 753, 775, 797, 819, 841, 864, 887, // 51 - 60
+ 910, 934, 958, 982, 1007, 1032, 1057, 1082, 1108, 1134, // 61 - 70
+ 1160, 1187, 1214, 1241, 1269, 1297, 1325, 1353, 1382, 1411, // 71 - 80
+ 1440, 1470, 1500, 1530, 1561, 1592, 1623, 1654, 1686, 1718, // 81 - 90
+ 1750, 1783, 1816, 1849, 1883, 1917, 1951, 1985, 2020, 2054, // 91 - 100
+ 2089, 2123, 2158, 2192, 2227, 2261, 2296, 2330, 2365, 2399, // 101 - 110
+ 2434, 2468, 2503, 2537, 2572, 2606, 2641, 2675, 2710, 2744, // 111 - 120
+ 2779, 2813, 2848, 2882, 2917, 2951, 2986, 3020, 3055, 3089, // 121 - 130
+ 3124, 3158, 3193, 3227, 3262, 3296, 3331, 3365, 3400, 3434, // 131 - 140
+ 3469, 3503, 3538, 3572, 3607, 3641, 3676, 3710, 3745, 3779] // 141 - 150
+ SPTable:[ 16, 22, 28, 34, 40, 46, 52, 58, 64, 70, // 1 - 10
+ 76, 82, 88, 94, 100, 106, 112, 118, 124, 130, // 11 - 20
+ 136, 142, 148, 154, 160, 166, 172, 178, 184, 190, // 21 - 30
+ 196, 202, 208, 214, 220, 226, 232, 238, 244, 250, // 31 - 40
+ 256, 262, 268, 274, 280, 286, 292, 298, 304, 310, // 41 - 50
+ 316, 322, 328, 334, 340, 346, 352, 358, 364, 370, // 51 - 60
+ 376, 382, 388, 394, 400, 406, 412, 418, 424, 430, // 61 - 70
+ 436, 442, 448, 454, 460, 466, 472, 478, 484, 490, // 71 - 80
+ 496, 502, 508, 514, 520, 526, 532, 538, 544, 550, // 81 - 90
+ 556, 562, 568, 574, 580, 586, 592, 598, 604, 610, // 91 - 100
+ 616, 622, 628, 634, 640, 646, 652, 658, 664, 670, // 101 - 110
+ 676, 682, 688, 694, 700, 706, 712, 718, 724, 730, // 111 - 120
+ 736, 742, 748, 754, 760, 766, 772, 778, 784, 790, // 121 - 130
+ 796, 802, 808, 814, 820, 826, 832, 838, 844, 850, // 131 - 140
+ 856, 862, 868, 874, 880, 886, 892, 898, 904, 910] // 141 - 150
+}
+Archer: {
+ Weight: 26000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 600
+ Bow: 700
+ }
+ InheritSP: ("Swordsman")
+ HPTable:[ 40, 46, 53, 60, 68, 76, 85, 94, 104, 114, // 1 - 10
+ 125, 136, 148, 160, 173, 186, 200, 214, 229, 244, // 11 - 20
+ 260, 276, 293, 310, 328, 346, 365, 384, 404, 424, // 21 - 30
+ 445, 466, 488, 510, 533, 556, 580, 604, 629, 654, // 31 - 40
+ 680, 706, 733, 760, 788, 816, 845, 874, 904, 934, // 41 - 50
+ 965, 996, 1028, 1060, 1093, 1126, 1160, 1194, 1229, 1264, // 51 - 60
+ 1300, 1336, 1373, 1410, 1448, 1486, 1525, 1564, 1604, 1644, // 61 - 70
+ 1685, 1726, 1768, 1810, 1853, 1896, 1940, 1984, 2029, 2074, // 71 - 80
+ 2120, 2166, 2213, 2260, 2308, 2356, 2405, 2454, 2504, 2554, // 81 - 90
+ 2605, 2656, 2708, 2760, 2813, 2866, 2920, 2974, 3029, 3083, // 91 - 100
+ 3138, 3192, 3247, 3301, 3356, 3410, 3465, 3519, 3574, 3628, // 101 - 110
+ 3683, 3737, 3792, 3846, 3901, 3955, 4010, 4064, 4119, 4173, // 111 - 120
+ 4228, 4282, 4337, 4391, 4446, 4500, 4555, 4609, 4664, 4718, // 121 - 130
+ 4773, 4827, 4882, 4936, 4991, 5045, 5100, 5154, 5209, 5263, // 131 - 140
+ 5318, 5372, 5427, 5481, 5536, 5590, 5645, 5699, 5754, 5808] // 141 - 150
+}
+Acolyte: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 400
+ Mace: 600
+ TwoHandMace: 600
+ Rod: 600
+ TwoHandRod: 600
+ }
+ HPTable:[ 40, 46, 52, 59, 66, 73, 81, 89, 98, 107, // 1 - 10
+ 116, 126, 136, 147, 158, 169, 181, 193, 206, 219, // 11 - 20
+ 232, 246, 260, 275, 290, 305, 321, 337, 354, 371, // 21 - 30
+ 388, 406, 424, 443, 462, 481, 501, 521, 542, 563, // 31 - 40
+ 584, 606, 628, 651, 674, 697, 721, 745, 770, 795, // 41 - 50
+ 820, 846, 872, 899, 926, 953, 981, 1009, 1038, 1067, // 51 - 60
+ 1096, 1126, 1156, 1187, 1218, 1249, 1281, 1313, 1346, 1379, // 61 - 70
+ 1412, 1446, 1480, 1515, 1550, 1585, 1621, 1657, 1694, 1731, // 71 - 80
+ 1768, 1806, 1844, 1883, 1922, 1961, 2001, 2041, 2082, 2123, // 81 - 90
+ 2164, 2206, 2248, 2291, 2334, 2377, 2421, 2465, 2510, 2554, // 91 - 100
+ 2599, 2643, 2688, 2732, 2777, 2821, 2866, 2910, 2955, 2999, // 101 - 110
+ 3044, 3088, 3133, 3177, 3222, 3266, 3311, 3355, 3400, 3444, // 111 - 120
+ 3489, 3533, 3578, 3622, 3667, 3711, 3756, 3800, 3845, 3889, // 121 - 130
+ 3934, 3978, 4023, 4067, 4112, 4156, 4201, 4245, 4290, 4334, // 131 - 140
+ 4379, 4423, 4468, 4512, 4557, 4601, 4646, 4690, 4735, 4779] // 141 - 150
+ SPTable:[ 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, // 1 - 10
+ 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, // 11 - 20
+ 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, // 21 - 30
+ 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, // 31 - 40
+ 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, // 41 - 50
+ 265, 270, 275, 280, 285, 290, 295, 300, 305, 310, // 51 - 60
+ 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, // 61 - 70
+ 365, 370, 375, 380, 385, 390, 395, 400, 405, 410, // 71 - 80
+ 415, 420, 425, 430, 435, 440, 445, 450, 455, 460, // 81 - 90
+ 465, 470, 475, 480, 485, 490, 495, 500, 505, 510, // 91 - 100
+ 515, 520, 525, 530, 535, 540, 545, 550, 555, 560, // 101 - 110
+ 565, 570, 575, 580, 585, 590, 595, 600, 605, 610, // 111 - 120
+ 615, 620, 625, 630, 635, 640, 645, 650, 655, 660, // 121 - 130
+ 665, 670, 675, 680, 685, 690, 695, 700, 705, 710, // 131 - 140
+ 715, 720, 725, 730, 735, 740, 745, 750, 755, 760] // 141 - 150
+}
+Merchant: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 600
+ Sword: 700
+ Axe: 700
+ TwoHandAxe: 750
+ Mace: 700
+ TwoHandMace: 650
+ }
+ InheritHP: ("Acolyte")
+ SPTable:[ 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, // 1 - 10
+ 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, // 11 - 20
+ 73, 76, 79, 82, 85, 88, 91, 94, 97, 100, // 21 - 30
+ 103, 106, 109, 112, 115, 118, 121, 124, 127, 130, // 31 - 40
+ 133, 136, 139, 142, 145, 148, 151, 154, 157, 160, // 41 - 50
+ 163, 166, 169, 172, 175, 178, 181, 184, 187, 190, // 51 - 60
+ 193, 196, 199, 202, 205, 208, 211, 214, 217, 220, // 61 - 70
+ 223, 226, 229, 232, 235, 238, 241, 244, 247, 250, // 71 - 80
+ 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, // 81 - 90
+ 283, 286, 289, 292, 295, 298, 301, 304, 307, 310, // 91 - 100
+ 313, 316, 319, 322, 325, 328, 331, 334, 337, 340, // 101 - 110
+ 343, 346, 349, 352, 355, 358, 361, 364, 367, 370, // 111 - 120
+ 373, 376, 379, 382, 385, 388, 391, 394, 397, 400, // 121 - 130
+ 403, 406, 409, 412, 415, 418, 421, 424, 427, 430, // 131 - 140
+ 433, 436, 439, 442, 445, 448, 451, 454, 457, 460] // 141 - 150
+}
+Thief: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ Sword: 650
+ Axe: 800
+ Bow: 800
+ }
+ InheritHP: ("Archer")
+ InheritSP: ("Swordsman")
+}
+Knight: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ Sword: 500
+ TwoHandSword: 550
+ Spear: 600
+ TwoHandSpear: 600
+ Axe: 700
+ TwoHandAxe: 700
+ Mace: 650
+ TwoHandMace: 700
+ }
+ InheritSP: ("Merchant")
+ HPTable:[ 40, 48, 58, 69, 82, 96, 112, 129, 148, 168, // 1 - 10
+ 190, 213, 238, 264, 292, 321, 352, 384, 418, 453, // 11 - 20
+ 490, 528, 568, 609, 652, 696, 742, 789, 838, 888, // 21 - 30
+ 940, 993, 1048, 1104, 1162, 1221, 1282, 1344, 1408, 1473, // 31 - 40
+ 1540, 1608, 1678, 1749, 1822, 1896, 1972, 2049, 2128, 2208, // 41 - 50
+ 2290, 2373, 2458, 2544, 2632, 2721, 2812, 2904, 2998, 3093, // 51 - 60
+ 3190, 3288, 3388, 3489, 3592, 3696, 3802, 3909, 4018, 4128, // 61 - 70
+ 4240, 4353, 4468, 4584, 4702, 4821, 4942, 5064, 5188, 5313, // 71 - 80
+ 5440, 5568, 5698, 5829, 5962, 6096, 6232, 6369, 6508, 6648, // 81 - 90
+ 6790, 6933, 7078, 7224, 7372, 7521, 7672, 7824, 7978, 8053, // 91 - 100
+ 8128, 8203, 8278, 8353, 8428, 8503, 8578, 8653, 8728, 8803, // 101 - 110
+ 8878, 8953, 9028, 9103, 9178, 9253, 9328, 9403, 9478, 9553, // 111 - 120
+ 9628, 9703, 9778, 9853, 9928, 10003, 10078, 10153, 10228, 10303, // 121 - 130
+ 10378, 10453, 10528, 10603, 10678, 10753, 10828, 10903, 10978, 11053, // 131 - 140
+ 11128, 11203, 11278, 11353, 11428, 11503, 11578, 11653, 11728, 11803] // 141 - 150
+}
+Priest: {
+ Weight: 26000
+ BaseASPD: {
+ Fist: 400
+ Mace: 600
+ TwoHandMace: 600
+ Rod: 600
+ Book: 600
+ TwoHandRod: 600
+ }
+ HPTable:[ 40, 47, 54, 62, 71, 81, 91, 102, 114, 127, // 1 - 10
+ 140, 154, 169, 185, 201, 218, 236, 255, 274, 294, // 11 - 20
+ 315, 337, 359, 382, 406, 431, 456, 482, 509, 537, // 21 - 30
+ 565, 594, 624, 655, 686, 718, 751, 785, 819, 854, // 31 - 40
+ 890, 927, 964, 1002, 1041, 1081, 1121, 1162, 1204, 1247, // 41 - 50
+ 1290, 1334, 1379, 1425, 1471, 1518, 1566, 1615, 1664, 1714, // 51 - 60
+ 1765, 1817, 1869, 1922, 1976, 2031, 2086, 2142, 2199, 2257, // 61 - 70
+ 2315, 2374, 2434, 2495, 2556, 2618, 2681, 2745, 2809, 2874, // 71 - 80
+ 2940, 3007, 3074, 3142, 3211, 3281, 3351, 3422, 3494, 3567, // 81 - 90
+ 3640, 3714, 3789, 3865, 3941, 4018, 4096, 4175, 4254, 4333, // 91 - 100
+ 4412, 4491, 4570, 4649, 4728, 4807, 4886, 4965, 5044, 5123, // 101 - 110
+ 5202, 5281, 5360, 5439, 5518, 5597, 5676, 5755, 5834, 5913, // 111 - 120
+ 5992, 6071, 6150, 6229, 6308, 6387, 6466, 6545, 6624, 6703, // 121 - 130
+ 6782, 6861, 6940, 7019, 7098, 7177, 7256, 7335, 7414, 7493, // 131 - 140
+ 7572, 7651, 7730, 7809, 7888, 7967, 8046, 8125, 8204, 8283] // 141 - 150
+ SPTable:[ 18, 26, 34, 42, 50, 58, 66, 74, 82, 90, // 1 - 10
+ 98, 106, 114, 122, 130, 138, 146, 154, 162, 170, // 11 - 20
+ 178, 186, 194, 202, 210, 218, 226, 234, 242, 250, // 21 - 30
+ 258, 266, 274, 282, 290, 298, 306, 314, 322, 330, // 31 - 40
+ 338, 346, 354, 362, 370, 378, 386, 394, 402, 410, // 41 - 50
+ 418, 426, 434, 442, 450, 458, 466, 474, 482, 490, // 51 - 60
+ 498, 506, 514, 522, 530, 538, 546, 554, 562, 570, // 61 - 70
+ 578, 586, 594, 602, 610, 618, 626, 634, 642, 650, // 71 - 80
+ 658, 666, 674, 682, 690, 698, 706, 714, 722, 730, // 81 - 90
+ 738, 746, 754, 762, 770, 778, 786, 794, 802, 810, // 91 - 100
+ 818, 826, 834, 842, 850, 858, 866, 874, 882, 890, // 101 - 110
+ 898, 906, 914, 922, 930, 938, 946, 954, 962, 970, // 111 - 120
+ 978, 986, 994, 1002, 1010, 1018, 1026, 1034, 1042, 1050, // 121 - 130
+ 1058, 1066, 1074, 1082, 1090, 1098, 1106, 1114, 1122, 1130, // 131 - 140
+ 1138, 1146, 1154, 1162, 1170, 1178, 1186, 1194, 1202, 1210] // 141 - 150
+}
+Wizard: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 500
+ Dagger: 575
+ Rod: 625
+ TwoHandRod: 625
+ }
+ HPTable:[ 40, 46, 53, 60, 68, 76, 85, 94, 104, 115, // 1 - 10
+ 126, 138, 150, 163, 176, 190, 204, 219, 234, 250, // 11 - 20
+ 267, 284, 302, 320, 339, 358, 378, 398, 419, 441, // 21 - 30
+ 463, 486, 509, 533, 557, 582, 607, 633, 659, 686, // 31 - 40
+ 714, 742, 771, 800, 830, 860, 891, 922, 954, 987, // 41 - 50
+ 1020, 1054, 1088, 1123, 1158, 1194, 1230, 1267, 1304, 1342, // 51 - 60
+ 1381, 1420, 1460, 1500, 1541, 1582, 1624, 1666, 1709, 1753, // 61 - 70
+ 1797, 1842, 1887, 1933, 1979, 2026, 2073, 2121, 2169, 2218, // 71 - 80
+ 2268, 2318, 2369, 2420, 2472, 2524, 2577, 2630, 2684, 2739, // 81 - 90
+ 2794, 2850, 2906, 2963, 3020, 3078, 3136, 3195, 3254, 3313, // 91 - 100
+ 3372, 3431, 3490, 3549, 3608, 3667, 3726, 3785, 3844, 3903, // 101 - 110
+ 3962, 4021, 4080, 4139, 4198, 4257, 4316, 4375, 4434, 4493, // 111 - 120
+ 4552, 4611, 4670, 4729, 4788, 4847, 4906, 4965, 5024, 5083, // 121 - 130
+ 5142, 5201, 5260, 5319, 5378, 5437, 5496, 5555, 5614, 5673, // 131 - 140
+ 5732, 5791, 5850, 5909, 5968, 6027, 6086, 6145, 6204, 6263] // 141 - 150
+ SPTable:[ 19, 28, 37, 46, 55, 64, 73, 82, 91, 100, // 1 - 10
+ 109, 118, 127, 136, 145, 154, 163, 172, 181, 190, // 11 - 20
+ 199, 208, 217, 226, 235, 244, 253, 262, 271, 280, // 21 - 30
+ 289, 298, 307, 316, 325, 334, 343, 352, 361, 370, // 31 - 40
+ 379, 388, 397, 406, 415, 424, 433, 442, 451, 460, // 41 - 50
+ 469, 478, 487, 496, 505, 514, 523, 532, 541, 550, // 51 - 60
+ 559, 568, 577, 586, 595, 604, 613, 622, 631, 640, // 61 - 70
+ 649, 658, 667, 676, 685, 694, 703, 712, 721, 730, // 71 - 80
+ 739, 748, 757, 766, 775, 784, 793, 802, 811, 820, // 81 - 90
+ 829, 838, 847, 856, 865, 874, 883, 892, 901, 910, // 91 - 100
+ 919, 928, 937, 946, 955, 964, 973, 982, 991, 1000, // 101 - 110
+ 1009, 1018, 1027, 1036, 1045, 1054, 1063, 1072, 1081, 1090, // 111 - 120
+ 1099, 1108, 1117, 1126, 1135, 1144, 1153, 1162, 1171, 1180, // 121 - 130
+ 1189, 1198, 1207, 1216, 1225, 1234, 1243, 1252, 1261, 1270, // 131 - 140
+ 1279, 1288, 1297, 1306, 1315, 1324, 1333, 1342, 1351, 1360] // 141 - 150
+}
+Blacksmith: {
+ Weight: 30000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 600
+ Sword: 650
+ Axe: 650
+ TwoHandAxe: 650
+ Mace: 675
+ TwoHandMace: 675
+ }
+ HPTable:[ 40, 47, 55, 64, 74, 84, 95, 107, 120, 134, // 1 - 10
+ 149, 165, 182, 200, 219, 238, 258, 279, 301, 324, // 11 - 20
+ 348, 373, 399, 426, 454, 482, 511, 541, 572, 604, // 21 - 30
+ 637, 671, 706, 742, 779, 816, 854, 893, 933, 974, // 31 - 40
+ 1016, 1059, 1103, 1148, 1194, 1240, 1287, 1335, 1384, 1434, // 41 - 50
+ 1485, 1537, 1590, 1644, 1699, 1754, 1810, 1867, 1925, 1984, // 51 - 60
+ 2044, 2105, 2167, 2230, 2294, 2358, 2423, 2489, 2556, 2624, // 61 - 70
+ 2693, 2763, 2834, 2906, 2979, 3052, 3126, 3201, 3277, 3354, // 71 - 80
+ 3432, 3511, 3591, 3672, 3754, 3836, 3919, 4003, 4088, 4174, // 81 - 90
+ 4261, 4349, 4438, 4528, 4619, 4710, 4802, 4895, 4989, 5082, // 91 - 100
+ 5176, 5269, 5363, 5456, 5550, 5643, 5737, 5830, 5924, 6017, // 101 - 110
+ 6111, 6204, 6298, 6391, 6485, 6578, 6672, 6765, 6859, 6952, // 111 - 120
+ 7046, 7139, 7233, 7326, 7420, 7513, 7607, 7700, 7794, 7887, // 121 - 130
+ 7981, 8074, 8168, 8261, 8355, 8448, 8542, 8635, 8729, 8822, // 131 - 140
+ 8916, 9009, 9103, 9196, 9290, 9383, 9477, 9570, 9664, 9757] // 141 - 150
+ SPTable:[ 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, // 1 - 10
+ 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, // 11 - 20
+ 94, 98, 102, 106, 110, 114, 118, 122, 126, 130, // 21 - 30
+ 134, 138, 142, 146, 150, 154, 158, 162, 166, 170, // 31 - 40
+ 174, 178, 182, 186, 190, 194, 198, 202, 206, 210, // 41 - 50
+ 214, 218, 222, 226, 230, 234, 238, 242, 246, 250, // 51 - 60
+ 254, 258, 262, 266, 270, 274, 278, 282, 286, 290, // 61 - 70
+ 294, 298, 302, 306, 310, 314, 318, 322, 326, 330, // 71 - 80
+ 334, 338, 342, 346, 350, 354, 358, 362, 366, 370, // 81 - 90
+ 374, 378, 382, 386, 390, 394, 398, 402, 406, 410, // 91 - 100
+ 414, 418, 422, 426, 430, 434, 438, 442, 446, 450, // 101 - 110
+ 454, 458, 462, 466, 470, 474, 478, 482, 486, 490, // 111 - 120
+ 494, 498, 502, 506, 510, 514, 518, 522, 526, 530, // 121 - 130
+ 534, 538, 542, 546, 550, 554, 558, 562, 566, 570, // 131 - 140
+ 574, 578, 582, 586, 590, 594, 598, 602, 606, 610] // 141 - 150
+}
+Hunter: {
+ Weight: 27000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 600
+ Bow: 600
+ }
+ InheritSP: ("Blacksmith")
+ HPTable:[ 40, 47, 55, 63, 72, 82, 93, 105, 118, 132, // 1 - 10
+ 146, 161, 177, 194, 212, 231, 250, 270, 291, 313, // 11 - 20
+ 336, 360, 385, 410, 436, 463, 491, 520, 550, 581, // 21 - 30
+ 612, 644, 677, 711, 746, 782, 818, 855, 893, 932, // 31 - 40
+ 972, 1013, 1055, 1097, 1140, 1184, 1229, 1275, 1322, 1370, // 41 - 50
+ 1418, 1467, 1517, 1568, 1620, 1673, 1726, 1780, 1835, 1891, // 51 - 60
+ 1948, 2006, 2065, 2124, 2184, 2245, 2307, 2370, 2434, 2499, // 61 - 70
+ 2564, 2630, 2697, 2765, 2834, 2904, 2974, 3045, 3117, 3190, // 71 - 80
+ 3264, 3339, 3415, 3491, 3568, 3646, 3725, 3805, 3886, 3968, // 81 - 90
+ 4050, 4133, 4217, 4302, 4388, 4475, 4562, 4650, 4739, 4827, // 91 - 100
+ 4916, 5004, 5093, 5181, 5270, 5358, 5447, 5535, 5624, 5712, // 101 - 110
+ 5801, 5889, 5978, 6066, 6155, 6243, 6332, 6420, 6509, 6597, // 111 - 120
+ 6686, 6774, 6863, 6951, 7040, 7128, 7217, 7305, 7394, 7482, // 121 - 130
+ 7571, 7659, 7748, 7836, 7925, 8013, 8102, 8190, 8279, 8367, // 131 - 140
+ 8456, 8544, 8633, 8721, 8810, 8898, 8987, 9075, 9164, 9252] // 141 - 150
+}
+Assassin: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ Sword: 650
+ Axe: 800
+ Katar: 500
+ Revolver: 750
+ Rifle: 975
+ GatlingGun: 1200
+ Shotgun: 880
+ GrenadeLauncher: 975
+ FuumaShuriken: 1085
+ }
+ InheritSP: ("Blacksmith")
+ HPTable:[ 40, 47, 55, 64, 75, 87, 100, 114, 129, 145, // 1 - 10
+ 162, 180, 199, 219, 241, 264, 288, 313, 339, 366, // 11 - 20
+ 394, 423, 453, 484, 517, 551, 586, 622, 659, 697, // 21 - 30
+ 736, 776, 817, 859, 903, 948, 994, 1041, 1089, 1138, // 31 - 40
+ 1188, 1239, 1291, 1344, 1399, 1455, 1512, 1570, 1629, 1689, // 41 - 50
+ 1750, 1812, 1875, 1939, 2005, 2072, 2140, 2209, 2279, 2350, // 51 - 60
+ 2422, 2495, 2569, 2644, 2721, 2799, 2878, 2958, 3039, 3121, // 61 - 70
+ 3204, 3288, 3373, 3459, 3547, 3636, 3726, 3817, 3909, 4002, // 71 - 80
+ 4096, 4191, 4287, 4384, 4483, 4583, 4684, 4786, 4889, 4993, // 81 - 90
+ 5098, 5204, 5311, 5419, 5529, 5640, 5752, 5865, 5979, 6092, // 91 - 100
+ 6206, 6319, 6433, 6546, 6660, 6773, 6887, 7000, 7114, 7227, // 101 - 110
+ 7341, 7454, 7568, 7681, 7795, 7908, 8022, 8135, 8249, 8362, // 111 - 120
+ 8476, 8589, 8703, 8816, 8930, 9043, 9157, 9270, 9384, 9497, // 121 - 130
+ 9611, 9724, 9838, 9951, 10065, 10178, 10292, 10405, 10519, 10632, // 131 - 140
+ 10746, 10859, 10973, 11086, 11200, 11313, 11427, 11540, 11654, 11767] // 141 - 150
+}
+Crusader: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ Sword: 500
+ TwoHandSword: 550
+ Spear: 600
+ TwoHandSpear: 600
+ Axe: 700
+ TwoHandAxe: 700
+ Mace: 650
+ TwoHandMace: 650
+ }
+ HPTable:[ 40, 47, 56, 62, 81, 94, 108, 128, 147, 165, // 1 - 10
+ 184, 204, 225, 247, 271, 296, 322, 349, 377, 406, // 11 - 20
+ 436, 467, 499, 532, 567, 603, 640, 678, 717, 757, // 21 - 30
+ 798, 840, 883, 927, 973, 1020, 1068, 1117, 1167, 1218, // 31 - 40
+ 1270, 1323, 1377, 1432, 1489, 1547, 1606, 1666, 1727, 1789, // 41 - 50
+ 1852, 1916, 1981, 2047, 2115, 2184, 2254, 2325, 2397, 2470, // 51 - 60
+ 2544, 2619, 2695, 2772, 2851, 2931, 3012, 3094, 3177, 3261, // 61 - 70
+ 3346, 3432, 3519, 3607, 3697, 3788, 3880, 3973, 4067, 4162, // 71 - 80
+ 4258, 4355, 4453, 4552, 4653, 4755, 4858, 4962, 5067, 5173, // 81 - 90
+ 5280, 5388, 5497, 5607, 5719, 5832, 5946, 6061, 6177, 6292, // 91 - 100
+ 6408, 6523, 6639, 6754, 6870, 6985, 7101, 7216, 7332, 7447, // 101 - 110
+ 7563, 7678, 7794, 7909, 8025, 8140, 8256, 8371, 8487, 8602, // 111 - 120
+ 8718, 8833, 8949, 9064, 9180, 9295, 9411, 9526, 9642, 9757, // 121 - 130
+ 9873, 9988, 10104, 10219, 10335, 10450, 10566, 10681, 10797, 10912, // 131 - 140
+ 11028, 11143, 11259, 11374, 11490, 11605, 11721, 11836, 11952, 12067] // 141 - 150
+ SPTable:[ 14, 19, 24, 28, 33, 38, 42, 47, 52, 57, // 1 - 10
+ 61, 66, 71, 75, 80, 85, 89, 94, 99, 104, // 11 - 20
+ 108, 113, 118, 122, 127, 132, 136, 141, 146, 151, // 21 - 30
+ 155, 160, 165, 169, 174, 179, 183, 188, 193, 198, // 31 - 40
+ 202, 207, 212, 216, 221, 226, 230, 235, 240, 245, // 41 - 50
+ 249, 254, 259, 263, 268, 273, 277, 282, 287, 292, // 51 - 60
+ 296, 301, 306, 310, 315, 320, 324, 329, 334, 339, // 61 - 70
+ 343, 348, 353, 357, 362, 367, 371, 376, 381, 386, // 71 - 80
+ 390, 395, 400, 404, 409, 414, 418, 423, 428, 433, // 81 - 90
+ 437, 442, 447, 451, 456, 461, 465, 470, 475, 480, // 91 - 100
+ 484, 489, 494, 498, 503, 508, 512, 517, 522, 527, // 101 - 110
+ 531, 536, 541, 545, 550, 555, 559, 564, 569, 574, // 111 - 120
+ 578, 583, 588, 592, 597, 602, 606, 611, 616, 621, // 121 - 130
+ 625, 630, 635, 639, 644, 649, 653, 658, 663, 668, // 131 - 140
+ 672, 677, 682, 686, 691, 696, 700, 705, 710, 715] // 141 - 150
+}
+Rogue: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ Sword: 550
+ Bow: 650
+ }
+ InheritHP: ("Hunter")
+ InheritSP: ("Acolyte")
+}
+Sage: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 450
+ Dagger: 525
+ Sword: 575
+ Rod: 625
+ Book: 550
+ TwoHandRod: 625
+ }
+ InheritHP: ("Priest")
+ SPTable:[ 17, 24, 31, 38, 45, 52, 59, 66, 73, 80, // 1 - 10
+ 87, 94, 101, 108, 115, 122, 129, 136, 143, 150, // 11 - 20
+ 157, 164, 171, 178, 185, 192, 199, 206, 213, 220, // 21 - 30
+ 227, 234, 241, 248, 255, 262, 269, 276, 283, 290, // 31 - 40
+ 297, 304, 311, 318, 325, 332, 339, 346, 353, 360, // 41 - 50
+ 367, 374, 381, 388, 395, 402, 409, 416, 423, 430, // 51 - 60
+ 437, 444, 451, 458, 465, 472, 479, 486, 493, 500, // 61 - 70
+ 507, 514, 521, 528, 535, 542, 549, 556, 563, 570, // 71 - 80
+ 577, 584, 591, 598, 605, 612, 619, 626, 633, 640, // 81 - 90
+ 647, 654, 661, 668, 675, 682, 689, 696, 703, 710, // 91 - 100
+ 717, 724, 731, 738, 745, 752, 759, 766, 773, 780, // 101 - 110
+ 787, 794, 801, 808, 815, 822, 829, 836, 843, 850, // 111 - 120
+ 857, 864, 871, 878, 885, 892, 899, 906, 913, 920, // 121 - 130
+ 927, 934, 941, 948, 955, 962, 969, 976, 983, 990, // 131 - 140
+ 997, 1004, 1011, 1018, 1025, 1032, 1039, 1046, 1053, 1060] // 141 - 150
+}
+Alchemist: {
+ BaseASPD: {
+ Fist: 400
+ Dagger: 550
+ Sword: 575
+ Axe: 675
+ TwoHandAxe: 700
+ Mace: 650
+ TwoHandMace: 650
+ }
+ Inherit: ("Blacksmith")
+}
+Monk: {
+ Weight: 26000
+ BaseASPD: {
+ Fist: 400
+ Mace: 575
+ TwoHandMace: 575
+ Rod: 575
+ Knuckle: 475
+ TwoHandRod: 575
+ }
+ InheritSP: ("Crusader")
+ HPTable:[ 40, 47, 55, 64, 74, 84, 95, 107, 120, 134, // 1 - 10
+ 149, 165, 182, 200, 219, 238, 258, 306, 329, 354, // 11 - 20
+ 379, 406, 433, 462, 491, 521, 551, 583, 615, 649, // 21 - 30
+ 683, 719, 755, 793, 831, 870, 909, 950, 991, 1034, // 31 - 40
+ 1077, 1122, 1167, 1214, 1261, 1309, 1357, 1407, 1457, 1509, // 41 - 50
+ 1561, 1615, 1669, 1725, 1781, 1838, 1895, 1954, 2013, 2074, // 51 - 60
+ 2135, 2198, 2261, 2326, 2391, 2457, 2523, 2591, 2659, 2729, // 61 - 70
+ 2799, 2871, 2943, 3017, 3091, 3166, 3241, 3318, 3395, 3474, // 71 - 80
+ 3553, 3634, 3715, 3798, 3881, 3965, 4049, 4135, 4221, 4309, // 81 - 90
+ 4397, 4487, 4577, 4669, 4761, 4854, 4947, 5042, 5137, 5232, // 91 - 100
+ 5327, 5422, 5517, 5612, 5707, 5802, 5897, 5992, 6087, 6182, // 101 - 110
+ 6277, 6372, 6467, 6562, 6657, 6752, 6847, 6942, 7037, 7132, // 111 - 120
+ 7227, 7322, 7417, 7512, 7607, 7702, 7797, 7892, 7987, 8082, // 121 - 130
+ 8177, 8272, 8367, 8462, 8557, 8652, 8747, 8842, 8937, 9032, // 131 - 140
+ 9127, 9222, 9317, 9412, 9507, 9602, 9697, 9792, 9887, 9982] // 141 - 150
+}
+Bard: {
+ Weight: 27000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 550
+ Bow: 650
+ Instrument: 575
+ }
+ InheritSP: ("Magician")
+ HPTable:[ 40, 47, 54, 62, 71, 81, 91, 102, 114, 127, // 1 - 10
+ 140, 154, 169, 180, 196, 212, 224, 242, 260, 278, // 11 - 20
+ 296, 316, 330, 350, 371, 393, 415, 438, 451, 477, // 21 - 30
+ 503, 530, 558, 587, 616, 646, 677, 709, 741, 774, // 31 - 40
+ 808, 843, 878, 914, 951, 989, 1027, 1066, 1106, 1147, // 41 - 50
+ 1188, 1230, 1273, 1317, 1361, 1406, 1452, 1499, 1546, 1594, // 51 - 60
+ 1643, 1693, 1743, 1794, 1846, 1899, 1952, 2006, 2061, 2117, // 61 - 70
+ 2173, 2230, 2288, 2347, 2406, 2466, 2527, 2589, 2651, 2714, // 71 - 80
+ 2778, 2843, 2908, 2974, 3041, 3109, 3177, 3246, 3316, 3387, // 81 - 90
+ 3458, 3530, 3603, 3677, 3751, 3826, 3902, 3979, 4056, 4133, // 91 - 100
+ 4210, 4287, 4364, 4441, 4518, 4595, 4672, 4749, 4826, 4903, // 101 - 110
+ 4980, 5057, 5134, 5211, 5288, 5365, 5442, 5519, 5596, 5673, // 111 - 120
+ 5750, 5827, 5904, 5981, 6058, 6135, 6212, 6289, 6366, 6443, // 121 - 130
+ 6520, 6597, 6674, 6751, 6828, 6905, 6982, 7059, 7136, 7213, // 131 - 140
+ 7290, 7367, 7444, 7521, 7598, 7675, 7752, 7829, 7906, 7983] // 141 - 150
+}
+Dancer: {
+ BaseASPD: {
+ Whip: 575
+ Instrument: 2000
+ }
+ Inherit: ("Bard")
+}
+Taekwon: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ Sword: 500
+ TwoHandSword: 500
+ Spear: 500
+ TwoHandSpear: 500
+ Axe: 500
+ TwoHandAxe: 500
+ Mace: 500
+ TwoHandMace: 500
+ Rod: 500
+ Bow: 500
+ Knuckle: 500
+ Instrument: 500
+ Whip: 500
+ Book: 500
+ Katar: 500
+ Revolver: 500
+ Rifle: 500
+ GatlingGun: 500
+ Shotgun: 500
+ GrenadeLauncher: 500
+ FuumaShuriken: 500
+ TwoHandRod: 500
+ }
+ HPTable:[ 40, 46, 53, 61, 70, 79, 89, 100, 111, 123, // 1 - 10
+ 136, 149, 163, 178, 194, 210, 227, 245, 263, 282, // 11 - 20
+ 302, 322, 343, 365, 388, 411, 435, 460, 485, 511, // 21 - 30
+ 538, 565, 593, 622, 652, 682, 713, 745, 777, 810, // 31 - 40
+ 844, 878, 913, 949, 986, 1023, 1061, 1100, 1139, 1179, // 41 - 50
+ 1220, 1261, 1303, 1346, 1390, 1434, 1479, 1525, 1571, 1618, // 51 - 60
+ 1666, 1714, 1763, 1813, 1864, 1915, 1967, 2020, 2073, 2127, // 61 - 70
+ 2137, 2147, 2157, 2167, 2177, 2187, 2197, 2200, 2210, 2230, // 71 - 80
+ 2250, 2300, 2350, 2400, 2450, 2500, 2550, 2600, 2650, 2700, // 81 - 90
+ 2750, 2800, 2850, 2900, 2950, 3000, 3050, 3100, 3200, 3267, // 91 - 100
+ 3342, 3417, 3492, 3567, 3642, 3717, 3792, 3867, 3942, 4017, // 101 - 110
+ 4092, 4167, 4242, 4317, 4392, 4467, 4542, 4617, 4692, 4767, // 111 - 120
+ 4842, 4917, 4992, 5067, 5142, 5217, 5292, 5367, 5442, 5517, // 121 - 130
+ 5592, 5667, 5742, 5817, 5892, 5967, 6042, 6117, 6192, 6267, // 131 - 140
+ 6342, 6417, 6492, 6567, 6642, 6717, 6792, 6867, 6942, 7017] // 141 - 150
+ SPTable:[ 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, // 1 - 10
+ 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, // 11 - 20
+ 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, // 21 - 30
+ 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, // 31 - 40
+ 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, // 41 - 50
+ 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, // 51 - 60
+ 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, // 61 - 70
+ 151, 152, 153, 154, 155, 156, 157, 158, 159, 170, // 71 - 80
+ 171, 172, 173, 174, 175, 176, 177, 178, 188, 190, // 81 - 90
+ 190, 190, 190, 190, 190, 190, 190, 190, 200, 200, // 91 - 100
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, // 101 - 110
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, // 111 - 120
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, // 121 - 130
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, // 131 - 140
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200] // 141 - 150
+}
+Star_Gladiator: {
+ Inherit: ("Taekwon")
+ HPTable:[ 40, 47, 55, 64, 74, 84, 95, 107, 120, 134, // 1 - 10
+ 149, 165, 182, 200, 219, 238, 258, 306, 329, 354, // 11 - 20
+ 379, 406, 433, 462, 491, 521, 551, 583, 615, 649, // 21 - 30
+ 683, 719, 755, 793, 831, 870, 909, 950, 991, 1034, // 31 - 40
+ 1077, 1122, 1167, 1214, 1261, 1309, 1357, 1407, 1457, 1509, // 41 - 50
+ 1561, 1615, 1669, 1725, 1781, 1838, 1895, 1954, 2013, 2074, // 51 - 60
+ 2135, 2198, 2261, 2326, 2391, 2457, 2523, 2591, 2659, 2670, // 61 - 70
+ 2680, 2690, 2700, 2710, 2720, 2730, 2740, 2750, 2760, 3000, // 71 - 80
+ 3020, 3040, 3060, 3080, 3100, 3120, 3140, 3160, 3180, 3455, // 81 - 90
+ 3524, 3593, 3663, 3734, 3806, 3878, 3951, 4025, 4500, 4562, // 91 - 100
+ 4624, 4686, 4748, 4810, 4872, 4934, 4996, 5058, 5120, 5182, // 101 - 110
+ 5244, 5306, 5368, 5430, 5492, 5554, 5616, 5678, 5740, 5802, // 111 - 120
+ 5864, 5926, 5988, 6050, 6112, 6174, 6236, 6298, 6360, 6422, // 121 - 130
+ 6484, 6546, 6608, 6670, 6732, 6794, 6856, 6918, 6980, 7042, // 131 - 140
+ 7104, 7166, 7228, 7290, 7352, 7414, 7476, 7538, 7600, 7662] // 141 - 150
+ SPTable:[ 14, 19, 24, 28, 33, 38, 42, 47, 52, 57, // 1 - 10
+ 61, 66, 71, 75, 80, 85, 89, 94, 99, 104, // 11 - 20
+ 108, 113, 118, 122, 127, 132, 136, 141, 146, 151, // 21 - 30
+ 155, 160, 165, 169, 174, 179, 183, 188, 193, 198, // 31 - 40
+ 202, 207, 212, 216, 221, 226, 230, 235, 240, 245, // 41 - 50
+ 249, 254, 259, 263, 268, 273, 277, 282, 287, 292, // 51 - 60
+ 296, 301, 306, 310, 315, 320, 324, 329, 334, 339, // 61 - 70
+ 341, 343, 345, 347, 349, 351, 353, 355, 357, 386, // 71 - 80
+ 388, 390, 392, 394, 396, 398, 400, 402, 404, 430, // 81 - 90
+ 433, 436, 439, 442, 445, 448, 451, 454, 500, 500, // 91 - 100
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, // 101 - 110
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, // 111 - 120
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, // 121 - 130
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, // 131 - 140
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500] // 141 - 150
+}
+Soul_Linker: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 500
+ Dagger: 575
+ Rod: 625
+ TwoHandRod: 625
+ }
+ HPTable:[ 40, 47, 54, 62, 71, 81, 91, 102, 114, 127, // 1 - 10
+ 140, 154, 169, 185, 201, 218, 236, 255, 274, 294, // 11 - 20
+ 315, 337, 359, 382, 406, 431, 456, 482, 509, 537, // 21 - 30
+ 565, 594, 624, 655, 686, 718, 751, 785, 819, 854, // 31 - 40
+ 890, 927, 964, 1002, 1041, 1081, 1121, 1162, 1204, 1247, // 41 - 50
+ 1290, 1334, 1379, 1425, 1471, 1518, 1566, 1615, 1664, 1714, // 51 - 60
+ 1765, 1817, 1869, 1922, 1976, 2031, 2086, 2142, 2199, 2257, // 61 - 70
+ 2275, 2294, 2314, 2335, 2356, 2378, 2401, 2425, 2449, 2874, // 71 - 80
+ 2890, 2907, 2924, 2942, 2971, 2991, 3011, 3032, 3054, 3567, // 81 - 90
+ 3590, 3614, 3649, 3675, 3701, 3728, 3756, 3800, 4250, 4305, // 91 - 100
+ 4360, 4415, 4470, 4525, 4580, 4635, 4690, 4745, 4800, 4855, // 101 - 110
+ 4910, 4965, 5020, 5075, 5130, 5185, 5240, 5295, 5350, 5405, // 111 - 120
+ 5460, 5515, 5570, 5625, 5680, 5735, 5790, 5845, 5900, 5955, // 121 - 130
+ 6010, 6065, 6120, 6175, 6230, 6285, 6340, 6395, 6450, 6505, // 131 - 140
+ 6560, 6615, 6670, 6725, 6780, 6835, 6890, 6945, 7000, 7055] // 141 - 150
+ SPTable:[ 19, 28, 37, 46, 55, 64, 73, 82, 91, 100, // 1 - 10
+ 109, 118, 127, 136, 145, 154, 163, 172, 181, 190, // 11 - 20
+ 199, 208, 217, 226, 235, 244, 253, 262, 271, 280, // 21 - 30
+ 289, 298, 307, 316, 325, 334, 343, 352, 361, 370, // 31 - 40
+ 379, 388, 397, 406, 415, 424, 433, 442, 451, 460, // 41 - 50
+ 469, 478, 487, 496, 505, 514, 523, 532, 541, 550, // 51 - 60
+ 559, 568, 577, 586, 595, 604, 613, 622, 631, 635, // 61 - 70
+ 640, 645, 650, 655, 660, 665, 670, 675, 680, 730, // 71 - 80
+ 735, 740, 745, 750, 755, 760, 765, 770, 775, 820, // 81 - 90
+ 825, 830, 845, 850, 855, 860, 865, 870, 900, 900, // 91 - 100
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, // 101 - 110
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, // 111 - 120
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, // 121 - 130
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, // 131 - 140
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 900] // 141 - 150
+}
+Gunslinger: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 500
+ Revolver: 700
+ Rifle: 750
+ GatlingGun: 700
+ Shotgun: 1500
+ GrenadeLauncher: 1500
+ }
+ InheritHP: ("Star_Gladiator")
+ SPTable:[ 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, // 1 - 10
+ 42, 45, 48, 51, 54, 57, 61, 64, 67, 70, // 11 - 20
+ 73, 76, 79, 82, 85, 89, 93, 97, 101, 105, // 21 - 30
+ 109, 113, 117, 121, 125, 129, 131, 135, 139, 141, // 31 - 40
+ 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, // 41 - 50
+ 186, 191, 196, 201, 206, 211, 216, 221, 226, 231, // 51 - 60
+ 236, 241, 246, 251, 256, 261, 266, 271, 276, 281, // 61 - 70
+ 286, 291, 296, 301, 306, 312, 318, 324, 336, 342, // 71 - 80
+ 348, 354, 360, 366, 372, 378, 384, 390, 396, 402, // 81 - 90
+ 408, 414, 420, 426, 432, 438, 444, 450, 456, 462, // 91 - 100
+ 468, 474, 480, 486, 492, 498, 504, 510, 516, 522, // 101 - 110
+ 528, 534, 540, 546, 552, 558, 564, 570, 576, 582, // 111 - 120
+ 588, 594, 600, 606, 612, 618, 624, 630, 636, 642, // 121 - 130
+ 648, 654, 660, 666, 672, 678, 684, 690, 696, 702, // 131 - 140
+ 708, 714, 720, 726, 732, 738, 744, 750, 756, 762] // 141 - 150
+}
+Ninja: {
+ Weight: 26000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ FuumaShuriken: 750
+ }
+ InheritHP: ("Soul_Linker")
+ SPTable:[ 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, // 1 - 10
+ 44, 47, 50, 53, 56, 59, 62, 65, 68, 71, // 11 - 20
+ 75, 79, 83, 87, 91, 95, 99, 103, 107, 111, // 21 - 30
+ 115, 119, 123, 127, 131, 135, 139, 143, 147, 151, // 31 - 40
+ 156, 161, 166, 171, 176, 181, 186, 191, 196, 201, // 41 - 50
+ 206, 211, 216, 221, 226, 231, 236, 241, 246, 251, // 51 - 60
+ 257, 263, 269, 275, 281, 287, 293, 299, 305, 311, // 61 - 70
+ 317, 323, 329, 335, 341, 347, 353, 359, 365, 371, // 71 - 80
+ 378, 386, 394, 402, 410, 418, 426, 434, 442, 450, // 81 - 90
+ 458, 466, 474, 482, 490, 498, 506, 514, 522, 530, // 91 - 100
+ 538, 546, 554, 562, 570, 578, 586, 594, 602, 610, // 101 - 110
+ 618, 626, 634, 642, 650, 658, 666, 674, 682, 690, // 111 - 120
+ 698, 706, 714, 722, 730, 738, 746, 754, 762, 770, // 121 - 130
+ 778, 786, 794, 802, 810, 818, 826, 834, 842, 850, // 131 - 140
+ 858, 866, 874, 882, 890, 898, 906, 914, 922, 930] // 141 - 150
+}
+Gangsi: {
+ Weight: 32000
+ InheritSP: ("Novice")
+ BaseASPD: {
+ Fist: 400
+ Dagger: 550
+ Sword: 550
+ TwoHandSword: 550
+ Spear: 550
+ TwoHandSpear: 550
+ Axe: 550
+ TwoHandAxe: 550
+ Mace: 550
+ TwoHandMace: 550
+ Rod: 550
+ Bow: 550
+ Knuckle: 550
+ Instrument: 550
+ Whip: 550
+ Book: 550
+ Katar: 550
+ Revolver: 550
+ Rifle: 550
+ GatlingGun: 550
+ Shotgun: 550
+ GrenadeLauncher: 550
+ FuumaShuriken: 550
+ TwoHandRod: 550
+ }
+ HPTable:[ 40, 46, 53, 60, 68, 76, 85, 94, 104, 114, // 1 - 10
+ 125, 136, 148, 160, 173, 186, 200, 214, 229, 244, // 11 - 20
+ 260, 276, 293, 310, 328, 346, 365, 384, 404, 424, // 21 - 30
+ 445, 466, 488, 510, 533, 556, 580, 604, 629, 654, // 31 - 40
+ 680, 706, 733, 760, 788, 816, 845, 874, 904, 934, // 41 - 50
+ 965, 996, 1028, 1060, 1093, 1126, 1160, 1194, 1229, 1264, // 51 - 60
+ 1300, 1336, 1373, 1410, 1448, 1486, 1525, 1564, 1604, 1644, // 61 - 70
+ 1685, 1726, 1768, 1810, 1853, 1896, 1940, 1984, 2029, 2074, // 71 - 80
+ 2120, 2166, 2213, 2260, 2308, 2356, 2405, 2454, 2504, 2554, // 81 - 90
+ 2605, 2656, 2708, 2760, 2813, 2866, 2920, 2974, 3029] // 91 - 99
+}
+Death_Knight: {
+ Weight: 36000
+ Inherit: ("Gangsi")
+}
+Dark_Collector: {
+ Weight: 40000
+ Inherit: ("Gangsi")
+}
+Rune_Knight: {
+ Weight: 35000
+ InheritSP: ("Merchant")
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ Sword: 520
+ TwoHandSword: 550
+ Spear: 600
+ TwoHandSpear: 580
+ Axe: 480
+ TwoHandAxe: 520
+ Mace: 450
+ TwoHandMace: 520
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 8100, 8133, // 91 - 100
+ 8242, 8352, 8464, 8576, 8690, 8804, 8920, 9036, 9154, 9273, // 101 - 110
+ 9393, 9514, 9636, 9759, 9883, 10008, 10134, 10261, 10389, 10518, // 111 - 120
+ 10648, 10779, 10912, 11045, 11180, 11315, 11452, 11589, 11728, 11868, // 121 - 130
+ 12009, 12151, 12294, 12438, 12583, 12729, 12876, 13024, 13173, 13323, // 131 - 140
+ 13474, 13626, 13780, 13934, 14090, 14246, 14404, 14562, 14722, 14883] // 141 - 150
+}
+Warlock: {
+ Weight: 30000
+ InheritSP: ("Wizard")
+ BaseASPD: {
+ Fist: 450
+ Dagger: 520
+ Sword: 600
+ Rod: 500
+ TwoHandRod: 560
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 3200, 3313, // 91 - 100
+ 3383, 3455, 3528, 3601, 3675, 3749, 3824, 3899, 3975, 4051, // 101 - 110
+ 4129, 4208, 4287, 4367, 4447, 4528, 4609, 4691, 4773, 4857, // 111 - 120
+ 4941, 5026, 5112, 5198, 5285, 5372, 5460, 5548, 5638, 5728, // 121 - 130
+ 5819, 5911, 6003, 6096, 6189, 6283, 6377, 6473, 6569, 6666, // 131 - 140
+ 6763, 6861, 6960, 7059, 7159, 7259, 7361, 7463, 7566, 7669] // 141 - 150
+}
+Ranger: {
+ Weight: 32000
+ InheritSP: ("Blacksmith")
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ Bow: 490
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 4800, 4828, // 91 - 100
+ 4918, 5009, 5101, 5194, 5288, 5382, 5477, 5573, 5670, 5768, // 101 - 110
+ 5867, 5967, 6068, 6170, 6273, 6377, 6482, 6588, 6694, 6801, // 111 - 120
+ 6909, 7018, 7128, 7239, 7351, 7464, 7578, 7693, 7809, 7926, // 121 - 130
+ 8044, 8162, 8281, 8401, 8522, 8644, 8767, 8891, 9016, 9142, // 131 - 140
+ 9269, 9397, 9526, 9656, 9786, 9917, 10049, 10182, 10316, 10451] // 141 - 150
+}
+Arch_Bishop: {
+ Inherit: ("Priest")
+ Weight: 30000
+ BaseASPD: {
+ Fist: 450
+ Mace: 450
+ TwoHandMace: 450
+ Rod: 600
+ Knuckle: 500
+ Book: 440
+ TwoHandRod: 550
+ }
+}
+Mechanic: {
+ Weight: 38000
+ InheritSP: ("Blacksmith")
+ BaseASPD: {
+ Fist: 400
+ Dagger: 600
+ Sword: 650
+ Axe: 450
+ TwoHandAxe: 480
+ Mace: 480
+ TwoHandMace: 500
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 5807, 5844, // 91 - 100
+ 5952, 6061, 6172, 6283, 6396, 6510, 6625, 6741, 6857, 6974, // 101 - 110
+ 7093, 7212, 7333, 7455, 7578, 7702, 7828, 7954, 8081, 8208, // 111 - 120
+ 8337, 8467, 8598, 8730, 8864, 8998, 9134, 9271, 9408, 9546, // 121 - 130
+ 9685, 9825, 9967, 10109, 10253, 10398, 10544, 10691, 10838, 10987, // 131 - 140
+ 11136, 11287, 11439, 11592, 11746, 11901, 12057, 12215, 12372, 12531] // 141 - 150
+}
+Guillotine_Cross: {
+ Weight: 32000
+ InheritSP: ("Blacksmith")
+ BaseASPD: {
+ Fist: 400
+ Dagger: 420
+ Sword: 650
+ Axe: 800
+ Katar: 420
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 6050, 6093, // 91 - 100
+ 6208, 6324, 6441, 6559, 6678, 6798, 6920, 7043, 7167, 7292, // 101 - 110
+ 7418, 7545, 7673, 7802, 7932, 8063, 8196, 8330, 8465, 8601, // 111 - 120
+ 8738, 8876, 9015, 9155, 9296, 9438, 9582, 9727, 9873, 10020, // 121 - 130
+ 10168, 10317, 10467, 10618, 10770, 10923, 11078, 11234, 11391, 11549, // 131 - 140
+ 11708, 11868, 12029, 12191, 12354, 12518, 12684, 12851, 13019, 13188] // 141 - 150
+}
+Shadow_Chaser: {
+ Inherit: ("Guillotine_Cross")
+ Weight: 28000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 430
+ Sword: 470
+ Bow: 470
+ }
+}
+Royal_Guard: {
+ Inherit: ("Guillotine_Cross")
+ Weight: 35000
+ BaseASPD: {
+ Fist: 400
+ Dagger: 470
+ Sword: 450
+ TwoHandSword: 530
+ Spear: 500
+ TwoHandSpear: 500
+ Axe: 480
+ TwoHandAxe: 520
+ Mace: 440
+ TwoHandMace: 500
+ }
+}
+Sorcerer: {
+ Weight: 30000
+ InheritSP: ("Wizard")
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ Sword: 500
+ Rod: 450
+ Book: 450
+ TwoHandRod: 550
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 4080, 4103, // 91 - 100
+ 4180, 4257, 4335, 4414, 4494, 4574, 4655, 4737, 4819, 4902, // 101 - 110
+ 4986, 5071, 5157, 5244, 5332, 5420, 5509, 5599, 5689, 5780, // 111 - 120
+ 5872, 5965, 6058, 6153, 6248, 6344, 6441, 6539, 6637, 6737, // 121 - 130
+ 6837, 6937, 7038, 7140, 7243, 7347, 7451, 7557, 7663, 7770, // 131 - 140
+ 7878, 7987, 8097, 8207, 8318, 8429, 8541, 8654, 8768, 8883] // 141 - 150
+}
+Minstrel: {
+ Inherit: ("Ranger")
+ BaseASPD: {
+ Fist: 400
+ Dagger: 520
+ Bow: 490
+ Instrument: 440
+ }
+}
+Wanderer: {
+ Inherit: ("Ranger")
+ BaseASPD: {
+ Whip: 440
+ Instrument: 2000
+ }
+}
+Sura: {
+ Weight: 30000
+ InheritSP: ("Blacksmith")
+ BaseASPD: {
+ Fist: 380
+ Mace: 430
+ TwoHandMace: 450
+ Rod: 480
+ Knuckle: 390
+ TwoHandRod: 500
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 5050, 5082, // 91 - 100
+ 5176, 5271, 5367, 5464, 5562, 5661, 5761, 5862, 5963, 6065, // 101 - 110
+ 6168, 6272, 6377, 6483, 6590, 6698, 6807, 6917, 7027, 7138, // 111 - 120
+ 7250, 7363, 7477, 7592, 7708, 7825, 7943, 8062, 8181, 8301, // 121 - 130
+ 8422, 8544, 8667, 8791, 8916, 9042, 9169, 9297, 9425, 9554, // 131 - 140
+ 9684, 9815, 9947, 10080, 10214, 10349, 10485, 10622, 10759, 10897] // 141 - 150
+}
+Genetic: {
+ Weight: 32000
+ InheritSP: ("Wizard")
+ BaseASPD: {
+ Fist: 400
+ Dagger: 500
+ Sword: 440
+ Axe: 480
+ TwoHandAxe: 510
+ Mace: 440
+ TwoHandMace: 480
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 4730, 4766, // 91 - 100
+ 4853, 4940, 5027, 5113, 5200, 5287, 5374, 5461, 5548, 5635, // 101 - 110
+ 5722, 5809, 5896, 5982, 6069, 6156, 6243, 6330, 6417, 6504, // 111 - 120
+ 6591, 6678, 6765, 6851, 6938, 7025, 7112, 7199, 7286, 7373, // 121 - 130
+ 7460, 7547, 7634, 7720, 7807, 7894, 7981, 8068, 8155, 8242, // 131 - 140
+ 8329, 8416, 8503, 8589, 8676, 8763, 8850, 8937, 9024, 9111] // 141 - 150
+}
+Kagerou: {
+ Inherit: ("Soul_Linker")
+ Weight: 26000
+ InheritSP: ("Ninja")
+ BaseASPD: {
+ Fist: 400
+ Dagger: 450
+ FuumaShuriken: 500
+ }
+}
+Oboro: {
+ Inherit: ("Kagerou")
+}
+Rebellion: {
+ Inherit: ("Gunslinger")
+ InheritHP: ("Soul_Linker")
+}
+Novice_High: {
+ Inherit: ("Novice")
+}
+Swordsman_High: {
+ Inherit: ("Swordsman")
+}
+Magician_High: {
+ Inherit: ("Magician")
+}
+Archer_High: {
+ Inherit: ("Archer")
+}
+Acolyte_High: {
+ Inherit: ("Acolyte")
+}
+Merchant_High: {
+ Inherit: ("Merchant")
+}
+Thief_High: {
+ Inherit: ("Thief")
+}
+Lord_Knight: {
+ Inherit: ("Knight")
+}
+High_Priest: {
+ Inherit: ("Priest")
+}
+High_Wizard: {
+ Inherit: ("Wizard")
+}
+Whitesmith: {
+ Inherit: ("Blacksmith")
+}
+Sniper: {
+ Inherit: ("Hunter")
+}
+Assassin_Cross: {
+ Inherit: ("Assassin")
+}
+Paladin: {
+ Inherit: ("Crusader")
+}
+Champion: {
+ Inherit: ("Monk")
+}
+Professor: {
+ Inherit: ("Sage")
+}
+Stalker: {
+ Inherit: ("Rogue")
+}
+Creator: {
+ Inherit: ("Alchemist")
+}
+Clown: {
+ Inherit: ("Bard")
+}
+Gypsy: {
+ Inherit: ("Dancer")
+}
+Baby_Novice: {
+ Inherit: ("Novice")
+}
+Baby_Swordsman: {
+ Inherit: ("Swordsman")
+}
+Baby_Magician: {
+ Inherit: ("Magician")
+}
+Baby_Archer: {
+ Inherit: ("Archer")
+}
+Baby_Acolyte: {
+ Inherit: ("Acolyte")
+}
+Baby_Merchant: {
+ Inherit: ("Merchant")
+}
+Baby_Thief: {
+ Inherit: ("Thief")
+}
+Baby_Knight: {
+ Inherit: ("Knight")
+}
+Baby_Priest: {
+ Inherit: ("Priest")
+}
+Baby_Wizard: {
+ Inherit: ("Wizard")
+}
+Baby_Blacksmith: {
+ Inherit: ("Blacksmith")
+}
+Baby_Hunter: {
+ Inherit: ("Hunter")
+}
+Baby_Assassin: {
+ Inherit: ("Assassin")
+}
+Baby_Crusader: {
+ Inherit: ("Crusader")
+}
+Baby_Monk: {
+ Inherit: ("Monk")
+}
+Baby_Sage: {
+ Inherit: ("Sage")
+}
+Baby_Rogue: {
+ Inherit: ("Rogue")
+}
+Baby_Alchemist: {
+ Inherit: ("Alchemist")
+}
+Baby_Bard: {
+ Inherit: ("Bard")
+}
+Baby_Dancer: {
+ Inherit: ("Dancer")
+}
+Super_Baby: {
+ Inherit: ("Novice")
+}
+Rune_Knight_Trans: {
+ Inherit: ("Rune_Knight")
+}
+Warlock_Trans: {
+ Inherit: ("Warlock")
+}
+Ranger_Trans: {
+ Inherit: ("Ranger")
+}
+Arch_Bishop_Trans: {
+ Inherit: ("Arch_Bishop")
+}
+Mechanic_Trans: {
+ Inherit: ("Mechanic")
+}
+Guillotine_Cross_Trans: {
+ Inherit: ("Guillotine_Cross")
+}
+Royal_Guard_Trans: {
+ Inherit: ("Royal_Guard")
+}
+Sorcerer_Trans: {
+ Inherit: ("Sorcerer")
+}
+Minstrel_Trans: {
+ Inherit: ("Minstrel")
+}
+Wanderer_Trans: {
+ Inherit: ("Wanderer")
+}
+Sura_Trans: {
+ Inherit: ("Sura")
+}
+Genetic_Trans: {
+ Inherit: ("Genetic")
+}
+Shadow_Chaser_Trans: {
+ Inherit: ("Shadow_Chaser")
+}
+Baby_Rune_Knight: {
+ Inherit: ("Rune_Knight")
+}
+Baby_Warlock: {
+ Inherit: ("Warlock")
+}
+Baby_Ranger: {
+ Inherit: ("Ranger")
+}
+Baby_Arch_Bishop: {
+ Inherit: ("Arch_Bishop")
+}
+Baby_Mechanic: {
+ Inherit: ("Mechanic")
+}
+Baby_Guillotine_Cross: {
+ Inherit: ("Guillotine_Cross")
+}
+Baby_Royal_Guard: {
+ Inherit: ("Royal_Guard")
+}
+Baby_Sorcerer: {
+ Inherit: ("Sorcerer")
+}
+Baby_Minstrel: {
+ Inherit: ("Minstrel")
+}
+Baby_Wanderer: {
+ Inherit: ("Wanderer")
+}
+Baby_Sura: {
+ Inherit: ("Sura")
+}
+Baby_Genetic: {
+ Inherit: ("Genetic")
+}
+Baby_Shadow_Chaser: {
+ Inherit: ("Shadow_Chaser")
+}
+Super_Novice: {
+ Inherit: ("Novice")
+}
+Expanded_Super_Novice: {
+ Inherit: ("Novice")
+}
+Expanded_Super_Baby: {
+ Inherit: ("Novice")
+} \ No newline at end of file
diff --git a/db/pre-re/job_db1.txt b/db/pre-re/job_db1.txt
deleted file mode 100644
index 3872789e9..000000000
--- a/db/pre-re/job_db1.txt
+++ /dev/null
@@ -1,283 +0,0 @@
-// Job-specific Values Database
-//
-// Structure of Database:
-// JobID,Weight,HPFactor,HPMultiplicator,SPFactor,Unarmed,Dagger,1HSword,2HSword,1HSpear,2HSpear,1HAxe,2HAxe,1HMace,2HMace(unused),Rod,Bow,Knuckle,Instrument,Whip,Book,Katar,Revolver,Rifle,Gatling Gun,Shotgun,Grenade Launcher,Fuuma Shuriken,2HStaff
-//
-// Novice
-0, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 650
-// Swordman
-1, 28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Magician
-2, 22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700
-// Archer
-3, 26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Acolyte
-4, 24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 600
-// Merchant
-5, 28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Thief
-6, 24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Knight
-7, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Priest
-8, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 600
-// Wizard
-9, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Blacksmith
-10, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Hunter
-11, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Assassin
-12, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Knight (Peco)
-13, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Crusader
-14, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Monk
-15, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 575
-// Sage
-16, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Rogue
-17, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Alchemist
-18, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Bard
-19, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Dancer
-20, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Crusader (Peco)
-21, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Wedding
-22, 20000,0 ,500 ,100 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Super Novice
-23, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 650
-// Gunslinger
-24, 28000,88 , 0 ,450 ,500 ,2000, 2000, 2000, 2000, 2000, 2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700 , 750 , 700 ,1500 ,1500 ,2000 ,2000
-// Ninja
-25, 26000,80 , 0 ,515 ,400 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 750 ,2000
-// Novice High
-4001, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 650
-// Swordman High
-4002, 28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Magician High
-4003, 22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700
-// Archer High
-4004, 26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Acolyte High
-4005, 24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 600
-// Merchant High
-4006, 28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Thief High
-4007, 24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Lord Knight
-4008, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// High Priest
-4009, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 600
-// High Wizard
-4010, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Whitesmith
-4011, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Sniper
-4012, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Assassin Cross
-4013, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Lord Knight (Peco)
-4014, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Paladin
-4015, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Champion
-4016, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 575
-// Professor
-4017, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Stalker
-4018, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Creator
-4019, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Clown
-4020, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Gypsy
-4021, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Paladin (Peco)
-4022, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Novice
-4023, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 650
-// Baby Swordman
-4024, 28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Magician
-4025, 22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700
-// Baby Archer
-4026, 26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Acolyte
-4027, 24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 600
-// Baby Merchant
-4028, 28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Thief
-4029, 24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Knight
-4030, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Priest
-4031, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 600
-// Baby Wizard
-4032, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Baby Blacksmith
-4033, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Hunter
-4034, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Assassin
-4035, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Knight (Peco)
-4036, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Crusader
-4037, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Monk
-4038, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 575
-// Baby Sage
-4039, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Baby Rogue
-4040, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Alchemist
-4041, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Bard
-4042, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Dancer
-4043, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Crusader (Peco)
-4044, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Super Novice
-4045, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 650
-// Taekwon
-4046, 28000,70 ,500 ,200 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Star Knight
-4047, 28000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Star Knight (Union)
-4048, 28000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Soul Linker
-4049, 24000,75 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-//================================
-// 3CeAM r664 Base
-//
-// Note: All settings below are based on what the previous job was. A Rune Knight will have the same values
-// as a Knight, a Ranger will have the same values as a Hunter, etc.
-//
-// Note 2: Gangsi is currently using Acolyte settings, Death Knight using Knight settings and Dark Collector
-// is using Sage settings. Its mainly like this for these 3 jobs because of the temp sprite that shows when
-// changeing to their job ID's.
-//
-// Gangsi (Bongun/Munak)
-4050, 24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 600
-// Death Knight
-4051, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Dark Collector
-4052, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Rune Knight (Regular)
-4054, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Warlock (Regular)
-4055, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Ranger (Regular)
-4056, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Arch Bishop (Regular)
-4057, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 600
-// Mechanic (Regular)
-4058, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Guillotine Cross (Regular)
-4059, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Rune Knight (Trans)
-4060, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Warlock (Trans)
-4061, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Ranger (Trans)
-4062, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Arch Bishop (Trans)
-4063, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 600
-// Mechanic (Trans)
-4064, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Guillotine Cross (Trans)
-4065, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Royal Guard (Regular)
-4066, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Sorcerer (Regular)
-4067, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Minstrel (Regular)
-4068, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Wanderer (Regular)
-4069, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Sura (Regular)
-4070, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 575
-// Genetic (Regular)
-4071, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Shadow Chaser (Regular)
-4072, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Royal Guard (Trans)
-4073, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Sorcerer (Trans)
-4074, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Minstrel (Trans)
-4075, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Wanderer (Trans)
-4076, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Sura (Trans)
-4077, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 575
-// Genetic (Trans)
-4078, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Shadow Chaser (Trans)
-4079, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Rune Knight (Dragon) (Regular)
-4080, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Rune Knight (Dragon) (Trans)
-4081, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Royal Guard (Gryphon) (Regular)
-4082, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Royal Guard (Gryphon) (Trans)
-4083, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Ranger (Warg) (Regular)
-4084, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Ranger (Warg) (Trans)
-4085, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Mechanic (Mado) (Regular)
-4086, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Mechanic (Mado) (Trans)
-4087, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Rune Knight
-4096, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Warlock
-4097, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Baby Ranger
-4098, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Arch Bishop
-4099, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 600
-// Baby Mechanic
-4100, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Guillotine Cross
-4101, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Royal Guard
-4102, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Sorcerer
-4103, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625
-// Baby Minstrel
-4104, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Wanderer
-4105, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Sura
-4106, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 575
-// Baby Genetic
-4107, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Shadow Chaser
-4108, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Rune Knight (Dragon)
-4109, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Royal Guard (Gryphon)
-4110, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Ranger (Warg)
-4111, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Mechanic (Mado)
-4112, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Super Novice (Expanded)
-4190, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 650
-// Super Baby (Expanded)
-4191, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 650
-// Kagerou
-4211, 26000,80 , 0 ,515 ,400 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 750 ,2000
-// Oboro
-4212, 26000,80 , 0 ,515 ,400 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 750 ,2000
-// Rebellion
-4215, 28000,88 , 0 ,450 ,500 ,2000, 2000, 2000, 2000, 2000, 2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700 , 750 , 700 ,1500 ,1500 ,2000 ,2000
diff --git a/db/re/job_db.conf b/db/re/job_db.conf
new file mode 100644
index 000000000..498dad9fb
--- /dev/null
+++ b/db/re/job_db.conf
@@ -0,0 +1,1714 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://hercules.ws/board/
+//================= More Information =================
+// http://hercules.ws/board/topic/9082-job-db1txt-redesign/
+//============== RE Structure Example ================
+/*
+Job_Name: { // Job names as in src/map/pc.c (they are hardcoded at the moment so if you want to add a new job you should add it there)
+ Inherit: ( "Other_Job_Name" ); // Base job from which this job will inherit its max weight, base ASPD set and HP/SP table.
+ InheritHP: ( "Other_Job_Name" );// Base job from which this job will inherit its HP table.
+ InheritSP: ( "Other_Job_Name" );// Base job from which this job will inherit its SP table.
+ Weight: Max Weight (int, defaults to 20000, units in Weight/10)
+ BaseASPD: { // Base ASPD for specific weapon type
+ Fist: 0~200 (int, defaults to 200)
+ Dagger: 0~200 (int, defaults to 200)
+ Sword: 0~200 (int, defaults to 200)
+ TwoHandSword: 0~200 (int, defaults to 200)
+ Spear: 0~200 (int, defaults to 200)
+ TwoHandSpear: 0~200 (int, defaults to 200)
+ Axe: 0~200 (int, defaults to 200)
+ TwoHandAxe: 0~200 (int, defaults to 200)
+ Mace: 0~200 (int, defaults to 200)
+ TwoHandMace: 0~200 (int, defaults to 200)
+ Rod: 0~200 (int, defaults to 200)
+ Bow: 0~200 (int, defaults to 200)
+ Knuckle: 0~200 (int, defaults to 200)
+ Instrumen: 0~200 (int, defaults to 200)
+ Whip: 0~200 (int, defaults to 200)
+ Book: 0~200 (int, defaults to 200)
+ Katar: 0~200 (int, defaults to 200)
+ Revolver: 0~200 (int, defaults to 200)
+ Rifle: 0~200 (int, defaults to 200)
+ GatlingGun: 0~200 (int, defaults to 200)
+ Shotgun: 0~200 (int, defaults to 200)
+ GrenadeLauncher: 0~200 (int, defaults to 200)
+ FuumaShuriken: 0~200 (int, defaults to 200)
+ TwoHandRod: 0~200 (int, defaults to 200)
+ Shield: 0~200 (int, defaults to 0)
+ }
+ HPTable:[ 1, .... 150 ] (int[]) Reference table for base HP per level
+ SPTable:[ 1, .... 150 ] (int[]) Reference table for base SP per level
+ // Note: If table index size is smaller than the max level the server will automatically generate the missing index based on the average increase per level.
+}
+*/
+//====================================================
+Novice: {
+ BaseASPD: {
+ Fist: 40
+ Dagger: 55
+ Sword: 57
+ Axe: 50
+ Mace: 50
+ TwoHandMace: 55
+ Rod: 65
+ TwoHandRod: 65
+ Shield: 10
+ }
+ HPTable:[ 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, // 1 - 10
+ 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, // 11 - 20
+ 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, // 21 - 30
+ 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, // 31 - 40
+ 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, // 41 - 50
+ 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, // 51 - 60
+ 340, 345, 350, 355, 360, 365, 370, 375, 380, 385, // 61 - 70
+ 390, 395, 400, 405, 410, 415, 420, 425, 430, 435, // 71 - 80
+ 440, 445, 450, 455, 460, 465, 470, 475, 480, 485, // 81 - 90
+ 490, 495, 500, 505, 510, 515, 520, 525, 530, 535, // 91 - 100
+ 540, 545, 550, 555, 560, 565, 570, 575, 580, 585, // 101 - 110
+ 590, 595, 600, 605, 610, 615, 620, 625, 630, 635, // 111 - 120
+ 640, 645, 650, 655, 660, 665, 670, 675, 680, 685, // 121 - 130
+ 690, 695, 700, 705, 710, 715, 720, 725, 730, 735, // 131 - 140
+ 740, 745, 750, 755, 760, 765, 770, 775, 780, 785, // 141 - 150
+ 790, 795, 800, 805, 810, 815, 820, 825, 830, 835] // 151 - 160
+ SPTable:[ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 1 - 10
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 11 - 20
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 21 - 30
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 31 - 40
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 41 - 50
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 51 - 60
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 61 - 70
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 71 - 80
+ 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, // 81 - 90
+ 101, 102, 103, 104, 105, 106, 107, 108, 109, 100, // 91 - 100
+ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, // 101 - 110
+ 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, // 111 - 120
+ 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, // 121 - 130
+ 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, // 131 - 140
+ 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, // 141 - 150
+ 151, 152, 153, 154, 155, 156, 157, 158, 159, 160] // 151 - 160
+}
+Swordsman: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 47
+ Sword: 47
+ TwoHandSword: 54
+ Spear: 57
+ TwoHandSpear: 65
+ Axe: 55
+ TwoHandAxe: 60
+ Mace: 50
+ TwoHandMace: 55
+ Shield: 5
+ }
+ HPTable:[ 40, 46, 53, 61, 70, 79, 89, 100, 111, 123, // 1 - 10
+ 136, 149, 163, 178, 194, 210, 227, 245, 263, 282, // 11 - 20
+ 302, 322, 343, 365, 388, 411, 435, 460, 485, 511, // 21 - 30
+ 538, 565, 593, 622, 652, 682, 713, 745, 777, 810, // 31 - 40
+ 844, 878, 913, 949, 986, 1023, 1061, 1100, 1139, 1179, // 41 - 50
+ 1220, 1261, 1303, 1346, 1390, 1434, 1479, 1525, 1571, 1618, // 51 - 60
+ 1666, 1714, 1763, 1813, 1864, 1915, 1967, 2020, 2073, 2127, // 61 - 70
+ 2182, 2237, 2293, 2350, 2408, 2466, 2525, 2585, 2645, 2706, // 71 - 80
+ 2768, 2830, 2893, 2957, 3022, 3087, 3153, 3220, 3287, 3355, // 81 - 90
+ 3424, 3493, 3563, 3634, 3706, 3778, 3851, 3925, 3999, 4073, // 91 - 100
+ 4147, 4221, 4295, 4369, 4443, 4517, 4591, 4665, 4739, 4813, // 101 - 110
+ 4887, 4961, 5035, 5109, 5183, 5257, 5331, 5405, 5479, 5553, // 111 - 120
+ 5627, 5701, 5775, 5849, 5923, 5997, 6071, 6145, 6219, 6293, // 121 - 130
+ 6367, 6441, 6515, 6589, 6663, 6737, 6811, 6885, 6959, 7033, // 131 - 140
+ 7107, 7181, 7255, 7329, 7403, 7477, 7551, 7625, 7699, 7773, // 141 - 150
+ 7847, 7921, 7995, 8069, 8143, 8217, 8291, 8365, 8439, 8513] // 151 - 160
+ SPTable:[ 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, // 1 - 10
+ 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, // 11 - 20
+ 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, // 21 - 30
+ 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, // 31 - 40
+ 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, // 41 - 50
+ 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, // 51 - 60
+ 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, // 61 - 70
+ 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, // 71 - 80
+ 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, // 81 - 90
+ 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, // 91 - 100
+ 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, // 101 - 110
+ 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, // 111 - 120
+ 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, // 121 - 130
+ 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, // 131 - 140
+ 292, 294, 296, 298, 300, 302, 304, 306, 308, 310] // 141 - 150
+}
+Magician: {
+ Weight: 22000
+ BaseASPD: {
+ Fist: 50
+ Dagger: 50
+ Rod: 55
+ TwoHandRod: 55
+ Shield: 10
+ }
+ HPTable:[ 40, 46, 52, 58, 65, 72, 79, 86, 94, 102, // 1 - 10
+ 110, 119, 128, 137, 147, 157, 167, 177, 188, 199, // 11 - 20
+ 210, 222, 234, 246, 259, 272, 285, 298, 312, 326, // 21 - 30
+ 340, 355, 370, 385, 401, 417, 433, 449, 466, 483, // 31 - 40
+ 500, 518, 536, 554, 573, 592, 611, 630, 650, 670, // 41 - 50
+ 690, 711, 732, 753, 775, 797, 819, 841, 864, 887, // 51 - 60
+ 910, 934, 958, 982, 1007, 1032, 1057, 1082, 1108, 1134, // 61 - 70
+ 1160, 1187, 1214, 1241, 1269, 1297, 1325, 1353, 1382, 1411, // 71 - 80
+ 1440, 1470, 1500, 1530, 1561, 1592, 1623, 1654, 1686, 1718, // 81 - 90
+ 1750, 1783, 1816, 1849, 1883, 1917, 1951, 1985, 2020, 2054, // 91 - 100
+ 2089, 2123, 2158, 2192, 2227, 2261, 2296, 2330, 2365, 2399, // 101 - 110
+ 2434, 2468, 2503, 2537, 2572, 2606, 2641, 2675, 2710, 2744, // 111 - 120
+ 2779, 2813, 2848, 2882, 2917, 2951, 2986, 3020, 3055, 3089, // 121 - 130
+ 3124, 3158, 3193, 3227, 3262, 3296, 3331, 3365, 3400, 3434, // 131 - 140
+ 3469, 3503, 3538, 3572, 3607, 3641, 3676, 3710, 3745, 3779, // 141 - 150
+ 3814, 3849, 3884, 3919, 3954, 3989, 4024, 4059, 4094, 4129] // 151 - 160
+ SPTable:[ 16, 22, 28, 34, 40, 46, 52, 58, 64, 70, // 1 - 10
+ 76, 82, 88, 94, 100, 106, 112, 118, 124, 130, // 11 - 20
+ 136, 142, 148, 154, 160, 166, 172, 178, 184, 190, // 21 - 30
+ 196, 202, 208, 214, 220, 226, 232, 238, 244, 250, // 31 - 40
+ 256, 262, 268, 274, 280, 286, 292, 298, 304, 310, // 41 - 50
+ 316, 322, 328, 334, 340, 346, 352, 358, 364, 370, // 51 - 60
+ 376, 382, 388, 394, 400, 406, 412, 418, 424, 430, // 61 - 70
+ 436, 442, 448, 454, 460, 466, 472, 478, 484, 490, // 71 - 80
+ 496, 502, 508, 514, 520, 526, 532, 538, 544, 550, // 81 - 90
+ 556, 562, 568, 574, 580, 586, 592, 598, 604, 610, // 91 - 100
+ 616, 622, 628, 634, 640, 646, 652, 658, 664, 670, // 101 - 110
+ 676, 682, 688, 694, 700, 706, 712, 718, 724, 730, // 111 - 120
+ 736, 742, 748, 754, 760, 766, 772, 778, 784, 790, // 121 - 130
+ 796, 802, 808, 814, 820, 826, 832, 838, 844, 850, // 131 - 140
+ 856, 862, 868, 874, 880, 886, 892, 898, 904, 910] // 141 - 150
+}
+Archer: {
+ Weight: 26000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 55
+ Bow: 50
+ Shield: 9
+ }
+ InheritSP: ("Swordsman")
+ HPTable:[ 40, 46, 53, 60, 68, 76, 85, 94, 104, 114, // 1 - 10
+ 125, 136, 148, 160, 173, 186, 200, 214, 229, 244, // 11 - 20
+ 260, 276, 293, 310, 328, 346, 365, 384, 404, 424, // 21 - 30
+ 445, 466, 488, 510, 533, 556, 580, 604, 629, 654, // 31 - 40
+ 680, 706, 733, 760, 788, 816, 845, 874, 904, 934, // 41 - 50
+ 965, 996, 1028, 1060, 1093, 1126, 1160, 1194, 1229, 1264, // 51 - 60
+ 1300, 1336, 1373, 1410, 1448, 1486, 1525, 1564, 1604, 1644, // 61 - 70
+ 1685, 1726, 1768, 1810, 1853, 1896, 1940, 1984, 2029, 2074, // 71 - 80
+ 2120, 2166, 2213, 2260, 2308, 2356, 2405, 2454, 2504, 2554, // 81 - 90
+ 2605, 2656, 2708, 2760, 2813, 2866, 2920, 2974, 3029, 3083, // 91 - 100
+ 3138, 3192, 3247, 3301, 3356, 3410, 3465, 3519, 3574, 3628, // 101 - 110
+ 3683, 3737, 3792, 3846, 3901, 3955, 4010, 4064, 4119, 4173, // 111 - 120
+ 4228, 4282, 4337, 4391, 4446, 4500, 4555, 4609, 4664, 4718, // 121 - 130
+ 4773, 4827, 4882, 4936, 4991, 5045, 5100, 5154, 5209, 5263, // 131 - 140
+ 5318, 5372, 5427, 5481, 5536, 5590, 5645, 5699, 5754, 5808, // 141 - 150
+ 5863, 5917, 5972, 6026, 6081, 6135, 6190, 6244, 6299, 6353] // 151 - 160
+}
+Acolyte: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 40
+ Mace: 45
+ TwoHandMace: 50
+ Rod: 60
+ TwoHandRod: 60
+ Shield: 7
+ }
+ HPTable:[ 40, 46, 52, 59, 66, 73, 81, 89, 98, 107, // 1 - 10
+ 116, 126, 136, 147, 158, 169, 181, 193, 206, 219, // 11 - 20
+ 232, 246, 260, 275, 290, 305, 321, 337, 354, 371, // 21 - 30
+ 388, 406, 424, 443, 462, 481, 501, 521, 542, 563, // 31 - 40
+ 584, 606, 628, 651, 674, 697, 721, 745, 770, 795, // 41 - 50
+ 820, 846, 872, 899, 926, 953, 981, 1009, 1038, 1067, // 51 - 60
+ 1096, 1126, 1156, 1187, 1218, 1249, 1281, 1313, 1346, 1379, // 61 - 70
+ 1412, 1446, 1480, 1515, 1550, 1585, 1621, 1657, 1694, 1731, // 71 - 80
+ 1768, 1806, 1844, 1883, 1922, 1961, 2001, 2041, 2082, 2123, // 81 - 90
+ 2164, 2206, 2248, 2291, 2334, 2377, 2421, 2465, 2510, 2554, // 91 - 100
+ 2599, 2643, 2688, 2732, 2777, 2821, 2866, 2910, 2955, 2999, // 101 - 110
+ 3044, 3088, 3133, 3177, 3222, 3266, 3311, 3355, 3400, 3444, // 111 - 120
+ 3489, 3533, 3578, 3622, 3667, 3711, 3756, 3800, 3845, 3889, // 121 - 130
+ 3934, 3978, 4023, 4067, 4112, 4156, 4201, 4245, 4290, 4334, // 131 - 140
+ 4379, 4423, 4468, 4512, 4557, 4601, 4646, 4690, 4735, 4779, // 141 - 150
+ 4824, 4868, 4913, 4957, 5002, 5046, 5091, 5135, 5180, 5224] // 151 - 160
+ SPTable:[ 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, // 1 - 10
+ 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, // 11 - 20
+ 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, // 21 - 30
+ 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, // 31 - 40
+ 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, // 41 - 50
+ 265, 270, 275, 280, 285, 290, 295, 300, 305, 310, // 51 - 60
+ 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, // 61 - 70
+ 365, 370, 375, 380, 385, 390, 395, 400, 405, 410, // 71 - 80
+ 415, 420, 425, 430, 435, 440, 445, 450, 455, 460, // 81 - 90
+ 465, 470, 475, 480, 485, 490, 495, 500, 505, 510, // 91 - 100
+ 515, 520, 525, 530, 535, 540, 545, 550, 555, 560, // 101 - 110
+ 565, 570, 575, 580, 585, 590, 595, 600, 605, 610, // 111 - 120
+ 615, 620, 625, 630, 635, 640, 645, 650, 655, 660, // 121 - 130
+ 665, 670, 675, 680, 685, 690, 695, 700, 705, 710, // 131 - 140
+ 715, 720, 725, 730, 735, 740, 745, 750, 755, 760] // 141 - 150
+}
+Merchant: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 52
+ Sword: 52
+ Axe: 48
+ TwoHandAxe: 55
+ Mace: 50
+ TwoHandMace: 55
+ Shield: 5
+ }
+ InheritHP: ("Acolyte")
+ SPTable:[ 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, // 1 - 10
+ 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, // 11 - 20
+ 73, 76, 79, 82, 85, 88, 91, 94, 97, 100, // 21 - 30
+ 103, 106, 109, 112, 115, 118, 121, 124, 127, 130, // 31 - 40
+ 133, 136, 139, 142, 145, 148, 151, 154, 157, 160, // 41 - 50
+ 163, 166, 169, 172, 175, 178, 181, 184, 187, 190, // 51 - 60
+ 193, 196, 199, 202, 205, 208, 211, 214, 217, 220, // 61 - 70
+ 223, 226, 229, 232, 235, 238, 241, 244, 247, 250, // 71 - 80
+ 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, // 81 - 90
+ 283, 286, 289, 292, 295, 298, 301, 304, 307, 310, // 91 - 100
+ 313, 316, 319, 322, 325, 328, 331, 334, 337, 340, // 101 - 110
+ 343, 346, 349, 352, 355, 358, 361, 364, 367, 370, // 111 - 120
+ 373, 376, 379, 382, 385, 388, 391, 394, 397, 400, // 121 - 130
+ 403, 406, 409, 412, 415, 418, 421, 424, 427, 430, // 131 - 140
+ 433, 436, 439, 442, 445, 448, 451, 454, 457, 460] // 141 - 150
+}
+Thief: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 48
+ Sword: 50
+ Axe: 60
+ Bow: 53
+ Shield: 6
+ }
+ InheritHP: ("Archer")
+ InheritSP: ("Swordsman")
+}
+Knight: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 49
+ Sword: 45
+ TwoHandSword: 52
+ Spear: 55
+ TwoHandSpear: 60
+ Axe: 50
+ TwoHandAxe: 55
+ Mace: 45
+ TwoHandMace: 50
+ Shield: 5
+ }
+ InheritSP: ("Merchant")
+ HPTable:[ 40, 48, 58, 69, 82, 96, 112, 129, 148, 168, // 1 - 10
+ 190, 213, 238, 264, 292, 321, 352, 384, 418, 453, // 11 - 20
+ 490, 528, 568, 609, 652, 696, 742, 789, 838, 888, // 21 - 30
+ 940, 993, 1048, 1104, 1162, 1221, 1282, 1344, 1408, 1473, // 31 - 40
+ 1540, 1608, 1678, 1749, 1822, 1896, 1972, 2049, 2128, 2208, // 41 - 50
+ 2290, 2373, 2458, 2544, 2632, 2721, 2812, 2904, 2998, 3093, // 51 - 60
+ 3190, 3288, 3388, 3489, 3592, 3696, 3802, 3909, 4018, 4128, // 61 - 70
+ 4240, 4353, 4468, 4584, 4702, 4821, 4942, 5064, 5188, 5313, // 71 - 80
+ 5440, 5568, 5698, 5829, 5962, 6096, 6232, 6369, 6508, 6648, // 81 - 90
+ 6790, 6933, 7078, 7224, 7372, 7521, 7672, 7824, 7978, 8053, // 91 - 100
+ 8128, 8203, 8278, 8353, 8428, 8503, 8578, 8653, 8728, 8803, // 101 - 110
+ 8878, 8953, 9028, 9103, 9178, 9253, 9328, 9403, 9478, 9553, // 111 - 120
+ 9628, 9703, 9778, 9853, 9928, 10003, 10078, 10153, 10228, 10303, // 121 - 130
+ 10378, 10453, 10528, 10603, 10678, 10753, 10828, 10903, 10978, 11053, // 131 - 140
+ 11128, 11203, 11278, 11353, 11428, 11503, 11578, 11653, 11728, 11803] // 141 - 150
+}
+Priest: {
+ Weight: 26000
+ BaseASPD: {
+ Fist: 40
+ Mace: 43
+ TwoHandMace: 48
+ Rod: 60
+ Knuckle: 60
+ Book: 44
+ TwoHandRod: 60
+ Shield: 5
+ }
+ HPTable:[ 40, 47, 54, 62, 71, 81, 91, 102, 114, 127, // 1 - 10
+ 140, 154, 169, 185, 201, 218, 236, 255, 274, 294, // 11 - 20
+ 315, 337, 359, 382, 406, 431, 456, 482, 509, 537, // 21 - 30
+ 565, 594, 624, 655, 686, 718, 751, 785, 819, 854, // 31 - 40
+ 890, 927, 964, 1002, 1041, 1081, 1121, 1162, 1204, 1247, // 41 - 50
+ 1290, 1334, 1379, 1425, 1471, 1518, 1566, 1615, 1664, 1714, // 51 - 60
+ 1765, 1817, 1869, 1922, 1976, 2031, 2086, 2142, 2199, 2257, // 61 - 70
+ 2315, 2374, 2434, 2495, 2556, 2618, 2681, 2745, 2809, 2874, // 71 - 80
+ 2940, 3007, 3074, 3142, 3211, 3281, 3351, 3422, 3494, 3567, // 81 - 90
+ 3640, 3714, 3789, 3865, 3941, 4018, 4096, 4175, 4254, 4333, // 91 - 100
+ 4412, 4491, 4570, 4649, 4728, 4807, 4886, 4965, 5044, 5123, // 101 - 110
+ 5202, 5281, 5360, 5439, 5518, 5597, 5676, 5755, 5834, 5913, // 111 - 120
+ 5992, 6071, 6150, 6229, 6308, 6387, 6466, 6545, 6624, 6703, // 121 - 130
+ 6782, 6861, 6940, 7019, 7098, 7177, 7256, 7335, 7414, 7493, // 131 - 140
+ 7572, 7651, 7730, 7809, 7888, 7967, 8046, 8125, 8204, 8283] // 141 - 150
+ SPTable:[ 18, 26, 34, 42, 50, 58, 66, 74, 82, 90, // 1 - 10
+ 98, 106, 114, 122, 130, 138, 146, 154, 162, 170, // 11 - 20
+ 178, 186, 194, 202, 210, 218, 226, 234, 242, 250, // 21 - 30
+ 258, 266, 274, 282, 290, 298, 306, 314, 322, 330, // 31 - 40
+ 338, 346, 354, 362, 370, 378, 386, 394, 402, 410, // 41 - 50
+ 418, 426, 434, 442, 450, 458, 466, 474, 482, 490, // 51 - 60
+ 498, 506, 514, 522, 530, 538, 546, 554, 562, 570, // 61 - 70
+ 578, 586, 594, 602, 610, 618, 626, 634, 642, 650, // 71 - 80
+ 658, 666, 674, 682, 690, 698, 706, 714, 722, 730, // 81 - 90
+ 738, 746, 754, 762, 770, 778, 786, 794, 802, 810, // 91 - 100
+ 818, 826, 834, 842, 850, 858, 866, 874, 882, 890, // 101 - 110
+ 898, 906, 914, 922, 930, 938, 946, 954, 962, 970, // 111 - 120
+ 978, 986, 994, 1002, 1010, 1018, 1026, 1034, 1042, 1050, // 121 - 130
+ 1058, 1066, 1074, 1082, 1090, 1098, 1106, 1114, 1122, 1130, // 131 - 140
+ 1138, 1146, 1154, 1162, 1170, 1178, 1186, 1194, 1202, 1210] // 141 - 150
+}
+Wizard: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 50
+ Dagger: 54
+ Rod: 53
+ TwoHandRod: 53
+ Shield: 8
+ }
+ HPTable:[ 40, 46, 53, 60, 68, 76, 85, 94, 104, 115, // 1 - 10
+ 126, 138, 150, 163, 176, 190, 204, 219, 234, 250, // 11 - 20
+ 267, 284, 302, 320, 339, 358, 378, 398, 419, 441, // 21 - 30
+ 463, 486, 509, 533, 557, 582, 607, 633, 659, 686, // 31 - 40
+ 714, 742, 771, 800, 830, 860, 891, 922, 954, 987, // 41 - 50
+ 1020, 1054, 1088, 1123, 1158, 1194, 1230, 1267, 1304, 1342, // 51 - 60
+ 1381, 1420, 1460, 1500, 1541, 1582, 1624, 1666, 1709, 1753, // 61 - 70
+ 1797, 1842, 1887, 1933, 1979, 2026, 2073, 2121, 2169, 2218, // 71 - 80
+ 2268, 2318, 2369, 2420, 2472, 2524, 2577, 2630, 2684, 2739, // 81 - 90
+ 2794, 2850, 2906, 2963, 3020, 3078, 3136, 3195, 3254, 3313, // 91 - 100
+ 3372, 3431, 3490, 3549, 3608, 3667, 3726, 3785, 3844, 3903, // 101 - 110
+ 3962, 4021, 4080, 4139, 4198, 4257, 4316, 4375, 4434, 4493, // 111 - 120
+ 4552, 4611, 4670, 4729, 4788, 4847, 4906, 4965, 5024, 5083, // 121 - 130
+ 5142, 5201, 5260, 5319, 5378, 5437, 5496, 5555, 5614, 5673, // 131 - 140
+ 5732, 5791, 5850, 5909, 5968, 6027, 6086, 6145, 6204, 6263] // 141 - 150
+ SPTable:[ 19, 28, 37, 46, 55, 64, 73, 82, 91, 100, // 1 - 10
+ 109, 118, 127, 136, 145, 154, 163, 172, 181, 190, // 11 - 20
+ 199, 208, 217, 226, 235, 244, 253, 262, 271, 280, // 21 - 30
+ 289, 298, 307, 316, 325, 334, 343, 352, 361, 370, // 31 - 40
+ 379, 388, 397, 406, 415, 424, 433, 442, 451, 460, // 41 - 50
+ 469, 478, 487, 496, 505, 514, 523, 532, 541, 550, // 51 - 60
+ 559, 568, 577, 586, 595, 604, 613, 622, 631, 640, // 61 - 70
+ 649, 658, 667, 676, 685, 694, 703, 712, 721, 730, // 71 - 80
+ 739, 748, 757, 766, 775, 784, 793, 802, 811, 820, // 81 - 90
+ 829, 838, 847, 856, 865, 874, 883, 892, 901, 910, // 91 - 100
+ 919, 928, 937, 946, 955, 964, 973, 982, 991, 1000, // 101 - 110
+ 1009, 1018, 1027, 1036, 1045, 1054, 1063, 1072, 1081, 1090, // 111 - 120
+ 1099, 1108, 1117, 1126, 1135, 1144, 1153, 1162, 1171, 1180, // 121 - 130
+ 1189, 1198, 1207, 1216, 1225, 1234, 1243, 1252, 1261, 1270, // 131 - 140
+ 1279, 1288, 1297, 1306, 1315, 1324, 1333, 1342, 1351, 1360] // 141 - 150
+}
+Blacksmith: {
+ Weight: 30000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 50
+ Sword: 50
+ Axe: 46
+ TwoHandAxe: 53
+ Mace: 48
+ TwoHandMace: 53
+ Shield: 5
+ }
+ HPTable:[ 40, 47, 55, 64, 74, 84, 95, 107, 120, 134, // 1 - 10
+ 149, 165, 182, 200, 219, 238, 258, 279, 301, 324, // 11 - 20
+ 348, 373, 399, 426, 454, 482, 511, 541, 572, 604, // 21 - 30
+ 637, 671, 706, 742, 779, 816, 854, 893, 933, 974, // 31 - 40
+ 1016, 1059, 1103, 1148, 1194, 1240, 1287, 1335, 1384, 1434, // 41 - 50
+ 1485, 1537, 1590, 1644, 1699, 1754, 1810, 1867, 1925, 1984, // 51 - 60
+ 2044, 2105, 2167, 2230, 2294, 2358, 2423, 2489, 2556, 2624, // 61 - 70
+ 2693, 2763, 2834, 2906, 2979, 3052, 3126, 3201, 3277, 3354, // 71 - 80
+ 3432, 3511, 3591, 3672, 3754, 3836, 3919, 4003, 4088, 4174, // 81 - 90
+ 4261, 4349, 4438, 4528, 4619, 4710, 4802, 4895, 4989, 5082, // 91 - 100
+ 5176, 5269, 5363, 5456, 5550, 5643, 5737, 5830, 5924, 6017, // 101 - 110
+ 6111, 6204, 6298, 6391, 6485, 6578, 6672, 6765, 6859, 6952, // 111 - 120
+ 7046, 7139, 7233, 7326, 7420, 7513, 7607, 7700, 7794, 7887, // 121 - 130
+ 7981, 8074, 8168, 8261, 8355, 8448, 8542, 8635, 8729, 8822, // 131 - 140
+ 8916, 9009, 9103, 9196, 9290, 9383, 9477, 9570, 9664, 9757] // 141 - 150
+ SPTable:[ 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, // 1 - 10
+ 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, // 11 - 20
+ 94, 98, 102, 106, 110, 114, 118, 122, 126, 130, // 21 - 30
+ 134, 138, 142, 146, 150, 154, 158, 162, 166, 170, // 31 - 40
+ 174, 178, 182, 186, 190, 194, 198, 202, 206, 210, // 41 - 50
+ 214, 218, 222, 226, 230, 234, 238, 242, 246, 250, // 51 - 60
+ 254, 258, 262, 266, 270, 274, 278, 282, 286, 290, // 61 - 70
+ 294, 298, 302, 306, 310, 314, 318, 322, 326, 330, // 71 - 80
+ 334, 338, 342, 346, 350, 354, 358, 362, 366, 370, // 81 - 90
+ 374, 378, 382, 386, 390, 394, 398, 402, 406, 410, // 91 - 100
+ 414, 418, 422, 426, 430, 434, 438, 442, 446, 450, // 101 - 110
+ 454, 458, 462, 466, 470, 474, 478, 482, 486, 490, // 111 - 120
+ 494, 498, 502, 506, 510, 514, 518, 522, 526, 530, // 121 - 130
+ 534, 538, 542, 546, 550, 554, 558, 562, 566, 570, // 131 - 140
+ 574, 578, 582, 586, 590, 594, 598, 602, 606, 610] // 141 - 150
+}
+Hunter: {
+ Weight: 27000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 53
+ Bow: 48
+ Shield: 9
+ }
+ InheritSP: ("Blacksmith")
+ HPTable:[ 40, 47, 55, 63, 72, 82, 93, 105, 118, 132, // 1 - 10
+ 146, 161, 177, 194, 212, 231, 250, 270, 291, 313, // 11 - 20
+ 336, 360, 385, 410, 436, 463, 491, 520, 550, 581, // 21 - 30
+ 612, 644, 677, 711, 746, 782, 818, 855, 893, 932, // 31 - 40
+ 972, 1013, 1055, 1097, 1140, 1184, 1229, 1275, 1322, 1370, // 41 - 50
+ 1418, 1467, 1517, 1568, 1620, 1673, 1726, 1780, 1835, 1891, // 51 - 60
+ 1948, 2006, 2065, 2124, 2184, 2245, 2307, 2370, 2434, 2499, // 61 - 70
+ 2564, 2630, 2697, 2765, 2834, 2904, 2974, 3045, 3117, 3190, // 71 - 80
+ 3264, 3339, 3415, 3491, 3568, 3646, 3725, 3805, 3886, 3968, // 81 - 90
+ 4050, 4133, 4217, 4302, 4388, 4475, 4562, 4650, 4739, 4827, // 91 - 100
+ 4916, 5004, 5093, 5181, 5270, 5358, 5447, 5535, 5624, 5712, // 101 - 110
+ 5801, 5889, 5978, 6066, 6155, 6243, 6332, 6420, 6509, 6597, // 111 - 120
+ 6686, 6774, 6863, 6951, 7040, 7128, 7217, 7305, 7394, 7482, // 121 - 130
+ 7571, 7659, 7748, 7836, 7925, 8013, 8102, 8190, 8279, 8367, // 131 - 140
+ 8456, 8544, 8633, 8721, 8810, 8898, 8987, 9075, 9164, 9252] // 141 - 150
+}
+Assassin: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 42
+ Sword: 50
+ Axe: 51
+ Katar: 42
+ FuumaShuriken: 110
+ Shield: 6
+ }
+ InheritSP: ("Blacksmith")
+ HPTable:[ 40, 47, 55, 64, 75, 87, 100, 114, 129, 145, // 1 - 10
+ 162, 180, 199, 219, 241, 264, 288, 313, 339, 366, // 11 - 20
+ 394, 423, 453, 484, 517, 551, 586, 622, 659, 697, // 21 - 30
+ 736, 776, 817, 859, 903, 948, 994, 1041, 1089, 1138, // 31 - 40
+ 1188, 1239, 1291, 1344, 1399, 1455, 1512, 1570, 1629, 1689, // 41 - 50
+ 1750, 1812, 1875, 1939, 2005, 2072, 2140, 2209, 2279, 2350, // 51 - 60
+ 2422, 2495, 2569, 2644, 2721, 2799, 2878, 2958, 3039, 3121, // 61 - 70
+ 3204, 3288, 3373, 3459, 3547, 3636, 3726, 3817, 3909, 4002, // 71 - 80
+ 4096, 4191, 4287, 4384, 4483, 4583, 4684, 4786, 4889, 4993, // 81 - 90
+ 5098, 5204, 5311, 5419, 5529, 5640, 5752, 5865, 5979, 6092, // 91 - 100
+ 6206, 6319, 6433, 6546, 6660, 6773, 6887, 7000, 7114, 7227, // 101 - 110
+ 7341, 7454, 7568, 7681, 7795, 7908, 8022, 8135, 8249, 8362, // 111 - 120
+ 8476, 8589, 8703, 8816, 8930, 9043, 9157, 9270, 9384, 9497, // 121 - 130
+ 9611, 9724, 9838, 9951, 10065, 10178, 10292, 10405, 10519, 10632, // 131 - 140
+ 10746, 10859, 10973, 11086, 11200, 11313, 11427, 11540, 11654, 11767] // 141 - 150
+}
+Crusader: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 48
+ Sword: 43
+ TwoHandSword: 55
+ Spear: 53
+ TwoHandSpear: 52
+ Axe: 50
+ TwoHandAxe: 55
+ Mace: 45
+ TwoHandMace: 50
+ Shield: 5
+ }
+ HPTable:[ 40, 47, 56, 62, 81, 94, 108, 128, 147, 165, // 1 - 10
+ 184, 204, 225, 247, 271, 296, 322, 349, 377, 406, // 11 - 20
+ 436, 467, 499, 532, 567, 603, 640, 678, 717, 757, // 21 - 30
+ 798, 840, 883, 927, 973, 1020, 1068, 1117, 1167, 1218, // 31 - 40
+ 1270, 1323, 1377, 1432, 1489, 1547, 1606, 1666, 1727, 1789, // 41 - 50
+ 1852, 1916, 1981, 2047, 2115, 2184, 2254, 2325, 2397, 2470, // 51 - 60
+ 2544, 2619, 2695, 2772, 2851, 2931, 3012, 3094, 3177, 3261, // 61 - 70
+ 3346, 3432, 3519, 3607, 3697, 3788, 3880, 3973, 4067, 4162, // 71 - 80
+ 4258, 4355, 4453, 4552, 4653, 4755, 4858, 4962, 5067, 5173, // 81 - 90
+ 5280, 5388, 5497, 5607, 5719, 5832, 5946, 6061, 6177, 6292, // 91 - 100
+ 6408, 6523, 6639, 6754, 6870, 6985, 7101, 7216, 7332, 7447, // 101 - 110
+ 7563, 7678, 7794, 7909, 8025, 8140, 8256, 8371, 8487, 8602, // 111 - 120
+ 8718, 8833, 8949, 9064, 9180, 9295, 9411, 9526, 9642, 9757, // 121 - 130
+ 9873, 9988, 10104, 10219, 10335, 10450, 10566, 10681, 10797, 10912, // 131 - 140
+ 11028, 11143, 11259, 11374, 11490, 11605, 11721, 11836, 11952, 12067] // 141 - 150
+ SPTable:[ 14, 19, 24, 28, 33, 38, 42, 47, 52, 57, // 1 - 10
+ 61, 66, 71, 75, 80, 85, 89, 94, 99, 104, // 11 - 20
+ 108, 113, 118, 122, 127, 132, 136, 141, 146, 151, // 21 - 30
+ 155, 160, 165, 169, 174, 179, 183, 188, 193, 198, // 31 - 40
+ 202, 207, 212, 216, 221, 226, 230, 235, 240, 245, // 41 - 50
+ 249, 254, 259, 263, 268, 273, 277, 282, 287, 292, // 51 - 60
+ 296, 301, 306, 310, 315, 320, 324, 329, 334, 339, // 61 - 70
+ 343, 348, 353, 357, 362, 367, 371, 376, 381, 386, // 71 - 80
+ 390, 395, 400, 404, 409, 414, 418, 423, 428, 433, // 81 - 90
+ 437, 442, 447, 451, 456, 461, 465, 470, 475, 480, // 91 - 100
+ 484, 489, 494, 498, 503, 508, 512, 517, 522, 527, // 101 - 110
+ 531, 536, 541, 545, 550, 555, 559, 564, 569, 574, // 111 - 120
+ 578, 583, 588, 592, 597, 602, 606, 611, 616, 621, // 121 - 130
+ 625, 630, 635, 639, 644, 649, 653, 658, 663, 668, // 131 - 140
+ 672, 677, 682, 686, 691, 696, 700, 705, 710, 715] // 141 - 150
+}
+Rogue: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 45
+ Sword: 50
+ Bow: 50
+ Shield: 5
+ }
+ InheritHP: ("Hunter")
+ InheritSP: ("Acolyte")
+}
+Sage: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 45
+ Dagger: 53
+ Sword: 60
+ Rod: 55
+ Book: 43
+ TwoHandRod: 55
+ Shield: 5
+ }
+ InheritHP: ("Priest")
+ SPTable:[ 17, 24, 31, 38, 45, 52, 59, 66, 73, 80, // 1 - 10
+ 87, 94, 101, 108, 115, 122, 129, 136, 143, 150, // 11 - 20
+ 157, 164, 171, 178, 185, 192, 199, 206, 213, 220, // 21 - 30
+ 227, 234, 241, 248, 255, 262, 269, 276, 283, 290, // 31 - 40
+ 297, 304, 311, 318, 325, 332, 339, 346, 353, 360, // 41 - 50
+ 367, 374, 381, 388, 395, 402, 409, 416, 423, 430, // 51 - 60
+ 437, 444, 451, 458, 465, 472, 479, 486, 493, 500, // 61 - 70
+ 507, 514, 521, 528, 535, 542, 549, 556, 563, 570, // 71 - 80
+ 577, 584, 591, 598, 605, 612, 619, 626, 633, 640, // 81 - 90
+ 647, 654, 661, 668, 675, 682, 689, 696, 703, 710, // 91 - 100
+ 717, 724, 731, 738, 745, 752, 759, 766, 773, 780, // 101 - 110
+ 787, 794, 801, 808, 815, 822, 829, 836, 843, 850, // 111 - 120
+ 857, 864, 871, 878, 885, 892, 899, 906, 913, 920, // 121 - 130
+ 927, 934, 941, 948, 955, 962, 969, 976, 983, 990, // 131 - 140
+ 997, 1004, 1011, 1018, 1025, 1032, 1039, 1046, 1053, 1060] // 141 - 150
+}
+Alchemist: {
+ BaseASPD: {
+ Fist: 40
+ Dagger: 50
+ Sword: 45
+ Axe: 45
+ TwoHandAxe: 52
+ Mace: 45
+ TwoHandMace: 50
+ Shield: 4
+ }
+ Inherit: ("Blacksmith")
+}
+Monk: {
+ Weight: 26000
+ BaseASPD: {
+ Fist: 40
+ Mace: 43
+ TwoHandMace: 48
+ Rod: 60
+ Knuckle: 40
+ TwoHandRod: 58
+ Shield: 5
+ }
+ InheritSP: ("Crusader")
+ HPTable:[ 40, 47, 55, 64, 74, 84, 95, 107, 120, 134, // 1 - 10
+ 149, 165, 182, 200, 219, 238, 258, 306, 329, 354, // 11 - 20
+ 379, 406, 433, 462, 491, 521, 551, 583, 615, 649, // 21 - 30
+ 683, 719, 755, 793, 831, 870, 909, 950, 991, 1034, // 31 - 40
+ 1077, 1122, 1167, 1214, 1261, 1309, 1357, 1407, 1457, 1509, // 41 - 50
+ 1561, 1615, 1669, 1725, 1781, 1838, 1895, 1954, 2013, 2074, // 51 - 60
+ 2135, 2198, 2261, 2326, 2391, 2457, 2523, 2591, 2659, 2729, // 61 - 70
+ 2799, 2871, 2943, 3017, 3091, 3166, 3241, 3318, 3395, 3474, // 71 - 80
+ 3553, 3634, 3715, 3798, 3881, 3965, 4049, 4135, 4221, 4309, // 81 - 90
+ 4397, 4487, 4577, 4669, 4761, 4854, 4947, 5042, 5137, 5232, // 91 - 100
+ 5327, 5422, 5517, 5612, 5707, 5802, 5897, 5992, 6087, 6182, // 101 - 110
+ 6277, 6372, 6467, 6562, 6657, 6752, 6847, 6942, 7037, 7132, // 111 - 120
+ 7227, 7322, 7417, 7512, 7607, 7702, 7797, 7892, 7987, 8082, // 121 - 130
+ 8177, 8272, 8367, 8462, 8557, 8652, 8747, 8842, 8937, 9032, // 131 - 140
+ 9127, 9222, 9317, 9412, 9507, 9602, 9697, 9792, 9887, 9982] // 141 - 150
+}
+Bard: {
+ Weight: 27000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 53
+ Bow: 48
+ Instrument: 45
+ Shield: 7
+ }
+ InheritSP: ("Magician")
+ HPTable:[ 40, 47, 54, 62, 71, 81, 91, 102, 114, 127, // 1 - 10
+ 140, 154, 169, 180, 196, 212, 224, 242, 260, 278, // 11 - 20
+ 296, 316, 330, 350, 371, 393, 415, 438, 451, 477, // 21 - 30
+ 503, 530, 558, 587, 616, 646, 677, 709, 741, 774, // 31 - 40
+ 808, 843, 878, 914, 951, 989, 1027, 1066, 1106, 1147, // 41 - 50
+ 1188, 1230, 1273, 1317, 1361, 1406, 1452, 1499, 1546, 1594, // 51 - 60
+ 1643, 1693, 1743, 1794, 1846, 1899, 1952, 2006, 2061, 2117, // 61 - 70
+ 2173, 2230, 2288, 2347, 2406, 2466, 2527, 2589, 2651, 2714, // 71 - 80
+ 2778, 2843, 2908, 2974, 3041, 3109, 3177, 3246, 3316, 3387, // 81 - 90
+ 3458, 3530, 3603, 3677, 3751, 3826, 3902, 3979, 4056, 4133, // 91 - 100
+ 4210, 4287, 4364, 4441, 4518, 4595, 4672, 4749, 4826, 4903, // 101 - 110
+ 4980, 5057, 5134, 5211, 5288, 5365, 5442, 5519, 5596, 5673, // 111 - 120
+ 5750, 5827, 5904, 5981, 6058, 6135, 6212, 6289, 6366, 6443, // 121 - 130
+ 6520, 6597, 6674, 6751, 6828, 6905, 6982, 7059, 7136, 7213, // 131 - 140
+ 7290, 7367, 7444, 7521, 7598, 7675, 7752, 7829, 7906, 7983] // 141 - 150
+}
+Dancer: {
+ BaseASPD: {
+ Whip: 45
+ Instrument: 200
+ }
+ Inherit: ("Bard")
+}
+Taekwon: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 50
+ Sword: 50
+ TwoHandSword: 50
+ Spear: 50
+ TwoHandSpear: 50
+ Axe: 50
+ TwoHandAxe: 50
+ Mace: 50
+ TwoHandMace: 50
+ Rod: 50
+ Bow: 50
+ Knuckle: 50
+ Instrument: 50
+ Whip: 50
+ Book: 50
+ Katar: 50
+ Revolver: 50
+ Rifle: 50
+ GatlingGun: 50
+ Shotgun: 50
+ GrenadeLauncher: 50
+ FuumaShuriken: 50
+ TwoHandRod: 50
+ Shield: 6
+ }
+ HPTable:[ 40, 46, 53, 61, 70, 79, 89, 100, 111, 123, // 1 - 10
+ 136, 149, 163, 178, 194, 210, 227, 245, 263, 282, // 11 - 20
+ 302, 322, 343, 365, 388, 411, 435, 460, 485, 511, // 21 - 30
+ 538, 565, 593, 622, 652, 682, 713, 745, 777, 810, // 31 - 40
+ 844, 878, 913, 949, 986, 1023, 1061, 1100, 1139, 1179, // 41 - 50
+ 1220, 1261, 1303, 1346, 1390, 1434, 1479, 1525, 1571, 1618, // 51 - 60
+ 1666, 1714, 1763, 1813, 1864, 1915, 1967, 2020, 2073, 2127, // 61 - 70
+ 2137, 2147, 2157, 2167, 2177, 2187, 2197, 2200, 2210, 2230, // 71 - 80
+ 2250, 2300, 2350, 2400, 2450, 2500, 2550, 2600, 2650, 2700, // 81 - 90
+ 2750, 2800, 2850, 2900, 2950, 3000, 3050, 3100, 3200, 3267, // 91 - 100
+ 3342, 3417, 3492, 3567, 3642, 3717, 3792, 3867, 3942, 4017, // 101 - 110
+ 4092, 4167, 4242, 4317, 4392, 4467, 4542, 4617, 4692, 4767, // 111 - 120
+ 4842, 4917, 4992, 5067, 5142, 5217, 5292, 5367, 5442, 5517, // 121 - 130
+ 5592, 5667, 5742, 5817, 5892, 5967, 6042, 6117, 6192, 6267, // 131 - 140
+ 6342, 6417, 6492, 6567, 6642, 6717, 6792, 6867, 6942, 7017] // 141 - 150
+ SPTable:[ 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, // 1 - 10
+ 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, // 11 - 20
+ 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, // 21 - 30
+ 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, // 31 - 40
+ 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, // 41 - 50
+ 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, // 51 - 60
+ 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, // 61 - 70
+ 151, 152, 153, 154, 155, 156, 157, 158, 159, 170, // 71 - 80
+ 171, 172, 173, 174, 175, 176, 177, 178, 188, 190, // 81 - 90
+ 190, 190, 190, 190, 190, 190, 190, 190, 200, 200, // 91 - 100
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, // 101 - 110
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, // 111 - 120
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, // 121 - 130
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, // 131 - 140
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200] // 141 - 150
+}
+Star_Gladiator: {
+ Inherit: ("Taekwon")
+ HPTable:[ 40, 47, 55, 64, 74, 84, 95, 107, 120, 134, // 1 - 10
+ 149, 165, 182, 200, 219, 238, 258, 306, 329, 354, // 11 - 20
+ 379, 406, 433, 462, 491, 521, 551, 583, 615, 649, // 21 - 30
+ 683, 719, 755, 793, 831, 870, 909, 950, 991, 1034, // 31 - 40
+ 1077, 1122, 1167, 1214, 1261, 1309, 1357, 1407, 1457, 1509, // 41 - 50
+ 1561, 1615, 1669, 1725, 1781, 1838, 1895, 1954, 2013, 2074, // 51 - 60
+ 2135, 2198, 2261, 2326, 2391, 2457, 2523, 2591, 2659, 2670, // 61 - 70
+ 2680, 2690, 2700, 2710, 2720, 2730, 2740, 2750, 2760, 3000, // 71 - 80
+ 3020, 3040, 3060, 3080, 3100, 3120, 3140, 3160, 3180, 3455, // 81 - 90
+ 3524, 3593, 3663, 3734, 3806, 3878, 3951, 4025, 4500, 4562, // 91 - 100
+ 4624, 4686, 4748, 4810, 4872, 4934, 4996, 5058, 5120, 5182, // 101 - 110
+ 5244, 5306, 5368, 5430, 5492, 5554, 5616, 5678, 5740, 5802, // 111 - 120
+ 5864, 5926, 5988, 6050, 6112, 6174, 6236, 6298, 6360, 6422, // 121 - 130
+ 6484, 6546, 6608, 6670, 6732, 6794, 6856, 6918, 6980, 7042, // 131 - 140
+ 7104, 7166, 7228, 7290, 7352, 7414, 7476, 7538, 7600, 7662] // 141 - 150
+ SPTable:[ 14, 19, 24, 28, 33, 38, 42, 47, 52, 57, // 1 - 10
+ 61, 66, 71, 75, 80, 85, 89, 94, 99, 104, // 11 - 20
+ 108, 113, 118, 122, 127, 132, 136, 141, 146, 151, // 21 - 30
+ 155, 160, 165, 169, 174, 179, 183, 188, 193, 198, // 31 - 40
+ 202, 207, 212, 216, 221, 226, 230, 235, 240, 245, // 41 - 50
+ 249, 254, 259, 263, 268, 273, 277, 282, 287, 292, // 51 - 60
+ 296, 301, 306, 310, 315, 320, 324, 329, 334, 339, // 61 - 70
+ 341, 343, 345, 347, 349, 351, 353, 355, 357, 386, // 71 - 80
+ 388, 390, 392, 394, 396, 398, 400, 402, 404, 430, // 81 - 90
+ 433, 436, 439, 442, 445, 448, 451, 454, 500, 500, // 91 - 100
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, // 101 - 110
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, // 111 - 120
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, // 121 - 130
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, // 131 - 140
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500] // 141 - 150
+}
+Soul_Linker: {
+ Weight: 24000
+ BaseASPD: {
+ Fist: 50
+ Dagger: 50
+ Rod: 53
+ TwoHandRod: 55
+ Shield: 8
+ }
+ HPTable:[ 40, 47, 54, 62, 71, 81, 91, 102, 114, 127, // 1 - 10
+ 140, 154, 169, 185, 201, 218, 236, 255, 274, 294, // 11 - 20
+ 315, 337, 359, 382, 406, 431, 456, 482, 509, 537, // 21 - 30
+ 565, 594, 624, 655, 686, 718, 751, 785, 819, 854, // 31 - 40
+ 890, 927, 964, 1002, 1041, 1081, 1121, 1162, 1204, 1247, // 41 - 50
+ 1290, 1334, 1379, 1425, 1471, 1518, 1566, 1615, 1664, 1714, // 51 - 60
+ 1765, 1817, 1869, 1922, 1976, 2031, 2086, 2142, 2199, 2257, // 61 - 70
+ 2275, 2294, 2314, 2335, 2356, 2378, 2401, 2425, 2449, 2874, // 71 - 80
+ 2890, 2907, 2924, 2942, 2971, 2991, 3011, 3032, 3054, 3567, // 81 - 90
+ 3590, 3614, 3649, 3675, 3701, 3728, 3756, 3800, 4250, 4305, // 91 - 100
+ 4360, 4415, 4470, 4525, 4580, 4635, 4690, 4745, 4800, 4855, // 101 - 110
+ 4910, 4965, 5020, 5075, 5130, 5185, 5240, 5295, 5350, 5405, // 111 - 120
+ 5460, 5515, 5570, 5625, 5680, 5735, 5790, 5845, 5900, 5955, // 121 - 130
+ 6010, 6065, 6120, 6175, 6230, 6285, 6340, 6395, 6450, 6505, // 131 - 140
+ 6560, 6615, 6670, 6725, 6780, 6835, 6890, 6945, 7000, 7055] // 141 - 150
+ SPTable:[ 19, 28, 37, 46, 55, 64, 73, 82, 91, 100, // 1 - 10
+ 109, 118, 127, 136, 145, 154, 163, 172, 181, 190, // 11 - 20
+ 199, 208, 217, 226, 235, 244, 253, 262, 271, 280, // 21 - 30
+ 289, 298, 307, 316, 325, 334, 343, 352, 361, 370, // 31 - 40
+ 379, 388, 397, 406, 415, 424, 433, 442, 451, 460, // 41 - 50
+ 469, 478, 487, 496, 505, 514, 523, 532, 541, 550, // 51 - 60
+ 559, 568, 577, 586, 595, 604, 613, 622, 631, 635, // 61 - 70
+ 640, 645, 650, 655, 660, 665, 670, 675, 680, 730, // 71 - 80
+ 735, 740, 745, 750, 755, 760, 765, 770, 775, 820, // 81 - 90
+ 825, 830, 845, 850, 855, 860, 865, 870, 900, 900, // 91 - 100
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, // 101 - 110
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, // 111 - 120
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, // 121 - 130
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, // 131 - 140
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 900] // 141 - 150
+}
+Gunslinger: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 50
+ Revolver: 45
+ Rifle: 55
+ GatlingGun: 50
+ Shotgun: 90
+ GrenadeLauncher: 100
+ Shield: 6
+ }
+ InheritHP: ("Star_Gladiator")
+ SPTable:[ 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, // 1 - 10
+ 42, 45, 48, 51, 54, 57, 61, 64, 67, 70, // 11 - 20
+ 73, 76, 79, 82, 85, 89, 93, 97, 101, 105, // 21 - 30
+ 109, 113, 117, 121, 125, 129, 131, 135, 139, 141, // 31 - 40
+ 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, // 41 - 50
+ 186, 191, 196, 201, 206, 211, 216, 221, 226, 231, // 51 - 60
+ 236, 241, 246, 251, 256, 261, 266, 271, 276, 281, // 61 - 70
+ 286, 291, 296, 301, 306, 312, 318, 324, 336, 342, // 71 - 80
+ 348, 354, 360, 366, 372, 378, 384, 390, 396, 402, // 81 - 90
+ 408, 414, 420, 426, 432, 438, 444, 450, 456, 462, // 91 - 100
+ 468, 474, 480, 486, 492, 498, 504, 510, 516, 522, // 101 - 110
+ 528, 534, 540, 546, 552, 558, 564, 570, 576, 582, // 111 - 120
+ 588, 594, 600, 606, 612, 618, 624, 630, 636, 642, // 121 - 130
+ 648, 654, 660, 666, 672, 678, 684, 690, 696, 702, // 131 - 140
+ 708, 714, 720, 726, 732, 738, 744, 750, 756, 762] // 141 - 150
+}
+Ninja: {
+ Weight: 26000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 43
+ FuumaShuriken: 55
+ Shield: 6
+ }
+ InheritHP: ("Soul_Linker")
+ SPTable:[ 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, // 1 - 10
+ 44, 47, 50, 53, 56, 59, 62, 65, 68, 71, // 11 - 20
+ 75, 79, 83, 87, 91, 95, 99, 103, 107, 111, // 21 - 30
+ 115, 119, 123, 127, 131, 135, 139, 143, 147, 151, // 31 - 40
+ 156, 161, 166, 171, 176, 181, 186, 191, 196, 201, // 41 - 50
+ 206, 211, 216, 221, 226, 231, 236, 241, 246, 251, // 51 - 60
+ 257, 263, 269, 275, 281, 287, 293, 299, 305, 311, // 61 - 70
+ 317, 323, 329, 335, 341, 347, 353, 359, 365, 371, // 71 - 80
+ 378, 386, 394, 402, 410, 418, 426, 434, 442, 450, // 81 - 90
+ 458, 466, 474, 482, 490, 498, 506, 514, 522, 530, // 91 - 100
+ 538, 546, 554, 562, 570, 578, 586, 594, 602, 610, // 101 - 110
+ 618, 626, 634, 642, 650, 658, 666, 674, 682, 690, // 111 - 120
+ 698, 706, 714, 722, 730, 738, 746, 754, 762, 770, // 121 - 130
+ 778, 786, 794, 802, 810, 818, 826, 834, 842, 850, // 131 - 140
+ 858, 866, 874, 882, 890, 898, 906, 914, 922, 930] // 141 - 150
+}
+Gangsi: {
+ Weight: 32000
+ InheritSP: ("Novice")
+ BaseASPD: {
+ Fist: 40
+ Dagger: 55
+ Sword: 55
+ TwoHandSword: 55
+ Spear: 55
+ TwoHandSpear: 55
+ Axe: 55
+ TwoHandAxe: 55
+ Mace: 55
+ TwoHandMace: 55
+ Rod: 55
+ Bow: 55
+ Knuckle: 55
+ Instrument: 55
+ Whip: 55
+ Book: 55
+ Katar: 55
+ Revolver: 55
+ Rifle: 55
+ GatlingGun: 55
+ Shotgun: 55
+ GrenadeLauncher: 55
+ FuumaShuriken: 55
+ TwoHandRod: 55
+ Shield: 0
+ }
+ HPTable:[ 40, 46, 53, 60, 68, 76, 85, 94, 104, 114, // 1 - 10
+ 125, 136, 148, 160, 173, 186, 200, 214, 229, 244, // 11 - 20
+ 260, 276, 293, 310, 328, 346, 365, 384, 404, 424, // 21 - 30
+ 445, 466, 488, 510, 533, 556, 580, 604, 629, 654, // 31 - 40
+ 680, 706, 733, 760, 788, 816, 845, 874, 904, 934, // 41 - 50
+ 965, 996, 1028, 1060, 1093, 1126, 1160, 1194, 1229, 1264, // 51 - 60
+ 1300, 1336, 1373, 1410, 1448, 1486, 1525, 1564, 1604, 1644, // 61 - 70
+ 1685, 1726, 1768, 1810, 1853, 1896, 1940, 1984, 2029, 2074, // 71 - 80
+ 2120, 2166, 2213, 2260, 2308, 2356, 2405, 2454, 2504, 2554, // 81 - 90
+ 2605, 2656, 2708, 2760, 2813, 2866, 2920, 2974, 3029] // 91 - 99
+}
+Death_Knight: {
+ Weight: 36000
+ Inherit: ("Gangsi")
+}
+Dark_Collector: {
+ Weight: 40000
+ Inherit: ("Gangsi")
+}
+Rune_Knight: {
+ Weight: 35000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 50
+ Sword: 52
+ TwoHandSword: 55
+ Spear: 60
+ TwoHandSpear: 58
+ Axe: 48
+ TwoHandAxe: 52
+ Mace: 45
+ TwoHandMace: 52
+ Shield: 5
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 8100, 8133, // 91 - 100
+ 8242, 8352, 8464, 8576, 8690, 8804, 8920, 9036, 9154, 9273, // 101 - 110
+ 9393, 9514, 9636, 9759, 9883, 10008, 10134, 10261, 10389, 10518, // 111 - 120
+ 10648, 10779, 10912, 11045, 11180, 11315, 11452, 11589, 11728, 11868, // 121 - 130
+ 12009, 12151, 12294, 12438, 12583, 12729, 12876, 13024, 13173, 13323, // 131 - 140
+ 13474, 13626, 13780, 13934, 14090, 14246, 14404, 14562, 14722, 14883, // 141 - 150
+ 15042, 15100, 15260, 15321, 15481, 15541, 15600, 15760, 15820, 15980, // 151 - 160
+ 16141, 16303, 16466, 16630, 16795, 16961, 17128, 17296, 17465, 17635, // 161 - 170
+ 17806, 17978, 18151, 18325, 18500] // 171 - 175
+ SPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 300, 310, // 91 - 100
+ 313, 316, 319, 322, 325, 328, 331, 334, 337, 340, // 101 - 110
+ 343, 346, 349, 352, 355, 358, 361, 364, 367, 370, // 111 - 120
+ 373, 376, 379, 382, 385, 388, 391, 394, 397, 400, // 121 - 130
+ 403, 406, 409, 412, 415, 418, 421, 424, 427, 430, // 131 - 140
+ 433, 436, 439, 442, 445, 448, 451, 454, 457, 460, // 141 - 150
+ 500, 566, 629, 672, 710, 748, 781, 824, 847, 890, // 151 - 160
+ 894, 898, 902, 906, 910, 915, 920, 925, 930, 935, // 161 - 170
+ 941, 947, 953, 959, 965] // 171 - 175
+}
+Warlock: {
+ Weight: 30000
+ BaseASPD: {
+ Fist: 45
+ Dagger: 52
+ Sword: 60
+ Rod: 50
+ TwoHandRod: 56
+ Shield: 5
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 3200, 3313, // 91 - 100
+ 3383, 3455, 3528, 3601, 3675, 3749, 3824, 3899, 3975, 4051, // 101 - 110
+ 4129, 4208, 4287, 4367, 4447, 4528, 4609, 4691, 4773, 4857, // 111 - 120
+ 4941, 5026, 5112, 5198, 5285, 5372, 5460, 5548, 5638, 5728, // 121 - 130
+ 5819, 5911, 6003, 6096, 6189, 6283, 6377, 6473, 6569, 6666, // 131 - 140
+ 6763, 6861, 6960, 7059, 7159, 7259, 7361, 7463, 7566, 7669, // 141 - 150
+ 7771, 7874, 7976, 8079, 8181, 8284, 8386, 8489, 8591, 8730, // 151 - 160
+ 8891, 9053, 9216, 9380, 9545, 9711, 9878, 10046, 10215, 10385, // 161 - 170
+ 10556, 10728, 10901, 11075, 11250] // 171 - 175
+ SPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 900, 910, // 91 - 100
+ 919, 928, 937, 946, 955, 964, 973, 982, 991, 1000, // 101 - 110
+ 1009, 1018, 1027, 1036, 1045, 1054, 1063, 1072, 1081, 1090, // 111 - 120
+ 1099, 1108, 1117, 1126, 1135, 1144, 1153, 1162, 1171, 1180, // 121 - 130
+ 1189, 1198, 1207, 1216, 1225, 1234, 1243, 1252, 1261, 1270, // 131 - 140
+ 1279, 1288, 1297, 1306, 1315, 1324, 1333, 1342, 1351, 1360, // 141 - 150
+ 1369, 1378, 1387, 1396, 1405, 1414, 1423, 1432, 1441, 1450, // 151 - 160
+ 1460, 1470, 1480, 1490, 1500, 1511, 1522, 1533, 1544, 1555, // 161 - 170
+ 1567, 1579, 1591, 1603, 1615] // 171 - 175
+}
+Ranger: {
+ Weight: 32000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 50
+ Bow: 49
+ Shield: 8
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 4800, 4828, // 91 - 100
+ 4918, 5009, 5101, 5194, 5288, 5382, 5477, 5573, 5670, 5768, // 101 - 110
+ 5867, 5967, 6068, 6170, 6273, 6377, 6482, 6588, 6694, 6801, // 111 - 120
+ 6909, 7018, 7128, 7239, 7351, 7464, 7578, 7693, 7809, 7926, // 121 - 130
+ 8044, 8162, 8281, 8401, 8522, 8644, 8767, 8891, 9016, 9142, // 131 - 140
+ 9269, 9397, 9526, 9656, 9786, 9917, 10049, 10182, 10316, 10451, // 141 - 150
+ 10585, 10719, 10853, 10987, 11121, 11255, 11389, 11523, 11657, 11790, // 151 - 160
+ 11926, 12063, 12201, 12340, 12480, 12621, 12763, 12906, 13050, 13195, // 161 - 170
+ 13341, 13488, 13636, 13785, 13935] // 171 - 175
+ SPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 400, 410, // 91 - 100
+ 414, 418, 422, 426, 430, 434, 438, 442, 446, 450, // 101 - 110
+ 454, 458, 462, 466, 470, 474, 478, 482, 486, 490, // 111 - 120
+ 494, 498, 502, 506, 510, 514, 518, 522, 526, 530, // 121 - 130
+ 534, 538, 542, 546, 550, 554, 558, 562, 566, 570, // 131 - 140
+ 574, 578, 582, 586, 590, 594, 598, 602, 606, 610, // 141 - 150
+ 650, 675, 680, 695, 710, 725, 740, 765, 770, 785, // 151 - 160
+ 790, 795, 800, 805, 810, 816, 822, 828, 834, 840, // 161 - 170
+ 847, 854, 861, 868, 875] // 171 - 175
+}
+Arch_Bishop: {
+ Weight: 30000
+ BaseASPD: {
+ Fist: 45
+ Mace: 45
+ TwoHandMace: 45
+ Rod: 60
+ Knuckle: 50
+ Book: 44
+ TwoHandRod: 55
+ Shield: 5
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 4300, 4333, // 91 - 100
+ 4412, 4491, 4570, 4649, 4728, 4807, 4886, 4965, 5044, 5123, // 101 - 110
+ 5202, 5281, 5360, 5439, 5518, 5597, 5676, 5755, 5834, 5913, // 111 - 120
+ 5992, 6071, 6150, 6229, 6308, 6387, 6466, 6545, 6624, 6703, // 121 - 130
+ 6782, 6861, 6940, 7019, 7098, 7177, 7256, 7335, 7414, 7493, // 131 - 140
+ 7572, 7651, 7730, 7809, 7888, 7967, 8046, 8125, 8204, 8283, // 141 - 150
+ 8362, 8441, 8520, 8599, 8678, 8757, 8836, 8915, 8994, 9115, // 151 - 160
+ 9276, 9438, 9601, 9765, 9930, 10096, 10263, 10431, 10600, 10770, // 161 - 170
+ 10941, 11113, 11286, 11460, 11635] // 171 - 175
+ SPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 800, 810, // 91 - 100
+ 818, 826, 834, 842, 850, 858, 866, 874, 882, 890, // 101 - 110
+ 898, 906, 914, 922, 930, 938, 946, 954, 962, 970, // 111 - 120
+ 978, 986, 994, 1002, 1010, 1018, 1026, 1034, 1042, 1050, // 121 - 130
+ 1058, 1066, 1074, 1082, 1090, 1098, 1106, 1114, 1122, 1130, // 131 - 140
+ 1138, 1146, 1154, 1162, 1170, 1178, 1186, 1194, 1202, 1210, // 141 - 150
+ 1258, 1286, 1334, 1372, 1410, 1458, 1466, 1474, 1482, 1490, // 151 - 160
+ 1499, 1508, 1517, 1526, 1535, 1545, 1555, 1565, 1575, 1585, // 161 - 170
+ 1596, 1607, 1618, 1629, 1640] // 171 - 175
+}
+Mechanic: {
+ Weight: 38000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 60
+ Sword: 65
+ Axe: 45
+ TwoHandAxe: 48
+ Mace: 48
+ TwoHandMace: 50
+ Shield: 6
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 5807, 5844, // 91 - 100
+ 5952, 6061, 6172, 6283, 6396, 6510, 6625, 6741, 6857, 6974, // 101 - 110
+ 7093, 7212, 7333, 7455, 7578, 7702, 7828, 7954, 8081, 8208, // 111 - 120
+ 8337, 8467, 8598, 8730, 8864, 8998, 9134, 9271, 9408, 9546, // 121 - 130
+ 9685, 9825, 9967, 10109, 10253, 10398, 10544, 10691, 10838, 10987, // 131 - 140
+ 11136, 11287, 11439, 11592, 11746, 11901, 12057, 12215, 12372, 12531, // 141 - 150
+ 12688, 12845, 13003, 13160, 13318, 13475, 13633, 13790, 13948, 14105, // 151 - 160
+ 14266, 14428, 14591, 14755, 14920, 15086, 15253, 15421, 15590, 15760, // 161 - 170
+ 15931, 16103, 16276, 16450, 16625] // 171 - 175
+ SPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 400, 410, // 91 - 100
+ 414, 418, 422, 426, 430, 434, 438, 442, 446, 450, // 101 - 110
+ 454, 458, 462, 466, 470, 474, 478, 482, 486, 490, // 111 - 120
+ 494, 498, 502, 506, 510, 514, 518, 522, 526, 530, // 121 - 130
+ 534, 538, 542, 546, 550, 554, 558, 562, 566, 570, // 131 - 140
+ 574, 578, 582, 586, 590, 594, 598, 602, 606, 610, // 141 - 150
+ 700, 760, 820, 880, 930, 965, 1020, 1132, 1160, 1230, // 151 - 160
+ 1235, 1240, 1245, 1250, 1255, 1261, 1267, 1273, 1279, 1285, // 161 - 170
+ 1292, 1299, 1306, 1313, 1320] // 171 - 175
+}
+Guillotine_Cross: {
+ Weight: 32000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 42
+ Sword: 65
+ Axe: 80
+ Katar: 42
+ /* Rifle: 95 */
+ /* GatlingGun: 120 */
+ /* Shotgun: 90 */
+ /* GrenadeLauncher: 100 */
+ /* FuumaShuriken: 110 */
+ Shield: 9
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 6050, 6093, // 91 - 100
+ 6208, 6324, 6441, 6559, 6678, 6798, 6920, 7043, 7167, 7292, // 101 - 110
+ 7418, 7545, 7673, 7802, 7932, 8063, 8196, 8330, 8465, 8601, // 111 - 120
+ 8738, 8876, 9015, 9155, 9296, 9438, 9582, 9727, 9873, 10020, // 121 - 130
+ 10168, 10317, 10467, 10618, 10770, 10923, 11078, 11234, 11391, 11549, // 131 - 140
+ 11708, 11868, 12029, 12191, 12354, 12518, 12684, 12851, 13019, 13188, // 141 - 150
+ 13351, 13518, 13684, 13850, 14016, 14182, 14349, 14515, 14681, 14830, // 151 - 160
+ 14966, 15103, 15241, 15380, 15520, 15661, 15803, 15946, 16090, 16235, // 161 - 170
+ 16381, 16528, 16676, 16825, 16975] // 171 - 175
+ SPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 400, 410, // 91 - 100
+ 414, 418, 422, 426, 430, 434, 438, 442, 446, 450, // 101 - 110
+ 454, 458, 462, 466, 470, 474, 478, 482, 486, 490, // 111 - 120
+ 494, 498, 502, 506, 510, 514, 518, 522, 526, 530, // 121 - 130
+ 534, 538, 542, 546, 550, 554, 558, 562, 566, 570, // 131 - 140
+ 574, 578, 582, 586, 590, 594, 598, 602, 606, 610, // 141 - 150
+ 670, 695, 700, 715, 730, 745, 760, 785, 790, 805, // 151 - 160
+ 810, 815, 820, 825, 830, 836, 842, 848, 854, 860, // 161 - 170
+ 867, 874, 881, 888, 895] // 171 - 175
+}
+Shadow_Chaser: {
+ Weight: 28000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 43
+ Sword: 47
+ Bow: 47
+ Shield: 4
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 6050, 6093, // 91 - 100
+ 6208, 6324, 6441, 6559, 6678, 6798, 6920, 7043, 7167, 7292, // 101 - 110
+ 7418, 7545, 7673, 7802, 7932, 8063, 8196, 8330, 8465, 8601, // 111 - 120
+ 8738, 8876, 9015, 9155, 9296, 9438, 9582, 9727, 9873, 10020, // 121 - 130
+ 10168, 10317, 10467, 10618, 10770, 10923, 11078, 11234, 11391, 11549, // 131 - 140
+ 11708, 11868, 12029, 12191, 12354, 12518, 12684, 12851, 13019, 13188, // 141 - 150
+ 13300, 13420, 13500, 13600, 13700, 13800, 13900, 14000, 14100, 14200, // 151 - 160
+ 14301, 14403, 14506, 14610, 14715, 14821, 14928, 15036, 15145, 15255, // 161 - 170
+ 15366, 15478, 15591, 15705, 15820] // 171 - 175
+ SPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 400, 410, // 91 - 100
+ 414, 418, 422, 426, 430, 434, 438, 442, 446, 450, // 101 - 110
+ 454, 458, 462, 466, 470, 474, 478, 482, 486, 490, // 111 - 120
+ 494, 498, 502, 506, 510, 514, 518, 522, 526, 530, // 121 - 130
+ 534, 538, 542, 546, 550, 554, 558, 562, 566, 570, // 131 - 140
+ 574, 578, 582, 586, 590, 594, 598, 602, 606, 610, // 141 - 150
+ 614, 618, 622, 626, 630, 634, 638, 642, 646, 650, // 151 - 160
+ 655, 660, 665, 670, 675, 681, 687, 693, 699, 705, // 161 - 170
+ 712, 719, 726, 733, 740] // 171 - 175
+}
+Royal_Guard: {
+ InheritSP: ("Mechanic")
+ Weight: 35000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 47
+ Sword: 45
+ TwoHandSword: 53
+ Spear: 50
+ TwoHandSpear: 50
+ Axe: 48
+ TwoHandAxe: 52
+ Mace: 44
+ TwoHandMace: 50
+ Shield: 5
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 6050, 6093, // 91 - 100
+ 6208, 6324, 6441, 6559, 6678, 6798, 6920, 7043, 7167, 7292, // 101 - 110
+ 7418, 7545, 7673, 7802, 7932, 8063, 8196, 8330, 8465, 8601, // 111 - 120
+ 8738, 8876, 9015, 9155, 9296, 9438, 9582, 9727, 9873, 10020, // 121 - 130
+ 10168, 10317, 10467, 10618, 10770, 10923, 11078, 11234, 11391, 11549, // 131 - 140
+ 11708, 11868, 12029, 12191, 12354, 12518, 12684, 12851, 13019, 13188, // 141 - 150
+ 13355, 13522, 13690, 13857, 14025, 14192, 14360, 14527, 14695, 14860, // 151 - 160
+ 15021, 15183, 15346, 15510, 15675, 15841, 16008, 16176, 16345, 16515, // 161 - 170
+ 16686, 16858, 17031, 17205, 17380] // 171 - 175
+}
+Sorcerer: {
+ InheritSP: ("Warlock")
+ Weight: 30000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 50
+ Sword: 50
+ Rod: 45
+ Book: 45
+ TwoHandRod: 55
+ Shield: 5
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 4080, 4103, // 91 - 100
+ 4180, 4257, 4335, 4414, 4494, 4574, 4655, 4737, 4819, 4902, // 101 - 110
+ 4986, 5071, 5157, 5244, 5332, 5420, 5509, 5599, 5689, 5780, // 111 - 120
+ 5872, 5965, 6058, 6153, 6248, 6344, 6441, 6539, 6637, 6737, // 121 - 130
+ 6837, 6937, 7038, 7140, 7243, 7347, 7451, 7557, 7663, 7770, // 131 - 140
+ 7878, 7987, 8097, 8207, 8318, 8429, 8541, 8654, 8768, 8883, // 141 - 150
+ 8994, 9107, 9220, 9280, 9340, 9450, 9570, 9680, 9798, 9915, // 151 - 160
+ 10036, 10158, 10281, 10405, 10530, 10656, 10783, 10911, 11040, 11170, // 161 - 170
+ 11301, 11433, 11566, 11700, 11835] // 171 - 175
+}
+Minstrel: {
+ BaseASPD: {
+ Fist: 40
+ Dagger: 52
+ Bow: 49
+ Instrument: 44
+ Shield: 7
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 4800, 4828, // 91 - 100
+ 4918, 5009, 5101, 5194, 5288, 5382, 5477, 5573, 5670, 5768, // 101 - 110
+ 5867, 5967, 6068, 6170, 6273, 6377, 6482, 6588, 6694, 6801, // 111 - 120
+ 6909, 7018, 7128, 7239, 7351, 7464, 7578, 7693, 7809, 7926, // 121 - 130
+ 8044, 8162, 8281, 8401, 8522, 8644, 8767, 8891, 9016, 9142, // 131 - 140
+ 9269, 9397, 9526, 9656, 9786, 9917, 10049, 10182, 10316, 10451, // 141 - 150
+ 10584, 10717, 10851, 10984, 11118, 11251, 11385, 11518, 11652, 11785, // 151 - 160
+ 11921, 12058, 12196, 12335, 12475, 12616, 12758, 12901, 13045, 13190, // 161 - 170
+ 13336, 13483, 13631, 13780, 13930] // 171 - 175
+ SPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 400, 410, // 91 - 100
+ 414, 418, 422, 426, 430, 434, 438, 442, 446, 450, // 101 - 110
+ 454, 458, 462, 466, 470, 474, 478, 482, 486, 490, // 111 - 120
+ 494, 498, 502, 506, 510, 514, 518, 522, 526, 530, // 121 - 130
+ 534, 538, 542, 546, 550, 554, 558, 562, 566, 570, // 131 - 140
+ 574, 578, 582, 586, 590, 594, 598, 602, 606, 610, // 141 - 150
+ 614, 648, 702, 726, 750, 774, 808, 822, 846, 850, // 151 - 160
+ 855, 860, 865, 870, 875, 881, 887, 893, 899, 905, // 161 - 170
+ 912, 919, 926, 933, 940] // 171 - 175
+}
+Wanderer: {
+ Inherit: ("Minstrel")
+ BaseASPD: {
+ Fist: 40
+ Dagger: 52
+ Bow: 49
+ Whip: 44
+ Shield: 7
+ }
+}
+Sura: {
+ Weight: 30000
+ InheritSP: ("Shadow_Chaser")
+ BaseASPD: {
+ Fist: 38
+ Mace: 43
+ TwoHandMace: 45
+ Rod: 48
+ Knuckle: 39
+ TwoHandRod: 50
+ Shield: 5
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 5050, 5082, // 91 - 100
+ 5176, 5271, 5367, 5464, 5562, 5661, 5761, 5862, 5963, 6065, // 101 - 110
+ 6168, 6272, 6377, 6483, 6590, 6698, 6807, 6917, 7027, 7138, // 111 - 120
+ 7250, 7363, 7477, 7592, 7708, 7825, 7943, 8062, 8181, 8301, // 121 - 130
+ 8422, 8544, 8667, 8791, 8916, 9042, 9169, 9297, 9425, 9554, // 131 - 140
+ 9684, 9815, 9947, 10080, 10214, 10349, 10485, 10622, 10759, 10897, // 141 - 150
+ 11033, 11170, 11307, 11444, 11581, 11718, 11855, 11992, 12129, 12265, // 151 - 160
+ 12406, 12548, 12691, 12835, 12980, 13126, 13273, 13421, 13570, 13720, // 161 - 170
+ 13871, 14023, 14176, 14330, 14485] // 171 - 175
+}
+Genetic: {
+ Weight: 32000
+ InheritSP: ("Sorcerer")
+ BaseASPD: {
+ Fist: 40
+ Dagger: 50
+ Sword: 44
+ Axe: 48
+ TwoHandAxe: 51
+ Mace: 44
+ TwoHandMace: 48
+ Shield: 4
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 4730, 4766, // 91 - 100
+ 4853, 4940, 5027, 5113, 5200, 5287, 5374, 5461, 5548, 5635, // 101 - 110
+ 5722, 5809, 5896, 5982, 6069, 6156, 6243, 6330, 6417, 6504, // 111 - 120
+ 6591, 6678, 6765, 6851, 6938, 7025, 7112, 7199, 7286, 7373, // 121 - 130
+ 7460, 7547, 7634, 7720, 7807, 7894, 7981, 8068, 8155, 8242, // 131 - 140
+ 8329, 8416, 8503, 8589, 8676, 8763, 8850, 8937, 9024, 9111, // 141 - 150
+ 9198, 9285, 9372, 9459, 9546, 9633, 9720, 9807, 9894, 9980, // 151 - 160
+ 10141, 10303, 10466, 10630, 10795, 10961, 11128, 11296, 11465, 11635, // 161 - 170
+ 11806, 11978, 12151, 12325, 12500] // 171 - 175
+}
+Kagerou: {
+ Weight: 26000
+ BaseASPD: {
+ Fist: 40
+ Dagger: 45
+ FuumaShuriken: 50
+ Shield: 3
+ }
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 4250, 4305, // 91 - 100
+ 4360, 4415, 4470, 4525, 4580, 4635, 4690, 4745, 4800, 4855, // 101 - 110
+ 4910, 4965, 5020, 5075, 5130, 5185, 5240, 5295, 5350, 5405, // 111 - 120
+ 5460, 5515, 5570, 5625, 5680, 5735, 5790, 5845, 5900, 5955, // 121 - 130
+ 6010, 6065, 6120, 6175, 6230, 6285, 6340, 6395, 6450, 6505, // 131 - 140
+ 6560, 6615, 6670, 6725, 6780, 6835, 6890, 6945, 7000, 7055, // 141 - 150
+ 7210, 7465, 7620, 7875, 8330, 8385, 8440, 8695, 8850, 9005] // 151 - 160
+ SPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 522, 530, // 91 - 100
+ 538, 546, 554, 562, 570, 578, 586, 594, 602, 610, // 101 - 110
+ 618, 626, 634, 642, 650, 658, 666, 674, 682, 690, // 111 - 120
+ 698, 706, 714, 722, 730, 738, 746, 754, 762, 770, // 121 - 130
+ 778, 786, 794, 802, 810, 818, 826, 834, 842, 850, // 131 - 140
+ 858, 866, 874, 882, 890, 898, 906, 914, 922, 930, // 141 - 150
+ 938, 946, 954, 962, 970, 978, 986, 994, 1002, 1010] // 151 - 160
+}
+Oboro: {
+ Inherit: ("Kagerou")
+ HPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 4250, 4305, // 91 - 100
+ 4360, 4415, 4470, 4525, 4580, 4635, 4690, 4745, 4800, 4855, // 101 - 110
+ 4910, 4965, 5020, 5075, 5130, 5185, 5240, 5295, 5350, 5405, // 111 - 120
+ 5460, 5515, 5570, 5625, 5680, 5735, 5790, 5845, 5900, 5955, // 121 - 130
+ 6010, 6065, 6120, 6175, 6230, 6285, 6340, 6395, 6450, 6505, // 131 - 140
+ 6560, 6615, 6670, 6725, 6780, 6835, 6890, 6945, 7000, 7055, // 141 - 150
+ 7110, 7265, 7320, 7575, 7730, 7985, 8240, 8495, 8550, 8705] // 151 - 160
+ SPTable:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 1 - 10
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, // 11 - 20
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 21 - 30
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 31 - 40
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, // 41 - 50
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, // 51 - 60
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, // 61 - 70
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, // 71 - 80
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, // 81 - 90
+ 91, 92, 93, 94, 95, 96, 97, 98, 522, 530, // 91 - 100
+ 538, 546, 554, 562, 570, 578, 586, 594, 602, 610, // 101 - 110
+ 618, 626, 634, 642, 650, 658, 666, 674, 682, 690, // 111 - 120
+ 698, 706, 714, 722, 730, 738, 746, 754, 762, 770, // 121 - 130
+ 778, 786, 794, 802, 810, 818, 826, 834, 842, 850, // 131 - 140
+ 858, 866, 874, 882, 890, 898, 906, 914, 922, 930, // 141 - 150
+ 958, 976, 994, 1002, 1014, 1028, 1046, 1060, 1082, 1100] // 151 - 160
+}
+Rebellion: {
+ Inherit: ("Gunslinger")
+ InheritHP: ("Soul_Linker")
+}
+Novice_High: {
+ Inherit: ("Novice")
+}
+Swordsman_High: {
+ Inherit: ("Swordsman")
+}
+Magician_High: {
+ Inherit: ("Magician")
+}
+Archer_High: {
+ Inherit: ("Archer")
+}
+Acolyte_High: {
+ Inherit: ("Acolyte")
+}
+Merchant_High: {
+ Inherit: ("Merchant")
+}
+Thief_High: {
+ Inherit: ("Thief")
+}
+Lord_Knight: {
+ Inherit: ("Knight")
+}
+High_Priest: {
+ Inherit: ("Priest")
+}
+High_Wizard: {
+ Inherit: ("Wizard")
+}
+Whitesmith: {
+ Inherit: ("Blacksmith")
+}
+Sniper: {
+ Inherit: ("Hunter")
+}
+Assassin_Cross: {
+ Inherit: ("Assassin")
+}
+Paladin: {
+ Inherit: ("Crusader")
+}
+Champion: {
+ Inherit: ("Monk")
+}
+Professor: {
+ Inherit: ("Sage")
+}
+Stalker: {
+ Inherit: ("Rogue")
+}
+Creator: {
+ Inherit: ("Alchemist")
+}
+Clown: {
+ Inherit: ("Bard")
+}
+Gypsy: {
+ Inherit: ("Dancer")
+}
+Baby_Novice: {
+ Inherit: ("Novice")
+}
+Baby_Swordsman: {
+ Inherit: ("Swordsman")
+}
+Baby_Magician: {
+ Inherit: ("Magician")
+}
+Baby_Archer: {
+ Inherit: ("Archer")
+}
+Baby_Acolyte: {
+ Inherit: ("Acolyte")
+}
+Baby_Merchant: {
+ Inherit: ("Merchant")
+}
+Baby_Thief: {
+ Inherit: ("Thief")
+}
+Baby_Knight: {
+ Inherit: ("Knight")
+}
+Baby_Priest: {
+ Inherit: ("Priest")
+}
+Baby_Wizard: {
+ Inherit: ("Wizard")
+}
+Baby_Blacksmith: {
+ Inherit: ("Blacksmith")
+}
+Baby_Hunter: {
+ Inherit: ("Hunter")
+}
+Baby_Assassin: {
+ Inherit: ("Assassin")
+}
+Baby_Crusader: {
+ Inherit: ("Crusader")
+}
+Baby_Monk: {
+ Inherit: ("Monk")
+}
+Baby_Sage: {
+ Inherit: ("Sage")
+}
+Baby_Rogue: {
+ Inherit: ("Rogue")
+}
+Baby_Alchemist: {
+ Inherit: ("Alchemist")
+}
+Baby_Bard: {
+ Inherit: ("Bard")
+}
+Baby_Dancer: {
+ Inherit: ("Dancer")
+}
+Super_Baby: {
+ Inherit: ("Novice")
+}
+Rune_Knight_Trans: {
+ Inherit: ("Rune_Knight")
+}
+Warlock_Trans: {
+ Inherit: ("Warlock")
+}
+Ranger_Trans: {
+ Inherit: ("Ranger")
+}
+Arch_Bishop_Trans: {
+ Inherit: ("Arch_Bishop")
+}
+Mechanic_Trans: {
+ Inherit: ("Mechanic")
+}
+Guillotine_Cross_Trans: {
+ Inherit: ("Guillotine_Cross")
+}
+Royal_Guard_Trans: {
+ Inherit: ("Royal_Guard")
+}
+Sorcerer_Trans: {
+ Inherit: ("Sorcerer")
+}
+Minstrel_Trans: {
+ Inherit: ("Minstrel")
+}
+Wanderer_Trans: {
+ Inherit: ("Wanderer")
+}
+Sura_Trans: {
+ Inherit: ("Sura")
+}
+Genetic_Trans: {
+ Inherit: ("Genetic")
+}
+Shadow_Chaser_Trans: {
+ Inherit: ("Shadow_Chaser")
+}
+Baby_Rune_Knight: {
+ Inherit: ("Rune_Knight")
+}
+Baby_Warlock: {
+ Inherit: ("Warlock")
+}
+Baby_Ranger: {
+ Inherit: ("Ranger")
+}
+Baby_Arch_Bishop: {
+ Inherit: ("Arch_Bishop")
+}
+Baby_Mechanic: {
+ Inherit: ("Mechanic")
+}
+Baby_Guillotine_Cross: {
+ Inherit: ("Guillotine_Cross")
+}
+Baby_Royal_Guard: {
+ Inherit: ("Royal_Guard")
+}
+Baby_Sorcerer: {
+ Inherit: ("Sorcerer")
+}
+Baby_Minstrel: {
+ Inherit: ("Minstrel")
+}
+Baby_Wanderer: {
+ Inherit: ("Wanderer")
+}
+Baby_Sura: {
+ Inherit: ("Sura")
+}
+Baby_Genetic: {
+ Inherit: ("Genetic")
+}
+Baby_Shadow_Chaser: {
+ Inherit: ("Shadow_Chaser")
+}
+Super_Novice: {
+ Inherit: ("Novice")
+}
+Expanded_Super_Novice: {
+ Inherit: ("Novice")
+}
+Expanded_Super_Baby: {
+ Inherit: ("Novice")
+} \ No newline at end of file
diff --git a/db/re/job_db1.txt b/db/re/job_db1.txt
deleted file mode 100644
index abc9d2bb8..000000000
--- a/db/re/job_db1.txt
+++ /dev/null
@@ -1,274 +0,0 @@
-// Job-specific Values Database
-//
-// Structure of Database:
-// JobID,Weight,HPFactor,HPMultiplicator,SPFactor,Unarmed,Dagger,1HSword,2HSword,1HSpear,2HSpear,1HAxe,2HAxe,1HMace,2HMace(unused),Rod,Bow,Knuckle,Instrument,Whip,Book,Katar,Revolver,Rifle,Gatling Gun,Shotgun,Grenade Launcher,Fuuma Shuriken,2HStaff,Shield
-//
-// Novice
-0, 20000,0 ,500 ,100 ,440 ,590 ,610 ,2000 ,2000 ,2000 ,540 ,2000 ,540 ,540 ,690 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,690 ,540
-// Swordman
-1, 28000,70 ,500 ,200 ,440 ,510 ,510 ,580 ,610 ,690 ,590 ,640 ,540 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Magician
-2, 22000,30 ,500 ,600 ,540 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,640
-// Archer
-3, 26000,50 ,500 ,200 ,440 ,590 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
-// Acolyte
-4, 24000,40 ,500 ,500 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490 ,490 ,640 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,640 ,510
-// Merchant
-5, 28000,40 ,500 ,300 ,440 ,560 ,560 ,2000 ,2000 ,2000 ,520 ,590 ,540 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Thief
-6, 24000,50 ,500 ,200 ,440 ,520 ,540 ,2000 ,2000 ,2000 ,640 ,2000 ,2000 ,2000 ,2000 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Knight
-7, 28000,150 ,500 ,300 ,440 ,530 ,490 ,560 ,590 ,690 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Priest
-8, 26000,75 ,500 ,800 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470 ,470 ,640 ,2000 ,640 ,2000 ,2000 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,640 ,490
-// Wizard
-9, 24000,55 ,500 ,900 ,540 ,580 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,570 ,620
-// Blacksmith
-10, 30000,90 ,500 ,400 ,440 ,540 ,540 ,2000 ,2000 ,2000 ,500 ,570 ,520 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Hunter
-11, 27000,85 ,500 ,400 ,440 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
-// Assassin
-12, 24000,110 ,500 ,400 ,440 ,460 ,540 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,460 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Knight (Peco)
-13, 28000,150 ,500 ,300 ,440 ,530 ,490 ,560 ,590 ,690 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Crusader
-14, 28000,110 ,700 ,470 ,440 ,520 ,470 ,590 ,570 ,560 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Monk
-15, 26000,90 ,650 ,470 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470 ,470 ,640 ,2000 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,620 ,490
-// Sage
-16, 24000,75 ,500 ,700 ,490 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,2000 ,2000 ,2000 ,2000 ,470 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,590
-// Rogue
-17, 24000,85 ,500 ,500 ,440 ,490 ,540 ,2000 ,2000 ,2000 ,2030 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Alchemist
-18, 30000,90 ,500 ,400 ,440 ,540 ,490 ,2000 ,2000 ,2000 ,490 ,560 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480
-// Bard
-19, 27000,75 ,300 ,600 ,440 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
-// Dancer
-20, 27000,75 ,300 ,600 ,400 ,530 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480 ,2000 ,2000 ,450 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470
-// Crusader (Peco)
-21, 28000,110 ,700 ,470 ,440 ,520 ,470 ,590 ,570 ,560 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Wedding
-22, 20000,0 ,500 ,100 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Super Novice
-23, 20000,0 ,500 ,100 ,440 ,590 ,610 ,2000 ,2000 ,2000 ,540 ,2000 ,540 ,540 ,690 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,690 ,540
-// Gunslinger
-24, 28000,88 ,0 ,450 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490 ,590 ,540 ,940 ,1040 ,2000 ,2000 ,600
-// Ninja
-25, 26000,80 ,0 ,515 ,440 ,470 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,2000 ,500
-// Novice High
-4001, 20000,0 ,500 ,100 ,440 ,590 ,610 ,2000 ,2000 ,2000 ,540 ,2000 ,540 ,540 ,690 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,690 ,540
-// Swordman High
-4002, 28000,70 ,500 ,200 ,440 ,510 ,510 ,580 ,610 ,690 ,590 ,640 ,540 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Magician High
-4003, 22000,30 ,500 ,600 ,540 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,640
-// Archer High
-4004, 26000,50 ,500 ,200 ,440 ,590 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
-// Acolyte High
-4005, 24000,40 ,500 ,500 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490 ,490 ,640 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,640 ,510
-// Merchant High
-4006, 28000,40 ,500 ,300 ,440 ,560 ,560 ,2000 ,2000 ,2000 ,520 ,590 ,540 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Thief High
-4007, 24000,50 ,500 ,200 ,440 ,520 ,540 ,2000 ,2000 ,2000 ,640 ,2000 ,2000 ,2000 ,2000 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Lord Knight
-4008, 28000,150 ,500 ,300 ,440 ,530 ,490 ,560 ,590 ,690 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// High Priest
-4009, 26000,75 ,500 ,800 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470 ,470 ,640 ,2000 ,640 ,2000 ,2000 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,640 ,490
-// High Wizard
-4010, 24000,55 ,500 ,900 ,540 ,580 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,570 ,620
-// Whitesmith
-4011, 30000,90 ,500 ,400 ,440 ,540 ,540 ,2000 ,2000 ,2000 ,500 ,570 ,520 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Sniper
-4012, 27000,85 ,500 ,400 ,440 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
-// Assassin Cross
-4013, 24000,110 ,500 ,400 ,440 ,460 ,540 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,460 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Lord Knight (Peco)
-4014, 28000,150 ,500 ,300 ,440 ,530 ,490 ,560 ,590 ,690 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Paladin
-4015, 28000,110 ,700 ,470 ,440 ,520 ,470 ,590 ,570 ,560 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Champion
-4016, 26000,90 ,650 ,470 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470 ,470 ,640 ,2000 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,620 ,490
-// Professor
-4017, 24000,75 ,500 ,700 ,490 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,2000 ,2000 ,2000 ,2000 ,470 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,590
-// Stalker
-4018, 24000,85 ,500 ,500 ,440 ,490 ,540 ,2000 ,2000 ,2000 ,2030 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Creator
-4019, 30000,90 ,500 ,400 ,440 ,540 ,490 ,490 ,2000 ,2000 ,490 ,560 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480
-// Clown
-4020, 27000,75 ,300 ,600 ,440 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
-// Gypsy
-4021, 27000,75 ,300 ,600 ,440 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520 ,2000 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
-// Paladin (Peco)
-4022, 28000,110 ,700 ,470 ,440 ,520 ,470 ,590 ,570 ,560 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Novice
-4023, 20000,0 ,500 ,100 ,440 ,590 ,610 ,2000 ,2000 ,2000 ,540 ,2000 ,540 ,540 ,690 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,690 ,540
-// Baby Swordman
-4024, 20000,70 ,500 ,200 ,440 ,510 ,510 ,580 ,610 ,690 ,590 ,640 ,540 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Magician
-4025, 20000,30 ,500 ,600 ,540 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,640
-// Baby Archer
-4026, 20000,50 ,500 ,200 ,440 ,590 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
-// Baby Acolyte
-4027, 20000,40 ,500 ,500 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490 ,490 ,640 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,640 ,510
-// Baby Merchant
-4028, 20000,40 ,500 ,300 ,440 ,560 ,560 ,2000 ,2000 ,2000 ,520 ,590 ,540 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Thief
-4029, 20000,50 ,500 ,200 ,440 ,520 ,540 ,2000 ,2000 ,2000 ,640 ,2000 ,2000 ,2000 ,2000 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Baby Knight
-4030, 20000,150 ,500 ,300 ,440 ,530 ,490 ,560 ,590 ,690 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Priest
-4031, 20000,75 ,500 ,800 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470 ,470 ,640 ,2000 ,640 ,2000 ,2000 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,640 ,490
-// Baby Wizard
-4032, 20000,55 ,500 ,900 ,540 ,580 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,570 ,620
-// Baby Blacksmith
-4033, 20000,90 ,500 ,400 ,440 ,540 ,540 ,2000 ,2000 ,2000 ,500 ,570 ,520 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Hunter
-4034, 20000,85 ,500 ,400 ,440 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
-// Baby Assassin
-4035, 20000,110 ,500 ,400 ,440 ,460 ,540 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,460 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Baby Knight (Peco)
-4036, 20000,150 ,500 ,300 ,440 ,530 ,490 ,560 ,590 ,690 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Crusader
-4037, 20000,110 ,700 ,470 ,440 ,520 ,470 ,590 ,570 ,560 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Monk
-4038, 20000,90 ,650 ,470 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470 ,470 ,640 ,2000 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,620 ,490
-// Baby Sage
-4039, 20000,75 ,500 ,700 ,490 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,2000 ,2000 ,2000 ,2000 ,470 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,590
-// Baby Rogue
-4040, 20000,85 ,500 ,500 ,440 ,490 ,540 ,2000 ,2000 ,2000 ,2030 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Alchemist
-4041, 20000,90 ,500 ,400 ,440 ,540 ,490 ,2000 ,2000 ,2000 ,490 ,560 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480
-// Baby Bard
-4042, 20000,75 ,300 ,600 ,440 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
-// Baby Dancer
-4043, 20000,75 ,300 ,600 ,400 ,530 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480 ,2000 ,2000 ,450 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470
-// Baby Crusader (Peco)
-4044, 20000,110 ,700 ,470 ,440 ,520 ,470 ,590 ,570 ,560 ,540 ,590 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Super Novice
-4045, 20000,0 ,500 ,100 ,440 ,590 ,610 ,2000 ,2000 ,2000 ,540 ,2000 ,540 ,540 ,690 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,690 ,540
-// Taekwon
-4046, 28000,70 ,500 ,200 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Star Knight
-4047, 24000,90 ,650 ,470 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Star Knight (flying)
-4048, 24000,90 ,650 ,470 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Soul Linker
-4049, 24000,75 ,500 ,900 ,540 ,440 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,570 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,570 ,620
-// Gangsi (Bongun/Munak)
-4050, 24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,500
-// Death Knight
-4051, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Dark Collector
-4052, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625, 0
-// Rune Knight (Regular)
-4054, 40000,150 ,500 ,300 ,440 ,540 ,560 ,590 ,620 ,560 ,620 ,640 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Warlock (Regular)
-4055, 30000,55 ,500 ,900 ,490 ,560 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,540
-// Ranger (Regular)
-4056, 27000,85 ,500 ,400 ,440 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
-// Arch Bishop (Regular)
-4057, 30000,75 ,500 ,800 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,440 ,2000 ,640 ,2000 ,540 ,2000 ,2000 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,540
-// Mechanic (Regular)
-4058, 38000,90 ,500 ,400 ,440 ,640 ,690 ,2000 ,2000 ,2000 ,490 ,520 ,520 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Guillotine Cross (Regular)
-4059, 32000,110 ,500 ,400 ,440 ,460 ,690 ,2000 ,2000 ,2000 ,840 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,460 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
-// Rune Knight (Trans)
-4060, 40000,150 ,500 ,300 ,440 ,540 ,560 ,590 ,620 ,560 ,620 ,640 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Warlock (Trans)
-4061, 30000,55 ,500 ,900 ,490 ,560 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,540
-// Ranger (Trans)
-4062, 27000,85 ,500 ,400 ,440 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
-// Arch Bishop (Trans)
-4063, 30000,75 ,500 ,800 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,440 ,2000 ,640 ,2000 ,540 ,2000 ,2000 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,540
-// Mechanic (Trans)
-4064, 38000,90 ,500 ,400 ,440 ,640 ,690 ,2000 ,2000 ,2000 ,490 ,520 ,520 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Guillotine Cross (Trans)
-4065, 32000,110 ,500 ,400 ,440 ,460 ,690 ,2000 ,2000 ,2000 ,840 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,460 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
-// Royal Guard (Regular)
-4066, 35000,110 ,700 ,470 ,440 ,510 ,490 ,530 ,540 ,540 ,520 ,560 ,480 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Sorcerer (Regular)
-4067, 30000,75 ,500 ,700 ,440 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490 ,490
-// Minstrel (Regular)
-4068, 32000,75 ,300 ,600 ,440 ,560 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
-// Wanderer (Regular)
-4069, 27000,75 ,300 ,600 ,440 ,560 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
-// Sura (Regular)
-4070, 30000,90 ,650 ,470 ,420 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470 ,470 ,520 ,2000 ,430 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,470
-// Genetic (Regular)
-4071, 32000,90 ,500 ,400 ,440 ,540 ,480 ,2000 ,2000 ,2000 ,550 ,550 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480
-// Shadow Chaser (Regular)
-4072, 28000,85 ,500 ,500 ,440 ,470 ,510 ,2000 ,2000 ,2000 ,2030 ,2000 ,2000 ,2000 ,2000 ,510 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Royal Guard (Trans)
-4073, 35000,110 ,700 ,470 ,440 ,510 ,490 ,530 ,540 ,540 ,520 ,560 ,480 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Sorcerer (Trans)
-4074, 30000,75 ,500 ,700 ,440 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490 ,490
-// Minstrel (Trans)
-4075, 32000,75 ,300 ,600 ,440 ,560 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
-// Wanderer (Trans)
-4076, 27000,75 ,300 ,600 ,440 ,560 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
-// Sura (Trans)
-4077, 30000,90 ,650 ,470 ,420 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470 ,470 ,520 ,2000 ,430 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,470
-// Genetic (Trans)
-4078, 32000,90 ,500 ,400 ,440 ,540 ,480 ,2000 ,2000 ,2000 ,550 ,550 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480
-// Shadow Chaser (Trans)
-4079, 28000,85 ,500 ,500 ,440 ,470 ,510 ,2000 ,2000 ,2000 ,2030 ,2000 ,2000 ,2000 ,2000 ,510 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Rune Knight (Dragon) (Regular)
-4080, 40000,150 ,500 ,300 ,440 ,540 ,560 ,590 ,620 ,560 ,620 ,640 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Rune Knight (Dragon) (Trans)
-4081, 40000,150 ,500 ,300 ,440 ,540 ,560 ,590 ,620 ,560 ,620 ,640 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Royal Guard (Gryphon) (Regular)
-4082, 35000,110 ,700 ,470 ,440 ,510 ,490 ,530 ,540 ,540 ,520 ,560 ,480 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Royal Guard (Gryphon) (Trans)
-4083, 35000,110 ,700 ,470 ,440 ,510 ,490 ,530 ,540 ,540 ,520 ,560 ,480 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Ranger (Warg) (Regular)
-4084, 27000,85 ,500 ,400 ,440 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
-// Ranger (Warg) (Trans)
-4085, 27000,85 ,500 ,400 ,440 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
-// Mechanic (Mado) (Regular)
-4086, 38000,90 ,500 ,400 ,440 ,640 ,690 ,2000 ,2000 ,2000 ,490 ,520 ,520 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Mechanic (Mado) (Trans)
-4087, 38000,90 ,500 ,400 ,440 ,640 ,690 ,2000 ,2000 ,2000 ,490 ,520 ,520 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Baby Rune Knight
-4096, 20000,150 ,500 ,300 ,440 ,540 ,560 ,590 ,620 ,560 ,620 ,640 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Warlock
-4097, 20000,55 ,500 ,900 ,490 ,560 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,540
-// Baby Ranger
-4098, 20000,85 ,500 ,400 ,440 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
-// Baby Arch Bishop
-4099, 20000,75 ,500 ,800 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,440 ,2000 ,640 ,2000 ,540 ,2000 ,2000 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590 ,540
-// Baby Mechanic
-4100, 20000,90 ,500 ,400 ,440 ,640 ,690 ,2000 ,2000 ,2000 ,490 ,520 ,520 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Baby Guillotine Cross
-4101, 20000,110 ,500 ,400 ,440 ,460 ,690 ,2000 ,2000 ,2000 ,840 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,460 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
-// Baby Royal Guard
-4102, 20000,110 ,700 ,470 ,440 ,510 ,490 ,530 ,540 ,540 ,520 ,560 ,480 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Sorcerer
-4103, 20000,75 ,500 ,700 ,440 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490 ,490
-// Baby Minstrel
-4104, 20000,75 ,300 ,600 ,440 ,560 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
-// Baby Wanderer
-4105, 20000,75 ,300 ,600 ,440 ,560 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,2000 ,2000 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
-// Baby Sura
-4106, 20000,90 ,650 ,470 ,420 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470 ,470 ,520 ,2000 ,430 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540 ,470
-// Baby Genetic
-4107, 20000,90 ,500 ,400 ,440 ,540 ,480 ,2000 ,2000 ,2000 ,550 ,550 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480
-// Baby Shadow Chaser
-4108, 20000,85 ,500 ,500 ,440 ,470 ,510 ,2000 ,2000 ,2000 ,2030 ,2000 ,2000 ,2000 ,2000 ,510 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Rune Knight (Dragon)
-4109, 20000,150 ,500 ,300 ,440 ,540 ,560 ,590 ,620 ,560 ,620 ,640 ,490 ,490 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Royal Guard (Gryphon)
-4110, 20000,110 ,700 ,470 ,440 ,510 ,490 ,530 ,540 ,540 ,520 ,560 ,480 ,480 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
-// Baby Ranger (Warg)
-4111, 20000,85 ,500 ,400 ,440 ,540 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
-// Baby Mechanic (Mado)
-4112, 20000,90 ,500 ,400 ,440 ,640 ,690 ,2000 ,2000 ,2000 ,490 ,520 ,520 ,520 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-// Super Novice (Expanded)
-4190, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 650 ,540
-// Super Baby (Expanded)
-4191, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 650 ,540
-// Kagerou
-4211, 26000,80 , 0 ,515 ,400 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 750 ,2000 ,500
-// Oboro
-4212, 26000,80 , 0 ,515 ,400 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 750 ,2000 ,500
-// Rebellion
-
-4215, 28000,88 , 0 ,450 ,550 ,2000, 2000, 2000, 2000, 2000, 2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 520 , 620 , 570 ,970 ,1070 ,2000 ,2000 ,600
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index c3c0f7ab6..f63a4b169 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -1340,7 +1340,7 @@ Examples:
setd ".@var$", "Poporing";
mes .@var$; // Displays "Poporing".
- setd ".@" + $var$ + "123$", "Poporing is cool";
+ setd ".@" + .@var$ + "123$", "Poporing is cool";
mes .@Poporing123$; // Displays "Poporing is cool".
---------------------------------------
diff --git a/npc/instances/SealedShrine.txt b/npc/instances/SealedShrine.txt
index 82267be7a..240bc1ac4 100644
--- a/npc/instances/SealedShrine.txt
+++ b/npc/instances/SealedShrine.txt
@@ -272,7 +272,7 @@ prt_monk,261,91,3 script Rust Blackhand#edq 4_M_DWARF,{
mes "[Rust Blackhand]";
mes "Did you bring all of the ingredients?";
next;
- if ((countitem(6004) > 0) && (countitem(2256) > 0) && (countitem(7799) > 29) && (countitem(7798) > 49) && (Zeny > 990000)) {
+ if (countitem(6004) && countitem(2256) && (countitem(7799) > 29) && (countitem(7798) > 49) && (Zeny >= 990000)) {
mes "[Rust Blackhand]";
mes "kkk... You prepared the ingredients well. Why don't you leave it there and wait?";
next;
@@ -348,7 +348,9 @@ prt_monk,261,91,3 script Rust Blackhand#edq 4_M_DWARF,{
next;
mes "[Rust Blackhand]";
mes "You'll never know how great this hat is until you get one. If you understood, go and get the ingredients.";
- changequest 3042,3043;
+ if (questprogress(3042)==1)
+ erasequest 3042;
+ setquest 3043;
close;
case 2:
mes "[Rust Blackhand]";
@@ -403,8 +405,9 @@ prt_monk,261,91,3 script Rust Blackhand#edq 4_M_DWARF,{
next;
mes "[Rust Blackhand]";
mes "You'll never know how great this hat is until you get one. If you understood, go and get the ingredients.";
- //recall_completequest 3043
- changequest 3042,3043;
+ if (questprogress(3042)==1)
+ erasequest 3042;
+ setquest 3043;
close;
case 2:
mes "[Rust Blackhand]";
diff --git a/npc/re/instances/WolfchevLaboratory.txt b/npc/re/instances/WolfchevLaboratory.txt
index a4e484785..55fef1b07 100644
--- a/npc/re/instances/WolfchevLaboratory.txt
+++ b/npc/re/instances/WolfchevLaboratory.txt
@@ -1693,8 +1693,10 @@ lhz_dun04,151,276,3 script Researcher#memo 4_LGTSCIENCE,{
}
.@killed_bosses = true;
for(.@quest_id = 5113; .@quest_id <= 5125; .@quest_id++) {
- if(questprogress(.@quest_id, HUNTING) != 2)
+ if(questprogress(.@quest_id, HUNTING) != 2){
.@killed_bosses = false;
+ break;
+ }
}
if (lght_duk01 < 6) {
mes "[Researcher]";
@@ -1781,13 +1783,11 @@ lhz_dun04,151,276,3 script Researcher#memo 4_LGTSCIENCE,{
close;
case 2:
.@quest_time = questprogress(5112, PLAYTIME);
- if (!.@quest_time) {
+ if (.@quest_time==1) {
mes "[Wolfchev]";
mes "I'm sorry, but it seems you still cannot enter to the laboratory yet. Will you come back later? The system is kind of tricky you know.";
close;
} else {
- //if (.@quest_time == 2)
- //recall_completequest 5112;
if (.@quest_time)
erasequest 5112;
if (!.@killed_bosses) {
@@ -1950,8 +1950,6 @@ lhz_dun04,147,279,0 script Laboratory Entrance#memo CLEAR_NPC,{
} else if (.@lhz_time == 2) {
mes "Di Rit- Di- Di- Dit-";
next;
- //if (.@lhz_time == 2)
- //recall_completequest 5112;
erasequest 5112;
mes ""+ strcharinfo(PC_NAME) +". . .";
mes "^FF0000Access denial has been deactivated.^000000";
diff --git a/npc/re/merchants/ninja_craftsman.txt b/npc/re/merchants/ninja_craftsman.txt
index b9025f3aa..a88069e99 100644
--- a/npc/re/merchants/ninja_craftsman.txt
+++ b/npc/re/merchants/ninja_craftsman.txt
@@ -193,7 +193,7 @@ L_Ingredients:
}
-que_ng,21,72,6 script Master Craftsman Ki#weap 4_M_RASWORD,{
+que_ng,23,70,6 script Master Craftsman Ki#weap 4_DST_SOLDIER,{
mes "[Ki]";
mes "To attack is the best means of defense.";
mes "A powerful weapon will make you truly complete.";
diff --git a/src/char/char.c b/src/char/char.c
index 83bb36a34..756b7397a 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -39,6 +39,7 @@
#include "../common/malloc.h"
#include "../common/mapindex.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/strlib.h"
@@ -317,6 +318,7 @@ static int char_db_setoffline(DBKey key, DBData *data, va_list ap)
{
struct online_char_data* character = (struct online_char_data*)DB->data2ptr(data);
int server_id = va_arg(ap, int);
+ nullpo_ret(character);
if (server_id == -1) {
character->char_id = -1;
character->server = -1;
@@ -336,12 +338,13 @@ static int char_db_kickoffline(DBKey key, DBData *data, va_list ap)
{
struct online_char_data* character = (struct online_char_data*)DB->data2ptr(data);
int server_id = va_arg(ap, int);
+ nullpo_ret(character);
if (server_id > -1 && character->server != server_id)
return 0;
//Kick out any connected characters, and set them offline as appropriate.
- if (character->server > -1)
+ if (character->server > -1 && character->server < MAX_MAP_SERVERS)
mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 1);
else if (character->waiting_disconnect == INVALID_TIMER)
chr->set_char_offline(character->char_id, character->account_id);
@@ -404,7 +407,8 @@ int char_mmo_char_tosql(int char_id, struct mmo_charstatus* p)
int errors = 0; //If there are any errors while saving, "cp" will not be updated at the end.
StringBuf buf;
- if (char_id!=p->char_id) return 0;
+ nullpo_ret(p);
+ if (char_id != p->char_id) return 0;
cp = idb_ensure(chr->char_db_, char_id, chr->create_charstatus);
@@ -1008,6 +1012,9 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf)
time_t unban_time = 0;
char sex[2];
+ nullpo_ret(sd);
+ nullpo_ret(buf);
+
stmt = SQL->StmtMalloc(inter->sql_handle);
if( stmt == NULL ) {
SqlStmt_ShowDebug(stmt);
@@ -1075,6 +1082,8 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf)
}
for( i = 0; i < MAX_CHARS && SQL_SUCCESS == SQL->StmtNextRow(stmt); i++ ) {
+ if (p.slot >= MAX_CHARS)
+ continue;
p.last_point.map = mapindex->name2id(last_map);
sd->found_char[p.slot] = p.char_id;
sd->unban_time[p.slot] = unban_time;
@@ -1122,6 +1131,8 @@ int char_mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_every
int account_id;
char sex[2];
+ nullpo_ret(p);
+
memset(p, 0, sizeof(struct mmo_charstatus));
if (save_log) ShowInfo("Char load request (%d)\n", char_id);
@@ -1325,8 +1336,9 @@ int char_mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_every
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 7, SQLDT_UINT, &tmp_item.expire_time, 0, NULL, NULL)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 8, SQLDT_UCHAR, &tmp_item.bound, 0, NULL, NULL)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 9, SQLDT_UINT64, &tmp_item.unique_id, 0, NULL, NULL)
- )
+ ) {
SqlStmt_ShowDebug(stmt);
+ }
for( i = 0; i < MAX_SLOTS; ++i )
if( SQL_ERROR == SQL->StmtBindColumn(stmt, 10+i, SQLDT_SHORT, &tmp_item.card[i], 0, NULL, NULL) )
SqlStmt_ShowDebug(stmt);
@@ -1348,8 +1360,9 @@ int char_mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_every
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 0, SQLDT_USHORT, &tmp_skill.id , 0, NULL, NULL)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 1, SQLDT_UCHAR , &tmp_skill.lv , 0, NULL, NULL)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 2, SQLDT_UCHAR , &tmp_skill.flag, 0, NULL, NULL)
- )
+ ) {
SqlStmt_ShowDebug(stmt);
+ }
if( tmp_skill.flag != SKILL_FLAG_PERM_GRANTED )
tmp_skill.flag = SKILL_FLAG_PERMANENT;
@@ -1370,8 +1383,10 @@ int char_mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_every
|| SQL_ERROR == SQL->StmtExecute(stmt)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &tmp_friend.account_id, 0, NULL, NULL)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 1, SQLDT_INT, &tmp_friend.char_id, 0, NULL, NULL)
- || SQL_ERROR == SQL->StmtBindColumn(stmt, 2, SQLDT_STRING, &tmp_friend.name, sizeof(tmp_friend.name), NULL, NULL) )
+ || SQL_ERROR == SQL->StmtBindColumn(stmt, 2, SQLDT_STRING, &tmp_friend.name, sizeof(tmp_friend.name), NULL, NULL)
+ ) {
SqlStmt_ShowDebug(stmt);
+ }
for( i = 0; i < MAX_FRIENDS && SQL_SUCCESS == SQL->StmtNextRow(stmt); ++i )
memcpy(&p->friends[i], &tmp_friend, sizeof(tmp_friend));
@@ -1414,8 +1429,10 @@ int char_mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_every
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &p->bank_vault, 0, NULL, NULL)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 1, SQLDT_USHORT, &p->mod_exp, 0, NULL, NULL)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 2, SQLDT_USHORT, &p->mod_drop, 0, NULL, NULL)
- || SQL_ERROR == SQL->StmtBindColumn(stmt, 3, SQLDT_USHORT, &p->mod_death, 0, NULL, NULL) )
+ || SQL_ERROR == SQL->StmtBindColumn(stmt, 3, SQLDT_USHORT, &p->mod_death, 0, NULL, NULL)
+ ) {
SqlStmt_ShowDebug(stmt);
+ }
if( SQL_SUCCESS == SQL->StmtNextRow(stmt) )
strcat(t_msg, " accdata");
@@ -1473,7 +1490,8 @@ bool char_char_slotchange(struct char_session_data *sd, int fd, unsigned short f
/* update both at once */
if( SQL_SUCCESS != SQL->QueryStr(inter->sql_handle, "START TRANSACTION")
|| SQL_SUCCESS != SQL->Query(inter->sql_handle, "UPDATE `%s` SET `char_num`='%d' WHERE `char_id`='%d' LIMIT 1", char_db, from, sd->found_char[to])
- || SQL_SUCCESS != SQL->Query(inter->sql_handle, "UPDATE `%s` SET `char_num`='%d' WHERE `char_id`='%d' LIMIT 1", char_db, to, sd->found_char[from]) )
+ || SQL_SUCCESS != SQL->Query(inter->sql_handle, "UPDATE `%s` SET `char_num`='%d' WHERE `char_id`='%d' LIMIT 1", char_db, to, sd->found_char[from])
+ )
Sql_ShowDebug(inter->sql_handle);
else
result = true;
@@ -1508,12 +1526,17 @@ int char_rename_char_sql(struct char_session_data *sd, int char_id)
struct mmo_charstatus char_dat;
char esc_name[NAME_LENGTH*2+1];
+ nullpo_retr(2, sd);
+
if( sd->new_name[0] == 0 ) // Not ready for rename
return 2;
if( !chr->mmo_char_fromsql(char_id, &char_dat, false) ) // Only the short data is needed.
return 2;
+ if (sd->account_id != char_dat.account_id) // Try rename not own char
+ return 2;
+
if( char_dat.rename == 0 )
return 1;
@@ -1556,8 +1579,11 @@ int char_check_char_name(char * name, char * esc_name)
{
int i;
+ nullpo_retr(-2, name);
+ nullpo_retr(-2, esc_name);
+
// check length of character name
- if( name[0] == '\0' )
+ if (name[0] == '\0')
return -2; // empty character name
/**
* The client does not allow you to create names with less than 4 characters, however,
@@ -2027,6 +2053,7 @@ void char_mmo_char_send_ban_list(int fd, struct char_session_data *sd) {
int i;
time_t now = time(NULL);
+ nullpo_retv(sd);
ARR_FIND(0, MAX_CHARS, i, sd->unban_time[i]);
if( i != MAX_CHARS ) {
int c;
@@ -2063,6 +2090,7 @@ void char_mmo_char_send_ban_list(int fd, struct char_session_data *sd) {
// [Ind/Hercules] notify client about charselect window data
//----------------------------------------
void char_mmo_char_send_slots_info(int fd, struct char_session_data* sd) {
+ nullpo_retv(sd);
WFIFOHEAD(fd,29);
WFIFOW(fd,0) = 0x82d;
WFIFOW(fd,2) = 29;
@@ -2080,6 +2108,7 @@ void char_mmo_char_send_slots_info(int fd, struct char_session_data* sd) {
int char_mmo_char_send_characters(int fd, struct char_session_data* sd)
{
int j, offset = 0;
+ nullpo_ret(sd);
#if PACKETVER >= 20100413
offset += 3;
#endif
@@ -2201,6 +2230,8 @@ static void char_auth_ok(int fd, struct char_session_data *sd)
{
struct online_char_data* character;
+ nullpo_retv(sd);
+
if( (character = (struct online_char_data*)idb_get(chr->online_char_db, sd->account_id)) != NULL ) {
// check if character is not online already. [Skotlex]
if (character->server > -1) {
@@ -2356,7 +2387,8 @@ void char_parse_fromlogin_account_data(int fd)
void char_parse_fromlogin_login_pong(int fd)
{
RFIFOSKIP(fd,2);
- session[fd]->flag.ping = 0;
+ if (session[fd])
+ session[fd]->flag.ping = 0;
}
void char_changesex(int account_id, int sex)
@@ -2870,7 +2902,7 @@ void char_update_fame_list(int type, int index, int fame) {
mapif->sendall(buf, 8);
}
-//Loads a character's name and stores it in the buffer given (must be NAME_LENGTH in size)
+//Loads a character's name and stores it in the buffer given (must be NAME_LENGTH in size) and not NULL
//Returns 1 on found, 0 on not found (buffer is filled with Unknown char name)
int char_loadName(int char_id, char* name)
{
@@ -2943,6 +2975,7 @@ void mapif_on_disconnect(int id)
}
void mapif_on_parse_accinfo(int account_id, int u_fd, int u_aid, int u_group, int map_fd) {
+ Assert_retv(chr->login_fd > 0);
WFIFOHEAD(chr->login_fd,22);
WFIFOW(chr->login_fd,0) = 0x2740;
WFIFOL(chr->login_fd,2) = account_id;
@@ -2964,7 +2997,7 @@ void char_parse_frommap_skillid2idx(int fd)
int i;
int j = RFIFOW(fd, 2) - 4;
- memset(&skillid2idx, 0, sizeof(skillid2idx));
+ memset(&skillid2idx, 0, sizeof(skillid2idx));
if( j )
j /= 4;
for(i = 0; i < j; i++) {
@@ -3348,6 +3381,8 @@ void char_ban(int account_id, int char_id, time_t *unban_time, short year, short
struct tm *tmtime;
SqlStmt* stmt = SQL->StmtMalloc(inter->sql_handle);
+ nullpo_retv(unban_time);
+
if (*unban_time == 0 || *unban_time < time(NULL))
timestamp = time(NULL); // new ban
else
@@ -3363,13 +3398,12 @@ void char_ban(int account_id, int char_id, time_t *unban_time, short year, short
timestamp = mktime(tmtime);
if( SQL_SUCCESS != SQL->StmtPrepare(stmt,
- "UPDATE `%s` SET `unban_time` = ? WHERE `char_id` = ? LIMIT 1",
- char_db)
+ "UPDATE `%s` SET `unban_time` = ? WHERE `char_id` = ? LIMIT 1",
+ char_db)
|| SQL_SUCCESS != SQL->StmtBindParam(stmt, 0, SQLDT_LONG, (void*)&timestamp, sizeof(timestamp))
|| SQL_SUCCESS != SQL->StmtBindParam(stmt, 1, SQLDT_INT, (void*)&char_id, sizeof(char_id))
|| SQL_SUCCESS != SQL->StmtExecute(stmt)
-
- ) {
+ ) {
SqlStmt_ShowDebug(stmt);
}
@@ -3388,12 +3422,14 @@ void char_unban(int char_id, int *result)
/* handled by char server, so no redirection */
if( SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `unban_time` = '0' WHERE `char_id` = '%d' LIMIT 1", char_db, char_id) ) {
Sql_ShowDebug(inter->sql_handle);
- *result = 1;
+ if (result)
+ *result = 1;
}
}
void char_ask_name_ack(int fd, int acc, const char* name, int type, int result)
{
+ nullpo_retv(name);
WFIFOHEAD(fd,34);
WFIFOW(fd, 0) = 0x2b0f;
WFIFOL(fd, 2) = acc;
@@ -3499,6 +3535,10 @@ void char_parse_frommap_fame_list(int fd)
default: size = 0; list = NULL; break;
}
+ if (!list) {
+ RFIFOSKIP(fd, 11);
+ return;
+ }
ARR_FIND(0, size, player_pos, list[player_pos].id == cid);// position of the player
ARR_FIND(0, size, fame_pos, list[fame_pos].fame <= fame);// where the player should be
@@ -3624,6 +3664,7 @@ void char_parse_frommap_ping(int fd)
void char_map_auth_ok(int fd, int account_id, struct char_auth_node* node, struct mmo_charstatus* cd)
{
+ nullpo_retv(cd);
WFIFOHEAD(fd,25 + sizeof(struct mmo_charstatus));
WFIFOW(fd,0) = 0x2afd;
WFIFOW(fd,2) = 25 + sizeof(struct mmo_charstatus);
@@ -4391,6 +4432,7 @@ void char_parse_char_connect(int fd, struct char_session_data* sd, uint32 ipl)
void char_send_map_info(int fd, int i, uint32 subnet_map_ip, struct mmo_charstatus *cd)
{
+ nullpo_retv(cd);
WFIFOHEAD(fd,28);
WFIFOW(fd,0) = 0x71;
WFIFOL(fd,2) = cd->char_id;
@@ -4413,6 +4455,7 @@ int char_search_default_maps_mapserver(struct mmo_charstatus *cd)
{
int i;
int j;
+ nullpo_retr(-1, cd);
if ((i = chr->search_mapserver((j=mapindex->name2id(MAP_PRONTERA)),-1,-1)) >= 0) {
cd->last_point.x = 273;
cd->last_point.y = 354;
@@ -4505,6 +4548,7 @@ void char_parse_char_select(int fd, struct char_session_data* sd, uint32 ipl)
//Have to switch over to the DB instance otherwise data won't propagate [Kevin]
cd = (struct mmo_charstatus *)idb_get(chr->char_db_, char_id);
+ nullpo_retv(cd);
if( cd->sex == 99 )
cd->sex = sd->sex;
@@ -4658,7 +4702,7 @@ void char_parse_char_delete_char(int fd, struct char_session_data* sd, unsigned
int i;
#if PACKETVER >= 20110309
- if( pincode->enabled ){ // hack check
+ if (pincode->enabled) { // hack check
struct online_char_data* character;
character = (struct online_char_data*)idb_get(chr->online_char_db, sd->account_id);
if( character && character->pincode_enable == -1 ){
@@ -4874,33 +4918,33 @@ void char_parse_char_login_map_server(int fd)
void char_parse_char_pincode_check(int fd, struct char_session_data* sd)
{
- if( RFIFOL(fd,2) == sd->account_id )
- pincode->check( fd, sd );
+ if (RFIFOL(fd,2) == sd->account_id)
+ pincode->check(fd, sd);
- RFIFOSKIP(fd,10);
+ RFIFOSKIP(fd, 10);
}
void char_parse_char_pincode_window(int fd, struct char_session_data* sd)
{
- if( RFIFOL(fd,2) == sd->account_id )
- pincode->sendstate( fd, sd, PINCODE_NOTSET );
+ if (RFIFOL(fd,2) == sd->account_id)
+ pincode->sendstate(fd, sd, PINCODE_NOTSET);
- RFIFOSKIP(fd,6);
+ RFIFOSKIP(fd, 6);
}
void char_parse_char_pincode_change(int fd, struct char_session_data* sd)
{
- if( RFIFOL(fd,2) == sd->account_id )
- pincode->change( fd, sd );
+ if (RFIFOL(fd,2) == sd->account_id)
+ pincode->change(fd, sd);
- RFIFOSKIP(fd,14);
+ RFIFOSKIP(fd, 14);
}
void char_parse_char_pincode_first_pin(int fd, struct char_session_data* sd)
{
- if( RFIFOL(fd,2) == sd->account_id )
- pincode->setnew( fd, sd );
- RFIFOSKIP(fd,10);
+ if (RFIFOL(fd,2) == sd->account_id)
+ pincode->setnew (fd, sd);
+ RFIFOSKIP(fd, 10);
}
void char_parse_char_request_chars(int fd, struct char_session_data* sd)
@@ -5155,6 +5199,7 @@ int mapif_sendall(unsigned char *buf, unsigned int len)
{
int i, c;
+ nullpo_ret(buf);
c = 0;
for(i = 0; i < ARRAYLENGTH(chr->server); i++) {
int fd;
@@ -5173,6 +5218,7 @@ int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len)
{
int i, c;
+ nullpo_ret(buf);
c = 0;
for(i = 0; i < ARRAYLENGTH(chr->server); i++) {
int fd;
@@ -5189,6 +5235,7 @@ int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len)
int mapif_send(int fd, unsigned char *buf, unsigned int len)
{
+ nullpo_ret(buf);
if (fd >= 0) {
int i;
ARR_FIND( 0, ARRAYLENGTH(chr->server), i, fd == chr->server[i].fd );
@@ -5241,6 +5288,7 @@ static int char_send_accounts_tologin_sub(DBKey key, DBData *data, va_list ap)
struct online_char_data* character = DB->data2ptr(data);
int* i = va_arg(ap, int*);
+ nullpo_ret(character);
if(character->server > -1)
{
WFIFOL(chr->login_fd,8+(*i)*4) = character->account_id;
@@ -5307,6 +5355,7 @@ static int char_waiting_disconnect(int tid, int64 tick, int id, intptr_t data) {
static int char_online_data_cleanup_sub(DBKey key, DBData *data, va_list ap)
{
struct online_char_data *character= DB->data2ptr(data);
+ nullpo_ret(character);
if (character->fd != -1)
return 0; //Character still connected
if (character->server == -2) //Unknown server.. set them offline
@@ -5955,6 +6004,7 @@ void char_defaults(void)
memset(chr->userid, 0, sizeof(chr->userid));
memset(chr->passwd, 0, sizeof(chr->passwd));
+ memset(chr->server_name, 0, sizeof(chr->server_name));
chr->ip = 0;
chr->port = 6121;
diff --git a/src/char/int_auction.c b/src/char/int_auction.c
index 57eae641d..f2ec347cd 100644
--- a/src/char/int_auction.c
+++ b/src/char/int_auction.c
@@ -17,6 +17,7 @@
#include "../common/db.h"
#include "../common/malloc.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/sql.h"
@@ -33,7 +34,7 @@ static int inter_auction_count(int char_id, bool buy)
for( auction = dbi_first(iter); dbi_exists(iter); auction = dbi_next(iter) )
{
- if( (buy && auction->buyer_id == char_id) || (!buy && auction->seller_id == char_id) )
+ if ((buy && auction->buyer_id == char_id) || (!buy && auction->seller_id == char_id))
i++;
}
dbi_destroy(iter);
@@ -160,7 +161,10 @@ static int inter_auction_end_timer(int tid, int64 tick, int id, intptr_t data) {
void inter_auction_delete(struct auction_data *auction)
{
- unsigned int auction_id = auction->auction_id;
+ unsigned int auction_id;
+ nullpo_retv(auction);
+
+ auction_id = auction->auction_id;
if( SQL_ERROR == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `auction_id` = '%d'", auction_db, auction_id) )
Sql_ShowDebug(inter->sql_handle);
@@ -240,6 +244,8 @@ void mapif_auction_sendlist(int fd, int char_id, short count, short pages, unsig
{
int len = (sizeof(struct auction_data) * count) + 12;
+ nullpo_retv(buf);
+
WFIFOHEAD(fd, len);
WFIFOW(fd,0) = 0x3850;
WFIFOW(fd,2) = len;
@@ -297,6 +303,8 @@ void mapif_auction_register(int fd, struct auction_data *auction)
{
int len = sizeof(struct auction_data) + 4;
+ nullpo_retv(auction);
+
WFIFOHEAD(fd,len);
WFIFOW(fd,0) = 0x3851;
WFIFOW(fd,2) = len;
diff --git a/src/char/int_elemental.c b/src/char/int_elemental.c
index d14d1e1e0..3a5022fe4 100644
--- a/src/char/int_elemental.c
+++ b/src/char/int_elemental.c
@@ -15,6 +15,7 @@
#include "mapif.h"
#include "../common/malloc.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/sql.h"
@@ -26,6 +27,7 @@ struct inter_elemental_interface inter_elemental_s;
bool mapif_elemental_save(struct s_elemental* ele) {
bool flag = true;
+ nullpo_retr(false, ele);
if( ele->elemental_id == 0 ) { // Create new DB entry
if( SQL_ERROR == SQL->Query(inter->sql_handle,
"INSERT INTO `%s` (`char_id`,`class`,`mode`,`hp`,`sp`,`max_hp`,`max_sp`,`atk1`,`atk2`,`matk`,`aspd`,`def`,`mdef`,`flee`,`hit`,`life_time`)"
@@ -53,6 +55,7 @@ bool mapif_elemental_save(struct s_elemental* ele) {
bool mapif_elemental_load(int ele_id, int char_id, struct s_elemental *ele) {
char* data;
+ nullpo_retr(false, ele);
memset(ele, 0, sizeof(struct s_elemental));
ele->elemental_id = ele_id;
ele->char_id = char_id;
@@ -105,6 +108,7 @@ bool mapif_elemental_delete(int ele_id) {
void mapif_elemental_send(int fd, struct s_elemental *ele, unsigned char flag) {
int size = sizeof(struct s_elemental) + 5;
+ nullpo_retv(ele);
WFIFOHEAD(fd,size);
WFIFOW(fd,0) = 0x387c;
WFIFOW(fd,2) = size;
diff --git a/src/char/int_guild.c b/src/char/int_guild.c
index 20db452af..3ba51e1f0 100644
--- a/src/char/int_guild.c
+++ b/src/char/int_guild.c
@@ -18,6 +18,7 @@
#include "../common/db.h"
#include "../common/malloc.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/strlib.h"
@@ -50,6 +51,8 @@ int inter_guild_save_timer(int tid, int64 tick, int id, intptr_t data) {
for( g = DB->data2ptr(iter->first(iter, &key)); dbi_exists(iter); g = DB->data2ptr(iter->next(iter, &key)) )
{
+ if (!g)
+ continue;
if( state == 0 && g->guild_id == last_id )
state++; //Save next guild in the list.
else
@@ -114,6 +117,7 @@ int inter_guild_tosql(struct guild *g,int flag)
char new_guild = 0;
int i=0;
+ nullpo_ret(g);
if (g->guild_id<=0 && g->guild_id != -1) return 0;
#ifdef NOISY
@@ -253,7 +257,7 @@ int inter_guild_tosql(struct guild *g,int flag)
//printf("- Insert guild %d to guild_position\n",g->guild_id);
for(i=0;i<MAX_GUILDPOSITION;i++){
struct guild_position *p = &g->position[i];
- if (!p->modified)
+ if (!p || !p->modified)
continue;
SQL->EscapeStringLen(inter->sql_handle, esc_name, p->name, strnlen(p->name, NAME_LENGTH));
if( SQL_ERROR == SQL->Query(inter->sql_handle, "REPLACE INTO `%s` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) VALUES ('%d','%d','%s','%d','%d')",
@@ -521,6 +525,7 @@ int inter_guild_castle_tosql(struct guild_castle *gc)
StringBuf buf;
int i;
+ nullpo_ret(gc);
StrBuf->Init(&buf);
StrBuf->Printf(&buf, "REPLACE INTO `%s` SET `castle_id`='%d', `guild_id`='%d', `economy`='%d', `defense`='%d', "
"`triggerE`='%d', `triggerD`='%d', `nextTime`='%d', `payTime`='%d', `createTime`='%d', `visibleC`='%d'",
@@ -593,6 +598,7 @@ struct guild_castle* inter_guild_castle_fromsql(int castle_id)
// Read exp_guild.txt
bool inter_guild_exp_parse_row(char* split[], int column, int current) {
int64 exp = strtoll(split[0], NULL, 10);
+ nullpo_retr(true, split);
if (exp < 0 || exp >= UINT_MAX) {
ShowError("exp_guild: Invalid exp %"PRId64" (valid range: 0 - %u) at line %d\n", exp, UINT_MAX, current);
@@ -729,6 +735,7 @@ int inter_guild_sql_init(void)
int inter_guild_db_final(DBKey key, DBData *data, va_list ap)
{
struct guild *g = DB->data2ptr(data);
+ nullpo_ret(g);
if (g->save_flag&GS_MASK) {
inter_guild->tosql(g, g->save_flag&GS_MASK);
return 1;
@@ -749,6 +756,7 @@ int inter_guild_search_guildname(char *str)
int guild_id;
char esc_name[NAME_LENGTH*2+1];
+ nullpo_retr(-1, str);
SQL->EscapeStringLen(inter->sql_handle, esc_name, str, safestrnlen(str, NAME_LENGTH));
//Lookup guilds with the same name
if( SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT guild_id FROM `%s` WHERE name='%s'", guild_db, esc_name) )
@@ -776,6 +784,7 @@ int inter_guild_search_guildname(char *str)
static bool inter_guild_check_empty(struct guild *g)
{
int i;
+ nullpo_ret(g);
ARR_FIND( 0, g->max_member, i, g->member[i].account_id > 0 );
if( i < g->max_member)
return false; // not empty
@@ -788,16 +797,17 @@ static bool inter_guild_check_empty(struct guild *g)
unsigned int inter_guild_nextexp(int level) {
if (level == 0)
return 1;
- if (level <= 0 || level >= MAX_GUILDLEVEL)
+ if (level <= 0 || level > MAX_GUILDLEVEL)
return 0;
return inter_guild->exp[level-1];
}
-int inter_guild_checkskill(struct guild *g,int id)
+int inter_guild_checkskill(struct guild *g, int id)
{
int idx = id - GD_SKILLBASE;
+ nullpo_ret(g);
if(idx < 0 || idx >= MAX_GUILDSKILL)
return 0;
@@ -810,6 +820,7 @@ int inter_guild_calcinfo(struct guild *g)
unsigned int nextexp;
struct guild before = *g; // Save guild current values
+ nullpo_ret(g);
if(g->guild_lv<=0)
g->guild_lv = 1;
nextexp = inter_guild->nextexp(g->guild_lv);
@@ -872,6 +883,7 @@ int inter_guild_calcinfo(struct guild *g)
int mapif_guild_created(int fd, int account_id, struct guild *g)
{
+ nullpo_ret(g);
WFIFOHEAD(fd, 10);
WFIFOW(fd,0)=0x3830;
WFIFOL(fd,2)=account_id;
@@ -905,6 +917,7 @@ int mapif_guild_noinfo(int fd, int guild_id)
int mapif_guild_info(int fd, struct guild *g)
{
unsigned char buf[8+sizeof(struct guild)];
+ nullpo_ret(g);
WBUFW(buf,0)=0x3831;
WBUFW(buf,2)=4+sizeof(struct guild);
memcpy(buf+4,g,sizeof(struct guild));
@@ -932,6 +945,10 @@ int mapif_guild_memberadded(int fd, int guild_id, int account_id, int char_id, i
int mapif_guild_withdraw(int guild_id,int account_id,int char_id,int flag, const char *name, const char *mes)
{
unsigned char buf[55+NAME_LENGTH];
+
+ nullpo_ret(name);
+ nullpo_ret(mes);
+
WBUFW(buf, 0)=0x3834;
WBUFL(buf, 2)=guild_id;
WBUFL(buf, 6)=account_id;
@@ -948,6 +965,8 @@ int mapif_guild_withdraw(int guild_id,int account_id,int char_id,int flag, const
int mapif_guild_memberinfoshort(struct guild *g, int idx)
{
unsigned char buf[19];
+ nullpo_ret(g);
+ Assert_ret(idx >= 0 && idx < MAX_GUILD);
WBUFW(buf, 0)=0x3835;
WBUFL(buf, 2)=g->guild_id;
WBUFL(buf, 6)=g->member[idx].account_id;
@@ -975,6 +994,7 @@ int mapif_guild_broken(int guild_id, int flag)
int mapif_guild_message(int guild_id, int account_id, char *mes, int len, int sfd)
{
unsigned char buf[512];
+ nullpo_ret(mes);
if (len > 500)
len = 500;
WBUFW(buf,0)=0x3837;
@@ -990,6 +1010,7 @@ int mapif_guild_message(int guild_id, int account_id, char *mes, int len, int sf
int mapif_guild_basicinfochanged(int guild_id, int type, const void *data, int len)
{
unsigned char buf[2048];
+ nullpo_ret(data);
if (len > 2038)
len = 2038;
WBUFW(buf, 0)=0x3839;
@@ -1005,6 +1026,7 @@ int mapif_guild_basicinfochanged(int guild_id, int type, const void *data, int l
int mapif_guild_memberinfochanged(int guild_id, int account_id, int char_id, int type, const void *data, int len)
{
unsigned char buf[2048];
+ nullpo_ret(data);
if (len > 2030)
len = 2030;
WBUFW(buf, 0)=0x383a;
@@ -1034,6 +1056,8 @@ int mapif_guild_skillupack(int guild_id, uint16 skill_id, int account_id)
int mapif_guild_alliance(int guild_id1, int guild_id2, int account_id1, int account_id2, int flag, const char *name1, const char *name2)
{
unsigned char buf[19+2*NAME_LENGTH];
+ nullpo_ret(name1);
+ nullpo_ret(name2);
WBUFW(buf, 0)=0x383d;
WBUFL(buf, 2)=guild_id1;
WBUFL(buf, 6)=guild_id2;
@@ -1050,6 +1074,8 @@ int mapif_guild_alliance(int guild_id1, int guild_id2, int account_id1, int acco
int mapif_guild_position(struct guild *g, int idx)
{
unsigned char buf[12 + sizeof(struct guild_position)];
+ nullpo_ret(g);
+ Assert_ret(idx >= 0 && idx < MAX_GUILDPOSITION);
WBUFW(buf,0)=0x383b;
WBUFW(buf,2)=sizeof(struct guild_position)+12;
WBUFL(buf,4)=g->guild_id;
@@ -1063,6 +1089,7 @@ int mapif_guild_position(struct guild *g, int idx)
int mapif_guild_notice(struct guild *g)
{
unsigned char buf[256];
+ nullpo_ret(g);
WBUFW(buf,0)=0x383e;
WBUFL(buf,2)=g->guild_id;
memcpy(WBUFP(buf,6),g->mes1,MAX_GUILDMES1);
@@ -1075,6 +1102,7 @@ int mapif_guild_notice(struct guild *g)
int mapif_guild_emblem(struct guild *g)
{
unsigned char buf[12 + sizeof(g->emblem_data)];
+ nullpo_ret(g);
WBUFW(buf,0)=0x383f;
WBUFW(buf,2)=g->emblem_len+12;
WBUFL(buf,4)=g->guild_id;
@@ -1087,6 +1115,7 @@ int mapif_guild_emblem(struct guild *g)
int mapif_guild_master_changed(struct guild *g, int aid, int cid)
{
unsigned char buf[14];
+ nullpo_ret(g);
WBUFW(buf,0)=0x3843;
WBUFL(buf,2)=g->guild_id;
WBUFL(buf,6)=aid;
@@ -1102,6 +1131,7 @@ int mapif_guild_castle_dataload(int fd, int sz, int *castle_ids)
int len = 4 + num * sizeof(*gc);
int i;
+ nullpo_ret(castle_ids);
WFIFOHEAD(fd, len);
WFIFOW(fd, 0) = 0x3840;
WFIFOW(fd, 2) = len;
@@ -1125,6 +1155,8 @@ int mapif_parse_CreateGuild(int fd,int account_id,char *name,struct guild_member
#ifdef NOISY
ShowInfo("Creating Guild (%s)\n", name);
#endif
+ nullpo_ret(name);
+ nullpo_ret(master);
if(inter_guild->search_guildname(name) != 0){
ShowInfo("int_guild: guild with same name exists [%s]\n",name);
mapif->guild_created(fd,account_id,NULL);
@@ -1217,6 +1249,7 @@ int mapif_parse_GuildAddMember(int fd, int guild_id, struct guild_member *m)
struct guild * g;
int i;
+ nullpo_ret(m);
g = inter_guild->fromsql(guild_id);
if(g==NULL){
// Failed to add
@@ -1262,6 +1295,7 @@ int mapif_parse_GuildLeave(int fd, int guild_id, int account_id, int char_id, in
return 0;
}
+ nullpo_ret(mes);
// Find the member
ARR_FIND( 0, g->max_member, i, g->member[i].account_id == account_id && g->member[i].char_id == char_id );
if( i == g->max_member )
@@ -1426,6 +1460,7 @@ int mapif_parse_GuildBasicInfoChange(int fd, int guild_id, int type, const void
if( g == NULL )
return 0;
+ nullpo_ret(data);
switch(type) {
case GBI_EXP:
value = *((const int16 *)data);
@@ -1478,6 +1513,7 @@ int mapif_parse_GuildMemberInfoChange(int fd, int guild_id, int account_id, int
int i;
struct guild * g;
+ nullpo_ret(data);
g = inter_guild->fromsql(guild_id);
if(g==NULL)
return 0;
@@ -1588,6 +1624,7 @@ int inter_guild_charname_changed(int guild_id, int account_id, int char_id, char
struct guild *g;
int i, flag = 0;
+ nullpo_ret(name);
g = inter_guild->fromsql(guild_id);
if( g == NULL )
{
@@ -1625,6 +1662,7 @@ int mapif_parse_GuildPosition(int fd, int guild_id, int idx, struct guild_positi
// Could make some improvement in speed, because only change guild_position
struct guild * g;
+ nullpo_ret(p);
g = inter_guild->fromsql(guild_id);
if(g==NULL || idx<0 || idx>=MAX_GUILDPOSITION)
return 0;
@@ -1664,6 +1702,7 @@ int mapif_parse_GuildDeleteAlliance(struct guild *g, int guild_id, int account_i
int i;
char name[NAME_LENGTH];
+ nullpo_retr(-1, g);
ARR_FIND( 0, MAX_GUILDALLIANCE, i, g->alliance[i].guild_id == guild_id );
if( i == MAX_GUILDALLIANCE )
return -1;
@@ -1726,6 +1765,8 @@ int mapif_parse_GuildNotice(int fd, int guild_id, const char *mes1, const char *
{
struct guild *g;
+ nullpo_ret(mes1);
+ nullpo_ret(mes2);
g = inter_guild->fromsql(guild_id);
if(g==NULL)
return 0;
@@ -1740,6 +1781,7 @@ int mapif_parse_GuildEmblem(int fd, int len, int guild_id, int dummy, const char
{
struct guild * g;
+ nullpo_ret(data);
g = inter_guild->fromsql(guild_id);
if(g==NULL)
return 0;
@@ -1804,6 +1846,7 @@ int mapif_parse_GuildMasterChange(int fd, int guild_id, const char* name, int le
struct guild_member gm;
int pos;
+ nullpo_ret(name);
g = inter_guild->fromsql(guild_id);
if(g==NULL || len > NAME_LENGTH)
@@ -1888,6 +1931,7 @@ void inter_guild_defaults(void)
inter_guild->guild_db = NULL;
inter_guild->castle_db = NULL;
+ memset(inter_guild->exp, 0, sizeof(inter_guild->exp));
inter_guild->save_timer = inter_guild_save_timer;
inter_guild->removemember_tosql = inter_guild_removemember_tosql;
diff --git a/src/char/int_homun.c b/src/char/int_homun.c
index dd23261c2..9f91de252 100644
--- a/src/char/int_homun.c
+++ b/src/char/int_homun.c
@@ -15,6 +15,7 @@
#include "mapif.h"
#include "../common/malloc.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/sql.h"
@@ -34,6 +35,7 @@ void inter_homunculus_sql_final(void)
void mapif_homunculus_created(int fd, int account_id, struct s_homunculus *sh, unsigned char flag)
{
+ nullpo_retv(sh);
WFIFOHEAD(fd, sizeof(struct s_homunculus)+9);
WFIFOW(fd,0) = 0x3890;
WFIFOW(fd,2) = sizeof(struct s_homunculus)+9;
@@ -53,6 +55,7 @@ void mapif_homunculus_deleted(int fd, int flag)
void mapif_homunculus_loaded(int fd, int account_id, struct s_homunculus *hd)
{
+ nullpo_retv(hd);
WFIFOHEAD(fd, sizeof(struct s_homunculus)+9);
WFIFOW(fd,0) = 0x3891;
WFIFOW(fd,2) = sizeof(struct s_homunculus)+9;
@@ -81,6 +84,7 @@ void mapif_homunculus_saved(int fd, int account_id, bool flag)
void mapif_homunculus_renamed(int fd, int account_id, int char_id, unsigned char flag, char* name)
{
+ nullpo_retv(name);
WFIFOHEAD(fd, NAME_LENGTH+12);
WFIFOW(fd, 0) = 0x3894;
WFIFOL(fd, 2) = account_id;
@@ -95,6 +99,7 @@ bool mapif_homunculus_save(struct s_homunculus* hd)
bool flag = true;
char esc_name[NAME_LENGTH*2+1];
+ nullpo_ret(hd);
SQL->EscapeStringLen(inter->sql_handle, esc_name, hd->name, strnlen(hd->name, NAME_LENGTH));
if( hd->hom_id == 0 )
@@ -158,6 +163,7 @@ bool mapif_homunculus_load(int homun_id, struct s_homunculus* hd)
char* data;
size_t len;
+ nullpo_ret(hd);
memset(hd, 0, sizeof(*hd));
if( SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `homun_id`,`char_id`,`class`,`prev_class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`,`rename_flag`, `vaporize` FROM `%s` WHERE `homun_id`='%u'", homunculus_db, homun_id) )
@@ -247,6 +253,7 @@ bool mapif_homunculus_rename(char *name)
{
int i;
+ nullpo_ret(name);
// Check Authorized letters/symbols in the name of the homun
if( char_name_option == 1 )
{// only letters/symbols in char_name_letters are authorized
diff --git a/src/char/int_mail.c b/src/char/int_mail.c
index 17fb9d424..cd2fa0deb 100644
--- a/src/char/int_mail.c
+++ b/src/char/int_mail.c
@@ -15,6 +15,7 @@
#include "mapif.h"
#include "../common/malloc.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/sql.h"
@@ -30,6 +31,7 @@ static int inter_mail_fromsql(int char_id, struct mail_data* md)
char *data;
StringBuf buf;
+ nullpo_ret(md);
memset(md, 0, sizeof(struct mail_data));
md->amount = 0;
md->full = false;
@@ -114,6 +116,7 @@ int inter_mail_savemessage(struct mail_message* msg)
SqlStmt* stmt;
int j;
+ nullpo_ret(msg);
// build message save query
StrBuf->Init(&buf);
StrBuf->Printf(&buf, "INSERT INTO `%s` (`send_name`, `send_id`, `dest_name`, `dest_id`, `title`, `message`, `time`, `status`, `zeny`, `amount`, `nameid`, `refine`, `attribute`, `identify`, `unique_id`", mail_db);
@@ -151,6 +154,7 @@ static bool inter_mail_loadmessage(int mail_id, struct mail_message* msg)
{
int j;
StringBuf buf;
+ nullpo_ret(msg);
memset(msg, 0, sizeof(struct mail_message)); // Initialize data
StrBuf->Init(&buf);
@@ -203,6 +207,7 @@ static bool inter_mail_loadmessage(int mail_id, struct mail_message* msg)
void mapif_mail_sendinbox(int fd, int char_id, unsigned char flag, struct mail_data *md)
{
+ nullpo_retv(md);
//FIXME: dumping the whole structure like this is unsafe [ultramage]
WFIFOHEAD(fd, sizeof(struct mail_data) + 9);
WFIFOW(fd,0) = 0x3848;
@@ -263,6 +268,7 @@ static bool inter_mail_DeleteAttach(int mail_id)
void mapif_mail_sendattach(int fd, int char_id, struct mail_message *msg)
{
+ nullpo_retv(msg);
WFIFOHEAD(fd, sizeof(struct item) + 12);
WFIFOW(fd,0) = 0x384a;
WFIFOW(fd,2) = sizeof(struct item) + 12;
@@ -402,6 +408,7 @@ void mapif_mail_send(int fd, struct mail_message* msg)
{
int len = sizeof(struct mail_message) + 4;
+ nullpo_retv(msg);
WFIFOHEAD(fd,len);
WFIFOW(fd,0) = 0x384d;
WFIFOW(fd,2) = len;
@@ -449,6 +456,11 @@ void mapif_parse_mail_send(int fd)
void inter_mail_sendmail(int send_id, const char* send_name, int dest_id, const char* dest_name, const char* title, const char* body, int zeny, struct item *item)
{
struct mail_message msg;
+ nullpo_retv(send_name);
+ nullpo_retv(dest_name);
+ nullpo_retv(title);
+ nullpo_retv(body);
+ nullpo_retv(item);
memset(&msg, 0, sizeof(struct mail_message));
msg.send_id = send_id;
diff --git a/src/char/int_mercenary.c b/src/char/int_mercenary.c
index 2bd94b97e..3321627c0 100644
--- a/src/char/int_mercenary.c
+++ b/src/char/int_mercenary.c
@@ -15,6 +15,7 @@
#include "mapif.h"
#include "../common/malloc.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/sql.h"
@@ -27,6 +28,7 @@ bool inter_mercenary_owner_fromsql(int char_id, struct mmo_charstatus *status)
{
char* data;
+ nullpo_ret(status);
if( SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `merc_id`, `arch_calls`, `arch_faith`, `spear_calls`, `spear_faith`, `sword_calls`, `sword_faith` FROM `%s` WHERE `char_id` = '%d'", mercenary_owner_db, char_id) )
{
Sql_ShowDebug(inter->sql_handle);
@@ -53,6 +55,7 @@ bool inter_mercenary_owner_fromsql(int char_id, struct mmo_charstatus *status)
bool inter_mercenary_owner_tosql(int char_id, struct mmo_charstatus *status)
{
+ nullpo_ret(status);
if( SQL_ERROR == SQL->Query(inter->sql_handle, "REPLACE INTO `%s` (`char_id`, `merc_id`, `arch_calls`, `arch_faith`, `spear_calls`, `spear_faith`, `sword_calls`, `sword_faith`) VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
mercenary_owner_db, char_id, status->mer_id, status->arch_calls, status->arch_faith, status->spear_calls, status->spear_faith, status->sword_calls, status->sword_faith) )
{
@@ -78,6 +81,7 @@ bool mapif_mercenary_save(struct s_mercenary* merc)
{
bool flag = true;
+ nullpo_ret(merc);
if( merc->mercenary_id == 0 )
{ // Create new DB entry
if( SQL_ERROR == SQL->Query(inter->sql_handle,
@@ -105,6 +109,7 @@ bool mapif_mercenary_load(int merc_id, int char_id, struct s_mercenary *merc)
{
char* data;
+ nullpo_ret(merc);
memset(merc, 0, sizeof(struct s_mercenary));
merc->mercenary_id = merc_id;
merc->char_id = char_id;
@@ -148,6 +153,7 @@ void mapif_mercenary_send(int fd, struct s_mercenary *merc, unsigned char flag)
{
int size = sizeof(struct s_mercenary) + 5;
+ nullpo_retv(merc);
WFIFOHEAD(fd,size);
WFIFOW(fd,0) = 0x3870;
WFIFOW(fd,2) = size;
diff --git a/src/char/int_party.c b/src/char/int_party.c
index bf950ec42..79bd1139c 100644
--- a/src/char/int_party.c
+++ b/src/char/int_party.c
@@ -18,6 +18,7 @@
#include "../common/malloc.h"
#include "../common/mapindex.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/sql.h"
@@ -29,6 +30,7 @@ struct inter_party_interface inter_party_s;
static int inter_party_check_lv(struct party_data *p) {
int i;
unsigned int lv;
+ nullpo_ret(p);
p->min_lv = UINT_MAX;
p->max_lv = 0;
for(i=0;i<MAX_PARTY;i++){
@@ -54,6 +56,7 @@ static int inter_party_check_lv(struct party_data *p) {
static void inter_party_calc_state(struct party_data *p)
{
int i;
+ nullpo_retv(p);
p->min_lv = UINT_MAX;
p->max_lv = 0;
p->party.count =
@@ -109,6 +112,7 @@ int inter_party_tosql(struct party *p, int flag, int index)
if( p == NULL || p->party_id == 0 )
return 0;
+ Assert_ret(index >= 0 && index < MAX_PARTY);
party_id = p->party_id;
#ifdef NOISY
@@ -295,6 +299,7 @@ struct party_data* inter_party_search_partyname(const char *const str)
// Returns whether this party can keep having exp share or not.
int inter_party_check_exp_share(struct party_data *const p)
{
+ nullpo_ret(p);
return (p->party.count < 2 || p->max_lv - p->min_lv <= party_share_level);
}
@@ -318,6 +323,7 @@ int inter_party_check_empty(struct party_data *p)
// Create a party whether or not
int mapif_party_created(int fd, int account_id, int char_id, struct party *p)
{
+ nullpo_ret(p);
WFIFOHEAD(fd, 39);
WFIFOW(fd,0)=0x3820;
WFIFOL(fd,2)=account_id;
@@ -353,6 +359,7 @@ void mapif_party_noinfo(int fd, int party_id, int char_id)
void mapif_party_info(int fd, struct party* p, int char_id)
{
unsigned char buf[8 + sizeof(struct party)];
+ nullpo_retv(p);
WBUFW(buf,0) = 0x3821;
WBUFW(buf,2) = 8 + sizeof(struct party);
WBUFL(buf,4) = char_id;
@@ -381,6 +388,7 @@ int mapif_party_memberadded(int fd, int party_id, int account_id, int char_id, i
int mapif_party_optionchanged(int fd, struct party *p, int account_id, int flag)
{
unsigned char buf[16];
+ nullpo_ret(p);
WBUFW(buf,0)=0x3823;
WBUFL(buf,2)=p->party_id;
WBUFL(buf,6)=account_id;
@@ -411,6 +419,8 @@ int mapif_party_membermoved(struct party *p, int idx)
{
unsigned char buf[20];
+ nullpo_ret(p);
+ Assert_ret(idx >= 0 && idx < MAX_PARTY);
WBUFW(buf,0) = 0x3825;
WBUFL(buf,2) = p->party_id;
WBUFL(buf,6) = p->member[idx].account_id;
@@ -438,6 +448,7 @@ int mapif_party_broken(int party_id, int flag)
int mapif_party_message(int party_id, int account_id, char *mes, int len, int sfd)
{
unsigned char buf[512];
+ nullpo_ret(mes);
WBUFW(buf,0)=0x3827;
WBUFW(buf,2)=len+12;
WBUFL(buf,4)=party_id;
@@ -456,6 +467,8 @@ int mapif_parse_CreateParty(int fd, char *name, int item, int item2, struct part
{
struct party_data *p;
int i;
+ nullpo_ret(name);
+ nullpo_ret(leader);
if( (p=inter_party->search_partyname(name))!=NULL){
mapif->party_created(fd,leader->account_id,leader->char_id,NULL);
return 0;
@@ -523,6 +536,7 @@ int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member
struct party_data *p;
int i;
+ nullpo_ret(member);
p = inter_party->fromsql(party_id);
if( p == NULL || p->size == MAX_PARTY ) {
mapif->party_memberadded(fd, party_id, member->account_id, member->char_id, 1);
diff --git a/src/char/int_pet.c b/src/char/int_pet.c
index b37037844..b01777771 100644
--- a/src/char/int_pet.c
+++ b/src/char/int_pet.c
@@ -15,6 +15,7 @@
#include "mapif.h"
#include "../common/malloc.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/sql.h"
@@ -29,6 +30,7 @@ int inter_pet_tosql(int pet_id, struct s_pet* p)
//`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incubate`)
char esc_name[NAME_LENGTH*2+1];// escaped pet name
+ nullpo_ret(p);
SQL->EscapeStringLen(inter->sql_handle, esc_name, p->name, strnlen(p->name, NAME_LENGTH));
p->hungry = cap_value(p->hungry, 0, 100);
p->intimate = cap_value(p->intimate, 0, 1000);
@@ -70,6 +72,7 @@ int inter_pet_fromsql(int pet_id, struct s_pet* p)
#ifdef NOISY
ShowInfo("Loading pet (%d)...\n",pet_id);
#endif
+ nullpo_ret(p);
memset(p, 0, sizeof(struct s_pet));
//`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incubate`)
@@ -145,6 +148,7 @@ int mapif_pet_created(int fd, int account_id, struct s_pet *p)
int mapif_pet_info(int fd, int account_id, struct s_pet *p)
{
+ nullpo_ret(p);
WFIFOHEAD(fd, sizeof(struct s_pet) + 9);
WFIFOW(fd, 0) =0x3881;
WFIFOW(fd, 2) =sizeof(struct s_pet) + 9;
@@ -193,6 +197,7 @@ int mapif_delete_pet_ack(int fd, int flag)
int mapif_create_pet(int fd, int account_id, int char_id, short pet_class, short pet_lv, short pet_egg_id,
short pet_equip, short intimate, short hungry, char rename_flag, char incubate, char *pet_name)
{
+ nullpo_ret(pet_name);
memset(inter_pet->pt, 0, sizeof(struct s_pet));
safestrncpy(inter_pet->pt->name, pet_name, NAME_LENGTH);
if(incubate == 1)
@@ -254,6 +259,7 @@ int mapif_save_pet(int fd, int account_id, struct s_pet *data)
{
//here process pet save request.
int len;
+ nullpo_ret(data);
RFIFOHEAD(fd);
len=RFIFOW(fd, 2);
if (sizeof(struct s_pet) != len-8) {
diff --git a/src/char/int_quest.c b/src/char/int_quest.c
index dd3d4e1bf..036229edd 100644
--- a/src/char/int_quest.c
+++ b/src/char/int_quest.c
@@ -16,6 +16,7 @@
#include "../common/db.h"
#include "../common/malloc.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/sql.h"
@@ -66,8 +67,9 @@ struct quest *mapif_quests_fromsql(int char_id, int *count)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &tmp_quest.quest_id, 0, NULL, NULL)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 1, SQLDT_INT, &tmp_quest.state, 0, NULL, NULL)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 2, SQLDT_UINT, &tmp_quest.time, 0, NULL, NULL)
- )
+ ) {
sqlerror = SQL_ERROR;
+ }
StrBuf->Destroy(&buf);
@@ -249,8 +251,10 @@ void mapif_send_quests(int fd, int char_id, struct quest *tmp_questlog, int num_
WFIFOW(fd,2) = num_quests*sizeof(struct quest)+8;
WFIFOL(fd,4) = char_id;
- if (num_quests > 0)
+ if (num_quests > 0) {
+ nullpo_retv(tmp_questlog);
memcpy(WFIFOP(fd,8), tmp_questlog, sizeof(struct quest)*num_quests);
+ }
WFIFOSET(fd,num_quests*sizeof(struct quest)+8);
}
diff --git a/src/char/int_storage.c b/src/char/int_storage.c
index db49eb46e..7afafc406 100644
--- a/src/char/int_storage.c
+++ b/src/char/int_storage.c
@@ -16,6 +16,7 @@
#include "mapif.h"
#include "../common/malloc.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/sql.h"
@@ -28,6 +29,7 @@ struct inter_storage_interface inter_storage_s;
/// Save storage data to sql
int inter_storage_tosql(int account_id, struct storage_data* p)
{
+ nullpo_ret(p);
chr->memitemdata_to_sql(p->items, MAX_STORAGE, account_id, TABLE_STORAGE);
return 0;
}
@@ -40,6 +42,7 @@ int inter_storage_fromsql(int account_id, struct storage_data* p)
int i;
int j;
+ nullpo_ret(p);
memset(p, 0, sizeof(struct storage_data)); //clean up memory
p->storage_amount = 0;
@@ -82,6 +85,7 @@ int inter_storage_fromsql(int account_id, struct storage_data* p)
/// Save guild_storage data to sql
int inter_storage_guild_storage_tosql(int guild_id, struct guild_storage* p)
{
+ nullpo_ret(p);
chr->memitemdata_to_sql(p->items, MAX_GUILD_STORAGE, guild_id, TABLE_GUILD_STORAGE);
ShowInfo ("guild storage save to DB - guild: %d\n", guild_id);
return 0;
@@ -95,6 +99,7 @@ int inter_storage_guild_storage_fromsql(int guild_id, struct guild_storage* p)
int i;
int j;
+ nullpo_ret(p);
memset(p, 0, sizeof(struct guild_storage)); //clean up memory
p->storage_amount = 0;
p->guild_id = guild_id;
@@ -297,7 +302,8 @@ int mapif_parse_ItemBoundRetrieve_sub(int fd)
for( j = 0; j < MAX_SLOTS; ++j )
SQL->StmtBindColumn(stmt, 10+j, SQLDT_SHORT, &item.card[j], 0, NULL, NULL);
- while( SQL_SUCCESS == SQL->StmtNextRow(stmt) ) {
+ while( SQL_SUCCESS == SQL->StmtNextRow(stmt)) {
+ Assert_retb(i >= MAX_INVENTORY);
memcpy(&items[i],&item,sizeof(struct item));
i++;
}
diff --git a/src/char/inter.c b/src/char/inter.c
index eb14f1593..ec06df0f9 100644
--- a/src/char/inter.c
+++ b/src/char/inter.c
@@ -27,6 +27,7 @@
#include "../common/db.h"
#include "../common/malloc.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/strlib.h"
@@ -97,6 +98,7 @@ bool inter_msg_config_read(const char *cfg_name, bool allow_override)
FILE *fp;
static int called = 1;
+ nullpo_ret(cfg_name);
if ((fp = fopen(cfg_name, "r")) == NULL) {
ShowError("Messages file not found: %s\n", cfg_name);
return 1;
@@ -384,6 +386,7 @@ void inter_vmsg_to_fd(int fd, int u_fd, int aid, char* msg, va_list ap)
va_list apcopy;
int len = 1;/* yes we start at 1 */
+ nullpo_retv(msg);
va_copy(apcopy, ap);
len += vsnprintf(msg_out, 512, msg, apcopy);
va_end(apcopy);
@@ -484,6 +487,12 @@ void mapif_parse_accinfo2(bool success, int map_fd, int u_fd, int u_aid, int acc
const char *email, const char *last_ip, const char *lastlogin, const char *pin_code, const char *birthdate,
int group_id, int logincount, int state)
{
+ nullpo_retv(userid);
+ nullpo_retv(user_pass);
+ nullpo_retv(email);
+ nullpo_retv(last_ip);
+ nullpo_retv(lastlogin);
+ nullpo_retv(birthdate);
if (map_fd <= 0 || !session_isActive(map_fd))
return; // check if we have a valid fd
@@ -546,6 +555,7 @@ void mapif_parse_accinfo2(bool success, int map_fd, int u_fd, int u_aid, int acc
**/
void inter_savereg(int account_id, int char_id, const char *key, unsigned int index, intptr_t val, bool is_string)
{
+ nullpo_retv(key);
/* to login server we go! */
if( key[0] == '#' && key[1] == '#' ) {/* global account reg */
if( session_isValid(chr->login_fd) )
@@ -769,6 +779,7 @@ static int inter_config_read(const char* cfgName)
char line[1024], w1[1024], w2[1024];
FILE* fp;
+ nullpo_retr(1, cfgName);
fp = fopen(cfgName, "r");
if(fp == NULL) {
ShowError("File not found: %s\n", cfgName);
@@ -916,6 +927,8 @@ int mapif_broadcast(unsigned char *mes, int len, unsigned int fontColor, short f
{
unsigned char *buf = (unsigned char*)aMalloc((len)*sizeof(unsigned char));
+ nullpo_ret(mes);
+ Assert_ret(len >= 16);
WBUFW(buf,0) = 0x3800;
WBUFW(buf,2) = len;
WBUFL(buf,4) = fontColor;
@@ -934,8 +947,12 @@ int mapif_broadcast(unsigned char *mes, int len, unsigned int fontColor, short f
int mapif_wis_message(struct WisData *wd)
{
unsigned char buf[2048];
+ nullpo_ret(wd);
//if (wd->len > 2047-56) wd->len = 2047-56; //Force it to fit to avoid crashes. [Skotlex]
- if( wd->len >= sizeof(wd->msg) - 1 ) wd->len = sizeof(wd->msg) - 1;
+ if (wd->len < 0)
+ wd->len = 0;
+ if (wd->len >= sizeof(wd->msg) - 1)
+ wd->len = sizeof(wd->msg) - 1;
WBUFW(buf, 0) = 0x3801;
WBUFW(buf, 2) = 56 +wd->len;
@@ -951,6 +968,7 @@ int mapif_wis_message(struct WisData *wd)
void mapif_wis_response(int fd, unsigned char *src, int flag)
{
unsigned char buf[27];
+ nullpo_retv(src);
WBUFW(buf, 0)=0x3802;
memcpy(WBUFP(buf, 2),src,24);
WBUFB(buf,26)=flag;
@@ -960,6 +978,7 @@ void mapif_wis_response(int fd, unsigned char *src, int flag)
// Wis sending result
int mapif_wis_end(struct WisData *wd, int flag)
{
+ nullpo_ret(wd);
mapif->wis_response(wd->fd, wd->src, flag);
return 0;
}
@@ -968,6 +987,7 @@ int mapif_wis_end(struct WisData *wd, int flag)
// Account registry transfer to map-server
static void mapif_account_reg(int fd, unsigned char *src)
{
+ nullpo_retv(src);
WBUFW(src,0)=0x3804; //NOTE: writing to RFIFO
mapif->sendallwos(fd, src, WBUFW(src,2));
}
@@ -1005,6 +1025,7 @@ int inter_check_ttl_wisdata_sub(DBKey key, DBData *data, va_list ap)
{
int64 tick;
struct WisData *wd = DB->data2ptr(data);
+ nullpo_ret(wd);
tick = va_arg(ap, int64);
if (DIFF_TICK(tick, wd->tick) > WISDATA_TTL && wis_delnum < WISDELLIST_MAX)
@@ -1208,6 +1229,7 @@ int mapif_parse_RegistryRequest(int fd)
void mapif_namechange_ack(int fd, int account_id, int char_id, int type, int flag, const char *const name)
{
+ nullpo_retv(name);
WFIFOHEAD(fd, NAME_LENGTH+13);
WFIFOW(fd, 0) = 0x3806;
WFIFOL(fd, 2) = account_id;
diff --git a/src/char/loginif.c b/src/char/loginif.c
index 5247e6c3e..f53d9bb71 100644
--- a/src/char/loginif.c
+++ b/src/char/loginif.c
@@ -14,6 +14,7 @@
#include "../common/cbasetypes.h"
#include "../common/core.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/timer.h"
@@ -88,6 +89,7 @@ void do_final_loginif(void)
void loginif_block_account(int account_id, int flag)
{
+ Assert_retv(chr->login_fd != -1);
WFIFOHEAD(chr->login_fd,10);
WFIFOW(chr->login_fd,0) = 0x2724;
WFIFOL(chr->login_fd,2) = account_id;
@@ -97,6 +99,7 @@ void loginif_block_account(int account_id, int flag)
void loginif_ban_account(int account_id, short year, short month, short day, short hour, short minute, short second)
{
+ Assert_retv(chr->login_fd != -1);
WFIFOHEAD(chr->login_fd,18);
WFIFOW(chr->login_fd, 0) = 0x2725;
WFIFOL(chr->login_fd, 2) = account_id;
@@ -111,6 +114,7 @@ void loginif_ban_account(int account_id, short year, short month, short day, sho
void loginif_unban_account(int account_id)
{
+ Assert_retv(chr->login_fd != -1);
WFIFOHEAD(chr->login_fd,6);
WFIFOW(chr->login_fd,0) = 0x272a;
WFIFOL(chr->login_fd,2) = account_id;
@@ -119,6 +123,7 @@ void loginif_unban_account(int account_id)
void loginif_changesex(int account_id)
{
+ Assert_retv(chr->login_fd != -1);
WFIFOHEAD(chr->login_fd,6);
WFIFOW(chr->login_fd,0) = 0x2727;
WFIFOL(chr->login_fd,2) = account_id;
@@ -127,6 +132,8 @@ void loginif_changesex(int account_id)
void loginif_auth(int fd, struct char_session_data* sd, uint32 ipl)
{
+ Assert_retv(chr->login_fd != -1);
+ nullpo_retv(sd);
WFIFOHEAD(chr->login_fd,23);
WFIFOW(chr->login_fd,0) = 0x2712; // ask login-server to authenticate an account
WFIFOL(chr->login_fd,2) = sd->account_id;
@@ -140,6 +147,7 @@ void loginif_auth(int fd, struct char_session_data* sd, uint32 ipl)
void loginif_send_users_count(int users)
{
+ Assert_retv(chr->login_fd != -1);
WFIFOHEAD(chr->login_fd,6);
WFIFOW(chr->login_fd,0) = 0x2714;
WFIFOL(chr->login_fd,2) = users;
@@ -148,6 +156,7 @@ void loginif_send_users_count(int users)
void loginif_connect_to_server(void)
{
+ Assert_retv(chr->login_fd != -1);
WFIFOHEAD(chr->login_fd,86);
WFIFOW(chr->login_fd,0) = 0x2710;
memcpy(WFIFOP(chr->login_fd,2), chr->userid, NAME_LENGTH);
diff --git a/src/char/pincode.c b/src/char/pincode.c
index b8b30a1b8..c3d2b2298 100644
--- a/src/char/pincode.c
+++ b/src/char/pincode.c
@@ -11,6 +11,7 @@
#include "char.h"
#include "../common/cbasetypes.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/random.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
@@ -18,9 +19,10 @@
struct pincode_interface pincode_s;
-void pincode_handle ( int fd, struct char_session_data* sd ) {
+void pincode_handle (int fd, struct char_session_data* sd) {
struct online_char_data* character = (struct online_char_data*)idb_get(chr->online_char_db, sd->account_id);
+ nullpo_retv(sd);
if( character && character->pincode_enable > pincode->charselect ){
character->pincode_enable = pincode->charselect * 2;
}else{
@@ -44,6 +46,7 @@ void pincode_handle ( int fd, struct char_session_data* sd ) {
void pincode_check(int fd, struct char_session_data* sd) {
char pin[5] = "\0\0\0\0";
+ nullpo_retv(sd);
safestrncpy(pin, (char*)RFIFOP(fd, 6), sizeof(pin));
pincode->decrypt(sd->pincode_seed, pin);
if( pincode->compare( fd, sd, pin ) ){
@@ -55,6 +58,8 @@ void pincode_check(int fd, struct char_session_data* sd) {
}
int pincode_compare(int fd, struct char_session_data* sd, char* pin) {
+ nullpo_ret(sd);
+ nullpo_ret(pin);
if( strcmp( sd->pincode, pin ) == 0 ){
sd->pincode_try = 0;
return 1;
@@ -70,6 +75,7 @@ int pincode_compare(int fd, struct char_session_data* sd, char* pin) {
void pincode_change(int fd, struct char_session_data* sd) {
char oldpin[5] = "\0\0\0\0", newpin[5] = "\0\0\0\0";
+ nullpo_retv(sd);
safestrncpy(oldpin, (char*)RFIFOP(fd,6), sizeof(oldpin));
pincode->decrypt(sd->pincode_seed,oldpin);
if( !pincode->compare( fd, sd, oldpin ) )
@@ -85,6 +91,7 @@ void pincode_change(int fd, struct char_session_data* sd) {
void pincode_setnew(int fd, struct char_session_data* sd) {
char newpin[5] = "\0\0\0\0";
+ nullpo_retv(sd);
safestrncpy(newpin, (char*)RFIFOP(fd,6), sizeof(newpin));
pincode->decrypt(sd->pincode_seed,newpin);
pincode->update( sd->account_id, newpin );
@@ -102,6 +109,7 @@ void pincode_setnew(int fd, struct char_session_data* sd) {
// 7 = char select window shows a button - client sends 0x8c5
// 8 = pincode was incorrect
void pincode_sendstate(int fd, struct char_session_data* sd, uint16 state) {
+ nullpo_retv(sd);
WFIFOHEAD(fd, 12);
WFIFOW(fd, 0) = 0x8b9;
WFIFOL(fd, 2) = sd->pincode_seed = rnd() % 0xFFFF;
@@ -111,6 +119,8 @@ void pincode_sendstate(int fd, struct char_session_data* sd, uint16 state) {
}
void pincode_notifyLoginPinUpdate(int account_id, char* pin) {
+ nullpo_retv(pin);
+ Assert_retv(chr->login_fd != -1);
WFIFOHEAD(chr->login_fd,11);
WFIFOW(chr->login_fd,0) = 0x2738;
WFIFOL(chr->login_fd,2) = account_id;
@@ -129,6 +139,7 @@ void pincode_decrypt(unsigned int userSeed, char* pin) {
int i;
char tab[10] = {0,1,2,3,4,5,6,7,8,9};
+ nullpo_retv(pin);
for (i = 1; i < 10; i++) {
int pos;
userSeed = pincode->baseSeed + userSeed * pincode->multiplier;
@@ -149,6 +160,8 @@ void pincode_decrypt(unsigned int userSeed, char* pin) {
bool pincode_config_read(char *w1, char *w2) {
+ nullpo_ret(w1);
+ nullpo_ret(w2);
while ( true ) {
if ( strcmpi(w1, "pincode_enabled") == 0 ) {
pincode->enabled = atoi(w2);
diff --git a/src/login/account_sql.c b/src/login/account_sql.c
index f745d3d13..8975250b8 100644
--- a/src/login/account_sql.c
+++ b/src/login/account_sql.c
@@ -13,6 +13,7 @@
#include "../common/console.h"
#include "../common/malloc.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
#include "../common/sql.h"
@@ -136,6 +137,7 @@ static bool account_db_sql_init(AccountDB* self)
const char* database;
const char* codepage;
+ nullpo_ret(db);
db->accounts = SQL->Malloc();
sql_handle = db->accounts;
@@ -181,6 +183,7 @@ static void account_db_sql_destroy(AccountDB* self)
{
AccountDB_SQL* db = (AccountDB_SQL*)self;
+ nullpo_retv(db);
SQL->Free(db->accounts);
db->accounts = NULL;
aFree(db);
@@ -192,6 +195,9 @@ static bool account_db_sql_get_property(AccountDB* self, const char* key, char*
AccountDB_SQL* db = (AccountDB_SQL*)self;
const char* signature;
+ nullpo_ret(db);
+ nullpo_ret(key);
+ nullpo_ret(buf);
signature = "engine.";
if( strncmpi(key, signature, strlen(signature)) == 0 )
{
@@ -282,7 +288,9 @@ static bool account_db_sql_set_property(AccountDB* self, const char* key, const
AccountDB_SQL* db = (AccountDB_SQL*)self;
const char* signature;
-
+ nullpo_ret(db);
+ nullpo_ret(key);
+ nullpo_ret(value);
signature = "sql.";
if( strncmp(key, signature, strlen(signature)) == 0 )
{
@@ -360,6 +368,8 @@ static bool account_db_sql_create(AccountDB* self, struct mmo_account* acc)
// decide on the account id to assign
int account_id;
+ nullpo_ret(db);
+ nullpo_ret(acc);
if( acc->account_id != -1 )
{// caller specifies it manually
account_id = acc->account_id;
@@ -410,6 +420,7 @@ static bool account_db_sql_remove(AccountDB* self, const int account_id)
Sql* sql_handle = db->accounts;
bool result = false;
+ nullpo_ret(db);
if( SQL_SUCCESS != SQL->QueryStr(sql_handle, "START TRANSACTION")
|| SQL_SUCCESS != SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = %d", db->account_db, account_id)
|| SQL_SUCCESS != SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = %d", db->global_acc_reg_num_db, account_id)
@@ -442,11 +453,13 @@ static bool account_db_sql_load_num(AccountDB* self, struct mmo_account* acc, co
static bool account_db_sql_load_str(AccountDB* self, struct mmo_account* acc, const char* userid)
{
AccountDB_SQL* db = (AccountDB_SQL*)self;
- Sql* sql_handle = db->accounts;
+ Sql* sql_handle;
char esc_userid[2*NAME_LENGTH+1];
int account_id;
char* data;
+ nullpo_ret(db);
+ sql_handle = db->accounts;
SQL->EscapeString(sql_handle, esc_userid, userid);
// get the list of account IDs for this user ID
@@ -481,8 +494,10 @@ static bool account_db_sql_load_str(AccountDB* self, struct mmo_account* acc, co
static AccountDBIterator* account_db_sql_iterator(AccountDB* self)
{
AccountDB_SQL* db = (AccountDB_SQL*)self;
- AccountDBIterator_SQL* iter = (AccountDBIterator_SQL*)aCalloc(1, sizeof(AccountDBIterator_SQL));
+ AccountDBIterator_SQL* iter;
+ nullpo_retr(NULL, db);
+ iter = (AccountDBIterator_SQL*)aCalloc(1, sizeof(AccountDBIterator_SQL));
// set up the vtable
iter->vtable.destroy = &account_db_sql_iter_destroy;
iter->vtable.next = &account_db_sql_iter_next;
@@ -507,10 +522,14 @@ static void account_db_sql_iter_destroy(AccountDBIterator* self)
static bool account_db_sql_iter_next(AccountDBIterator* self, struct mmo_account* acc)
{
AccountDBIterator_SQL* iter = (AccountDBIterator_SQL*)self;
- AccountDB_SQL* db = (AccountDB_SQL*)iter->db;
- Sql* sql_handle = db->accounts;
+ AccountDB_SQL* db;
+ Sql* sql_handle;
char* data;
+ nullpo_ret(iter);
+ db = (AccountDB_SQL*)iter->db;
+ nullpo_ret(db);
+ sql_handle = db->accounts;
// get next account ID
if( SQL_ERROR == SQL->Query(sql_handle, "SELECT `account_id` FROM `%s` WHERE `account_id` > '%d' ORDER BY `account_id` ASC LIMIT 1",
db->account_db, iter->last_account_id) )
@@ -539,9 +558,12 @@ static bool account_db_sql_iter_next(AccountDBIterator* self, struct mmo_account
static bool mmo_auth_fromsql(AccountDB_SQL* db, struct mmo_account* acc, int account_id)
{
- Sql* sql_handle = db->accounts;
+ Sql* sql_handle;
char* data;
+ nullpo_ret(db);
+ nullpo_ret(acc);
+ sql_handle = db->accounts;
// retrieve login entry for the specified account
if( SQL_ERROR == SQL->Query(sql_handle,
"SELECT `account_id`,`userid`,`user_pass`,`sex`,`email`,`group_id`,`state`,`unban_time`,`expiration_time`,`logincount`,`lastlogin`,`last_ip`,`birthdate`,`character_slots`,`pincode`,`pincode_change` FROM `%s` WHERE `account_id` = %d",
@@ -581,10 +603,14 @@ static bool mmo_auth_fromsql(AccountDB_SQL* db, struct mmo_account* acc, int acc
static bool mmo_auth_tosql(AccountDB_SQL* db, const struct mmo_account* acc, bool is_new)
{
- Sql* sql_handle = db->accounts;
- SqlStmt* stmt = SQL->StmtMalloc(sql_handle);
+ Sql* sql_handle;
+ SqlStmt* stmt;
bool result = false;
+ nullpo_ret(db);
+ sql_handle = db->accounts;
+ stmt = SQL->StmtMalloc(sql_handle);
+
// try
do
{
@@ -666,6 +692,7 @@ void mmo_save_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
AccountDB_SQL* db = (AccountDB_SQL*)self;
int count = RFIFOW(fd, 12);
+ nullpo_retv(db);
if (count) {
int cursor = 14, i;
char key[32], sval[254];
@@ -709,12 +736,14 @@ void mmo_save_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
}
void mmo_send_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
- Sql* sql_handle = ((AccountDB_SQL*)self)->accounts;
+ Sql* sql_handle;
AccountDB_SQL* db = (AccountDB_SQL*)self;
char* data;
int plen = 0;
size_t len;
+ nullpo_retv(db);
+ sql_handle = ((AccountDB_SQL*)self)->accounts;
if( SQL_ERROR == SQL->Query(sql_handle, "SELECT `key`, `index`, `value` FROM `%s` WHERE `account_id`='%d'", db->global_acc_reg_str_db, account_id) )
Sql_ShowDebug(sql_handle);
diff --git a/src/login/ipban_sql.c b/src/login/ipban_sql.c
index bfc90ad11..f995450ce 100644
--- a/src/login/ipban_sql.c
+++ b/src/login/ipban_sql.c
@@ -14,6 +14,7 @@
#include "../common/cbasetypes.h"
#include "../common/db.h"
#include "../common/malloc.h"
+#include "../common/nullpo.h"
#include "../common/sql.h"
#include "../common/socket.h"
#include "../common/strlib.h"
@@ -118,6 +119,8 @@ bool ipban_config_read(const char* key, const char* value)
{
const char* signature;
+ nullpo_ret(key);
+ nullpo_ret(value);
if( ipban_inited )
return false;// settings can only be changed before init
@@ -220,8 +223,8 @@ bool ipban_check(uint32 ip)
return true;
}
- if( SQL_ERROR == SQL->NextRow(sql_handle) )
- return true;// Shouldn't happen, but just in case...
+ if( SQL_SUCCESS != SQL->NextRow(sql_handle) )
+ return false;
SQL->GetData(sql_handle, 0, &data, NULL);
matches = atoi(data);
@@ -244,9 +247,11 @@ void ipban_log(uint32 ip)
if( failures >= login_config.dynamic_pass_failure_ban_limit )
{
uint8* p = (uint8*)&ip;
- if( SQL_ERROR == SQL->Query(sql_handle, "INSERT INTO `%s`(`list`,`btime`,`rtime`,`reason`) VALUES ('%u.%u.%u.*', NOW() , NOW() + INTERVAL %d MINUTE ,'Password error ban')",
- ipban_table, p[3], p[2], p[1], login_config.dynamic_pass_failure_ban_duration) )
+ if (SQL_ERROR == SQL->Query(sql_handle, "INSERT INTO `%s`(`list`,`btime`,`rtime`,`reason`) VALUES ('%u.%u.%u.*', NOW() , NOW() + INTERVAL %d MINUTE ,'Password error ban')",
+ ipban_table, p[3], p[2], p[1], login_config.dynamic_pass_failure_ban_duration))
+ {
Sql_ShowDebug(sql_handle);
+ }
}
}
diff --git a/src/login/login.c b/src/login/login.c
index 846f24027..95cbab70d 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -19,6 +19,7 @@
#include "../common/db.h"
#include "../common/malloc.h"
#include "../common/md5calc.h"
+#include "../common/nullpo.h"
#include "../common/random.h"
#include "../common/showmsg.h"
#include "../common/socket.h"
@@ -98,6 +99,7 @@ static int login_online_db_setoffline(DBKey key, DBData *data, va_list ap)
{
struct online_login_data* p = DB->data2ptr(data);
int server_id = va_arg(ap, int);
+ nullpo_ret(p);
if( server_id == -1 )
{
p->char_server = -1;
@@ -118,6 +120,7 @@ static int login_online_db_setoffline(DBKey key, DBData *data, va_list ap)
static int login_online_data_cleanup_sub(DBKey key, DBData *data, va_list ap)
{
struct online_login_data *character= DB->data2ptr(data);
+ nullpo_ret(character);
if (character->char_server == -2) //Unknown server.. set them offline
login->remove_online_user(character->account_id);
return 0;
@@ -136,6 +139,7 @@ int charif_sendallwos(int sfd, uint8* buf, size_t len)
{
int i, c;
+ nullpo_ret(buf);
for( i = 0, c = 0; i < ARRAYLENGTH(server); ++i )
{
int fd = server[i].fd;
@@ -155,6 +159,7 @@ int charif_sendallwos(int sfd, uint8* buf, size_t len)
/// Initializes a server structure.
void chrif_server_init(int id)
{
+ Assert_retv(id >= 0 && id < MAX_SERVERS);
memset(&server[id], 0, sizeof(server[id]));
server[id].fd = -1;
}
@@ -163,7 +168,8 @@ void chrif_server_init(int id)
/// Destroys a server structure.
void chrif_server_destroy(int id)
{
- if( server[id].fd != -1 )
+ Assert_retv(id >= 0 && id < MAX_SERVERS);
+ if (server[id].fd != -1)
{
do_close(server[id].fd);
server[id].fd = -1;
@@ -183,6 +189,7 @@ void chrif_server_reset(int id)
/// Called when the connection to Char Server is disconnected.
void chrif_on_disconnect(int id)
{
+ Assert_retv(id >= 0 && id < MAX_SERVERS);
ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
chrif_server_reset(id);
}
@@ -207,6 +214,9 @@ bool login_check_encrypted(const char* str1, const char* str2, const char* passw
{
char tmpstr[64+1], md5str[32+1];
+ nullpo_ret(str1);
+ nullpo_ret(str2);
+ nullpo_ret(passwd);
safesnprintf(tmpstr, sizeof(tmpstr), "%s%s", str1, str2);
MD5_String(tmpstr, md5str);
@@ -215,6 +225,8 @@ bool login_check_encrypted(const char* str1, const char* str2, const char* passw
bool login_check_password(const char* md5key, int passwdenc, const char* passwd, const char* refpass)
{
+ nullpo_ret(passwd);
+ nullpo_ret(refpass);
if(passwdenc == 0)
{
return (0==strcmp(passwd, refpass));
@@ -248,6 +260,7 @@ int login_lan_config_read(const char *lancfgName)
int line_num = 0;
char line[1024], w1[64], w2[64], w3[64], w4[64];
+ nullpo_ret(lancfgName);
if((fp = fopen(lancfgName, "r")) == NULL) {
ShowWarning("LAN Support configuration file is not found: %s\n", lancfgName);
return 1;
@@ -348,6 +361,7 @@ void login_fromchar_parse_auth(int fd, int id, const char *const ip)
}
else
{// authentication not found
+ nullpo_retv(ip);
ShowStatus("Char-server '%s': authentication of the account %d REFUSED (ip: %s).\n", server[id].name, account_id, ip);
login->fromchar_auth_ack(fd, account_id, login_id1, login_id2, sex, request_id, NULL);
}
@@ -1008,6 +1022,9 @@ int login_mmo_auth_new(const char* userid, const char* pass, const char sex, con
int64 tick = timer->gettick();
struct mmo_account acc;
+ nullpo_retr(3, userid);
+ nullpo_retr(3, pass);
+ nullpo_retr(3, last_ip);
//Account Registration Flood Protection by [Kevin]
if( new_reg_tick == 0 )
new_reg_tick = timer->gettick();
@@ -1065,6 +1082,7 @@ int login_mmo_auth(struct login_session_data* sd, bool isServer) {
size_t len;
char ip[16];
+ nullpo_ret(sd);
ip2str(session[sd->fd]->client_addr, ip);
// DNS Blacklist check
@@ -1206,6 +1224,7 @@ void login_connection_problem(int fd, uint8 status)
void login_kick(struct login_session_data* sd)
{
uint8 buf[6];
+ nullpo_retv(sd);
WBUFW(buf,0) = 0x2734;
WBUFL(buf,2) = sd->account_id;
charif_sendallwos(-1, buf, 6);
@@ -1214,13 +1233,15 @@ void login_kick(struct login_session_data* sd)
void login_auth_ok(struct login_session_data* sd)
{
int fd = sd->fd;
- uint32 ip = session[fd]->client_addr;
+ uint32 ip;
uint8 server_num, n;
uint32 subnet_char_ip;
struct login_auth_node* node;
int i;
+ nullpo_retv(sd);
+ ip = session[fd]->client_addr;
if( runflag != LOGINSERVER_ST_RUNNING )
{
// players can only login while running
@@ -1336,9 +1357,12 @@ void login_auth_ok(struct login_session_data* sd)
void login_auth_failed(struct login_session_data* sd, int result)
{
- int fd = sd->fd;
- uint32 ip = session[fd]->client_addr;
+ int fd;
+ uint32 ip;
+ nullpo_retv(sd);
+ fd = sd->fd;
+ ip = session[fd]->client_addr;
if (login_config.log_login)
{
const char* error;
@@ -1738,7 +1762,9 @@ void login_set_defaults()
int login_config_read(const char* cfgName)
{
char line[1024], w1[1024], w2[1024];
- FILE* fp = fopen(cfgName, "r");
+ FILE* fp;
+ nullpo_retr(1, cfgName);
+ fp = fopen(cfgName, "r");
if (fp == NULL) {
ShowError("Configuration file (%s) not found.\n", cfgName);
return 1;
diff --git a/src/login/loginlog_sql.c b/src/login/loginlog_sql.c
index 5654b4c5b..8ed6e395a 100644
--- a/src/login/loginlog_sql.c
+++ b/src/login/loginlog_sql.c
@@ -11,6 +11,7 @@
#include "../common/cbasetypes.h"
#include "../common/mmo.h"
+#include "../common/nullpo.h"
#include "../common/socket.h"
#include "../common/sql.h"
#include "../common/strlib.h"
@@ -67,6 +68,8 @@ void login_log(uint32 ip, const char* username, int rcode, const char* message)
char esc_message[255*2+1];
int retcode;
+ nullpo_retv(username);
+ nullpo_retv(message);
if( !enabled )
return;
@@ -137,6 +140,8 @@ bool loginlog_config_read(const char* key, const char* value)
{
const char* signature;
+ nullpo_ret(key);
+ nullpo_ret(value);
signature = "sql.";
if( strncmpi(key, signature, strlen(signature)) == 0 )
{
diff --git a/src/map/pc.c b/src/map/pc.c
index f28a4cfdd..0905df61b 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -4558,14 +4558,15 @@ int pc_useitem(struct map_session_data *sd,int n) {
amount = sd->status.inventory[n].amount;
item_script = sd->inventory_data[n]->script;
//Check if the item is to be consumed immediately [Skotlex]
- if( sd->inventory_data[n]->flag.delay_consume )
+ if (sd->inventory_data[n]->flag.delay_consume || sd->inventory_data[n]->flag.keepafteruse)
clif->useitemack(sd,n,amount,true);
else {
- if (sd->status.inventory[n].expire_time == 0 && !(sd->inventory_data[n]->flag.keepafteruse)) {
- clif->useitemack(sd,n,amount-1,true);
- pc->delitem(sd,n,1,1,0,LOG_TYPE_CONSUME); // Rental Usable Items are not deleted until expiration
- } else
- clif->useitemack(sd,n,0,false);
+ if (sd->status.inventory[n].expire_time == 0) {
+ clif->useitemack(sd, n, amount - 1, true);
+ pc->delitem(sd, n, 1, 1, 0, LOG_TYPE_CONSUME); // Rental Usable Items are not deleted until expiration
+ } else {
+ clif->useitemack(sd, n, 0, false);
+ }
}
if(sd->status.inventory[n].card[0]==CARD0_CREATE &&
pc->famerank(MakeDWord(sd->status.inventory[n].card[2],sd->status.inventory[n].card[3]), MAPID_ALCHEMIST))
@@ -5868,6 +5869,138 @@ const char* job_name(int class_)
}
}
+int pc_check_job_name(const char *name) {
+ int i, len;
+ struct {
+ const char *name;
+ int id;
+ } names[] = {
+ { "Novice", JOB_NOVICE },
+ { "Swordsman", JOB_SWORDMAN },
+ { "Magician", JOB_MAGE },
+ { "Archer", JOB_ARCHER },
+ { "Acolyte", JOB_ACOLYTE },
+ { "Merchant", JOB_MERCHANT },
+ { "Thief", JOB_THIEF },
+ { "Knight", JOB_KNIGHT },
+ { "Priest", JOB_PRIEST },
+ { "Wizard", JOB_WIZARD },
+ { "Blacksmith", JOB_BLACKSMITH },
+ { "Hunter", JOB_HUNTER },
+ { "Assassin", JOB_ASSASSIN },
+ { "Crusader", JOB_CRUSADER },
+ { "Monk", JOB_MONK },
+ { "Sage", JOB_SAGE },
+ { "Rogue", JOB_ROGUE },
+ { "Alchemist", JOB_ALCHEMIST },
+ { "Bard", JOB_BARD },
+ { "Dancer", JOB_DANCER },
+ { "Super_Novice", JOB_SUPER_NOVICE },
+ { "Gunslinger", JOB_GUNSLINGER },
+ { "Ninja", JOB_NINJA },
+ { "Novice_High", JOB_NOVICE_HIGH },
+ { "Swordsman_High", JOB_SWORDMAN_HIGH },
+ { "Magician_High", JOB_MAGE_HIGH },
+ { "Archer_High", JOB_ARCHER_HIGH },
+ { "Acolyte_High", JOB_ACOLYTE_HIGH },
+ { "Merchant_High", JOB_MERCHANT_HIGH },
+ { "Thief_High", JOB_THIEF_HIGH },
+ { "Lord_Knight", JOB_LORD_KNIGHT },
+ { "High_Priest", JOB_HIGH_PRIEST },
+ { "High_Wizard", JOB_HIGH_WIZARD },
+ { "Whitesmith", JOB_WHITESMITH },
+ { "Sniper", JOB_SNIPER },
+ { "Assassin_Cross", JOB_ASSASSIN_CROSS },
+ { "Paladin", JOB_PALADIN },
+ { "Champion", JOB_CHAMPION },
+ { "Professor", JOB_PROFESSOR },
+ { "Stalker", JOB_STALKER },
+ { "Creator", JOB_CREATOR },
+ { "Clown", JOB_CLOWN },
+ { "Gypsy", JOB_GYPSY },
+ { "Baby_Novice", JOB_BABY },
+ { "Baby_Swordsman", JOB_BABY_SWORDMAN },
+ { "Baby_Magician", JOB_BABY_MAGE },
+ { "Baby_Archer", JOB_BABY_ARCHER },
+ { "Baby_Acolyte", JOB_BABY_ACOLYTE },
+ { "Baby_Merchant", JOB_BABY_MERCHANT },
+ { "Baby_Thief", JOB_BABY_THIEF },
+ { "Baby_Knight", JOB_BABY_KNIGHT },
+ { "Baby_Priest", JOB_BABY_PRIEST },
+ { "Baby_Wizard", JOB_BABY_WIZARD },
+ { "Baby_Blacksmith", JOB_BABY_BLACKSMITH },
+ { "Baby_Hunter", JOB_BABY_HUNTER },
+ { "Baby_Assassin", JOB_BABY_ASSASSIN },
+ { "Baby_Crusader", JOB_BABY_CRUSADER },
+ { "Baby_Monk", JOB_BABY_MONK },
+ { "Baby_Sage", JOB_BABY_SAGE },
+ { "Baby_Rogue", JOB_BABY_ROGUE },
+ { "Baby_Alchemist", JOB_BABY_ALCHEMIST },
+ { "Baby_Bard", JOB_BABY_BARD },
+ { "Baby_Dancer", JOB_BABY_DANCER },
+ { "Super_Baby", JOB_SUPER_BABY },
+ { "Taekwon", JOB_TAEKWON },
+ { "Star_Gladiator", JOB_STAR_GLADIATOR },
+ { "Soul_Linker", JOB_SOUL_LINKER },
+ { "Gangsi", JOB_GANGSI },
+ { "Death_Knight", JOB_DEATH_KNIGHT },
+ { "Dark_Collector", JOB_DARK_COLLECTOR },
+ { "Rune_Knight", JOB_RUNE_KNIGHT },
+ { "Warlock", JOB_WARLOCK },
+ { "Ranger", JOB_RANGER },
+ { "Arch_Bishop", JOB_ARCH_BISHOP },
+ { "Mechanic", JOB_MECHANIC },
+ { "Guillotine_Cross", JOB_GUILLOTINE_CROSS },
+ { "Rune_Knight_Trans", JOB_RUNE_KNIGHT_T },
+ { "Warlock_Trans", JOB_WARLOCK_T },
+ { "Ranger_Trans", JOB_RANGER_T },
+ { "Arch_Bishop_Trans", JOB_ARCH_BISHOP_T },
+ { "Mechanic_Trans", JOB_MECHANIC_T },
+ { "Guillotine_Cross_Trans", JOB_GUILLOTINE_CROSS_T },
+ { "Royal_Guard", JOB_ROYAL_GUARD },
+ { "Sorcerer", JOB_SORCERER },
+ { "Minstrel", JOB_MINSTREL },
+ { "Wanderer", JOB_WANDERER },
+ { "Sura", JOB_SURA },
+ { "Genetic", JOB_GENETIC },
+ { "Shadow_Chaser", JOB_SHADOW_CHASER },
+ { "Royal_Guard_Trans", JOB_ROYAL_GUARD_T },
+ { "Sorcerer_Trans", JOB_SORCERER_T },
+ { "Minstrel_Trans", JOB_MINSTREL_T },
+ { "Wanderer_Trans", JOB_WANDERER_T },
+ { "Sura_Trans", JOB_SURA_T },
+ { "Genetic_Trans", JOB_GENETIC_T },
+ { "Shadow_Chaser_Trans", JOB_SHADOW_CHASER_T },
+ { "Baby_Rune_Knight", JOB_BABY_RUNE },
+ { "Baby_Warlock", JOB_BABY_WARLOCK },
+ { "Baby_Ranger", JOB_BABY_RANGER },
+ { "Baby_Arch_Bishop", JOB_BABY_BISHOP },
+ { "Baby_Mechanic", JOB_BABY_MECHANIC },
+ { "Baby_Guillotine_Cross", JOB_BABY_CROSS },
+ { "Baby_Royal_Guard", JOB_BABY_GUARD },
+ { "Baby_Sorcerer", JOB_BABY_SORCERER },
+ { "Baby_Minstrel", JOB_BABY_MINSTREL },
+ { "Baby_Wanderer", JOB_BABY_WANDERER },
+ { "Baby_Sura", JOB_BABY_SURA },
+ { "Baby_Genetic", JOB_BABY_GENETIC },
+ { "Baby_Shadow_Chaser", JOB_BABY_CHASER },
+ { "Expanded_Super_Novice", JOB_SUPER_NOVICE_E },
+ { "Expanded_Super_Baby", JOB_SUPER_BABY_E },
+ { "Kagerou", JOB_KAGEROU },
+ { "Oboro", JOB_OBORO },
+ { "Rebellion", JOB_REBELLION },
+ };
+
+ len = ARRAYLENGTH(names);
+
+ ARR_FIND(0, len, i, strcmpi(names[i].name, name) == 0);
+
+ if ( i == len )
+ return -1;
+
+ return names[i].id;
+}
+
int pc_follow_timer(int tid, int64 tick, int id, intptr_t data) {
struct map_session_data *sd;
struct block_list *tbl;
@@ -8958,6 +9091,9 @@ void pc_equipitem_pos(struct map_session_data *sd, struct item_data *id, int pos
/*==========================================
* Equip item on player sd at req_pos from inventory index n
+ * Return:
+ * 0 = fail
+ * 1 = success
*------------------------------------------*/
int pc_equipitem(struct map_session_data *sd,int n,int req_pos)
{
@@ -9089,7 +9225,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos)
}
sd->npc_item_flag = iflag;
- return 0;
+ return 1;
}
void pc_unequipitem_pos(struct map_session_data *sd, int n, int pos)
@@ -9155,6 +9291,9 @@ void pc_unequipitem_pos(struct map_session_data *sd, int n, int pos)
* 0 - only unequip
* 1 - calculate status after unequipping
* 2 - force unequip
+ * Return:
+ * 0 = fail
+ * 1 = success
*------------------------------------------*/
int pc_unequipitem(struct map_session_data *sd,int n,int flag) {
int i,iflag;
@@ -9280,7 +9419,7 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) {
}
sd->npc_item_flag = iflag;
- return 0;
+ return 1;
}
/*==========================================
@@ -10041,151 +10180,27 @@ void pc_read_skill_tree(void) {
#else
const char *config_filename = "db/pre-re/skill_tree.conf"; // FIXME hardcoded name
#endif
- int i = 0, jnamelen = 0;
+ int i = 0;
struct s_mapiterator *iter;
struct map_session_data *sd;
- struct {
- const char *name;
- int id;
- } jnames[] = {
- { "Novice", JOB_NOVICE },
- { "Swordsman", JOB_SWORDMAN },
- { "Magician", JOB_MAGE },
- { "Archer", JOB_ARCHER },
- { "Acolyte", JOB_ACOLYTE },
- { "Merchant", JOB_MERCHANT },
- { "Thief", JOB_THIEF },
- { "Knight", JOB_KNIGHT },
- { "Priest", JOB_PRIEST },
- { "Wizard", JOB_WIZARD },
- { "Blacksmith", JOB_BLACKSMITH },
- { "Hunter", JOB_HUNTER },
- { "Assassin", JOB_ASSASSIN },
- { "Crusader", JOB_CRUSADER },
- { "Monk", JOB_MONK },
- { "Sage", JOB_SAGE },
- { "Rogue", JOB_ROGUE },
- { "Alchemist", JOB_ALCHEMIST },
- { "Bard", JOB_BARD },
- { "Dancer", JOB_DANCER },
- { "Super_Novice", JOB_SUPER_NOVICE },
- { "Gunslinger", JOB_GUNSLINGER },
- { "Ninja", JOB_NINJA },
- { "Novice_High", JOB_NOVICE_HIGH },
- { "Swordsman_High", JOB_SWORDMAN_HIGH },
- { "Magician_High", JOB_MAGE_HIGH },
- { "Archer_High", JOB_ARCHER_HIGH },
- { "Acolyte_High", JOB_ACOLYTE_HIGH },
- { "Merchant_High", JOB_MERCHANT_HIGH },
- { "Thief_High", JOB_THIEF_HIGH },
- { "Lord_Knight", JOB_LORD_KNIGHT },
- { "High_Priest", JOB_HIGH_PRIEST },
- { "High_Wizard", JOB_HIGH_WIZARD },
- { "Whitesmith", JOB_WHITESMITH },
- { "Sniper", JOB_SNIPER },
- { "Assassin_Cross", JOB_ASSASSIN_CROSS },
- { "Paladin", JOB_PALADIN },
- { "Champion", JOB_CHAMPION },
- { "Professor", JOB_PROFESSOR },
- { "Stalker", JOB_STALKER },
- { "Creator", JOB_CREATOR },
- { "Clown", JOB_CLOWN },
- { "Gypsy", JOB_GYPSY },
- { "Baby_Novice", JOB_BABY },
- { "Baby_Swordsman", JOB_BABY_SWORDMAN },
- { "Baby_Magician", JOB_BABY_MAGE },
- { "Baby_Archer", JOB_BABY_ARCHER },
- { "Baby_Acolyte", JOB_BABY_ACOLYTE },
- { "Baby_Merchant", JOB_BABY_MERCHANT },
- { "Baby_Thief", JOB_BABY_THIEF },
- { "Baby_Knight", JOB_BABY_KNIGHT },
- { "Baby_Priest", JOB_BABY_PRIEST },
- { "Baby_Wizard", JOB_BABY_WIZARD },
- { "Baby_Blacksmith", JOB_BABY_BLACKSMITH },
- { "Baby_Hunter", JOB_BABY_HUNTER },
- { "Baby_Assassin", JOB_BABY_ASSASSIN },
- { "Baby_Crusader", JOB_BABY_CRUSADER },
- { "Baby_Monk", JOB_BABY_MONK },
- { "Baby_Sage", JOB_BABY_SAGE },
- { "Baby_Rogue", JOB_BABY_ROGUE },
- { "Baby_Alchemist", JOB_BABY_ALCHEMIST },
- { "Baby_Bard", JOB_BABY_BARD },
- { "Baby_Dancer", JOB_BABY_DANCER },
- { "Super_Baby", JOB_SUPER_BABY },
- { "Taekwon", JOB_TAEKWON },
- { "Star_Gladiator", JOB_STAR_GLADIATOR },
- { "Soul_Linker", JOB_SOUL_LINKER },
- { "Gangsi", JOB_GANGSI },
- { "Death_Knight", JOB_DEATH_KNIGHT },
- { "Dark_Collector", JOB_DARK_COLLECTOR },
- { "Rune_Knight", JOB_RUNE_KNIGHT },
- { "Warlock", JOB_WARLOCK },
- { "Ranger", JOB_RANGER },
- { "Arch_Bishop", JOB_ARCH_BISHOP },
- { "Mechanic", JOB_MECHANIC },
- { "Guillotine_Cross", JOB_GUILLOTINE_CROSS },
- { "Rune_Knight_Trans", JOB_RUNE_KNIGHT_T },
- { "Warlock_Trans", JOB_WARLOCK_T },
- { "Ranger_Trans", JOB_RANGER_T },
- { "Arch_Bishop_Trans", JOB_ARCH_BISHOP_T },
- { "Mechanic_Trans", JOB_MECHANIC_T },
- { "Guillotine_Cross_Trans", JOB_GUILLOTINE_CROSS_T },
- { "Royal_Guard", JOB_ROYAL_GUARD },
- { "Sorcerer", JOB_SORCERER },
- { "Minstrel", JOB_MINSTREL },
- { "Wanderer", JOB_WANDERER },
- { "Sura", JOB_SURA },
- { "Genetic", JOB_GENETIC },
- { "Shadow_Chaser", JOB_SHADOW_CHASER },
- { "Royal_Guard_Trans", JOB_ROYAL_GUARD_T },
- { "Sorcerer_Trans", JOB_SORCERER_T },
- { "Minstrel_Trans", JOB_MINSTREL_T },
- { "Wanderer_Trans", JOB_WANDERER_T },
- { "Sura_Trans", JOB_SURA_T },
- { "Genetic_Trans", JOB_GENETIC_T },
- { "Shadow_Chaser_Trans", JOB_SHADOW_CHASER_T },
- { "Baby_Rune_Knight", JOB_BABY_RUNE },
- { "Baby_Warlock", JOB_BABY_WARLOCK },
- { "Baby_Ranger", JOB_BABY_RANGER },
- { "Baby_Arch_Bishop", JOB_BABY_BISHOP },
- { "Baby_Mechanic", JOB_BABY_MECHANIC },
- { "Baby_Guillotine_Cross", JOB_BABY_CROSS },
- { "Baby_Royal_Guard", JOB_BABY_GUARD },
- { "Baby_Sorcerer", JOB_BABY_SORCERER },
- { "Baby_Minstrel", JOB_BABY_MINSTREL },
- { "Baby_Wanderer", JOB_BABY_WANDERER },
- { "Baby_Sura", JOB_BABY_SURA },
- { "Baby_Genetic", JOB_BABY_GENETIC },
- { "Baby_Shadow_Chaser", JOB_BABY_CHASER },
- { "Expanded_Super_Novice", JOB_SUPER_NOVICE_E },
- { "Expanded_Super_Baby", JOB_SUPER_BABY_E },
- { "Kagerou", JOB_KAGEROU },
- { "Oboro", JOB_OBORO },
- { "Rebellion", JOB_REBELLION },
- };
if (libconfig->read_file(&skill_tree_conf, config_filename)) {
ShowError("can't read %s\n", config_filename);
return;
}
-
- jnamelen = ARRAYLENGTH(jnames);
-
+
while ((skt = libconfig->setting_get_elem(skill_tree_conf.root,i++))) {
int k;
const char *name = config_setting_name(skt);
- ARR_FIND(0, jnamelen, k, strcmpi(jnames[k].name,name) == 0 );
-
- if( k == jnamelen ) {
- ShowWarning("pc_read_skill_tree: '%s' unknown job name!\n",name);
+ if ( (k = pc->check_job_name(name)) == -1 ) {
+ ShowWarning("pc_read_skill_tree: '%s' unknown job name!\n", name);
continue;
}
-
-
+
if( ( skills = libconfig->setting_get_member(skt,"skills") ) ) {
int c = 0;
- int idx = pc->class2idx(jnames[k].id);
+ int idx = pc->class2idx(k);
while ((sk = libconfig->setting_get_elem(skills,c++))) {
const char *sk_name = config_setting_name(sk);
@@ -10199,7 +10214,7 @@ void pc_read_skill_tree(void) {
ShowWarning("pc_read_skill_tree: Unable to load skill %d (%s) into '%s's tree. Maximum number of skills per class has been reached.\n", skill_id, sk_name, name);
continue;
} else if (pc->skill_tree[idx][skidx].id) {
- ShowNotice("pc_read_skill_tree: Overwriting %d for '%s' (%d)\n", skill_id, name, jnames[k].id);
+ ShowNotice("pc_read_skill_tree: Overwriting %d for '%s' (%d)\n", skill_id, name, k);
}
pc->skill_tree[idx][skidx].id = skill_id;
@@ -10243,46 +10258,42 @@ void pc_read_skill_tree(void) {
while( (skt = libconfig->setting_get_elem(skill_tree_conf.root,i++)) ) {
int k, idx;
const char *name = config_setting_name(skt);
-
-
- ARR_FIND(0, jnamelen, k, strcmpi(jnames[k].name,name) == 0 );
- if( k == jnamelen ) {
- ShowWarning("pc_read_skill_tree: '%s' unknown job name!\n",name);
+ if ( (k = pc->check_job_name(name)) == -1 ) {
+ ShowWarning("pc_read_skill_tree: '%s' unknown job name!\n", name);
continue;
}
- idx = pc->class2idx(jnames[k].id);
+
+ idx = pc->class2idx(k);
if( ( inherit = libconfig->setting_get_member(skt,"inherit") ) ) {
const char *iname;
int v = 0;
- while ((iname = libconfig->setting_get_string_elem(inherit, v++))) {
+ while ( (iname = libconfig->setting_get_string_elem(inherit, v++)) ) {
int b = 0, a, d, f, fidx;
- ARR_FIND(0, jnamelen, b, strcmpi(jnames[b].name,iname) == 0 );
-
- if( b == jnamelen ) {
- ShowWarning("pc_read_skill_tree: '%s' trying to inherit unknown '%s'!\n",name,iname);
+ if ( (b = pc->check_job_name(iname)) == -1 ) {
+ ShowWarning("pc_read_skill_tree: '%s' trying to inherit unknown '%s'!\n", name, iname);
continue;
}
-
- fidx = pc->class2idx(jnames[b].id);
-
- ARR_FIND( 0, MAX_SKILL_TREE, d, pc->skill_tree[fidx][d].id == 0 );
- for( f = 0; f < d; f++ ) {
-
- ARR_FIND( 0, MAX_SKILL_TREE, a, pc->skill_tree[idx][a].id == 0 || pc->skill_tree[idx][a].id == pc->skill_tree[fidx][f].id );
+ fidx = pc->class2idx(b);
+
+ ARR_FIND(0, MAX_SKILL_TREE, d, pc->skill_tree[fidx][d].id == 0);
+
+ for ( f = 0; f < d; f++ ) {
- if( a == MAX_SKILL_TREE ) {
- ShowWarning("pc_read_skill_tree: '%s' can't inherit '%s', skill tree is full!\n", name,iname);
+ ARR_FIND(0, MAX_SKILL_TREE, a, pc->skill_tree[idx][a].id == 0 || pc->skill_tree[idx][a].id == pc->skill_tree[fidx][f].id);
+
+ if ( a == MAX_SKILL_TREE ) {
+ ShowWarning("pc_read_skill_tree: '%s' can't inherit '%s', skill tree is full!\n", name, iname);
break;
- } else if ( pc->skill_tree[idx][a].id || ( pc->skill_tree[idx][a].id == NV_TRICKDEAD && ((pc->jobid2mapid(jnames[k].id)&(MAPID_BASEMASK|JOBL_2))!=MAPID_NOVICE) ) ) /* we skip trickdead for non-novices */
+ } else if ( pc->skill_tree[idx][a].id || (pc->skill_tree[idx][a].id == NV_TRICKDEAD && ((pc->jobid2mapid(k)&(MAPID_BASEMASK | JOBL_2)) != MAPID_NOVICE)) ) /* we skip trickdead for non-novices */
continue;/* skip */
memcpy(&pc->skill_tree[idx][a], &pc->skill_tree[fidx][f], sizeof(pc->skill_tree[fidx][f]));
pc->skill_tree[idx][a].inherited = 1;
}
-
+
}
}
@@ -11287,4 +11298,6 @@ void pc_defaults(void) {
pc->autotrade_start = pc_autotrade_start;
pc->autotrade_prepare = pc_autotrade_prepare;
pc->autotrade_populate = pc_autotrade_populate;
+
+ pc->check_job_name = pc_check_job_name;
}
diff --git a/src/map/pc.h b/src/map/pc.h
index 9e9aa4673..39b705b8f 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -1035,6 +1035,8 @@ struct pc_interface {
void (*autotrade_start) (struct map_session_data *sd);
void (*autotrade_prepare) (struct map_session_data *sd);
void (*autotrade_populate) (struct map_session_data *sd);
+
+ int (*check_job_name) (const char *name);
};
struct pc_interface *pc;
diff --git a/src/map/skill.c b/src/map/skill.c
index 3140b720c..4c8ecb40f 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -4866,7 +4866,7 @@ int skill_castend_id(int tid, int64 tick, int id, intptr_t data) {
if( sd && ud->skilltimer != INVALID_TIMER && (pc->checkskill(sd,SA_FREECAST) > 0 || ud->skill_id == LG_EXEEDBREAK) )
{// restore original walk speed
ud->skilltimer = INVALID_TIMER;
- status_calc_bl(&sd->bl, SCB_SPEED);
+ status_calc_bl(&sd->bl, SCB_SPEED|SCB_ASPD);
}
ud->skilltimer = INVALID_TIMER;
@@ -9878,7 +9878,7 @@ int skill_castend_pos(int tid, int64 tick, int id, intptr_t data)
if( sd && ud->skilltimer != INVALID_TIMER && ( pc->checkskill(sd,SA_FREECAST) > 0 || ud->skill_id == LG_EXEEDBREAK ) )
{// restore original walk speed
ud->skilltimer = INVALID_TIMER;
- status_calc_bl(&sd->bl, SCB_SPEED);
+ status_calc_bl(&sd->bl, SCB_SPEED|SCB_ASPD);
}
ud->skilltimer = INVALID_TIMER;
diff --git a/src/map/status.c b/src/map/status.c
index a7c809c6d..91ab19558 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -2081,64 +2081,42 @@ int status_calc_pet_(struct pet_data *pd, enum e_status_calc_opt opt)
return 1;
}
-/// Helper function for status_base_pc_maxhp(), used to pre-calculate the hp_sigma_val[] array
-void status_calc_sigma(void)
-{
- int i,j;
+unsigned int status_get_base_maxsp(struct map_session_data* sd, struct status_data *st) {
+ uint64 val = pc->class2idx(sd->status.class_);
- for(i = 0; i < CLASS_COUNT; i++)
- {
- unsigned int k = 0;
- status->hp_sigma_val[i][0] = status->hp_sigma_val[i][1] = 0;
- for(j = 2; j <= MAX_LEVEL; j++)
- {
- k += (status->hp_coefficient[i]*j + 50) / 100;
- status->hp_sigma_val[i][j] = k;
- if (k >= INT_MAX)
- break; //Overflow protection. [Skotlex]
- }
- for(; j <= MAX_LEVEL; j++)
- status->hp_sigma_val[i][j] = INT_MAX;
- }
+ val = status->SP_table[val][sd->status.base_level];
+
+ if ( sd->class_&JOBL_UPPER )
+ val += val * 25 / 100;
+ else if ( sd->class_&JOBL_BABY )
+ val = val * 70 / 100;
+ if ( (sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON && sd->status.base_level >= 90 && pc->famerank(sd->status.char_id, MAPID_TAEKWON) )
+ val *= 3; //Triple max SP for top ranking Taekwons over level 90.
+
+ val += val * st->int_ / 100;
+
+ return (unsigned int)cap_value(val, 0, UINT_MAX);
}
-/// Calculates base MaxHP value according to class and base level
-/// The recursive equation used to calculate level bonus is (using integer operations)
-/// f(0) = 35 | f(x+1) = f(x) + A + (x + B)*C/D
-/// which reduces to something close to
-/// f(x) = 35 + x*(A + B*C/D) + sum(i=2..x){ i*C/D }
-unsigned int status_base_pc_maxhp(struct map_session_data *sd, struct status_data *st) {
+unsigned int status_get_base_maxhp(struct map_session_data *sd, struct status_data *st) {
uint64 val = pc->class2idx(sd->status.class_);
- val = 35 + sd->status.base_level*(int64)status->hp_coefficient2[val]/100 + status->hp_sigma_val[val][sd->status.base_level];
- if((sd->class_&MAPID_UPPERMASK) == MAPID_NINJA || (sd->class_&MAPID_UPPERMASK) == MAPID_GUNSLINGER || (sd->class_&MAPID_UPPERMASK) == MAPID_REBELLION)
- val += 100; //Since their HP can't be approximated well enough without this.
- if((sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON && sd->status.base_level >= 90 && pc->famerank(sd->status.char_id, MAPID_TAEKWON))
- val *= 3; //Triple max HP for top ranking Taekwons over level 90.
- if((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.base_level >= 99)
- val += 2000; //Supernovice lvl99 hp bonus.
-
- val += val * st->vit/100; // +1% per each point of VIT
+ val = status->HP_table[val][sd->status.base_level];
- if (sd->class_&JOBL_UPPER)
- val += val * 25/100; //Trans classes get a 25% hp bonus
- else if (sd->class_&JOBL_BABY)
- val -= val * 30/100; //Baby classes get a 30% hp penalty
- return (unsigned int)cap_value(val,0,UINT_MAX);
-}
+ if ( (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.base_level >= 99 )
+ val += 2000; //Supernovice lvl99 hp bonus.
+ if ( (sd->class_&MAPID_THIRDMASK) == MAPID_SUPER_NOVICE_E && sd->status.base_level >= 150 )
+ val += 2000; //Extented Supernovice lvl150 hp bonus.
-unsigned int status_base_pc_maxsp(struct map_session_data* sd, struct status_data *st) {
- uint64 val;
+ if ( sd->class_&JOBL_UPPER )
+ val += val * 25 / 100; //Trans classes get a 25% hp bonus
+ else if ( sd->class_&JOBL_BABY )
+ val = val * 70 / 100; //Baby classes get a 30% hp penalty
- val = 10 + sd->status.base_level*(int64)status->sp_coefficient[pc->class2idx(sd->status.class_)]/100;
- val += val * st->int_/100;
+ if ( (sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON && sd->status.base_level >= 90 && pc->famerank(sd->status.char_id, MAPID_TAEKWON) )
+ val *= 3; //Triple max HP for top ranking Taekwons over level 90.
- if (sd->class_&JOBL_UPPER)
- val += val * 25/100;
- else if (sd->class_&JOBL_BABY)
- val -= val * 30/100;
- if ((sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON && sd->status.base_level >= 90 && pc->famerank(sd->status.char_id, MAPID_TAEKWON))
- val *= 3; //Triple max SP for top ranking Taekwons over level 90.
+ val += val * st->vit / 100; // +1% per each point of VIT
return (unsigned int)cap_value(val,0,UINT_MAX);
}
@@ -2630,7 +2608,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) {
// Basic MaxHP value
//We hold the standard Max HP here to make it faster to recalculate on vit changes.
- sd->status.max_hp = status->base_pc_maxhp(sd,bstatus);
+ sd->status.max_hp = status->get_base_maxhp(sd,bstatus);
//This is done to handle underflows from negative Max HP bonuses
i64 = sd->status.max_hp + (int)bstatus->max_hp;
bstatus->max_hp = (unsigned int)cap_value(i64, 0, INT_MAX);
@@ -2655,7 +2633,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) {
// ----- SP MAX CALCULATION -----
// Basic MaxSP value
- sd->status.max_sp = status->base_pc_maxsp(sd,bstatus);
+ sd->status.max_sp = status->get_base_maxsp(sd,bstatus);
//This is done to handle underflows from negative Max SP bonuses
i64 = sd->status.max_sp + (int)bstatus->max_sp;
bstatus->max_sp = (unsigned int)cap_value(i64, 0, INT_MAX);
@@ -2842,17 +2820,12 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) {
else if (pc_isridingdragon(sd))
bstatus->aspd_rate += 250-50*pc->checkskill(sd,RK_DRAGONTRAINING);
#else // needs more info
- if((skill_lv=pc->checkskill(sd,SA_ADVANCEDBOOK))>0 && sd->status.weapon == W_BOOK)
- bstatus->aspd_rate += 5*skill_lv;
- if((skill_lv = pc->checkskill(sd,SG_DEVIL)) > 0 && !pc->nextjobexp(sd))
- bstatus->aspd_rate += 30*skill_lv;
- if((skill_lv=pc->checkskill(sd,GS_SINGLEACTION))>0 &&
- (sd->status.weapon >= W_REVOLVER && sd->status.weapon <= W_GRENADE))
- bstatus->aspd_rate += ((skill_lv+1)/2) * 10;
- if (pc_isridingpeco(sd))
- bstatus->aspd_rate -= 500-100*pc->checkskill(sd,KN_CAVALIERMASTERY);
- else if (pc_isridingdragon(sd))
- bstatus->aspd_rate -= 250-50*pc->checkskill(sd,RK_DRAGONTRAINING);
+ if ( (skill_lv = pc->checkskill(sd, SG_DEVIL)) > 0 && !pc->nextjobexp(sd) )
+ bstatus->aspd_rate += 30 * skill_lv;
+ if ( pc_isridingpeco(sd) )
+ bstatus->aspd_rate -= 500 - 100 * pc->checkskill(sd, KN_CAVALIERMASTERY);
+ else if ( pc_isridingdragon(sd) )
+ bstatus->aspd_rate -= 250 - 50 * pc->checkskill(sd, RK_DRAGONTRAINING);
#endif
bstatus->adelay = 2*bstatus->amotion;
@@ -3656,7 +3629,7 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) {
if(flag&SCB_MAXHP) {
if( bl->type&BL_PC ) {
- st->max_hp = status->base_pc_maxhp(sd,st);
+ st->max_hp = status->get_base_maxhp(sd,st);
if (sd)
st->max_hp += bst->max_hp - sd->status.max_hp;
@@ -3677,7 +3650,7 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) {
if(flag&SCB_MAXSP) {
if( bl->type&BL_PC ) {
- st->max_sp = status->base_pc_maxsp(sd,st);
+ st->max_sp = status->get_base_maxsp(sd,st);
if (sd)
st->max_sp += bst->max_sp - sd->status.max_sp;
@@ -3744,19 +3717,14 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) {
amotion = status->base_amotion_pc(sd, st);
#ifndef RENEWAL_ASPD
st->aspd_rate = status->calc_aspd_rate(bl, sc, bst->aspd_rate);
-
- if(st->aspd_rate != 1000)
- amotion = amotion*st->aspd_rate/1000;
-#else
- // aspd = baseaspd + floor(sqrt((agi^2/2) + (dex^2/5))/4 + (potskillbonus*agi/200))
- amotion -= (int)(sqrt((pow(st->agi, 2) / 2) + (pow(st->dex, 2) / 5)) / 4 + ((float)status->calc_aspd(bl, sc, 1) * st->agi / 200)) * 10;
-
- if ( (status->calc_aspd(bl, sc, 2) + st->aspd_rate2) != 0 ) // RE ASPD percertage modifier
- amotion -= ((amotion - ((sd->class_&JOBL_THIRD) ? battle_config.max_third_aspd : battle_config.max_aspd))
- * (status->calc_aspd(bl, sc, 2) + st->aspd_rate2) / 10 + 5) / 10;
-
+#endif
if ( st->aspd_rate != 1000 ) // absolute percentage modifier
- amotion = (200 - (200 - amotion / 10) * st->aspd_rate / 1000) * 10;
+ amotion = amotion * st->aspd_rate / 1000;
+ if ( sd && sd->ud.skilltimer != INVALID_TIMER && pc->checkskill(sd, SA_FREECAST) > 0 )
+ amotion = amotion * 5 * (pc->checkskill(sd, SA_FREECAST) + 10) / 100;
+#ifdef RENEWAL_ASPD
+ amotion += (max(0xc3 - amotion, 2) * (st->aspd_rate2 + status->calc_aspd(bl, sc, 2))) / 100;
+ amotion = 10 * (200 - amotion) + sd->bonus.aspd_add;
#endif
amotion = status->calc_fix_aspd(bl, sc, amotion);
st->amotion = cap_value(amotion, ((sd->class_&JOBL_THIRD) ? battle_config.max_third_aspd : battle_config.max_aspd), 2000);
@@ -4011,31 +3979,30 @@ int status_check_visibility(struct block_list *src, struct block_list *target) {
// Basic ASPD value
int status_base_amotion_pc(struct map_session_data *sd, struct status_data *st) {
int amotion;
-#ifdef RENEWAL_ASPD
- short mod = -1;
-
- switch ( sd->weapontype2 ) { // adjustment for dual wielding
- case W_DAGGER:
- mod = 0;
- break; // 0, 1, 1
- case W_1HSWORD:
- case W_1HAXE:
- mod = 1;
- if ( (sd->class_&MAPID_THIRDMASK) == MAPID_GUILLOTINE_CROSS ) // 0, 2, 3
- mod = sd->weapontype2 / W_1HSWORD + W_1HSWORD / sd->weapontype2;
- }
-
- amotion = (sd->status.weapon < MAX_WEAPON_TYPE && mod < 0)
- ? (status->aspd_base[pc->class2idx(sd->status.class_)][sd->status.weapon]) // single weapon
- : ((status->aspd_base[pc->class2idx(sd->status.class_)][sd->weapontype2] // dual-wield
- + status->aspd_base[pc->class2idx(sd->status.class_)][sd->weapontype2]) * 6 / 10 + 10 * mod
- - status->aspd_base[pc->class2idx(sd->status.class_)][sd->weapontype2]
- + status->aspd_base[pc->class2idx(sd->status.class_)][sd->weapontype1]);
-
+#ifdef RENEWAL_ASPD /* [malufett/Hercules] */
+ float temp;
+ int skill_lv, val = 0;
+ amotion = status->aspd_base[pc->class2idx(sd->status.class_)][sd->weapontype1];
+ if ( sd->status.weapon > MAX_WEAPON_TYPE )
+ amotion += status->aspd_base[pc->class2idx(sd->status.class_)][sd->weapontype2] / 4;
if ( sd->status.shield )
- amotion += (2000 - status->aspd_base[pc->class2idx(sd->status.class_)][W_FIST]) +
- (status->aspd_base[pc->class2idx(sd->status.class_)][MAX_WEAPON_TYPE] - 2000);
-
+ amotion += status->aspd_base[pc->class2idx(sd->status.class_)][MAX_WEAPON_TYPE];
+ switch ( sd->status.weapon ) {
+ case W_BOW: case W_MUSICAL:
+ case W_WHIP: case W_REVOLVER:
+ case W_RIFLE: case W_GATLING:
+ case W_SHOTGUN: case W_GRENADE:
+ temp = st->dex * st->dex / 7.0f + st->agi * st->agi * 0.5f;
+ break;
+ default:
+ temp = st->dex * st->dex / 5.0f + st->agi * st->agi * 0.5f;
+ }
+ temp = (float)(sqrt(temp) * 0.25f) + 0xc4;
+ if ( (skill_lv = pc->checkskill(sd, SA_ADVANCEDBOOK)) > 0 && sd->status.weapon == W_BOOK )
+ val += (skill_lv - 1) / 2 + 1;
+ if ( (skill_lv = pc->checkskill(sd, GS_SINGLEACTION)) > 0 )
+ val += ((skill_lv + 1) / 2);
+ amotion = ((int)(temp + ((float)(status->calc_aspd(&sd->bl, &sd->sc, 1) + val) * st->agi / 200)) - min(amotion, 200));
#else
// base weapon delay
amotion = (sd->status.weapon < MAX_WEAPON_TYPE)
@@ -4044,13 +4011,14 @@ int status_base_amotion_pc(struct map_session_data *sd, struct status_data *st)
// percentual delay reduction from stats
amotion -= amotion * (4 * st->agi + st->dex) / 1000;
-#endif
+
// raw delay adjustment from bAspd bonus
amotion += sd->bonus.aspd_add;
/* angra manyu disregards aspd_base and similar */
if ( sd->equip_index[EQI_HAND_R] >= 0 && sd->status.inventory[sd->equip_index[EQI_HAND_R]].nameid == ITEMID_ANGRA_MANYU )
return 0;
+#endif
return amotion;
}
@@ -4595,6 +4563,9 @@ unsigned short status_calc_batk(struct block_list *bl, struct status_change *sc,
#ifndef RENEWAL
if(sc->data[SC_LKCONCENTRATION])
batk += batk * sc->data[SC_LKCONCENTRATION]->val2/100;
+#else
+ if ( sc->data[SC_NOEQUIPWEAPON] && bl->type != BL_PC )
+ batk -= batk * sc->data[SC_NOEQUIPWEAPON]->val2 / 100;
#endif
if(sc->data[SC_SKE])
batk += batk * 3;
@@ -4674,7 +4645,7 @@ unsigned short status_calc_watk(struct block_list *bl, struct status_change *sc,
if(sc->data[SC_LKCONCENTRATION])
watk += watk * sc->data[SC_LKCONCENTRATION]->val2/100;
#endif
- if(sc->data[SC_INCATKRATE])
+ if(sc->data[SC_INCATKRATE] && bl->type != BL_MOB)
watk += watk * sc->data[SC_INCATKRATE]->val1/100;
if(sc->data[SC_PROVOKE])
watk += watk * sc->data[SC_PROVOKE]->val3/100;
@@ -4684,8 +4655,10 @@ unsigned short status_calc_watk(struct block_list *bl, struct status_change *sc,
watk += watk * sc->data[SC_HLIF_FLEET]->val3/100;
if(sc->data[SC_CURSE])
watk -= watk * 25/100;
+#ifndef RENEWAL
if(sc->data[SC_NOEQUIPWEAPON] && bl->type != BL_PC)
watk -= watk * sc->data[SC_NOEQUIPWEAPON]->val2/100;
+#endif
if(sc->data[SC__ENERVATION])
watk -= watk * sc->data[SC__ENERVATION]->val2 / 100;
if(sc->data[SC_RUSH_WINDMILL])
@@ -12086,33 +12059,178 @@ int status_get_sc_type(sc_type type) {
* size_fix.txt - size adjustment table for weapons
* refine_db.txt - refining data table
*------------------------------------------*/
-bool status_readdb_job1(char* fields[], int columns, int current)
-{// Job-specific values (weight, HP, SP, ASPD)
- int idx, class_;
- unsigned int i;
-
- class_ = atoi(fields[0]);
+void status_read_job_db(void) { /* [malufett/Hercules] */
+ int i = 0;
+ config_t job_db_conf;
+ config_setting_t *jdb = NULL;
+ const char *config_filename = "db/"DBPATH"job_db.conf";
+ struct {
+ const char *name;
+ int id;
+ } wnames[] = {
+ { "Fist", W_FIST },
+ { "Dagger", W_DAGGER },
+ { "Sword", W_1HSWORD },
+ { "TwoHandSword", W_2HSWORD },
+ { "Spear", W_1HSPEAR },
+ { "TwoHandSpear", W_2HSPEAR },
+ { "Axe", W_1HAXE },
+ { "TwoHandAxe", W_2HAXE },
+ { "Mace", W_MACE },
+ { "TwoHandMace", W_2HMACE },
+ { "Rod", W_STAFF },
+ { "Bow", W_BOW },
+ { "Knuckle", W_KNUCKLE },
+ { "Instrument", W_MUSICAL },
+ { "Whip", W_WHIP },
+ { "Book", W_BOOK },
+ { "Katar", W_KATAR },
+ { "Revolver", W_REVOLVER },
+ { "Rifle", W_RIFLE },
+ { "GatlingGun", W_GATLING },
+ { "Shotgun", W_SHOTGUN },
+ { "GrenadeLauncher", W_GRENADE },
+ { "FuumaShuriken", W_HUUMA },
+ { "TwoHandRod", W_2HSTAFF },
+#ifdef RENEWAL_ASPD
+ { "Shield", MAX_WEAPON_TYPE }
+#endif
+ };
- if(!pc->db_checkid(class_))
- {
- ShowWarning("status_readdb_job1: Invalid job class %d specified.\n", class_);
- return false;
+ if ( libconfig->read_file(&job_db_conf, config_filename) ) {
+ ShowError("can't read %s\n", config_filename);
+ return;
}
- idx = pc->class2idx(class_);
+ while ( (jdb = libconfig->setting_get_elem(job_db_conf.root, i++)) ) {
+ int class_, idx, i32 = 0;
+ config_setting_t *temp = NULL;
+ const char *name = config_setting_name(jdb);
- status->max_weight_base[idx] = atoi(fields[1]);
- status->hp_coefficient[idx] = atoi(fields[2]);
- status->hp_coefficient2[idx] = atoi(fields[3]);
- status->sp_coefficient[idx] = atoi(fields[4]);
-#ifdef RENEWAL_ASPD
- for(i = 0; i <= MAX_WEAPON_TYPE; i++)
-#else
- for(i = 0; i < MAX_WEAPON_TYPE; i++)
-#endif
- {
- status->aspd_base[idx][i] = atoi(fields[i+5]);
+ if ( (class_ = pc->check_job_name(name)) == -1 ) {
+ ShowWarning("pc_read_job_db: '%s' unknown job name!\n", name);
+ continue;
+ }
+
+ idx = pc->class2idx(class_);
+ if ( (temp = libconfig->setting_get_member(jdb, "Inherit")) ) {
+ int nidx = 0, iidx, w;
+ const char *iname;
+ while ( (iname = libconfig->setting_get_string_elem(temp, nidx++)) ) {
+ int iclass, ave, total = 0;
+ if ( (iclass = pc->check_job_name(iname)) == -1 ) {
+ ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s'!\n", name, iname);
+ continue;
+ }
+ iidx = pc->class2idx(iclass);
+ status->max_weight_base[idx] = status->max_weight_base[iidx];
+ memcpy(&status->aspd_base[idx], &status->aspd_base[iidx], sizeof(status->aspd_base[iidx]));
+ for ( w = 1; w <= MAX_LEVEL && status->HP_table[iidx][w]; w++ ) {
+ status->HP_table[idx][w] = status->HP_table[iidx][w];
+ total += status->HP_table[idx][w];
+ }
+ ave = total / (w - 1);
+ for ( ; w <= pc->max_level[idx][0]; w++ ) {
+ status->HP_table[idx][w] = min(ave * w, battle_config.max_hp);
+ }
+ for ( w = 1; w <= MAX_LEVEL && status->SP_table[iidx][w]; w++ ) {
+ status->SP_table[idx][w] = status->SP_table[iidx][w];
+ total += status->SP_table[idx][w];
+ }
+ ave = total / (w - 1);
+ for ( ; w <= pc->max_level[idx][0]; w++ ) {
+ status->SP_table[idx][w] = min(ave * w, battle_config.max_sp);
+ }
+ }
+ }
+ if ( (temp = libconfig->setting_get_member(jdb, "InheritHP")) ) {
+ int nidx = 0, iidx;
+ const char *iname;
+ while ( (iname = libconfig->setting_get_string_elem(temp, nidx++)) ) {
+ int iclass, w, ave, total = 0;
+ if ( (iclass = pc->check_job_name(iname)) == -1 ) {
+ ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s' HP!\n", name, iname);
+ continue;
+ }
+ iidx = pc->class2idx(iclass);
+ for ( w = 1; w <= MAX_LEVEL && status->HP_table[iidx][w]; w++ ) {
+ status->HP_table[idx][w] = status->HP_table[iidx][w];
+ total += status->HP_table[idx][w];
+ }
+ ave = total / (w - 1);
+ for ( ; w <= pc->max_level[idx][0]; w++ ) {
+ status->HP_table[idx][w] = min(ave * w, battle_config.max_hp);
+ }
+ }
+ }
+ if ( (temp = libconfig->setting_get_member(jdb, "InheritSP")) ) {
+ int nidx = 0, iidx, ave, total = 0;
+ const char *iname;
+ while ( (iname = libconfig->setting_get_string_elem(temp, nidx++)) ) {
+ int iclass, w;
+ if ( (iclass = pc->check_job_name(iname)) == -1 ) {
+ ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s' SP!\n", name, iname);
+ continue;
+ }
+ iidx = pc->class2idx(iclass);
+ for ( w = 1; w <= MAX_LEVEL && status->SP_table[iidx][w]; w++ ) {
+ status->SP_table[idx][w] = status->SP_table[iidx][w];
+ total += status->SP_table[idx][w];
+ }
+ ave = total / (w - 1);
+ for ( ; w <= pc->max_level[idx][0]; w++ ) {
+ status->SP_table[idx][w] = min(ave * w, battle_config.max_sp);
+ }
+ }
+ }
+
+ if ( libconfig->setting_lookup_int(jdb, "Weight", &i32) )
+ status->max_weight_base[idx] = i32;
+ else if ( !status->max_weight_base[idx] )
+ status->max_weight_base[idx] = 20000;
+
+ if ( (temp = libconfig->setting_get_member(jdb, "BaseASPD")) ) {
+ int widx = 0;
+ config_setting_t *wpn = NULL;
+ while ( (wpn = libconfig->setting_get_elem(temp, widx++)) ) {
+ int w, wlen = ARRAYLENGTH(wnames);
+ const char *wname = config_setting_name(wpn);
+
+ ARR_FIND(0, wlen, w, strcmp(wnames[w].name, wname) == 0);
+ if ( w != wlen ) {
+ status->aspd_base[idx][wnames[w].id] = libconfig->setting_get_int(wpn);
+ } else {
+ ShowWarning("status_read_job_db: unknown weapon type '%s'!\n", wname);
+ }
+ }
+ }
+
+ if ( (temp = libconfig->setting_get_member(jdb, "HPTable")) ) {
+ int level = 0, ave, total = 0;
+ config_setting_t *hp = NULL;
+ while ( (hp = libconfig->setting_get_elem(temp, level++)) ) {
+ status->HP_table[idx][level] = i32 = min(libconfig->setting_get_int(hp), battle_config.max_hp);
+ total += i32 - status->HP_table[idx][level - 1];
+ }
+ ave = total / (level - 1);
+ for ( ; level <= pc->max_level[idx][0]; level++ ) { /* limit only to possible maximum level of the given class */
+ status->HP_table[idx][level] = min(ave * level, battle_config.max_hp); /* some are still empty? then let's use the average increase */
+ }
+ }
+
+ if ( (temp = libconfig->setting_get_member(jdb, "SPTable")) ) {
+ int level = 0, ave, total = 0;
+ config_setting_t *sp = NULL;
+ while ( (sp = libconfig->setting_get_elem(temp, level++)) ) {
+ status->SP_table[idx][level] = i32 = min(libconfig->setting_get_int(sp), battle_config.max_sp);
+ total += i32 - status->SP_table[idx][level - 1];
+ }
+ ave = total / (level - 1);
+ for ( ; level <= pc->max_level[idx][0]; level++ ) {
+ status->SP_table[idx][level] = min(ave * level, battle_config.max_sp);
+ }
+ }
}
- return true;
+ libconfig->destroy(&job_db_conf);
}
bool status_readdb_job2(char* fields[], int columns, int current)
@@ -12207,15 +12325,21 @@ int status_readdb(void)
// initialize databases to default
//
if( runflag == MAPSERVER_ST_RUNNING ) {//not necessary during boot
- // reset job_db1.txt data
+ // reset job_db.conf data
memset(status->max_weight_base, 0, sizeof(status->max_weight_base));
- memset(status->hp_coefficient, 0, sizeof(status->hp_coefficient));
- memset(status->hp_coefficient2, 0, sizeof(status->hp_coefficient2));
- memset(status->sp_coefficient, 0, sizeof(status->sp_coefficient));
- memset(status->aspd_base, 0, sizeof(status->aspd_base));
+ memset(status->HP_table, 0, sizeof(status->HP_table));
+ memset(status->SP_table, 0, sizeof(status->SP_table));
// reset job_db2.txt data
memset(status->job_bonus,0,sizeof(status->job_bonus)); // Job-specific stats bonus
}
+ for ( i = 0; i < CLASS_COUNT; i++ ) {
+ for ( j = 0; j < MAX_WEAPON_TYPE; j++ )
+ status->aspd_base[i][j] = 2000;
+#ifdef RENEWAL_ASPD
+ status->aspd_base[i][MAX_WEAPON_TYPE] = 0;
+#endif
+ }
+
// size_fix.txt
for(i = 0; i < ARRAYLENGTH(status->atkmods); i++)
for(j = 0; j < MAX_WEAPON_TYPE; j++)
@@ -12232,17 +12356,11 @@ int status_readdb(void)
// read databases
//
-
-
-#ifdef RENEWAL_ASPD
- sv->readdb(map->db_path, "re/job_db1.txt", ',', 6+MAX_WEAPON_TYPE, 6+MAX_WEAPON_TYPE, -1, status->readdb_job1);
-#else
- sv->readdb(map->db_path, "pre-re/job_db1.txt", ',', 5+MAX_WEAPON_TYPE, 5+MAX_WEAPON_TYPE, -1, status->readdb_job1);
-#endif
sv->readdb(map->db_path, "job_db2.txt", ',', 1, 1+MAX_LEVEL, -1, status->readdb_job2);
sv->readdb(map->db_path, DBPATH"size_fix.txt", ',', MAX_WEAPON_TYPE, MAX_WEAPON_TYPE, ARRAYLENGTH(status->atkmods), status->readdb_sizefix);
sv->readdb(map->db_path, DBPATH"refine_db.txt", ',', 4+MAX_REFINE, 4+MAX_REFINE, ARRAYLENGTH(status->refine_info), status->readdb_refine);
sv->readdb(map->db_path, "sc_config.txt", ',', 2, 2, SC_MAX, status->readdb_scconfig);
+ status->read_job_db();
return 0;
}
@@ -12260,7 +12378,6 @@ int do_init_status(bool minimal) {
status->initChangeTables();
status->initDummyData();
status->readdb();
- status->calc_sigma();
status->natural_heal_prev_tick = timer->gettick();
status->data_ers = ers_new(sizeof(struct status_change_entry),"status.c::data_ers",ERS_OPT_NONE);
timer->add_interval(status->natural_heal_prev_tick + NATURAL_HEAL_INTERVAL, status->natural_heal_timer, 0, 0, NATURAL_HEAL_INTERVAL);
@@ -12285,10 +12402,8 @@ void status_defaults(void) {
status->current_equip_card_id = 0; //To prevent card-stacking (from jA) [Skotlex]
memset(status->max_weight_base,0,sizeof(status->max_weight_base)
- + sizeof(status->hp_coefficient)
- + sizeof(status->hp_coefficient2)
- + sizeof(status->hp_sigma_val)
- + sizeof(status->sp_coefficient)
+ + sizeof(status->HP_table)
+ + sizeof(status->SP_table)
+ sizeof(status->aspd_base)
+ sizeof(status->Skill2SCTable)
+ sizeof(status->IconChangeTable)
@@ -12396,9 +12511,8 @@ void status_defaults(void) {
status->initDummyData = initDummyData;
status->base_amotion_pc = status_base_amotion_pc;
status->base_atk = status_base_atk;
- status->calc_sigma = status_calc_sigma;
- status->base_pc_maxhp = status_base_pc_maxhp;
- status->base_pc_maxsp = status_base_pc_maxsp;
+ status->get_base_maxhp = status_get_base_maxhp;
+ status->get_base_maxsp = status_get_base_maxsp;
status->calc_npc_ = status_calc_npc_;
status->calc_str = status_calc_str;
status->calc_agi = status_calc_agi;
@@ -12428,9 +12542,9 @@ void status_defaults(void) {
status->display_remove = status_display_remove;
status->natural_heal = status_natural_heal;
status->natural_heal_timer = status_natural_heal_timer;
- status->readdb_job1 = status_readdb_job1;
status->readdb_job2 = status_readdb_job2;
status->readdb_sizefix = status_readdb_sizefix;
status->readdb_refine = status_readdb_refine;
status->readdb_scconfig = status_readdb_scconfig;
+ status->read_job_db = status_read_job_db;
}
diff --git a/src/map/status.h b/src/map/status.h
index f0624587e..98d5d415c 100644
--- a/src/map/status.h
+++ b/src/map/status.h
@@ -1982,10 +1982,8 @@ struct status_interface {
int current_equip_card_id;
/* */
int max_weight_base[CLASS_COUNT];
- int hp_coefficient[CLASS_COUNT];
- int hp_coefficient2[CLASS_COUNT];
- int hp_sigma_val[CLASS_COUNT][MAX_LEVEL+1];
- int sp_coefficient[CLASS_COUNT];
+ int HP_table[CLASS_COUNT][MAX_LEVEL + 1];
+ int SP_table[CLASS_COUNT][MAX_LEVEL + 1];
int aspd_base[CLASS_COUNT][MAX_WEAPON_TYPE+1]; // +1 for RENEWAL_ASPD
sc_type Skill2SCTable[MAX_SKILL]; // skill -> status
int IconChangeTable[SC_MAX]; // status -> "icon" (icon is a bit of a misnomer, since there exist values with no icon associated)
@@ -2082,9 +2080,8 @@ struct status_interface {
void (*initDummyData) (void);
int (*base_amotion_pc) (struct map_session_data *sd, struct status_data *st);
unsigned short (*base_atk) (const struct block_list *bl, const struct status_data *st);
- void (*calc_sigma) (void);
- unsigned int (*base_pc_maxhp) (struct map_session_data *sd, struct status_data *st);
- unsigned int (*base_pc_maxsp) (struct map_session_data *sd, struct status_data *st);
+ unsigned int (*get_base_maxhp) (struct map_session_data *sd, struct status_data *st);
+ unsigned int (*get_base_maxsp) (struct map_session_data *sd, struct status_data *st);
int (*calc_npc_) (struct npc_data *nd, enum e_status_calc_opt opt);
unsigned short (*calc_str) (struct block_list *bl, struct status_change *sc, int str);
unsigned short (*calc_agi) (struct block_list *bl, struct status_change *sc, int agi);
@@ -2114,11 +2111,11 @@ struct status_interface {
void (*display_remove) (struct map_session_data *sd, enum sc_type type);
int (*natural_heal) (struct block_list *bl, va_list args);
int (*natural_heal_timer) (int tid, int64 tick, int id, intptr_t data);
- bool (*readdb_job1) (char *fields[], int columns, int current);
bool (*readdb_job2) (char *fields[], int columns, int current);
bool (*readdb_sizefix) (char *fields[], int columns, int current);
bool (*readdb_refine) (char *fields[], int columns, int current);
bool (*readdb_scconfig) (char *fields[], int columns, int current);
+ void (*read_job_db) (void);
};
struct status_interface *status;
diff --git a/src/map/unit.c b/src/map/unit.c
index 2e96e9c20..2dba10aeb 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -1604,7 +1604,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
unit->setdir(src, map->calc_dir(src, target->x, target->y));
ud->skilltimer = timer->add( tick+casttime, skill->castend_id, src->id, 0 );
if( sd && (pc->checkskill(sd,SA_FREECAST) > 0 || skill_id == LG_EXEEDBREAK) )
- status_calc_bl(&sd->bl, SCB_SPEED);
+ status_calc_bl(&sd->bl, SCB_SPEED|SCB_ASPD);
} else
skill->castend_id(ud->skilltimer,tick,src->id,0);
@@ -1747,8 +1747,9 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
if( casttime > 0 ) {
unit->setdir(src, map->calc_dir(src, skill_x, skill_y));
ud->skilltimer = timer->add( tick+casttime, skill->castend_pos, src->id, 0 );
- if( (sd && pc->checkskill(sd,SA_FREECAST) > 0) || skill_id == LG_EXEEDBREAK)
- status_calc_bl(&sd->bl, SCB_SPEED);
+ if ( (sd && pc->checkskill(sd, SA_FREECAST) > 0) || skill_id == LG_EXEEDBREAK ) {
+ status_calc_bl(&sd->bl, SCB_SPEED|SCB_ASPD);
+ }
} else {
ud->skilltimer = INVALID_TIMER;
skill->castend_pos(ud->skilltimer,tick,src->id,0);
@@ -2231,7 +2232,7 @@ int unit_skillcastcancel(struct block_list *bl,int type)
ud->skilltimer = INVALID_TIMER;
if( sd && pc->checkskill(sd,SA_FREECAST) > 0 )
- status_calc_bl(&sd->bl, SCB_SPEED);
+ status_calc_bl(&sd->bl, SCB_SPEED|SCB_ASPD);
if( sd ) {
switch( skill_id ) {
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
index 651b8efc3..d7a6cf672 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
@@ -3989,6 +3989,8 @@ struct {
struct HPMHookPoint *HP_pc_autotrade_prepare_post;
struct HPMHookPoint *HP_pc_autotrade_populate_pre;
struct HPMHookPoint *HP_pc_autotrade_populate_post;
+ struct HPMHookPoint *HP_pc_check_job_name_pre;
+ struct HPMHookPoint *HP_pc_check_job_name_post;
struct HPMHookPoint *HP_pet_init_pre;
struct HPMHookPoint *HP_pet_init_post;
struct HPMHookPoint *HP_pet_final_pre;
@@ -4979,12 +4981,10 @@ struct {
struct HPMHookPoint *HP_status_base_amotion_pc_post;
struct HPMHookPoint *HP_status_base_atk_pre;
struct HPMHookPoint *HP_status_base_atk_post;
- struct HPMHookPoint *HP_status_calc_sigma_pre;
- struct HPMHookPoint *HP_status_calc_sigma_post;
- struct HPMHookPoint *HP_status_base_pc_maxhp_pre;
- struct HPMHookPoint *HP_status_base_pc_maxhp_post;
- struct HPMHookPoint *HP_status_base_pc_maxsp_pre;
- struct HPMHookPoint *HP_status_base_pc_maxsp_post;
+ struct HPMHookPoint *HP_status_get_base_maxhp_pre;
+ struct HPMHookPoint *HP_status_get_base_maxhp_post;
+ struct HPMHookPoint *HP_status_get_base_maxsp_pre;
+ struct HPMHookPoint *HP_status_get_base_maxsp_post;
struct HPMHookPoint *HP_status_calc_npc__pre;
struct HPMHookPoint *HP_status_calc_npc__post;
struct HPMHookPoint *HP_status_calc_str_pre;
@@ -5043,8 +5043,6 @@ struct {
struct HPMHookPoint *HP_status_natural_heal_post;
struct HPMHookPoint *HP_status_natural_heal_timer_pre;
struct HPMHookPoint *HP_status_natural_heal_timer_post;
- struct HPMHookPoint *HP_status_readdb_job1_pre;
- struct HPMHookPoint *HP_status_readdb_job1_post;
struct HPMHookPoint *HP_status_readdb_job2_pre;
struct HPMHookPoint *HP_status_readdb_job2_post;
struct HPMHookPoint *HP_status_readdb_sizefix_pre;
@@ -5053,6 +5051,8 @@ struct {
struct HPMHookPoint *HP_status_readdb_refine_post;
struct HPMHookPoint *HP_status_readdb_scconfig_pre;
struct HPMHookPoint *HP_status_readdb_scconfig_post;
+ struct HPMHookPoint *HP_status_read_job_db_pre;
+ struct HPMHookPoint *HP_status_read_job_db_post;
struct HPMHookPoint *HP_storage_reconnect_pre;
struct HPMHookPoint *HP_storage_reconnect_post;
struct HPMHookPoint *HP_storage_delitem_pre;
@@ -9196,6 +9196,8 @@ struct {
int HP_pc_autotrade_prepare_post;
int HP_pc_autotrade_populate_pre;
int HP_pc_autotrade_populate_post;
+ int HP_pc_check_job_name_pre;
+ int HP_pc_check_job_name_post;
int HP_pet_init_pre;
int HP_pet_init_post;
int HP_pet_final_pre;
@@ -10186,12 +10188,10 @@ struct {
int HP_status_base_amotion_pc_post;
int HP_status_base_atk_pre;
int HP_status_base_atk_post;
- int HP_status_calc_sigma_pre;
- int HP_status_calc_sigma_post;
- int HP_status_base_pc_maxhp_pre;
- int HP_status_base_pc_maxhp_post;
- int HP_status_base_pc_maxsp_pre;
- int HP_status_base_pc_maxsp_post;
+ int HP_status_get_base_maxhp_pre;
+ int HP_status_get_base_maxhp_post;
+ int HP_status_get_base_maxsp_pre;
+ int HP_status_get_base_maxsp_post;
int HP_status_calc_npc__pre;
int HP_status_calc_npc__post;
int HP_status_calc_str_pre;
@@ -10250,8 +10250,6 @@ struct {
int HP_status_natural_heal_post;
int HP_status_natural_heal_timer_pre;
int HP_status_natural_heal_timer_post;
- int HP_status_readdb_job1_pre;
- int HP_status_readdb_job1_post;
int HP_status_readdb_job2_pre;
int HP_status_readdb_job2_post;
int HP_status_readdb_sizefix_pre;
@@ -10260,6 +10258,8 @@ struct {
int HP_status_readdb_refine_post;
int HP_status_readdb_scconfig_pre;
int HP_status_readdb_scconfig_post;
+ int HP_status_read_job_db_pre;
+ int HP_status_read_job_db_post;
int HP_storage_reconnect_pre;
int HP_storage_reconnect_post;
int HP_storage_delitem_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
index 5cbc20541..05ceb4ab1 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
@@ -2026,6 +2026,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(pc->autotrade_start, HP_pc_autotrade_start) },
{ HP_POP(pc->autotrade_prepare, HP_pc_autotrade_prepare) },
{ HP_POP(pc->autotrade_populate, HP_pc_autotrade_populate) },
+ { HP_POP(pc->check_job_name, HP_pc_check_job_name) },
/* pet */
{ HP_POP(pet->init, HP_pet_init) },
{ HP_POP(pet->final, HP_pet_final) },
@@ -2527,9 +2528,8 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(status->initDummyData, HP_status_initDummyData) },
{ HP_POP(status->base_amotion_pc, HP_status_base_amotion_pc) },
{ HP_POP(status->base_atk, HP_status_base_atk) },
- { HP_POP(status->calc_sigma, HP_status_calc_sigma) },
- { HP_POP(status->base_pc_maxhp, HP_status_base_pc_maxhp) },
- { HP_POP(status->base_pc_maxsp, HP_status_base_pc_maxsp) },
+ { HP_POP(status->get_base_maxhp, HP_status_get_base_maxhp) },
+ { HP_POP(status->get_base_maxsp, HP_status_get_base_maxsp) },
{ HP_POP(status->calc_npc_, HP_status_calc_npc_) },
{ HP_POP(status->calc_str, HP_status_calc_str) },
{ HP_POP(status->calc_agi, HP_status_calc_agi) },
@@ -2559,11 +2559,11 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(status->display_remove, HP_status_display_remove) },
{ HP_POP(status->natural_heal, HP_status_natural_heal) },
{ HP_POP(status->natural_heal_timer, HP_status_natural_heal_timer) },
- { HP_POP(status->readdb_job1, HP_status_readdb_job1) },
{ HP_POP(status->readdb_job2, HP_status_readdb_job2) },
{ HP_POP(status->readdb_sizefix, HP_status_readdb_sizefix) },
{ HP_POP(status->readdb_refine, HP_status_readdb_refine) },
{ HP_POP(status->readdb_scconfig, HP_status_readdb_scconfig) },
+ { HP_POP(status->read_job_db, HP_status_read_job_db) },
/* storage */
{ HP_POP(storage->reconnect, HP_storage_reconnect) },
{ HP_POP(storage->delitem, HP_storage_delitem) },
diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
index 3b2c3f08f..8f7c4f0b4 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -53389,6 +53389,33 @@ void HP_pc_autotrade_populate(struct map_session_data *sd) {
}
return;
}
+int HP_pc_check_job_name(const char *name) {
+ int hIndex = 0;
+ int retVal___ = 0;
+ if( HPMHooks.count.HP_pc_check_job_name_pre ) {
+ int (*preHookFunc) (const char *name);
+ *HPMforce_return = false;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_check_job_name_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_pc_check_job_name_pre[hIndex].func;
+ retVal___ = preHookFunc(name);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.pc.check_job_name(name);
+ }
+ if( HPMHooks.count.HP_pc_check_job_name_post ) {
+ int (*postHookFunc) (int retVal___, const char *name);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_check_job_name_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_pc_check_job_name_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, name);
+ }
+ }
+ return retVal___;
+}
/* pet */
int HP_pet_init(bool minimal) {
int hIndex = 0;
@@ -66962,40 +66989,14 @@ unsigned short HP_status_base_atk(const struct block_list *bl, const struct stat
}
return retVal___;
}
-void HP_status_calc_sigma(void) {
- int hIndex = 0;
- if( HPMHooks.count.HP_status_calc_sigma_pre ) {
- void (*preHookFunc) (void);
- *HPMforce_return = false;
- for(hIndex = 0; hIndex < HPMHooks.count.HP_status_calc_sigma_pre; hIndex++ ) {
- preHookFunc = HPMHooks.list.HP_status_calc_sigma_pre[hIndex].func;
- preHookFunc();
- }
- if( *HPMforce_return ) {
- *HPMforce_return = false;
- return;
- }
- }
- {
- HPMHooks.source.status.calc_sigma();
- }
- if( HPMHooks.count.HP_status_calc_sigma_post ) {
- void (*postHookFunc) (void);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_status_calc_sigma_post; hIndex++ ) {
- postHookFunc = HPMHooks.list.HP_status_calc_sigma_post[hIndex].func;
- postHookFunc();
- }
- }
- return;
-}
-unsigned int HP_status_base_pc_maxhp(struct map_session_data *sd, struct status_data *st) {
+unsigned int HP_status_get_base_maxhp(struct map_session_data *sd, struct status_data *st) {
int hIndex = 0;
unsigned int retVal___ = 0;
- if( HPMHooks.count.HP_status_base_pc_maxhp_pre ) {
+ if( HPMHooks.count.HP_status_get_base_maxhp_pre ) {
unsigned int (*preHookFunc) (struct map_session_data *sd, struct status_data *st);
*HPMforce_return = false;
- for(hIndex = 0; hIndex < HPMHooks.count.HP_status_base_pc_maxhp_pre; hIndex++ ) {
- preHookFunc = HPMHooks.list.HP_status_base_pc_maxhp_pre[hIndex].func;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_status_get_base_maxhp_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_status_get_base_maxhp_pre[hIndex].func;
retVal___ = preHookFunc(sd, st);
}
if( *HPMforce_return ) {
@@ -67004,25 +67005,25 @@ unsigned int HP_status_base_pc_maxhp(struct map_session_data *sd, struct status_
}
}
{
- retVal___ = HPMHooks.source.status.base_pc_maxhp(sd, st);
+ retVal___ = HPMHooks.source.status.get_base_maxhp(sd, st);
}
- if( HPMHooks.count.HP_status_base_pc_maxhp_post ) {
+ if( HPMHooks.count.HP_status_get_base_maxhp_post ) {
unsigned int (*postHookFunc) (unsigned int retVal___, struct map_session_data *sd, struct status_data *st);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_status_base_pc_maxhp_post; hIndex++ ) {
- postHookFunc = HPMHooks.list.HP_status_base_pc_maxhp_post[hIndex].func;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_status_get_base_maxhp_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_status_get_base_maxhp_post[hIndex].func;
retVal___ = postHookFunc(retVal___, sd, st);
}
}
return retVal___;
}
-unsigned int HP_status_base_pc_maxsp(struct map_session_data *sd, struct status_data *st) {
+unsigned int HP_status_get_base_maxsp(struct map_session_data *sd, struct status_data *st) {
int hIndex = 0;
unsigned int retVal___ = 0;
- if( HPMHooks.count.HP_status_base_pc_maxsp_pre ) {
+ if( HPMHooks.count.HP_status_get_base_maxsp_pre ) {
unsigned int (*preHookFunc) (struct map_session_data *sd, struct status_data *st);
*HPMforce_return = false;
- for(hIndex = 0; hIndex < HPMHooks.count.HP_status_base_pc_maxsp_pre; hIndex++ ) {
- preHookFunc = HPMHooks.list.HP_status_base_pc_maxsp_pre[hIndex].func;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_status_get_base_maxsp_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_status_get_base_maxsp_pre[hIndex].func;
retVal___ = preHookFunc(sd, st);
}
if( *HPMforce_return ) {
@@ -67031,12 +67032,12 @@ unsigned int HP_status_base_pc_maxsp(struct map_session_data *sd, struct status_
}
}
{
- retVal___ = HPMHooks.source.status.base_pc_maxsp(sd, st);
+ retVal___ = HPMHooks.source.status.get_base_maxsp(sd, st);
}
- if( HPMHooks.count.HP_status_base_pc_maxsp_post ) {
+ if( HPMHooks.count.HP_status_get_base_maxsp_post ) {
unsigned int (*postHookFunc) (unsigned int retVal___, struct map_session_data *sd, struct status_data *st);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_status_base_pc_maxsp_post; hIndex++ ) {
- postHookFunc = HPMHooks.list.HP_status_base_pc_maxsp_post[hIndex].func;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_status_get_base_maxsp_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_status_get_base_maxsp_post[hIndex].func;
retVal___ = postHookFunc(retVal___, sd, st);
}
}
@@ -67828,33 +67829,6 @@ int HP_status_natural_heal_timer(int tid, int64 tick, int id, intptr_t data) {
}
return retVal___;
}
-bool HP_status_readdb_job1(char *fields[], int columns, int current) {
- int hIndex = 0;
- bool retVal___ = false;
- if( HPMHooks.count.HP_status_readdb_job1_pre ) {
- bool (*preHookFunc) (char *fields[], int *columns, int *current);
- *HPMforce_return = false;
- for(hIndex = 0; hIndex < HPMHooks.count.HP_status_readdb_job1_pre; hIndex++ ) {
- preHookFunc = HPMHooks.list.HP_status_readdb_job1_pre[hIndex].func;
- retVal___ = preHookFunc(fields, &columns, &current);
- }
- if( *HPMforce_return ) {
- *HPMforce_return = false;
- return retVal___;
- }
- }
- {
- retVal___ = HPMHooks.source.status.readdb_job1(fields, columns, current);
- }
- if( HPMHooks.count.HP_status_readdb_job1_post ) {
- bool (*postHookFunc) (bool retVal___, char *fields[], int *columns, int *current);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_status_readdb_job1_post; hIndex++ ) {
- postHookFunc = HPMHooks.list.HP_status_readdb_job1_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, fields, &columns, &current);
- }
- }
- return retVal___;
-}
bool HP_status_readdb_job2(char *fields[], int columns, int current) {
int hIndex = 0;
bool retVal___ = false;
@@ -67963,6 +67937,32 @@ bool HP_status_readdb_scconfig(char *fields[], int columns, int current) {
}
return retVal___;
}
+void HP_status_read_job_db(void) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_status_read_job_db_pre ) {
+ void (*preHookFunc) (void);
+ *HPMforce_return = false;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_status_read_job_db_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_status_read_job_db_pre[hIndex].func;
+ preHookFunc();
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.status.read_job_db();
+ }
+ if( HPMHooks.count.HP_status_read_job_db_post ) {
+ void (*postHookFunc) (void);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_status_read_job_db_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_status_read_job_db_post[hIndex].func;
+ postHookFunc();
+ }
+ }
+ return;
+}
/* storage */
void HP_storage_reconnect(void) {
int hIndex = 0;