-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
This commit is contained in:
glighta 2013-06-29 01:39:07 +00:00
parent 5ba50d12a5
commit 185b6b2d5e
14 changed files with 989 additions and 597 deletions

View File

@ -1,45 +1,46 @@
// Monster Chat Database // Monster Chat Database
// //
// Structure of 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 !!

View File

@ -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

View File

@ -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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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) // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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) // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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) // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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) // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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) // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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) // 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 // 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 // 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 // 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) // 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 // 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) // 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 // 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 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 // Dark Collector
@ -188,7 +188,7 @@
// Sorcerer (Regular) // 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 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) // 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) // 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 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) // Sura (Regular)
@ -202,7 +202,7 @@
// Sorcerer (Trans) // 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 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) // 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) // 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 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) // Sura (Trans)
@ -244,7 +244,7 @@
// Baby Sorcerer // 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 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 // 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 // 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 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 // Baby Sura

53
db/re/job_exp.txt Normal file

File diff suppressed because one or more lines are too long

166
db/re/job_maxhpsp_db.txt Normal file
View File

@ -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

View File

@ -58,7 +58,7 @@ char* jstrescapecpy (char* pt, const char* spt)
pt[0] = '\0'; pt[0] = '\0';
return &pt[0]; return &pt[0];
} }
while (spt[i] != '\0') { while (spt[i] != '\0') {
switch (spt[i]) { switch (spt[i]) {
case '\'': case '\'':
@ -150,6 +150,27 @@ char* trim(char* str)
return 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 // Converts one or more consecutive occurences of the delimiters into a single space
// and removes such occurences from the beginning and end of string // and removes such occurences from the beginning and end of string
// NOTE: make sure the string is not const!! // NOTE: make sure the string is not const!!
@ -188,7 +209,7 @@ char* normalize_name(char* str,const char* delims)
return str; 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 //http://www.daniweb.com/code/snippet313.html, Dave Sinkula
// //
const char* stristr(const char* haystack, const char* needle) 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 // Return numerical value of a switch configuration
// on/off, english, français, deutsch, español, portuguese // on/off, english, fran<EFBFBD>ais, deutsch, espa<70>ol, portuguese
//-------------------------------------------------- //--------------------------------------------------
int config_switch(const char* str) 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. /// out_pos[0] and out_pos[1] are the start and end of line.
/// Other position pairs are the start and end of fields. /// Other position pairs are the start and end of fields.
/// Returns the number of fields found or -1 if an error occurs. /// Returns the number of fields found or -1 if an error occurs.
/// ///
/// out_pos can be NULL. /// out_pos can be NULL.
/// If a line terminator is found, the end position is placed there. /// 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. /// for the seconds field and so on.
/// Unfilled positions are set to -1. /// Unfilled positions are set to -1.
/// ///
/// @param str String to parse /// @param str String to parse
/// @param len Length of the string /// @param len Length of the string
/// @param startoff Where to start parsing /// @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. /// out_fields[0] is the start of the next line.
/// Other entries are the start of fields (nul-teminated). /// Other entries are the start of fields (nul-teminated).
/// Returns the number of fields found or -1 if an error occurs. /// Returns the number of fields found or -1 if an error occurs.
/// ///
/// out_fields can be NULL. /// out_fields can be NULL.
/// Fields that don't fit in out_fields are not nul-terminated. /// 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). /// Extra entries in out_fields are filled with the end of the last field (empty string).
/// ///
/// @param str String to parse /// @param str String to parse
/// @param len Length of the string /// @param len Length of the string
/// @param startoff Where to start parsing /// @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; int entries = 0;
char** fields; // buffer for fields ([0] is reserved) char** fields; // buffer for fields ([0] is reserved)
int columns, fields_length; int columns, fields_length;
char path[1024], line[1024]; char path[1024], *line, colsize[512];
char* match; char* match;
snprintf(path, sizeof(path), "%s/%s", directory, filename); 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 // allocate enough memory for the maximum requested amount of columns plus the reserved one
fields_length = maxcols+1; fields_length = maxcols+1;
fields = (char**)aMalloc(fields_length*sizeof(char*)); fields = (char**)aMalloc(fields_length*sizeof(char*));
line = (char*)aMalloc(fields_length*sizeof(colsize));
// process rows one by one // process rows one by one
while( fgets(line, sizeof(line), fp) ) while( fgets(line, fields_length*sizeof(colsize), fp) )
{ {
lines++; lines++;
@ -992,7 +1014,8 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
match[0] = 0; 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') if( line[0] == '\0' || line[0] == '\n' || line[0] == '\r')
continue; continue;
@ -1026,6 +1049,7 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
} }
aFree(fields); aFree(fields);
aFree(line);
fclose(fp); fclose(fp);
ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", entries, path); 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) // @author MouseJstr (original)
/// Allocates a StringBuf /// Allocates a StringBuf
StringBuf* StringBuf_Malloc() StringBuf* StringBuf_Malloc()
{ {
StringBuf* self; StringBuf* self;
CREATE(self, StringBuf, 1); CREATE(self, StringBuf, 1);
@ -1114,7 +1138,7 @@ int StringBuf_Append(StringBuf* self, const StringBuf* sbuf)
} }
// Appends str to the StringBuf // 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 available = self->max_ - (self->ptr_ - self->buf_);
int needed = (int)strlen(str); 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 // 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_); return (int)(self->ptr_ - self->buf_);
} }
/// Returns the data in the StringBuf /// Returns the data in the StringBuf
char* StringBuf_Value(StringBuf* self) char* StringBuf_Value(StringBuf* self)
{ {
*self->ptr_ = '\0'; *self->ptr_ = '\0';
return self->buf_; return self->buf_;
} }
/// Clears the contents of the StringBuf /// Clears the contents of the StringBuf
void StringBuf_Clear(StringBuf* self) void StringBuf_Clear(StringBuf* self)
{ {
self->ptr_ = self->buf_; self->ptr_ = self->buf_;
} }
@ -1160,7 +1184,7 @@ void StringBuf_Destroy(StringBuf* self)
} }
// Frees a StringBuf returned by StringBuf_Malloc // Frees a StringBuf returned by StringBuf_Malloc
void StringBuf_Free(StringBuf* self) void StringBuf_Free(StringBuf* self)
{ {
StringBuf_Destroy(self); StringBuf_Destroy(self);
aFree(self); aFree(self);

View File

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

View File

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

View File

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

View File

@ -53,7 +53,7 @@
#define MOB_MAX_DELAY (24*3600*1000) #define MOB_MAX_DELAY (24*3600*1000)
#define MAX_MINCHASE 30 //Max minimum chase value to use for mobs. #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 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] //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]; struct mob_db *mob_db_data[MAX_MOB_DB+1];
@ -4007,7 +4007,7 @@ static int mob_read_randommonster(void)
FILE *fp; FILE *fp;
char line[1024]; char line[1024];
char *str[10],*p; char *str[10],*p;
int i,j; int i,j, entries;
const char* mobfile[] = { const char* mobfile[] = {
DBPATH"mob_branch.txt", DBPATH"mob_branch.txt",
DBPATH"mob_poring.txt", DBPATH"mob_poring.txt",
@ -4018,8 +4018,9 @@ static int mob_read_randommonster(void)
memset(&summon, 0, sizeof(summon)); memset(&summon, 0, sizeof(summon));
for( i = 0; i < ARRAYLENGTH(mobfile) && i < MAX_RANDOMMONSTER; i++ ) for( i = 0; i < ARRAYLENGTH(mobfile) && i < MAX_RANDOMMONSTER; i++ )
{ { // MobID,DummyName,Rate
mob_db_data[0]->summonper[i] = 1002; // Default fallback value, in case the database does not provide one 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]); sprintf(line, "%s/%s", db_path, mobfile[i]);
fp=fopen(line,"r"); fp=fopen(line,"r");
if(fp==NULL){ if(fp==NULL){
@ -4053,6 +4054,7 @@ static int mob_read_randommonster(void)
break; break;
} }
} }
entries++;
} }
if (i && !summon[i].qty) if (i && !summon[i].qty)
{ //At least have the default here. { //At least have the default here.
@ -4060,30 +4062,24 @@ static int mob_read_randommonster(void)
summon[i].qty = 1; summon[i].qty = 1;
} }
fclose(fp); 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; return 0;
} }
/*========================================== //processes one mob_chat_db entry [SnakeDrak]
* processes one mob_chat_db entry [SnakeDrak] //db struct: Line_ID,Color_Code,Dialog
* @param last_msg_id ensures that only one error message per mob id is printed static bool mob_parse_row_chatdb(char* fields[], int columns, int current)
*------------------------------------------*/
static bool mob_parse_row_chatdb(char** str, const char* source, int line, int* last_msg_id)
{ {
char* msg; char* msg;
struct mob_chat *ms; struct mob_chat *ms;
int msg_id; int msg_id;
size_t len; 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 <= 0 || msg_id > MAX_MOB_CHAT){
{ ShowError("mob_parse_row_chatdb: Invalid chat ID: %d at %s, line %d\n", msg_id, columns, current);
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;
}
return false; return false;
} }
@ -4094,9 +4090,9 @@ static bool mob_parse_row_chatdb(char** str, const char* source, int line, int*
//MSG ID //MSG ID
ms->msg_id=msg_id; ms->msg_id=msg_id;
//Color //Color
ms->color=strtoul(str[1],NULL,0); ms->color=strtoul(fields[1],NULL,0);
//Message //Message
msg = str[2]; msg = fields[2];
len = strlen(msg); len = strlen(msg);
while( len && ( msg[len-1]=='\r' || msg[len-1]=='\n' ) ) 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--; len--;
} }
if(len>(CHAT_SIZE_MAX-1)) if(len>(CHAT_SIZE_MAX-1)){
{ ShowError("mob_chat: readdb: Message too long! Line %d, id: %d\n", current, msg_id);
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;
}
return false; return false;
} }
else if( !len ) else if( !len ){
{
ShowWarning("mob_parse_row_chatdb: Empty message for id %d.\n", msg_id); ShowWarning("mob_parse_row_chatdb: Empty message for id %d.\n", msg_id);
return false; return false;
} }
msg[len] = 0; // strip previously found EOL 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; 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 * 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) 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 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) if (db_use_sqldbs)
{ {
mob_read_sqldb(); mob_read_sqldb();

View File

@ -47,10 +47,10 @@
#include <string.h> #include <string.h>
#include <time.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 #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]; static unsigned int statp[MAX_LEVEL+1];
#if defined(RENEWAL_DROP) || defined(RENEWAL_EXP) #if defined(RENEWAL_DROP) || defined(RENEWAL_EXP)
static unsigned int level_penalty[3][RC_MAX][MAX_LEVEL*2+1]; 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); 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 // limit 1st class and above to novice job levels
if(skill_point < novice_skills) 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 neither 2nd nor 3rd jobchange levels are known, we have to assume a default for 2nd
if (!sd->change_level_3rd) 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 else
sd->change_level_2nd = 1 + skill_point + sd->status.skill_point sd->change_level_2nd = 1 + skill_point + sd->status.skill_point
- (sd->status.job_level - 1) - (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. * Returns max level for this character.
*------------------------------------------*/ *------------------------------------------*/
unsigned int pc_maxbaselv(struct map_session_data *sd) unsigned int pc_maxbaselv(struct map_session_data *sd){
{ return job_info[pc_class2idx(sd->status.class_)].max_level[0];
return max_level[pc_class2idx(sd->status.class_)][0];
} }
unsigned int pc_maxjoblv(struct map_session_data *sd) unsigned int pc_maxjoblv(struct map_session_data *sd){
{ return job_info[pc_class2idx(sd->status.class_)].max_level[1];
return max_level[pc_class2idx(sd->status.class_)][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) if(sd->status.base_level>=pc_maxbaselv(sd) || sd->status.base_level<=0)
return 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. //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) if(sd->status.base_level>pc_maxbaselv(sd) || sd->status.base_level<=1)
return 0; 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) if(sd->status.job_level>=pc_maxjoblv(sd) || sd->status.job_level<=0)
return 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. //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) if(sd->status.job_level>pc_maxjoblv(sd) || sd->status.job_level<=1)
return 0; 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. /// 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; int type, race, diff;
type = atoi(fields[0]); type = atoi(fields[0]); //1=experience, 2=item drop
race = atoi(fields[1]); race = atoi(fields[1]);
diff = atoi(fields[2]); diff = atoi(fields[2]);
@ -9652,102 +9650,219 @@ static bool pc_readdb_levelpenalty(char* fields[], int columns, int current)
} }
#endif #endif
//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;
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_);
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
{
job_info[idx].aspd_base[i] = atoi(fields[i+5]);
}
return true;
}
//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;
}
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;
}
// 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");
}
}
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;
}
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. * pc DB reading.
* exp.txt - required experience values * exp.txt - required experience values
* skill_tree.txt - skill tree for every class * skill_tree.txt - skill tree for every class
* attr_fix.txt - elemental adjustment table * 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 pc_readdb(void)
{ {
int i,j,k; int i,j,k, entries;
FILE *fp; FILE *fp;
char line[24000],*p; char line[24000];
//reset //reset
memset(exp_table,0,sizeof(exp_table)); memset(job_info,0,sizeof(job_info)); // job_info table
memset(max_level,0,sizeof(max_level));
sprintf(line, "%s/"DBPATH"exp.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))
{
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_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;
}
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;
}
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]);
}
}
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);
}
ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","exp.txt");
// Reset and read skilltree // Reset and read skilltree
memset(skill_tree,0,sizeof(skill_tree)); memset(skill_tree,0,sizeof(skill_tree));
@ -9770,58 +9885,6 @@ int pc_readdb(void)
} }
#endif #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 // reset then read statspoint
memset(statp,0,sizeof(statp)); memset(statp,0,sizeof(statp));
i=1; i=1;
@ -9832,6 +9895,7 @@ int pc_readdb(void)
ShowWarning("Can't read '"CL_WHITE"%s"CL_RESET"'... Generating DB.\n",line); ShowWarning("Can't read '"CL_WHITE"%s"CL_RESET"'... Generating DB.\n",line);
//return 1; //return 1;
} else { } else {
entries=0;
while(fgets(line, sizeof(line), fp)) while(fgets(line, sizeof(line), fp))
{ {
int stat; int stat;
@ -9843,10 +9907,10 @@ int pc_readdb(void)
break; break;
statp[i]=stat; statp[i]=stat;
i++; i++;
entries++;
} }
fclose(fp); fclose(fp);
ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", entries, DBPATH"statpoint.txt");
ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","statpoint.txt");
} }
// generate the remaining parts of the db if necessary // generate the remaining parts of the db if necessary
k = battle_config.use_statpoint_table; //save setting 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); statp[i] = statp[i-1] + pc_gets_status_point(i-1);
battle_config.use_statpoint_table = k; //restore setting 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; return 0;
} }

View File

@ -25,6 +25,12 @@
#define MAX_PC_FEELHATE 3 #define MAX_PC_FEELHATE 3
#define DAMAGELOG_SIZE_PC 100 // Any idea for this value? #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 //Equip indexes constants. (eg: sd->equip_index[EQI_AMMO] returns the index
//where the arrows are equipped) //where the arrows are equipped)
enum equip_index { 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 { enum weapon_type {
W_FIST, //Bare hands W_FIST, //Bare hands
@ -601,6 +602,22 @@ enum equip_pos {
//EQP_SHADOW_ACC_L = 0x200000, //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_WEAPON EQP_HAND_R
#define EQP_SHIELD EQP_HAND_L #define EQP_SHIELD EQP_HAND_L
#define EQP_ARMS (EQP_HAND_R|EQP_HAND_L) #define EQP_ARMS (EQP_HAND_R|EQP_HAND_L)
@ -705,6 +722,7 @@ enum equip_pos {
) )
#endif #endif
int pc_split_atoi(char* str, int* val, char sep, int max);
int pc_class2idx(int class_); int pc_class2idx(int class_);
int pc_get_group_level(struct map_session_data *sd); int pc_get_group_level(struct map_session_data *sd);
int pc_get_group_id(struct map_session_data *sd); int pc_get_group_id(struct map_session_data *sd);

View File

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

View File

@ -48,17 +48,6 @@ enum e_regen
RGN_SSP = 0x08, 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 // bonus values and upgrade chances for refining equipment
static struct { static struct {
int chance[MAX_REFINE]; // success chance int chance[MAX_REFINE]; // success chance
@ -67,7 +56,6 @@ static struct {
} refine_info[REFINE_TYPE_MAX]; } refine_info[REFINE_TYPE_MAX];
static int atkmods[3][MAX_WEAPON_TYPE]; //ATK weapon modification for size (size_fix.txt) 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 eri *sc_data_ers; //For sc_data entries
static struct status_data dummy_status; 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; int amotion;
#ifdef RENEWAL_ASPD #ifdef RENEWAL_ASPD
short mod = -1; short mod = -1;
int classidx = pc_class2idx(sd->status.class_);
switch( sd->weapontype2 ){ // adjustment for dual weilding switch( sd->weapontype2 ){ // adjustment for dual weilding
case W_DAGGER: mod = 0; break; // 0, 1, 1 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 ) amotion = ( sd->status.weapon < MAX_WEAPON_TYPE && mod < 0 )
? (aspd_base[pc_class2idx(sd->status.class_)][sd->status.weapon]) // single weapon ? (job_info[classidx].aspd_base[sd->status.weapon]) // single weapon
: ((aspd_base[pc_class2idx(sd->status.class_)][sd->weapontype2] // dual-wield : ((job_info[classidx].aspd_base[sd->weapontype2] // dual-wield
+ aspd_base[pc_class2idx(sd->status.class_)][sd->weapontype2]) * 6 / 10 + 10 * mod + job_info[classidx].aspd_base[sd->weapontype2]) * 6 / 10 + 10 * mod
- aspd_base[pc_class2idx(sd->status.class_)][sd->weapontype2] - job_info[classidx].aspd_base[sd->weapontype2]
+ aspd_base[pc_class2idx(sd->status.class_)][sd->weapontype1]); + job_info[classidx].aspd_base[sd->weapontype1]);
if ( sd->status.shield ) if ( sd->status.shield )
amotion += ( 2000 - aspd_base[pc_class2idx(sd->status.class_)][W_FIST] ) + amotion += ( 2000 - job_info[classidx].aspd_base[W_FIST] ) +
( aspd_base[pc_class2idx(sd->status.class_)][MAX_WEAPON_TYPE] - 2000 ); ( job_info[classidx].aspd_base[MAX_WEAPON_TYPE] - 2000 );
#else #else
// base weapon delay // base weapon delay
amotion = (sd->status.weapon < MAX_WEAPON_TYPE) amotion = (sd->status.weapon < MAX_WEAPON_TYPE)
? (aspd_base[pc_class2idx(sd->status.class_)][sd->status.weapon]) // single weapon ? (job_info[classidx].aspd_base[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->weapontype1] + job_info[classidx].aspd_base[sd->weapontype2])*7/10; // dual-wield
// percentual delay reduction from stats // percentual delay reduction from stats
amotion -= amotion * (4*status->agi + status->dex)/1000; amotion -= amotion * (4*status->agi + status->dex)/1000;
@ -2240,39 +2229,11 @@ int status_calc_pet_(struct pet_data *pd, bool first)
return 1; return 1;
} }
/// Helper function for status_base_pc_maxhp(), used to pre-calculate the hp_sigma_val[] array //Calculate maxHP from tables
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 }
static unsigned int status_base_pc_maxhp(struct map_session_data* sd, struct status_data* status) static unsigned int status_base_pc_maxhp(struct map_session_data* sd, struct status_data* status)
{ {
uint64 val = pc_class2idx(sd->status.class_); uint32 val = job_info[pc_class2idx(sd->status.class_)].hp_table[sd->status.base_level-1];
val = 35 + sd->status.base_level*(int64)hp_coefficient2[val]/100 + hp_sigma_val[val][sd->status.base_level];
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)) 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. 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) 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; return (unsigned int)val;
} }
//Calculate maxSP from tables
static unsigned int status_base_pc_maxsp(struct map_session_data* sd, struct status_data *status) 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; val += val * status->int_/100;
if (sd->class_&JOBL_UPPER) 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 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) { if(first) {
//Load Hp/SP from char-received data. //Load Hp/SP from char-received data.
@ -2704,9 +2665,9 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
// Job bonuses // Job bonuses
index = pc_class2idx(sd->status.class_); index = pc_class2idx(sd->status.class_);
for(i=0;i<(int)sd->status.job_level && i<MAX_LEVEL;i++){ 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; continue;
switch(job_bonus[index][i]) { switch(job_info[index].job_bonus[i]) {
case 1: status->str++; break; case 1: status->str++; break;
case 2: status->agi++; break; case 2: status->agi++; break;
case 3: status->vit++; 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]; 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) static bool status_readdb_sizefix(char* fields[], int columns, int current)
{ {
unsigned int i; unsigned int i;
@ -11445,34 +11349,73 @@ static bool status_readdb_refine(char* fields[], int columns, int current)
return true; return true;
} }
/* static bool status_readdb_attrfix(){
* Read status db FILE *fp;
* job1.txt char line[512], path[512],*p;
* job2.txt int entries=0;
* size_fixe.txt
* refine_db.txt
*/ 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 status_readdb(void)
{ {
int i, j; int i, j, k;
// initialize databases to default // 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
// size_fix.txt // size_fix.txt
for(i=0;i<ARRAYLENGTH(atkmods);i++) for(i=0;i<ARRAYLENGTH(atkmods);i++)
for(j=0;j<MAX_WEAPON_TYPE;j++) for(j=0;j<MAX_WEAPON_TYPE;j++)
atkmods[i][j]=100; atkmods[i][j]=100;
// refine_db.txt // refine_db.txt
for(i=0;i<ARRAYLENGTH(refine_info);i++) for(i=0;i<ARRAYLENGTH(refine_info);i++)
{ {
@ -11483,18 +11426,16 @@ int status_readdb(void)
refine_info[i].randombonus_max[j] = 0; 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 // read databases
// // 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);
#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);
sv_readdb(db_path, DBPATH"refine_db.txt", ',', 4+MAX_REFINE, 4+MAX_REFINE, ARRAYLENGTH(refine_info), &status_readdb_refine); sv_readdb(db_path, DBPATH"refine_db.txt", ',', 4+MAX_REFINE, 4+MAX_REFINE, ARRAYLENGTH(refine_info), &status_readdb_refine);
return 0; return 0;
@ -11511,7 +11452,6 @@ int do_init_status(void)
initChangeTables(); initChangeTables();
initDummyData(); initDummyData();
status_readdb(); status_readdb();
status_calc_sigma();
natural_heal_prev_tick = gettick(); natural_heal_prev_tick = gettick();
sc_data_ers = ers_new(sizeof(struct status_change_entry),"status.c::sc_data_ers",ERS_OPT_NONE); 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); add_timer_interval(natural_heal_prev_tick + NATURAL_HEAL_INTERVAL, status_natural_heal_timer, 0, 0, NATURAL_HEAL_INTERVAL);