Przeglądaj źródła

-Add max hpsp table, (Offi) thx Daegaladh.
-Cleanup code:
--Fix sv_read line limitation to 1024char, now limited to 512char per column
--Change db read output to display number of line read
--Remove code duplicated that was acting like sv_read
--Move job_var[JOB_COUNT] into 1struct job_info.
--Move job related db into pc.c instead status, and those in pc that affect all into status


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@17391 54d463be-8e91-2dee-dedb-b68131a5f0ec

glighta 12 lat temu
rodzic
commit
185b6b2d5e
14 zmienionych plików z 943 dodań i 595 usunięć
  1. 42 41
      db/mob_chat_db.txt
  2. 165 0
      db/pre-re/job_maxhpsp_db.txt
  3. 79 79
      db/re/job_db1.txt
  4. 9 0
      db/re/job_exp.txt
  5. 166 0
      db/re/job_maxhpsp_db.txt
  6. 41 17
      src/common/strlib.c
  7. 4 3
      src/map/clif.c
  8. 66 65
      src/map/itemdb.c
  9. 1 0
      src/map/map.h
  10. 20 85
      src/map/mob.c
  11. 241 154
      src/map/pc.c
  12. 23 5
      src/map/pc.h
  13. 1 1
      src/map/skill.c
  14. 85 145
      src/map/status.c

+ 42 - 41
db/mob_chat_db.txt

@@ -1,45 +1,46 @@
 // Monster Chat Database
 //
 // Structure of Database:
-// Line_ID,Color_Code,Dialog
+// Line_ID#Color_Code#Dialog
+
+1#0xFF0000#Weakling! Challenge me if you have any courage!
+2#0xFF0000#Impressive! I wonder how far your recklessness will take you.
+3#0xFF0000#I almost pity how outmatched you are against me. Now prepare for my attack!
+4#0xFF0000#My loyal servants! Welcome them with a painful death!
+5#0xFF0000#Don't you run away!
+6#0xFF0000#You worthless humans. Your so-called holy powers have no effect on me!
+7#0xFF0000#Useless underlings!...Well, that's fine, I have more weapons to use and dispose.
+8#0xFF0000#Pray to your gods!
+9#0xFF0000#Do you still think you're a match to me?!
+10#0xFF0000#Vanish!
+11#0xFF0000#Let's see how long you can endure my power!
+12#0xFF0000#Is this all you've got?!
+13#0xFF0000#You're tickling me!
+14#0xFF0000#This is how you attack? Watch and learn, weaklings!
+15#0xFF0000#It's time to finish the game!
+16#0xFF0000#Oh, you're stronger than I thought!
+17#0xFF0000#No, this can't be happening! I'm Satan Morroc, Demon King of Destruction!
+18#0xFF0000#I can never die! I'll be coming back for you!
+19#0xFF0000#I was born to conquer this world! None shall stop me!
+20#0xFF0000#Your days are numbered!
+21#0xFF0000#Pulse Strike! My fingers tear steel!
+22#0xFF0000#Hahaha, tell me who I am! I'm Baphomet, the Heir of Hell!
+23#0xFF0000#Enjoy your time on the mortal plane while you can, your hope will soon turn into despair!
+24#0xFF0000#When are you going to learn your lesson? In death?
+25#0xFF0000#No... I can't lose! I won't beg for my life! I'm not running away! I don't accept this as defeat!
+26#0xFF0000#Argh... I... I'm weakening...
+27#0xFF0000#What do you want from me?
+28#0xFF0000#No! I didn't do this! He's the one who planned out all this!
+29#0xFF0000#I just wanted to find peace..!  That's why I have been fleeing away!
+30#0xFF0000#Ahhhh!!! Now, I just have to kill you all!
+31#0xFF0000#Annoying flies!! Get off of me!
+32#0xFF0000#Suffer in Hell!
+33#0xFF0000#Mwahahaha! Taste the anger of the earth!!!
+34#0xFF0000#No... I won't accept this as defeat!
+35#0xFF0000#Will it ease your loneliness to hit me?  Why don't you stay here with me forever, human?
+36#0xFF0000#You will forgot the meaning of time.  I wonder how long can you last in here...
+37#0xFF0000#Is there anyone waiting for you outside of here?  Throw them all away, you are mine now...
+38#0xFF0000#Discard your life and stay confined here.  You will yearn for freedom in captivity !!
+39#0xFF0000#How much will the outside world change if you stay here in solitude for one thousand years?
+40#0xFF0000#Yes! Yearn for your freedom from this confined place, your captivity here will be permanent !!
 
-1,0xFF0000,Weakling! Challenge me if you have any courage!
-2,0xFF0000,Impressive! I wonder how far your recklessness will take you.
-3,0xFF0000,I almost pity how outmatched you are against me. Now prepare for my attack!
-4,0xFF0000,My loyal servants! Welcome them with a painful death!
-5,0xFF0000,Don't you run away!
-6,0xFF0000,You worthless humans. Your so-called holy powers have no effect on me!
-7,0xFF0000,Useless underlings!...Well, that's fine, I have more weapons to use and dispose.
-8,0xFF0000,Pray to your gods!
-9,0xFF0000,Do you still think you're a match to me?!
-10,0xFF0000,Vanish!
-11,0xFF0000,Let's see how long you can endure my power!
-12,0xFF0000,Is this all you've got?!
-13,0xFF0000,You're tickling me!
-14,0xFF0000,This is how you attack? Watch and learn, weaklings!
-15,0xFF0000,It's time to finish the game!
-16,0xFF0000,Oh, you're stronger than I thought!
-17,0xFF0000,No, this can't be happening! I'm Satan Morroc, Demon King of Destruction!
-18,0xFF0000,I can never die! I'll be coming back for you!
-19,0xFF0000,I was born to conquer this world! None shall stop me!
-20,0xFF0000,Your days are numbered!
-21,0xFF0000,Pulse Strike! My fingers tear steel!
-22,0xFF0000,Hahaha, tell me who I am! I'm Baphomet, the Heir of Hell!
-23,0xFF0000,Enjoy your time on the mortal plane while you can, your hope will soon turn into despair!
-24,0xFF0000,When are you going to learn your lesson? In death?
-25,0xFF0000,No... I can't lose! I won't beg for my life! I'm not running away! I don't accept this as defeat!
-26,0xFF0000,Argh... I... I'm weakening...
-27,0xFF0000,What do you want from me?
-28,0xFF0000,No! I didn't do this! He's the one who planned out all this!
-29,0xFF0000,I just wanted to find peace..!  That's why I have been fleeing away!
-30,0xFF0000,Ahhhh!!! Now, I just have to kill you all!
-31,0xFF0000,Annoying flies!! Get off of me!
-32,0xFF0000,Suffer in Hell!
-33,0xFF0000,Mwahahaha! Taste the anger of the earth!!!
-34,0xFF0000,No... I won't accept this as defeat!
-35,0xFF0000,Will it ease your loneliness to hit me?  Why don't you stay here with me forever, human?
-36,0xFF0000,You will forgot the meaning of time.  I wonder how long can you last in here...
-37,0xFF0000,Is there anyone waiting for you outside of here?  Throw them all away, you are mine now...
-38,0xFF0000,Discard your life and stay confined here.  You will yearn for freedom in captivity !!
-39,0xFF0000,How much will the outside world change if you stay here in solitude for one thousand years?
-40,0xFF0000,Yes! Yearn for your freedom from this confined place, your captivity here will be permanent !!

+ 165 - 0
db/pre-re/job_maxhpsp_db.txt

@@ -0,0 +1,165 @@
+//MaxHP & MaxSP tables format:
+//Max Level,Class list,Type,Max value for Lv 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
+//Type (0 - MaxHP; 1 - MaxSP) 
+//===================================
+// Pre-Renewal MaxHP & MaxSP Database
+//===================================
+ 
+//MaxHP - Novice/Super Novice/Novice High/Baby Novice/Baby Super Novice
+1,99,0:23:4001:4023:4045,0,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,260,265,270,275,280,285,290,295,300,305,310,315,320,325,330,335,340,345,350,355,360,365,370,375,380,385,390,395,400,405,410,415,420,425,430,435,440,445,450,455,460,465,470,475,480,485,490,495,500,505,510,515,520,525,530
+ 
+//MaxHP - Swordman/Swordman High/Baby Swordman
+1,99,1:4002:4024,0,40,46,53,61,70,79,89,100,111,123,136,149,163,178,194,210,227,245,263,282,302,322,343,365,388,411,435,460,485,511,538,565,593,622,652,682,713,745,777,810,844,878,913,949,986,1023,1061,1100,1139,1179,1220,1261,1303,1346,1390,1434,1479,1525,1571,1618,1666,1714,1763,1813,1864,1915,1967,2020,2073,2127,2182,2237,2293,2350,2408,2466,2525,2585,2645,2706,2768,2830,2893,2957,3022,3087,3153,3220,3287,3355,3424,3493,3563,3634,3706,3778,3851,3925,3999
+ 
+//MaxHP - Magician/Magician High/Baby Magician
+1,99,2:4003:4025,0,40,46,52,58,65,72,79,86,94,102,110,119,128,137,147,157,167,177,188,199,210,222,234,246,259,272,285,298,312,326,340,355,370,385,401,417,433,449,466,483,500,518,536,554,573,592,611,630,650,670,690,711,732,753,775,797,819,841,864,887,910,934,958,982,1007,1032,1057,1082,1108,1134,1160,1187,1214,1241,1269,1297,1325,1353,1382,1411,1440,1470,1500,1530,1561,1592,1623,1654,1686,1718,1750,1783,1816,1849,1883,1917,1951,1985,2020
+ 
+//MaxHP - Archer/Thief/Archer High/Thief High/Baby Archer/Baby Thief
+1,99,3:6:4004:4007:4026:4029,0,40,46,53,60,68,76,85,94,104,114,125,136,148,160,173,186,200,214,229,244,260,276,293,310,328,346,365,384,404,424,445,466,488,510,533,556,580,604,629,654,680,706,733,760,788,816,845,874,904,934,965,996,1028,1060,1093,1126,1160,1194,1229,1264,1300,1336,1373,1410,1448,1486,1525,1564,1604,1644,1685,1726,1768,1810,1853,1896,1940,1984,2029,2074,2120,2166,2213,2260,2308,2356,2405,2454,2504,2554,2605,2656,2708,2760,2813,2866,2920,2974,3029
+ 
+//MaxHP - Acolyte/Merchant/Acolyte High/Merchant High/Baby Acolyte/Baby Merchant
+1,99,4:5:4005:4006:4027:4028,0,40,46,52,59,66,73,81,89,98,107,116,126,136,147,158,169,181,193,206,219,232,246,260,275,290,305,321,337,354,371,388,406,424,443,462,481,501,521,542,563,584,606,628,651,674,697,721,745,770,795,820,846,872,899,926,953,981,1009,1038,1067,1096,1126,1156,1187,1218,1249,1281,1313,1346,1379,1412,1446,1480,1515,1550,1585,1621,1657,1694,1731,1768,1806,1844,1883,1922,1961,2001,2041,2082,2123,2164,2206,2248,2291,2334,2377,2421,2465,2510
+ 
+//MaxHP - Knight/Knight (Peco)/Lord Knight/Lord Knight (Peco)/Baby Knight/Baby Knight (Peco)
+1,99,7:13:4008:4014:4030:4036,0,40,48,58,69,82,96,112,129,148,168,190,213,238,264,292,321,352,384,418,453,490,528,568,609,652,696,742,789,838,888,940,993,1048,1104,1162,1221,1282,1344,1408,1473,1540,1608,1678,1749,1822,1896,1972,2049,2128,2208,2290,2373,2458,2544,2632,2721,2812,2904,2998,3093,3190,3288,3388,3489,3592,3696,3802,3909,4018,4128,4240,4353,4468,4584,4702,4821,4942,5064,5188,5313,5440,5568,5698,5829,5962,6096,6232,6369,6508,6648,6790,6933,7078,7224,7372,7521,7672,7824,7978
+ 
+//MaxHP - Priest/Sage/High Priest/Professor/Baby Priest/Baby Sage
+1,99,8:16:4009:4017:4031:4039,0,40,47,54,62,71,81,91,102,114,127,140,154,169,185,201,218,236,255,274,294,315,337,359,382,406,431,456,482,509,537,565,594,624,655,686,718,751,785,819,854,890,927,964,1002,1041,1081,1121,1162,1204,1247,1290,1334,1379,1425,1471,1518,1566,1615,1664,1714,1765,1817,1869,1922,1976,2031,2086,2142,2199,2257,2315,2374,2434,2495,2556,2618,2681,2745,2809,2874,2940,3007,3074,3142,3211,3281,3351,3422,3494,3567,3640,3714,3789,3865,3941,4018,4096,4175,4254
+ 
+//MaxHP - Wizard/High Wizard/Baby Wizard
+1,99,9:4010:4032,0,40,46,53,60,68,76,85,94,104,115,126,138,150,163,176,190,204,219,234,250,267,284,302,320,339,358,378,398,419,441,463,486,509,533,557,582,607,633,659,686,714,742,771,800,830,860,891,922,954,987,1020,1054,1088,1123,1158,1194,1230,1267,1304,1342,1381,1420,1460,1500,1541,1582,1624,1666,1709,1753,1797,1842,1887,1933,1979,2026,2073,2121,2169,2218,2268,2318,2369,2420,2472,2524,2577,2630,2684,2739,2794,2850,2906,2963,3020,3078,3136,3195,3254
+ 
+//MaxHP - Blacksmith/Alchemist/Whitesmith/Creator/Baby Blacksmith/Baby Alchemist
+1,99,10:18:4011:4019:4033:4041,0,40,47,55,64,74,84,95,107,120,134,149,165,182,200,219,238,258,279,301,324,348,373,399,426,454,482,511,541,572,604,637,671,706,742,779,816,854,893,933,974,1016,1059,1103,1148,1194,1240,1287,1335,1384,1434,1485,1537,1590,1644,1699,1754,1810,1867,1925,1984,2044,2105,2167,2230,2294,2358,2423,2489,2556,2624,2693,2763,2834,2906,2979,3052,3126,3201,3277,3354,3432,3511,3591,3672,3754,3836,3919,4003,4088,4174,4261,4349,4438,4528,4619,4710,4802,4895,4989
+ 
+//MaxHP - Hunter/Rogue/Sniper/Stalker/Baby Hunter/Baby Rogue
+1,99,11:17:4012:4018:4034:4040,0,40,47,55,63,72,82,93,105,118,132,146,161,177,194,212,231,250,270,291,313,336,360,385,410,436,463,491,520,550,581,612,644,677,711,746,782,818,855,893,932,972,1013,1055,1097,1140,1184,1229,1275,1322,1370,1418,1467,1517,1568,1620,1673,1726,1780,1835,1891,1948,2006,2065,2124,2184,2245,2307,2370,2434,2499,2564,2630,2697,2765,2834,2904,2974,3045,3117,3190,3264,3339,3415,3491,3568,3646,3725,3805,3886,3968,4050,4133,4217,4302,4388,4475,4562,4650,4739
+ 
+//MaxHP - Assassin/Assassin Cross/Baby Assassin
+1,99,12:4013:4035,0,40,47,55,64,75,87,100,114,129,145,162,180,199,219,241,264,288,313,339,366,394,423,453,484,517,551,586,622,659,697,736,776,817,859,903,948,994,1041,1089,1138,1188,1239,1291,1344,1399,1455,1512,1570,1629,1689,1750,1812,1875,1939,2005,2072,2140,2209,2279,2350,2422,2495,2569,2644,2721,2799,2878,2958,3039,3121,3204,3288,3373,3459,3547,3636,3726,3817,3909,4002,4096,4191,4287,4384,4483,4583,4684,4786,4889,4993,5098,5204,5311,5419,5529,5640,5752,5865,5979
+ 
+//MaxHP - Crusader/Crusader (Peco)/Paladin/Paladin (Peco)/Baby Crusader/Baby Crusader (Peco)
+1,99,14:21:4015:4022:4037:4044,0,40,47,56,62,81,94,108,128,147,165,184,204,225,247,271,296,322,349,377,406,436,467,499,532,567,603,640,678,717,757,798,840,883,927,973,1020,1068,1117,1167,1218,1270,1323,1377,1432,1489,1547,1606,1666,1727,1789,1852,1916,1981,2047,2115,2184,2254,2325,2397,2470,2544,2619,2695,2772,2851,2931,3012,3094,3177,3261,3346,3432,3519,3607,3697,3788,3880,3973,4067,4162,4258,4355,4453,4552,4653,4755,4858,4962,5067,5173,5280,5388,5497,5607,5719,5832,5946,6061,6177
+ 
+//MaxHP - Monk/Champion/Baby Monk
+1,99,15:4016:4038,0,40,47,55,64,74,84,95,107,120,134,149,165,182,200,219,238,258,306,329,354,379,406,433,462,491,521,551,583,615,649,683,719,755,793,831,870,909,950,991,1034,1077,1122,1167,1214,1261,1309,1357,1407,1457,1509,1561,1615,1669,1725,1781,1838,1895,1954,2013,2074,2135,2198,2261,2326,2391,2457,2523,2591,2659,2729,2799,2871,2943,3017,3091,3166,3241,3318,3395,3474,3553,3634,3715,3798,3881,3965,4049,4135,4221,4309,4397,4487,4577,4669,4761,4854,4947,5042,5137
+ 
+//MaxHP - Bard/Dancer/Clown/Gypsy/Baby Bard/Baby Dancer
+1,99,19:20:4020:4021:4042:4043,0,40,47,54,62,71,81,91,102,114,127,140,154,169,180,196,212,224,242,260,278,296,316,330,350,371,393,415,438,451,477,503,530,558,587,616,646,677,709,741,774,808,843,878,914,951,989,1027,1066,1106,1147,1188,1230,1273,1317,1361,1406,1452,1499,1546,1594,1643,1693,1743,1794,1846,1899,1952,2006,2061,2117,2173,2230,2288,2347,2406,2466,2527,2589,2651,2714,2778,2843,2908,2974,3041,3109,3177,3246,3316,3387,3458,3530,3603,3677,3751,3826,3902,3979,4056
+ 
+//MaxHP - Gunslinger
+1,99,24,0,40,47,54,61,69,77,85,94,103,202,212,222,232,243,254,265,277,289,301,316,331,346,364,382,400,420,440,460,490,520,550,580,610,650,680,710,740,770,800,830,865,890,925,955,990,1025,1050,1080,1110,1145,1180,1215,1275,1335,1395,1455,1515,1575,1635,1695,1760,1820,1885,1950,2015,2080,2145,2210,2275,2340,2410,2480,2550,2620,2690,2760,2830,2900,2970,3040,3115,3190,3265,3340,3415,3490,3565,3640,3715,3790,3870,3950,4030,4110,4190,4270,4350,4430,4510
+ 
+//MaxHP - Ninja
+1,99,25,0,40,47,54,61,69,77,85,94,103,202,212,222,232,243,254,265,277,289,301,316,331,346,364,382,400,420,440,460,482,504,526,548,572,596,620,646,672,698,726,754,784,814,844,876,908,940,975,1010,1100,1140,1180,1220,1260,1300,1340,1385,1430,1475,1520,1565,1615,1665,1715,1765,1815,1880,1935,1990,2045,2100,2160,2220,2280,2340,2400,2460,2520,2580,2640,2705,2770,2835,2900,2965,3030,3100,3170,3240,3310,3380,3455,3530,3605,3680,3760,3840,3920,4000,4080
+ 
+//MaxHP - Taekwon
+1,99,4046,0,40,46,53,61,70,79,89,100,111,123,136,149,163,178,194,210,227,245,263,282,302,322,343,365,388,411,435,460,485,511,538,565,593,622,652,682,713,745,777,810,844,878,913,949,986,1023,1061,1100,1139,1179,1220,1261,1303,1346,1390,1434,1479,1525,1571,1618,1666,1714,1763,1813,1864,1915,1967,2020,2073,2127,2137,2147,2157,2167,2177,2187,2197,2200,2210,2230,2250,2300,2350,2400,2450,2500,2550,2600,2650,2700,2750,2800,2850,2900,2950,3000,3050,3100,3200
+ 
+//MaxHP - Star Knight/Star Knight (flying)
+1,99,4047:4048,0,40,47,55,64,74,84,95,107,120,134,149,165,182,200,219,238,258,306,329,354,379,406,433,462,491,521,551,583,615,649,683,719,755,793,831,870,909,950,991,1034,1077,1122,1167,1214,1261,1309,1357,1407,1457,1509,1561,1615,1669,1725,1781,1838,1895,1954,2013,2074,2135,2198,2261,2326,2391,2457,2523,2591,2659,2670,2680,2690,2700,2710,2720,2730,2740,2750,2760,3000,3020,3040,3060,3080,3100,3120,3140,3160,3180,3455,3524,3593,3663,3734,3806,3878,3951,4025,4500
+ 
+//MaxHP - Soul Linker
+1,99,4049,0,40,47,54,62,71,81,91,102,114,127,140,154,169,185,201,218,236,255,274,294,315,337,359,382,406,431,456,482,509,537,565,594,624,655,686,718,751,785,819,854,890,927,964,1002,1041,1081,1121,1162,1204,1247,1290,1334,1379,1425,1471,1518,1566,1615,1664,1714,1765,1817,1869,1922,1976,2031,2086,2142,2199,2257,2275,2294,2314,2335,2356,2378,2401,2425,2449,2874,2890,2907,2924,2942,2971,2991,3011,3032,3054,3567,3590,3614,3649,3675,3701,3728,3756,3800,4250
+ 
+//MaxHP - Munak/Bongun
+1,99,4050,0,40,46,52,59,66,73,81,89,98,107,116,126,136,147,158,169,181,193,206,219,232,246,260,275,290,305,321,337,354,371,388,406,424,443,462,481,501,521,542,563,584,606,628,651,674,697,721,745,770,795,820,846,872,899,926,953,981,1009,1038,1067,1096,1126,1156,1187,1218,1249,1281,1313,1346,1379,1412,1446,1480,1515,1550,1585,1621,1657,1694,1731,1768,1806,1844,1883,1922,1961,2001,2041,2082,2123,2164,2206,2248,2291,2334,2377,2421,2465,2510
+ 
+//MaxHP - Death Knight
+1,99,4051,0,40,48,58,69,82,96,112,129,148,168,190,213,238,264,292,321,352,384,418,453,490,528,568,609,652,696,742,789,838,888,940,993,1048,1104,1162,1221,1282,1344,1408,1473,1540,1608,1678,1749,1822,1896,1972,2049,2128,2208,2290,2373,2458,2544,2632,2721,2812,2904,2998,3093,3190,3288,3388,3489,3592,3696,3802,3909,4018,4128,4240,4353,4468,4584,4702,4821,4942,5064,5188,5313,5440,5568,5698,5829,5962,6096,6232,6369,6508,6648,6790,6933,7078,7224,7372,7521,7672,7824,7978
+ 
+//MaxHP - Dark Collector
+1,99,4052,0,40,47,54,62,71,81,91,102,114,127,140,154,169,185,201,218,236,255,274,294,315,337,359,382,406,431,456,482,509,537,565,594,624,655,686,718,751,785,819,854,890,927,964,1002,1041,1081,1121,1162,1204,1247,1290,1334,1379,1425,1471,1518,1566,1615,1664,1714,1765,1817,1869,1922,1976,2031,2086,2142,2199,2257,2315,2374,2434,2495,2556,2618,2681,2745,2809,2874,2940,3007,3074,3142,3211,3281,3351,3422,3494,3567,3640,3714,3789,3865,3941,4018,4096,4175,4254
+ 
+//MaxHP - Rune Knight/Rune Knight_T/Rune Knight (Dragon)/Rune Knight (Dragon)_T
+99,150,4054:4060:4080:4081:4096:4109,0,8100,8133,8242,8352,8464,8576,8690,8804,8920,9036,9154,9273,9393,9514,9636,9759,9883,10008,10134,10261,10389,10518,10648,10779,10912,11045,11180,11315,11452,11589,11728,11868,12009,12151,12294,12438,12583,12729,12876,13024,13173,13323,13474,13626,13780,13934,14090,14246,14404,14562,14722,14883
+ 
+//MaxHP - Warlock/Warlock_T
+99,150,4055:4061:4097,0,3200,3313,3383,3455,3528,3601,3675,3749,3824,3899,3975,4051,4129,4208,4287,4367,4447,4528,4609,4691,4773,4857,4941,5026,5112,5198,5285,5372,5460,5548,5638,5728,5819,5911,6003,6096,6189,6283,6377,6473,6569,6666,6763,6861,6960,7059,7159,7259,7361,7463,7566,7669
+ 
+//MaxHP - Ranger/Ranger_T/Minstrel/Wanderer/Minstrel_T/Wanderer_T/Ranger (Warg)/Ranger (Warg)_T
+99,150,4056:4062:4068:4069:4075:4076:4084:4085:4098:4104:4105:4111,0,4800,4828,4918,5009,5101,5194,5288,5382,5477,5573,5670,5768,5867,5967,6068,6170,6273,6377,6482,6588,6694,6801,6909,7018,7128,7239,7351,7464,7578,7693,7809,7926,8044,8162,8281,8401,8522,8644,8767,8891,9016,9142,9269,9397,9526,9656,9786,9917,10049,10182,10316,10451
+ 
+//MaxHP - Arch Bishop/Arch Bishop_T
+99,150,4057:4063:4099,0,4300,4333,4412,4491,4570,4649,4728,4807,4886,4965,5044,5123,5202,5281,5360,5439,5518,5597,5676,5755,5834,5913,5992,6071,6150,6229,6308,6387,6466,6545,6624,6703,6782,6861,6940,7019,7098,7177,7256,7335,7414,7493,7572,7651,7730,7809,7888,7967,8046,8125,8204,8283
+ 
+//MaxHP - Mechanic/Mechanic_T/Sura/Sura_T/Mechanic (Mado Gear)/Mechanic (Mado Gear)_T
+99,150,4058:4064:4086:4087:4100:4112,0,5807,5844,5952,6061,6172,6283,6396,6510,6625,6741,6857,6974,7093,7212,7333,7455,7578,7702,7828,7954,8081,8208,8337,8467,8598,8730,8864,8998,9134,9271,9408,9546,9685,9825,9967,10109,10253,10398,10544,10691,10838,10987,11136,11287,11439,11592,11746,11901,12057,12215,12372,12531
+ 
+//MaxHP - Guillotine Cross/Guillotine Cross_T/Royal Guard/Shadow Chaser/Royal Guard_T/Shadow Chaser_T/Royal Guard (Gryphon)/Royal Guard (Gryphon)_T
+99,150,4059:4065:4066:4072:4073:4079:4082:4083:4101:4102:4108:4110,0,6050,6093,6208,6324,6441,6559,6678,6798,6920,7043,7167,7292,7418,7545,7673,7802,7932,8063,8196,8330,8465,8601,8738,8876,9015,9155,9296,9438,9582,9727,9873,10020,10168,10317,10467,10618,10770,10923,11078,11234,11391,11549,11708,11868,12029,12191,12354,12518,12684,12851,13019,13188
+ 
+//MaxHP - Sorcerer/Sorcerer_T
+99,150,4067:4074:4103,0,4080,4103,4180,4257,4335,4414,4494,4574,4655,4737,4819,4902,4986,5071,5157,5244,5332,5420,5509,5599,5689,5780,5872,5965,6058,6153,6248,6344,6441,6539,6637,6737,6837,6937,7038,7140,7243,7347,7451,7557,7663,7770,7878,7987,8097,8207,8318,8429,8541,8654,8768,8883
+ 
+//MaxHP - Sura/Sura_T
+99,150,4070:4077:4106,0,5050,5082,5176,5271,5367,5464,5562,5661,5761,5862,5963,6065,6168,6272,6377,6483,6590,6698,6807,6917,7027,7138,7250,7363,7477,7592,7708,7825,7943,8062,8181,8301,8422,8544,8667,8791,8916,9042,9169,9297,9425,9554,9684,9815,9947,10080,10214,10349,10485,10622,10759,10897
+ 
+//MaxHP - Genetic/Genetic_T
+99,150,4071:4078:4107,0,4730,4766,4853,4940,5027,5113,5200,5287,5374,5461,5548,5635,5722,5809,5896,5982,6069,6156,6243,6330,6417,6504,6591,6678,6765,6851,6938,7025,7112,7199,7286,7373,7460,7547,7634,7720,7807,7894,7981,8068,8155,8242,8329,8416,8503,8589,8676,8763,8850,8937,9024,9111
+ 
+//MaxSP - Novice/Super Novice/Novice High/Baby Novice/Baby Super Novice
+1,99,0:23:4001:4023:4045,1,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109
+ 
+//MaxSP - Swordman/Archer/Thief/Swordman High/Archer High/Thief High/Baby Swordman/Baby Archer/Baby Thief
+1,99,1:3:6:4002:4004:4007:4024:4026:4029,1,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208
+ 
+//MaxSP - Magician/Bard/Dancer/Magician High/Clown/Gypsy/Baby Magician/Baby Bard/Baby Dancer
+1,99,2:19:20:4003:4020:4021:4025:4042:4043,1,16,22,28,34,40,46,52,58,64,70,76,82,88,94,100,106,112,118,124,130,136,142,148,154,160,166,172,178,184,190,196,202,208,214,220,226,232,238,244,250,256,262,268,274,280,286,292,298,304,310,316,322,328,334,340,346,352,358,364,370,376,382,388,394,400,406,412,418,424,430,436,442,448,454,460,466,472,478,484,490,496,502,508,514,520,526,532,538,544,550,556,562,568,574,580,586,592,598,604
+ 
+//MaxSP - Acolyte/Rogue/Acolyte High/Stalker/Baby Acolyte/Baby Rogue
+1,99,4:17:4005:4018:4027:4040,1,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,260,265,270,275,280,285,290,295,300,305,310,315,320,325,330,335,340,345,350,355,360,365,370,375,380,385,390,395,400,405,410,415,420,425,430,435,440,445,450,455,460,465,470,475,480,485,490,495,500,505
+ 
+//MaxSP - Merchant/Knight/Knight (Peco)/Merchant High/Lord Knight/Lord Knight (Peco)/Baby Merchant/Baby Knight/Baby Knight (Peco)
+1,99,5:7:13:4006:4008:4014:4028:4030:4036,1,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289,292,295,298,301,304,307
+ 
+//MaxSP - Priest/High Priest/Baby Priest
+1,99,8:4009:4031,1,18,26,34,42,50,58,66,74,82,90,98,106,114,122,130,138,146,154,162,170,178,186,194,202,210,218,226,234,242,250,258,266,274,282,290,298,306,314,322,330,338,346,354,362,370,378,386,394,402,410,418,426,434,442,450,458,466,474,482,490,498,506,514,522,530,538,546,554,562,570,578,586,594,602,610,618,626,634,642,650,658,666,674,682,690,698,706,714,722,730,738,746,754,762,770,778,786,794,802
+ 
+//MaxSP - Wizard/High Wizard/Baby Wizard
+1,99,9:4010:4032,1,19,28,37,46,55,64,73,82,91,100,109,118,127,136,145,154,163,172,181,190,199,208,217,226,235,244,253,262,271,280,289,298,307,316,325,334,343,352,361,370,379,388,397,406,415,424,433,442,451,460,469,478,487,496,505,514,523,532,541,550,559,568,577,586,595,604,613,622,631,640,649,658,667,676,685,694,703,712,721,730,739,748,757,766,775,784,793,802,811,820,829,838,847,856,865,874,883,892,901
+ 
+//MaxSP - Blacksmith/Hunter/Assassin/Alchemist/Whitesmith/Sniper/Assassin Cross/Creator/Baby Blacksmith/Baby Hunter/Baby Assassin/Baby Alchemist
+1,99,10:11:12:18:4011:4012:4013:4019:4033:4034:4035:4041,1,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294,298,302,306,310,314,318,322,326,330,334,338,342,346,350,354,358,362,366,370,374,378,382,386,390,394,398,402,406
+ 
+//MaxSP - Crusader/Monk/Crusader (Peco)/Paladin/Champion/Paladin (Peco)/Baby Crusader/Baby Monk/Baby Crusader (Peco)
+1,99,14:15:21:4015:4016:4022:4037:4038:4044,1,14,19,24,28,33,38,42,47,52,57,61,66,71,75,80,85,89,94,99,104,108,113,118,122,127,132,136,141,146,151,155,160,165,169,174,179,183,188,193,198,202,207,212,216,221,226,230,235,240,245,249,254,259,263,268,273,277,282,287,292,296,301,306,310,315,320,324,329,334,339,343,348,353,357,362,367,371,376,381,386,390,395,400,404,409,414,418,423,428,433,437,442,447,451,456,461,465,470,475
+ 
+//MaxSP - Sage/Professor/Baby Sage
+1,99,16:4017:4039,1,17,24,31,38,45,52,59,66,73,80,87,94,101,108,115,122,129,136,143,150,157,164,171,178,185,192,199,206,213,220,227,234,241,248,255,262,269,276,283,290,297,304,311,318,325,332,339,346,353,360,367,374,381,388,395,402,409,416,423,430,437,444,451,458,465,472,479,486,493,500,507,514,521,528,535,542,549,556,563,570,577,584,591,598,605,612,619,626,633,640,647,654,661,668,675,682,689,696,703
+ 
+//MaxSP - Gunslinger
+1,99,24,1,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,61,64,67,70,73,76,79,82,85,89,93,97,101,105,109,113,117,121,125,129,131,135,139,141,145,149,153,157,161,165,169,173,177,181,186,191,196,201,206,211,216,221,226,231,236,241,246,251,256,261,266,271,276,281,286,291,296,301,306,312,318,324,336,342,348,354,360,366,372,378,384,390,396,402,408,414,420,426,432,438,444,450,456
+ 
+//MaxSP - Ninja
+1,99,25,1,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59,62,65,68,71,75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,156,161,166,171,176,181,186,191,196,201,206,211,216,221,226,231,236,241,246,251,257,263,269,275,281,287,293,299,305,311,317,323,329,335,341,347,353,359,365,371,378,386,394,402,410,418,426,434,442,450,458,466,474,482,490,498,506,514,522
+ 
+//MaxSP - Taekwon
+1,99,4046,1,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,151,152,153,154,155,156,157,158,159,170,171,172,173,174,175,176,177,178,188,190,190,190,190,190,190,190,190,190,200
+ 
+//MaxSP - Star Knight/Star Knight (flying)
+1,99,4047:4048,1,14,19,24,28,33,38,42,47,52,57,61,66,71,75,80,85,89,94,99,104,108,113,118,122,127,132,136,141,146,151,155,160,165,169,174,179,183,188,193,198,202,207,212,216,221,226,230,235,240,245,249,254,259,263,268,273,277,282,287,292,296,301,306,310,315,320,324,329,334,339,341,343,345,347,349,351,353,355,357,386,388,390,392,394,396,398,400,402,404,430,433,436,439,442,445,448,451,454,500
+ 
+//MaxSP - Soul Linker
+1,99,4049,1,19,28,37,46,55,64,73,82,91,100,109,118,127,136,145,154,163,172,181,190,199,208,217,226,235,244,253,262,271,280,289,298,307,316,325,334,343,352,361,370,379,388,397,406,415,424,433,442,451,460,469,478,487,496,505,514,523,532,541,550,559,568,577,586,595,604,613,622,631,635,640,645,650,655,660,665,670,675,680,730,735,740,745,750,755,760,765,770,775,820,825,830,845,850,855,860,865,870,900
+ 
+//MaxSP - Munak/Bongun
+1,99,4050,1,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,260,265,270,275,280,285,290,295,300,305,310,315,320,325,330,335,340,345,350,355,360,365,370,375,380,385,390,395,400,405,410,415,420,425,430,435,440,445,450,455,460,465,470,475,480,485,490,495,500,505
+ 
+//MaxSP - Death Knight
+1,99,4051,1,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289,292,295,298,301,304,307
+ 
+//MaxSP - Dark Collector
+1,99,4052,1,17,24,31,38,45,52,59,66,73,80,87,94,101,108,115,122,129,136,143,150,157,164,171,178,185,192,199,206,213,220,227,234,241,248,255,262,269,276,283,290,297,304,311,318,325,332,339,346,353,360,367,374,381,388,395,402,409,416,423,430,437,444,451,458,465,472,479,486,493,500,507,514,521,528,535,542,549,556,563,570,577,584,591,598,605,612,619,626,633,640,647,654,661,668,675,682,689,696,703
+ 
+//MaxSP - Rune Knight/Rune Knight_T/Rune Knight (Dragon)/Rune Knight (Dragon)_T
+99,150,4054:4060:4080:4081:4096:4109,1,300,310,313,316,319,322,325,328,331,334,337,340,343,346,349,352,355,358,361,364,367,370,373,376,379,382,385,388,391,394,397,400,403,406,409,412,415,418,421,424,427,430,433,436,439,442,445,448,451,454,457,460
+ 
+//MaxSP - Warlock/Sorcerer/Genetic/Warlock_T/Sorcerer_T/Genetic_T
+99,150,4055:4061:4067:4071:4074:4078:4097:4103:4107,1,900,910,919,928,937,946,955,964,973,982,991,1000,1009,1018,1027,1036,1045,1054,1063,1072,1081,1090,1099,1108,1117,1126,1135,1144,1153,1162,1171,1180,1189,1198,1207,1216,1225,1234,1243,1252,1261,1270,1279,1288,1297,1306,1315,1324,1333,1342,1351,1360
+ 
+//MaxSP - Arch Bishop/Arch Bishop_T
+99,150,4057:4063:4099,1,800,810,818,826,834,842,850,858,866,874,882,890,898,906,914,922,930,938,946,954,962,970,978,986,994,1002,1010,1018,1026,1034,1042,1050,1058,1066,1074,1082,1090,1098,1106,1114,1122,1130,1138,1146,1154,1162,1170,1178,1186,1194,1202,1210
+ 
+//MaxSP - Ranger/Mechanic/Guillotine Cross/Ranger_T/Mechanic_T/Guillotine Cross_T/Royal Guard/Minstrel/Wanderer/Sura/Shadow Chaser/Royal Guard_T/Minstrel_T/Wanderer_T/Sura_T/Shadow Chaser_T/Royal Guard (Gryphon)/Royal Guard (Gryphon)_T/Ranger (Warg)/Ranger (Warg)_T/Mechanic (Mado Gear)/Mechanic (Mado Gear)_T
+1,150,4056:4058:4059:4062:4064:4065:4066:4068:4069:4070:4072:4073:4075:4076:4077:4079:4082:4083:4084:4085:4086:4087:4098:4100:4101:4102:4104:4105:4106:4108:4110:4111:4112,1,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294,298,302,306,310,314,318,322,326,330,334,338,342,346,350,354,358,362,366,370,374,378,382,386,390,394,398,402,406,410,414,418,422,426,430,434,438,442,446,450,454,458,462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,530,534,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610

+ 79 - 79
db/re/job_db1.txt

@@ -4,157 +4,157 @@
 // 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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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 
+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  
+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  ,440  ,940  ,1040 ,2000 ,2000 ,600  
+24,	28000,100   ,0    ,450  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490  ,590  ,440  ,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  
+25,	26000,90   ,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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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  
+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,	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  
+4024,	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
 // Baby Magician
-4025,	22000,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  
+4025,	22000,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,	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  
+4026,	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
 // Baby Acolyte
-4027,	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  
+4027,	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
 // Baby Merchant
-4028,	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  
+4028,	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
 // Baby Thief
-4029,	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  
+4029,	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
 // Baby Knight
-4030,	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  
+4030,	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
 // Baby Priest
-4031,	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  
+4031,	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
 // Baby Wizard
-4032,	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  
+4032,	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
 // Baby Blacksmith
-4033,	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  
+4033,	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
 // Baby Hunter
-4034,	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  
+4034,	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
 // Baby Assassin
-4035,	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  
+4035,	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
 // Baby Knight (Peco)
-4036,	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  
+4036,	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
 // Baby Crusader
-4037,	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  
+4037,	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 Monk
-4038,	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  
+4038,	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
 // Baby Sage
-4039,	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  
+4039,	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
 // Baby Rogue
-4040,	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  
+4040,	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
 // Baby Alchemist
-4041,	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  
+4041,	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
 // Baby Bard
-4042,	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  
+4042,	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
 // Baby Dancer
-4043,	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  
+4043,	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
 // Baby Crusader (Peco)
-4044,	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  
+4044,	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 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  
+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  
+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,	28000,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  
+4047,	28000,90   ,650  ,500  ,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,	28000,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  
+4048,	28000,90   ,650  ,500  ,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 
+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
+4050,	24000,65   ,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
@@ -188,7 +188,7 @@
 // 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 
+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,	32000,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)
@@ -202,7 +202,7 @@
 // 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 
+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,	32000,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)
@@ -244,7 +244,7 @@
 // Baby Sorcerer
 4103,	24000,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,	27000,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 
+4104,	27000,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,	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
 // Baby Sura

Plik diff jest za duży
+ 9 - 0
db/re/job_exp.txt


+ 166 - 0
db/re/job_maxhpsp_db.txt

@@ -0,0 +1,166 @@
+//MaxHP & MaxSP tables format:
+//Startlvl,Max Level,Class list,Type,Max value for Lv 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
+//Type (0 - MaxHP; 1 - MaxSP)
+
+//===============================
+// Renewal MaxHP & MaxSP Database
+//===============================
+
+//MaxHP - Novice/Super Novice/Novice High/Baby Novice/Baby Super Novice
+1,99,23:4001:4023:4045,0,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,260,265,270,275,280,285,290,295,300,305,310,315,320,325,330,335,340,345,350,355,360,365,370,375,380,385,390,395,400,405,410,415,420,425,430,435,440,445,450,455,460,465,470,475,480,485,490,495,500,505,510,515,520,525,530
+
+//MaxHP - Swordman/Swordman High/Baby Swordman
+1,99,1:4002:4024,0,40,46,53,61,70,79,89,100,111,123,136,149,163,178,194,210,227,245,263,282,302,322,343,365,388,411,435,460,485,511,538,565,593,622,652,682,713,745,777,810,844,878,913,949,986,1023,1061,1100,1139,1179,1220,1261,1303,1346,1390,1434,1479,1525,1571,1618,1666,1714,1763,1813,1864,1915,1967,2020,2073,2127,2182,2237,2293,2350,2408,2466,2525,2585,2645,2706,2768,2830,2893,2957,3022,3087,3153,3220,3287,3355,3424,3493,3563,3634,3706,3778,3851,3925,3999
+
+//MaxHP - Magician/Magician High/Baby Magician
+1,99,2:4003:4025,0,40,46,52,58,65,72,79,86,94,102,110,119,128,137,147,157,167,177,188,199,210,222,234,246,259,272,285,298,312,326,340,355,370,385,401,417,433,449,466,483,500,518,536,554,573,592,611,630,650,670,690,711,732,753,775,797,819,841,864,887,910,934,958,982,1007,1032,1057,1082,1108,1134,1160,1187,1214,1241,1269,1297,1325,1353,1382,1411,1440,1470,1500,1530,1561,1592,1623,1654,1686,1718,1750,1783,1816,1849,1883,1917,1951,1985,2020
+
+//MaxHP - Archer/Thief/Archer High/Thief High/Baby Archer/Baby Thief
+1,99,3:6:4004:4007:4026:4029,0,40,46,53,60,68,76,85,94,104,114,125,136,148,160,173,186,200,214,229,244,260,276,293,310,328,346,365,384,404,424,445,466,488,510,533,556,580,604,629,654,680,706,733,760,788,816,845,874,904,934,965,996,1028,1060,1093,1126,1160,1194,1229,1264,1300,1336,1373,1410,1448,1486,1525,1564,1604,1644,1685,1726,1768,1810,1853,1896,1940,1984,2029,2074,2120,2166,2213,2260,2308,2356,2405,2454,2504,2554,2605,2656,2708,2760,2813,2866,2920,2974,3029
+
+//MaxHP - Acolyte/Merchant/Acolyte High/Merchant High/Baby Acolyte/Baby Merchant
+1,99,4:5:4005:4006:4027:4028,0,40,46,52,59,66,73,81,89,98,107,116,126,136,147,158,169,181,193,206,219,232,246,260,275,290,305,321,337,354,371,388,406,424,443,462,481,501,521,542,563,584,606,628,651,674,697,721,745,770,795,820,846,872,899,926,953,981,1009,1038,1067,1096,1126,1156,1187,1218,1249,1281,1313,1346,1379,1412,1446,1480,1515,1550,1585,1621,1657,1694,1731,1768,1806,1844,1883,1922,1961,2001,2041,2082,2123,2164,2206,2248,2291,2334,2377,2421,2465,2510
+
+//MaxHP - Knight/Knight (Peco)/Lord Knight/Lord Knight (Peco)/Baby Knight/Baby Knight (Peco)
+1,99,7:13:4008:4014:4030:4036,0,40,48,58,69,82,96,112,129,148,168,190,213,238,264,292,321,352,384,418,453,490,528,568,609,652,696,742,789,838,888,940,993,1048,1104,1162,1221,1282,1344,1408,1473,1540,1608,1678,1749,1822,1896,1972,2049,2128,2208,2290,2373,2458,2544,2632,2721,2812,2904,2998,3093,3190,3288,3388,3489,3592,3696,3802,3909,4018,4128,4240,4353,4468,4584,4702,4821,4942,5064,5188,5313,5440,5568,5698,5829,5962,6096,6232,6369,6508,6648,6790,6933,7078,7224,7372,7521,7672,7824,7978
+
+//MaxHP - Priest/Sage/High Priest/Professor/Baby Priest/Baby Sage
+1,99,8:16:4009:4017:4031:4039,0,40,47,54,62,71,81,91,102,114,127,140,154,169,185,201,218,236,255,274,294,315,337,359,382,406,431,456,482,509,537,565,594,624,655,686,718,751,785,819,854,890,927,964,1002,1041,1081,1121,1162,1204,1247,1290,1334,1379,1425,1471,1518,1566,1615,1664,1714,1765,1817,1869,1922,1976,2031,2086,2142,2199,2257,2315,2374,2434,2495,2556,2618,2681,2745,2809,2874,2940,3007,3074,3142,3211,3281,3351,3422,3494,3567,3640,3714,3789,3865,3941,4018,4096,4175,4254
+
+//MaxHP - Wizard/High Wizard/Baby Wizard
+1,99,9:4010:4032,0,40,46,53,60,68,76,85,94,104,115,126,138,150,163,176,190,204,219,234,250,267,284,302,320,339,358,378,398,419,441,463,486,509,533,557,582,607,633,659,686,714,742,771,800,830,860,891,922,954,987,1020,1054,1088,1123,1158,1194,1230,1267,1304,1342,1381,1420,1460,1500,1541,1582,1624,1666,1709,1753,1797,1842,1887,1933,1979,2026,2073,2121,2169,2218,2268,2318,2369,2420,2472,2524,2577,2630,2684,2739,2794,2850,2906,2963,3020,3078,3136,3195,3254
+
+//MaxHP - Blacksmith/Alchemist/Whitesmith/Creator/Baby Blacksmith/Baby Alchemist
+1,99,10:18:4011:4019:4033:4041,0,40,47,55,64,74,84,95,107,120,134,149,165,182,200,219,238,258,279,301,324,348,373,399,426,454,482,511,541,572,604,637,671,706,742,779,816,854,893,933,974,1016,1059,1103,1148,1194,1240,1287,1335,1384,1434,1485,1537,1590,1644,1699,1754,1810,1867,1925,1984,2044,2105,2167,2230,2294,2358,2423,2489,2556,2624,2693,2763,2834,2906,2979,3052,3126,3201,3277,3354,3432,3511,3591,3672,3754,3836,3919,4003,4088,4174,4261,4349,4438,4528,4619,4710,4802,4895,4989
+
+//MaxHP - Hunter/Rogue/Sniper/Stalker/Baby Hunter/Baby Rogue
+1,99,11:17:4012:4018:4034:4040,0,40,47,55,63,72,82,93,105,118,132,146,161,177,194,212,231,250,270,291,313,336,360,385,410,436,463,491,520,550,581,612,644,677,711,746,782,818,855,893,932,972,1013,1055,1097,1140,1184,1229,1275,1322,1370,1418,1467,1517,1568,1620,1673,1726,1780,1835,1891,1948,2006,2065,2124,2184,2245,2307,2370,2434,2499,2564,2630,2697,2765,2834,2904,2974,3045,3117,3190,3264,3339,3415,3491,3568,3646,3725,3805,3886,3968,4050,4133,4217,4302,4388,4475,4562,4650,4739
+
+//MaxHP - Assassin/Assassin Cross/Baby Assassin
+1,99,12:4013:4035,0,40,47,55,64,75,87,100,114,129,145,162,180,199,219,241,264,288,313,339,366,394,423,453,484,517,551,586,622,659,697,736,776,817,859,903,948,994,1041,1089,1138,1188,1239,1291,1344,1399,1455,1512,1570,1629,1689,1750,1812,1875,1939,2005,2072,2140,2209,2279,2350,2422,2495,2569,2644,2721,2799,2878,2958,3039,3121,3204,3288,3373,3459,3547,3636,3726,3817,3909,4002,4096,4191,4287,4384,4483,4583,4684,4786,4889,4993,5098,5204,5311,5419,5529,5640,5752,5865,5979
+
+//MaxHP - Crusader/Crusader (Peco)/Paladin/Paladin (Peco)/Baby Crusader/Baby Crusader (Peco)
+1,99,14:21:4015:4022:4037:4044,0,40,47,56,62,81,94,108,128,147,165,184,204,225,247,271,296,322,349,377,406,436,467,499,532,567,603,640,678,717,757,798,840,883,927,973,1020,1068,1117,1167,1218,1270,1323,1377,1432,1489,1547,1606,1666,1727,1789,1852,1916,1981,2047,2115,2184,2254,2325,2397,2470,2544,2619,2695,2772,2851,2931,3012,3094,3177,3261,3346,3432,3519,3607,3697,3788,3880,3973,4067,4162,4258,4355,4453,4552,4653,4755,4858,4962,5067,5173,5280,5388,5497,5607,5719,5832,5946,6061,6177
+
+//MaxHP - Monk/Champion/Baby Monk
+1,99,15:4016:4038,0,40,47,55,64,74,84,95,107,120,134,149,165,182,200,219,238,258,306,329,354,379,406,433,462,491,521,551,583,615,649,683,719,755,793,831,870,909,950,991,1034,1077,1122,1167,1214,1261,1309,1357,1407,1457,1509,1561,1615,1669,1725,1781,1838,1895,1954,2013,2074,2135,2198,2261,2326,2391,2457,2523,2591,2659,2729,2799,2871,2943,3017,3091,3166,3241,3318,3395,3474,3553,3634,3715,3798,3881,3965,4049,4135,4221,4309,4397,4487,4577,4669,4761,4854,4947,5042,5137
+
+//MaxHP - Bard/Dancer/Clown/Gypsy/Baby Bard/Baby Dancer
+1,99,19:20:4020:4021:4042:4043,0,40,47,54,62,71,81,91,102,114,127,140,154,169,180,196,212,224,242,260,278,296,316,330,350,371,393,415,438,451,477,503,530,558,587,616,646,677,709,741,774,808,843,878,914,951,989,1027,1066,1106,1147,1188,1230,1273,1317,1361,1406,1452,1499,1546,1594,1643,1693,1743,1794,1846,1899,1952,2006,2061,2117,2173,2230,2288,2347,2406,2466,2527,2589,2651,2714,2778,2843,2908,2974,3041,3109,3177,3246,3316,3387,3458,3530,3603,3677,3751,3826,3902,3979,4056
+
+//MaxHP - Gunslinger
+1,99,24,0,40,47,55,64,74,84,95,107,120,134,149,165,182,200,219,238,258,306,329,354,379,406,433,462,491,521,551,583,615,649,683,719,755,793,831,870,909,950,991,1034,1077,1122,1167,1214,1261,1309,1357,1407,1457,1509,1561,1615,1669,1725,1781,1838,1895,1954,2013,2074,2135,2198,2261,2326,2391,2457,2523,2591,2659,2670,2680,2690,2700,2710,2720,2730,2740,2750,2760,3000,3020,3040,3060,3080,3100,3120,3140,3160,3180,3455,3524,3593,3663,3834,3806,3878,3951,4025,4500
+
+//MaxHP - Ninja
+1,99,25,0,40,47,54,62,71,81,91,102,114,127,140,154,169,185,201,218,236,255,274,294,315,337,359,382,406,431,456,482,509,537,565,594,624,655,686,718,751,785,819,854,890,927,964,1002,1041,1081,1121,1162,1204,1247,1290,1334,1379,1425,1471,1518,1566,1615,1664,1714,1765,1817,1869,1922,1976,2031,2086,2142,2199,2257,2275,2294,2314,2335,2356,2378,2401,2425,2449,2874,2890,2907,2924,2942,2971,2991,3011,3032,3054,3567,3590,3614,3649,3675,3701,3728,3756,3800,4250
+
+//MaxHP - Taekwon
+1,99,4046,0,40,46,53,61,70,79,89,100,111,123,136,149,163,178,194,210,227,245,263,282,302,322,343,365,388,411,435,460,485,511,538,565,593,622,652,682,713,745,777,810,844,878,913,949,986,1023,1061,1100,1139,1179,1220,1261,1303,1346,1390,1434,1479,1525,1571,1618,1666,1714,1763,1813,1864,1915,1967,2020,2073,2127,2137,2147,2157,2167,2177,2187,2197,2200,2210,2230,2250,2300,2350,2400,2450,2500,2550,2600,2650,2700,2750,2800,2850,2900,2950,3000,3050,3100,3200
+
+//MaxHP - Star Knight/Star Knight (flying)
+1,99,4047:4048,0,40,47,55,64,74,84,95,107,120,134,149,165,182,200,219,238,258,306,329,354,379,406,433,462,491,521,551,583,615,649,683,719,755,793,831,870,909,950,991,1034,1077,1122,1167,1214,1261,1309,1357,1407,1457,1509,1561,1615,1669,1725,1781,1838,1895,1954,2013,2074,2135,2198,2261,2326,2391,2457,2523,2591,2659,2670,2680,2690,2700,2710,2720,2730,2740,2750,2760,3000,3020,3040,3060,3080,3100,3120,3140,3160,3180,3455,3524,3593,3663,3734,3806,3878,3951,4025,4500
+
+//MaxHP - Soul Linker
+1,99,4049,0,40,47,54,62,71,81,91,102,114,127,140,154,169,185,201,218,236,255,274,294,315,337,359,382,406,431,456,482,509,537,565,594,624,655,686,718,751,785,819,854,890,927,964,1002,1041,1081,1121,1162,1204,1247,1290,1334,1379,1425,1471,1518,1566,1615,1664,1714,1765,1817,1869,1922,1976,2031,2086,2142,2199,2257,2275,2294,2314,2335,2356,2378,2401,2425,2449,2874,2890,2907,2924,2942,2971,2991,3011,3032,3054,3567,3590,3614,3649,3675,3701,3728,3756,3800,4250
+
+//MaxHP - Munak/Bongun
+1,99,4050,0,40,46,53,60,68,76,85,94,104,114,125,136,148,160,173,186,200,214,229,244,260,276,293,310,328,346,365,384,404,424,445,466,488,510,533,556,580,604,629,654,680,706,733,760,788,816,845,874,904,934,965,996,1028,1060,1093,1126,1160,1194,1229,1264,1300,1336,1373,1410,1448,1486,1525,1564,1604,1644,1685,1726,1768,1810,1853,1896,1940,1984,2029,2074,2120,2166,2213,2260,2308,2356,2405,2454,2504,2554,2605,2656,2708,2760,2813,2866,2920,2974,3029
+
+//MaxHP - Death Knight
+1,99,4051,0,2040,2046,2053,2060,2068,2076,2085,2094,2104,2114,2125,2136,2148,2160,2173,2186,2200,2214,2229,2244,2260,2276,2293,2310,2328,2346,2365,2384,2404,2424,2445,2466,2488,2510,2533,2556,2580,2604,2629,2654,2680,2706,2733,2760,2788,2816,2845,2874,2904,2934,2965,2996,3028,3060,3093,3126,3160,3194,3229,3264,3300,3336,3373,3410,3448,3486,3525,3564,3604,3644,3685,3726,3768,3810,3853,3896,3940,3984,4029,4074,4120,4166,4213,4260,4308,4356,4405,4454,4504,4554,4605,4656,4708,4760,4813,4866,4920,4974,5029
+
+//MaxHP - Dark Collector
+1,99,4052,0,40,47,54,62,71,81,91,102,114,127,140,154,169,185,201,218,236,255,274,294,315,337,359,382,406,431,456,482,509,537,565,594,624,655,686,718,751,785,819,854,890,927,964,1002,1041,1081,1121,1162,1204,1247,1290,1334,1379,1425,1471,1518,1566,1615,1664,1714,1765,1817,1869,1922,1976,2031,2086,2142,2199,2257,2315,2374,2434,2495,2556,2618,2681,2745,2809,2874,2940,3007,3074,3142,3211,3281,3351,3422,3494,3567,3640,3714,3789,3865,3941,4018,4096,4175,4254
+
+//MaxHP - Rune Knight/Rune Knight_T/Rune Knight (Dragon)/Rune Knight (Dragon)_T
+99,150,4054:4060:4080:4081:4096:4109,0,8100,8133,8242,8352,8464,8576,8690,8804,8920,9036,9154,9273,9393,9514,9636,9759,9883,10008,10134,10261,10389,10518,10648,10779,10912,11045,11180,11315,11452,11589,11728,11868,12009,12151,12294,12438,12583,12729,12876,13024,13173,13323,13474,13626,13780,13934,14090,14246,14404,14562,14722,14883
+
+//MaxHP - Warlock/Warlock_T
+99,150,4055:4061:4097,0,3200,3313,3383,3455,3528,3601,3675,3749,3824,3899,3975,4051,4129,4208,4287,4367,4447,4528,4609,4691,4773,4857,4941,5026,5112,5198,5285,5372,5460,5548,5638,5728,5819,5911,6003,6096,6189,6283,6377,6473,6569,6666,6763,6861,6960,7059,7159,7259,7361,7463,7566,7669
+
+//MaxHP - Ranger/Ranger_T/Minstrel/Wanderer/Minstrel_T/Wanderer_T/Ranger (Warg)/Ranger (Warg)_T
+99,150,4056:4062:4068:4069:4075:4076:4084:4085:4098:4104:4105:4111,0,4800,4828,4918,5009,5101,5194,5288,5382,5477,5573,5670,5768,5867,5967,6068,6170,6273,6377,6482,6588,6694,6801,6909,7018,7128,7239,7351,7464,7578,7693,7809,7926,8044,8162,8281,8401,8522,8644,8767,8891,9016,9142,9269,9397,9526,9656,9786,9917,10049,10182,10316,10451
+
+//MaxHP - Arch Bishop/Arch Bishop_T
+99,150,4057:4063:4099,0,4300,4333,4412,4491,4570,4649,4728,4807,4886,4965,5044,5123,5202,5281,5360,5439,5518,5597,5676,5755,5834,5913,5992,6071,6150,6229,6308,6387,6466,6545,6624,6703,6782,6861,6940,7019,7098,7177,7256,7335,7414,7493,7572,7651,7730,7809,7888,7967,8046,8125,8204,8283
+
+//MaxHP - Mechanic/Mechanic_T/Sura/Sura_T/Mechanic (Mado Gear)/Mechanic (Mado Gear)_T
+99,150,4058:4064:4086:4087:4100:4112,0,5807,5844,5952,6061,6172,6283,6396,6510,6625,6741,6857,6974,7093,7212,7333,7455,7578,7702,7828,7954,8081,8208,8337,8467,8598,8730,8864,8998,9134,9271,9408,9546,9685,9825,9967,10109,10253,10398,10544,10691,10838,10987,11136,11287,11439,11592,11746,11901,12057,12215,12372,12531
+
+//MaxHP - Guillotine Cross/Guillotine Cross_T/Royal Guard/Shadow Chaser/Royal Guard_T/Shadow Chaser_T/Royal Guard (Gryphon)/Royal Guard (Gryphon)_T
+99,150,4059:4065:4066:4072:4073:4079:4082:4083:4101:4102:4108:4110,0,6050,6093,6208,6324,6441,6559,6678,6798,6920,7043,7167,7292,7418,7545,7673,7802,7932,8063,8196,8330,8465,8601,8738,8876,9015,9155,9296,9438,9582,9727,9873,10020,10168,10317,10467,10618,10770,10923,11078,11234,11391,11549,11708,11868,12029,12191,12354,12518,12684,12851,13019,13188
+
+//MaxHP - Sorcerer/Sorcerer_T
+99,150,4067:4074:4103,0,4080,4103,4180,4257,4335,4414,4494,4574,4655,4737,4819,4902,4986,5071,5157,5244,5332,5420,5509,5599,5689,5780,5872,5965,6058,6153,6248,6344,6441,6539,6637,6737,6837,6937,7038,7140,7243,7347,7451,7557,7663,7770,7878,7987,8097,8207,8318,8429,8541,8654,8768,8883
+
+//MaxHP - Sura/Sura_T
+99,150,4070:4077:4106,0,5050,5082,5176,5271,5367,5464,5562,5661,5761,5862,5963,6065,6168,6272,6377,6483,6590,6698,6807,6917,7027,7138,7250,7363,7477,7592,7708,7825,7943,8062,8181,8301,8422,8544,8667,8791,8916,9042,9169,9297,9425,9554,9684,9815,9947,10080,10214,10349,10485,10622,10759,10897
+
+//MaxHP - Genetic/Genetic_T
+99,150,4071:4078:4107,0,4730,4766,4853,4940,5027,5113,5200,5287,5374,5461,5548,5635,5722,5809,5896,5982,6069,6156,6243,6330,6417,6504,6591,6678,6765,6851,6938,7025,7112,7199,7286,7373,7460,7547,7634,7720,7807,7894,7981,8068,8155,8242,8329,8416,8503,8589,8676,8763,8850,8937,9024,9111
+
+//MaxSP - Novice/Super Novice/Novice High/Baby Novice/Baby Super Novice
+1,99,0:23:4001:4023:4045,1,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109
+
+//MaxSP - Swordman/Archer/Thief/Swordman High/Archer High/Thief High/Baby Swordman/Baby Archer/Baby Thief
+1,99,1:3:6:4002:4004:4007:4024:4026:4029,1,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208
+
+//MaxSP - Magician/Bard/Dancer/Magician High/Clown/Gypsy/Baby Magician/Baby Bard/Baby Dancer
+1,99,2:19:20:4003:4020:4021:4025:4042:4043,1,16,22,28,34,40,46,52,58,64,70,76,82,88,94,100,106,112,118,124,130,136,142,148,154,160,166,172,178,184,190,196,202,208,214,220,226,232,238,244,250,256,262,268,274,280,286,292,298,304,310,316,322,328,334,340,346,352,358,364,370,376,382,388,394,400,406,412,418,424,430,436,442,448,454,460,466,472,478,484,490,496,502,508,514,520,526,532,538,544,550,556,562,568,574,580,586,592,598,604
+
+//MaxSP - Acolyte/Rogue/Acolyte High/Stalker/Baby Acolyte/Baby Rogue
+1,99,4:17:4005:4018:4027:4040,1,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,260,265,270,275,280,285,290,295,300,305,310,315,320,325,330,335,340,345,350,355,360,365,370,375,380,385,390,395,400,405,410,415,420,425,430,435,440,445,450,455,460,465,470,475,480,485,490,495,500,505
+
+//MaxSP - Merchant/Knight/Knight (Peco)/Merchant High/Lord Knight/Lord Knight (Peco)/Baby Merchant/Baby Knight/Baby Knight (Peco)
+1,99,5:7:13:4006:4008:4014:4028:4030:4036,1,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289,292,295,298,301,304,307
+
+//MaxSP - Priest/High Priest/Baby Priest
+1,99,8:4009:4031,1,18,26,34,42,50,58,66,74,82,90,98,106,114,122,130,138,146,154,162,170,178,186,194,202,210,218,226,234,242,250,258,266,274,282,290,298,306,314,322,330,338,346,354,362,370,378,386,394,402,410,418,426,434,442,450,458,466,474,482,490,498,506,514,522,530,538,546,554,562,570,578,586,594,602,610,618,626,634,642,650,658,666,674,682,690,698,706,714,722,730,738,746,754,762,770,778,786,794,802
+
+//MaxSP - Wizard/High Wizard/Baby Wizard
+1,99,9:4010:4032,1,19,28,37,46,55,64,73,82,91,100,109,118,127,136,145,154,163,172,181,190,199,208,217,226,235,244,253,262,271,280,289,298,307,316,325,334,343,352,361,370,379,388,397,406,415,424,433,442,451,460,469,478,487,496,505,514,523,532,541,550,559,568,577,586,595,604,613,622,631,640,649,658,667,676,685,694,703,712,721,730,739,748,757,766,775,784,793,802,811,820,829,838,847,856,865,874,883,892,901
+
+//MaxSP - Blacksmith/Hunter/Assassin/Alchemist/Whitesmith/Sniper/Assassin Cross/Creator/Baby Blacksmith/Baby Hunter/Baby Assassin/Baby Alchemist
+1,99,10:11:12:18:4011:4012:4013:4019:4033:4034:4035:4041,1,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294,298,302,306,310,314,318,322,326,330,334,338,342,346,350,354,358,362,366,370,374,378,382,386,390,394,398,402,406
+
+//MaxSP - Crusader/Monk/Crusader (Peco)/Paladin/Champion/Paladin (Peco)/Baby Crusader/Baby Monk/Baby Crusader (Peco)
+1,99,14:15:21:4015:4016:4022:4037:4038:4044,1,14,19,24,28,33,38,42,47,52,57,61,66,71,75,80,85,89,94,99,104,108,113,118,122,127,132,136,141,146,151,155,160,165,169,174,179,183,188,193,198,202,207,212,216,221,226,230,235,240,245,249,254,259,263,268,273,277,282,287,292,296,301,306,310,315,320,324,329,334,339,343,348,353,357,362,367,371,376,381,386,390,395,400,404,409,414,418,423,428,433,437,442,447,451,456,461,465,470,475
+
+//MaxSP - Sage/Professor/Baby Sage
+1,99,16:4017:4039,1,17,24,31,38,45,52,59,66,73,80,87,94,101,108,115,122,129,136,143,150,157,164,171,178,185,192,199,206,213,220,227,234,241,248,255,262,269,276,283,290,297,304,311,318,325,332,339,346,353,360,367,374,381,388,395,402,409,416,423,430,437,444,451,458,465,472,479,486,493,500,507,514,521,528,535,542,549,556,563,570,577,584,591,598,605,612,619,626,633,640,647,654,661,668,675,682,689,696,703
+
+//MaxSP - Gunslinger
+1,99,24,1,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,61,64,67,70,73,76,79,82,85,89,93,97,101,105,109,113,117,121,125,129,131,135,139,141,145,149,153,157,161,165,169,173,177,181,186,191,196,201,206,211,216,221,226,231,236,241,246,251,256,261,266,271,276,281,286,291,296,301,306,312,318,324,336,342,348,354,360,366,372,378,384,390,396,402,408,414,420,426,432,438,444,450,456
+
+//MaxSP - Ninja
+1,99,25,1,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59,62,65,68,71,75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,156,161,166,171,176,181,186,191,196,201,206,211,216,221,226,231,236,241,246,251,257,263,269,275,281,287,293,299,305,311,317,323,329,335,341,347,353,359,365,371,378,386,394,402,410,418,426,434,442,450,458,466,474,482,490,498,506,514,522
+
+//MaxSP - Taekwon
+1,99,4046,1,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,151,152,153,154,155,156,157,158,159,170,171,172,173,174,175,176,177,178,188,190,190,190,190,190,190,190,190,190,200
+
+//MaxSP - Star Knight/Star Knight (flying)
+1,99,4047:4048,1,14,19,24,28,33,38,42,47,52,57,61,66,71,75,80,85,89,94,99,104,108,113,118,122,127,132,136,141,146,151,155,160,165,169,174,179,183,188,193,198,202,207,212,216,221,226,230,235,240,245,249,254,259,263,268,273,277,282,287,292,296,301,306,310,315,320,324,329,334,339,341,343,345,347,349,351,353,355,357,386,388,390,392,394,396,398,400,402,404,430,433,436,439,442,445,448,451,454,500
+
+//MaxSP - Soul Linker
+1,99,4049,1,19,28,37,46,55,64,73,82,91,100,109,118,127,136,145,154,163,172,181,190,199,208,217,226,235,244,253,262,271,280,289,298,307,316,325,334,343,352,361,370,379,388,397,406,415,424,433,442,451,460,469,478,487,496,505,514,523,532,541,550,559,568,577,586,595,604,613,622,631,635,640,645,650,655,660,665,670,675,680,730,735,740,745,750,755,760,765,770,775,820,825,830,845,850,855,860,865,870,900
+
+//MaxSP - Munak/Bongun
+1,99,4050,1,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289,292,295,298,301,304,307
+
+//MaxSP - Death Knight
+1,99,4051,1,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289,292,295,298,301,304,307
+
+//MaxSP - Dark Collector
+1,99,4052,1,17,24,31,38,45,52,59,66,73,80,87,94,101,108,115,122,129,136,143,150,157,164,171,178,185,192,199,206,213,220,227,234,241,248,255,262,269,276,283,290,297,304,311,318,325,332,339,346,353,360,367,374,381,388,395,402,409,416,423,430,437,444,451,458,465,472,479,486,493,500,507,514,521,528,535,542,549,556,563,570,577,584,591,598,605,612,619,626,633,640,647,654,661,668,675,682,689,696,703
+
+//MaxSP - Rune Knight/Rune Knight_T/Rune Knight (Dragon)/Rune Knight (Dragon)_T
+99,150,4054:4060:4080:4081:4096:4109,1,300,310,313,316,319,322,325,328,331,334,337,340,343,346,349,352,355,358,361,364,367,370,373,376,379,382,385,388,391,394,397,400,403,406,409,412,415,418,421,424,427,430,433,436,439,442,445,448,451,454,457,460
+
+//MaxSP - Warlock/Sorcerer/Genetic/Warlock_T/Sorcerer_T/Genetic_T
+99,150,4055:4061:4067:4071:4074:4078:4097:4103:4107,1,900,910,919,928,937,946,955,964,973,982,991,1000,1009,1018,1027,1036,1045,1054,1063,1072,1081,1090,1099,1108,1117,1126,1135,1144,1153,1162,1171,1180,1189,1198,1207,1216,1225,1234,1243,1252,1261,1270,1279,1288,1297,1306,1315,1324,1333,1342,1351,1360
+
+//MaxSP - Arch Bishop/Arch Bishop_T
+99,150,4057:4063:4099,1,800,810,818,826,834,842,850,858,866,874,882,890,898,906,914,922,930,938,946,954,962,970,978,986,994,1002,1010,1018,1026,1034,1042,1050,1058,1066,1074,1082,1090,1098,1106,1114,1122,1130,1138,1146,1154,1162,1170,1178,1186,1194,1202,1210
+
+//MaxSP - Ranger/Mechanic/Guillotine Cross/Ranger_T/Mechanic_T/Guillotine Cross_T/Royal Guard/Minstrel/Wanderer/Sura/Shadow Chaser/Royal Guard_T/Minstrel_T/Wanderer_T/Sura_T/Shadow Chaser_T/Royal Guard (Gryphon)/Royal Guard (Gryphon)_T/Ranger (Warg)/Ranger (Warg)_T/Mechanic (Mado Gear)/Mechanic (Mado Gear)_T
+1,150,4056:4058:4059:4062:4064:4065:4066:4068:4069:4070:4072:4073:4075:4076:4077:4079:4082:4083:4084:4085:4086:4087:4098:4100:4101:4102:4104:4105:4106:4108:4110:4111:4112,1,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294,298,302,306,310,314,318,322,326,330,334,338,342,346,350,354,358,362,366,370,374,378,382,386,390,394,398,402,406,410,414,418,422,426,430,434,438,442,446,450,454,458,462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,530,534,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610

+ 41 - 17
src/common/strlib.c

@@ -58,7 +58,7 @@ char* jstrescapecpy (char* pt, const char* spt)
 		pt[0] = '\0';
 		return &pt[0];
 	}
-	
+
 	while (spt[i] != '\0') {
 		switch (spt[i]) {
 			case '\'':
@@ -150,6 +150,27 @@ char* trim(char* str)
 	return str;
 }
 
+// Note: This function returns a pointer to a substring of the original string.
+// If the given string was allocated dynamically, the caller must not overwrite
+// that pointer with the returned value, since the original pointer must be
+// deallocated using the same allocator with which it was allocated.  The return
+// value must NOT be deallocated using free() etc.
+char *trim2(char *str,char flag){
+	char *end;
+	if(flag&1){ // Trim leading space
+		while(isspace(*str)) str++;
+		if(*str == 0)  // All spaces?
+			return str;
+	}
+	if(flag&2){ // Trim trailing space
+		end = str + strlen(str) - 1;
+		while(end > str && isspace(*end)) end--;
+		*(end+1) = 0; // Write new null terminator
+	}
+
+	return str;
+}
+
 // Converts one or more consecutive occurences of the delimiters into a single space
 // and removes such occurences from the beginning and end of string
 // NOTE: make sure the string is not const!!
@@ -188,7 +209,7 @@ char* normalize_name(char* str,const char* delims)
 	return str;
 }
 
-//stristr: Case insensitive version of strstr, code taken from 
+//stristr: Case insensitive version of strstr, code taken from
 //http://www.daniweb.com/code/snippet313.html, Dave Sinkula
 //
 const char* stristr(const char* haystack, const char* needle)
@@ -331,7 +352,7 @@ int e_mail_check(char* email)
 
 //--------------------------------------------------
 // Return numerical value of a switch configuration
-// on/off, english, français, deutsch, español, portuguese
+// on/off, english, fran�ais, deutsch, espa�ol, portuguese
 //--------------------------------------------------
 int config_switch(const char* str)
 {
@@ -603,13 +624,13 @@ int sv_parse_next(struct s_svstate* sv)
 /// out_pos[0] and out_pos[1] are the start and end of line.
 /// Other position pairs are the start and end of fields.
 /// Returns the number of fields found or -1 if an error occurs.
-/// 
+///
 /// out_pos can be NULL.
 /// If a line terminator is found, the end position is placed there.
-/// out_pos[2] and out_pos[3] for the first field, out_pos[4] and out_pos[5] 
+/// out_pos[2] and out_pos[3] for the first field, out_pos[4] and out_pos[5]
 /// for the seconds field and so on.
 /// Unfilled positions are set to -1.
-/// 
+///
 /// @param str String to parse
 /// @param len Length of the string
 /// @param startoff Where to start parsing
@@ -655,11 +676,11 @@ int sv_parse(const char* str, int len, int startoff, char delim, int* out_pos, i
 /// out_fields[0] is the start of the next line.
 /// Other entries are the start of fields (nul-teminated).
 /// Returns the number of fields found or -1 if an error occurs.
-/// 
+///
 /// out_fields can be NULL.
 /// Fields that don't fit in out_fields are not nul-terminated.
 /// Extra entries in out_fields are filled with the end of the last field (empty string).
-/// 
+///
 /// @param str String to parse
 /// @param len Length of the string
 /// @param startoff Where to start parsing
@@ -965,7 +986,7 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
 	int entries = 0;
 	char** fields; // buffer for fields ([0] is reserved)
 	int columns, fields_length;
-	char path[1024], line[1024];
+	char path[1024], *line, colsize[512];
 	char* match;
 
 	snprintf(path, sizeof(path), "%s/%s", directory, filename);
@@ -981,9 +1002,10 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
 	// allocate enough memory for the maximum requested amount of columns plus the reserved one
 	fields_length = maxcols+1;
 	fields = (char**)aMalloc(fields_length*sizeof(char*));
+	line = (char*)aMalloc(fields_length*sizeof(colsize));
 
 	// process rows one by one
-	while( fgets(line, sizeof(line), fp) )
+	while( fgets(line, fields_length*sizeof(colsize), fp) )
 	{
 		lines++;
 
@@ -992,7 +1014,8 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
 			match[0] = 0;
 		}
 
-		//TODO: strip trailing whitespace
+		//trim(line); //TODO: strip trailing whitespace
+		//trim2(line,1); //removing trailing actually break mob_skill_db
 		if( line[0] == '\0' || line[0] == '\n' || line[0] == '\r')
 			continue;
 
@@ -1026,6 +1049,7 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
 	}
 
 	aFree(fields);
+	aFree(line);
 	fclose(fp);
 	ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", entries, path);
 
@@ -1039,7 +1063,7 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
 // @author MouseJstr (original)
 
 /// Allocates a StringBuf
-StringBuf* StringBuf_Malloc() 
+StringBuf* StringBuf_Malloc()
 {
 	StringBuf* self;
 	CREATE(self, StringBuf, 1);
@@ -1114,7 +1138,7 @@ int StringBuf_Append(StringBuf* self, const StringBuf* sbuf)
 }
 
 // Appends str to the StringBuf
-int StringBuf_AppendStr(StringBuf* self, const char* str) 
+int StringBuf_AppendStr(StringBuf* self, const char* str)
 {
 	int available = self->max_ - (self->ptr_ - self->buf_);
 	int needed = (int)strlen(str);
@@ -1133,20 +1157,20 @@ int StringBuf_AppendStr(StringBuf* self, const char* str)
 }
 
 // Returns the length of the data in the Stringbuf
-int StringBuf_Length(StringBuf* self) 
+int StringBuf_Length(StringBuf* self)
 {
 	return (int)(self->ptr_ - self->buf_);
 }
 
 /// Returns the data in the StringBuf
-char* StringBuf_Value(StringBuf* self) 
+char* StringBuf_Value(StringBuf* self)
 {
 	*self->ptr_ = '\0';
 	return self->buf_;
 }
 
 /// Clears the contents of the StringBuf
-void StringBuf_Clear(StringBuf* self) 
+void StringBuf_Clear(StringBuf* self)
 {
 	self->ptr_ = self->buf_;
 }
@@ -1160,7 +1184,7 @@ void StringBuf_Destroy(StringBuf* self)
 }
 
 // Frees a StringBuf returned by StringBuf_Malloc
-void StringBuf_Free(StringBuf* self) 
+void StringBuf_Free(StringBuf* self)
 {
 	StringBuf_Destroy(self);
 	aFree(self);

+ 4 - 3
src/map/clif.c

@@ -2329,7 +2329,7 @@ void clif_inventorylist(struct map_session_data *sd) {
 	unsigned char *bufe;
 
 #if PACKETVER < 5
-	const int s = 10; //Entry size.
+	const int s = 10; //Entry size
 #elif PACKETVER < 20080102
 	const int s = 18;
 #elif PACKETVER < 20120925
@@ -16711,7 +16711,7 @@ void packetdb_readdb(void)
 {
 	FILE *fp;
 	char line[1024];
-	int ln=0;
+	int ln=0, entries=0;
 	int cmd,i,j,packet_ver;
 	int max_cmd=-1;
 	int skip_ver = 0;
@@ -17298,6 +17298,7 @@ void packetdb_readdb(void)
 
 			packet_db[packet_ver][cmd].pos[j] = k;
 		}
+		entries++;
 	}
 	fclose(fp);
 	if(max_cmd > MAX_PACKET_DB)
@@ -17311,7 +17312,7 @@ void packetdb_readdb(void)
 
 		clif_config.packet_db_ver = j?j:MAX_PACKET_VER;
 	}
-	ShowStatus("Done reading packet database from '"CL_WHITE"%s"CL_RESET"'.\n","packet_db.txt");
+	ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", entries, "packet_db.txt");
 	ShowStatus("Using default packet version: "CL_WHITE"%d"CL_RESET".\n", clif_config.packet_db_ver);
 }
 

+ 66 - 65
src/map/itemdb.c

@@ -26,7 +26,7 @@ static struct item_group itemgroup_db[MAX_ITEMGROUP];
 struct item_data dummy_item; //This is the default dummy item used for non-existant items. [Skotlex]
 
 /**
- * Search for item name 
+ * Search for item name
  * name = item alias, so we should find items aliases first. if not found then look for "jname" (full name)
  * @see DBApply
  */
@@ -52,7 +52,7 @@ static int itemdb_searchname_sub(DBKey key, DBData *data, va_list ap)
 }
 
 /*==========================================
- * Return item data from item name. (lookup) 
+ * Return item data from item name. (lookup)
  *------------------------------------------*/
 struct item_data* itemdb_searchname(const char *str)
 {
@@ -137,7 +137,7 @@ int itemdb_searchname_array(struct item_data** data, int size, const char *str)
 
 
 /*==========================================
- * Return a random item id from group. (takes into account % chance giving/tot group) 
+ * Return a random item id from group. (takes into account % chance giving/tot group)
  *------------------------------------------*/
 int itemdb_searchrandomid(int group)
 {
@@ -147,7 +147,7 @@ int itemdb_searchrandomid(int group)
 	}
 	if (itemgroup_db[group].qty)
 		return itemgroup_db[group].nameid[rnd()%itemgroup_db[group].qty];
-	
+
 	ShowError("itemdb_searchrandomid: No item entries for group id %d\n", group);
 	return UNKNOWN_ITEM_ID;
 }
@@ -204,7 +204,7 @@ const char* itemdb_typename(int type)
 }
 
 /*==========================================
- * Converts the jobid from the format in itemdb 
+ * Converts the jobid from the format in itemdb
  * to the format used by the map server. [Skotlex]
  *------------------------------------------*/
 static void itemdb_jobid2mapid(unsigned int *bclass, unsigned int jobmask)
@@ -359,7 +359,7 @@ int itemdb_isequip(int nameid)
  * Alternate version of itemdb_isequip
  *------------------------------------------*/
 int itemdb_isequip2(struct item_data *data)
-{ 
+{
 	nullpo_ret(data);
 	switch(data->type) {
 		case IT_WEAPON:
@@ -452,10 +452,10 @@ int itemdb_isrestricted(struct item* item, int gmlv, int gmlv2, int (*func)(stru
 
 	if (!func(item_data, gmlv, gmlv2))
 		return 0;
-	
+
 	if(item_data->slot == 0 || itemdb_isspecial(item->card[0]))
 		return 1;
-	
+
 	for(i = 0; i < item_data->slot; i++) {
 		if (!item->card[i]) continue;
 		if (!func(itemdb_search(item->card[i]), gmlv, gmlv2))
@@ -519,11 +519,11 @@ static void itemdb_read_itemgroup_sub(const char* filename)
 {
 	FILE *fp;
 	char line[1024];
-	int ln=0;
+	int ln=0, entries=0;
 	int groupid,j,k,nameid;
 	char *str[3],*p;
 	char w1[1024], w2[1024];
-	
+
 	if( (fp=fopen(filename,"r"))==NULL ){
 		ShowError("can't read %s\n", filename);
 		return;
@@ -571,8 +571,10 @@ static void itemdb_read_itemgroup_sub(const char* filename)
 		}
 		for(j=0;j<k;j++)
 			itemgroup_db[groupid].nameid[itemgroup_db[groupid].qty++] = nameid;
+		entries++;
 	}
 	fclose(fp);
+	ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", entries, filename);
 	return;
 }
 
@@ -582,7 +584,6 @@ static void itemdb_read_itemgroup(void)
 	snprintf(path, 255, "%s/"DBPATH"item_group_db.txt", db_path);
 	memset(&itemgroup_db, 0, sizeof(itemgroup_db));
 	itemdb_read_itemgroup_sub(path);
-	ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n", "item_group_db.txt");
 	return;
 }
 
@@ -748,12 +749,12 @@ static bool itemdb_read_nouse(char* fields[], int columns, int current)
 	struct item_data* id;
 
 	nameid = atoi(fields[0]);
-	
+
 	if( ( id = itemdb_exists(nameid) ) == NULL ) {
 		ShowWarning("itemdb_read_nouse: Invalid item id %d.\n", nameid);
 		return false;
 	}
-	
+
 	flag = atoi(fields[1]);
 	override = atoi(fields[2]);
 
@@ -768,21 +769,21 @@ static bool itemdb_read_nouse(char* fields[], int columns, int current)
  **/
 int itemdb_combo_split_atoi (char *str, int *val) {
 	int i;
-	
+
 	for (i=0; i<MAX_ITEMS_PER_COMBO; i++) {
 		if (!str) break;
-		
+
 		val[i] = atoi(str);
-		
+
 		str = strchr(str,':');
-		
+
 		if (str)
 			*str++=0;
 	}
-	
+
 	if( i == 0 ) //No data found.
 		return 0;
-	
+
 	return i;
 }
 /**
@@ -791,56 +792,56 @@ int itemdb_combo_split_atoi (char *str, int *val) {
 void itemdb_read_combos() {
 	uint32 lines = 0, count = 0;
 	char line[1024];
-	
+
 	char path[256];
 	FILE* fp;
-	
+
 	sprintf(path, "%s/%s", db_path, DBPATH"item_combo_db.txt");
-	
+
 	if ((fp = fopen(path, "r")) == NULL) {
 		ShowError("itemdb_read_combos: File not found \"%s\".\n", path);
 		return;
 	}
-	
+
 	// process rows one by one
 	while(fgets(line, sizeof(line), fp)) {
 		char *str[2], *p;
-		
+
 		lines++;
 
 		if (line[0] == '/' && line[1] == '/')
 			continue;
-		
+
 		memset(str, 0, sizeof(str));
-		
+
 		p = line;
-		
+
 		p = trim(p);
 
 		if (*p == '\0')
 			continue;// empty line
-		
+
 		if (!strchr(p,','))
 		{
 			/* is there even a single column? */
 			ShowError("itemdb_read_combos: Insufficient columns in line %d of \"%s\", skipping.\n", lines, path);
 			continue;
 		}
-		
+
 		str[0] = p;
 		p = strchr(p,',');
 		*p = '\0';
 		p++;
 
 		str[1] = p;
-		p = strchr(p,',');		
+		p = strchr(p,',');
 		p++;
-		
+
 		if (str[1][0] != '{') {
 			ShowError("itemdb_read_combos(#1): Invalid format (Script column) in line %d of \"%s\", skipping.\n", lines, path);
 			continue;
 		}
-		
+
 		/* no ending key anywhere (missing \}\) */
 		if ( str[1][strlen(str[1])-1] != '}' ) {
 			ShowError("itemdb_read_combos(#2): Invalid format (Script column) in line %d of \"%s\", skipping.\n", lines, path);
@@ -850,12 +851,12 @@ void itemdb_read_combos() {
 			int v = 0, retcount = 0;
 			struct item_data * id = NULL;
 			int idx = 0;
-			
+
 			if((retcount = itemdb_combo_split_atoi(str[0], items)) < 2) {
 				ShowError("itemdb_read_combos: line %d of \"%s\" doesn't have enough items to make for a combo (min:2), skipping.\n", lines, path);
 				continue;
 			}
-			
+
 			/* validate */
 			for(v = 0; v < retcount; v++) {
 				if( !itemdb_exists(items[v]) ) {
@@ -868,9 +869,9 @@ void itemdb_read_combos() {
 				continue;
 
 			id = itemdb_exists(items[0]);
-			
+
 			idx = id->combos_count;
-			
+
 			/* first entry, create */
 			if( id->combos == NULL ) {
 				CREATE(id->combos, struct item_combo*, 1);
@@ -878,9 +879,9 @@ void itemdb_read_combos() {
 			} else {
 				RECREATE(id->combos, struct item_combo*, ++id->combos_count);
 			}
-			
+
 			CREATE(id->combos[idx],struct item_combo,1);
-			
+
 			id->combos[idx]->nameid = aMalloc( retcount * sizeof(unsigned short) );
 			id->combos[idx]->count = retcount;
 			id->combos[idx]->script = parse_script(str[1], path, lines, 0);
@@ -890,40 +891,40 @@ void itemdb_read_combos() {
 			for( v = 0; v < retcount; v++ ) {
 				id->combos[idx]->nameid[v] = items[v];
 			}
-			
+
 			/* populate the children to refer to this combo */
 			for( v = 1; v < retcount; v++ ) {
 				struct item_data * it;
 				int index;
-				
+
 				it = itemdb_exists(items[v]);
-				
+
 				index = it->combos_count;
-				
+
 				if( it->combos == NULL ) {
 					CREATE(it->combos, struct item_combo*, 1);
 					it->combos_count = 1;
 				} else {
 					RECREATE(it->combos, struct item_combo*, ++it->combos_count);
 				}
-				
+
 				CREATE(it->combos[index],struct item_combo,1);
-				
+
 				/* we copy previously alloc'd pointers and just set it to reference */
 				memcpy(it->combos[index],id->combos[idx],sizeof(struct item_combo));
 				/* we flag this way to ensure we don't double-dealloc same data */
 				it->combos[index]->isRef = true;
 			}
-			
+
 		}
-		
+
 		count++;
 	}
-	
+
 	fclose(fp);
-	
+
 	ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"item_combo_db"CL_RESET"'.\n", count);
-		
+
 	return;
 }
 
@@ -987,7 +988,7 @@ static bool itemdb_parse_dbrow(char** str, const char* source, int line, int scr
 	*/
 	int nameid;
 	struct item_data* id;
-	
+
 	nameid = atoi(str[0]);
 	if( nameid <= 0 )
 	{
@@ -1026,9 +1027,9 @@ static bool itemdb_parse_dbrow(char** str, const char* source, int line, int scr
 		id->value_sell = atoi(str[5]);
 	else
 		id->value_sell = id->value_buy / 2;
-	/* 
+	/*
 	if ( !str[4][0] && !str[5][0])
-	{  
+	{
 		ShowWarning("itemdb_parse_dbrow: No buying/selling price defined for item %d (%s), using 20/10z\n",       nameid, id->jname);
 		id->value_buy = 20;
 		id->value_sell = 10;
@@ -1197,18 +1198,18 @@ static int itemdb_readdb(void)
 				continue;
 			}
 			str[21] = p;
-			
+
 			if ( str[21][strlen(str[21])-2] != '}' ) {
 				/* lets count to ensure it's not something silly e.g. a extra space at line ending */
 				int v, lcurly = 0, rcurly = 0;
-				
+
 				for( v = 0; v < strlen(str[21]); v++ ) {
 					if( str[21][v] == '{' )
 						lcurly++;
 					else if ( str[21][v] == '}' )
 						rcurly++;
 				}
-				
+
 				if( lcurly != rcurly ) {
 					ShowError("itemdb_readdb: Mismatching curly braces in line %d of \"%s\" (item with id %d), skipping.\n", lines, path, atoi(str[0]));
 					continue;
@@ -1217,7 +1218,7 @@ static int itemdb_readdb(void)
 
 			if (!itemdb_parse_dbrow(str, path, lines, 0))
 				continue;
-			
+
 			count++;
 		}
 
@@ -1242,7 +1243,7 @@ static int itemdb_read_sqldb(void) {
 								#endif
 									item_db2_db };
 	int fi;
-	
+
 	for( fi = 0; fi < ARRAYLENGTH(item_db_name); ++fi ) {
 		uint32 lines = 0, count = 0;
 
@@ -1289,7 +1290,7 @@ static int itemdb_read_sqldb(void) {
 *------------------------------------------*/
 uint64 itemdb_unique_id(int8 flag, int64 value) {
 	static uint64 item_uid = 0;
-	
+
 	if(flag)
 	{
 		if(flag == 1)
@@ -1297,7 +1298,7 @@ uint64 itemdb_unique_id(int8 flag, int64 value) {
 				return (item_uid = value);
 		}else if(flag == 2)
 			return (item_uid = value);
-			
+
 		return item_uid;
 	}
 
@@ -1327,12 +1328,12 @@ int itemdb_uid_load(){
  * read all item-related databases
  *------------------------------------*/
 static void itemdb_read(void) {
-	
+
 	if (db_use_sqldbs)
 		itemdb_read_sqldb();
 	else
 		itemdb_readdb();
-	
+
 	itemdb_read_combos();
 	itemdb_read_itemgroup();
 	sv_readdb(db_path, "item_avail.txt",         ',', 2, 2, -1, &itemdb_read_itemavail);
@@ -1401,7 +1402,7 @@ void itemdb_reload(void)
 	struct map_session_data* sd;
 
 	int i,d,k;
-	
+
 	// clear the previous itemdb data
 	for( i = 0; i < ARRAYLENGTH(itemdb_array); ++i )
 		if( itemdb_array[i] )
@@ -1410,11 +1411,11 @@ void itemdb_reload(void)
 	itemdb_other->clear(itemdb_other, itemdb_final_sub);
 
 	memset(itemdb_array, 0, sizeof(itemdb_array));
-		
+
 	// read new data
 	itemdb_read();
 	cashshop_reloaddb();
-	
+
 	//Epoque's awesome @reloaditemdb fix - thanks! [Ind]
 	//- Fixes the need of a @reloadmobdb after a @reloaditemdb to re-link monster drop data
 	for( i = 0; i < MAX_MOB_DB; i++ ) {
@@ -1435,7 +1436,7 @@ void itemdb_reload(void)
 
 			if (k == MAX_SEARCH)
 				continue;
-			
+
 			if (id->mob[k].id != i)
 				memmove(&id->mob[k+1], &id->mob[k], (MAX_SEARCH-k-1)*sizeof(id->mob[0]));
 			id->mob[k].chance = entry->dropitem[d].p;

+ 1 - 0
src/map/map.h

@@ -52,6 +52,7 @@ void map_msg_reload(void);
 
 // Added definitions for WoESE objects. [L0ne_W0lf]
 enum MOBID {
+    MOBID_PORING = 1002,
     MOBID_EMPERIUM = 1288,
     MOBID_TREAS01 = 1324,
     MOBID_TREAS40 = 1363,

+ 20 - 85
src/map/mob.c

@@ -53,7 +53,7 @@
 #define MOB_MAX_DELAY (24*3600*1000)
 #define MAX_MINCHASE 30	//Max minimum chase value to use for mobs.
 #define RUDE_ATTACKED_COUNT 2	//After how many rude-attacks should the skill be used?
-#define MAX_MOB_CHAT 250 //Max Skill's messages
+#define MAX_MOB_CHAT 50 //Max Skill's messages
 
 //Dynamic mob database, allows saving of memory when there's big gaps in the mob_db [Skotlex]
 struct mob_db *mob_db_data[MAX_MOB_DB+1];
@@ -4007,7 +4007,7 @@ static int mob_read_randommonster(void)
 	FILE *fp;
 	char line[1024];
 	char *str[10],*p;
-	int i,j;
+	int i,j, entries;
 	const char* mobfile[] = {
 		DBPATH"mob_branch.txt",
 		DBPATH"mob_poring.txt",
@@ -4018,8 +4018,9 @@ static int mob_read_randommonster(void)
 	memset(&summon, 0, sizeof(summon));
 
 	for( i = 0; i < ARRAYLENGTH(mobfile) && i < MAX_RANDOMMONSTER; i++ )
-	{
-		mob_db_data[0]->summonper[i] = 1002;	// Default fallback value, in case the database does not provide one
+	{ // MobID,DummyName,Rate
+		entries=0;
+		mob_db_data[0]->summonper[i] = MOBID_PORING;	// Default fallback value, in case the database does not provide one
 		sprintf(line, "%s/%s", db_path, mobfile[i]);
 		fp=fopen(line,"r");
 		if(fp==NULL){
@@ -4053,6 +4054,7 @@ static int mob_read_randommonster(void)
 					break;
 				}
 			}
+			entries++;
 		}
 		if (i && !summon[i].qty)
 		{ //At least have the default here.
@@ -4060,30 +4062,24 @@ static int mob_read_randommonster(void)
 			summon[i].qty = 1;
 		}
 		fclose(fp);
-		ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n",mobfile[i]);
+		ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", entries, mobfile[i]);
 	}
 	return 0;
 }
 
-/*==========================================
- * processes one mob_chat_db entry [SnakeDrak]
- * @param last_msg_id ensures that only one error message per mob id is printed
- *------------------------------------------*/
-static bool mob_parse_row_chatdb(char** str, const char* source, int line, int* last_msg_id)
+//processes one mob_chat_db entry [SnakeDrak]
+//db struct: Line_ID,Color_Code,Dialog
+static bool mob_parse_row_chatdb(char* fields[], int columns, int current)
 {
 	char* msg;
 	struct mob_chat *ms;
 	int msg_id;
 	size_t len;
 
-	msg_id = atoi(str[0]);
+	msg_id = atoi(fields[0]);
 
-	if (msg_id <= 0 || msg_id > MAX_MOB_CHAT)
-	{
-		if (msg_id != *last_msg_id) {
-			ShowError("mob_chat: Invalid chat ID: %d at %s, line %d\n", msg_id, source, line);
-			*last_msg_id = msg_id;
-		}
+	if (msg_id <= 0 || msg_id > MAX_MOB_CHAT){
+		ShowError("mob_parse_row_chatdb: Invalid chat ID: %d at %s, line %d\n", msg_id, columns, current);
 		return false;
 	}
 
@@ -4094,9 +4090,9 @@ static bool mob_parse_row_chatdb(char** str, const char* source, int line, int*
 	//MSG ID
 	ms->msg_id=msg_id;
 	//Color
-	ms->color=strtoul(str[1],NULL,0);
+	ms->color=strtoul(fields[1],NULL,0);
 	//Message
-	msg = str[2];
+	msg = fields[2];
 	len = strlen(msg);
 
 	while( len && ( msg[len-1]=='\r' || msg[len-1]=='\n' ) )
@@ -4104,82 +4100,21 @@ static bool mob_parse_row_chatdb(char** str, const char* source, int line, int*
 		len--;
 	}
 
-	if(len>(CHAT_SIZE_MAX-1))
-	{
-		if (msg_id != *last_msg_id) {
-			ShowError("mob_chat: readdb: Message too long! Line %d, id: %d\n", line, msg_id);
-			*last_msg_id = msg_id;
-		}
+	if(len>(CHAT_SIZE_MAX-1)){
+		ShowError("mob_chat: readdb: Message too long! Line %d, id: %d\n", current, msg_id);
 		return false;
 	}
-	else if( !len )
-	{
+	else if( !len ){
 		ShowWarning("mob_parse_row_chatdb: Empty message for id %d.\n", msg_id);
 		return false;
 	}
 
 	msg[len] = 0;  // strip previously found EOL
-	safestrncpy(ms->msg, str[2], CHAT_SIZE_MAX);
+	safestrncpy(ms->msg, fields[2], CHAT_SIZE_MAX);
 
 	return true;
 }
 
-/*==========================================
- * mob_chat_db.txt reading [SnakeDrak]
- *-------------------------------------------------------------------------*/
-static void mob_readchatdb(void)
-{
-	char arc[]="mob_chat_db.txt";
-	uint32 lines=0, count=0;
-	char line[1024], path[256];
-	int i, tmp=0;
-	FILE *fp;
-	sprintf(path, "%s/%s", db_path, arc);
-	fp=fopen(path, "r");
-	if(fp == NULL)
-	{
-		ShowWarning("mob_readchatdb: File not found \"%s\", skipping.\n", path);
-		return;
-	}
-
-	while(fgets(line, sizeof(line), fp))
-	{
-		char *str[3], *p, *np;
-		int j=0;
-
-		lines++;
-		if(line[0] == '/' && line[1] == '/')
-			continue;
-		memset(str, 0, sizeof(str));
-
-		p=line;
-		while(ISSPACE(*p))
-			++p;
-		if(*p == '\0')
-			continue;// empty line
-		for(i = 0; i <= 2; i++)
-		{
-			str[i] = p;
-			if(i<2 && (np = strchr(p, ',')) != NULL) {
-				*np = '\0'; p = np + 1; j++;
-			}
-		}
-
-		if( j < 2 || str[2]==NULL)
-		{
-			ShowError("mob_readchatdb: Insufficient number of fields for skill at %s, line %d\n", arc, lines);
-			continue;
-		}
-
-		if( !mob_parse_row_chatdb(str, path, lines, &tmp) )
-			continue;
-
-		count++;
-	}
-	fclose(fp);
-	ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n", arc);
-}
-
 /*==========================================
  * processes one mob_skill_db entry
  *------------------------------------------*/
@@ -4585,7 +4520,7 @@ static bool mob_readdb_itemratio(char* str[], int columns, int current)
 static void mob_load(void)
 {
 	sv_readdb(db_path, "mob_item_ratio.txt", ',', 2, 2+MAX_ITEMRATIO_MOBS, -1, &mob_readdb_itemratio); // must be read before mobdb
-	mob_readchatdb();
+	sv_readdb(db_path, "mob_chat_db.txt", '#', 3, 3, MAX_MOB_CHAT, &mob_parse_row_chatdb);
 	if (db_use_sqldbs)
 	{
 		mob_read_sqldb();

+ 241 - 154
src/map/pc.c

@@ -47,10 +47,10 @@
 #include <string.h>
 #include <time.h>
 
+int pc_split_atoui(char* str, unsigned int* val, char sep, int max);
 
 #define PVP_CALCRANK_INTERVAL 1000	// PVP calculation interval
-static unsigned int exp_table[CLASS_COUNT][2][MAX_LEVEL];
-static unsigned int max_level[CLASS_COUNT][2];
+
 static unsigned int statp[MAX_LEVEL+1];
 #if defined(RENEWAL_DROP) || defined(RENEWAL_EXP)
 static unsigned int level_penalty[3][RC_MAX][MAX_LEVEL*2+1];
@@ -1578,7 +1578,7 @@ int pc_calc_skilltree_normalize_job(struct map_session_data *sd)
 
 	skill_point = pc_calc_skillpoint(sd);
 
-	novice_skills = max_level[pc_class2idx(JOB_NOVICE)][1] - 1;
+	novice_skills = job_info[pc_class2idx(JOB_NOVICE)].max_level[1] - 1;
 
 	// limit 1st class and above to novice job levels
 	if(skill_point < novice_skills)
@@ -1595,7 +1595,7 @@ int pc_calc_skilltree_normalize_job(struct map_session_data *sd)
 			{
 				// if neither 2nd nor 3rd jobchange levels are known, we have to assume a default for 2nd
 				if (!sd->change_level_3rd)
-					sd->change_level_2nd = max_level[pc_class2idx(pc_mapid2jobid(sd->class_&MAPID_UPPERMASK, sd->status.sex))][1];
+					sd->change_level_2nd = job_info[pc_class2idx(pc_mapid2jobid(sd->class_&MAPID_UPPERMASK, sd->status.sex))].max_level[1];
 				else
 					sd->change_level_2nd = 1 + skill_point + sd->status.skill_point
 						- (sd->status.job_level - 1)
@@ -5874,14 +5874,12 @@ int pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned int
 /*==========================================
  * Returns max level for this character.
  *------------------------------------------*/
-unsigned int pc_maxbaselv(struct map_session_data *sd)
-{
-  	return max_level[pc_class2idx(sd->status.class_)][0];
+unsigned int pc_maxbaselv(struct map_session_data *sd){
+	return job_info[pc_class2idx(sd->status.class_)].max_level[0];
 }
 
-unsigned int pc_maxjoblv(struct map_session_data *sd)
-{
-  	return max_level[pc_class2idx(sd->status.class_)][1];
+unsigned int pc_maxjoblv(struct map_session_data *sd){
+	return job_info[pc_class2idx(sd->status.class_)].max_level[1];
 }
 
 /*==========================================
@@ -5896,7 +5894,7 @@ unsigned int pc_nextbaseexp(struct map_session_data *sd)
 	if(sd->status.base_level>=pc_maxbaselv(sd) || sd->status.base_level<=0)
 		return 0;
 
-	return exp_table[pc_class2idx(sd->status.class_)][0][sd->status.base_level-1];
+	return job_info[pc_class2idx(sd->status.class_)].exp_table[0][sd->status.base_level-1];
 }
 
 //Base exp needed for this level.
@@ -5905,7 +5903,7 @@ unsigned int pc_thisbaseexp(struct map_session_data *sd)
 	if(sd->status.base_level>pc_maxbaselv(sd) || sd->status.base_level<=1)
 		return 0;
 
-	return exp_table[pc_class2idx(sd->status.class_)][0][sd->status.base_level-2];
+	return job_info[pc_class2idx(sd->status.class_)].exp_table[0][sd->status.base_level-2];
 }
 
 
@@ -5923,7 +5921,7 @@ unsigned int pc_nextjobexp(struct map_session_data *sd)
 
 	if(sd->status.job_level>=pc_maxjoblv(sd) || sd->status.job_level<=0)
 		return 0;
-	return exp_table[pc_class2idx(sd->status.class_)][1][sd->status.job_level-1];
+	return job_info[pc_class2idx(sd->status.class_)].exp_table[1][sd->status.job_level-1];
 }
 
 //Job exp needed for this level.
@@ -5931,7 +5929,7 @@ unsigned int pc_thisjobexp(struct map_session_data *sd)
 {
 	if(sd->status.job_level>pc_maxjoblv(sd) || sd->status.job_level<=1)
 		return 0;
-	return exp_table[pc_class2idx(sd->status.class_)][1][sd->status.job_level-2];
+	return job_info[pc_class2idx(sd->status.class_)].exp_table[1][sd->status.job_level-2];
 }
 
 /// Returns the value of the specified stat.
@@ -9627,7 +9625,7 @@ static bool pc_readdb_levelpenalty(char* fields[], int columns, int current)
 {
 	int type, race, diff;
 
-	type = atoi(fields[0]);
+	type = atoi(fields[0]); //1=experience, 2=item drop
 	race = atoi(fields[1]);
 	diff = atoi(fields[2]);
 
@@ -9652,102 +9650,219 @@ static bool pc_readdb_levelpenalty(char* fields[], int columns, int current)
 }
 #endif
 
-/*==========================================
- * pc DB reading.
- * exp.txt        - required experience values
- * skill_tree.txt - skill tree for every class
- * attr_fix.txt   - elemental adjustment table
- *------------------------------------------*/
-int pc_readdb(void)
-{
-	int i,j,k;
-	FILE *fp;
-	char line[24000],*p;
 
-	//reset
-	memset(exp_table,0,sizeof(exp_table));
-	memset(max_level,0,sizeof(max_level));
+//Reading job_db1.txt line, (class,weight,HPFactor,HPMultiplicator,SPFactor,aspd/lvl...)
+static bool pc_readdb_job1(char* fields[], int columns, int current){
+	int idx, class_;
+	unsigned int i;
 
-	sprintf(line, "%s/"DBPATH"exp.txt", db_path);
+	class_ = atoi(fields[0]);
 
-	fp=fopen(line, "r");
-	if(fp==NULL){
-		ShowError("can't read %s\n", line);
-		return 1;
+	if(!pcdb_checkid(class_))
+	{
+		ShowWarning("status_readdb_job1: Invalid job class %d specified.\n", class_);
+		return false;
 	}
-	while(fgets(line, sizeof(line), fp))
+	idx = pc_class2idx(class_);
+
+	job_info[idx].max_weight_base = atoi(fields[1]);
+	job_info[idx].hp_factor  = atoi(fields[2]);
+	job_info[idx].hp_multiplicator = atoi(fields[3]);
+	job_info[idx].sp_factor  = atoi(fields[4]);
+#ifdef RENEWAL_ASPD
+	for(i = 0; i <= MAX_WEAPON_TYPE; i++)
+#else
+	for(i = 0; i < MAX_WEAPON_TYPE; i++)
+#endif
 	{
-		int jobs[CLASS_COUNT], job_count, job, job_id;
-		int type;
-		unsigned int ui,maxlv;
-		char *split[4];
-		if(line[0]=='/' && line[1]=='/')
-			continue;
-		if (pc_split_str(line,split,4) < 4)
-			continue;
+		job_info[idx].aspd_base[i] = atoi(fields[i+5]);
+	}
+	return true;
+}
 
-		job_count = pc_split_atoi(split[1],jobs,':',CLASS_COUNT);
-		if (job_count < 1)
-			continue;
-		job_id = jobs[0];
-		if (!pcdb_checkid(job_id)) {
-			ShowError("pc_readdb: Invalid job ID %d.\n", job_id);
-			continue;
-		}
-		type = atoi(split[2]);
-		if (type < 0 || type > 1) {
-			ShowError("pc_readdb: Invalid type %d (must be 0 for base levels, 1 for job levels).\n", type);
-			continue;
+//Reading job_db2.txt line (class,JobLv1,JobLv2,JobLv3,...)
+static bool pc_readdb_job2(char* fields[], int columns, int current)
+{
+	int idx, class_, i;
+
+	class_ = atoi(fields[0]);
+
+	if(!pcdb_checkid(class_))
+	{
+		ShowWarning("status_readdb_job2: Invalid job class %d specified.\n", class_);
+		return false;
+	}
+	idx = pc_class2idx(class_);
+
+	for(i = 1; i < columns; i++)
+	{
+		job_info[idx].job_bonus[i-1] = atoi(fields[i]);
+	}
+	return true;
+}
+
+//Reading job_maxhpsp.txt line
+//startlvl,maxlvl,class,type,values...
+static bool pc_readdb_job_maxhpsp(char* fields[], int columns, int current)
+{
+	int idx, i,j, maxlvl, startlvl;
+	int job_id,job_count,jobs[CLASS_COUNT];
+	int type;
+
+	startlvl = atoi(fields[0]);
+	if(startlvl > MAX_LEVEL || startlvl<1){
+		ShowError("pc_readdb_job_maxhpsp: Invalid startlvl %d specified.\n", startlvl);
+		return false;
+	}
+	maxlvl = atoi(fields[1]);
+	if(maxlvl > MAX_LEVEL || maxlvl<1){
+		ShowError("pc_readdb_job_maxhpsp: Invalid maxlevel %d specified.\n", maxlvl);
+		return false;
+	}
+	if((maxlvl-startlvl+1+4) != columns){ //nb values = (maxlvl-startlvl)+1-index1stvalue
+		ShowError("pc_readdb_job_maxhpsp: Number of colums=%d defined is too low for startlevel=%d,maxlevel=%d\n",columns,startlvl,maxlvl);
+		return false;
+	}
+	type = atoi(fields[3]);
+	if(type < 0 || type > 1){
+		ShowError("pc_readdb_job_maxhpsp: Invalid type %d specified, only [0;1] is valid.\n", type);
+		return false;
+	}
+	job_count = pc_split_atoi(fields[2],jobs,':',CLASS_COUNT);
+	if (job_count < 1)
+		return false;
+	for (j = 0; j < job_count; j++) {
+		job_id = jobs[j];
+		if(!pcdb_checkid(job_id)){
+			ShowError("pc_readdb_job_maxhpsp: Invalid job class %d specified.\n", job_id);
+			return false;
 		}
-		maxlv = atoi(split[0]);
-		if (maxlv > MAX_LEVEL) {
-			ShowWarning("pc_readdb: Specified max level %u for job %d is beyond server's limit (%u).\n ", maxlv, job_id, MAX_LEVEL);
-			maxlv = MAX_LEVEL;
-		}
-
-		job = jobs[0] = pc_class2idx(job_id);
-		//We send one less and then one more because the last entry in the exp array should hold 0.
-		max_level[job][type] = pc_split_atoui(split[3], exp_table[job][type],',',maxlv-1)+1;
-		//Reverse check in case the array has a bunch of trailing zeros... [Skotlex]
-		//The reasoning behind the -2 is this... if the max level is 5, then the array
-		//should look like this:
-		//0: x, 1: x, 2: x: 3: x 4: 0 <- last valid value is at 3.
-		while ((ui = max_level[job][type]) >= 2 && exp_table[job][type][ui-2] <= 0)
-			max_level[job][type]--;
-		if (max_level[job][type] < maxlv) {
-			ShowWarning("pc_readdb: Specified max %u for job %d, but that job's exp table only goes up to level %u.\n", maxlv, job_id, max_level[job][type]);
-			ShowInfo("Filling the missing values with the last exp entry.\n");
-			//Fill the requested values with the last entry.
-			ui = (max_level[job][type] <= 2? 0: max_level[job][type]-2);
-			for (; ui+2 < maxlv; ui++)
-				exp_table[job][type][ui] = exp_table[job][type][ui-1];
-			max_level[job][type] = maxlv;
-		}
-//		ShowDebug("%s - Class %d: %d\n", type?"Job":"Base", job_id, max_level[job][type]);
-		for (i = 1; i < job_count; i++) {
-			job_id = jobs[i];
-			if (!pcdb_checkid(job_id)) {
-				ShowError("pc_readdb: Invalid job ID %d.\n", job_id);
-				continue;
+		idx = pc_class2idx(job_id);
+		if(type == 0){ //hp type
+			unsigned int k = 0;
+			unsigned int val, oldval=0;
+			for(i = 1; i <= MAX_LEVEL; i++) {
+				val = 0;
+				k += (job_info[idx].hp_factor*(i+1) + 50) / 100;
+				if(i>=startlvl && i <=maxlvl) val = atoi(fields[i+4]);
+				if(val==0) val = 35 + ((i+1)*job_info[idx].hp_multiplicator)/100 + k;
+				if(oldval >= val)
+					ShowWarning("Warn, HP value is lower or equal then previous one for (job=%d,oldval=%d,val=%d,lvl=%d hp_factor=%d,hp_multiplicator=%d,k=%d)\n",
+						job_id,oldval,val,i+1,job_info[idx].hp_factor,job_info[idx].hp_multiplicator,k);
+				val = min(INT_MAX,val);
+				job_info[idx].hp_table[i-1] = val;
+				oldval = val;
+			}
+	//		ShowInfo("Have readen hp table for job=%d\n{",job_id);
+	//		for(i=0; i<MAX_LEVEL; i++ )
+	//			printf("%d,",job_info[idx].hp_table[i]);
+	//		printf("\n}\n");
+		}
+		else if(type == 1){ //sp type
+			unsigned int val, oldval=0;
+			for(i = 1; i <= MAX_LEVEL; i++) {
+				val = 0;
+				if(i>=startlvl && i <=maxlvl) val = atoi(fields[i+4]);
+				if(val==0) val = 10 + ((i+1)*job_info[idx].sp_factor)/100;
+				if(oldval >= val) ShowWarning("Warn, SP value is lower or equal then previous one for (job=%d,oldval=%d,val=%d,lvl=%d,sp_factor=%d)\n",
+					job_id,oldval,val,i,job_info[idx].sp_factor);
+				val = min(INT_MAX,val);
+				job_info[idx].sp_table[i-1] = val;
+				oldval = val;
 			}
-			job = pc_class2idx(job_id);
-			memcpy(exp_table[job][type], exp_table[jobs[0]][type], sizeof(exp_table[0][0]));
-			max_level[job][type] = maxlv;
-//			ShowDebug("%s - Class %d: %u\n", type?"Job":"Base", job_id, max_level[job][type]);
+//			ShowInfo("Have readen sp table for job=%d\n{",job_id);
+//			for(i=0; i<MAX_LEVEL; i++ )
+//				printf("%d,",job_info[idx].sp_table[i]);
+//			printf("\n}\n");
 		}
 	}
-	fclose(fp);
-	for (i = 0; i < JOB_MAX; i++) {
-		if (!pcdb_checkid(i)) continue;
-		if (i == JOB_WEDDING || i == JOB_XMAS || i == JOB_SUMMER || i == JOB_HANBOK)
-			continue; //Classes that do not need exp tables.
-		j = pc_class2idx(i);
-		if (!max_level[j][0])
-			ShowWarning("Class %s (%d) does not have a base exp table.\n", job_name(i), i);
-		if (!max_level[j][1])
-			ShowWarning("Class %s (%d) does not have a job exp table.\n", job_name(i), i);
+	return true;
+}
+
+//Reading job_maxhpsp.txt line
+//Max Level,Class list,Type (0 - Base Exp; 1 - Job Exp),Exp/lvl...
+static bool pc_readdb_job_exp(char* fields[], int columns, int current)
+{
+	int idx, i, type;
+	int job_id,job_count,jobs[CLASS_COUNT];
+	unsigned int ui, maxlvl;
+
+	maxlvl = atoi(fields[0]);
+	if(maxlvl > MAX_LEVEL || maxlvl<1){
+		ShowError("pc_readdb_job_exp: Invalid maxlevel %d specified.\n", maxlvl);
+		return false;
+	}
+	if((maxlvl+3) > columns){ //nb values = (maxlvl-startlvl)+1-index1stvalue
+		ShowError("pc_readdb_job_exp: Number of colums=%d defined is too low for maxlevel=%d\n",columns,maxlvl);
+		return false;
+	}
+	type = atoi(fields[2]);
+	if(type < 0 || type > 1){
+		ShowError("pc_readdb_job_exp: Invalid type %d specified, only [0;1] is valid.\n", type);
+		return false;
 	}
-	ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","exp.txt");
+	job_count = pc_split_atoi(fields[1],jobs,':',CLASS_COUNT);
+	if (job_count < 1)
+		return false;
+	job_id = jobs[0];
+	if(!pcdb_checkid(job_id)){
+		ShowError("pc_readdb_job_exp: Invalid job class %d specified.\n", job_id);
+		return false;
+	}
+	idx = pc_class2idx(job_id);
+
+	job_info[idx].max_level[type] = maxlvl;
+	for(i=0; i<maxlvl; i++){
+		job_info[idx].exp_table[type][i] = ((uint32) atoi(fields[3+i]));
+	}
+	//Reverse check in case the array has a bunch of trailing zeros... [Skotlex]
+	//The reasoning behind the -2 is this... if the max level is 5, then the array
+	//should look like this:
+	//0: x, 1: x, 2: x: 3: x 4: 0 <- last valid value is at 3.
+	while ((ui = job_info[idx].max_level[type]) >= 2 && job_info[idx].exp_table[type][ui-2] <= 0)
+		job_info[idx].max_level[type]--;
+	if (job_info[idx].max_level[type] < maxlvl) {
+		ShowWarning("pc_readdb: Specified max %u for job %d, but that job's exp table only goes up to level %u.\n", maxlvl, job_id, job_info[idx].max_level[type]);
+		ShowInfo("Filling the missing values with the last exp entry.\n");
+		//Fill the requested values with the last entry.
+		ui = (job_info[idx].max_level[type] <= 2? 0: job_info[idx].max_level[type]-2);
+		for (; ui+2 < maxlvl; ui++)
+			job_info[idx].exp_table[type][ui] = job_info[idx].exp_table[type][ui-1];
+		job_info[idx].max_level[type] = maxlvl;
+	}
+//	ShowInfo("%s - Class %d: %d\n", type?"Job":"Base", job_id, job_info[idx].max_level[type]);
+	for (i = 1; i < job_count; i++) {
+		job_id = jobs[i];
+		if (!pcdb_checkid(job_id)) {
+			ShowError("pc_readdb_job_exp: Invalid job ID %d.\n", job_id);
+			continue;
+		}
+		idx = pc_class2idx(job_id);
+		memcpy(job_info[idx].exp_table[type], job_info[jobs[0]].exp_table[type], sizeof(job_info[0].exp_table[0]));
+		job_info[idx].max_level[type] = maxlvl;
+//		ShowInfo("%s - Class %d: %u\n", type?"Job":"Base", job_id, job_info[idx].max_level[type]);
+	}
+	return true;
+}
+
+/*==========================================
+ * pc DB reading.
+ * exp.txt		- required experience values
+ * skill_tree.txt	- skill tree for every class
+ * attr_fix.txt		- elemental adjustment table
+ * job_db1.txt		- job,weight,hp_factor,hp_multiplicator,sp_factor,aspds/lvl
+ * job_db2.txt		- job,stats bonuses/lvl
+ * job_maxhpsp_db.txt	- strtlvl,maxlvl,job,type,values/lvl (values=hp|sp)
+ *------------------------------------------*/
+int pc_readdb(void)
+{
+	int i,j,k, entries;
+	FILE *fp;
+	char line[24000];
+
+	//reset
+	memset(job_info,0,sizeof(job_info)); // job_info table
+
 
 	// Reset and read skilltree
 	memset(skill_tree,0,sizeof(skill_tree));
@@ -9770,58 +9885,6 @@ int pc_readdb(void)
 	}
 #endif
 
-	// Reset then read attr_fix
-	for(i=0;i<4;i++)
-		for(j=0;j<ELE_MAX;j++)
-			for(k=0;k<ELE_MAX;k++)
-				attr_fix_table[i][j][k]=100;
-
-	sprintf(line, "%s/"DBPATH"attr_fix.txt", db_path);
-
-	fp=fopen(line,"r");
-	if(fp==NULL){
-		ShowError("can't read %s\n", line);
-		return 1;
-	}
-	while(fgets(line, sizeof(line), fp))
-	{
-		char *split[10];
-		int lv,n;
-		if(line[0]=='/' && line[1]=='/')
-			continue;
-		for(j=0,p=line;j<3 && p;j++){
-			split[j]=p;
-			p=strchr(p,',');
-			if(p) *p++=0;
-		}
-		if( j < 2 )
-			continue;
-
-		lv=atoi(split[0]);
-		n=atoi(split[1]);
-
-		for(i=0;i<n && i<ELE_MAX;){
-			if( !fgets(line, sizeof(line), fp) )
-				break;
-			if(line[0]=='/' && line[1]=='/')
-				continue;
-
-			for(j=0,p=line;j<n && j<ELE_MAX && p;j++){
-				while(*p==32 && *p>0)
-					p++;
-				attr_fix_table[lv-1][i][j]=atoi(p);
-				if(battle_config.attr_recover == 0 && attr_fix_table[lv-1][i][j] < 0)
-					attr_fix_table[lv-1][i][j] = 0;
-				p=strchr(p,',');
-				if(p) *p++=0;
-			}
-
-			i++;
-		}
-	}
-	fclose(fp);
-	ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","attr_fix.txt");
-
 	 // reset then read statspoint
 	memset(statp,0,sizeof(statp));
 	i=1;
@@ -9832,6 +9895,7 @@ int pc_readdb(void)
 		ShowWarning("Can't read '"CL_WHITE"%s"CL_RESET"'... Generating DB.\n",line);
 		//return 1;
 	} else {
+		entries=0;
 		while(fgets(line, sizeof(line), fp))
 		{
 			int stat;
@@ -9843,10 +9907,10 @@ int pc_readdb(void)
 				break;
 			statp[i]=stat;
 			i++;
+			entries++;
 		}
 		fclose(fp);
-
-		ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","statpoint.txt");
+		ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", entries, DBPATH"statpoint.txt");
 	}
 	// generate the remaining parts of the db if necessary
 	k = battle_config.use_statpoint_table; //save setting
@@ -9856,6 +9920,29 @@ int pc_readdb(void)
 		statp[i] = statp[i-1] + pc_gets_status_point(i-1);
 	battle_config.use_statpoint_table = k; //restore setting
 
+#ifdef RENEWAL_ASPD
+	sv_readdb(db_path, "re/job_db1.txt",',',6+MAX_WEAPON_TYPE,6+MAX_WEAPON_TYPE,CLASS_COUNT,&pc_readdb_job1);
+#else
+	sv_readdb(db_path, "pre-re/job_db1.txt",',',5+MAX_WEAPON_TYPE,5+MAX_WEAPON_TYPE,CLASS_COUNT,&pc_readdb_job1);
+#endif
+	sv_readdb(db_path, "job_db2.txt",',',1,1+MAX_LEVEL,CLASS_COUNT,&pc_readdb_job2);
+	sv_readdb(db_path, DBPATH"job_maxhpsp_db.txt", ',', 4, 4+MAX_LEVEL, CLASS_COUNT*2, &pc_readdb_job_maxhpsp);
+	sv_readdb(db_path, DBPATH"job_exp.txt",',',4,1000+3,CLASS_COUNT*2,&pc_readdb_job_exp); //support till 1000lvl
+
+
+	//Checking if all class have their data
+	for (i = 0; i < JOB_MAX; i++) {
+		int j;
+		if (!pcdb_checkid(i)) continue;
+		if (i == JOB_WEDDING || i == JOB_XMAS || i == JOB_SUMMER || i == JOB_HANBOK)
+			continue; //Classes that do not need exp tables.
+		j = pc_class2idx(i);
+		if (!job_info[j].max_level[0])
+			ShowWarning("Class %s (%d) does not have a base exp table.\n", job_name(i), i);
+		if (!job_info[j].max_level[0])
+			ShowWarning("Class %s (%d) does not have a job exp table.\n", job_name(i), i);
+	}
+
 	return 0;
 }
 

+ 23 - 5
src/map/pc.h

@@ -25,6 +25,12 @@
 #define MAX_PC_FEELHATE 3
 #define DAMAGELOG_SIZE_PC 100	// Any idea for this value?
 
+//Update this max as necessary. 55 is the value needed for Super Baby currently
+//Raised to 84 since Expanded Super Novice needs it.
+#define MAX_SKILL_TREE 84
+//Total number of classes (for data storage)
+#define CLASS_COUNT (JOB_MAX - JOB_NOVICE_HIGH + JOB_MAX_BASIC)
+
 //Equip indexes constants. (eg: sd->equip_index[EQI_AMMO] returns the index
 //where the arrows are equipped)
 enum equip_index {
@@ -522,11 +528,6 @@ struct map_session_data {
 
 };
 
-//Update this max as necessary. 55 is the value needed for Super Baby currently
-//Raised to 84 since Expanded Super Novice needs it.
-#define MAX_SKILL_TREE 84
-//Total number of classes (for data storage)
-#define CLASS_COUNT (JOB_MAX - JOB_NOVICE_HIGH + JOB_MAX_BASIC)
 
 enum weapon_type {
 	W_FIST,	//Bare hands
@@ -601,6 +602,22 @@ enum equip_pos {
 	//EQP_SHADOW_ACC_L   = 0x200000,
 };
 
+struct {
+	int hp_table[MAX_LEVEL];
+	int sp_table[MAX_LEVEL];
+	int hp_factor, hp_multiplicator;
+	int sp_factor;
+	int max_weight_base;
+	char job_bonus[MAX_LEVEL];
+#ifdef RENEWAL_ASPD
+	int aspd_base[MAX_WEAPON_TYPE+1];
+#else
+	int aspd_base[MAX_WEAPON_TYPE];	//[blackhole89]
+#endif
+	uint32 exp_table[2][MAX_LEVEL];
+	uint32 max_level[2];
+} job_info[CLASS_COUNT];
+
 #define EQP_WEAPON EQP_HAND_R
 #define EQP_SHIELD EQP_HAND_L
 #define EQP_ARMS (EQP_HAND_R|EQP_HAND_L)
@@ -705,6 +722,7 @@ enum equip_pos {
     )
 #endif
 
+int pc_split_atoi(char* str, int* val, char sep, int max);
 int pc_class2idx(int class_);
 int pc_get_group_level(struct map_session_data *sd);
 int pc_get_group_id(struct map_session_data *sd);

+ 1 - 1
src/map/skill.c

@@ -6301,7 +6301,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		}
 		break;
 	case ASC_CDP:
-     	if(sd) {
+		if(sd) {
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 			skill_produce_mix(sd, skill_id, 678, 0, 0, 0, 1); //Produce a Deadly Poison Bottle.
 		}

+ 85 - 145
src/map/status.c

@@ -48,17 +48,6 @@ enum e_regen
 	RGN_SSP = 0x08,
 };
 
-static int max_weight_base[CLASS_COUNT];
-static int hp_coefficient[CLASS_COUNT];
-static int hp_coefficient2[CLASS_COUNT];
-static int hp_sigma_val[CLASS_COUNT][MAX_LEVEL+1];
-static int sp_coefficient[CLASS_COUNT];
-#ifdef RENEWAL_ASPD
-static int aspd_base[CLASS_COUNT][MAX_WEAPON_TYPE+1];
-#else
-static int aspd_base[CLASS_COUNT][MAX_WEAPON_TYPE];	//[blackhole89]
-#endif
-
 // bonus values and upgrade chances for refining equipment
 static struct {
 	int chance[MAX_REFINE]; // success chance
@@ -67,7 +56,6 @@ static struct {
 } refine_info[REFINE_TYPE_MAX];
 
 static int atkmods[3][MAX_WEAPON_TYPE];	//ATK weapon modification for size (size_fix.txt)
-static char job_bonus[CLASS_COUNT][MAX_LEVEL];
 
 static struct eri *sc_data_ers; //For sc_data entries
 static struct status_data dummy_status;
@@ -1820,6 +1808,7 @@ int status_base_amotion_pc(struct map_session_data* sd, struct status_data* stat
 	int amotion;
 #ifdef RENEWAL_ASPD
 	short mod = -1;
+	int classidx = pc_class2idx(sd->status.class_);
 
 	switch( sd->weapontype2 ){ // adjustment for dual weilding
 		case W_DAGGER:	mod = 0;	break; // 0, 1, 1
@@ -1830,21 +1819,21 @@ int status_base_amotion_pc(struct map_session_data* sd, struct status_data* stat
 	}
 
 	amotion = ( sd->status.weapon < MAX_WEAPON_TYPE && mod < 0 )
-			? (aspd_base[pc_class2idx(sd->status.class_)][sd->status.weapon]) // single weapon
-			: ((aspd_base[pc_class2idx(sd->status.class_)][sd->weapontype2] // dual-wield
-			+ aspd_base[pc_class2idx(sd->status.class_)][sd->weapontype2]) * 6 / 10 + 10 * mod
-			- aspd_base[pc_class2idx(sd->status.class_)][sd->weapontype2]
-			+ aspd_base[pc_class2idx(sd->status.class_)][sd->weapontype1]);
+			? (job_info[classidx].aspd_base[sd->status.weapon]) // single weapon
+			: ((job_info[classidx].aspd_base[sd->weapontype2] // dual-wield
+			+ job_info[classidx].aspd_base[sd->weapontype2]) * 6 / 10 + 10 * mod
+			- job_info[classidx].aspd_base[sd->weapontype2]
+			+ job_info[classidx].aspd_base[sd->weapontype1]);
 
 	if ( sd->status.shield )
-			amotion += ( 2000 - aspd_base[pc_class2idx(sd->status.class_)][W_FIST] ) +
-					( aspd_base[pc_class2idx(sd->status.class_)][MAX_WEAPON_TYPE] - 2000 );
+			amotion += ( 2000 - job_info[classidx].aspd_base[W_FIST] ) +
+					( job_info[classidx].aspd_base[MAX_WEAPON_TYPE] - 2000 );
 
 #else
 	// base weapon delay
 	amotion = (sd->status.weapon < MAX_WEAPON_TYPE)
-	 ? (aspd_base[pc_class2idx(sd->status.class_)][sd->status.weapon]) // single weapon
-	 : (aspd_base[pc_class2idx(sd->status.class_)][sd->weapontype1] + aspd_base[pc_class2idx(sd->status.class_)][sd->weapontype2])*7/10; // dual-wield
+	 ? (job_info[classidx].aspd_base[sd->status.weapon]) // single weapon
+	 : (job_info[classidx].aspd_base[sd->weapontype1] + job_info[classidx].aspd_base[sd->weapontype2])*7/10; // dual-wield
 
 	// percentual delay reduction from stats
 	amotion -= amotion * (4*status->agi + status->dex)/1000;
@@ -2240,39 +2229,11 @@ int status_calc_pet_(struct pet_data *pd, bool first)
 	return 1;
 }
 
-/// Helper function for status_base_pc_maxhp(), used to pre-calculate the hp_sigma_val[] array
-static void status_calc_sigma(void)
-{
-	int i,j;
-
-	for(i = 0; i < CLASS_COUNT; i++)
-	{
-		unsigned int k = 0;
-		hp_sigma_val[i][0] = hp_sigma_val[i][1] = 0;
-		for(j = 2; j <= MAX_LEVEL; j++)
-		{
-			k += (hp_coefficient[i]*j + 50) / 100;
-			hp_sigma_val[i][j] = k;
-			if (k >= INT_MAX)
-				break; //Overflow protection. [Skotlex]
-		}
-		for(; j <= MAX_LEVEL; j++)
-			hp_sigma_val[i][j] = INT_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 }
+//Calculate maxHP from tables
 static unsigned int status_base_pc_maxhp(struct map_session_data* sd, struct status_data* status)
 {
-	uint64 val = pc_class2idx(sd->status.class_);
-	val = 35 + sd->status.base_level*(int64)hp_coefficient2[val]/100 + hp_sigma_val[val][sd->status.base_level];
+	uint32 val = job_info[pc_class2idx(sd->status.class_)].hp_table[sd->status.base_level-1];
 
-	if((sd->class_&MAPID_UPPERMASK) == MAPID_NINJA || (sd->class_&MAPID_UPPERMASK) == MAPID_GUNSLINGER)
-		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)
@@ -2287,11 +2248,11 @@ static unsigned int status_base_pc_maxhp(struct map_session_data* sd, struct sta
 	return (unsigned int)val;
 }
 
+//Calculate maxSP from tables
 static unsigned int status_base_pc_maxsp(struct map_session_data* sd, struct status_data *status)
 {
-	uint64 val;
+	uint32 val = job_info[pc_class2idx(sd->status.class_)].sp_table[sd->status.base_level-1];
 
-	val = 10 + sd->status.base_level*(int64)sp_coefficient[pc_class2idx(sd->status.class_)]/100;
 	val += val * status->int_/100;
 
 	if (sd->class_&JOBL_UPPER)
@@ -2327,7 +2288,7 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
 
 	pc_calc_skilltree(sd);	// SkillTree calculation
 
-	sd->max_weight = max_weight_base[pc_class2idx(sd->status.class_)]+sd->status.str*300;
+	sd->max_weight = job_info[pc_class2idx(sd->status.class_)].max_weight_base+sd->status.str*300;
 
 	if(first) {
 		//Load Hp/SP from char-received data.
@@ -2704,9 +2665,9 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
 	// Job bonuses
 	index = pc_class2idx(sd->status.class_);
 	for(i=0;i<(int)sd->status.job_level && i<MAX_LEVEL;i++){
-		if(!job_bonus[index][i])
+		if(!job_info[index].job_bonus[i])
 			continue;
-		switch(job_bonus[index][i]) {
+		switch(job_info[index].job_bonus[i]) {
 			case 1: status->str++; break;
 			case 2: status->agi++; break;
 			case 3: status->vit++; break;
@@ -11343,63 +11304,6 @@ int status_get_refine_chance(enum refine_type wlv, int refine) {
 	return refine_info[wlv].chance[refine];
 }
 
-
-/*------------------------------------------
- * DB reading.
- * job_db1.txt    - weight, hp, sp, aspd
- * job_db2.txt    - job level stat bonuses
- * size_fix.txt   - size adjustment table for weapons
- * refine_db.txt  - refining data table
- *------------------------------------------*/
-static 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]);
-
-	if(!pcdb_checkid(class_))
-	{
-		ShowWarning("status_readdb_job1: Invalid job class %d specified.\n", class_);
-		return false;
-	}
-	idx = pc_class2idx(class_);
-
-	max_weight_base[idx] = atoi(fields[1]);
-	hp_coefficient[idx]  = atoi(fields[2]);
-	hp_coefficient2[idx] = atoi(fields[3]);
-	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
-	{
-		aspd_base[idx][i] = atoi(fields[i+5]);
-	}
-	return true;
-}
-
-static bool status_readdb_job2(char* fields[], int columns, int current)
-{
-	int idx, class_, i;
-
-	class_ = atoi(fields[0]);
-
-	if(!pcdb_checkid(class_))
-	{
-		ShowWarning("status_readdb_job2: Invalid job class %d specified.\n", class_);
-		return false;
-	}
-	idx = pc_class2idx(class_);
-
-	for(i = 1; i < columns; i++)
-	{
-		job_bonus[idx][i-1] = atoi(fields[i]);
-	}
-	return true;
-}
-
 static bool status_readdb_sizefix(char* fields[], int columns, int current)
 {
 	unsigned int i;
@@ -11445,34 +11349,73 @@ static bool status_readdb_refine(char* fields[], int columns, int current)
 	return true;
 }
 
-/*
-* Read status db
-* job1.txt
-* job2.txt
-* size_fixe.txt
-* refine_db.txt
-*/
-int status_readdb(void)
-{
-	int i, j;
+static bool status_readdb_attrfix(){
+	FILE *fp;
+	char line[512], path[512],*p;
+	int entries=0;
 
-	// initialize databases to default
-	//
 
-	// reset job_db1.txt data
-	memset(max_weight_base, 0, sizeof(max_weight_base));
-	memset(hp_coefficient, 0, sizeof(hp_coefficient));
-	memset(hp_coefficient2, 0, sizeof(hp_coefficient2));
-	memset(sp_coefficient, 0, sizeof(sp_coefficient));
-	memset(aspd_base, 0, sizeof(aspd_base));
-	// reset job_db2.txt data
-	memset(job_bonus,0,sizeof(job_bonus)); // Job-specific stats bonus
+	sprintf(path, "%s/"DBPATH"attr_fix.txt", db_path);
+	fp=fopen(path,"r");
+	if(fp==NULL){
+		ShowError("can't read %s\n", path);
+		return 1;
+	}
+	while(fgets(line, sizeof(line), fp))
+	{
+		char *split[10];
+		int lv,n,i,j;
+		if(line[0]=='/' && line[1]=='/')
+			continue;
+		for(j=0,p=line;j<3 && p;j++){
+			split[j]=p;
+			p=strchr(p,',');
+			if(p) *p++=0;
+		}
+		if( j < 2 )
+			continue;
+
+		lv=atoi(split[0]);
+		n=atoi(split[1]);
+
+		for(i=0;i<n && i<ELE_MAX;){
+			if( !fgets(line, sizeof(line), fp) )
+				break;
+			if(line[0]=='/' && line[1]=='/')
+				continue;
+
+			for(j=0,p=line;j<n && j<ELE_MAX && p;j++){
+				while(*p==32 && *p>0)
+					p++;
+				attr_fix_table[lv-1][i][j]=atoi(p);
+				if(battle_config.attr_recover == 0 && attr_fix_table[lv-1][i][j] < 0)
+					attr_fix_table[lv-1][i][j] = 0;
+				p=strchr(p,',');
+				if(p) *p++=0;
+			}
+
+			i++;
+		}
+		entries++;
+	}
+	fclose(fp);
+	ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", entries, path);
+	return true;
+}
 
+/*------------------------------------------
+ * DB reading.
+ * size_fix.txt		- size adjustment table for weapons
+ * refine_db.txt	- refining data table
+ *------------------------------------------*/
+int status_readdb(void)
+{
+	int i, j, k;
+	// initialize databases to default
 	// size_fix.txt
 	for(i=0;i<ARRAYLENGTH(atkmods);i++)
 		for(j=0;j<MAX_WEAPON_TYPE;j++)
 			atkmods[i][j]=100;
-
 	// refine_db.txt
 	for(i=0;i<ARRAYLENGTH(refine_info);i++)
 	{
@@ -11483,18 +11426,16 @@ int status_readdb(void)
 			refine_info[i].randombonus_max[j] = 0;
 		}
 	}
+	// attr_fix.txt
+	for(i=0;i<4;i++)
+		for(j=0;j<ELE_MAX;j++)
+			for(k=0;k<ELE_MAX;k++)
+				attr_fix_table[i][j][k]=100;
 
 	// read databases
-	//
-
-
-#ifdef RENEWAL_ASPD
-	sv_readdb(db_path, "re/job_db1.txt",   ',',	6+MAX_WEAPON_TYPE, 6+MAX_WEAPON_TYPE,	-1,		&status_readdb_job1);
-#else
-	sv_readdb(db_path, "pre-re/job_db1.txt",   ',',	5+MAX_WEAPON_TYPE, 5+MAX_WEAPON_TYPE,	-1,		&status_readdb_job1);
-#endif
-	sv_readdb(db_path, "job_db2.txt",   ',', 1,                 1+MAX_LEVEL,       -1,                            &status_readdb_job2);
-	sv_readdb(db_path, "size_fix.txt",  ',', MAX_WEAPON_TYPE,   MAX_WEAPON_TYPE,    ARRAYLENGTH(atkmods),         &status_readdb_sizefix);
+	// path,filename,separator,mincol,maxcol,maxrow,func_parsor
+	status_readdb_attrfix(); //TODO use sv_readdb ?
+	sv_readdb(db_path, "size_fix.txt",',',MAX_WEAPON_TYPE,MAX_WEAPON_TYPE,ARRAYLENGTH(atkmods),&status_readdb_sizefix);
 	sv_readdb(db_path, DBPATH"refine_db.txt", ',', 4+MAX_REFINE, 4+MAX_REFINE, ARRAYLENGTH(refine_info), &status_readdb_refine);
 
 	return 0;
@@ -11511,7 +11452,6 @@ int do_init_status(void)
 	initChangeTables();
 	initDummyData();
 	status_readdb();
-	status_calc_sigma();
 	natural_heal_prev_tick = gettick();
 	sc_data_ers = ers_new(sizeof(struct status_change_entry),"status.c::sc_data_ers",ERS_OPT_NONE);
 	add_timer_interval(natural_heal_prev_tick + NATURAL_HEAL_INTERVAL, status_natural_heal_timer, 0, 0, NATURAL_HEAL_INTERVAL);

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików