diff options
44 files changed, 4360 insertions, 3402 deletions
diff --git a/conf/groups.conf b/conf/groups.conf index 4ded12592..c750e411c 100644 --- a/conf/groups.conf +++ b/conf/groups.conf @@ -87,6 +87,7 @@ groups: ( inherit: ( /*empty list*/ ) commands: { /* no commands by default */ + warp: true } permissions: { /* without this basic permissions regular players could not diff --git a/db/elemental_db.txt b/db/elemental_db.txt new file mode 100644 index 000000000..c8c2a2bc8 --- /dev/null +++ b/db/elemental_db.txt @@ -0,0 +1,27 @@ +//ID,Sprite_Name,Name,LV,HP,SP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Speed,aDelay,aMotion,dMotion +// Monster Elementals +2114,EL_AGNI_S,Agni,100,5000,1,1,100,100,10,10,1,1,1,1,1,1,5,12,0,0,83,200,504,1020,360 +2115,EL_AGNI_M,Agni,100,7500,1,1,250,250,25,25,1,1,1,1,1,1,5,12,1,0,83,200,504,1020,360 +2116,EL_AGNI_L,Agni,100,10000,1,1,500,500,50,50,1,1,1,1,1,1,5,12,2,0,83,200,504,1020,360 +2117,EL_AQUA_S,Aqua,100,5000,1,1,100,100,10,10,1,1,1,1,1,1,5,12,0,0,81,200,504,1020,360 +2118,EL_AQUA_M,Aqua,100,7500,1,1,250,250,25,25,1,1,1,1,1,1,5,12,1,0,81,200,504,1020,360 +2119,EL_AQUA_L,Aqua,100,10000,1,1,500,500,50,50,1,1,1,1,1,1,5,12,2,0,81,200,504,1020,360 +2120,EL_VENTUS_S,Ventus,100,5000,1,4,100,100,10,10,1,1,1,1,1,1,5,12,0,0,84,200,504,1020,360 +2121,EL_VENTUS_M,Ventus,100,7500,1,4,250,250,25,25,1,1,1,1,1,1,5,12,1,0,84,200,504,1020,360 +2122,EL_VENTUS_L,Ventus,100,10000,1,4,500,500,50,50,1,1,1,1,1,1,5,12,2,0,84,200,504,1020,360 +2123,EL_TERA_S,Tera,100,5000,1,1,100,100,10,10,1,1,1,1,1,1,5,12,0,0,82,200,504,1020,360 +2124,EL_TERA_M,Tera,100,7500,1,1,250,250,25,25,1,1,1,1,1,1,5,12,1,0,82,200,504,1020,360 +2125,EL_TERA_L,Tera,100,10000,1,1,500,500,50,50,1,1,1,1,1,1,5,12,2,0,82,200,504,1020,360 + +//2114,EL_AGNI_S,Agni ,100,5000,500 ,1,250,250 ,10,10, 25,25,25,25,25,25, 10,12,0,0,83,200,504,1020,360 +//2115,EL_AGNI_M,Agni ,100,7500,750 ,1,500,500 ,25,25, 50,50,50,50,50,50, 10,12,1,0,83,200,504,1020,360 +//2116,EL_AGNI_L,Agni ,100,10000,1000 ,1,1000,1000 ,50,50, 100,100,100,100,100,100, 10,12,2,0,83,200,504,1020,360 +//2117,EL_AQUA_S,Aqua ,100,5000,500 ,1,250,250 ,10,10, 25,25,25,25,25,25, 10,12,0,0,81,200,504,1020,360 +//2118,EL_AQUA_M,Aqua ,100,7500,750 ,1,500,500 ,25,25, 50,50,50,50,50,50, 10,12,1,0,81,200,504,1020,360 +//2119,EL_AQUA_L,Aqua ,100,10000,1000 ,1,1000,1000 ,50,50, 100,100,100,100,100,100, 10,12,2,0,81,200,504,1020,360 +//2120,EL_VENTUS_S,Ventus ,100,5000,500 ,4,250,250 ,10,10, 25,25,25,25,25,25, 10,12,0,0,84,200,504,1020,360 +//2121,EL_VENTUS_M,Ventus ,100,7500,750 ,4,500,500 ,25,25, 50,50,50,50,50,50, 10,12,1,0,84,200,504,1020,360 +//2122,EL_VENTUS_L,Ventus ,100,10000,1000 ,4,1000,1000 ,50,50, 100,100,100,100,100,100, 10,12,2,0,84,200,504,1020,360 +//2123,EL_TERA_S,Tera ,100,5000,500 ,1,250,250 ,10,10, 25,25,25,25,25,25, 10,12,0,0,82,200,504,1020,360 +//2124,EL_TERA_M,Tera ,100,7500,750 ,1,500,500 ,25,25, 50,50,50,50,50,50, 10,12,1,0,82,200,504,1020,360 +//2125,EL_TERA_L,Tera ,100,10000,1000 ,1,1000,1000 ,50,50, 100,100,100,100,100,100, 10,12,2,0,82,200,504,1020,360
\ No newline at end of file diff --git a/db/elemental_skill_db.txt b/db/elemental_skill_db.txt new file mode 100644 index 000000000..d425417e0 --- /dev/null +++ b/db/elemental_skill_db.txt @@ -0,0 +1,51 @@ +//ElementalID,SkillID,SkillLevel,ReqMode +//Spirit Modes (1 = Passive, 2 = Defensive, 4 = Agressive) +// +// EL_AGNI_S +2114,8413,1,1 //EL_PYROTECHNIC,Pyrotechnic +2114,8401,1,2 //EL_CIRCLE_OF_FIRE,Circle of Fire +2114,8425,1,4 //EL_FIRE_ARROW,Fire Arrow +// EL_AGNI_M +2115,8414,1,1 //EL_HEATER,Heater +2115,8402,1,2 //EL_FIRE_CLOAK,Fire Cloak +2115,8426,1,4 //EL_FIRE_BOMB,Fire Bomb +// EL_AGNI_L +2116,8415,1,1 //EL_TROPIC,Tropic +2116,8403,1,2 //EL_FIRE_MANTLE,Fire Mantle +2116,8428,1,4 //EL_FIRE_WAVE,Fire Wave +// EL_AQUA_S +2117,8416,1,1 //EL_AQUAPLAY,Aqua Play +2117,8404,1,2 //EL_WATER_SCREEN,Water Screen +2117,8430,1,4 //EL_ICE_NEEDLE,Ice Needle +// EL_AQUA_M +2118,8417,1,1 //EL_COOLER,Cooler +2118,8405,1,2 //EL_WATER_DROP,Water Drop +2118,8431,1,4 //EL_WATER_SCREW,Water Screw +// EL_AQUA_L +2119,8418,1,1 //EL_CHILLY_AIR,Cool Air +2119,8406,1,2 //EL_WATER_BARRIER,Water Barrier +2119,8433,1,4 //EL_TIDAL_WEAPON,Tidal Weapon +// EL_VENTUS_S +2120,8419,1,1 //EL_GUST,Gust +2120,8407,1,2 //EL_WIND_STEP,Wind Step +2120,8434,1,4 //EL_WIND_SLASH,Wind Slasher +// EL_VENTUS_M +2121,8420,1,1 //EL_BLAST,Blast +2121,8408,1,2 //EL_WIND_CURTAIN,Wind Curtain +2121,8435,1,4 //EL_HURRICANE,Hurricane Rage +// EL_VENTUS_L +2122,8421,1,1 //EL_WILD_STORM,Wild Storm +2122,8409,1,2 //EL_ZEPHYR,Zephyr +2122,8437,1,4 //EL_TYPOON_MIS,Typhoon Missile +// EL_TERA_S +2123,8422,1,1 //EL_PETROLOGY,Petrology +2123,8410,1,2 //EL_SOLID_SKIN,Solid Skin +2123,8439,1,4 //EL_STONE_HAMMER,Stone Hammer +// EL_TERA_M +2124,8423,1,1 //EL_CURSED_SOIL,Cursed Soil +2124,8411,1,2 //EL_STONE_SHIELD,Stone Shield +2124,8440,1,4 //EL_ROCK_CRUSHER,Rock Launcher +// EL_TERA_L +2125,8424,1,1 //EL_UPHEAVAL,Upheaval +2125,8412,1,2 //EL_POWER_OF_GAIA,Power of Gaia +2125,8442,1,4 //EL_STONE_RAIN,Stone Rain
\ No newline at end of file diff --git a/db/produce_db.txt b/db/produce_db.txt index 78252447c..b51725365 100644 --- a/db/produce_db.txt +++ b/db/produce_db.txt @@ -442,3 +442,85 @@ //-- Poison Fatigue <-- GC_RESEARCHNEWPOISON Lv6, 1 Izidor, 1 Medicine Bowl, 10 Sticky Poison, 1 Poison Kit 12724,25,2024,6,709,1,7134,1,7565,10,7931,1 //============================================== + +//============================================== +// Genetic Foods And Potions (LV= 26 -> 29) +//============================================== +//---- Change Material --- ItemLV=26 ----------- +//-- Phracon [8] <-- GN_CHANGEMATERIAL Lv1, 40 Glass Bead, 45 Spawn +1010,26,2494,1,746,40,908,45 +//-- Witch Starsand [2] <-- GN_CHANGEMATERIAL Lv1, 15 Blue Porcelain, 10 InsectFeeler +1061,26,2494,1,735,15,928,10 +//-- Throwable HP Increase Potion (Small) [10] <-- GN_CHANGEMATERIAL Lv1, 10 Throwing Bottle, 10 HP Potions (Small) +13275,26,2494,1,6297,10,12422,10 +//-- Throwable HP Increase Potion (Medium) [10] <-- GN_CHANGEMATERIAL Lv1, 10 Throwing Bottle, 10 HP Potions (Medium) +13276,26,2494,1,6297,10,12423,10 +//-- Throwable HP Increase Potion (Large) [10] <-- GN_CHANGEMATERIAL Lv1, 10 Throwing Bottle, 10 HP Potions (Large) +13277,26,2494,1,6297,10,12424,10 +//-- Throwable SP Increase Potion (Small) [10] <-- GN_CHANGEMATERIAL Lv1, 10 Throwing Bottle, 10 SP Potions (Small) +13278,26,2494,1,6297,10,12425,10 +//-- Throwable SP Increase Potion (Medium) [10] <-- GN_CHANGEMATERIAL Lv1, 10 Throwing Bottle, 10 SP Potions (Medium) +13279,26,2494,1,6297,10,12426,10 +//-- Throwable SP Increase Potion (Large) [10] <-- GN_CHANGEMATERIAL Lv1, 10 Throwing Bottle, 10 SP Potions (Large) +13280,26,2494,1,6297,10,12427,10 +//-- Throwable Enrich White Potion Z [10] <-- GN_CHANGEMATERIAL Lv1, 10 Throwing Bottle, 10 Enrich White Potion Z +13281,26,2494,1,6297,10,12428,10 +//-- Vitata 500 [10] <-- GN_CHANGEMATERIAL Lv1, 10 Throwing Bottle, 10 Vitata 500 +13282,26,2494,1,6297,10,12436,10 +//-- Enrich Celermine Juice [10] <-- GN_CHANGEMATERIAL Lv1, 10 Throwing Bottle, 10 Enrich Celermine Juice +13283,26,2494,1,6297,10,12437,10 + +//---- Mix Cooking --- ItemLV=27 --------------- +//-- Savage BBQ <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 1 Savage Meat, 1 Cooking Skewer, 1 Black Charcoal +12429,27,2495,1,11022,0,6248,1,6249,1,6250,1,6251,1 +//-- Wug Blood Cocktail <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 3 Wolf Blood, 2 Cold Ice +12430,27,2495,1,11022,0,6248,1,6252,3,6253,2 +//-- Minor Brisket <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 2 Beef Head Meat, 1 Large Cookpot +12431,27,2495,1,11022,0,6248,1,6254,2,6255,1 +//-- Siroma Icetea <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 3 Ice Fragment, 2 Ice Crystal, 1 Comodo Tropic Fruit +12432,27,2495,1,11022,0,6248,1,6256,3,6257,2,6258,1 +//-- Drocera Herb Stew <-- GN_MIX_COOKING Lv1, Mix Cook Book, 3 Red Herb, 3 White Herb, 3 Blue Herb, 1 Melange Pot, 1 Large Cookpot, 1 Drocera Tentacle +12433,27,2495,1,11022,0,507,3,509,3,510,3,6248,1,6255,1,6259,3 +//-- Petti Tail Noodle <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 2 Petti Tail, 1 Fine Noodle, 1 Cool Gravy +12434,27,2495,1,11022,0,6248,1,6260,2,6261,1,6262,1 + +//---- Create Bomb --- ItemLV=28 --------------- +//-- Apple Bomb <-- GN_MAKEBOMB Lv1, Apple Bomb CB, 1 Apple, 1 Scell, 1 Detonator, 1 Gun Powder +13260,28,2496,1,6279,0,512,1,911,1,1051,1,6244,1 +//-- Coconut Bomb <-- GN_MAKEBOMB Lv1, Coconut Bomb CB, 1 Detonator, 1 Coconut Fruit, 2 Gun Powder +13261,28,2496,1,6281,0,1051,1,6263,1,6244,2 +//-- Melon Bomb <-- GN_MAKEBOMB Lv1, Melon Bomb CB, 1 Sticky Mucus, 1 Detonator, 2 Gun Powder, 1 Melon +13262,28,2496,1,6282,0,938,1,1051,1,6244,2,6264,1 +//-- Pineapple Bomb <-- GN_MAKEBOMB Lv1, Pinepple Bomb CB, 1 Cactus Needle, 1 Detonator, 3 Gun Powder, 1 Pineapple +13263,28,2496,1,6280,0,952,1,1051,1,6244,3,6265,1 +//-- Banana Bomb <-- GN_MAKEBOMB Lv1, Banana Bomb CB, 1 Banana, 1 Detonator, 4 Gun Powder, 1 Mould Powder +13264,28,2496,1,6283,0,513,1,1051,1,6244,4,7001,1 + +//---- Special Pharmacy --- ItemLV=29 ---------- +//-- Seed Of Horny Plant <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Prickly Fruit +6210,29,2497,1,6284,0,576,10 +//-- Bloodsuck Plant Seed <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Root Of Maneater +6211,29,2497,1,6284,0,1033,10 +//-- Bomb Mushroom Spore <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Mushroom Spore, 2 Gun Powder, 5 Poison Spore +6212,29,2497,1,6284,0,921,10,6244,2,7033,5 +//-- HP Increase Potion (Small) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 10 White Herb, 5 Monster's Feed, 10 Empty Bottle, 1 Hot Sauce +12422,29,2497,1,11023,0,509,10,528,5,713,10,7455,1 +//-- HP Increase Potion (Medium) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 10 Yellow Herb, 10 White Herb, 10 Empty Bottle, 1 Hot Sauce +12423,29,2497,1,11023,0,508,10,509,10,713,10,7455,1 +//-- HP Increase Potion (Large) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 15 White Herb, 3 Fruit Of Mastela, 1 Holy Water, 10 Empty Bottle, 1 Hot Sauce +12424,29,2497,1,11023,0,509,15,522,3,523,1,713,10,7455,1 +//-- SP Increase Potion (Small) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 10 Grape, 10 Lemon, 10 Empty Bottle, 1 Sweet Sauce +12425,29,2497,1,11024,0,514,10,568,10,713,10,7453,1 +//-- SP Increase Potion (Medium) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 10 Blue Herb, 10 Honey, 10 Empty Bottle, 1 Sweet Sauce +12426,29,2497,1,11024,0,510,10,518,10,713,10,7453,1 +//-- SP Increase Potion (Large) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 15 Blue Herb, 10 Royal Jelly, 10 Empty Bottle, 1 Sweet Sauce +12427,29,2497,1,11024,0,510,15,526,10,713,10,7453,1 +//-- Enrich White Potion Z <-- GN_S_PHARMACY Lv1, Quality Potion Book, 20 White Potion, 10 White Herb, 1 Alchol, 10 Empty Cylinder +12428,29,2497,1,6285,0,504,20,509,10,970,1,1092,10 +//-- Vitata 500 <-- GN_S_PHARMACY Lv1, Quality Potion Book, 10 Blue Herb, 10 Grape, 10 Honey, 10 Empty Cylinder +12436,29,2497,1,6285,0,510,10,514,10,518,10,1092,10 +//-- Enrich Celermine Juice <-- GN_S_PHARMACY Lv1, Quality Potion Book, 5 Center Potion, 5 Awakening Potion, 10 Empty Cylinder, 5 Hot Sauce +12437,29,2497,1,6285,0,645,5,656,5,1092,10,7455,5 +//-- Cure Free <-- GN_S_PHARMACY Lv1, Quality Potion Book, 20 Green Herb, 1 Fruit Of Mastela, 5 Panacea, 1 Leaf Of Yggdrasil, 10 Empty Cylinder +12475,29,2497,1,6285,0,511,20,522,1,525,5,610,1,1092,10 +//=============================================== diff --git a/db/re/skill_cast_db.txt b/db/re/skill_cast_db.txt index 47697aa61..4ba132927 100644 --- a/db/re/skill_cast_db.txt +++ b/db/re/skill_cast_db.txt @@ -1783,61 +1783,61 @@ //===== Elemental Skills ======================= //-- EL_CIRCLE_OF_FIRE -//8401,0,0,0,-1,0,0 +8401,0,0,0,-1,0,0 //-- EL_FIRE_CLOAK -//8402,0,0,0,-1,0,0 +8402,0,0,0,-1,0,0 //-- EL_FIRE_MANTLE -//8403,0,0,0,15000,0,0 +8403,0,0,0,15000,0,0 //-- EL_WATER_SCREEN -//8404,0,0,0,-1,0,0 +8404,0,0,0,-1,0,0 //-- EL_WATER_DROP -//8405,0,0,0,-1,0,0 +8405,0,0,0,-1,0,0 //-- EL_WATER_BARRIER -//8406,1000,0,0,15000,0,0 +8406,1000,0,0,15000,0,0 //-- EL_WIND_STEP -//8407,0,0,0,-1,0,0 +8407,0,0,0,-1,0,0 //-- EL_WIND_CURTAIN -//8408,0,0,0,-1,0,0 +8408,0,0,0,-1,0,0 //-- EL_ZEPHYR -//8409,0,0,0,15000,0,0 +8409,0,0,0,15000,0,0 //-- EL_STONE_SHIELD -//8411,0,0,0,-1,0,0 +8411,0,0,0,-1,0,0 //-- EL_POWER_OF_GAIA -//8412,0,0,0,15000,0,0 +8412,0,0,0,15000,0,0 //-- EL_PYROTECHNIC -//8413,0,0,0,-1,0,0 +8413,0,0,0,-1,0,0 //-- EL_HEATER -//8414,0,0,0,-1,0,0 +8414,0,0,0,-1,0,0 //-- EL_TROPIC -//8415,0,0,0,-1,0,0 +8415,0,0,0,-1,0,0 //-- EL_AQUAPLAY -//8416,0,0,0,-1,0,0 +8416,0,0,0,-1,0,0 //-- EL_COOLER -//8417,0,0,0,-1,0,0 +8417,0,0,0,-1,0,0 //-- EL_CHILLY_AIR -//8418,0,0,0,-1,0,0 +8418,0,0,0,-1,0,0 //-- EL_GUST -//8419,0,0,0,-1,0,0 +8419,0,0,0,-1,0,0 //-- EL_BLAST -//8420,0,0,0,-1,0,0 +8420,0,0,0,-1,0,0 //-- EL_WILD_STORM -//8421,0,0,0,-1,0,0 +8421,0,0,0,-1,0,0 //-- EL_PETROLOGY -//8422,0,0,0,-1,0,0 +8422,0,0,0,-1,0,0 //-- EL_CURSED_SOIL -//8423,0,0,0,-1,0,0 +8423,0,0,0,-1,0,0 //-- EL_UPHEAVAL -//8424,0,0,0,-1,0,0 +8424,0,0,0,-1,0,0 //-- EL_TIDAL_WEAPON -//8433,0,0,0,-1,0,0 +8433,0,0,0,-1,0,0 //-- EL_TYPOON_MIS -//8437,0,0,0,15000,0,0 +8437,0,0,0,15000,0,0 //-- EL_STONE_HAMMER -//8439,0,0,0,5000,0,0 +8439,0,0,0,5000,0,0 //-- EL_ROCK_CRUSHER -//8440,0,0,0,15000,0,0 +8440,0,0,0,15000,0,0 //-- EL_ROCK_CRUSHER_ATK -//8441,0,0,0,15000,0,0 +8441,0,0,0,15000,0,0 //========================================== //===== Guild Skills ======================= diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt index bdb6b2faa..3f6cb95c7 100644 --- a/db/re/skill_db.txt +++ b/db/re/skill_db.txt @@ -944,256 +944,62 @@ 2434,0,6,4,0,0x3,5,5,1,yes,0,0x4000,0,none,0, WM_UNLIMITED_HUMMING_VOICE,Unlimited Humming Voice 2516,11,6,1,-1,0x2,5,5,1,no,0,0,0,weapon,0, WM_SEVERE_RAINSTORM_MELEE,Severe Rainstorm Melee -//2021,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_VENOMIMPRESS, -//2022,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_CROSSIMPACT, -//2023,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_DARKILLUSION, -//2024,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_RESEARCHNEWPOISON, -//2025,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_CREATENEWPOISON, -//2026,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_ANTIDOTE, -//2027,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_POISONINGWEAPON, -//2028,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_WEAPONBLOCKING, -//2029,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_COUNTERSLASH, -//2030,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_WEAPONCRUSH, -//2031,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_VENOMPRESSURE, -//2032,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_POISONSMOKE, -//2033,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_CLOAKINGEXCEED, -//2034,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_PHANTOMMENACE, -//2035,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_HALLUCINATIONWALK, -//2036,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_ROLLINGCUTTER, -//2037,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GC_CROSSRIPPERSLASHER, -//2038,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_JUDEX, -//2039,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_ANCILLA, -//2040,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_ADORAMUS, -//2041,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_CLEMENTIA, -//2042,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_CANTO, -//2043,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_CHEAL, -//2044,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_EPICLESIS, -//2045,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_PRAEFATIO, -//2046,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_ORATIO, -//2047,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_LAUDAAGNUS, -//2048,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_LAUDARAMUS, -//2049,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_EUCHARISTICA, -//2050,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_RENOVATIO, -//2051,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_HIGHNESSHEAL, -//2052,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_CLEARANCE, -//2053,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_EXPIATIO, -//2054,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_DUPLELIGHT, -//2055,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_DUPLELIGHT_MELEE, -//2056,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_DUPLELIGHT_MAGIC, -//2057,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_SILENTIUM, -//2201,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_WHITEIMPRISON, -//2202,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_SOULEXPANSION, -//2203,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_FROSTMISTY, -//2204,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_JACKFROST, -//2205,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_MARSHOFABYSS, -//2206,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_RECOGNIZEDSPELL, -//2207,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_SIENNAEXECRATE, -//2208,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_RADIUS, -//2209,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_STASIS, -//2210,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_DRAINLIFE, -//2211,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_CRIMSONROCK, -//2212,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_HELLINFERNO, -//2213,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_COMET, -//2214,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_CHAINLIGHTNING, -//2216,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_EARTHSTRAIN, -//2217,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_TETRAVORTEX, -//2222,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_SUMMONFB, -//2223,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_SUMMONBL, -//2224,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_SUMMONWB, -//2229,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_SUMMONSTONE, -//2230,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_RELEASE, -//2231,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_READING_SB, -//2232,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WL_FREEZE_SP, -//2233,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_ARROWSTORM, -//2234,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_FEARBREEZE, -//2235,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_RANGERMAIN, -//2236,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_AIMEDBOLT, -//2237,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_DETONATOR, -//2238,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_ELECTRICSHOCKER, -//2239,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_CLUSTERBOMB, -//2240,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_WUGMASTERY, -//2241,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_WUGRIDER, -//2242,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_WUGDASH, -//2243,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_WUGSTRIKE, -//2244,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_WUGBITE, -//2245,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_TOOTHOFWUG, -//2246,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_SENSITIVEKEEN, -//2247,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_CAMOUFLAGE, -//2248,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_RESEARCHTRAP, -//2249,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_MAGENTATRAP, -//2250,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_COBALTTRAP, -//2251,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_MAIZETRAP, -//2252,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_VERDURETRAP, -//2253,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_FIRINGTRAP, -//2254,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RA_ICEBOUNDTRAP, -//2255,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_MADOLICENCE, -//2256,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_BOOSTKNUCKLE, -//2257,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_PILEBUNKER, -//2258,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_VULCANARM, -//2259,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_FLAMELAUNCHER, -//2260,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_COLDSLOWER, -//2261,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_ARMSCANNON, -//2262,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_ACCELERATION, -//2263,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_HOVERING, -//2264,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_F_SIDESLIDE, -//2265,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_B_SIDESLIDE, -//2266,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_MAINFRAME, -//2267,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_SELFDESTRUCTION, -//2268,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_SHAPESHIFT, -//2269,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_EMERGENCYCOOL, -//2270,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_INFRAREDSCAN, -//2271,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_ANALYZE, -//2272,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_MAGNETICFIELD, -//2273,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_NEUTRALBARRIER, -//2274,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_STEALTHFIELD, -//2275,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_REPAIR, -//2276,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_TRAININGAXE, -//2277,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_RESEARCHFE, -//2278,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_AXEBOOMERANG, -//2279,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_POWERSWING, -//2280,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_AXETORNADO, -//2281,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_SILVERSNIPER, -//2282,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_MAGICDECOY, -//2283,0,0,0,0,0,0,9,0,no,0,0,0,none,0 NC_DISJOINT, -//2284,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_FATALMENACE, -//2285,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_REPRODUCE, -//2286,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_AUTOSHADOWSPELL, -//2287,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_SHADOWFORM, -//2288,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_TRIANGLESHOT, -//2289,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_BODYPAINT, -//2290,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_INVISIBILITY, -//2291,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_DEADLYINFECT, -//2292,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_ENERVATION, -//2293,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_GROOMY, -//2294,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_IGNORANCE, -//2295,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_LAZINESS, -//2296,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_UNLUCKY, -//2297,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_WEAKNESS, -//2298,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_STRIPACCESSARY, -//2299,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_MANHOLE, -//2300,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_DIMENSIONDOOR, -//2301,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_CHAOSPANIC, -//2302,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_MAELSTROM, -//2303,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_BLOODYLUST, -//2304,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SC_FEINTBOMB, -//2307,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_CANNONSPEAR, -//2308,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_BANISHINGPOINT, -//2309,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_TRAMPLE, -//2310,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_SHIELDPRESS, -//2311,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_REFLECTDAMAGE, -//2312,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_PINPOINTATTACK, -//2313,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_FORCEOFVANGUARD, -//2314,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_RAGEBURST, -//2315,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_SHIELDSPELL, -//2316,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_EXEEDBREAK, -//2317,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_OVERBRAND, -//2318,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_PRESTIGE, -//2319,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_BANDING, -//2320,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_MOONSLASHER, -//2321,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_RAYOFGENESIS, -//2322,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_PIETY, -//2323,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_EARTHDRIVE, -//2324,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_HESPERUSLIT, -//2325,0,0,0,0,0,0,9,0,no,0,0,0,none,0 LG_INSPIRATION, -//2326,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_DRAGONCOMBO, -//2327,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_SKYNETBLOW, -//2328,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_EARTHSHAKER, -//2329,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_FALLENEMPIRE, -//2330,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_TIGERCANNON, -//2332,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_RAMPAGEBLASTER, -//2333,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_CRESCENTELBOW, -//2334,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_CURSEDCIRCLE, -//2335,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_LIGHTNINGWALK, -//2336,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_KNUCKLEARROW, -//2337,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_WINDMILL, -//2338,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_RAISINGDRAGON, -//2340,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_ASSIMILATEPOWER, -//2341,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_POWERVELOCITY, -//2343,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_GATEOFHELL, -//2344,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_GENTLETOUCH_QUIET, -//2345,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_GENTLETOUCH_CURE, -//2346,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_GENTLETOUCH_ENERGYGAIN, -//2347,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_GENTLETOUCH_CHANGE, -//2348,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_GENTLETOUCH_REVITALIZE, -//2350,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WA_SWING_DANCE, -//2351,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WA_SYMPHONY_OF_LOVER, -//2352,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WA_MOONLIT_SERENADE, -//2381,0,0,0,0,0,0,9,0,no,0,0,0,none,0 MI_RUSH_WINDMILL, -//2382,0,0,0,0,0,0,9,0,no,0,0,0,none,0 MI_ECHOSONG, -//2383,0,0,0,0,0,0,9,0,no,0,0,0,none,0 MI_HARMONIZE, -//2412,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_LESSON, -//2413,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_METALICSOUND, -//2414,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_REVERBERATION, -//2417,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_DOMINION_IMPULSE, -//2418,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_SEVERE_RAINSTORM, -//2419,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_POEMOFNETHERWORLD, -//2420,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_VOICEOFSIREN, -//2421,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_DEADHILLHERE, -//2422,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_LULLABY_DEEPSLEEP, -//2423,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_SIRCLEOFNATURE, -//2424,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_RANDOMIZESPELL, -//2425,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_GLOOMYDAY, -//2426,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_GREAT_ECHO, -//2427,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_SONG_OF_MANA, -//2428,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_DANCE_WITH_WUG, -//2429,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_SOUND_OF_DESTRUCTION, -//2430,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_SATURDAY_NIGHT_FEVER, -//2431,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_LERADS_DEW, -//2432,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_MELODYOFSINK, -//2433,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_BEYOND_OF_WARCRY, -//2434,0,0,0,0,0,0,9,0,no,0,0,0,none,0 WM_UNLIMITED_HUMMING_VOICE, -//2443,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_FIREWALK, -//2444,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_ELECTRICWALK, -//2445,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_SPELLFIST, -//2446,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_EARTHGRAVE, -//2447,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_DIAMONDDUST, -//2448,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_POISON_BUSTER, -//2449,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_PSYCHIC_WAVE, -//2450,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_CLOUD_KILL, -//2451,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_STRIKING, -//2452,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_WARMER, -//2453,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_VACUUM_EXTREME, -//2454,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_VARETYR_SPEAR, -//2455,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_ARRULLO, -//2456,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_EL_CONTROL, -//2457,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_SUMMON_AGNI, -//2458,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_SUMMON_AQUA, -//2459,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_SUMMON_VENTUS, -//2460,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_SUMMON_TERA, -//2461,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_EL_ACTION, -//2462,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_EL_ANALYSIS, -//2463,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_EL_SYMPATHY, -//2464,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_EL_CURE, -//2465,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_FIRE_INSIGNIA, -//2466,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_WATER_INSIGNIA, -//2467,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_WIND_INSIGNIA, -//2468,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SO_EARTH_INSIGNIA, -//2535,0,0,0,0,0,0,9,0,no,0,0,0,none,0 ALL_BUYING_STORE, -//2474,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_TRAINING_SWORD, -//2475,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_REMODELING_CART, -//2476,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_CART_TORNADO, -//2477,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_CARTCANNON, -//2478,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_CARTBOOST, -//2479,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_THORNS_TRAP, -//2480,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_BLOOD_SUCKER, -//2481,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_SPORE_EXPLOSION, -//2482,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_WALLOFTHORN, -//2483,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_CRAZYWEED, -//2485,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_DEMONIC_FIRE, -//2486,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_FIRE_EXPANSION, -//2490,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_HELLS_PLANT, -//2492,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_MANDRAGORA, -//2493,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_SLINGITEM, -//2494,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_CHANGEMATERIAL, -//2495,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_MIX_COOKING, -//2496,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_MAKEBOMB, -//2497,0,0,0,0,0,0,9,0,no,0,0,0,none,0 GN_S_PHARMACY, -//2515,0,0,0,0,0,0,9,0,no,0,0,0,none,0 AB_SECRAMENT, -//2517,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_HOWLINGOFLION, -//2518,0,0,0,0,0,0,9,0,no,0,0,0,none,0 SR_RIDEINLIGHTNING, +//**** +// SO Sorcerer +2443,0,6,4,3,0,0,5,1,yes,0,0,8:10:12:14:16,magic,0, SO_FIREWALK,Fire Walk //CHECK Video and data shows each cell only hits once. +2444,0,6,4,4,0,0,5,1,yes,0,0,8:10:12:14:16,magic,0, SO_ELECTRICWALK,Electric Walk +2445,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0, SO_SPELLFIST,Spell Fist +2446,9,6,2,2,0,0,5,-3,yes,0,0,0,magic,0, SO_EARTHGRAVE,Earth Grave +2447,9,6,2,1,0,0,5,-5,yes,0,0,0,magic,0, SO_DIAMONDDUST,Diamond Dust +2448,9,6,1,5,0x2,1:1:1:1:2,5,1,yes,0,0,0,magic,0, SO_POISON_BUSTER,Poison Buster +2449,9,6,2,0,0,0,5,1,yes,0,0,0,magic,0, SO_PSYCHIC_WAVE,Psychic Wave +2450,9,6,2,5,0,0,5,1,yes,0,0,0,magic,0, SO_CLOUD_KILL,Cloud Kill +2451,9,6,16,0,0x1,0,5,1,yes,0,0,0,none,0, SO_STRIKING,Striking //CHECK Data shows a % for increased successful refine rate. Is this true? +2452,9,6,2,3,0x1,0,5,1,yes,0,0,0,magic,0, SO_WARMER,Warmer +2453,9,6,2,0,0x1,0,5,1,yes,0,0,0,magic,0, SO_VACUUM_EXTREME,Vacuum Extreme +2454,9,6,1,4,0x2,1:1:2:2:3,5,1,yes,0,0,0,magic,0, SO_VARETYR_SPEAR,Varetyr Spear +2455,9,6,1,0,0x3,1:1:2:2:3,5,1,yes,0,0,0,magic,0, SO_ARRULLO,Arrullo +2456,0,6,4,0,0x1,0,4,1,yes,0,0,0,none,0, SO_EL_CONTROL,Spirit Control +2457,0,6,4,3,0x1,0,3,1,yes,0,0,0,none,0, SO_SUMMON_AGNI,Summon Fire Spirit Agni +2458,0,6,4,1,0x1,0,3,1,yes,0,0,0,none,0, SO_SUMMON_AQUA,Summon Water Spirit Aqua +2459,0,6,4,4,0x1,0,3,1,yes,0,0,0,none,0, SO_SUMMON_VENTUS,Summon Wind Spirit Ventus +2460,0,6,4,2,0x1,0,3,1,yes,0,0,0,none,0, SO_SUMMON_TERA,Summon Earth Spirit Tera +2461,5,6,1,0,0x1,0,1,1,no,0,0,0,none,0, SO_EL_ACTION,Elemental Action +2462,0,6,4,0,0x1,0,2,1,yes,0,0,0,none,0, SO_EL_ANALYSIS,Four Spirit Analysis +2463,0,0,0,0,0,0,5,0,no,0,0,0,none,0, SO_EL_SYMPATHY,Spirit Sympathy +2464,0,6,4,0,0x1,0,1,1,yes,0,0,0,none,0, SO_EL_CURE,Spirit Recovery +2465,9,6,2,3,0x1,0,3,1,yes,0,0,1,magic,0, SO_FIRE_INSIGNIA,Fire Insignia //CHECK All 4 insignia skills can be targeted and animations work +2466,9,6,2,1,0x1,0,3,1,yes,0,0,1,magic,0, SO_WATER_INSIGNIA,Water Insignia // but its effects havent been coded yet. +2467,9,6,2,4,0x1,0,3,1,yes,0,0,1,magic,0, SO_WIND_INSIGNIA,Wind Insignia +2468,9,6,2,2,0x1,0,3,1,yes,0,0,1,magic,0, SO_EARTH_INSIGNIA,Earth Insignia -// Unknown -//2533,0,0,0,0,0,0,9,0,no,0,0,0,none,0 ALL_ODINS_RECALL, +//**** +// GN Genetic +2474,0,0,0,0,0,0,5,0,no,0,0,0,none,0, GN_TRAINING_SWORD,Sword Training +2475,0,0,0,0,0,0,5,0,no,0,0,0,none,0, GN_REMODELING_CART,Cart Remodeling +2476,0,6,4,-1,0x2,2,5,1,no,0,0,0,weapon,2, GN_CART_TORNADO,Cart Tornado +2477,7:8:9:10:11,6,1,-1,0x2,1:1:2:2:3,5,1,yes,0,0,0,weapon,0, GN_CARTCANNON,Cart Cannon +2478,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0, GN_CARTBOOST,Cart Boost +2479,9,6,2,0,0,0,5,1,yes,0,0x80,5,misc,0, GN_THORNS_TRAP,Thorn Trap +2480,11,6,1,0,0x1,0,5,1,yes,0,0,3,misc,0, GN_BLOOD_SUCKER,Blood Sucker //CHECK Data says its a magic attack. Hmmmm.... +2481,11,6,1,-1,0x2,1:2:3:4:5,5,1,yes,0,0,0,weapon,0, GN_SPORE_EXPLOSION,Spore Explosion //CHECK Data says its element is set to neutral. Need to confirm. +2482,11,6,16,0,0,0,5,1,yes,0,0,1,weapon,2, GN_WALLOFTHORN,Wall of Thorns +2483,11,6,2,0,0x3,4,10,1,yes,0,0,0,weapon,0, GN_CRAZYWEED,Crazy Weed +2484,0,6,2,2,0x2,2,10,1,no,0,0,0,weapon,0, GN_CRAZYWEED_ATK,Crazy Weed Attack +2485,9,6,2,3,0,0,5,1,yes,0,0,0,magic,0, GN_DEMONIC_FIRE,Demonic Fire +2486,9,6,2,0,0,0,5,1,yes,0,0,0,none,0, GN_FIRE_EXPANSION,Fire Expansion //CHECK FIX ME!!!! Level 1 is reducing the damage. Should increase it by 50% +2487,9,6,2,0,0,0,1,1,no,0,0,0,none,0, GN_FIRE_EXPANSION_SMOKE_POWDER,Fire Expansion Smoke Powder +2488,9,6,2,0,0,0,1,1,no,0,0,0,none,0, GN_FIRE_EXPANSION_TEAR_GAS,Fire Expansion Tear Gas +2489,11,6,1,0,0,0,10,1:2:3:4:5:6:7:8:9:10,no,0,0,0,weapon,0, GN_FIRE_EXPANSION_ACID,Fire Expansion Acid +2490,9,6,2,0,0x3,1,5,1,yes,0,0x80,2:3:4:5:6,none,0, GN_HELLS_PLANT,Hell's Plant +2491,0,6,1,0,0x90,0,5,1,no,0,0,0,misc,0, GN_HELLS_PLANT_ATK,Hell's Plant Attack +2492,0,6,4,0,0x3,6:7:8:9:10,5,1,yes,0,0,0,none,0, GN_MANDRAGORA,Howling of Mandragora +2493,11,6,16,0,0x1,0,1,1,yes,0,0,0,none,0, GN_SLINGITEM,Sling Item +2494,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, GN_CHANGEMATERIAL,Change Material +2495,0,6,4,0,0x1,0,2,1,no,0,0,0,none,0, GN_MIX_COOKING,Mix Cooking +2496,0,6,4,0,0x1,0,2,1,no,0,0,0,none,0, GN_MAKEBOMB,Create Bomb +2497,0,6,4,0,0x1,0,10,1,no,0,0,0,none,0, GN_S_PHARMACY,Special Pharmacy +2498,11,6,1,0,0,0,1,1,no,0,0,0,weapon,0, GN_SLINGITEM_RANGEMELEEATK,Sling Item Attack // Episode 13.3 //2533,0,0,4,0,0x1,0,1,0,no,0,0,0,none,0, ALL_ODINS_RECALL,Odin's Recall @@ -1261,49 +1067,49 @@ 8239,9,6,16,0,0x1,0,10,1,yes,0,0,0,magic,0, MER_BLESSING,Blessing 8240,9,6,16,0,0x1,0,10,1,yes,0,0,0,magic,0, MER_INCAGI,Increase Agility -// Summons skills. -//8416,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_AQUAPLAY, -//8420,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_BLAST, -//8418,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_CHILLY_AIR, -//8401,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_CIRCLE_OF_FIRE, -//8417,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_COOLER, -//8423,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_CURSED_SOIL, -//8425,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_FIRE_ARROW, -//8426,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_FIRE_BOMB, -//8427,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_FIRE_BOMB_ATK, -//8402,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_FIRE_CLOAK, -//8403,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_FIRE_MANTLE, -//8428,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_FIRE_WAVE, -//8429,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_FIRE_WAVE_ATK, -//8419,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_GUST, -//8414,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_HEATER, -//8435,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_HURRICANE, -//8436,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_HURRICANE_ATK, -//8430,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_ICE_NEEDLE, -//8422,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_PETROLOGY, -//8412,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_POWER_OF_GAIA, -//8413,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_PYROTECHNIC, -//8440,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_ROCK_CRUSHER, -//8441,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_ROCK_CRUSHER_ATK, -//8410,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_SOLID_SKIN, -//8439,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_STONE_HAMMER, -//8442,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_STONE_RAIN, -//8411,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_STONE_SHIELD, -//8433,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_TIDAL_WEAPON, -//8415,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_TROPIC, -//8437,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_TYPOON_MIS, -//8438,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_TYPOON_MIS_ATK, -//8424,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_UPHEAVAL, -//8406,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_WATER_BARRIER, -//8405,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_WATER_DROP, -//8404,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_WATER_SCREEN, -//8431,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_WATER_SCREW, -//8432,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_WATER_SCREW_ATK, -//8421,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_WILD_STORM, -//8408,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_WIND_CURTAIN, -//8434,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_WIND_SLASH, -//8407,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_WIND_STEP, -//8409,0,0,0,0,0,0,9,0,no,0,0,0,none,0 EL_ZEPHYR, +// Elemental Spirits Skills +8401,0,6,4,3,0,0,1,1,no,0,0,0,weapon,2, EL_CIRCLE_OF_FIRE,Circle of Fire +8402,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_FIRE_CLOAK,Fire Cloak +8403,0,6,4,3,0,0,1,1,no,0,0,3,magic,2, EL_FIRE_MANTLE,Fire Mantle +8404,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_WATER_SCREEN,Water Screen +8405,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_WATER_DROP,Water Drop +8406,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_WATER_BARRIER,Water Barrier +8407,0,6,4,0,0x1,0,1,1,no,0,0,0,none,5, EL_WIND_STEP,Wind Step +8408,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_WIND_CURTAIN,Wind Curtain +8409,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_ZEPHYR,Zephyr +8410,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_SOLID_SKIN,Solid Skin +8411,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_STONE_SHIELD,Stone Shield +8412,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_POWER_OF_GAIA,Power of Gaia +8413,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_PYROTECHNIC,Pyrotechnic +8414,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_HEATER,Heater +8415,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_TROPIC,Tropic +8416,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_AQUAPLAY,Aqua Play +8417,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_COOLER,Cooler +8418,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_CHILLY_AIR,Cool Air +8419,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_GUST,Gust +8420,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_BLAST,Blast +8421,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_WILD_STORM,Wild Storm +8422,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_PETROLOGY,Petrology +8423,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_CURSED_SOIL,Cursed Soil +8424,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0, EL_UPHEAVAL,Upheaval +8425,6,6,1,3,0,0,1,1,no,0,0,0,magic,0, EL_FIRE_ARROW,Fire Arrow +8426,6,6,1,3,0,1,1,1,no,0,0,0,magic,0, EL_FIRE_BOMB,Fire Bomb +8427,6,6,1,3,0,1,1,1,no,0,0,0,weapon,0, EL_FIRE_BOMB_ATK,Fire Bomb Attack +8428,6,6,1,3,0,1,1,1,no,0,0,0,magic,0, EL_FIRE_WAVE,Fire Wave +8429,6,6,1,3,0,1,1,1,no,0,0,0,weapon,0, EL_FIRE_WAVE_ATK,Fire Wave Attack +8430,9,6,1,1,0,0,1,1,no,0,0,0,magic,0, EL_ICE_NEEDLE,Ice Needle +8431,9,6,1,1,0,1,1,1,no,0,0,0,magic,0, EL_WATER_SCREW,Water Screw +8432,9,6,1,1,0,1,1,1,no,0,0,0,weapon,0, EL_WATER_SCREW_ATK,Water Screw Attack +8433,9,6,1,1,0,1,1,1,no,0,0,0,weapon,0, EL_TIDAL_WEAPON,Tidal Weapon +8434,11,6,1,4,0,0,1,1,no,0,0,0,weapon,0, EL_WIND_SLASH,Wind Slasher +8435,11,6,1,4,0,1,1,1,no,0,0,0,weapon,0, EL_HURRICANE,Hurricane Rage +8436,7,6,1,4,0,0,1,1,no,0,0,0,magic,0, EL_HURRICANE_ATK,Hurricane Rage Attack +8437,11,6,1,4,0,1,1,1,no,0,0,0,weapon,0, EL_TYPOON_MIS,Typhoon Missile +8438,11,6,1,4,0,1,1,1,no,0,0,0,magic,0, EL_TYPOON_MIS_ATK,Typhoon Missile Attack +8439,5,6,1,2,0,0,1,1,no,0,0,0,weapon,0, EL_STONE_HAMMER,Stone Hammer +8440,3,6,1,2,0,1,1,1,no,0,0,0,weapon,0, EL_ROCK_CRUSHER,Rock Launcher +8441,5,6,1,2,0,1,1,1,no,0,0,0,magic,0, EL_ROCK_CRUSHER_ATK,Rock Launcher Attack +8442,9,6,1,2,0,1,1,-5,no,0,0,0,weapon,0, EL_STONE_RAIN,Stone Rain 10000,0,0,0,0,0,0,1,0,no,0,0x10,0,none,0, GD_APPROVAL,Official Guild Approval 10001,0,0,0,0,0,0,1,0,no,0,0x10,0,none,0, GD_KAFRACONTRACT,Kafra Contract diff --git a/db/re/skill_require_db.txt b/db/re/skill_require_db.txt index cd95b9834..93abd289c 100644 --- a/db/re/skill_require_db.txt +++ b/db/re/skill_require_db.txt @@ -724,6 +724,61 @@ 2433,0,0,120:130:140:150:160,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WM_WARCRY_OF_BEYOND#Warcry of Beyond# 2434,0,0,120:130:140:150:160,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WM_UNLIMITED_HUMMING_VOICE#Unlimited Humming Voice# +//**** +// SO Sorcerer +2443,0,0,30:34:38:42:46,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_FIREWALK#Fire Walk# +2444,0,0,30:34:38:42:46,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_ELECTRICWALK#Electric Walk# +2445,0,0,40:44:48:52:56,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_SPELLFIST#Spell Fist# +2446,0,0,62:70:78:86:94,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_EARTHGRAVE#Earth Grave# +2447,0,0,50:56:62:68:74,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_DIAMONDDUST#Diamond Dust# +2448,0,0,70:90:110:130:150,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_POISON_BUSTER#Poison Buster# +2449,0,0,48:56:64:70:78,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_PSYCHIC_WAVE#Psychic Wave# +2450,0,0,48:56:64:70:78,0,0,0,99,0,0,none,0,716,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_CLOUD_KILL#Cloud Kill# +2451,0,0,50:55:60:65:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_STRIKING#Striking# +2452,0,0,40:52:64:76:88,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_WARMER#Warmer# +2453,0,0,34:42:50:58:66,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_VACUUM_EXTREME#Vacuum Extreme# +2454,0,0,55:62:69:76:83,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_VARETYR_SPEAR#Varetyr Spear# +2455,0,0,30:35:40:45:50,0,0,0,99,0,0,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_ARRULLO#Arrullo# +2456,0,0,10,0,0,0,99,0,0,elementalspirit,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_EL_CONTROL#Spirit Control# +2457,0,0,100:150:200,0,0,0,99,0,0,none,0,990,3,990,6,994,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_SUMMON_AGNI#Summon Fire Spirit Agni# +2458,0,0,100:150:200,0,0,0,99,0,0,none,0,991,3,991,6,995,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_SUMMON_AQUA#Summon Water Spirit Aqua# +2459,0,0,100:150:200,0,0,0,99,0,0,none,0,992,3,992,6,996,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_SUMMON_VENTUS#Summon Wind Spirit Ventus# +2460,0,0,100:150:200,0,0,0,99,0,0,none,0,993,3,993,6,997,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_SUMMON_TERA#Summon Wind Spirit Tera# +2461,0,0,50,0,0,0,99,0,0,elementalspirit,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_EL_ACTION#Elemental Action# +2462,0,0,10:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_EL_ANALYSIS#Four Spirit Analysis# +2464,0,0,10,0,0,0,99,0,0,elementalspirit,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_EL_CURE#Spirit Recovery# +2465,0,0,22:30:38,0,0,0,99,0,0,none,0,6360,1:2:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_FIRE_INSIGNIA#Fire Insignia# +2466,0,0,22:30:38,0,0,0,99,0,0,none,0,6361,1:2:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_WATER_INSIGNIA#Water Insignia# +2467,0,0,22:30:38,0,0,0,99,0,0,none,0,6362,1:2:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_WIND_INSIGNIA#Wind Insignia# +2468,0,0,22:30:38,0,0,0,99,0,0,none,0,6363,1:2:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_EARTH_INSIGNIA#Earth Insignia# + +//**** +// GN Genetic +2476,0,0,30,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_CART_TORNADO#Cart Tornado# +2477,0,0,40:42:46:48:50,0,0,0,99,8,1,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_CARTCANNON#Cart Cannon# +2478,0,0,20:24:28:32:36,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_CARTBOOST#Cart Boost# +2479,0,0,22:26:30:34:38,0,0,0,99,0,0,none,0,6210,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_THORNS_TRAP#Thorn Trap# +2480,0,0,30:35:40:45:50,0,0,0,99,0,0,none,0,6211,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_BLOOD_SUCKER#Blood Sucker# +2481,0,0,55:60:65:70:75,0,0,0,99,0,0,none,0,6212,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_SPORE_EXPLOSION#Spore Explosion# +2482,0,0,40:50:60:70:80,0,0,0,99,0,0,none,0,6210,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_WALLOFTHORN#Wall of Thorns# +2483,0,0,24:28:32:36:40:44:48:52:56:60,0,0,0,99,0,0,none,0,6210,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_CRAZYWEED#Crazy Weed# +2484,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_CRAZYWEED_ATK#Crazy Weed Attack# +2485,0,0,24:28:32:36:40,0,0,0,99,0,0,none,0,7135,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_DEMONIC_FIRE#Demonic Fire# +2486,0,0,30:35:40:45:50,0,0,0,99,0,0,none,0,6216,1,6213,1,6214,1,6215,1,7136,1,0,0,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# +2487,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION_SMOKE_POWDER#Fire Expansion Smoke Powder# +2488,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION_TEAR_GAS#Fire Expansion Tear Gas# +2489,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION_ACID#Fire Expansion Acid# +2490,0,0,40:45:50:55:60,0,0,0,99,0,0,none,0,7137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# +2491,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT_ATK#Hell's Plant Attack# +2492,0,0,40:45:50:55:60,0,0,0,99,0,0,none,0,6217,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# +2493,0,0,4,0,0,0,99,9,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item# +2494,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# +2495,0,0,5:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# +2496,0,0,5:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb# +2497,0,0,12,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# +2498,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GN_SLINGITEM_RANGEMELEEATK#Sling Item Attack# + + //2533,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ALL_ODINS_RECALL#Odin's Recall# 2534,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RETURN_TO_ELDICASTES#Return To Eldicastes# 2535,0,0,1,0,0,0,99,0,0,none,0,6377,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store @@ -789,3 +844,47 @@ 8238,0,0,20:20:20:25:25:25:30:30:30:35,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MER_KYRIE 8239,0,0,28:32:36:40:44:48:52:56:60:64,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MER_BLESSING 8240,15,0,18:21:24:27:30:33:36:39:42:45,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MER_INCAGI + +// Elemental Spirits Skills +8401,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_CIRCLE_OF_FIRE#Circle of Fire# +8402,0,0,60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_FIRE_CLOAK#Fire Cloak# +8403,0,0,80,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_FIRE_MANTLE#Fire Mantle# +8404,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_WATER_SCREEN#Water Screen# +8405,0,0,60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_WATER_DROP#Water Drop# +8406,0,0,80,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_WATER_BARRIER#Water Barrier# +8407,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_WIND_STEP#Wind Step# +8408,0,0,60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_WIND_CURTAIN#Wind Curtain# +8409,0,0,80,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_ZEPHYR#Zephyr# +8410,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_SOLID_SKIN#Solid Skin# +8411,0,0,60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_STONE_SHIELD#Stone Shield# +8412,0,0,80,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_POWER_OF_GAIA#Power of Gaia# +8413,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_PYROTECHNIC#Pyrotechnic# +8414,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_HEATER#Heater# +8415,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_TROPIC#Tropic# +8416,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_AQUAPLAY#Aqua Play# +8417,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_COOLER#Cooler# +8418,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_CHILLY_AIR#Cool Air# +8419,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_GUST#Gust# +8420,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_BLAST#Blast# +8421,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_WILD_STORM#Wild Storm# +8422,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_PETROLOGY#Petrology# +8423,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_CURSED_SOIL#Cursed Soil# +8424,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_UPHEAVAL#Upheaval# +8425,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_FIRE_ARROW#Fire Arrow# +8426,0,0,60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_FIRE_BOMB#Fire Bomb# +8427,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_FIRE_BOMB_ATK#Fire Bomb Attack# +8428,0,0,80,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_FIRE_WAVE#Fire Wave# +8429,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_FIRE_WAVE_ATK#Fire Wave Attack# +8430,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_ICE_NEEDLE#Ice Needle# +8431,0,0,60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_WATER_SCREW#Water Screw# +8432,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_WATER_SCREW_ATK#Water Screw Attack# +8433,0,0,80,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_TIDAL_WEAPON#Tidal Weapon# +8434,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_WIND_SLASH#Wind Slasher# +8435,0,0,60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_HURRICANE#Hurricane Rage# +8436,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_HURRICANE_ATK#Hurricane Rage Attack# +8437,0,0,80,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_TYPOON_MIS#Typhoon Missile# +8438,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_TYPOON_MIS_ATK#Typhoon Missile Attack# +8439,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_STONE_HAMMER#Stone Hammer# +8440,0,0,60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_ROCK_CRUSHER#Rock Launcher# +8441,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_ROCK_CRUSHER_ATK#Rock Launcher Attack# +8442,0,0,80,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //EL_STONE_RAIN#Stone Rain# diff --git a/db/re/skill_tree.txt b/db/re/skill_tree.txt index 2b8e2b072..ee5ed89e8 100644 --- a/db/re/skill_tree.txt +++ b/db/re/skill_tree.txt @@ -187,7 +187,6 @@ 9,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat# 9,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar# 9,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher# -//9,82,10,0,0,0,0,0,0,0,0,0,0 //WZ_FIREIVY#Fire Ivy# 9,83,10,81,2,21,1,0,0,0,0,0,0 //WZ_METEOR#Meteor Storm# 9,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder# 9,85,10,21,1,84,5,0,0,0,0,0,0 //WZ_VERMILION#Lord of Vermilion# @@ -856,7 +855,7 @@ 4008,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack# 4008,355,5,5,5,7,5,3,5,0,0,0,0 //LK_AURABLADE#Aura Blade# 4008,356,10,3,10,6,5,60,3,0,0,0,0 //LK_PARRYING#Parrying# -4008,357,5,4,5,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration# +4008,357,5,4,1,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration# 4008,358,1,4,10,6,5,8,3,0,0,0,0 //LK_TENSIONRELAX#Relax# 4008,359,1,50,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#Frenzy# //It has an extra column after "MaxLevel" for Job Level 50 requirement 4008,397,5,55,5,56,5,58,5,63,1,0,0 //LK_SPIRALPIERCE#Spiral Pierce# @@ -2169,10 +2168,11 @@ 4047,441,10,0,0,0,0,0,0,0,0,0,0 //SG_DEVIL#Demon of the Sun, Moon and Stars# 4047,442,3,0,0,0,0,0,0,0,0,0,0 //SG_FRIEND#Friend of the Sun, Moon and Stars# 4047,443,10,0,0,0,0,0,0,0,0,0,0 //SG_KNOWLEDGE#Knowledge of the Sun, Moon and Stars# -4047,444,1,443,9,0,0,0,0,0,0,0,0 //SG_FUSION#Union of the Sun, Moon and Stars# +4047,444,1,443,9,0,0,0,0,0,0,0,0 +//SG_FUSION#Union of the Sun, Moon and Stars# 4047,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# 4047,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -//Star Gladiator (Union) +//Star Gladiator (Flying) 4048,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4048,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4048,411,10,0,0,0,0,0,0,0,0,0,0 //TK_RUN#Running# @@ -2209,7 +2209,8 @@ 4048,441,10,0,0,0,0,0,0,0,0,0,0 //SG_DEVIL#Demon of the Sun, Moon and Stars# 4048,442,3,0,0,0,0,0,0,0,0,0,0 //SG_FRIEND#Friend of the Sun, Moon and Stars# 4048,443,10,0,0,0,0,0,0,0,0,0,0 //SG_KNOWLEDGE#Knowledge of the Sun, Moon and Stars# -4048,444,1,443,9,0,0,0,0,0,0,0,0 //SG_FUSION#Union of the Sun, Moon and Stars# +4048,444,1,443,9,0,0,0,0,0,0,0,0 +//SG_FUSION#Union of the Sun, Moon and Stars# 4048,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# 4048,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# //Soul Linker @@ -2261,191 +2262,7 @@ 4049,494,5,451,1,0,0,0,0,0,0,0,0 //SL_HIGH#Spirit of Rebirth# 4049,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# 4049,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -//Gangsi (Bongun/Munak) -4050,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4050,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -//4050,545,5,0,0,0,0,0,0,0,0,0,0 //MB_FIGHTING## -//4050,546,5,0,0,0,0,0,0,0,0,0,0 //MB_NEUTRAL## -//4050,547,7,0,0,0,0,0,0,0,0,0,0 //MB_TAIMING_PUTI## -//4050,548,1,0,0,0,0,0,0,0,0,0,0 //MB_WHITEPOTION## -//4050,549,1,0,0,0,0,0,0,0,0,0,0 //MB_MENTAL## -//4050,550,10,0,0,0,0,0,0,0,0,0,0 //MB_CARDPITCHER## -//4050,551,10,0,0,0,0,0,0,0,0,0,0 //MB_PETPITCHER## -//4050,552,10,0,0,0,0,0,0,0,0,0,0 //MB_BODYSTUDY## -//4050,553,1,0,0,0,0,0,0,0,0,0,0 //MB_BODYALTER## -//4050,554,1,0,0,0,0,0,0,0,0,0,0 //MB_PETMEMORY## -//4050,555,5,0,0,0,0,0,0,0,0,0,0 //MB_M_TELEPORT## -//4050,556,7,0,0,0,0,0,0,0,0,0,0 //MB_B_GAIN## -//4050,557,7,0,0,0,0,0,0,0,0,0,0 //MB_M_GAIN## -//4050,558,1,0,0,0,0,0,0,0,0,0,0 //MB_MISSION## -//4050,559,1,0,0,0,0,0,0,0,0,0,0 //MB_MUNAKKNOWLEDGE## -//4050,560,10,0,0,0,0,0,0,0,0,0,0 //MB_MUNAKBALL## -//4050,561,10,0,0,0,0,0,0,0,0,0,0 //MB_SCROLL## -//4050,562,7,0,0,0,0,0,0,0,0,0,0 //MB_B_GATHERING## -//4050,563,7,0,0,0,0,0,0,0,0,0,0 //MB_M_GATHERING## -//4050,564,5,0,0,0,0,0,0,0,0,0,0 //MB_B_EXCLUDE## -//4050,565,5,0,0,0,0,0,0,0,0,0,0 //MB_B_DRIFT## -//4050,566,7,0,0,0,0,0,0,0,0,0,0 //MB_B_WALLRUSH## -//4050,567,7,0,0,0,0,0,0,0,0,0,0 //MB_M_WALLRUSH## -//4050,568,5,0,0,0,0,0,0,0,0,0,0 //MB_B_WALLSHIFT## -//4050,569,7,0,0,0,0,0,0,0,0,0,0 //MB_M_WALLCRASH## -//4050,570,5,0,0,0,0,0,0,0,0,0,0 //MB_M_REINCARNATION## -//4050,571,1,0,0,0,0,0,0,0,0,0,0 //MB_B_EQUIP## -4050,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4050,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -//Death Knight -4051,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4051,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -//4051,545,5,0,0,0,0,0,0,0,0,0,0 //MB_FIGHTING## -//4051,546,5,0,0,0,0,0,0,0,0,0,0 //MB_NEUTRAL## -//4051,547,7,0,0,0,0,0,0,0,0,0,0 //MB_TAIMING_PUTI## -//4051,548,1,0,0,0,0,0,0,0,0,0,0 //MB_WHITEPOTION## -//4051,549,1,0,0,0,0,0,0,0,0,0,0 //MB_MENTAL## -//4051,550,10,0,0,0,0,0,0,0,0,0,0 //MB_CARDPITCHER## -//4051,551,10,0,0,0,0,0,0,0,0,0,0 //MB_PETPITCHER## -//4051,552,10,0,0,0,0,0,0,0,0,0,0 //MB_BODYSTUDY## -//4051,553,1,0,0,0,0,0,0,0,0,0,0 //MB_BODYALTER## -//4051,554,1,0,0,0,0,0,0,0,0,0,0 //MB_PETMEMORY## -//4051,555,5,0,0,0,0,0,0,0,0,0,0 //MB_M_TELEPORT## -//4051,556,7,0,0,0,0,0,0,0,0,0,0 //MB_B_GAIN## -//4051,557,7,0,0,0,0,0,0,0,0,0,0 //MB_M_GAIN## -//4051,558,1,0,0,0,0,0,0,0,0,0,0 //MB_MISSION## -//4051,559,1,0,0,0,0,0,0,0,0,0,0 //MB_MUNAKKNOWLEDGE## -//4051,560,10,0,0,0,0,0,0,0,0,0,0 //MB_MUNAKBALL## -//4051,561,10,0,0,0,0,0,0,0,0,0,0 //MB_SCROLL## -//4051,562,7,0,0,0,0,0,0,0,0,0,0 //MB_B_GATHERING## -//4051,563,7,0,0,0,0,0,0,0,0,0,0 //MB_M_GATHERING## -//4051,564,5,0,0,0,0,0,0,0,0,0,0 //MB_B_EXCLUDE## -//4051,565,5,0,0,0,0,0,0,0,0,0,0 //MB_B_DRIFT## -//4051,566,7,0,0,0,0,0,0,0,0,0,0 //MB_B_WALLRUSH## -//4051,567,7,0,0,0,0,0,0,0,0,0,0 //MB_M_WALLRUSH## -//4051,568,5,0,0,0,0,0,0,0,0,0,0 //MB_B_WALLSHIFT## -//4051,569,7,0,0,0,0,0,0,0,0,0,0 //MB_M_WALLCRASH## -//4051,570,5,0,0,0,0,0,0,0,0,0,0 //MB_M_REINCARNATION## -//4051,571,1,0,0,0,0,0,0,0,0,0,0 //MB_B_EQUIP## -//4051,580,1,0,0,0,0,0,0,0,0,0,0 //DE_PASSIVE## -//4051,581,10,0,0,0,0,0,0,0,0,0,0 //DE_PATTACK## -//4051,582,10,0,0,0,0,0,0,0,0,0,0 //DE_PSPEED## -//4051,583,10,0,0,0,0,0,0,0,0,0,0 //DE_PDEFENSE## -//4051,584,10,0,0,0,0,0,0,0,0,0,0 //DE_PCRITICAL## -//4051,585,10,0,0,0,0,0,0,0,0,0,0 //DE_PHP## -//4051,586,10,0,0,0,0,0,0,0,0,0,0 //DE_PSP## -//4051,587,1,0,0,0,0,0,0,0,0,0,0 //DE_RESET## -//4051,588,1,0,0,0,0,0,0,0,0,0,0 //DE_RANKING## -//4051,589,1,0,0,0,0,0,0,0,0,0,0 //DE_PTRIPLE## -//4051,590,5,0,0,0,0,0,0,0,0,0,0 //DE_ENERGY## -//4051,591,1,0,0,0,0,0,0,0,0,0,0 //DE_NIGHTMARE## -//4051,592,5,0,0,0,0,0,0,0,0,0,0 //DE_SLASH## -//4051,593,7,0,0,0,0,0,0,0,0,0,0 //DE_COIL## -//4051,594,7,0,0,0,0,0,0,0,0,0,0 //DE_WAVE## -//4051,595,3,0,0,0,0,0,0,0,0,0,0 //DE_REBIRTH## -//4051,596,7,0,0,0,0,0,0,0,0,0,0 //DE_AURA## -//4051,597,7,0,0,0,0,0,0,0,0,0,0 //DE_FREEZER## -//4051,598,7,0,0,0,0,0,0,0,0,0,0 //DE_CHANGEATTACK## -//4051,599,10,0,0,0,0,0,0,0,0,0,0 //DE_PUNISH## -//4051,600,7,0,0,0,0,0,0,0,0,0,0 //DE_POISON## -//4051,601,7,0,0,0,0,0,0,0,0,0,0 //DE_INSTANT## -//4051,602,7,0,0,0,0,0,0,0,0,0,0 //DE_WARNING## -//4051,603,7,0,0,0,0,0,0,0,0,0,0 //DE_RANKEDKNIFE## -//4051,604,7,0,0,0,0,0,0,0,0,0,0 //DE_RANKEDGRADIUS## -//4051,605,1,0,0,0,0,0,0,0,0,0,0 //DE_GAUGE## -//4051,606,5,0,0,0,0,0,0,0,0,0,0 //DE_GTIME## -//4051,607,5,0,0,0,0,0,0,0,0,0,0 //DE_GPAIN## -//4051,608,10,0,0,0,0,0,0,0,0,0,0 //DE_GSKILL## -//4051,609,5,0,0,0,0,0,0,0,0,0,0 //DE_GKILL## -//4051,610,5,0,0,0,0,0,0,0,0,0,0 //DE_ACCEL## -//4051,611,3,0,0,0,0,0,0,0,0,0,0 //DE_BLOCKDOUBLE## -//4051,612,3,0,0,0,0,0,0,0,0,0,0 //DE_BLOCKMELEE## -//4051,613,3,0,0,0,0,0,0,0,0,0,0 //DE_BLOCKFAR## -//4051,614,10,0,0,0,0,0,0,0,0,0,0 //DE_FRONTATTACK## -//4051,615,10,0,0,0,0,0,0,0,0,0,0 //DE_DANGERATTACK## -//4051,616,10,0,0,0,0,0,0,0,0,0,0 //DE_TWINATTACK## -//4051,617,10,0,0,0,0,0,0,0,0,0,0 //DE_WINDATTACK## -//4051,618,10,0,0,0,0,0,0,0,0,0,0 //DE_WATERATTACK## -4051,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4051,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -//Dark Collector -4052,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4052,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -//4052,545,5,0,0,0,0,0,0,0,0,0,0 //MB_FIGHTING## -//4052,546,5,0,0,0,0,0,0,0,0,0,0 //MB_NEUTRAL## -//4052,547,7,0,0,0,0,0,0,0,0,0,0 //MB_TAIMING_PUTI## -//4052,548,1,0,0,0,0,0,0,0,0,0,0 //MB_WHITEPOTION## -//4052,549,1,0,0,0,0,0,0,0,0,0,0 //MB_MENTAL## -//4052,550,10,0,0,0,0,0,0,0,0,0,0 //MB_CARDPITCHER## -//4052,551,10,0,0,0,0,0,0,0,0,0,0 //MB_PETPITCHER## -//4052,552,10,0,0,0,0,0,0,0,0,0,0 //MB_BODYSTUDY## -//4052,553,1,0,0,0,0,0,0,0,0,0,0 //MB_BODYALTER## -//4052,554,1,0,0,0,0,0,0,0,0,0,0 //MB_PETMEMORY## -//4052,555,5,0,0,0,0,0,0,0,0,0,0 //MB_M_TELEPORT## -//4052,556,7,0,0,0,0,0,0,0,0,0,0 //MB_B_GAIN## -//4052,557,7,0,0,0,0,0,0,0,0,0,0 //MB_M_GAIN## -//4052,558,1,0,0,0,0,0,0,0,0,0,0 //MB_MISSION## -//4052,559,1,0,0,0,0,0,0,0,0,0,0 //MB_MUNAKKNOWLEDGE## -//4052,560,10,0,0,0,0,0,0,0,0,0,0 //MB_MUNAKBALL## -//4052,561,10,0,0,0,0,0,0,0,0,0,0 //MB_SCROLL## -//4052,562,7,0,0,0,0,0,0,0,0,0,0 //MB_B_GATHERING## -//4052,563,7,0,0,0,0,0,0,0,0,0,0 //MB_M_GATHERING## -//4052,564,5,0,0,0,0,0,0,0,0,0,0 //MB_B_EXCLUDE## -//4052,565,5,0,0,0,0,0,0,0,0,0,0 //MB_B_DRIFT## -//4052,566,7,0,0,0,0,0,0,0,0,0,0 //MB_B_WALLRUSH## -//4052,567,7,0,0,0,0,0,0,0,0,0,0 //MB_M_WALLRUSH## -//4052,568,5,0,0,0,0,0,0,0,0,0,0 //MB_B_WALLSHIFT## -//4052,569,7,0,0,0,0,0,0,0,0,0,0 //MB_M_WALLCRASH## -//4052,570,5,0,0,0,0,0,0,0,0,0,0 //MB_M_REINCARNATION## -//4052,571,1,0,0,0,0,0,0,0,0,0,0 //MB_B_EQUIP## -//4052,619,5,0,0,0,0,0,0,0,0,0,0 //DA_ENERGY## -//4052,620,10,0,0,0,0,0,0,0,0,0,0 //DA_CLOUD## -//4052,621,5,0,0,0,0,0,0,0,0,0,0 //DA_FIRSTSLOT## -//4052,622,4,0,0,0,0,0,0,0,0,0,0 //DA_HEADDEF## -//4052,623,5,0,0,0,0,0,0,0,0,0,0 //DA_SPACE## -//4052,624,5,0,0,0,0,0,0,0,0,0,0 //DA_TRANSFORM## -//4052,625,5,0,0,0,0,0,0,0,0,0,0 //DA_EXPLOSION## -//4052,626,1,0,0,0,0,0,0,0,0,0,0 //DA_REWARD## -//4052,627,5,0,0,0,0,0,0,0,0,0,0 //DA_CRUSH## -//4052,628,5,0,0,0,0,0,0,0,0,0,0 //DA_ITEMREBUILD## -//4052,629,5,0,0,0,0,0,0,0,0,0,0 //DA_ILLUSION## -//4052,630,5,0,0,0,0,0,0,0,0,0,0 //DA_NUETRALIZE## -//4052,631,5,0,0,0,0,0,0,0,0,0,0 //DA_RUNNER## -//4052,632,5,0,0,0,0,0,0,0,0,0,0 //DA_TRANSFER## -//4052,633,5,0,0,0,0,0,0,0,0,0,0 //DA_WALL## -//4052,634,1,0,0,0,0,0,0,0,0,0,0 //DA_ZENY## -//4052,635,1,0,0,0,0,0,0,0,0,0,0 //DA_REVENGE## -//4052,636,5,0,0,0,0,0,0,0,0,0,0 //DA_EARPLUG## -//4052,637,1,0,0,0,0,0,0,0,0,0,0 //DA_CONTRACT## -//4052,638,5,0,0,0,0,0,0,0,0,0,0 //DA_BLACK## -//4052,639,5,0,0,0,0,0,0,0,0,0,0 //DA_DREAM## -//4052,640,5,0,0,0,0,0,0,0,0,0,0 //DA_MAGICCART## -//4052,641,1,0,0,0,0,0,0,0,0,0,0 //DA_COPY## -//4052,642,1,0,0,0,0,0,0,0,0,0,0 //DA_CRYSTAL## -//4052,643,1,0,0,0,0,0,0,0,0,0,0 //DA_EXP## -//4052,644,10,0,0,0,0,0,0,0,0,0,0 //DA_CARTSWING## -//4052,645,1,0,0,0,0,0,0,0,0,0,0 //DA_REBUILD## -//4052,646,10,0,0,0,0,0,0,0,0,0,0 //DA_JOBCHANGE## -//4052,647,5,0,0,0,0,0,0,0,0,0,0 //DA_EDARKNESS## -//4052,648,5,0,0,0,0,0,0,0,0,0,0 //DA_EGUARDIAN## -//4052,649,3,0,0,0,0,0,0,0,0,0,0 //DA_TIMEOUT## -//4052,650,1,0,0,0,0,0,0,0,0,0,0 //ALL_TIMEIN## -//4052,651,1,0,0,0,0,0,0,0,0,0,0 //DA_ZENYRANK## -//4052,652,1,0,0,0,0,0,0,0,0,0,0 //DA_ACCESSORYMIX## -4052,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4052,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -//New Soul Linker And Soul Link Enabled Skills -//4049,572,5,0,0,0,0,0,0,0,0,0,0 //SL_DEATHKNIGHT## -//4049,573,5,0,0,0,0,0,0,0,0,0,0 //SL_COLLECTOR## -//4049,574,5,0,0,0,0,0,0,0,0,0,0 //SL_NINJA## -//4049,575,5,0,0,0,0,0,0,0,0,0,0 //SL_GUNNER## -//4052,577,1,0,0,0,0,0,0,0,0,0,0 //DA_RESET## -//4051,578,1,0,0,0,0,0,0,0,0,0,0 //DE_BERSERKAIZER## -//4052,579,1,0,0,0,0,0,0,0,0,0,0 //DA_DARKPOWER## -//Twilight Alchemy 4 For All Alchemist Classes -//18,576,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT4## -//4019,576,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT4## -//4041,576,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT4## -//4071,576,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT4## -//4078,576,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT4## -//4107,576,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT4## -//Rune Knight (Regular) +//Rune Knight (non-trans) 4054,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4054,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4054,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# @@ -2483,7 +2300,7 @@ 4054,2009,5,2007,2,0,0,0,0,0,0,0,0 //RK_DRAGONHOWLING#Dragon Howling# 4054,2010,10,0,0,0,0,0,0,0,0,0,0 //RK_RUNEMASTERY#Rune Mastery# 4054,2020,5,57,2,0,0,0,0,0,0,0,0 //RK_PHANTOMTHRUST#Phantom Thrust# -//Warlock (Regular) +//Warlock (non-trans) 4055,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4055,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4055,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery# @@ -2539,7 +2356,7 @@ 4055,2230,2,0,0,0,0,0,0,0,0,0,0 //WL_RELEASE#Release# 4055,2231,1,0,0,0,0,0,0,0,0,0,0 //WL_READING_SB#Reading Spellbook# 4055,2232,5,0,0,0,0,0,0,0,0,0,0 //WL_FREEZE_SP#Freeze Spell# -//Ranger (Regular) +//Ranger (non-trans) 4056,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4056,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4056,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# @@ -2592,7 +2409,7 @@ 4056,2252,1,2248,1,0,0,0,0,0,0,0,0 //RA_VERDURETRAP#Verdure Trap# 4056,2253,5,2237,1,0,0,0,0,0,0,0,0 //RA_FIRINGTRAP#Firing Trap# 4056,2254,5,2237,1,0,0,0,0,0,0,0,0 //RA_ICEBOUNDTRAP#Icebound Trap# -//Arch Bishop (Regular) +//Arch Bishop (non-trans) 4057,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4057,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4057,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection# @@ -2650,7 +2467,7 @@ 4057,2054,10,68,1,0,0,0,0,0,0,0,0 //AB_DUPLELIGHT#Duple Light# 4057,2057,5,2052,1,0,0,0,0,0,0,0,0 //AB_SILENTIUM#Silentium# 4057,2515,5,2044,1,2053,1,0,0,0,0,0,0 //AB_SECRAMENT#Secrament# -//Mechanic (Regular) +//Mechanic (non-trans) 4058,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4058,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4058,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit# @@ -2719,7 +2536,7 @@ 4058,2282,5,2277,2,0,0,0,0,0,0,0,0 //NC_MAGICDECOY#FAW - Magic Decoy# 4058,2283,1,2281,1,0,0,0,0,0,0,0,0 //NC_DISJOINT#FAW Removal# 4058,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store# -//Guillotine Cross (Regular) +//Guillotine Cross (non-trans) 4059,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4059,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4059,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack# @@ -2789,7 +2606,7 @@ 4060,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack# 4060,355,5,5,5,7,5,3,5,0,0,0,0 //LK_AURABLADE#Aura Blade# 4060,356,10,3,10,6,5,60,3,0,0,0,0 //LK_PARRYING#Parrying# -4060,357,5,4,5,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration# +4060,357,5,4,1,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration# 4060,358,1,4,10,6,5,8,3,0,0,0,0 //LK_TENSIONRELAX#Relax# 4060,359,1,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#Frenzy# //Extra column removed. Rune Knights dont require job level 50 to use Berserk. 4060,397,5,55,5,56,5,58,5,63,1,0,0 //LK_SPIRALPIERCE#Spiral Pierce# @@ -2928,7 +2745,7 @@ 4062,2252,1,2248,1,0,0,0,0,0,0,0,0 //RA_VERDURETRAP#Verdure Trap# 4062,2253,5,2237,1,0,0,0,0,0,0,0,0 //RA_FIRINGTRAP#Firing Trap# 4062,2254,5,2237,1,0,0,0,0,0,0,0,0 //RA_ICEBOUNDTRAP#Icebound Trap# -//Arch Bishop (Trans) +//Arch Bishop (Trans) 4063,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4063,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4063,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection# @@ -3113,7 +2930,7 @@ 4065,2035,5,2034,1,0,0,0,0,0,0,0,0 //GC_HALLUCINATIONWALK#Hallucination Walk# 4065,2036,5,136,10,0,0,0,0,0,0,0,0 //GC_ROLLINGCUTTER#Rolling Cutter# 4065,2037,5,2036,1,0,0,0,0,0,0,0,0 //GC_CROSSRIPPERSLASHER#Cross Ripper Slasher# -//Royal Guard (Regular) +//Royal Guard (non-trans) 4066,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4066,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4066,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# @@ -3166,7 +2983,7 @@ 4066,2323,5,2311,3,0,0,0,0,0,0,0,0 //LG_EARTHDRIVE#Earth Drive# 4066,2324,5,2318,3,2319,3,0,0,0,0,0,0 //LG_HESPERUSLIT#Hesperus Lit# 4066,2325,5,2315,3,2321,4,2322,5,0,0,0,0 //LG_INSPIRATION#Inspiration# -//Sorcerer (Regular) +//Sorcerer (non-trans) 4067,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4067,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4067,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery# @@ -3236,7 +3053,7 @@ 4067,2466,3,2458,3,0,0,0,0,0,0,0,0 //SO_WATER_INSIGNIA#Water Insignia# 4067,2467,3,2459,3,0,0,0,0,0,0,0,0 //SO_WIND_INSIGNIA#Wind Insignia# 4067,2468,3,2460,3,0,0,0,0,0,0,0,0 //SO_EARTH_INSIGNIA#Earth Insignia# -//Minstrel (Regular) +//Minstrel (non-trans) 4068,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4068,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4068,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# @@ -3291,7 +3108,7 @@ 4068,2432,5,2427,1,0,0,0,0,0,0,0,0 //WM_MELODYOFSINK#Melody Of Sink# 4068,2433,5,2431,1,0,0,0,0,0,0,0,0 //WM_BEYOND_OF_WARCRY#Warcry Of Beyond# 4068,2434,5,2429,1,2433,1,0,0,0,0,0,0 //WM_UNLIMITED_HUMMING_VOICE#Unlimited Humming Voice# -//Wanderer (Regular) +//Wanderer (non-trans) 4069,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4069,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4069,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# @@ -3346,7 +3163,7 @@ 4069,2432,5,2427,1,0,0,0,0,0,0,0,0 //WM_MELODYOFSINK#Melody Of Sink# 4069,2433,5,2431,1,0,0,0,0,0,0,0,0 //WM_BEYOND_OF_WARCRY#Warcry Of Beyond# 4069,2434,5,2429,1,2433,1,0,0,0,0,0,0 //WM_UNLIMITED_HUMMING_VOICE#Unlimited Humming Voice# -//Sura (Regular) +//Sura (non-trans) 4070,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4070,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4070,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection# @@ -3460,7 +3277,7 @@ 4071,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb# 4071,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4071,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store# -//Shadow Chaser (Regular) +//Shadow Chaser (Non-trans) 4072,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4072,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4072,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack# @@ -3574,7 +3391,7 @@ 4073,2323,5,2311,3,0,0,0,0,0,0,0,0 //LG_EARTHDRIVE#Earth Drive# 4073,2324,5,2318,3,2319,3,0,0,0,0,0,0 //LG_HESPERUSLIT#Hesperus Lit# 4073,2325,5,2315,3,2321,4,2322,5,0,0,0,0 //LG_INSPIRATION#Inspiration# -//Sorcerer (Trans) +//Sorcerer (Trans 2nd to 3rd) 4074,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 4074,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 4074,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery# @@ -3931,7 +3748,7 @@ 4079,225,10,219,5,0,0,0,0,0,0,0,0 //RG_PLAGIARISM#Intimidate# 4079,1005,1,0,0,0,0,0,0,0,0,0,0 //RG_CLOSECONFINE#Close Confine# 4079,389,5,51,5,213,3,0,0,0,0,0,0 //ST_CHASEWALK#Stealth# -4079,390,5,0,0,0,0,0,0,0,0,0,0 //ST_REJECTSWORD#Counter Instinct# +4079,390,5,215,1,0,0,0,0,0,0,0,0 //ST_REJECTSWORD#Counter Instinct# 4079,475,1,225,10,0,0,0,0,0,0,0,0 //ST_PRESERVE#Preserve# 4079,476,5,215,5,216,5,217,5,218,5,0,0 //ST_FULLSTRIP#Divest All# 4079,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# @@ -3956,1678 +3773,4 @@ 4079,2301,3,2299,1,0,0,0,0,0,0,0,0 //SC_CHAOSPANIC#Chaos Panic# 4079,2302,3,2296,3,2301,3,0,0,0,0,0,0 //SC_MAELSTROM#Maelstrom# 4079,2303,3,2300,3,0,0,0,0,0,0,0,0 //SC_BLOODYLUST#Bloody Lust# -4079,2304,3,2300,3,0,0,0,0,0,0,0,0 //SC_FEINTBOMB#Feint Bomb# -//Rune Knight (Dragon) (Regular) -4080,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4080,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4080,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# -4080,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery# -4080,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery# -4080,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash# -4080,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke# -4080,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break# -4080,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure# -4080,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery# -4080,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point# -4080,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk# -4080,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery# -4080,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce# -4080,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear# -4080,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab# -4080,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang# -4080,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken# -4080,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack# -4080,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash# -4080,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding# -4080,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery# -4080,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack# -4080,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4080,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken# -4080,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4080,2001,5,2010,2,0,0,0,0,0,0,0,0 //RK_ENCHANTBLADE#Enchant Blade# -4080,2002,5,2001,3,0,0,0,0,0,0,0,0 //RK_SONICWAVE#Sonic Wave# -4080,2003,10,61,1,2001,2,0,0,0,0,0,0 //RK_DEATHBOUND#Death Bound# -4080,2004,10,2020,3,0,0,0,0,0,0,0,0 //RK_HUNDREDSPEAR#Hundred Spear# -4080,2005,5,2001,5,0,0,0,0,0,0,0,0 //RK_WINDCUTTER#Wind Cutter# -4080,2006,5,2002,2,2003,5,2005,3,0,0,0,0 //RK_IGNITIONBREAK#Ignition Break# -4080,2007,5,64,1,0,0,0,0,0,0,0,0 //RK_DRAGONTRAINING#Dragon Training# -4080,2008,10,2007,2,0,0,0,0,0,0,0,0 //RK_DRAGONBREATH#Dragon Breath# -4080,2009,5,2007,2,0,0,0,0,0,0,0,0 //RK_DRAGONHOWLING#Dragon Howling# -4080,2010,10,0,0,0,0,0,0,0,0,0,0 //RK_RUNEMASTERY#Rune Mastery# -4080,2020,5,57,2,0,0,0,0,0,0,0,0 //RK_PHANTOMTHRUST#Phantom Thrust# -//Rune Knight (Dragon) (Trans) -4081,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4081,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4081,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# -4081,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery# -4081,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery# -4081,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash# -4081,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke# -4081,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break# -4081,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure# -4081,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery# -4081,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point# -4081,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk# -4081,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery# -4081,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce# -4081,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear# -4081,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab# -4081,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang# -4081,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken# -4081,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack# -4081,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash# -4081,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding# -4081,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery# -4081,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack# -4081,355,5,5,5,7,5,3,5,0,0,0,0 //LK_AURABLADE#Aura Blade# -4081,356,10,3,10,6,5,60,3,0,0,0,0 //LK_PARRYING#Parrying# -4081,357,5,4,5,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration# -4081,358,1,4,10,6,5,8,3,0,0,0,0 //LK_TENSIONRELAX#Relax# -4081,359,1,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#Frenzy# //Extra column removed. Rune Knights dont require job level 50 to use Berserk. -4081,397,5,55,5,56,5,58,5,63,1,0,0 //LK_SPIRALPIERCE#Spiral Pierce# -4081,398,5,55,9,63,1,0,0,0,0,0,0 //LK_HEADCRUSH#Traumatic Blow# -4081,399,10,55,9,64,3,398,3,0,0,0,0 //LK_JOINTBEAT#Vital Strike# -4081,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4081,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken# -4081,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4081,2001,5,2010,2,0,0,0,0,0,0,0,0 //RK_ENCHANTBLADE#Enchant Blade# -4081,2002,5,2001,3,0,0,0,0,0,0,0,0 //RK_SONICWAVE#Sonic Wave# -4081,2003,10,61,1,2001,2,0,0,0,0,0,0 //RK_DEATHBOUND#Death Bound# -4081,2004,10,2020,3,0,0,0,0,0,0,0,0 //RK_HUNDREDSPEAR#Hundred Spear# -4081,2005,5,2001,5,0,0,0,0,0,0,0,0 //RK_WINDCUTTER#Wind Cutter# -4081,2006,5,2002,2,2003,5,2005,3,0,0,0,0 //RK_IGNITIONBREAK#Ignition Break# -4081,2007,5,64,1,0,0,0,0,0,0,0,0 //RK_DRAGONTRAINING#Dragon Training# -4081,2008,10,2007,2,0,0,0,0,0,0,0,0 //RK_DRAGONBREATH#Dragon Breath# -4081,2009,5,2007,2,0,0,0,0,0,0,0,0 //RK_DRAGONHOWLING#Dragon Howling# -4081,2010,10,0,0,0,0,0,0,0,0,0,0 //RK_RUNEMASTERY#Rune Mastery# -4081,2020,5,57,2,0,0,0,0,0,0,0,0 //RK_PHANTOMTHRUST#Phantom Thrust# -//Royal Guard (Gryphon) (Regular) -4082,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4082,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4082,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# -4082,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery# -4082,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery# -4082,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash# -4082,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke# -4082,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break# -4082,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure# -4082,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery# -4082,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point# -4082,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk# -4082,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding# -4082,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery# -4082,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery# -4082,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure# -4082,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection# -4082,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane# -4082,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal# -4082,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith# -4082,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard# -4082,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite# -4082,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang# -4082,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect# -4082,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross# -4082,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross# -4082,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice# -4082,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls# -4082,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura# -4082,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken# -4082,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink# -4082,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4082,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4082,2307,5,2312,1,0,0,0,0,0,0,0,0 //LG_CANNONSPEAR#Cannon Spear# -4082,2308,10,55,1,0,0,0,0,0,0,0,0 //LG_BANISHINGPOINT#Banishing Point# -4082,2309,3,0,0,0,0,0,0,0,0,0,0 //LG_TRAMPLE#Trample# -4082,2310,5,250,3,0,0,0,0,0,0,0,0 //LG_SHIELDPRESS#Shield Press# -4082,2311,5,252,5,0,0,0,0,0,0,0,0 //LG_REFLECTDAMAGE#Reflect Damage# -4082,2312,5,2308,5,0,0,0,0,0,0,0,0 //LG_PINPOINTATTACK#Pinpoint Attack# -4082,2313,5,0,0,0,0,0,0,0,0,0,0 //LG_FORCEOFVANGUARD#Force of Vanguard# -4082,2314,1,2313,1,0,0,0,0,0,0,0,0 //LG_RAGEBURST#Rage Burst# -4082,2315,3,2310,3,2323,2,0,0,0,0,0,0 //LG_SHIELDSPELL#Shield Spell# -4082,2316,5,2308,3,0,0,0,0,0,0,0,0 //LG_EXEEDBREAK#Exceed Break# -4082,2317,5,2312,1,2320,3,0,0,0,0,0,0 //LG_OVERBRAND#Over Brand# -4082,2318,5,2309,3,0,0,0,0,0,0,0,0 //LG_PRESTIGE#Prestige# -4082,2319,5,2312,3,2314,1,0,0,0,0,0,0 //LG_BANDING#Banding# -4082,2320,5,55,1,0,0,0,0,0,0,0,0 //LG_MOONSLASHER#Moon Slasher# -4082,2321,5,254,5,0,0,0,0,0,0,0,0 //LG_RAYOFGENESIS#Ray of Genesis# -4082,2322,5,248,3,0,0,0,0,0,0,0,0 //LG_PIETY#Piety# -4082,2323,5,2311,3,0,0,0,0,0,0,0,0 //LG_EARTHDRIVE#Earth Drive# -4082,2324,5,2318,3,2319,3,0,0,0,0,0,0 //LG_HESPERUSLIT#Hesperus Lit# -4082,2325,5,2315,3,2321,4,2322,5,0,0,0,0 //LG_INSPIRATION#Inspiration# -//Royal Guard (Gryphon) (Trans) -4083,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4083,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4083,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# -4083,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery# -4083,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery# -4083,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash# -4083,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke# -4083,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break# -4083,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure# -4083,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery# -4083,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point# -4083,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk# -4083,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding# -4083,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery# -4083,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery# -4083,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure# -4083,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection# -4083,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane# -4083,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal# -4083,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith# -4083,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard# -4083,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite# -4083,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang# -4083,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect# -4083,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross# -4083,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross# -4083,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice# -4083,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls# -4083,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura# -4083,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken# -4083,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink# -4083,367,5,8,5,248,5,250,2,0,0,0,0 //PA_PRESSURE#Gloria Domini# -4083,368,5,8,1,248,5,255,3,0,0,0,0 //PA_SACRIFICE#Martyr's Reckoning# -4083,369,10,248,8,22,3,23,5,0,0,0,0 //PA_GOSPEL#Battle Chant# -4083,480,5,251,5,0,0,0,0,0,0,0,0 //PA_SHIELDCHAIN#Shield Chain# -4083,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4083,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4083,2307,5,2312,1,0,0,0,0,0,0,0,0 //LG_CANNONSPEAR#Cannon Spear# -4083,2308,10,55,1,0,0,0,0,0,0,0,0 //LG_BANISHINGPOINT#Banishing Point# -4083,2309,3,0,0,0,0,0,0,0,0,0,0 //LG_TRAMPLE#Trample# -4083,2310,5,250,3,0,0,0,0,0,0,0,0 //LG_SHIELDPRESS#Shield Press# -4083,2311,5,252,5,0,0,0,0,0,0,0,0 //LG_REFLECTDAMAGE#Reflect Damage# -4083,2312,5,2308,5,0,0,0,0,0,0,0,0 //LG_PINPOINTATTACK#Pinpoint Attack# -4083,2313,5,0,0,0,0,0,0,0,0,0,0 //LG_FORCEOFVANGUARD#Force of Vanguard# -4083,2314,1,2313,1,0,0,0,0,0,0,0,0 //LG_RAGEBURST#Rage Burst# -4083,2315,3,2310,3,2323,2,0,0,0,0,0,0 //LG_SHIELDSPELL#Shield Spell# -4083,2316,5,2308,3,0,0,0,0,0,0,0,0 //LG_EXEEDBREAK#Exceed Break# -4083,2317,5,2312,1,2320,3,0,0,0,0,0,0 //LG_OVERBRAND#Over Brand# -4083,2318,5,2309,3,0,0,0,0,0,0,0,0 //LG_PRESTIGE#Prestige# -4083,2319,5,2312,3,2314,1,0,0,0,0,0,0 //LG_BANDING#Banding# -4083,2320,5,55,1,0,0,0,0,0,0,0,0 //LG_MOONSLASHER#Moon Slasher# -4083,2321,5,254,5,0,0,0,0,0,0,0,0 //LG_RAYOFGENESIS#Ray of Genesis# -4083,2322,5,248,3,0,0,0,0,0,0,0,0 //LG_PIETY#Piety# -4083,2323,5,2311,3,0,0,0,0,0,0,0,0 //LG_EARTHDRIVE#Earth Drive# -4083,2324,5,2318,3,2319,3,0,0,0,0,0,0 //LG_HESPERUSLIT#Hesperus Lit# -4083,2325,5,2315,3,2321,4,2322,5,0,0,0,0 //LG_INSPIRATION#Inspiration# -//Ranger (Waug) (Regular) -4084,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4084,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4084,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# -4084,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye# -4084,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration# -4084,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe# -4084,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower# -4084,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting# -4084,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel# -4084,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap# -4084,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine# -4084,117,5,115,1,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#Ankle Snare# -4084,118,5,117,1,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#Shockwave Trap# -4084,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman# -4084,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher# -4084,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap# -4084,122,5,116,1,119,1,121,1,0,0,0,0 //HT_BLASTMINE#Blast Mine# -4084,123,5,118,1,122,1,0,0,0,0,0,0 //HT_CLAYMORETRAP#Claymore Trap# -4084,124,1,116,1,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap# -4084,125,1,118,1,124,1,0,0,0,0,0,0 //HT_TALKIEBOX#Talkie Box# -4084,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane# -4084,127,1,126,1,0,0,0,0,0,0,0,0 //HT_FALCON#Falconry Mastery# -4084,128,10,129,5,0,0,0,0,0,0,0,0 //HT_STEELCROW#Steel Crow# -4084,129,5,127,1,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#Blitz Beat# -4084,130,4,45,1,127,1,0,0,0,0,0,0 //HT_DETECTING#Detect# -4084,131,5,124,1,127,1,0,0,0,0,0,0 //HT_SPRINGTRAP#Spring Trap# -4084,1009,1,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#Phantasmic Arrow# -4084,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4084,499,1,46,10,0,0,0,0,0,0,0,0 //HT_POWER#Beast Strafing# -4084,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4084,2233,10,2236,5,0,0,0,0,0,0,0,0 //RA_ARROWSTORM#Arrow Storm# -4084,2234,5,2233,5,2247,1,0,0,0,0,0,0 //RA_FEARBREEZE#Fear Breeze# -4084,2235,10,0,0,0,0,0,0,0,0,0,0 //RA_RANGERMAIN#Ranger Main# -4084,2236,10,117,5,0,0,0,0,0,0,0,0 //RA_AIMEDBOLT#Aimed Bolt# -4084,2237,1,2239,3,0,0,0,0,0,0,0,0 //RA_DETONATOR#Detonator# -4084,2238,5,118,5,0,0,0,0,0,0,0,0 //RA_ELECTRICSHOCKER#Electric Shocker# -4084,2239,5,2248,3,0,0,0,0,0,0,0,0 //RA_CLUSTERBOMB#Cluster Bomb# -4084,2240,1,0,0,0,0,0,0,0,0,0,0 //RA_WUGMASTERY#Warg Mastery# -4084,2241,3,2240,1,0,0,0,0,0,0,0,0 //RA_WUGRIDER#Warg Rider# -4084,2242,1,2241,1,0,0,0,0,0,0,0,0 //RA_WUGDASH#Warg Dash# -4084,2243,5,2245,1,0,0,0,0,0,0,0,0 //RA_WUGSTRIKE#Warg Strike# -4084,2244,5,2240,1,0,0,0,0,0,0,0,0 //RA_WUGBITE#Warg Bite# -4084,2245,10,2240,1,0,0,0,0,0,0,0,0 //RA_TOOTHOFWUG#Tooth Of Warg# -4084,2246,5,2245,3,0,0,0,0,0,0,0,0 //RA_SENSITIVEKEEN#Sensitive Keen# -4084,2247,5,2235,1,0,0,0,0,0,0,0,0 //RA_CAMOUFLAGE#Camouflage# -4084,2248,5,123,1,124,1,0,0,0,0,0,0 //RA_RESEARCHTRAP#Research Trap# -4084,2249,1,2248,1,0,0,0,0,0,0,0,0 //RA_MAGENTATRAP#Magenta Trap# -4084,2250,1,2248,1,0,0,0,0,0,0,0,0 //RA_COBALTTRAP#Cobalt Trap# -4084,2251,1,2248,1,0,0,0,0,0,0,0,0 //RA_MAIZETRAP#Maize Trap# -4084,2252,1,2248,1,0,0,0,0,0,0,0,0 //RA_VERDURETRAP#Verdure Trap# -4084,2253,5,2237,1,0,0,0,0,0,0,0,0 //RA_FIRINGTRAP#Firing Trap# -4084,2254,5,2237,1,0,0,0,0,0,0,0,0 //RA_ICEBOUNDTRAP#Icebound Trap# -//Ranger (Waug) (Trans) -4085,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4085,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4085,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# -4085,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye# -4085,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration# -4085,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe# -4085,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower# -4085,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting# -4085,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel# -4085,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap# -4085,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine# -4085,117,5,115,1,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#Ankle Snare# -4085,118,5,117,1,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#Shockwave Trap# -4085,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman# -4085,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher# -4085,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap# -4085,122,5,116,1,119,1,121,1,0,0,0,0 //HT_BLASTMINE#Blast Mine# -4085,123,5,118,1,122,1,0,0,0,0,0,0 //HT_CLAYMORETRAP#Claymore Trap# -4085,124,1,116,1,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap# -4085,125,1,118,1,124,1,0,0,0,0,0,0 //HT_TALKIEBOX#Talkie Box# -4085,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane# -4085,127,1,126,1,0,0,0,0,0,0,0,0 //HT_FALCON#Falconry Mastery# -4085,128,10,129,5,0,0,0,0,0,0,0,0 //HT_STEELCROW#Steel Crow# -4085,129,5,127,1,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#Blitz Beat# -4085,130,4,45,1,127,1,0,0,0,0,0,0 //HT_DETECTING#Detect# -4085,131,5,124,1,127,1,0,0,0,0,0,0 //HT_SPRINGTRAP#Spring Trap# -4085,1009,1,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#Phantasmic Arrow# -4085,380,10,43,10,44,10,45,10,127,1,0,0 //SN_SIGHT#Falcon Eyes# -4085,381,5,128,3,44,5,129,5,127,1,0,0 //SN_FALCONASSAULT#Falcon Assault# -4085,382,5,45,10,46,5,0,0,0,0,0,0 //SN_SHARPSHOOTING#Focused Arrow Strike# -4085,383,10,45,9,0,0,0,0,0,0,0,0 //SN_WINDWALK#Wind Walker# -4085,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4085,499,1,46,10,0,0,0,0,0,0,0,0 //HT_POWER#Beast Strafing# -4085,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4085,2233,10,2236,5,0,0,0,0,0,0,0,0 //RA_ARROWSTORM#Arrow Storm# -4085,2234,5,2233,5,2247,1,0,0,0,0,0,0 //RA_FEARBREEZE#Fear Breeze# -4085,2235,10,0,0,0,0,0,0,0,0,0,0 //RA_RANGERMAIN#Ranger Main# -4085,2236,10,117,5,0,0,0,0,0,0,0,0 //RA_AIMEDBOLT#Aimed Bolt# -4085,2237,1,2239,3,0,0,0,0,0,0,0,0 //RA_DETONATOR#Detonator# -4085,2238,5,118,5,0,0,0,0,0,0,0,0 //RA_ELECTRICSHOCKER#Electric Shocker# -4085,2239,5,2248,3,0,0,0,0,0,0,0,0 //RA_CLUSTERBOMB#Cluster Bomb# -4085,2240,1,0,0,0,0,0,0,0,0,0,0 //RA_WUGMASTERY#Warg Mastery# -4085,2241,3,2240,1,0,0,0,0,0,0,0,0 //RA_WUGRIDER#Warg Rider# -4085,2242,1,2241,1,0,0,0,0,0,0,0,0 //RA_WUGDASH#Warg Dash# -4085,2243,5,2245,1,0,0,0,0,0,0,0,0 //RA_WUGSTRIKE#Warg Strike# -4085,2244,5,2240,1,0,0,0,0,0,0,0,0 //RA_WUGBITE#Warg Bite# -4085,2245,10,2240,1,0,0,0,0,0,0,0,0 //RA_TOOTHOFWUG#Tooth Of Warg# -4085,2246,5,2245,3,0,0,0,0,0,0,0,0 //RA_SENSITIVEKEEN#Sensitive Keen# -4085,2247,5,2235,1,0,0,0,0,0,0,0,0 //RA_CAMOUFLAGE#Camouflage# -4085,2248,5,123,1,124,1,0,0,0,0,0,0 //RA_RESEARCHTRAP#Research Trap# -4085,2249,1,2248,1,0,0,0,0,0,0,0,0 //RA_MAGENTATRAP#Magenta Trap# -4085,2250,1,2248,1,0,0,0,0,0,0,0,0 //RA_COBALTTRAP#Cobalt Trap# -4085,2251,1,2248,1,0,0,0,0,0,0,0,0 //RA_MAIZETRAP#Maize Trap# -4085,2252,1,2248,1,0,0,0,0,0,0,0,0 //RA_VERDURETRAP#Verdure Trap# -4085,2253,5,2237,1,0,0,0,0,0,0,0,0 //RA_FIRINGTRAP#Firing Trap# -4085,2254,5,2237,1,0,0,0,0,0,0,0,0 //RA_ICEBOUNDTRAP#Icebound Trap# -//Mechanic (Mado) (Regular) -4086,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4086,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4086,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit# -4086,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount# -4086,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge# -4086,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart# -4086,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal# -4086,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending# -4086,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite# -4086,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution# -4086,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart# -4086,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar# -4086,94,5,0,0,0,0,0,0,0,0,0,0 //BS_IRON#Iron Tempering# -4086,95,5,94,1,0,0,0,0,0,0,0,0 //BS_STEEL#Steel Tempering# -4086,96,5,94,1,0,0,0,0,0,0,0,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft# -4086,97,5,96,1,0,0,0,0,0,0,0,0 //BS_ORIDEOCON#Oridecon Research# -4086,98,3,0,0,0,0,0,0,0,0,0,0 //BS_DAGGER#Smith Dagger# -4086,99,3,98,1,0,0,0,0,0,0,0,0 //BS_SWORD#Smith Sword# -4086,100,3,99,1,0,0,0,0,0,0,0,0 //BS_TWOHANDSWORD#Smith Two-handed Sword# -4086,101,3,99,2,0,0,0,0,0,0,0,0 //BS_AXE#Smith Axe# -4086,102,3,103,1,0,0,0,0,0,0,0,0 //BS_MACE#Smith Mace# -4086,103,3,98,1,0,0,0,0,0,0,0,0 //BS_KNUCKLE#Smith Knucklebrace# -4086,104,3,98,2,0,0,0,0,0,0,0,0 //BS_SPEAR#Smith Spear# -4086,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding# -4086,106,1,95,1,105,1,0,0,0,0,0,0 //BS_FINDINGORE#Ore Discovery# -4086,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research# -4086,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair# -4086,109,5,0,0,0,0,0,0,0,0,0,0 //BS_SKINTEMPER#Skin Tempering# -4086,110,5,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#Hammer Fall# -4086,111,5,110,2,0,0,0,0,0,0,0,0 //BS_ADRENALINE#Adrenaline Rush# -4086,112,5,107,2,111,2,0,0,0,0,0,0 //BS_WEAPONPERFECT#Weapon Perfection# -4086,113,5,111,3,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#Power-Thrust# -4086,114,5,112,3,113,2,0,0,0,0,0,0 //BS_MAXIMIZE#Maximize Power# -4086,1012,1,0,0,0,0,0,0,0,0,0,0 //BS_UNFAIRLYTRICK#Unfair Trick# -4086,1013,1,0,0,0,0,0,0,0,0,0,0 //BS_GREED#Greed# -4086,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4086,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush# -4086,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4086,2255,5,0,0,0,0,0,0,0,0,0,0 //NC_MADOLICENCE#Mado License# -4086,2256,5,2255,1,0,0,0,0,0,0,0,0 //NC_BOOSTKNUCKLE#Boost Knuckle# -4086,2257,3,2256,2,0,0,0,0,0,0,0,0 //NC_PILEBUNKER#Pile Bunker# -4086,2258,3,2256,2,0,0,0,0,0,0,0,0 //NC_VULCANARM#Vulcan Arm# -4086,2259,3,2258,3,0,0,0,0,0,0,0,0 //NC_FLAMELAUNCHER#Flame Launcher# -4086,2260,3,2258,3,0,0,0,0,0,0,0,0 //NC_COLDSLOWER#Cold Slower# -4086,2261,3,2259,2,2260,2,0,0,0,0,0,0 //NC_ARMSCANNON#Arm Cannon# -4086,2262,3,2255,1,0,0,0,0,0,0,0,0 //NC_ACCELERATION#Acceleration# -4086,2263,1,2262,1,0,0,0,0,0,0,0,0 //NC_HOVERING#Hovering# -4086,2264,1,2263,1,0,0,0,0,0,0,0,0 //NC_F_SIDESLIDE#Front-Side Slide# -4086,2265,1,2263,1,0,0,0,0,0,0,0,0 //NC_B_SIDESLIDE#Back-Side Slide# -4086,2266,4,2255,4,0,0,0,0,0,0,0,0 //NC_MAINFRAME#Mainframe Restructure# -4086,2267,3,2266,2,0,0,0,0,0,0,0,0 //NC_SELFDESTRUCTION#Self Destruction# -4086,2268,4,2266,2,0,0,0,0,0,0,0,0 //NC_SHAPESHIFT#Shape Shift# -4086,2269,1,2267,2,0,0,0,0,0,0,0,0 //NC_EMERGENCYCOOL#Emergency Cool# -4086,2270,1,2268,2,0,0,0,0,0,0,0,0 //NC_INFRAREDSCAN#Infrared Scan# -4086,2271,3,2270,1,0,0,0,0,0,0,0,0 //NC_ANALYZE#Analyze# -4086,2272,3,2269,1,0,0,0,0,0,0,0,0 //NC_MAGNETICFIELD#Magnetic Field# -4086,2273,3,2272,2,0,0,0,0,0,0,0,0 //NC_NEUTRALBARRIER#Neutral Barrier# -4086,2274,3,2271,3,2273,2,0,0,0,0,0,0 //NC_STEALTHFIELD#Stealth Field# -4086,2275,5,2255,1,0,0,0,0,0,0,0,0 //NC_REPAIR#Repair# -4086,2276,10,0,0,0,0,0,0,0,0,0,0 //NC_TRAININGAXE#Axe Training# -4086,2277,5,0,0,0,0,0,0,0,0,0,0 //NC_RESEARCHFE#Research Fire/Earth# -4086,2278,5,2276,1,0,0,0,0,0,0,0,0 //NC_AXEBOOMERANG#Axe Boomerang# -4086,2279,5,2278,3,0,0,0,0,0,0,0,0 //NC_POWERSWING#Power Swing# -4086,2280,5,2276,1,0,0,0,0,0,0,0,0 //NC_AXETORNADO#Axe Tornado# -4086,2281,5,2277,2,0,0,0,0,0,0,0,0 //NC_SILVERSNIPER#FAW - Silver Sniper# -4086,2282,5,2277,2,0,0,0,0,0,0,0,0 //NC_MAGICDECOY#FAW - Magic Decoy# -4086,2283,1,2281,1,0,0,0,0,0,0,0,0 //NC_DISJOINT#FAW Removal# -4086,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store# -//Mechanic (Mado) (Trans) -4087,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4087,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4087,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit# -4087,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount# -4087,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge# -4087,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart# -4087,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal# -4087,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending# -4087,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite# -4087,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution# -4087,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart# -4087,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar# -4087,94,5,0,0,0,0,0,0,0,0,0,0 //BS_IRON#Iron Tempering# -4087,95,5,94,1,0,0,0,0,0,0,0,0 //BS_STEEL#Steel Tempering# -4087,96,5,94,1,0,0,0,0,0,0,0,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft# -4087,97,5,96,1,0,0,0,0,0,0,0,0 //BS_ORIDEOCON#Oridecon Research# -4087,98,3,0,0,0,0,0,0,0,0,0,0 //BS_DAGGER#Smith Dagger# -4087,99,3,98,1,0,0,0,0,0,0,0,0 //BS_SWORD#Smith Sword# -4087,100,3,99,1,0,0,0,0,0,0,0,0 //BS_TWOHANDSWORD#Smith Two-handed Sword# -4087,101,3,99,2,0,0,0,0,0,0,0,0 //BS_AXE#Smith Axe# -4087,102,3,103,1,0,0,0,0,0,0,0,0 //BS_MACE#Smith Mace# -4087,103,3,98,1,0,0,0,0,0,0,0,0 //BS_KNUCKLE#Smith Knucklebrace# -4087,104,3,98,2,0,0,0,0,0,0,0,0 //BS_SPEAR#Smith Spear# -4087,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding# -4087,106,1,95,1,105,1,0,0,0,0,0,0 //BS_FINDINGORE#Ore Discovery# -4087,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research# -4087,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair# -4087,109,5,0,0,0,0,0,0,0,0,0,0 //BS_SKINTEMPER#Skin Tempering# -4087,110,5,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#Hammer Fall# -4087,111,5,110,2,0,0,0,0,0,0,0,0 //BS_ADRENALINE#Adrenaline Rush# -4087,112,5,107,2,111,2,0,0,0,0,0,0 //BS_WEAPONPERFECT#Weapon Perfection# -4087,113,5,111,3,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#Power-Thrust# -4087,114,5,112,3,113,2,0,0,0,0,0,0 //BS_MAXIMIZE#Maximize Power# -4087,1012,1,0,0,0,0,0,0,0,0,0,0 //BS_UNFAIRLYTRICK#Unfair Trick# -4087,1013,1,0,0,0,0,0,0,0,0,0,0 //BS_GREED#Greed# -4087,384,10,109,3,105,1,107,5,113,3,0,0 //WS_MELTDOWN#Shattering Strike# -4087,387,1,39,5,153,1,154,1,105,1,0,0 //WS_CARTBOOST#Cart Boost# -4087,477,10,107,10,0,0,0,0,0,0,0,0 //WS_WEAPONREFINE#Upgrade Weapon# -4087,485,10,42,10,110,5,387,1,0,0,0,0 //WS_CARTTERMINATION#Cart Termination# -4087,486,5,113,5,0,0,0,0,0,0,0,0 //WS_OVERTHRUSTMAX#Maximum Power Thrust# -4087,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4087,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush# -4087,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4087,2255,5,0,0,0,0,0,0,0,0,0,0 //NC_MADOLICENCE#Mado License# -4087,2256,5,2255,1,0,0,0,0,0,0,0,0 //NC_BOOSTKNUCKLE#Boost Knuckle# -4087,2257,3,2256,2,0,0,0,0,0,0,0,0 //NC_PILEBUNKER#Pile Bunker# -4087,2258,3,2256,2,0,0,0,0,0,0,0,0 //NC_VULCANARM#Vulcan Arm# -4087,2259,3,2258,3,0,0,0,0,0,0,0,0 //NC_FLAMELAUNCHER#Flame Launcher# -4087,2260,3,2258,3,0,0,0,0,0,0,0,0 //NC_COLDSLOWER#Cold Slower# -4087,2261,3,2259,2,2260,2,0,0,0,0,0,0 //NC_ARMSCANNON#Arm Cannon# -4087,2262,3,2255,1,0,0,0,0,0,0,0,0 //NC_ACCELERATION#Acceleration# -4087,2263,1,2262,1,0,0,0,0,0,0,0,0 //NC_HOVERING#Hovering# -4087,2264,1,2263,1,0,0,0,0,0,0,0,0 //NC_F_SIDESLIDE#Front-Side Slide# -4087,2265,1,2263,1,0,0,0,0,0,0,0,0 //NC_B_SIDESLIDE#Back-Side Slide# -4087,2266,4,2255,4,0,0,0,0,0,0,0,0 //NC_MAINFRAME#Mainframe Restructure# -4087,2267,3,2266,2,0,0,0,0,0,0,0,0 //NC_SELFDESTRUCTION#Self Destruction# -4087,2268,4,2266,2,0,0,0,0,0,0,0,0 //NC_SHAPESHIFT#Shape Shift# -4087,2269,1,2267,2,0,0,0,0,0,0,0,0 //NC_EMERGENCYCOOL#Emergency Cool# -4087,2270,1,2268,2,0,0,0,0,0,0,0,0 //NC_INFRAREDSCAN#Infrared Scan# -4087,2271,3,2270,1,0,0,0,0,0,0,0,0 //NC_ANALYZE#Analyze# -4087,2272,3,2269,1,0,0,0,0,0,0,0,0 //NC_MAGNETICFIELD#Magnetic Field# -4087,2273,3,2272,2,0,0,0,0,0,0,0,0 //NC_NEUTRALBARRIER#Neutral Barrier# -4087,2274,3,2271,3,2273,2,0,0,0,0,0,0 //NC_STEALTHFIELD#Stealth Field# -4087,2275,5,2255,1,0,0,0,0,0,0,0,0 //NC_REPAIR#Repair# -4087,2276,10,0,0,0,0,0,0,0,0,0,0 //NC_TRAININGAXE#Axe Training# -4087,2277,5,0,0,0,0,0,0,0,0,0,0 //NC_RESEARCHFE#Research Fire/Earth# -4087,2278,5,2276,1,0,0,0,0,0,0,0,0 //NC_AXEBOOMERANG#Axe Boomerang# -4087,2279,5,2278,3,0,0,0,0,0,0,0,0 //NC_POWERSWING#Power Swing# -4087,2280,5,2276,1,0,0,0,0,0,0,0,0 //NC_AXETORNADO#Axe Tornado# -4087,2281,5,2277,2,0,0,0,0,0,0,0,0 //NC_SILVERSNIPER#FAW - Silver Sniper# -4087,2282,5,2277,2,0,0,0,0,0,0,0,0 //NC_MAGICDECOY#FAW - Magic Decoy# -4087,2283,1,2281,1,0,0,0,0,0,0,0,0 //NC_DISJOINT#FAW Removal# -4087,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store# -//Baby Rune Knight -4096,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4096,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4096,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# -4096,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery# -4096,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery# -4096,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash# -4096,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke# -4096,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break# -4096,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure# -4096,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery# -4096,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point# -4096,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk# -4096,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4096,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4096,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery# -4096,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce# -4096,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear# -4096,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab# -4096,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang# -4096,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken# -4096,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack# -4096,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash# -4096,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding# -4096,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery# -4096,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack# -4096,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken# -4096,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4096,2001,5,2010,2,0,0,0,0,0,0,0,0 //RK_ENCHANTBLADE#Enchant Blade# -4096,2002,5,2001,3,0,0,0,0,0,0,0,0 //RK_SONICWAVE#Sonic Wave# -4096,2003,10,61,1,2001,2,0,0,0,0,0,0 //RK_DEATHBOUND#Death Bound# -4096,2004,10,2020,3,0,0,0,0,0,0,0,0 //RK_HUNDREDSPEAR#Hundred Spear# -4096,2005,5,2001,5,0,0,0,0,0,0,0,0 //RK_WINDCUTTER#Wind Cutter# -4096,2006,5,2002,2,2003,5,2005,3,0,0,0,0 //RK_IGNITIONBREAK#Ignition Break# -4096,2007,5,64,1,0,0,0,0,0,0,0,0 //RK_DRAGONTRAINING#Dragon Training# -4096,2008,10,2007,2,0,0,0,0,0,0,0,0 //RK_DRAGONBREATH#Dragon Breath# -4096,2009,5,2007,2,0,0,0,0,0,0,0,0 //RK_DRAGONHOWLING#Dragon Howling# -4096,2010,10,0,0,0,0,0,0,0,0,0,0 //RK_RUNEMASTERY#Rune Mastery# -4096,2020,5,57,2,0,0,0,0,0,0,0,0 //RK_PHANTOMTHRUST#Phantom Thrust# -//Baby Warlock -4097,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4097,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4097,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery# -4097,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight# -4097,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat# -4097,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall# -4097,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike# -4097,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt# -4097,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver# -4097,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse# -4097,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball# -4097,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall# -4097,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt# -4097,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt# -4097,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm# -4097,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat# -4097,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4097,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4097,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar# -4097,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher# -4097,83,10,81,2,21,1,0,0,0,0,0,0 //WZ_METEOR#Meteor Storm# -4097,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder# -4097,85,10,21,1,84,5,0,0,0,0,0,0 //WZ_VERMILION#Lord of Vermilion# -4097,86,5,14,1,20,1,0,0,0,0,0,0 //WZ_WATERBALL#Water Ball# -4097,87,10,16,1,15,1,0,0,0,0,0,0 //WZ_ICEWALL#Ice Wall# -4097,88,10,87,1,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#Frost Nova# -4097,89,10,15,1,84,3,0,0,0,0,0,0 //WZ_STORMGUST#Storm Gust# -4097,90,5,16,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike# -4097,91,5,90,3,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive# -4097,92,5,91,1,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#Quagmire# -4097,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense# -4097,1006,1,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTBLASTER#Sight Blaster# -4097,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4097,2201,5,2202,3,0,0,0,0,0,0,0,0 //WL_WHITEIMPRISON#White Imprison# -4097,2202,5,2210,1,0,0,0,0,0,0,0,0 //WL_SOULEXPANSION#Soul Expansion# -4097,2203,5,2224,1,0,0,0,0,0,0,0,0 //WL_FROSTMISTY#Frosty Misty# -4097,2204,5,2203,2,0,0,0,0,0,0,0,0 //WL_JACKFROST#Jack Frost# -4097,2205,5,92,1,0,0,0,0,0,0,0,0 //WL_MARSHOFABYSS#Marsh of Abyss# -4097,2206,5,2201,1,2209,1,2230,2,0,0,0,0 //WL_RECOGNIZEDSPELL#Recognized Spell# -4097,2207,5,2229,1,0,0,0,0,0,0,0,0 //WL_SIENNAEXECRATE#Sienna Execrate# -4097,2208,3,0,0,0,0,0,0,0,0,0,0 //WL_RADIUS#Radius# -4097,2209,5,2210,1,0,0,0,0,0,0,0,0 //WL_STASIS#Stasis# -4097,2210,5,2208,1,0,0,0,0,0,0,0,0 //WL_DRAINLIFE#Drain Life# -4097,2211,5,2222,1,0,0,0,0,0,0,0,0 //WL_CRIMSONROCK#Crimson Rock# -4097,2212,5,2211,2,0,0,0,0,0,0,0,0 //WL_HELLINFERNO#Hell Inferno# -4097,2213,5,2212,3,0,0,0,0,0,0,0,0 //WL_COMET#Comet# -4097,2214,5,2223,1,0,0,0,0,0,0,0,0 //WL_CHAINLIGHTNING#Chain Lightning# -4097,2216,5,2207,2,0,0,0,0,0,0,0,0 //WL_EARTHSTRAIN#Earth Strain# -4097,2217,5,2204,5,2212,5,2214,5,2216,5,0,0 //WL_TETRAVORTEX#Tetra Vortex# -4097,2222,5,83,1,0,0,0,0,0,0,0,0 //WL_SUMMONFB#Summon Fire Ball# -4097,2223,5,85,1,0,0,0,0,0,0,0,0 //WL_SUMMONBL#Summon Lightning Ball# -4097,2224,5,89,1,0,0,0,0,0,0,0,0 //WL_SUMMONWB#Summon Water Ball# -4097,2229,5,91,1,0,0,0,0,0,0,0,0 //WL_SUMMONSTONE#Summon Stone# -4097,2230,2,0,0,0,0,0,0,0,0,0,0 //WL_RELEASE#Release# -4097,2231,1,0,0,0,0,0,0,0,0,0,0 //WL_READING_SB#Reading Spellbook# -4097,2232,5,0,0,0,0,0,0,0,0,0,0 //WL_FREEZE_SP#Freeze Spell# -//Baby Ranger -4098,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4098,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4098,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# -4098,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye# -4098,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration# -4098,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe# -4098,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower# -4098,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting# -4098,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel# -4098,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4098,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4098,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap# -4098,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine# -4098,117,5,115,1,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#Ankle Snare# -4098,118,5,117,1,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#Shockwave Trap# -4098,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman# -4098,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher# -4098,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap# -4098,122,5,116,1,119,1,121,1,0,0,0,0 //HT_BLASTMINE#Blast Mine# -4098,123,5,118,1,122,1,0,0,0,0,0,0 //HT_CLAYMORETRAP#Claymore Trap# -4098,124,1,116,1,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap# -4098,125,1,118,1,124,1,0,0,0,0,0,0 //HT_TALKIEBOX#Talkie Box# -4098,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane# -4098,127,1,126,1,0,0,0,0,0,0,0,0 //HT_FALCON#Falconry Mastery# -4098,128,10,129,5,0,0,0,0,0,0,0,0 //HT_STEELCROW#Steel Crow# -4098,129,5,127,1,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#Blitz Beat# -4098,130,4,45,1,127,1,0,0,0,0,0,0 //HT_DETECTING#Detect# -4098,131,5,124,1,127,1,0,0,0,0,0,0 //HT_SPRINGTRAP#Spring Trap# -4098,1009,1,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#Phantasmic Arrow# -4098,499,1,46,10,0,0,0,0,0,0,0,0 //HT_POWER#Beast Strafing# -4098,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4098,2233,10,2236,5,0,0,0,0,0,0,0,0 //RA_ARROWSTORM#Arrow Storm# -4098,2234,5,2233,5,2247,1,0,0,0,0,0,0 //RA_FEARBREEZE#Fear Breeze# -4098,2235,10,0,0,0,0,0,0,0,0,0,0 //RA_RANGERMAIN#Ranger Main# -4098,2236,10,117,5,0,0,0,0,0,0,0,0 //RA_AIMEDBOLT#Aimed Bolt# -4098,2237,1,2239,3,0,0,0,0,0,0,0,0 //RA_DETONATOR#Detonator# -4098,2238,5,118,5,0,0,0,0,0,0,0,0 //RA_ELECTRICSHOCKER#Electric Shocker# -4098,2239,5,2248,3,0,0,0,0,0,0,0,0 //RA_CLUSTERBOMB#Cluster Bomb# -4098,2240,1,0,0,0,0,0,0,0,0,0,0 //RA_WUGMASTERY#Warg Mastery# -4098,2241,3,2240,1,0,0,0,0,0,0,0,0 //RA_WUGRIDER#Warg Rider# -4098,2242,1,2241,1,0,0,0,0,0,0,0,0 //RA_WUGDASH#Warg Dash# -4098,2243,5,2245,1,0,0,0,0,0,0,0,0 //RA_WUGSTRIKE#Warg Strike# -4098,2244,5,2240,1,0,0,0,0,0,0,0,0 //RA_WUGBITE#Warg Bite# -4098,2245,10,2240,1,0,0,0,0,0,0,0,0 //RA_TOOTHOFWUG#Tooth Of Warg# -4098,2246,5,2245,3,0,0,0,0,0,0,0,0 //RA_SENSITIVEKEEN#Sensitive Keen# -4098,2247,5,2235,1,0,0,0,0,0,0,0,0 //RA_CAMOUFLAGE#Camouflage# -4098,2248,5,123,1,124,1,0,0,0,0,0,0 //RA_RESEARCHTRAP#Research Trap# -4098,2249,1,2248,1,0,0,0,0,0,0,0,0 //RA_MAGENTATRAP#Magenta Trap# -4098,2250,1,2248,1,0,0,0,0,0,0,0,0 //RA_COBALTTRAP#Cobalt Trap# -4098,2251,1,2248,1,0,0,0,0,0,0,0,0 //RA_MAIZETRAP#Maize Trap# -4098,2252,1,2248,1,0,0,0,0,0,0,0,0 //RA_VERDURETRAP#Verdure Trap# -4098,2253,5,2237,1,0,0,0,0,0,0,0,0 //RA_FIRINGTRAP#Firing Trap# -4098,2254,5,2237,1,0,0,0,0,0,0,0,0 //RA_ICEBOUNDTRAP#Icebound Trap# -//Baby Arch Bishop -4099,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4099,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4099,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection# -4099,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane# -4099,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach# -4099,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma# -4099,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport# -4099,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal# -4099,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal# -4099,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI# -4099,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI# -4099,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta# -4099,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis# -4099,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus# -4099,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing# -4099,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure# -4099,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light# -4099,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4099,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4099,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery# -4099,12,10,68,4,70,3,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall# -4099,54,4,72,1,9,4,0,0,0,0,0,0 //ALL_RESURRECTION#Resurrection# -4099,65,10,0,0,0,0,0,0,0,0,0,0 //PR_MACEMASTERY#Mace Mastery# -4099,66,5,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#Impositio Manus# -4099,67,3,66,2,0,0,0,0,0,0,0,0 //PR_SUFFRAGIUM#Suffragium# -4099,68,5,31,1,66,3,0,0,0,0,0,0 //PR_ASPERSIO#Aspersio# -4099,69,5,75,3,68,5,0,0,0,0,0,0 //PR_BENEDICTIO#B.S Sacramenti# -4099,70,10,28,1,0,0,0,0,0,0,0,0 //PR_SANCTUARY#Sanctuary# -4099,71,4,0,0,0,0,0,0,0,0,0,0 //PR_SLOWPOISON#Slow Poison# -4099,72,1,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#Status Recovery# -4099,73,10,33,2,0,0,0,0,0,0,0,0 //PR_KYRIE#Kyrie Eleison# -4099,74,5,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#Magnificat# -4099,75,5,73,4,74,3,0,0,0,0,0,0 //PR_GLORIA#Gloria# -4099,76,10,24,1,0,0,0,0,0,0,0,0 //PR_LEXDIVINA#Lex Divina# -4099,77,10,54,1,76,3,0,0,0,0,0,0 //PR_TURNUNDEAD#Turn Undead# -4099,78,1,76,5,0,0,0,0,0,0,0,0 //PR_LEXAETERNA#Lex Aeterna# -4099,79,10,12,1,78,1,77,3,0,0,0,0 //PR_MAGNUS#Magnus Exorcismus# -4099,1014,1,0,0,0,0,0,0,0,0,0,0 //PR_REDEMPTIO#Redemptio# -4099,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4099,2038,5,77,1,0,0,0,0,0,0,0,0 //AB_JUDEX#Judex# -4099,2039,1,2041,3,0,0,0,0,0,0,0,0 //AB_ANCILLA#Ancilla# -4099,2040,10,79,1,2038,1,2039,1,0,0,0,0 //AB_ADORAMUS#Adoramus# -4099,2041,3,34,1,0,0,0,0,0,0,0,0 //AB_CLEMENTIA#Crementia# -4099,2042,3,29,1,0,0,0,0,0,0,0,0 //AB_CANTO#Canto Candidus# -4099,2043,3,28,1,0,0,0,0,0,0,0,0 //AB_CHEAL#Coluceo Heal# -4099,2044,5,2039,1,2051,1,0,0,0,0,0,0 //AB_EPICLESIS#Epiclesis# -4099,2045,10,73,1,0,0,0,0,0,0,0,0 //AB_PRAEFATIO#Praefatio# -4099,2046,10,2045,5,0,0,0,0,0,0,0,0 //AB_ORATIO#Oratio# -4099,2047,4,72,1,0,0,0,0,0,0,0,0 //AB_LAUDAAGNUS#Lauda Agnus# -4099,2048,4,2047,2,0,0,0,0,0,0,0,0 //AB_LAUDARAMUS#Lauda Ramus# -4099,2049,10,2044,1,2053,1,0,0,0,0,0,0 //AB_EUCHARISTICA#Eucharistica# -4099,2050,1,2043,3,0,0,0,0,0,0,0,0 //AB_RENOVATIO#Renovatio# -4099,2051,5,2050,1,0,0,0,0,0,0,0,0 //AB_HIGHNESSHEAL#Highness Heal# -4099,2052,5,2048,2,0,0,0,0,0,0,0,0 //AB_CLEARANCE#Clearance# -4099,2053,5,2046,5,2054,5,0,0,0,0,0,0 //AB_EXPIATIO#Expiatio# -4099,2054,10,68,1,0,0,0,0,0,0,0,0 //AB_DUPLELIGHT#Duple Light# -4099,2057,5,2052,1,0,0,0,0,0,0,0,0 //AB_SILENTIUM#Silentium# -4099,2515,5,2044,1,2053,1,0,0,0,0,0,0 //AB_SECRAMENT#Secrament# -//Baby Mechanic -4100,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4100,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4100,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit# -4100,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount# -4100,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge# -4100,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart# -4100,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal# -4100,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending# -4100,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite# -4100,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution# -4100,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart# -4100,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar# -4100,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4100,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4100,94,5,0,0,0,0,0,0,0,0,0,0 //BS_IRON#Iron Tempering# -4100,95,5,94,1,0,0,0,0,0,0,0,0 //BS_STEEL#Steel Tempering# -4100,96,5,94,1,0,0,0,0,0,0,0,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft# -4100,97,5,96,1,0,0,0,0,0,0,0,0 //BS_ORIDEOCON#Oridecon Research# -4100,98,3,0,0,0,0,0,0,0,0,0,0 //BS_DAGGER#Smith Dagger# -4100,99,3,98,1,0,0,0,0,0,0,0,0 //BS_SWORD#Smith Sword# -4100,100,3,99,1,0,0,0,0,0,0,0,0 //BS_TWOHANDSWORD#Smith Two-handed Sword# -4100,101,3,99,2,0,0,0,0,0,0,0,0 //BS_AXE#Smith Axe# -4100,102,3,103,1,0,0,0,0,0,0,0,0 //BS_MACE#Smith Mace# -4100,103,3,98,1,0,0,0,0,0,0,0,0 //BS_KNUCKLE#Smith Knucklebrace# -4100,104,3,98,2,0,0,0,0,0,0,0,0 //BS_SPEAR#Smith Spear# -4100,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding# -4100,106,1,95,1,105,1,0,0,0,0,0,0 //BS_FINDINGORE#Ore Discovery# -4100,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research# -4100,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair# -4100,109,5,0,0,0,0,0,0,0,0,0,0 //BS_SKINTEMPER#Skin Tempering# -4100,110,5,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#Hammer Fall# -4100,111,5,110,2,0,0,0,0,0,0,0,0 //BS_ADRENALINE#Adrenaline Rush# -4100,112,5,107,2,111,2,0,0,0,0,0,0 //BS_WEAPONPERFECT#Weapon Perfection# -4100,113,5,111,3,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#Power-Thrust# -4100,114,5,112,3,113,2,0,0,0,0,0,0 //BS_MAXIMIZE#Maximize Power# -4100,1012,1,0,0,0,0,0,0,0,0,0,0 //BS_UNFAIRLYTRICK#Unfair Trick# -4100,1013,1,0,0,0,0,0,0,0,0,0,0 //BS_GREED#Greed# -4100,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush# -4100,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4100,2255,5,0,0,0,0,0,0,0,0,0,0 //NC_MADOLICENCE#Mado License# -4100,2256,5,2255,1,0,0,0,0,0,0,0,0 //NC_BOOSTKNUCKLE#Boost Knuckle# -4100,2257,3,2256,2,0,0,0,0,0,0,0,0 //NC_PILEBUNKER#Pile Bunker# -4100,2258,3,2256,2,0,0,0,0,0,0,0,0 //NC_VULCANARM#Vulcan Arm# -4100,2259,3,2258,3,0,0,0,0,0,0,0,0 //NC_FLAMELAUNCHER#Flame Launcher# -4100,2260,3,2258,3,0,0,0,0,0,0,0,0 //NC_COLDSLOWER#Cold Slower# -4100,2261,3,2259,2,2260,2,0,0,0,0,0,0 //NC_ARMSCANNON#Arm Cannon# -4100,2262,3,2255,1,0,0,0,0,0,0,0,0 //NC_ACCELERATION#Acceleration# -4100,2263,1,2262,1,0,0,0,0,0,0,0,0 //NC_HOVERING#Hovering# -4100,2264,1,2263,1,0,0,0,0,0,0,0,0 //NC_F_SIDESLIDE#Front-Side Slide# -4100,2265,1,2263,1,0,0,0,0,0,0,0,0 //NC_B_SIDESLIDE#Back-Side Slide# -4100,2266,4,2255,4,0,0,0,0,0,0,0,0 //NC_MAINFRAME#Mainframe Restructure# -4100,2267,3,2266,2,0,0,0,0,0,0,0,0 //NC_SELFDESTRUCTION#Self Destruction# -4100,2268,4,2266,2,0,0,0,0,0,0,0,0 //NC_SHAPESHIFT#Shape Shift# -4100,2269,1,2267,2,0,0,0,0,0,0,0,0 //NC_EMERGENCYCOOL#Emergency Cool# -4100,2270,1,2268,2,0,0,0,0,0,0,0,0 //NC_INFRAREDSCAN#Infrared Scan# -4100,2271,3,2270,1,0,0,0,0,0,0,0,0 //NC_ANALYZE#Analyze# -4100,2272,3,2269,1,0,0,0,0,0,0,0,0 //NC_MAGNETICFIELD#Magnetic Field# -4100,2273,3,2272,2,0,0,0,0,0,0,0,0 //NC_NEUTRALBARRIER#Neutral Barrier# -4100,2274,3,2271,3,2273,2,0,0,0,0,0,0 //NC_STEALTHFIELD#Stealth Field# -4100,2275,5,2255,1,0,0,0,0,0,0,0,0 //NC_REPAIR#Repair# -4100,2276,10,0,0,0,0,0,0,0,0,0,0 //NC_TRAININGAXE#Axe Training# -4100,2277,5,0,0,0,0,0,0,0,0,0,0 //NC_RESEARCHFE#Research Fire/Earth# -4100,2278,5,2276,1,0,0,0,0,0,0,0,0 //NC_AXEBOOMERANG#Axe Boomerang# -4100,2279,5,2278,3,0,0,0,0,0,0,0,0 //NC_POWERSWING#Power Swing# -4100,2280,5,2276,1,0,0,0,0,0,0,0,0 //NC_AXETORNADO#Axe Tornado# -4100,2281,5,2277,2,0,0,0,0,0,0,0,0 //NC_SILVERSNIPER#FAW - Silver Sniper# -4100,2282,5,2277,2,0,0,0,0,0,0,0,0 //NC_MAGICDECOY#FAW - Magic Decoy# -4100,2283,1,2281,1,0,0,0,0,0,0,0,0 //NC_DISJOINT#FAW Removal# -4100,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store# -//Baby Guillotine Cross -4101,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4101,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4101,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack# -4101,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge# -4101,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal# -4101,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding# -4101,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom# -4101,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify# -4101,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand# -4101,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding# -4101,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone# -4101,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling# -4101,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4101,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4101,132,5,0,0,0,0,0,0,0,0,0,0 //AS_RIGHT#Righthand Mastery# -4101,133,5,132,2,0,0,0,0,0,0,0,0 //AS_LEFT#Lefthand Mastery# -4101,134,10,0,0,0,0,0,0,0,0,0,0 //AS_KATAR#Katar Mastery# -4101,135,10,51,2,0,0,0,0,0,0,0,0 //AS_CLOAKING#Cloaking# -4101,136,10,134,4,0,0,0,0,0,0,0,0 //AS_SONICBLOW#Sonic Blow# -4101,137,5,135,2,136,5,0,0,0,0,0,0 //AS_GRIMTOOTH#Grimtooth# -4101,138,10,52,1,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#Enchant Poison# -4101,139,10,138,3,0,0,0,0,0,0,0,0 //AS_POISONREACT#Poison React# -4101,140,10,138,5,0,0,0,0,0,0,0,0 //AS_VENOMDUST#Venom Dust# -4101,141,10,139,5,140,5,0,0,0,0,0,0 //AS_SPLASHER#Venom Splasher# -4101,1003,1,0,0,0,0,0,0,0,0,0,0 //AS_SONICACCEL#Sonic Acceleration# -4101,1004,1,0,0,0,0,0,0,0,0,0,0 //AS_VENOMKNIFE#Throw Venom Knife# -4101,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4101,2021,5,138,3,0,0,0,0,0,0,0,0 //GC_VENOMIMPRESS#Venom Impress# -4101,2022,5,136,10,0,0,0,0,0,0,0,0 //GC_CROSSIMPACT#Cross Impact# -4101,2023,5,2022,3,0,0,0,0,0,0,0,0 //GC_DARKILLUSION#Dark Illusion# -4101,2024,10,0,0,0,0,0,0,0,0,0,0 //GC_RESEARCHNEWPOISON#Research New Poison# -4101,2025,1,2024,1,0,0,0,0,0,0,0,0 //GC_CREATENEWPOISON#Create New Poison# -4101,2026,1,2024,5,0,0,0,0,0,0,0,0 //GC_ANTIDOTE#Antidote# -4101,2027,5,2025,1,0,0,0,0,0,0,0,0 //GC_POISONINGWEAPON#Poisoning Weapon# -4101,2028,5,133,5,0,0,0,0,0,0,0,0 //GC_WEAPONBLOCKING#Weapon Blocking# -4101,2029,5,2028,1,0,0,0,0,0,0,0,0 //GC_COUNTERSLASH#Counter Slash# -4101,2030,5,2028,1,0,0,0,0,0,0,0,0 //GC_WEAPONCRUSH#Weapon Crush# -4101,2031,5,2027,3,2028,1,0,0,0,0,0,0 //GC_VENOMPRESSURE#Venom Pressure# -4101,2032,5,2027,5,2031,5,0,0,0,0,0,0 //GC_POISONSMOKE#Poison Smoke# -4101,2033,5,135,3,0,0,0,0,0,0,0,0 //GC_CLOAKINGEXCEED#Cloaking Exceed# -4101,2034,1,2023,5,2033,5,0,0,0,0,0,0 //GC_PHANTOMMENACE#Phantom Menace# -4101,2035,5,2034,1,0,0,0,0,0,0,0,0 //GC_HALLUCINATIONWALK#Hallucination Walk# -4101,2036,5,136,10,0,0,0,0,0,0,0,0 //GC_ROLLINGCUTTER#Rolling Cutter# -4101,2037,5,2036,1,0,0,0,0,0,0,0,0 //GC_CROSSRIPPERSLASHER#Cross Ripper Slasher# -//Baby Royal Guard -4102,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4102,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4102,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# -4102,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery# -4102,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery# -4102,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash# -4102,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke# -4102,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break# -4102,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure# -4102,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery# -4102,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point# -4102,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk# -4102,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4102,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4102,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding# -4102,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery# -4102,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery# -4102,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure# -4102,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection# -4102,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane# -4102,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal# -4102,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith# -4102,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard# -4102,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite# -4102,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang# -4102,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect# -4102,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross# -4102,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross# -4102,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice# -4102,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls# -4102,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura# -4102,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken# -4102,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink# -4102,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4102,2307,5,2312,1,0,0,0,0,0,0,0,0 //LG_CANNONSPEAR#Cannon Spear# -4102,2308,10,55,1,0,0,0,0,0,0,0,0 //LG_BANISHINGPOINT#Banishing Point# -4102,2309,3,0,0,0,0,0,0,0,0,0,0 //LG_TRAMPLE#Trample# -4102,2310,5,250,3,0,0,0,0,0,0,0,0 //LG_SHIELDPRESS#Shield Press# -4102,2311,5,252,5,0,0,0,0,0,0,0,0 //LG_REFLECTDAMAGE#Reflect Damage# -4102,2312,5,2308,5,0,0,0,0,0,0,0,0 //LG_PINPOINTATTACK#Pinpoint Attack# -4102,2313,5,0,0,0,0,0,0,0,0,0,0 //LG_FORCEOFVANGUARD#Force of Vanguard# -4102,2314,1,2313,1,0,0,0,0,0,0,0,0 //LG_RAGEBURST#Rage Burst# -4102,2315,3,2310,3,2323,2,0,0,0,0,0,0 //LG_SHIELDSPELL#Shield Spell# -4102,2316,5,2308,3,0,0,0,0,0,0,0,0 //LG_EXEEDBREAK#Exceed Break# -4102,2317,5,2312,1,2320,3,0,0,0,0,0,0 //LG_OVERBRAND#Over Brand# -4102,2318,5,2309,3,0,0,0,0,0,0,0,0 //LG_PRESTIGE#Prestige# -4102,2319,5,2312,3,2314,1,0,0,0,0,0,0 //LG_BANDING#Banding# -4102,2320,5,55,1,0,0,0,0,0,0,0,0 //LG_MOONSLASHER#Moon Slasher# -4102,2321,5,254,5,0,0,0,0,0,0,0,0 //LG_RAYOFGENESIS#Ray of Genesis# -4102,2322,5,248,3,0,0,0,0,0,0,0,0 //LG_PIETY#Piety# -4102,2323,5,2311,3,0,0,0,0,0,0,0,0 //LG_EARTHDRIVE#Earth Drive# -4102,2324,5,2318,3,2319,3,0,0,0,0,0,0 //LG_HESPERUSLIT#Hesperus Lit# -4102,2325,5,2315,3,2321,4,2322,5,0,0,0,0 //LG_INSPIRATION#Inspiration# -//Baby Sorcerer -4103,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4103,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4103,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery# -4103,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight# -4103,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat# -4103,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall# -4103,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike# -4103,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt# -4103,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver# -4103,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse# -4103,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball# -4103,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall# -4103,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt# -4103,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt# -4103,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm# -4103,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat# -4103,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4103,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4103,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense# -4103,90,5,283,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike# -4103,91,5,90,1,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive# -4103,274,10,0,0,0,0,0,0,0,0,0,0 //SA_ADVANCEDBOOK#Study# -4103,275,5,274,2,0,0,0,0,0,0,0,0 //SA_CASTCANCEL#Cast Cancel# -4103,276,5,274,4,0,0,0,0,0,0,0,0 //SA_MAGICROD#Magic Rod# -4103,277,5,276,1,0,0,0,0,0,0,0,0 //SA_SPELLBREAKER#Spell Break# -4103,278,10,275,1,0,0,0,0,0,0,0,0 //SA_FREECAST#Free Cast# -4103,279,10,278,4,0,0,0,0,0,0,0,0 //SA_AUTOSPELL#Hindsight# -4103,280,5,19,1,274,5,0,0,0,0,0,0 //SA_FLAMELAUNCHER#Endow Blaze# -4103,281,5,14,1,274,5,0,0,0,0,0,0 //SA_FROSTWEAPON#Endow Tsunami# -4103,282,5,20,1,274,5,0,0,0,0,0,0 //SA_LIGHTNINGLOADER#Endow Tornado# -4103,283,5,16,1,274,5,0,0,0,0,0,0 //SA_SEISMICWEAPON#Endow Quake# -4103,284,5,274,9,0,0,0,0,0,0,0,0 //SA_DRAGONOLOGY#Dragonology# -4103,285,5,280,2,0,0,0,0,0,0,0,0 //SA_VOLCANO#Volcano# -4103,286,5,281,2,0,0,0,0,0,0,0,0 //SA_DELUGE#Deluge# -4103,287,5,282,2,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#Whirlwind# -4103,288,5,285,3,286,3,287,3,0,0,0,0 //SA_LANDPROTECTOR#Magnetic Earth# -4103,289,5,277,3,0,0,0,0,0,0,0,0 //SA_DISPELL#Dispel# -4103,290,10,279,5,289,1,288,1,0,0,0,0 //SA_ABRACADABRA#Hocus-pocus# -4103,1007,1,0,0,0,0,0,0,0,0,0,0 //SA_CREATECON#Create Converter# -4103,1008,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWATER#Elemental Change Water# -4103,1017,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTGROUND#Elemental Change Earth# -4103,1018,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTFIRE#Elemental Change Fire# -4103,1019,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWIND#Elemental Change Wind# -4103,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4103,2443,5,285,1,0,0,0,0,0,0,0,0 //SO_FIREWALK#Fire Walk# -4103,2444,5,287,1,0,0,0,0,0,0,0,0 //SO_ELECTRICWALK#Electric Walk# -4103,2445,5,279,4,0,0,0,0,0,0,0,0 //SO_SPELLFIST#Spell Fist# -4103,2446,5,90,5,0,0,0,0,0,0,0,0 //SO_EARTHGRAVE#Earth Grave# -4103,2447,5,286,3,0,0,0,0,0,0,0,0 //SO_DIAMONDDUST#Diamond Dust# -4103,2448,5,2450,2,0,0,0,0,0,0,0,0 //SO_POISON_BUSTER#Poison Buster# -4103,2449,5,289,2,0,0,0,0,0,0,0,0 //SO_PSYCHIC_WAVE#Psychic Wave# -4103,2450,5,91,5,0,0,0,0,0,0,0,0 //SO_CLOUD_KILL#Cloud Kill# -4103,2451,5,280,1,281,1,282,1,283,1,0,0 //SO_STRIKING#Striking# -4103,2452,5,285,1,287,1,0,0,0,0,0,0 //SO_WARMER#Warmer# -4103,2453,5,288,2,0,0,0,0,0,0,0,0 //SO_VACUUM_EXTREME#Vacuum Extreme# -4103,2454,5,283,1,287,4,0,0,0,0,0,0 //SO_VARETYR_SPEAR#Varetyr Spear# -4103,2455,5,2452,2,0,0,0,0,0,0,0,0 //SO_ARRULLO#Arrullo# -4103,2456,4,2462,1,0,0,0,0,0,0,0,0 //SO_EL_CONTROL#Spirit Control# -4103,2457,3,2452,3,2456,1,0,0,0,0,0,0 //SO_SUMMON_AGNI#Summon Fire Spirit Agni# -4103,2458,3,2447,3,2456,1,0,0,0,0,0,0 //SO_SUMMON_AQUA#Summon Water Spirit Aqua# -4103,2459,3,2454,3,2456,1,0,0,0,0,0,0 //SO_SUMMON_VENTUS#Summon Wind Spirit Ventus# -4103,2460,3,2446,3,2456,1,0,0,0,0,0,0 //SO_SUMMON_TERA#Summon Wind Spirit Tera# -4103,2461,1,2456,3,0,0,0,0,0,0,0,0 //SO_EL_ACTION#Elemental Action# -4103,2462,2,280,1,281,1,282,1,283,1,0,0 //SO_EL_ANALYSIS#Four Spirit Analysis# -4103,2463,5,2456,3,0,0,0,0,0,0,0,0 //SO_EL_SYMPATHY#Spirit Sympathy# -4103,2464,1,2463,1,0,0,0,0,0,0,0,0 //SO_EL_CURE#Spirit Recovery# -4103,2465,3,2457,3,0,0,0,0,0,0,0,0 //SO_FIRE_INSIGNIA#Fire Insignia# -4103,2466,3,2458,3,0,0,0,0,0,0,0,0 //SO_WATER_INSIGNIA#Water Insignia# -4103,2467,3,2459,3,0,0,0,0,0,0,0,0 //SO_WIND_INSIGNIA#Wind Insignia# -4103,2468,3,2460,3,0,0,0,0,0,0,0,0 //SO_EARTH_INSIGNIA#Earth Insignia# -//Baby Minstrel -4104,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4104,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4104,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# -4104,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye# -4104,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration# -4104,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe# -4104,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower# -4104,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting# -4104,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel# -4104,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4104,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4104,315,10,0,0,0,0,0,0,0,0,0,0 //BA_MUSICALLESSON#Music Lesson# -4104,316,5,315,3,0,0,0,0,0,0,0,0 //BA_MUSICALSTRIKE#Melody Strike# -4104,317,5,315,1,304,1,0,0,0,0,0,0 //BA_DISSONANCE#Unchained Serenade# -4104,318,5,305,1,0,0,0,0,0,0,0,0 //BA_FROSTJOKE#Unbarring Octave# -4104,319,10,317,3,0,0,0,0,0,0,0,0 //BA_WHISTLE#Perfect Tablature# -4104,320,10,317,3,0,0,0,0,0,0,0,0 //BA_ASSASSINCROSS#Impressive Riff# -4104,321,10,317,3,0,0,0,0,0,0,0,0 //BA_POEMBRAGI#Magic Strings# -4104,322,10,317,3,0,0,0,0,0,0,0,0 //BA_APPLEIDUN#Song of Lutie# -4104,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp# -4104,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore# -4104,306,1,319,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby# -4104,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing# -4104,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo# -4104,309,5,322,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme# -4104,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick# -4104,311,1,320,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck# -4104,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord# -4104,313,5,321,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm# -4104,1010,1,0,0,0,0,0,0,0,0,0,0 //BA_PANGVOICE#Pang Voice# -4104,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4104,2381,5,2422,1,0,0,0,0,0,0,0,0 //MI_RUSH_WINDMILL#Windmill Rush Attack# -4104,2382,5,2422,1,0,0,0,0,0,0,0,0 //MI_ECHOSONG#Echo Song# -4104,2383,5,2422,1,0,0,0,0,0,0,0,0 //MI_HARMONIZE#Harmonize# -4104,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4104,2413,5,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# -4104,2414,5,317,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4104,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# -4104,2418,5,316,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# -4104,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# -4104,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# -4104,2421,5,2423,3,0,0,0,0,0,0,0,0 //WM_DEADHILLHERE#Valley Of Death# -4104,2422,5,2412,1,0,0,0,0,0,0,0,0 //WM_LULLABY_DEEPSLEEP#Deep Sleep Lullaby# -4104,2423,5,2412,1,0,0,0,0,0,0,0,0 //WM_SIRCLEOFNATURE#Circle Of Nature's Sound# -4104,2424,5,2419,1,0,0,0,0,0,0,0,0 //WM_RANDOMIZESPELL#Improvised Song# -4104,2425,5,2424,1,0,0,0,0,0,0,0,0 //WM_GLOOMYDAY#Gloomy Day# -4104,2426,5,2413,1,0,0,0,0,0,0,0,0 //WM_GREAT_ECHO#Great Echo# -4104,2427,5,2381,1,2382,1,2383,1,0,0,0,0 //WM_SONG_OF_MANA#Song Of Mana# -4104,2428,5,2381,1,2382,1,2383,1,0,0,0,0 //WM_DANCE_WITH_WUG#Dance With A Warg# -4104,2429,5,2430,3,2432,3,0,0,0,0,0,0 //WM_SOUND_OF_DESTRUCTION#Sound of Destruction# -4104,2430,5,2428,1,0,0,0,0,0,0,0,0 //WM_SATURDAY_NIGHT_FEVER#Saturday Night Fever# -4104,2431,5,2381,1,2382,1,2383,1,0,0,0,0 //WM_LERADS_DEW#Lerad's Dew# -4104,2432,5,2427,1,0,0,0,0,0,0,0,0 //WM_MELODYOFSINK#Melody Of Sink# -4104,2433,5,2431,1,0,0,0,0,0,0,0,0 //WM_BEYOND_OF_WARCRY#Warcry Of Beyond# -4104,2434,5,2429,1,2433,1,0,0,0,0,0,0 //WM_UNLIMITED_HUMMING_VOICE#Unlimited Humming Voice# -//Baby Wanderer -4105,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4105,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4105,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# -4105,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye# -4105,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration# -4105,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe# -4105,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower# -4105,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting# -4105,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel# -4105,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4105,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4105,323,10,0,0,0,0,0,0,0,0,0,0 //DC_DANCINGLESSON#Dance Lessons# -4105,324,5,323,3,0,0,0,0,0,0,0,0 //DC_THROWARROW#Slinging Arrow# -4105,325,5,323,1,304,1,0,0,0,0,0,0 //DC_UGLYDANCE#Hip Shaker# -4105,326,5,305,1,0,0,0,0,0,0,0,0 //DC_SCREAM#Dazzler# -4105,327,10,325,3,0,0,0,0,0,0,0,0 //DC_HUMMING#Focus Ballet# -4105,328,10,325,3,0,0,0,0,0,0,0,0 //DC_DONTFORGETME#Slow Grace# -4105,329,10,325,3,0,0,0,0,0,0,0,0 //DC_FORTUNEKISS#Lady Luck# -4105,330,10,325,3,0,0,0,0,0,0,0,0 //DC_SERVICEFORYOU#Gypsy's Kiss# -4105,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp# -4105,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore# -4105,306,1,327,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby# -4105,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing# -4105,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo# -4105,309,5,330,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme# -4105,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick# -4105,311,1,328,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck# -4105,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord# -4105,313,5,329,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm# -4105,1011,1,0,0,0,0,0,0,0,0,0,0 //DC_WINKCHARM#Wink of Charm# -4105,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4105,2350,5,2422,1,0,0,0,0,0,0,0,0 //WA_SWING_DANCE#Swing Dance# -4105,2351,5,2422,1,0,0,0,0,0,0,0,0 //WA_SYMPHONY_OF_LOVER#Symphony of Lovers# -4105,2352,5,2422,1,0,0,0,0,0,0,0,0 //WA_MOONLIT_SERENADE#Moonlit Serenade# -4105,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4105,2413,5,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# -4105,2414,5,325,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4105,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# -4105,2418,5,324,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# -4105,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# -4105,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# -4105,2421,5,2423,3,0,0,0,0,0,0,0,0 //WM_DEADHILLHERE#Valley Of Death# -4105,2422,5,2412,1,0,0,0,0,0,0,0,0 //WM_LULLABY_DEEPSLEEP#Deep Sleep Lullaby# -4105,2423,5,2412,1,0,0,0,0,0,0,0,0 //WM_SIRCLEOFNATURE#Circle Of Nature's Sound# -4105,2424,5,2419,1,0,0,0,0,0,0,0,0 //WM_RANDOMIZESPELL#Improvised Song# -4105,2425,5,2424,1,0,0,0,0,0,0,0,0 //WM_GLOOMYDAY#Gloomy Day# -4105,2426,5,2413,1,0,0,0,0,0,0,0,0 //WM_GREAT_ECHO#Great Echo# -4105,2427,5,2350,1,2351,1,2352,1,0,0,0,0 //WM_SONG_OF_MANA#Song Of Mana# -4105,2428,5,2350,1,2351,1,2352,1,0,0,0,0 //WM_DANCE_WITH_WUG#Dance With A Warg# -4105,2429,5,2430,3,2432,3,0,0,0,0,0,0 //WM_SOUND_OF_DESTRUCTION#Sound of Destruction# -4105,2430,5,2428,1,0,0,0,0,0,0,0,0 //WM_SATURDAY_NIGHT_FEVER#Saturday Night Fever# -4105,2431,5,2350,1,2351,1,2352,1,0,0,0,0 //WM_LERADS_DEW#Lerad's Dew# -4105,2432,5,2427,1,0,0,0,0,0,0,0,0 //WM_MELODYOFSINK#Melody Of Sink# -4105,2433,5,2431,1,0,0,0,0,0,0,0,0 //WM_BEYOND_OF_WARCRY#Warcry Of Beyond# -4105,2434,5,2429,1,2433,1,0,0,0,0,0,0 //WM_UNLIMITED_HUMMING_VOICE#Unlimited Humming Voice# -//Baby Sura -4106,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4106,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4106,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection# -4106,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane# -4106,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach# -4106,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma# -4106,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport# -4106,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal# -4106,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal# -4106,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI# -4106,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI# -4106,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta# -4106,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis# -4106,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus# -4106,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing# -4106,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure# -4106,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light# -4106,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4106,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4106,259,10,23,10,22,10,0,0,0,0,0,0 //MO_IRONHAND#Iron Fists# -4106,260,5,269,2,0,0,0,0,0,0,0,0 //MO_SPIRITSRECOVERY#Spiritual Cadence# -4106,261,5,259,2,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#Summon Spirit Sphere# -4106,262,1,261,5,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere# -4106,263,10,265,5,0,0,0,0,0,0,0,0 //MO_TRIPLEATTACK#Raging Triple Blow# -4106,264,1,271,3,260,2,268,3,0,0,0,0 //MO_BODYRELOCATION#Snap# -4106,265,10,259,5,261,5,0,0,0,0,0,0 //MO_DODGE#Dodge# -4106,266,5,261,5,0,0,0,0,0,0,0,0 //MO_INVESTIGATE#Occult Impact# -4106,267,5,266,3,0,0,0,0,0,0,0,0 //MO_FINGEROFFENSIVE#Throw Spirit Sphere# -4106,268,5,273,3,0,0,0,0,0,0,0,0 //MO_STEELBODY#Mental Strength# -4106,269,5,265,5,0,0,0,0,0,0,0,0 //MO_BLADESTOP#Root# -4106,270,5,262,1,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#Fury# -4106,271,5,270,3,267,3,0,0,0,0,0,0 //MO_EXTREMITYFIST#Asura Strike# -4106,272,5,263,5,0,0,0,0,0,0,0,0 //MO_CHAINCOMBO#Raging Quadruple Blow# -4106,273,5,272,3,0,0,0,0,0,0,0,0 //MO_COMBOFINISH#Raging Thrust# -4106,1015,1,0,0,0,0,0,0,0,0,0,0 //MO_KITRANSLATION#Ki Translation# -4106,1016,1,0,0,0,0,0,0,0,0,0,0 //MO_BALKYOUNG#Ki Explosion# -4106,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4106,2326,10,263,5,0,0,0,0,0,0,0,0 //SR_DRAGONCOMBO#Dragon Combo# -4106,2327,5,2326,3,0,0,0,0,0,0,0,0 //SR_SKYNETBLOW#Sky Net Blow# -4106,2328,5,2326,1,2334,1,0,0,0,0,0,0 //SR_EARTHSHAKER#Earth Shaker# -4106,2329,5,2326,1,0,0,0,0,0,0,0,0 //SR_FALLENEMPIRE#Fallen Empire# -4106,2330,10,2329,3,0,0,0,0,0,0,0,0 //SR_TIGERCANNON#Tiger Cannon# -4106,2332,5,2328,2,0,0,0,0,0,0,0,0 //SR_RAMPAGEBLASTER#Rampage Blaster# -4106,2333,5,2327,1,0,0,0,0,0,0,0,0 //SR_CRESCENTELBOW#Crescent Elbow# -4106,2334,5,269,2,2344,2,0,0,0,0,0,0 //SR_CURSEDCIRCLE#Cursed Circle# -4106,2335,5,2337,1,0,0,0,0,0,0,0,0 //SR_LIGHTNINGWALK#Lightning Walk# -4106,2336,5,2332,3,2335,3,0,0,0,0,0,0 //SR_KNUCKLEARROW#Knuckle Arrow# -4106,2337,1,2334,1,0,0,0,0,0,0,0,0 //SR_WINDMILL#Windmill# -4106,2338,10,2332,3,2346,3,0,0,0,0,0,0 //SR_RAISINGDRAGON#Raising Dragon# -4106,2340,1,262,1,2341,1,0,0,0,0,0,0 //SR_ASSIMILATEPOWER#Assimilate Power# -4106,2341,1,261,5,0,0,0,0,0,0,0,0 //SR_POWERVELOCITY#Power Velocity# -4106,2343,10,2330,5,2338,5,0,0,0,0,0,0 //SR_GATEOFHELL#Gate Of Hell# -4106,2344,5,2341,1,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_QUIET#Gentle Touch - Quiet# -4106,2345,5,2341,1,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_CURE#Gentle Touch - Cure# -4106,2346,5,2344,3,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_ENERGYGAIN#Gentle Touch - Energy Gain# -4106,2347,5,2345,4,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_CHANGE#Gentle Touch - Change# -4106,2348,5,2347,5,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_REVITALIZE#Gentle Touch - Revitalize# -4106,2517,5,2340,1,2518,3,0,0,0,0,0,0 //SR_HOWLINGOFLION#Howling Of Lion# -4106,2518,5,267,3,0,0,0,0,0,0,0,0 //SR_RIDEINLIGHTNING#Ride In Lightening# -//Baby Genetic -4107,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4107,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4107,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit# -4107,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount# -4107,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge# -4107,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart# -4107,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal# -4107,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending# -4107,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite# -4107,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution# -4107,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart# -4107,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar# -4107,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4107,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4107,226,10,0,0,0,0,0,0,0,0,0,0 //AM_AXEMASTERY#Axe Mastery# -4107,227,10,0,0,0,0,0,0,0,0,0,0 //AM_LEARNINGPOTION#Potion Research# -4107,228,10,227,5,0,0,0,0,0,0,0,0 //AM_PHARMACY#Prepare Potion# -4107,229,5,228,4,0,0,0,0,0,0,0,0 //AM_DEMONSTRATION#Bomb# -4107,230,5,228,5,0,0,0,0,0,0,0,0 //AM_ACIDTERROR#Acid Terror# -4107,231,5,228,3,0,0,0,0,0,0,0,0 //AM_POTIONPITCHER#Aid Potion# -4107,232,5,228,6,0,0,0,0,0,0,0,0 //AM_CANNIBALIZE#Summon Flora# -4107,233,5,228,2,0,0,0,0,0,0,0,0 //AM_SPHEREMINE#Summon Marine Sphere# -4107,234,5,236,3,0,0,0,0,0,0,0,0 //AM_CP_WEAPON#Alchemical Weapon# -4107,235,5,237,3,0,0,0,0,0,0,0,0 //AM_CP_SHIELD#Synthesized Shield# -4107,236,5,235,3,0,0,0,0,0,0,0,0 //AM_CP_ARMOR#Synthetic Armor# -4107,237,5,228,2,0,0,0,0,0,0,0,0 //AM_CP_HELM#Biochemical Helm# -4107,238,1,0,0,0,0,0,0,0,0,0,0 //AM_BIOETHICS#Basis of Life# -4107,243,1,244,1,0,0,0,0,0,0,0,0 //AM_CALLHOMUN#Call Homunculus# -4107,244,1,238,1,0,0,0,0,0,0,0,0 //AM_REST#Peaceful Rest# -4107,247,5,243,1,0,0,0,0,0,0,0,0 //AM_RESURRECTHOMUN#Ressurect Homunculus# -4107,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher# -4107,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1# -4107,497,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT2#Twilight Alchemy 2# -4107,498,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT3#Twilight Alchemy 3# -4107,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4107,2474,5,0,0,0,0,0,0,0,0,0,0 //GN_TRAINING_SWORD#Sword Training# -4107,2475,5,0,0,0,0,0,0,0,0,0,0 //GN_REMODELING_CART#Cart Remodeling# -4107,2476,5,2475,1,0,0,0,0,0,0,0,0 //GN_CART_TORNADO#Cart Tornado# -4107,2477,5,2475,2,0,0,0,0,0,0,0,0 //GN_CARTCANNON#Cart Cannon# -4107,2478,5,2475,3,0,0,0,0,0,0,0,0 //GN_CARTBOOST#Cart Boost# -4107,2479,5,2497,2,0,0,0,0,0,0,0,0 //GN_THORNS_TRAP#Thorn Trap# -4107,2480,5,2497,3,0,0,0,0,0,0,0,0 //GN_BLOOD_SUCKER#Blood Sucker# -4107,2481,5,2497,4,0,0,0,0,0,0,0,0 //GN_SPORE_EXPLOSION#Spore Explosion# -4107,2482,5,2479,3,0,0,0,0,0,0,0,0 //GN_WALLOFTHORN#Wall of Thorns# -4107,2483,10,2482,3,0,0,0,0,0,0,0,0 //GN_CRAZYWEED#Crazy Weed# -4107,2485,5,2481,3,0,0,0,0,0,0,0,0 //GN_DEMONIC_FIRE#Demonic Fire# -4107,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# -4107,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# -4107,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# -4107,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item# -4107,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# -4107,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# -4107,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb# -4107,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# -4107,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store# -//Baby Shadow Chaser -4108,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4108,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4108,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack# -4108,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge# -4108,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal# -4108,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding# -4108,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom# -4108,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify# -4108,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand# -4108,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding# -4108,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone# -4108,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling# -4108,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4108,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4108,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# -4108,44,10,0,0,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye# -4108,46,10,44,10,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe# -4108,124,1,46,5,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap# -4108,210,10,50,1,0,0,0,0,0,0,0,0 //RG_SNATCHER#Gank# -4108,211,10,210,4,0,0,0,0,0,0,0,0 //RG_STEALCOIN#Mug# -4108,212,10,211,4,0,0,0,0,0,0,0,0 //RG_BACKSTAP#Back Stab# -4108,213,5,51,1,0,0,0,0,0,0,0,0 //RG_TUNNELDRIVE#Stalk# -4108,214,5,212,2,213,2,0,0,0,0,0,0 //RG_RAID#Sightless Raid# -4108,215,5,217,5,0,0,0,0,0,0,0,0 //RG_STRIPWEAPON#Divest Weapon# -4108,216,5,218,5,0,0,0,0,0,0,0,0 //RG_STRIPSHIELD#Divest Shield# -4108,217,5,216,5,0,0,0,0,0,0,0,0 //RG_STRIPARMOR#Divest Armor# -4108,218,5,211,2,0,0,0,0,0,0,0,0 //RG_STRIPHELM#Divest Helm# -4108,219,5,212,4,214,5,0,0,0,0,0,0 //RG_INTIMIDATE#Snatch# -4108,220,1,221,5,0,0,0,0,0,0,0,0 //RG_GRAFFITI#Scribble# -4108,221,5,222,1,0,0,0,0,0,0,0,0 //RG_FLAGGRAFFITI#Piece# -4108,222,1,223,1,0,0,0,0,0,0,0,0 //RG_CLEANER#Remover# -4108,223,1,216,3,0,0,0,0,0,0,0,0 //RG_GANGSTER#Slyness# -4108,224,5,223,1,0,0,0,0,0,0,0,0 //RG_COMPULSION#Haggle# -4108,225,10,219,5,0,0,0,0,0,0,0,0 //RG_PLAGIARISM#Intimidate# -4108,1005,1,0,0,0,0,0,0,0,0,0,0 //RG_CLOSECONFINE#Close Confine# -4108,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4108,2284,5,219,5,0,0,0,0,0,0,0,0 //SC_FATALMMENACE#Fatal Menace# -4108,2285,10,225,5,0,0,0,0,0,0,0,0 //SC_REPRODUCE#Reproduce# -4108,2286,10,2285,5,0,0,0,0,0,0,0,0 //SC_AUTOSHADOWSPELL#Auto Shadow Spell# -4108,2287,5,213,3,0,0,0,0,0,0,0,0 //SC_SHADOWFORM#Shadow Form# -4108,2288,10,46,7,0,0,0,0,0,0,0,0 //SC_TRIANGLESHOT#Triangle Shot# -4108,2289,5,0,0,0,0,0,0,0,0,0,0 //SC_BODYPAINT#Body Painting# -4108,2290,5,2286,7,2291,5,2296,3,0,0,0,0 //SC_INVISIBILITY#Invisibility# -4108,2291,5,2286,5,2287,3,0,0,0,0,0,0 //SC_DEADLYINFECT#Deadly Infect# -4108,2292,3,2289,1,0,0,0,0,0,0,0,0 //SC_ENERVATION#Masquerade - Enervation# -4108,2293,3,2289,1,0,0,0,0,0,0,0,0 //SC_GROOMY#Masquerade - Gloomy# -4108,2294,3,2289,1,0,0,0,0,0,0,0,0 //SC_IGNORANCE#Masquerade - Ignorance# -4108,2295,3,2292,1,2293,1,2294,1,0,0,0,0 //SC_LAZINESS#Masquerade - Laziness# -4108,2296,3,2295,1,2297,1,0,0,0,0,0,0 //SC_UNLUCKY#Masquerade - Unlucky# -4108,2297,3,2292,1,2293,1,2294,1,0,0,0,0 //SC_WEAKNESS#Masquerade - Weakness# -4108,2298,5,215,1,0,0,0,0,0,0,0,0 //SC_STRIPACCESSARY#Strip Accessory# -4108,2299,3,221,1,0,0,0,0,0,0,0,0 //SC_MANHOLE#Man Hole# -4108,2300,3,2299,1,0,0,0,0,0,0,0,0 //SC_DIMENSIONDOOR#Dimension Door# -4108,2301,3,2299,1,0,0,0,0,0,0,0,0 //SC_CHAOSPANIC#Chaos Panic# -4108,2302,3,2296,3,2301,3,0,0,0,0,0,0 //SC_MAELSTROM#Maelstrom# -4108,2303,3,2300,3,0,0,0,0,0,0,0,0 //SC_BLOODYLUST#Bloody Lust# -4108,2304,3,2300,3,0,0,0,0,0,0,0,0 //SC_FEINTBOMB#Feint Bomb# -//Baby Rune Knight (Dragon) -4109,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4109,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4109,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# -4109,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery# -4109,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery# -4109,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash# -4109,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke# -4109,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break# -4109,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure# -4109,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery# -4109,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point# -4109,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk# -4109,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4109,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4109,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery# -4109,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce# -4109,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear# -4109,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab# -4109,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang# -4109,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken# -4109,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack# -4109,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash# -4109,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding# -4109,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery# -4109,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack# -4109,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken# -4109,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4109,2001,5,2010,2,0,0,0,0,0,0,0,0 //RK_ENCHANTBLADE#Enchant Blade# -4109,2002,5,2001,3,0,0,0,0,0,0,0,0 //RK_SONICWAVE#Sonic Wave# -4109,2003,10,61,1,2001,2,0,0,0,0,0,0 //RK_DEATHBOUND#Death Bound# -4109,2004,10,2020,3,0,0,0,0,0,0,0,0 //RK_HUNDREDSPEAR#Hundred Spear# -4109,2005,5,2001,5,0,0,0,0,0,0,0,0 //RK_WINDCUTTER#Wind Cutter# -4109,2006,5,2002,2,2003,5,2005,3,0,0,0,0 //RK_IGNITIONBREAK#Ignition Break# -4109,2007,5,64,1,0,0,0,0,0,0,0,0 //RK_DRAGONTRAINING#Dragon Training# -4109,2008,10,2007,2,0,0,0,0,0,0,0,0 //RK_DRAGONBREATH#Dragon Breath# -4109,2009,5,2007,2,0,0,0,0,0,0,0,0 //RK_DRAGONHOWLING#Dragon Howling# -4109,2010,10,0,0,0,0,0,0,0,0,0,0 //RK_RUNEMASTERY#Rune Mastery# -4109,2020,5,57,2,0,0,0,0,0,0,0,0 //RK_PHANTOMTHRUST#Phantom Thrust# -//Baby Royal Guard (Gryphon) -4110,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4110,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4110,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# -4110,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery# -4110,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery# -4110,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash# -4110,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke# -4110,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break# -4110,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure# -4110,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery# -4110,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point# -4110,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk# -4110,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4110,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4110,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding# -4110,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery# -4110,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery# -4110,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure# -4110,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection# -4110,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane# -4110,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal# -4110,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith# -4110,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard# -4110,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite# -4110,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang# -4110,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect# -4110,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross# -4110,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross# -4110,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice# -4110,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls# -4110,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura# -4110,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken# -4110,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink# -4110,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4110,2307,5,2312,1,0,0,0,0,0,0,0,0 //LG_CANNONSPEAR#Cannon Spear# -4110,2308,10,55,1,0,0,0,0,0,0,0,0 //LG_BANISHINGPOINT#Banishing Point# -4110,2309,3,0,0,0,0,0,0,0,0,0,0 //LG_TRAMPLE#Trample# -4110,2310,5,250,3,0,0,0,0,0,0,0,0 //LG_SHIELDPRESS#Shield Press# -4110,2311,5,252,5,0,0,0,0,0,0,0,0 //LG_REFLECTDAMAGE#Reflect Damage# -4110,2312,5,2308,5,0,0,0,0,0,0,0,0 //LG_PINPOINTATTACK#Pinpoint Attack# -4110,2313,5,0,0,0,0,0,0,0,0,0,0 //LG_FORCEOFVANGUARD#Force of Vanguard# -4110,2314,1,2313,1,0,0,0,0,0,0,0,0 //LG_RAGEBURST#Rage Burst# -4110,2315,3,2310,3,2323,2,0,0,0,0,0,0 //LG_SHIELDSPELL#Shield Spell# -4110,2316,5,2308,3,0,0,0,0,0,0,0,0 //LG_EXEEDBREAK#Exceed Break# -4110,2317,5,2312,1,2320,3,0,0,0,0,0,0 //LG_OVERBRAND#Over Brand# -4110,2318,5,2309,3,0,0,0,0,0,0,0,0 //LG_PRESTIGE#Prestige# -4110,2319,5,2312,3,2314,1,0,0,0,0,0,0 //LG_BANDING#Banding# -4110,2320,5,55,1,0,0,0,0,0,0,0,0 //LG_MOONSLASHER#Moon Slasher# -4110,2321,5,254,5,0,0,0,0,0,0,0,0 //LG_RAYOFGENESIS#Ray of Genesis# -4110,2322,5,248,3,0,0,0,0,0,0,0,0 //LG_PIETY#Piety# -4110,2323,5,2311,3,0,0,0,0,0,0,0,0 //LG_EARTHDRIVE#Earth Drive# -4110,2324,5,2318,3,2319,3,0,0,0,0,0,0 //LG_HESPERUSLIT#Hesperus Lit# -4110,2325,5,2315,3,2321,4,2322,5,0,0,0,0 //LG_INSPIRATION#Inspiration# -//Baby Ranger (Waug) -4111,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4111,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4111,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# -4111,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye# -4111,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration# -4111,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe# -4111,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower# -4111,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting# -4111,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel# -4111,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4111,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4111,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap# -4111,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine# -4111,117,5,115,1,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#Ankle Snare# -4111,118,5,117,1,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#Shockwave Trap# -4111,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman# -4111,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher# -4111,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap# -4111,122,5,116,1,119,1,121,1,0,0,0,0 //HT_BLASTMINE#Blast Mine# -4111,123,5,118,1,122,1,0,0,0,0,0,0 //HT_CLAYMORETRAP#Claymore Trap# -4111,124,1,116,1,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap# -4111,125,1,118,1,124,1,0,0,0,0,0,0 //HT_TALKIEBOX#Talkie Box# -4111,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane# -4111,127,1,126,1,0,0,0,0,0,0,0,0 //HT_FALCON#Falconry Mastery# -4111,128,10,129,5,0,0,0,0,0,0,0,0 //HT_STEELCROW#Steel Crow# -4111,129,5,127,1,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#Blitz Beat# -4111,130,4,45,1,127,1,0,0,0,0,0,0 //HT_DETECTING#Detect# -4111,131,5,124,1,127,1,0,0,0,0,0,0 //HT_SPRINGTRAP#Spring Trap# -4111,1009,1,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#Phantasmic Arrow# -4111,499,1,46,10,0,0,0,0,0,0,0,0 //HT_POWER#Beast Strafing# -4111,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4111,2233,10,2236,5,0,0,0,0,0,0,0,0 //RA_ARROWSTORM#Arrow Storm# -4111,2234,5,2233,5,2247,1,0,0,0,0,0,0 //RA_FEARBREEZE#Fear Breeze# -4111,2235,10,0,0,0,0,0,0,0,0,0,0 //RA_RANGERMAIN#Ranger Main# -4111,2236,10,117,5,0,0,0,0,0,0,0,0 //RA_AIMEDBOLT#Aimed Bolt# -4111,2237,1,2239,3,0,0,0,0,0,0,0,0 //RA_DETONATOR#Detonator# -4111,2238,5,118,5,0,0,0,0,0,0,0,0 //RA_ELECTRICSHOCKER#Electric Shocker# -4111,2239,5,2248,3,0,0,0,0,0,0,0,0 //RA_CLUSTERBOMB#Cluster Bomb# -4111,2240,1,0,0,0,0,0,0,0,0,0,0 //RA_WUGMASTERY#Warg Mastery# -4111,2241,3,2240,1,0,0,0,0,0,0,0,0 //RA_WUGRIDER#Warg Rider# -4111,2242,1,2241,1,0,0,0,0,0,0,0,0 //RA_WUGDASH#Warg Dash# -4111,2243,5,2245,1,0,0,0,0,0,0,0,0 //RA_WUGSTRIKE#Warg Strike# -4111,2244,5,2240,1,0,0,0,0,0,0,0,0 //RA_WUGBITE#Warg Bite# -4111,2245,10,2240,1,0,0,0,0,0,0,0,0 //RA_TOOTHOFWUG#Tooth Of Warg# -4111,2246,5,2245,3,0,0,0,0,0,0,0,0 //RA_SENSITIVEKEEN#Sensitive Keen# -4111,2247,5,2235,1,0,0,0,0,0,0,0,0 //RA_CAMOUFLAGE#Camouflage# -4111,2248,5,123,1,124,1,0,0,0,0,0,0 //RA_RESEARCHTRAP#Research Trap# -4111,2249,1,2248,1,0,0,0,0,0,0,0,0 //RA_MAGENTATRAP#Magenta Trap# -4111,2250,1,2248,1,0,0,0,0,0,0,0,0 //RA_COBALTTRAP#Cobalt Trap# -4111,2251,1,2248,1,0,0,0,0,0,0,0,0 //RA_MAIZETRAP#Maize Trap# -4111,2252,1,2248,1,0,0,0,0,0,0,0,0 //RA_VERDURETRAP#Verdure Trap# -4111,2253,5,2237,1,0,0,0,0,0,0,0,0 //RA_FIRINGTRAP#Firing Trap# -4111,2254,5,2237,1,0,0,0,0,0,0,0,0 //RA_ICEBOUNDTRAP#Icebound Trap# -//Baby Mechanic (Mado) -4112,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4112,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4112,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit# -4112,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount# -4112,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge# -4112,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart# -4112,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal# -4112,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending# -4112,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite# -4112,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution# -4112,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart# -4112,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar# -4112,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4112,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4112,94,5,0,0,0,0,0,0,0,0,0,0 //BS_IRON#Iron Tempering# -4112,95,5,94,1,0,0,0,0,0,0,0,0 //BS_STEEL#Steel Tempering# -4112,96,5,94,1,0,0,0,0,0,0,0,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft# -4112,97,5,96,1,0,0,0,0,0,0,0,0 //BS_ORIDEOCON#Oridecon Research# -4112,98,3,0,0,0,0,0,0,0,0,0,0 //BS_DAGGER#Smith Dagger# -4112,99,3,98,1,0,0,0,0,0,0,0,0 //BS_SWORD#Smith Sword# -4112,100,3,99,1,0,0,0,0,0,0,0,0 //BS_TWOHANDSWORD#Smith Two-handed Sword# -4112,101,3,99,2,0,0,0,0,0,0,0,0 //BS_AXE#Smith Axe# -4112,102,3,103,1,0,0,0,0,0,0,0,0 //BS_MACE#Smith Mace# -4112,103,3,98,1,0,0,0,0,0,0,0,0 //BS_KNUCKLE#Smith Knucklebrace# -4112,104,3,98,2,0,0,0,0,0,0,0,0 //BS_SPEAR#Smith Spear# -4112,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding# -4112,106,1,95,1,105,1,0,0,0,0,0,0 //BS_FINDINGORE#Ore Discovery# -4112,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research# -4112,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair# -4112,109,5,0,0,0,0,0,0,0,0,0,0 //BS_SKINTEMPER#Skin Tempering# -4112,110,5,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#Hammer Fall# -4112,111,5,110,2,0,0,0,0,0,0,0,0 //BS_ADRENALINE#Adrenaline Rush# -4112,112,5,107,2,111,2,0,0,0,0,0,0 //BS_WEAPONPERFECT#Weapon Perfection# -4112,113,5,111,3,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#Power-Thrust# -4112,114,5,112,3,113,2,0,0,0,0,0,0 //BS_MAXIMIZE#Maximize Power# -4112,1012,1,0,0,0,0,0,0,0,0,0,0 //BS_UNFAIRLYTRICK#Unfair Trick# -4112,1013,1,0,0,0,0,0,0,0,0,0,0 //BS_GREED#Greed# -4112,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush# -4112,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4112,2255,5,0,0,0,0,0,0,0,0,0,0 //NC_MADOLICENCE#Mado License# -4112,2256,5,2255,1,0,0,0,0,0,0,0,0 //NC_BOOSTKNUCKLE#Boost Knuckle# -4112,2257,3,2256,2,0,0,0,0,0,0,0,0 //NC_PILEBUNKER#Pile Bunker# -4112,2258,3,2256,2,0,0,0,0,0,0,0,0 //NC_VULCANARM#Vulcan Arm# -4112,2259,3,2258,3,0,0,0,0,0,0,0,0 //NC_FLAMELAUNCHER#Flame Launcher# -4112,2260,3,2258,3,0,0,0,0,0,0,0,0 //NC_COLDSLOWER#Cold Slower# -4112,2261,3,2259,2,2260,2,0,0,0,0,0,0 //NC_ARMSCANNON#Arm Cannon# -4112,2262,3,2255,1,0,0,0,0,0,0,0,0 //NC_ACCELERATION#Acceleration# -4112,2263,1,2262,1,0,0,0,0,0,0,0,0 //NC_HOVERING#Hovering# -4112,2264,1,2263,1,0,0,0,0,0,0,0,0 //NC_F_SIDESLIDE#Front-Side Slide# -4112,2265,1,2263,1,0,0,0,0,0,0,0,0 //NC_B_SIDESLIDE#Back-Side Slide# -4112,2266,4,2255,4,0,0,0,0,0,0,0,0 //NC_MAINFRAME#Mainframe Restructure# -4112,2267,3,2266,2,0,0,0,0,0,0,0,0 //NC_SELFDESTRUCTION#Self Destruction# -4112,2268,4,2266,2,0,0,0,0,0,0,0,0 //NC_SHAPESHIFT#Shape Shift# -4112,2269,1,2267,2,0,0,0,0,0,0,0,0 //NC_EMERGENCYCOOL#Emergency Cool# -4112,2270,1,2268,2,0,0,0,0,0,0,0,0 //NC_INFRAREDSCAN#Infrared Scan# -4112,2271,3,2270,1,0,0,0,0,0,0,0,0 //NC_ANALYZE#Analyze# -4112,2272,3,2269,1,0,0,0,0,0,0,0,0 //NC_MAGNETICFIELD#Magnetic Field# -4112,2273,3,2272,2,0,0,0,0,0,0,0,0 //NC_NEUTRALBARRIER#Neutral Barrier# -4112,2274,3,2271,3,2273,2,0,0,0,0,0,0 //NC_STEALTHFIELD#Stealth Field# -4112,2275,5,2255,1,0,0,0,0,0,0,0,0 //NC_REPAIR#Repair# -4112,2276,10,0,0,0,0,0,0,0,0,0,0 //NC_TRAININGAXE#Axe Training# -4112,2277,5,0,0,0,0,0,0,0,0,0,0 //NC_RESEARCHFE#Research Fire/Earth# -4112,2278,5,2276,1,0,0,0,0,0,0,0,0 //NC_AXEBOOMERANG#Axe Boomerang# -4112,2279,5,2278,3,0,0,0,0,0,0,0,0 //NC_POWERSWING#Power Swing# -4112,2280,5,2276,1,0,0,0,0,0,0,0,0 //NC_AXETORNADO#Axe Tornado# -4112,2281,5,2277,2,0,0,0,0,0,0,0,0 //NC_SILVERSNIPER#FAW - Silver Sniper# -4112,2282,5,2277,2,0,0,0,0,0,0,0,0 //NC_MAGICDECOY#FAW - Magic Decoy# -4112,2283,1,2281,1,0,0,0,0,0,0,0,0 //NC_DISJOINT#FAW Removal# -4112,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store# -//Super Novice (Expanded) -4190,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4190,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4190,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# -4190,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery# -4190,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash# -4190,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke# -4190,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break# -4190,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure# -4190,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery# -4190,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight# -4190,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat# -4190,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall# -4190,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike# -4190,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt# -4190,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver# -4190,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse# -4190,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball# -4190,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall# -4190,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt# -4190,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt# -4190,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm# -4190,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection# -4190,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane# -4190,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach# -4190,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma# -4190,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport# -4190,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal# -4190,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal# -4190,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI# -4190,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI# -4190,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta# -4190,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis# -4190,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus# -4190,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing# -4190,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure# -4190,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit# -4190,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount# -4190,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge# -4190,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart# -4190,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal# -4190,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending# -4190,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite# -4190,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# -4190,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye# -4190,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration# -4190,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack# -4190,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge# -4190,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal# -4190,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding# -4190,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom# -4190,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify# -4190,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4190,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4190,66,5,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#Impositio Manus# -4190,70,10,28,1,0,0,0,0,0,0,0,0 //PR_SANCTUARY#Sanctuary# -4190,72,1,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#Status Recovery# -4190,75,5,70,7,0,0,0,0,0,0,0,0 //PR_GLORIA#Gloria# -4190,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar# -4190,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher# -4190,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder# -4190,86,5,14,1,20,1,0,0,0,0,0,0 //WZ_WATERBALL#Water Ball# -4190,87,10,16,1,15,1,0,0,0,0,0,0 //WZ_ICEWALL#Ice Wall# -4190,88,10,87,1,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#Frost Nova# -4190,90,5,16,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike# -4190,91,5,90,3,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive# -4190,92,5,91,1,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#Quagmire# -4190,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense# -4190,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding# -4190,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research# -4190,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap# -4190,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman# -4190,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher# -4190,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap# -4190,138,10,52,1,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#Enchant Poison# -4190,213,5,51,1,0,0,0,0,0,0,0,0 //RG_TUNNELDRIVE#Stalk# -4190,226,10,0,0,0,0,0,0,0,0,0,0 //AM_AXEMASTERY#Axe Mastery# -4190,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith# -4190,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross# -4190,259,10,23,10,22,10,0,0,0,0,0,0 //MO_IRONHAND#Iron Fists# -4190,261,5,259,2,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#Summon Spirit Sphere# -4190,262,1,261,5,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere# -4190,365,1,9,1,0,0,0,0,0,0,0,0 //HW_MAGICCRASHER#Stave Crasher# -4190,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store# -//Super Baby (Expanded) -4191,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4191,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4191,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery# -4191,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery# -4191,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash# -4191,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke# -4191,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break# -4191,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure# -4191,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery# -4191,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight# -4191,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat# -4191,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall# -4191,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike# -4191,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt# -4191,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver# -4191,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse# -4191,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball# -4191,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall# -4191,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt# -4191,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt# -4191,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm# -4191,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection# -4191,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane# -4191,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach# -4191,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma# -4191,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport# -4191,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal# -4191,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal# -4191,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI# -4191,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI# -4191,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta# -4191,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis# -4191,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus# -4191,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing# -4191,35,1,0,0,0,0,0,0,0,0,0,0 //AL_CURE#Cure# -4191,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit# -4191,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount# -4191,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge# -4191,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart# -4191,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal# -4191,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending# -4191,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite# -4191,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye# -4191,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye# -4191,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration# -4191,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack# -4191,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge# -4191,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal# -4191,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding# -4191,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom# -4191,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify# -4191,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# -4191,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# -4191,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4191,66,5,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#Impositio Manus# -4191,70,10,28,1,0,0,0,0,0,0,0,0 //PR_SANCTUARY#Sanctuary# -4191,72,1,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#Status Recovery# -4191,75,5,70,7,0,0,0,0,0,0,0,0 //PR_GLORIA#Gloria# -4191,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar# -4191,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher# -4191,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder# -4191,86,5,14,1,20,1,0,0,0,0,0,0 //WZ_WATERBALL#Water Ball# -4191,87,10,16,1,15,1,0,0,0,0,0,0 //WZ_ICEWALL#Ice Wall# -4191,88,10,87,1,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#Frost Nova# -4191,90,5,16,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike# -4191,91,5,90,3,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive# -4191,92,5,91,1,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#Quagmire# -4191,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense# -4191,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding# -4191,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research# -4191,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap# -4191,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman# -4191,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher# -4191,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap# -4191,138,10,52,1,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#Enchant Poison# -4191,213,5,51,1,0,0,0,0,0,0,0,0 //RG_TUNNELDRIVE#Stalk# -4191,226,10,0,0,0,0,0,0,0,0,0,0 //AM_AXEMASTERY#Axe Mastery# -4191,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith# -4191,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross# -4191,259,10,23,10,22,10,0,0,0,0,0,0 //MO_IRONHAND#Iron Fists# -4191,261,5,259,2,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#Summon Spirit Sphere# -4191,262,1,261,5,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere# -4191,365,1,9,1,0,0,0,0,0,0,0,0 //HW_MAGICCRASHER#Stave Crasher# -4191,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store# -//Kagerou -4211,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4211,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4211,522,10,0,0,0,0,0,0,0,0,0,0 //NJ_TOBIDOUGU#NJ_TOBIDOUGU# -4211,523,10,522,1,0,0,0,0,0,0,0,0 //NJ_SYURIKEN#NJ_SYURIKEN# -4211,524,5,523,5,0,0,0,0,0,0,0,0 //NJ_KUNAI#NJ_KUNAI# -4211,525,5,522,5,524,5,0,0,0,0,0,0 //NJ_HUUMA#NJ_HUUMA# -4211,526,10,522,10,525,5,0,0,0,0,0,0 //NJ_ZENYNAGE#NJ_ZENYNAGE# -4211,527,5,0,0,0,0,0,0,0,0,0,0 //NJ_TATAMIGAESHI#NJ_TATAMIGAESHI# -4211,528,10,529,1,0,0,0,0,0,0,0,0 //NJ_KASUMIKIRI#NJ_KASUMIKIRI# -4211,529,5,527,1,0,0,0,0,0,0,0,0 //NJ_SHADOWJUMP#NJ_SHADOWJUMP# -4211,530,5,528,5,0,0,0,0,0,0,0,0 //NJ_KIRIKAGE#NJ_KIRIKAGE# -4211,531,5,529,5,0,0,0,0,0,0,0,0 //NJ_UTSUSEMI#NJ_UTSUSEMI# -4211,532,10,531,4,530,3,543,1,0,0,0,0 //NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU# -4211,533,10,0,0,0,0,0,0,0,0,0,0 //NJ_NINPOU#NJ_NINPOU# -4211,534,10,533,1,0,0,0,0,0,0,0,0 //NJ_KOUENKA#NJ_KOUENKA# -4211,535,10,534,5,0,0,0,0,0,0,0,0 //NJ_KAENSIN#NJ_KAENSIN# -4211,536,5,533,10,535,7,0,0,0,0,0,0 //NJ_BAKUENRYU#NJ_BAKUENRYU# -4211,537,10,533,1,0,0,0,0,0,0,0,0 //NJ_HYOUSENSOU#NJ_HYOUSENSOU# -4211,538,10,537,5,0,0,0,0,0,0,0,0 //NJ_SUITON#NJ_SUITON# -4211,539,5,533,10,538,7,0,0,0,0,0,0 //NJ_HYOUSYOURAKU#NJ_HYOUSYOURAKU# -4211,540,10,533,1,0,0,0,0,0,0,0,0 //NJ_HUUJIN#NJ_HUUJIN# -4211,541,5,540,5,0,0,0,0,0,0,0,0 //NJ_RAIGEKISAI#NJ_RAIGEKISAI# -4211,542,5,533,10,541,5,0,0,0,0,0,0 //NJ_KAMAITACHI#NJ_KAMAITACHI# -4211,543,5,533,5,0,0,0,0,0,0,0,0 //NJ_NEN#NJ_NEN# -4211,544,10,522,7,530,5,543,1,0,0,0,0 //NJ_ISSEN#NJ_ISSEN# -4211,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4211,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4211,3001,1,530,5,0,0,0,0,0,0,0,0 //KO_YAMIKUMO## -4211,3002,5,0,0,0,0,0,0,0,0,0,0 //KO_RIGHT## -4211,3003,5,0,0,0,0,0,0,0,0,0,0 //KO_LEFT## -4211,3004,5,3001,1,0,0,0,0,0,0,0,0 //KO_JYUMONJIKIRI## -4211,3005,5,3004,2,0,0,0,0,0,0,0,0 //KO_SETSUDAN## -4211,3006,5,524,5,0,0,0,0,0,0,0,0 //KO_BAKURETSU## -4211,3007,5,3006,1,0,0,0,0,0,0,0,0 //KO_HAPPOKUNAI## -4211,3008,10,3010,3,0,0,0,0,0,0,0,0 //KO_MUCHANAGE## -4211,3009,5,525,5,0,0,0,0,0,0,0,0 //KO_HUUMARANKA## -4211,3010,5,526,1,0,0,0,0,0,0,0,0 //KO_MAKIBISHI## -4211,3011,5,533,10,0,0,0,0,0,0,0,0 //KO_MEIKYOUSISUI## -4211,3012,5,531,1,0,0,0,0,0,0,0,0 //KO_ZANZOU## -4211,3013,5,3021,2,0,0,0,0,0,0,0,0 //KO_KYOUGAKU## -4211,3014,5,3013,3,0,0,0,0,0,0,0,0 //KO_JYUSATSU## -4211,3015,1,0,0,0,0,0,0,0,0,0,0 //KO_KAHU_ENTEN## -4211,3016,1,0,0,0,0,0,0,0,0,0,0 //KO_HYOUHU_HUBUKI## -4211,3017,1,0,0,0,0,0,0,0,0,0,0 //KO_KAZEHU_SEIRAN## -4211,3018,1,0,0,0,0,0,0,0,0,0,0 //KO_DOHU_KOUKAI## -4211,3019,1,3015,1,3016,1,3017,1,3018,1,0,0 //KO_KAIHOU## -4211,3020,1,3019,1,3022,1,0,0,0,0,0,0 //KO_ZENKAI## -4211,3021,5,531,1,0,0,0,0,0,0,0,0 //KO_GENWAKU## -4211,3022,5,533,5,0,0,0,0,0,0,0,0 //KO_IZAYOI## -4211,3023,5,3012,1,0,0,0,0,0,0,0,0 //KG_KAGEHUMI## -4211,3024,5,3023,2,0,0,0,0,0,0,0,0 //KG_KYOMU## -4211,3025,5,3024,3,0,0,0,0,0,0,0,0 //KG_KAGEMUSYA## -//Oboro -4212,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# -4212,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# -4212,522,10,0,0,0,0,0,0,0,0,0,0 //NJ_TOBIDOUGU#NJ_TOBIDOUGU# -4212,523,10,522,1,0,0,0,0,0,0,0,0 //NJ_SYURIKEN#NJ_SYURIKEN# -4212,524,5,523,5,0,0,0,0,0,0,0,0 //NJ_KUNAI#NJ_KUNAI# -4212,525,5,522,5,524,5,0,0,0,0,0,0 //NJ_HUUMA#NJ_HUUMA# -4212,526,10,522,10,525,5,0,0,0,0,0,0 //NJ_ZENYNAGE#NJ_ZENYNAGE# -4212,527,5,0,0,0,0,0,0,0,0,0,0 //NJ_TATAMIGAESHI#NJ_TATAMIGAESHI# -4212,528,10,529,1,0,0,0,0,0,0,0,0 //NJ_KASUMIKIRI#NJ_KASUMIKIRI# -4212,529,5,527,1,0,0,0,0,0,0,0,0 //NJ_SHADOWJUMP#NJ_SHADOWJUMP# -4212,530,5,528,5,0,0,0,0,0,0,0,0 //NJ_KIRIKAGE#NJ_KIRIKAGE# -4212,531,5,529,5,0,0,0,0,0,0,0,0 //NJ_UTSUSEMI#NJ_UTSUSEMI# -4212,532,10,531,4,530,3,543,1,0,0,0,0 //NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU# -4212,533,10,0,0,0,0,0,0,0,0,0,0 //NJ_NINPOU#NJ_NINPOU# -4212,534,10,533,1,0,0,0,0,0,0,0,0 //NJ_KOUENKA#NJ_KOUENKA# -4212,535,10,534,5,0,0,0,0,0,0,0,0 //NJ_KAENSIN#NJ_KAENSIN# -4212,536,5,533,10,535,7,0,0,0,0,0,0 //NJ_BAKUENRYU#NJ_BAKUENRYU# -4212,537,10,533,1,0,0,0,0,0,0,0,0 //NJ_HYOUSENSOU#NJ_HYOUSENSOU# -4212,538,10,537,5,0,0,0,0,0,0,0,0 //NJ_SUITON#NJ_SUITON# -4212,539,5,533,10,538,7,0,0,0,0,0,0 //NJ_HYOUSYOURAKU#NJ_HYOUSYOURAKU# -4212,540,10,533,1,0,0,0,0,0,0,0,0 //NJ_HUUJIN#NJ_HUUJIN# -4212,541,5,540,5,0,0,0,0,0,0,0,0 //NJ_RAIGEKISAI#NJ_RAIGEKISAI# -4212,542,5,533,10,541,5,0,0,0,0,0,0 //NJ_KAMAITACHI#NJ_KAMAITACHI# -4212,543,5,533,5,0,0,0,0,0,0,0,0 //NJ_NEN#NJ_NEN# -4212,544,10,522,7,530,5,543,1,0,0,0,0 //NJ_ISSEN#NJ_ISSEN# -4212,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# -4212,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R# -4212,3001,1,530,5,0,0,0,0,0,0,0,0 //KO_YAMIKUMO## -4212,3002,5,0,0,0,0,0,0,0,0,0,0 //KO_RIGHT## -4212,3003,5,0,0,0,0,0,0,0,0,0,0 //KO_LEFT## -4212,3004,5,3001,1,0,0,0,0,0,0,0,0 //KO_JYUMONJIKIRI## -4212,3005,5,3004,2,0,0,0,0,0,0,0,0 //KO_SETSUDAN## -4212,3006,5,524,5,0,0,0,0,0,0,0,0 //KO_BAKURETSU## -4212,3007,5,3006,1,0,0,0,0,0,0,0,0 //KO_HAPPOKUNAI## -4212,3008,10,3010,3,0,0,0,0,0,0,0,0 //KO_MUCHANAGE## -4212,3009,5,525,5,0,0,0,0,0,0,0,0 //KO_HUUMARANKA## -4212,3010,5,526,1,0,0,0,0,0,0,0,0 //KO_MAKIBISHI## -4212,3011,5,533,10,0,0,0,0,0,0,0,0 //KO_MEIKYOUSISUI## -4212,3012,5,531,1,0,0,0,0,0,0,0,0 //KO_ZANZOU## -4212,3013,5,3021,2,0,0,0,0,0,0,0,0 //KO_KYOUGAKU## -4212,3014,5,3013,3,0,0,0,0,0,0,0,0 //KO_JYUSATSU## -4212,3015,1,0,0,0,0,0,0,0,0,0,0 //KO_KAHU_ENTEN## -4212,3016,1,0,0,0,0,0,0,0,0,0,0 //KO_HYOUHU_HUBUKI## -4212,3017,1,0,0,0,0,0,0,0,0,0,0 //KO_KAZEHU_SEIRAN## -4212,3018,1,0,0,0,0,0,0,0,0,0,0 //KO_DOHU_KOUKAI## -4212,3019,1,3015,1,3016,1,3017,1,3018,1,0,0 //KO_KAIHOU## -4212,3020,1,3019,1,3022,1,0,0,0,0,0,0 //KO_ZENKAI## -4212,3021,5,531,1,0,0,0,0,0,0,0,0 //KO_GENWAKU## -4212,3022,5,533,5,0,0,0,0,0,0,0,0 //KO_IZAYOI## -4212,3026,5,3021,1,0,0,0,0,0,0,0,0 //OB_ZANGETSU## -4212,3027,5,3029,3,0,0,0,0,0,0,0,0 //OB_OBOROGENSOU## -4212,3029,5,3026,2,0,0,0,0,0,0,0,0 //OB_AKAITSUKI## +4079,2304,3,2300,3,0,0,0,0,0,0,0,0 //SC_FEINTBOMB#Feint Bomb#
\ No newline at end of file diff --git a/db/re/skill_unit_db.txt b/db/re/skill_unit_db.txt index ab37bd3d4..3bfbd3c19 100644 --- a/db/re/skill_unit_db.txt +++ b/db/re/skill_unit_db.txt @@ -128,12 +128,36 @@ 2418,0xdb, , 0, 5, 300,enemy, 0x800 //WM_SEVERE_RAINSTORM 2419,0xde, , 0, 1,1000,enemy, 0x010 //WM_POEMOFNETHERWORLD +2443,0xdc, , 0, 0,1000,enemy, 0x00A //SO_FIREWALK +2444,0xdd, , 0, 0,1000,enemy, 0x00A //SO_ELECTRICWALK +2446,0x86, , 0, 3:3:3:4:4,1000,enemy, 0x018 //SO_EARTHGRAVE +2447,0x86, , 0, 3:3:3:4:4,1000,enemy, 0x018 //SO_DIAMONDDUST +2449,0xdf, , 0, 3:3:4:4:5,500,enemy, 0x018 //SO_PSYCHIC_WAVE +2450,0xe0, , 3, 0, 500,enemy, 0x010 //SO_CLOUD_KILL +2452,0xe4, , 0, 3,3000,all, 0x010 //SO_WARMER +2465,0xf1, , 0, 1,1000,all, 0x010 //SO_FIRE_INSIGNIA +2466,0xf2, , 0, 1,1000,all, 0x010 //SO_WATER_INSIGNIA +2467,0xf3, , 0, 1,1000,all, 0x010 //SO_WIND_INSIGNIA +2468,0xf4, , 0, 1,1000,all, 0x010 //SO_EARTH_INSIGNIA + +2479,0xe5, , 0, 1,1000,enemy, 0x000 //GN_THORNS_TRAP +2482,0xe6,0x7f, -1, 1, -1,all, 0x000 //GN_WALLOFTHORN +2485,0xe7, , 0, 3,1000,enemy, 0x098 //GN_DEMONIC_FIRE +2487,0xe8, , 0, 3,1000,enemy, 0x000 //GN_FIRE_EXPANSION_SMOKE_POWDER +2488,0xe9, , 0, 3,1000,enemy, 0x000 //GN_FIRE_EXPANSION_TEAR_GAS +2490,0xea, , 0, 1,1000,all, 0x000 //GN_HELLS_PLANT + 8208,0x86, , 0, 2,1000,enemy, 0x080 //MA_SHOWER 8209,0x90, , 0, 1,1000,enemy, 0x006 //MA_SKIDTRAP 8210,0x93, , 0, 0,1000,enemy, 0x006 //MA_LANDMINE 8211,0x95, , 0, 1,1000,enemy, 0x006 //MA_SANDMAN 8212,0x97, , 0, 1,1000,enemy, 0x006 //MA_FREEZINGTRAP +8403,0xed, , -1, 1,1000,enemy, 0x018 //EL_FIRE_MANTLE +8406,0xee, , 0, 1, -1,friend,0x018 //EL_WATER_BARRIER +8409,0xef, , 0, 1, -1,friend,0x018 //EL_ZEPHYR +8412,0xf0, , 0, 1, -1,friend,0x018 //EL_POWER_OF_GAIA + 10006,0xc1, , 2, 0, -1,guild, 0x040 //GD_LEADERSHIP 10007,0xc2, , 2, 0, -1,guild, 0x040 //GD_GLORYWOUNDS 10008,0xc3, , 2, 0, -1,guild, 0x040 //GD_SOULCOLD diff --git a/sql-files/main.sql b/sql-files/main.sql index c000a3892..9c8551e3a 100644 --- a/sql-files/main.sql +++ b/sql-files/main.sql @@ -80,6 +80,7 @@ CREATE TABLE IF NOT EXISTS `char` ( `guild_id` int(11) unsigned NOT NULL default '0', `pet_id` int(11) unsigned NOT NULL default '0', `homun_id` int(11) unsigned NOT NULL default '0', + `elemental_id` int(11) unsigned NOT NULL default '0' `hair` tinyint(4) unsigned NOT NULL default '0', `hair_color` smallint(5) unsigned NOT NULL default '0', `clothes_color` smallint(5) unsigned NOT NULL default '0', @@ -132,6 +133,29 @@ CREATE TABLE IF NOT EXISTS `charlog` ( ) ENGINE=MyISAM; -- +-- Table structure for table `elemental` +-- + +CREATE TABLE IF NOT EXISTS `elemental` ( + `ele_id` int(11) unsigned NOT NULL auto_increment, + `char_id` int(11) NOT NULL, + `class` mediumint(9) unsigned NOT NULL default '0', + `mode` int(11) unsigned NOT NULL default '1', + `hp` int(12) NOT NULL default '1', + `sp` int(12) NOT NULL default '1', + `max_hp` mediumint(8) unsigned NOT NULL default '0', + `max_sp` mediumint(6) unsigned NOT NULL default '0', + `str` smallint(4) unsigned NOT NULL default '0', + `agi` smallint(4) unsigned NOT NULL default '0', + `vit` smallint(4) unsigned NOT NULL default '0', + `int` smallint(4) unsigned NOT NULL default '0', + `dex` smallint(4) unsigned NOT NULL default '0', + `luk` smallint(4) unsigned NOT NULL default '0', + `life_time` int(11) NOT NULL default '0', + PRIMARY KEY (`ele_id`) +) ENGINE=MyISAM; + +-- -- Table structure for table `friends` -- diff --git a/sql-files/upgrade_svn15885_log.sql b/sql-files/upgrade_svn15885_log.sql new file mode 100644 index 000000000..5ab9fc2fa --- /dev/null +++ b/sql-files/upgrade_svn15885_log.sql @@ -0,0 +1,26 @@ +-- Adds 'I' to `type` in `zenylog` + +ALTER TABLE `char` ADD COLUMN `elemental_id` int(11) unsigned NOT NULL default '0'; + +-- +-- Table structure for table `elemental` +-- + +CREATE TABLE IF NOT EXISTS `elemental` ( + `ele_id` int(11) unsigned NOT NULL auto_increment, + `char_id` int(11) NOT NULL, + `class` mediumint(9) unsigned NOT NULL default '0', + `mode` int(11) unsigned NOT NULL default '1', + `hp` int(12) NOT NULL default '1', + `sp` int(12) NOT NULL default '1', + `max_hp` mediumint(8) unsigned NOT NULL default '0', + `max_sp` mediumint(6) unsigned NOT NULL default '0', + `str` smallint(4) unsigned NOT NULL default '0', + `agi` smallint(4) unsigned NOT NULL default '0', + `vit` smallint(4) unsigned NOT NULL default '0', + `int` smallint(4) unsigned NOT NULL default '0', + `dex` smallint(4) unsigned NOT NULL default '0', + `luk` smallint(4) unsigned NOT NULL default '0', + `life_time` int(11) NOT NULL default '0', + PRIMARY KEY (`ele_id`) +) ENGINE=MyISAM;
\ No newline at end of file diff --git a/src/char/Makefile.in b/src/char/Makefile.in index 4ef8ae7ea..1c93cfa6d 100644 --- a/src/char/Makefile.in +++ b/src/char/Makefile.in @@ -25,8 +25,8 @@ COMMON_SQL_OBJ = ../common/obj_sql/sql.o COMMON_H = ../common/sql.h CHAR_OBJ = obj_sql/char.o obj_sql/inter.o obj_sql/int_party.o obj_sql/int_guild.o \ - obj_sql/int_storage.o obj_sql/int_pet.o obj_sql/int_homun.o obj_sql/int_mail.o obj_sql/int_auction.o obj_sql/int_quest.o obj_sql/int_mercenary.o -CHAR_H = char.h inter.h int_party.h int_guild.h int_storage.h int_pet.h int_homun.h int_mail.h int_auction.h int_quest.h int_mercenary.h + obj_sql/int_storage.o obj_sql/int_pet.o obj_sql/int_homun.o obj_sql/int_mail.o obj_sql/int_auction.o obj_sql/int_quest.o obj_sql/int_mercenary.o obj_sql/int_elemental.o +CHAR_H = char.h inter.h int_party.h int_guild.h int_storage.h int_pet.h int_homun.h int_mail.h int_auction.h int_quest.h int_mercenary.h int_elemental.h HAVE_MYSQL=@HAVE_MYSQL@ ifeq ($(HAVE_MYSQL),yes) diff --git a/src/char/char.c b/src/char/char.c index a26f81174..46a255716 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -16,6 +16,7 @@ #include "int_guild.h" #include "int_homun.h" #include "int_mercenary.h" +#include "int_elemental.h" #include "int_party.h" #include "int_storage.h" #include "char.h" @@ -471,7 +472,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) (p->option != cp->option) || (p->party_id != cp->party_id) || (p->guild_id != cp->guild_id) || (p->pet_id != cp->pet_id) || (p->weapon != cp->weapon) || (p->hom_id != cp->hom_id) || - (p->shield != cp->shield) || (p->head_top != cp->head_top) || + (p->ele_id != cp->ele_id) || (p->shield != cp->shield) || (p->head_top != cp->head_top) || (p->head_mid != cp->head_mid) || (p->head_bottom != cp->head_bottom) || (p->delete_date != cp->delete_date) || (p->rename != cp->rename) || (p->robe != cp->robe) ) @@ -480,7 +481,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) "`base_exp`='%u', `job_exp`='%u', `zeny`='%d'," "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d'," "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d'," - "`option`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',`homun_id`='%d'," + "`option`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',`homun_id`='%d',`elemental_id`='%d'," "`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d'," "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `rename`='%d'," "`delete_date`='%lu',`robe`='%d'" @@ -489,7 +490,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) p->base_exp, p->job_exp, p->zeny, p->max_hp, p->hp, p->max_sp, p->sp, p->status_point, p->skill_point, p->str, p->agi, p->vit, p->int_, p->dex, p->luk, - p->option, p->party_id, p->guild_id, p->pet_id, p->hom_id, + p->option, p->party_id, p->guild_id, p->pet_id, p->hom_id, p->ele_id, p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom, mapindex_id2name(p->last_point.map), p->last_point.x, p->last_point.y, mapindex_id2name(p->save_point.map), p->save_point.x, p->save_point.y, p->rename, @@ -969,7 +970,7 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_everything if( SQL_ERROR == SqlStmt_Prepare(stmt, "SELECT " "`char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`," "`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`," - "`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`hair`," + "`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`elemental_id`,`hair`," "`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`last_x`,`last_y`," "`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`,`robe`" " FROM `%s` WHERE `char_id`=? LIMIT 1", char_db) @@ -1004,28 +1005,29 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_everything || SQL_ERROR == SqlStmt_BindColumn(stmt, 26, SQLDT_INT, &p->guild_id, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 27, SQLDT_INT, &p->pet_id, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 28, SQLDT_INT, &p->hom_id, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 29, SQLDT_SHORT, &p->hair, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 30, SQLDT_SHORT, &p->hair_color, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 31, SQLDT_SHORT, &p->clothes_color, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 32, SQLDT_SHORT, &p->weapon, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 33, SQLDT_SHORT, &p->shield, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 34, SQLDT_SHORT, &p->head_top, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 35, SQLDT_SHORT, &p->head_mid, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 36, SQLDT_SHORT, &p->head_bottom, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 37, SQLDT_STRING, &last_map, sizeof(last_map), NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 38, SQLDT_SHORT, &p->last_point.x, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 39, SQLDT_SHORT, &p->last_point.y, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 40, SQLDT_STRING, &save_map, sizeof(save_map), NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 41, SQLDT_SHORT, &p->save_point.x, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 42, SQLDT_SHORT, &p->save_point.y, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 43, SQLDT_INT, &p->partner_id, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 44, SQLDT_INT, &p->father, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 45, SQLDT_INT, &p->mother, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 46, SQLDT_INT, &p->child, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 47, SQLDT_INT, &p->fame, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 48, SQLDT_SHORT, &p->rename, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 49, SQLDT_UINT32, &p->delete_date, 0, NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 50, SQLDT_SHORT, &p->robe, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 29, SQLDT_INT, &p->ele_id, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 30, SQLDT_SHORT, &p->hair, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 31, SQLDT_SHORT, &p->hair_color, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 32, SQLDT_SHORT, &p->clothes_color, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 33, SQLDT_SHORT, &p->weapon, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 34, SQLDT_SHORT, &p->shield, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 35, SQLDT_SHORT, &p->head_top, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 36, SQLDT_SHORT, &p->head_mid, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 37, SQLDT_SHORT, &p->head_bottom, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 38, SQLDT_STRING, &last_map, sizeof(last_map), NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 39, SQLDT_SHORT, &p->last_point.x, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 40, SQLDT_SHORT, &p->last_point.y, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 41, SQLDT_STRING, &save_map, sizeof(save_map), NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 42, SQLDT_SHORT, &p->save_point.x, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 43, SQLDT_SHORT, &p->save_point.y, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 44, SQLDT_INT, &p->partner_id, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 45, SQLDT_INT, &p->father, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 46, SQLDT_INT, &p->mother, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 47, SQLDT_INT, &p->child, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 48, SQLDT_INT, &p->fame, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 49, SQLDT_SHORT, &p->rename, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 50, SQLDT_UINT32, &p->delete_date, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 51, SQLDT_SHORT, &p->robe, 0, NULL, NULL) ) { SqlStmt_ShowDebug(stmt); diff --git a/src/char/int_elemental.c b/src/char/int_elemental.c new file mode 100644 index 000000000..0146c8926 --- /dev/null +++ b/src/char/int_elemental.c @@ -0,0 +1,164 @@ +// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "../common/mmo.h" +#include "../common/malloc.h" +#include "../common/strlib.h" +#include "../common/showmsg.h" +#include "../common/socket.h" +#include "../common/utils.h" +#include "../common/sql.h" +#include "char.h" +#include "inter.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +bool mapif_elemental_save(struct s_elemental* ele) { + bool flag = true; + + if( ele->elemental_id == 0 ) { // Create new DB entry + if( SQL_ERROR == Sql_Query(sql_handle, + "INSERT INTO `elemental` (`char_id`,`class`,`mode`,`hp`,`sp`,`max_hp`,`max_sp`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`life_time`)" + "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%u')", + ele->char_id, ele->class_, ele->mode, ele->hp, ele->sp, ele->max_hp, ele->max_sp, ele->str, ele->agi, ele->vit, ele->int_, ele->dex, ele->luk, ele->life_time) ) + { + Sql_ShowDebug(sql_handle); + flag = false; + } + else + ele->elemental_id = (int)Sql_LastInsertId(sql_handle); + } else if( SQL_ERROR == Sql_Query(sql_handle, + "UPDATE `elemental` SET `char_id` = '%d', `class` = '%d', `mode` = '%d', `hp` = '%d', `sp` = '%d'," + "`max_hp` = '%d', `max_sp` = '%d', `str` = '%d', `agi` = '%d', `vit` = '%d', `int` = '%d', `dex` = '%d'," + "`luk` = '%d', `life_time` = '%u' WHERE `ele_id` = '%d'", + ele->char_id, ele->class_, ele->mode, ele->hp, ele->sp, ele->max_hp, ele->max_sp, ele->str, ele->agi, + ele->vit, ele->int_, ele->dex, ele->luk, ele->life_time, ele->elemental_id) ) + { // Update DB entry + Sql_ShowDebug(sql_handle); + flag = false; + } + return flag; +} + +bool mapif_elemental_load(int ele_id, int char_id, struct s_elemental *ele) { + char* data; + + memset(ele, 0, sizeof(struct s_elemental)); + ele->elemental_id = ele_id; + ele->char_id = char_id; + + if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `class`, `mode`, `hp`, `sp`, `max_hp`, `max_sp`, `str`, `agi`, `vit`, `int`, `dex`," + "`luk`, `life_time` FROM `elemental` WHERE `ele_id` = '%d' AND `char_id` = '%d'", + ele_id, char_id) ) { + Sql_ShowDebug(sql_handle); + return false; + } + + if( SQL_SUCCESS != Sql_NextRow(sql_handle) ) { + Sql_FreeResult(sql_handle); + return false; + } + + Sql_GetData(sql_handle, 0, &data, NULL); ele->class_ = atoi(data); + Sql_GetData(sql_handle, 1, &data, NULL); ele->mode = atoi(data); + Sql_GetData(sql_handle, 2, &data, NULL); ele->hp = atoi(data); + Sql_GetData(sql_handle, 3, &data, NULL); ele->sp = atoi(data); + Sql_GetData(sql_handle, 4, &data, NULL); ele->max_hp = atoi(data); + Sql_GetData(sql_handle, 5, &data, NULL); ele->max_sp = atoi(data); + Sql_GetData(sql_handle, 6, &data, NULL); ele->str = atoi(data); + Sql_GetData(sql_handle, 7, &data, NULL); ele->agi = atoi(data); + Sql_GetData(sql_handle, 8, &data, NULL); ele->vit = atoi(data); + Sql_GetData(sql_handle, 9, &data, NULL); ele->int_ = atoi(data); + Sql_GetData(sql_handle, 10, &data, NULL); ele->dex = atoi(data); + Sql_GetData(sql_handle, 11, &data, NULL); ele->luk = atoi(data); + Sql_GetData(sql_handle, 12, &data, NULL); ele->life_time = atoi(data); + Sql_FreeResult(sql_handle); + if( save_log ) + ShowInfo("Elemental loaded (%d - %d).\n", ele->elemental_id, ele->char_id); + + return true; +} + +bool mapif_elemental_delete(int ele_id) { + if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `elemental` WHERE `ele_id` = '%d'", ele_id) ) { + Sql_ShowDebug(sql_handle); + return false; + } + + return true; +} + +#ifndef TXT_SQL_CONVERT + +static void mapif_elemental_send(int fd, struct s_elemental *ele, unsigned char flag) { + int size = sizeof(struct s_elemental) + 5; + + WFIFOHEAD(fd,size); + WFIFOW(fd,0) = 0x387c; + WFIFOW(fd,2) = size; + WFIFOB(fd,4) = flag; + memcpy(WFIFOP(fd,5),ele,sizeof(struct s_elemental)); + WFIFOSET(fd,size); +} + +static void mapif_parse_elemental_create(int fd, struct s_elemental* ele) { + bool result = mapif_elemental_save(ele); + mapif_elemental_send(fd, ele, result); +} + +static void mapif_parse_elemental_load(int fd, int ele_id, int char_id) { + struct s_elemental ele; + bool result = mapif_elemental_load(ele_id, char_id, &ele); + mapif_elemental_send(fd, &ele, result); +} + +static void mapif_elemental_deleted(int fd, unsigned char flag) { + WFIFOHEAD(fd,3); + WFIFOW(fd,0) = 0x387d; + WFIFOB(fd,2) = flag; + WFIFOSET(fd,3); +} + +static void mapif_parse_elemental_delete(int fd, int ele_id) { + bool result = mapif_elemental_delete(ele_id); + mapif_elemental_deleted(fd, result); +} + +static void mapif_elemental_saved(int fd, unsigned char flag) { + WFIFOHEAD(fd,3); + WFIFOW(fd,0) = 0x387e; + WFIFOB(fd,2) = flag; + WFIFOSET(fd,3); +} + +static void mapif_parse_elemental_save(int fd, struct s_elemental* ele) { + bool result = mapif_elemental_save(ele); + mapif_elemental_saved(fd, result); +} + +int inter_elemental_sql_init(void) { + return 0; +} +void inter_elemental_sql_final(void) { + return; +} + +/*========================================== + * Inter Packets + *------------------------------------------*/ +int inter_elemental_parse_frommap(int fd) { + unsigned short cmd = RFIFOW(fd,0); + + switch( cmd ) { + case 0x307c: mapif_parse_elemental_create(fd, (struct s_elemental*)RFIFOP(fd,4)); break; + case 0x307d: mapif_parse_elemental_load(fd, (int)RFIFOL(fd,2), (int)RFIFOL(fd,6)); break; + case 0x307e: mapif_parse_elemental_delete(fd, (int)RFIFOL(fd,2)); break; + case 0x307f: mapif_parse_elemental_save(fd, (struct s_elemental*)RFIFOP(fd,4)); break; + default: + return 0; + } + return 1; +} +#endif //TXT_SQL_CONVERT diff --git a/src/char/int_elemental.h b/src/char/int_elemental.h new file mode 100644 index 000000000..89001dd95 --- /dev/null +++ b/src/char/int_elemental.h @@ -0,0 +1,15 @@ +// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#ifndef _INT_ELEMENTAL_SQL_H_ +#define _INT_ELEMENTAL_SQL_H_ + +struct s_elemental; + +int inter_elemental_sql_init(void); +void inter_elemental_sql_final(void); +int inter_elemental_parse_frommap(int fd); + +bool mapif_elemental_delete(int ele_id); + +#endif /* _INT_ELEMENTAL_SQL_H_ */ diff --git a/src/char/inter.c b/src/char/inter.c index 752fe5163..6d4073c57 100644 --- a/src/char/inter.c +++ b/src/char/inter.c @@ -19,6 +19,7 @@ #include "int_mail.h" #include "int_auction.h" #include "int_quest.h" +#include "int_elemental.h" #include <stdio.h> #include <string.h> @@ -50,7 +51,7 @@ int inter_recv_packet_length[] = { -1, 9, 0, 0, 0, 0, 0, 0, 7, 6,10,10, 10,-1, 0, 0, // 3040- -1,-1,10,10, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3050- Auction System [Zephyrus] 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3060- Quest system [Kevin] [Inkfish] - -1,10, 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3070- Mercenary packets [Zephyrus] + -1,10, 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, -1,10, 6,-1, // 3070- Mercenary packets [Zephyrus], Elemental packets [pakpil] 48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3080- -1,10,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3090- Homunculus packets [albator] }; @@ -295,6 +296,7 @@ int inter_init_sql(const char *file) inter_pet_sql_init(); inter_homunculus_sql_init(); inter_mercenary_sql_init(); + inter_elemental_sql_init(); inter_accreg_sql_init(); inter_mail_sql_init(); inter_auction_sql_init(); @@ -313,6 +315,7 @@ void inter_final(void) inter_pet_sql_final(); inter_homunculus_sql_final(); inter_mercenary_sql_final(); + inter_elemental_sql_init(); inter_mail_sql_final(); inter_auction_sql_final(); @@ -723,6 +726,7 @@ int inter_parse_frommap(int fd) || inter_pet_parse_frommap(fd) || inter_homunculus_parse_frommap(fd) || inter_mercenary_parse_frommap(fd) + || inter_elemental_parse_frommap(fd) || inter_mail_parse_frommap(fd) || inter_auction_parse_frommap(fd) || inter_quest_parse_frommap(fd) diff --git a/src/common/mmo.h b/src/common/mmo.h index 6643eb1dd..55dcd9ed1 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -154,6 +154,14 @@ #define MAX_MERCSKILL 40 #define MAX_MERCENARY_CLASS 44 +//Elemental System +#define MAX_ELEMENTALSKILL 42 +#define EL_SKILLBASE 8401 +#define MAX_ELESKILLTREE 3 +#define MAX_ELEMENTAL_CLASS 12 +#define EL_CLASS_BASE 2114 +#define EL_CLASS_MAX (EL_CLASS_BASE+MAX_ELEMENTAL_CLASS-1) + enum item_types { IT_HEALING = 0, IT_UNKNOWN, //1 @@ -292,6 +300,15 @@ struct s_mercenary { unsigned int life_time; }; +struct s_elemental { + int elemental_id; + int char_id; + short class_; + int mode; + int hp, sp, max_hp, max_sp, str, agi, vit, int_, dex, luk; + int life_time; +}; + struct s_friend { int account_id; int char_id; @@ -324,7 +341,7 @@ struct mmo_charstatus { short manner; unsigned char karma; short hair,hair_color,clothes_color; - int party_id,guild_id,pet_id,hom_id,mer_id; + int party_id,guild_id,pet_id,hom_id,mer_id,ele_id; int fame; // Mercenary Guilds Rank diff --git a/src/map/Makefile.in b/src/map/Makefile.in index 0b5ba023d..beeab32dd 100644 --- a/src/map/Makefile.in +++ b/src/map/Makefile.in @@ -31,7 +31,7 @@ MAP_OBJ = map.o chrif.o clif.o pc.o status.o npc.o \ storage.o skill.o atcommand.o battle.o battleground.o \ intif.o trade.o party.o vending.o guild.o pet.o \ log.o mail.o date.o unit.o homunculus.o mercenary.o quest.o instance.o \ - buyingstore.o searchstore.o duel.o pc_groups.o + buyingstore.o searchstore.o duel.o pc_groups.o elemental.o MAP_SQL_OBJ = $(MAP_OBJ:%=obj_sql/%) \ obj_sql/mapreg_sql.o MAP_H = map.h chrif.h clif.h pc.h status.h npc.h \ @@ -41,7 +41,7 @@ MAP_H = map.h chrif.h clif.h pc.h status.h npc.h \ log.h mail.h date.h unit.h homunculus.h mercenary.h quest.h instance.h mapreg.h \ buyingstore.h searchstore.h duel.h pc_groups.h \ config/core.h config/renewal.h config/secure.h config/const.h \ - config/classes/general.h config/classes/swordsman.h + config/classes/general.h config/classes/swordsman.h elemental.h HAVE_MYSQL=@HAVE_MYSQL@ ifeq ($(HAVE_MYSQL),yes) diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 8a918633a..c19164d1a 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -34,6 +34,7 @@ #include "homunculus.h" #include "mail.h" #include "mercenary.h" +#include "elemental.h" #include "party.h" #include "guild.h" #include "script.h" @@ -3764,6 +3765,7 @@ ACMD_FUNC(reloadmobdb) read_petdb(); merc_reload(); read_mercenarydb(); + reload_elementaldb(); clif_displaymessage(fd, msg_txt(98)); // Monster database has been reloaded. return 0; @@ -3777,6 +3779,7 @@ ACMD_FUNC(reloadskilldb) nullpo_retr(-1, sd); skill_reload(); merc_skill_reload(); + reload_elemental_skilldb(); read_mercenary_skilldb(); clif_displaymessage(fd, msg_txt(99)); // Skill database has been reloaded. diff --git a/src/map/battle.c b/src/map/battle.c index 48f8e1cab..cea562661 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -18,6 +18,7 @@ #include "skill.h" #include "homunculus.h" #include "mercenary.h" +#include "elemental.h" #include "mob.h" #include "itemdb.h" #include "clif.h" @@ -103,6 +104,7 @@ int battle_gettarget(struct block_list* bl) case BL_PET: return ((struct pet_data*)bl)->target_id; case BL_HOM: return ((struct homun_data*)bl)->ud.target; case BL_MER: return ((struct mercenary_data*)bl)->ud.target; + case BL_ELEM: return ((struct elemental_data*)bl)->ud.target; } return 0; } @@ -299,8 +301,7 @@ int battle_attr_fix(struct block_list *src, struct block_list *target, int damag } ratio = attr_fix_table[def_lv-1][atk_elem][def_type]; - if (sc && sc->count) - { + if (sc && sc->count) { if(sc->data[SC_VOLCANO] && atk_elem == ELE_FIRE) ratio += enchant_eff[sc->data[SC_VOLCANO]->val1-1]; if(sc->data[SC_VIOLENTGALE] && atk_elem == ELE_WIND) @@ -308,8 +309,27 @@ int battle_attr_fix(struct block_list *src, struct block_list *target, int damag if(sc->data[SC_DELUGE] && atk_elem == ELE_WATER) ratio += enchant_eff[sc->data[SC_DELUGE]->val1-1]; } - if( atk_elem == ELE_FIRE && tsc && tsc->count && tsc->data[SC_SPIDERWEB] ) - { + if( target && target->type == BL_SKILL ) { + if( atk_elem == ELE_FIRE && battle_getcurrentskill(target) == GN_WALLOFTHORN ) { + struct skill_unit *su = (struct skill_unit*)target; + struct skill_unit_group *sg; + struct block_list *src; + int x,y; + + if( !su || !su->alive || (sg = su->group) == NULL || !sg || sg->val3 == -1 || + (src = map_id2bl(su->val2)) == NULL || status_isdead(src) ) + return 0; + + if( sg->unit_id != UNT_FIREWALL ) { + x = sg->val3 >> 16; + y = sg->val3 & 0xffff; + skill_unitsetting(src,su->group->skill_id,su->group->skill_lv,x,y,1); + sg->val3 = -1; + sg->limit = DIFF_TICK(gettick(),sg->tick)+300; + } + } + } + if( atk_elem == ELE_FIRE && tsc && tsc->count && tsc->data[SC_SPIDERWEB] ){ tsc->data[SC_SPIDERWEB]->val1 = 0; // free to move now if( tsc->data[SC_SPIDERWEB]->val2-- > 0 ) damage <<= 1; // double damage @@ -932,6 +952,8 @@ int battle_addmastery(struct map_session_data *sd,struct block_list *target,int case W_DAGGER: if((skill = pc_checkskill(sd,SM_SWORD)) > 0) damage += (skill * 4); + if((skill = pc_checkskill(sd,GN_TRAINING_SWORD)) > 0) + damage += skill * 10; break; case W_2HSWORD: #ifdef RENEWAL @@ -1486,15 +1508,27 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo if(sd && pc_checkskill(sd,AS_SONICACCEL)>0) hitrate += hitrate * 50 / 100; break; + case MC_CARTREVOLUTION: + case GN_CART_TORNADO: + case GN_CARTCANNON: + if( sd && pc_checkskill(sd, GN_REMODELING_CART) ) + hitrate += pc_checkskill(sd, GN_REMODELING_CART) * 4; + break; case GC_VENOMPRESSURE: hitrate += 10 + 4 * skill_lv; break; } - // Weaponry Research hidden bonus - if (sd && (skill = pc_checkskill(sd,BS_WEAPONRESEARCH)) > 0) - hitrate += hitrate * ( 2 * skill ) / 100; - + if( sd ) { + // Weaponry Research hidden bonus + if ((skill = pc_checkskill(sd,BS_WEAPONRESEARCH)) > 0) + hitrate += hitrate * ( 2 * skill ) / 100; + + if( (sd->status.weapon == W_1HSWORD || sd->status.weapon == W_DAGGER) && + (skill = pc_checkskill(sd, GN_TRAINING_SWORD))>0 ) + hitrate += 3 * skill; + } + hitrate = cap_value(hitrate, battle_config.min_hitrate, battle_config.max_hitrate); if(rnd()%100 >= hitrate) @@ -2238,6 +2272,76 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo case WM_SOUND_OF_DESTRUCTION: skillratio += 400; break; + case GN_CART_TORNADO: + if( sd ) + skillratio += 50 * skill_lv + pc_checkskill(sd, GN_REMODELING_CART) * 100 - 100; + if( status_get_lv(src) > 100 ) skillratio += skillratio * (status_get_lv(src) - 100) / 200; // Base level bonus. + if( sc && sc->data[SC_GN_CARTBOOST] ) + skillratio += 10 * sc->data[SC_GN_CARTBOOST]->val1; + break; + case GN_CARTCANNON: + if( sd ) skillratio += 250 + 50 * skill_lv + pc_checkskill(sd, GN_REMODELING_CART) * (sstatus->int_ / 2); + if( sc && sc->data[SC_GN_CARTBOOST] ) + skillratio += 10 * sc->data[SC_GN_CARTBOOST]->val1; + break; + case GN_SPORE_EXPLOSION: + skillratio += 200 + 100 * skill_lv; + break; + case GN_CRAZYWEED_ATK: + skillratio += 400 + 100 * skill_lv; + break; + case GN_SLINGITEM_RANGEMELEEATK: + if( sd ) { + switch( sd->itemid ) { + case 13260: // Apple Bomob + case 13261: // Coconut Bomb + case 13262: // Melon Bomb + case 13263: // Pinapple Bomb + skillratio += 400; // Unconfirded + break; + case 13264: // Banana Bomb 2000% + skillratio += 1900; + break; + case 13265: skillratio -= 75; break; // Black Lump 25% + case 13266: skillratio -= 25; break; // Hard Black Lump 75% + case 13267: skillratio += 100; break; // Extremely Hard Black Lump 200% + } + } else + skillratio += 300; // Bombs + break; + case SO_VARETYR_SPEAR: //Assumed Formula. + skillratio += -100 + 200 * ( sd ? pc_checkskill(sd, SA_LIGHTNINGLOADER) : 1 ); + if( sc && sc->data[SC_BLAST_OPTION] ) + skillratio += skillratio * sc->data[SC_BLAST_OPTION]->val2 / 100; + break; + // Physical Elemantal Spirits Attack Skills + case EL_CIRCLE_OF_FIRE: + case EL_FIRE_BOMB_ATK: + case EL_STONE_RAIN: + skillratio += 200; + break; + case EL_FIRE_WAVE_ATK: + skillratio += 500; + break; + case EL_TIDAL_WEAPON: + skillratio += 1400; + break; + case EL_WIND_SLASH: + skillratio += 100; + break; + case EL_HURRICANE: + skillratio += 600; + break; + case EL_TYPOON_MIS: + case EL_WATER_SCREW_ATK: + skillratio += 900; + break; + case EL_STONE_HAMMER: + skillratio += 400; + break; + case EL_ROCK_CRUSHER: + skillratio += 700; + break; } ATK_RATE(skillratio); @@ -2920,7 +3024,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int mflag) { int i, nk; - short s_ele; + short s_ele = 0; unsigned int skillratio = 100; //Skill dmg modifiers. struct map_session_data *sd, *tsd; @@ -2954,16 +3058,38 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list sd = BL_CAST(BL_PC, src); tsd = BL_CAST(BL_PC, target); - //Initialize variables that will be used afterwards - s_ele = skill_get_ele(skill_num, skill_lv); - - if (s_ele == -1) // pl=-1 : the skill takes the weapon's element - s_ele = sstatus->rhw.ele; - else if (s_ele == -2) //Use status element - s_ele = status_get_attack_sc_element(src,status_get_sc(src)); - else if( s_ele == -3 ) //Use random element - s_ele = rnd()%ELE_MAX; - + if( skill_num == SO_PSYCHIC_WAVE ) { + struct status_change *sc = status_get_sc(src); + if( sc && sc->count && ( sc->data[SC_HEATER_OPTION] || sc->data[SC_COOLER_OPTION] || + sc->data[SC_BLAST_OPTION] || sc->data[SC_CURSED_SOIL_OPTION] ) ) { + if( sc->data[SC_HEATER_OPTION] ) s_ele = sc->data[SC_HEATER_OPTION]->val4; + else if( sc->data[SC_COOLER_OPTION] ) s_ele = sc->data[SC_COOLER_OPTION]->val4; + else if( sc->data[SC_BLAST_OPTION] ) s_ele = sc->data[SC_BLAST_OPTION]->val3; + else if( sc->data[SC_CURSED_SOIL_OPTION] ) s_ele = sc->data[SC_CURSED_SOIL_OPTION]->val4; + } else { + //#HALP# I didn't get a clue on how to do this without unnecessary adding a overhead of status_change on every call while this is a per-skill case. + //, - so i duplicated this code. make yourself comfortable to fix if you have any better ideas. + //Initialize variables that will be used afterwards + s_ele = skill_get_ele(skill_num, skill_lv); + + if (s_ele == -1) // pl=-1 : the skill takes the weapon's element + s_ele = sstatus->rhw.ele; + else if (s_ele == -2) //Use status element + s_ele = status_get_attack_sc_element(src,status_get_sc(src)); + else if( s_ele == -3 ) //Use random element + s_ele = rnd()%ELE_MAX; + } + } else { + //Initialize variables that will be used afterwards + s_ele = skill_get_ele(skill_num, skill_lv); + + if (s_ele == -1) // pl=-1 : the skill takes the weapon's element + s_ele = sstatus->rhw.ele; + else if (s_ele == -2) //Use status element + s_ele = status_get_attack_sc_element(src,status_get_sc(src)); + else if( s_ele == -3 ) //Use random element + s_ele = rnd()%ELE_MAX; + } //Set miscellaneous data that needs be filled if(sd) { sd->state.arrow_atk = 0; @@ -3334,6 +3460,24 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list else skillratio += 110 + 20 * skill_lv; break; + // Magical Elemental Spirits Attack Skills + case EL_FIRE_MANTLE: + case EL_WATER_SCREW: + skillratio += 900; + break; + case EL_FIRE_ARROW: + case EL_ROCK_CRUSHER_ATK: + skillratio += 200; + break; + case EL_FIRE_BOMB: + case EL_ICE_NEEDLE: + case EL_HURRICANE_ATK: + skillratio += 400; + break; + case EL_FIRE_WAVE: + case EL_TYPOON_MIS_ATK: + skillratio += 1100; + break; } @@ -3493,6 +3637,13 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list ad.damage=battle_calc_gvg_damage(src,target,ad.damage,ad.div_,skill_num,skill_lv,ad.flag); else if( map[target->m].flag.battleground ) ad.damage=battle_calc_bg_damage(src,target,ad.damage,ad.div_,skill_num,skill_lv,ad.flag); + + + if( skill_num == SO_VARETYR_SPEAR ) { // Physical damage. + struct Damage wd = battle_calc_weapon_attack(src,target,skill_num,skill_lv,mflag); + ad.damage += wd.damage; + } + return ad; } @@ -3675,7 +3826,15 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * if (sd) md.damage = md.damage + status_get_hp(src); status_set_sp(src, 0, 0); break; - + case GN_THORNS_TRAP: + md.damage = 100 + 200 * skill_lv + sstatus->int_; + break; + case GN_BLOOD_SUCKER: + md.damage = 200 + 100 * skill_lv + sstatus->int_; + break; + case GN_HELLS_PLANT_ATK: + md.damage = sstatus->int_ * 4 * skill_lv * (10 / (10 - pc_checkskill(sd,AM_CANNIBALIZE)));//Need accurate official formula. [Rytech] + break; } if (nk&NK_SPLASHSPLIT){ // Divide ATK among targets @@ -4168,24 +4327,38 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t map_freeblock_lock(); battle_delay_damage(tick, wd.amotion, src, target, wd.flag, 0, 0, damage, wd.dmg_lv, wd.dmotion); - - if( tsc && tsc->data[SC_DEVOTION] ) - { - struct status_change_entry *sce = tsc->data[SC_DEVOTION]; - struct block_list *d_bl = map_id2bl(sce->val1); - - if( d_bl && ( - (d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == target->id) || - (d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce->val2] == target->id) - ) && check_distance_bl(target, d_bl, sce->val3) ) - { - clif_damage(d_bl, d_bl, gettick(), 0, 0, damage, 0, 0, 0); - status_fix_damage(NULL, d_bl, damage, 0); - } - else - status_change_end(target, SC_DEVOTION, INVALID_TIMER); + if( tsc ) { + if( tsc->data[SC_DEVOTION] ) { + struct status_change_entry *sce = tsc->data[SC_DEVOTION]; + struct block_list *d_bl = map_id2bl(sce->val1); + + if( d_bl && ( + (d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == target->id) || + (d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce->val2] == target->id) + ) && check_distance_bl(target, d_bl, sce->val3) ) + { + clif_damage(d_bl, d_bl, gettick(), 0, 0, damage, 0, 0, 0); + status_fix_damage(NULL, d_bl, damage, 0); + } + else + status_change_end(target, SC_DEVOTION, INVALID_TIMER); + } else if( tsc->data[SC_CIRCLE_OF_FIRE_OPTION] && (wd.flag&BF_SHORT) && target->type == BL_PC ) { + struct elemental_data *ed = ((TBL_PC*)target)->ed; + if( ed ) { + clif_skill_damage(&ed->bl, target, tick, status_get_amotion(src), 0, -30000, 1, EL_CIRCLE_OF_FIRE, tsc->data[SC_CIRCLE_OF_FIRE_OPTION]->val1, 6); + skill_attack(BF_MAGIC,&ed->bl,&ed->bl,src,EL_CIRCLE_OF_FIRE,tsc->data[SC_CIRCLE_OF_FIRE_OPTION]->val1,tick,wd.flag); + } + } else if( tsc->data[SC_WATER_SCREEN_OPTION] && tsc->data[SC_WATER_SCREEN_OPTION]->val1 ) { + struct block_list *e_bl = map_id2bl(tsc->data[SC_WATER_SCREEN_OPTION]->val1); + if( e_bl && !status_isdead(e_bl) ) { + clif_damage(e_bl,e_bl,tick,wd.amotion,wd.dmotion,damage,wd.div_,wd.type,wd.damage2); + status_damage(target,e_bl,damage,0,0,0); + // Just show damage in target. + clif_damage(src, target, tick, wd.amotion, wd.dmotion, damage, wd.div_, wd.type, wd.damage2 ); + return ATK_NONE; + } + } } - if (sc && sc->data[SC_AUTOSPELL] && rnd()%100 < sc->data[SC_AUTOSPELL]->val4) { int sp = 0; int skillid = sc->data[SC_AUTOSPELL]->val2; @@ -4314,6 +4487,10 @@ struct block_list* battle_get_master(struct block_list *src) if (((TBL_MER*)src)->master) src = (struct block_list*)((TBL_MER*)src)->master; break; + case BL_ELEM: + if (((TBL_ELEM*)src)->master) + src = (struct block_list*)((TBL_ELEM*)src)->master; + break; case BL_SKILL: if (((TBL_SKILL*)src)->group && ((TBL_SKILL*)src)->group->src_id) src = map_id2bl(((TBL_SKILL*)src)->group->src_id); @@ -4409,6 +4586,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f //Valid targets with no special checks here. case BL_MER: case BL_HOM: + case BL_ELEM: break; //All else not specified is an invalid target. default: diff --git a/src/map/chrif.c b/src/map/chrif.c index c4ff4b662..095129e80 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -22,6 +22,7 @@ #include "homunculus.h" #include "instance.h" #include "mercenary.h" +#include "elemental.h" #include "chrif.h" #include "quest.h" #include "storage.h" @@ -307,6 +308,8 @@ int chrif_save(struct map_session_data *sd, int flag) merc_save(sd->hd); if( sd->md && mercenary_get_lifetime(sd->md) > 0 ) mercenary_save(sd->md); + if( sd->ed && elemental_get_lifetime(sd->ed) > 0 ) + elemental_save(sd->ed); if( sd->save_quest ) intif_quest_save(sd); diff --git a/src/map/clif.c b/src/map/clif.c index 3533c7eff..bfe78a58d 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -36,6 +36,7 @@ #include "homunculus.h" #include "instance.h" #include "mercenary.h" +#include "elemental.h" #include "log.h" #include "clif.h" #include "mail.h" @@ -273,7 +274,7 @@ static inline unsigned char clif_bl_type(struct block_list *bl) { case BL_PET: return pcdb_checkid(status_get_viewdata(bl)->class_)?0x0:0x7; //NPC_PET_TYPE case BL_HOM: return 0x8; //NPC_HOM_TYPE case BL_MER: return 0x9; //NPC_MERSOL_TYPE -// case BL_ELEM: return 0xA; //NPC_ELEMENTAL_TYPE + case BL_ELEM: return 0xa; //NPC_ELEMENTAL_TYPE default: return 0x1; //NPC_TYPE } } @@ -5193,44 +5194,60 @@ void clif_skill_produce_mix_list(struct map_session_data *sd, int skillid , int /// 4 = GN_MIX_COOKING /// 5 = GN_MAKEBOMB /// 6 = GN_S_PHARMACY -void clif_cooking_list(struct map_session_data *sd, int trigger) +void clif_cooking_list(struct map_session_data *sd, int trigger, int skill_id, int qty, int list_type) { int fd; int i, c; int view; - + nullpo_retv(sd); fd = sd->fd; - - WFIFOHEAD(fd, 6 + 2*MAX_SKILL_PRODUCE_DB); + + WFIFOHEAD(fd, 6 + 2 * MAX_SKILL_PRODUCE_DB); WFIFOW(fd,0) = 0x25a; - WFIFOW(fd,4) = 1; // list type - + WFIFOW(fd,4) = list_type; // list type + c = 0; - for( i = 0; i < MAX_SKILL_PRODUCE_DB; i++ ) - { - if( !skill_can_produce_mix(sd,skill_produce_db[i].nameid,trigger, 1) ) + for( i = 0; i < MAX_SKILL_PRODUCE_DB; i++ ) { + if( !skill_can_produce_mix(sd,skill_produce_db[i].nameid,trigger, qty) ) continue; - + if( (view = itemdb_viewid(skill_produce_db[i].nameid)) > 0 ) - WFIFOW(fd, 6+2*c)= view; + WFIFOW(fd, 6 + 2 * c) = view; else - WFIFOW(fd, 6+2*c)= skill_produce_db[i].nameid; - + WFIFOW(fd, 6 + 2 * c) = skill_produce_db[i].nameid; + c++; } - - WFIFOW(fd,2) = 6 + 2*c; - WFIFOSET(fd,WFIFOW(fd,2)); - - //TODO: replace with proper solution - if( c > 0 ) - { - sd->menuskill_id = AM_PHARMACY; + + if( skill_id == AM_PHARMACY ) { // Only send it while Cooking else check for c. + WFIFOW(fd,2) = 6 + 2 * c; + WFIFOSET(fd,WFIFOW(fd,2)); + } + + if( c > 0 ) { + sd->menuskill_id = skill_id; sd->menuskill_val = trigger; + if( skill_id != AM_PHARMACY ) { + sd->menuskill_val2 = qty; // amount. + WFIFOW(fd,2) = 6 + 2 * c; + WFIFOSET(fd,WFIFOW(fd,2)); + } + } else { + clif_menuskill_clear(sd); + if( skill_id != AM_PHARMACY ) { // AM_PHARMACY is used to Cooking. + // It fails. +#if PACKETVER >= 20090922 + clif_msg_skill(sd,skill_id,0x625); +#else + WFIFOW(fd,2) = 6 + 2 * c; + WFIFOSET(fd,WFIFOW(fd,2)); +#endif + } } } + /// Notifies clients of a status change. /// 0196 <index>.W <id>.L <state>.B (ZC_MSG_STATE_CHANGE) [used for ending status changes and starting them on non-pc units (when needed)] /// 043f <index>.W <id>.L <state>.B <remain msec>.L { <val>.L }*3 (ZC_MSG_STATE_CHANGE2) [used exclusively for starting statuses on pcs] @@ -8107,11 +8124,12 @@ void clif_refresh(struct map_session_data *sd) clif_refreshlook(&sd->bl,sd->bl.id,LOOK_CLOTHES_COLOR,sd->vd.cloth_color,SELF); if(merc_is_hom_active(sd->hd)) clif_send_homdata(sd,SP_ACK,0); - if( sd->md ) - { + if( sd->md ) { clif_mercenary_info(sd); clif_mercenary_skillblock(sd); } + if( sd->ed ) + clif_elemental_info(sd); map_foreachinrange(clif_getareachar,&sd->bl,AREA_SIZE,BL_ALL,sd); clif_weather_check(sd); if( sd->chatID ) @@ -8255,6 +8273,9 @@ void clif_charnameack (int fd, struct block_list *bl) // memcpy(WBUFP(buf,6), (struct chat*)->title, NAME_LENGTH); // break; return; + case BL_ELEM: + memcpy(WBUFP(buf,6), ((TBL_ELEM*)bl)->db->name, NAME_LENGTH); + break; default: ShowError("clif_charnameack: bad type %d(%d)\n", bl->type, bl->id); return; @@ -9082,14 +9103,22 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) skill_unit_move(&sd->hd->bl,gettick(),1); // apply land skills immediately } - if( sd->md ) - { + if( sd->md ) { map_addblock(&sd->md->bl); clif_spawn(&sd->md->bl); clif_mercenary_info(sd); clif_mercenary_skillblock(sd); } + if( sd->ed ) { + map_addblock(&sd->ed->bl); + clif_spawn(&sd->ed->bl); + clif_elemental_info(sd); + clif_elemental_updatestatus(sd,SP_HP); + clif_hpmeter_single(sd->fd,sd->ed->bl.id,sd->ed->battle_status.hp,sd->ed->battle_status.matk_max); + clif_elemental_updatestatus(sd,SP_SP); + } + if(sd->state.connect_new) { int lv; sd->state.connect_new = 0; @@ -10587,15 +10616,13 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) if( sd->sc.data[SC_BASILICA] && (skillnum != HP_BASILICA || sd->sc.data[SC_BASILICA]->val4 != sd->bl.id) ) return; // On basilica only caster can use Basilica again to stop it. - if( sd->menuskill_id ) - { - if( sd->menuskill_id == SA_TAMINGMONSTER ) - sd->menuskill_id = sd->menuskill_val = 0; //Cancel pet capture. - else if( sd->menuskill_id != SA_AUTOSPELL ) + if( sd->menuskill_id ) { + if( sd->menuskill_id == SA_TAMINGMONSTER ) { + clif_menuskill_clear(sd); //Cancel pet capture. + } else if( sd->menuskill_id != SA_AUTOSPELL ) return; //Can't use skills while a menu is open. } - if( sd->skillitem == skillnum ) - { + if( sd->skillitem == skillnum ) { if( skilllv != sd->skillitemlv ) skilllv = sd->skillitemlv; if( !(tmp&INF_SELF_SKILL) ) @@ -10606,15 +10633,12 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) sd->skillitem = sd->skillitemlv = 0; - if( skillnum >= GD_SKILLBASE ) - { + if( skillnum >= GD_SKILLBASE ) { if( sd->state.gmaster_flag ) skilllv = guild_checkskill(sd->state.gmaster_flag, skillnum); else skilllv = 0; - } - else - { + } else { tmp = pc_checkskill(sd, skillnum); if( skilllv > tmp ) skilllv = tmp; @@ -10661,10 +10685,8 @@ static void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, sho if( sd->ud.skilltimer != INVALID_TIMER ) return; - if( DIFF_TICK(tick, sd->ud.canact_tick) < 0 ) - { - if( sd->skillitem != skillnum ) - { + if( DIFF_TICK(tick, sd->ud.canact_tick) < 0 ) { + if( sd->skillitem != skillnum ) { clif_skill_fail(sd, skillnum, USESKILL_FAIL_SKILLINTERVAL, 0); return; } @@ -10676,28 +10698,23 @@ static void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, sho if( sd->sc.data[SC_BASILICA] && (skillnum != HP_BASILICA || sd->sc.data[SC_BASILICA]->val4 != sd->bl.id) ) return; // On basilica only caster can use Basilica again to stop it. - if( sd->menuskill_id ) - { - if( sd->menuskill_id == SA_TAMINGMONSTER ) - sd->menuskill_id = sd->menuskill_val = 0; //Cancel pet capture. - else if( sd->menuskill_id != SA_AUTOSPELL ) + if( sd->menuskill_id ) { + if( sd->menuskill_id == SA_TAMINGMONSTER ) { + clif_menuskill_clear(sd); //Cancel pet capture. + } else if( sd->menuskill_id != SA_AUTOSPELL ) return; //Can't use skills while a menu is open. } pc_delinvincibletimer(sd); - if( sd->skillitem == skillnum ) - { + if( sd->skillitem == skillnum ) { if( skilllv != sd->skillitemlv ) skilllv = sd->skillitemlv; unit_skilluse_pos(&sd->bl, x, y, skillnum, skilllv); - } - else - { + } else { int lv; sd->skillitem = sd->skillitemlv = 0; - if( (lv = pc_checkskill(sd, skillnum)) > 0 ) - { + if( (lv = pc_checkskill(sd, skillnum)) > 0 ) { if( skilllv > lv ) skilllv = lv; unit_skilluse_pos(&sd->bl, x, y, skillnum,skilllv); @@ -10759,9 +10776,8 @@ void clif_parse_UseSkillMap(int fd, struct map_session_data* sd) if(skill_num != sd->menuskill_id) return; - if( pc_cant_act(sd) ) - { - sd->menuskill_id = sd->menuskill_val = 0; + if( pc_cant_act(sd) ) { + clif_menuskill_clear(sd); return; } @@ -10795,12 +10811,12 @@ void clif_parse_ProduceMix(int fd,struct map_session_data *sd) if (pc_istrading(sd)) { //Make it fail to avoid shop exploits where you sell something different than you see. clif_skill_fail(sd,sd->ud.skillid,USESKILL_FAIL_LEVEL,0); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); return; } if( skill_can_produce_mix(sd,RFIFOW(fd,2),sd->menuskill_val, 1) ) skill_produce_mix(sd,0,RFIFOW(fd,2),RFIFOW(fd,4),RFIFOW(fd,6),RFIFOW(fd,8), 1); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); } @@ -10813,24 +10829,22 @@ void clif_parse_ProduceMix(int fd,struct map_session_data *sd) /// 4 = GN_MIX_COOKING /// 5 = GN_MAKEBOMB /// 6 = GN_S_PHARMACY -void clif_parse_Cooking(int fd,struct map_session_data *sd) -{ - //int type = RFIFOW(fd,2); +void clif_parse_Cooking(int fd,struct map_session_data *sd) { + int type = RFIFOW(fd,2); int nameid = RFIFOW(fd,4); - - if( sd->menuskill_id != AM_PHARMACY ) { + int amount = sd->menuskill_val2?sd->menuskill_val2:1; + if( type == 6 && sd->menuskill_id != GN_MIX_COOKING && sd->menuskill_id != GN_S_PHARMACY ) return; - } - + if (pc_istrading(sd)) { //Make it fail to avoid shop exploits where you sell something different than you see. clif_skill_fail(sd,sd->ud.skillid,USESKILL_FAIL_LEVEL,0); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); return; } - if( skill_can_produce_mix(sd,nameid,sd->menuskill_val, 1) ) - skill_produce_mix(sd,0,nameid,0,0,0,1); - sd->menuskill_val = sd->menuskill_id = 0; + if( skill_can_produce_mix(sd,nameid,sd->menuskill_val, amount) ) + skill_produce_mix(sd,sd->menuskill_id,nameid,0,0,0,amount); + clif_menuskill_clear(sd); } @@ -10843,11 +10857,11 @@ void clif_parse_RepairItem(int fd, struct map_session_data *sd) if (pc_istrading(sd)) { //Make it fail to avoid shop exploits where you sell something different than you see. clif_skill_fail(sd,sd->ud.skillid,USESKILL_FAIL_LEVEL,0); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); return; } skill_repairweapon(sd,RFIFOW(fd,2)); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); } @@ -10862,12 +10876,12 @@ void clif_parse_WeaponRefine(int fd, struct map_session_data *sd) if (pc_istrading(sd)) { //Make it fail to avoid shop exploits where you sell something different than you see. clif_skill_fail(sd,sd->ud.skillid,USESKILL_FAIL_LEVEL,0); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); return; } idx = RFIFOL(fd,packet_db[sd->packet_ver][RFIFOW(fd,0)].pos[0]); skill_weaponrefine(sd, idx-2); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); } @@ -10952,13 +10966,12 @@ void clif_parse_ItemIdentify(int fd,struct map_session_data *sd) if (sd->menuskill_id != MC_IDENTIFY) return; - if( idx == -1 ) - {// cancel pressed - sd->menuskill_val = sd->menuskill_id = 0; + if( idx == -1 ) {// cancel pressed + clif_menuskill_clear(sd); return; } skill_identify(sd,idx-2); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); } @@ -10969,7 +10982,7 @@ void clif_parse_SelectArrow(int fd,struct map_session_data *sd) if (pc_istrading(sd)) { //Make it fail to avoid shop exploits where you sell something different than you see. clif_skill_fail(sd,sd->ud.skillid,USESKILL_FAIL_LEVEL,0); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); return; } switch( sd->menuskill_id ) { @@ -10990,7 +11003,7 @@ void clif_parse_SelectArrow(int fd,struct map_session_data *sd) break; } - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); } @@ -11001,7 +11014,7 @@ void clif_parse_AutoSpell(int fd,struct map_session_data *sd) if (sd->menuskill_id != SA_AUTOSPELL) return; skill_autospell(sd,RFIFOL(fd,2)); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); } @@ -12074,7 +12087,7 @@ void clif_parse_SelectEgg(int fd, struct map_session_data *sd) return; } pet_select_egg(sd,RFIFOW(fd,2)-2); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); } @@ -13038,7 +13051,7 @@ void clif_parse_FeelSaveOk(int fd,struct map_session_data *sd) // clif_misceffect2(&sd->bl, 0x1b0); // clif_misceffect2(&sd->bl, 0x21f); clif_feel_info(sd, i, 0); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); } @@ -15051,6 +15064,94 @@ void clif_parse_LessEffect(int fd, struct map_session_data* sd) sd->state.lesseffect = ( isLess != 0 ); } +/// S 07e4 <length>.w <option>.l <val>.l {<index>.w <amount>.w).4b* +void clif_parse_ItemListWindowSelected(int fd, struct map_session_data* sd) { + int n = (RFIFOW(fd,2)-12) / 4; + int type = RFIFOL(fd,4); + int flag = RFIFOL(fd,8); // Button clicked: 0 = Cancel, 1 = OK + unsigned short* item_list = (unsigned short*)RFIFOP(fd,12); + + if( sd->state.trading || sd->npc_shopid ) + return; + + if( flag == 0 || n == 0) { + clif_menuskill_clear(sd); + return; // Canceled by player. + } + + if( sd->menuskill_id != SO_EL_ANALYSIS && sd->menuskill_id != GN_CHANGEMATERIAL ) { + clif_menuskill_clear(sd); + return; // Prevent hacking. + } + + switch( type ) { + case 0: // Change Material + skill_changematerial(sd,n,item_list); + break; + case 1: // Level 1: Pure to Rough + case 2: // Level 2: Rough to Pure + skill_elementalanalysis(sd,n,type,item_list); + break; + } + clif_menuskill_clear(sd); + + return; +} + +/*========================================== + * Elemental System + *==========================================*/ +void clif_elemental_updatestatus(struct map_session_data *sd, int type) { + struct elemental_data *ed; + struct status_data *status; + int fd; + + if( sd == NULL || (ed = sd->ed) == NULL ) + return; + + fd = sd->fd; + status = &ed->battle_status; + WFIFOHEAD(fd,8); + WFIFOW(fd,0) = 0x81e; + WFIFOW(fd,2) = type; + switch( type ) { + case SP_HP: + WFIFOL(fd,4) = status->hp; + break; + case SP_MAXHP: + WFIFOL(fd,4) = status->max_hp; + break; + case SP_SP: + WFIFOL(fd,4) = status->sp; + break; + case SP_MAXSP: + WFIFOL(fd,4) = status->max_sp; + break; + } + WFIFOSET(fd,8); +} + +void clif_elemental_info(struct map_session_data *sd) { + int fd; + struct elemental_data *ed; + struct status_data *status; + + if( sd == NULL || (ed = sd->ed) == NULL ) + return; + + fd = sd->fd; + status = &ed->battle_status; + + WFIFOHEAD(fd,22); + WFIFOW(fd, 0) = 0x81d; + WFIFOL(fd, 2) = ed->bl.id; + WFIFOL(fd, 6) = status->hp; + WFIFOL(fd,10) = status->max_hp; + WFIFOL(fd,14) = status->sp; + WFIFOL(fd,18) = status->max_sp; + WFIFOSET(fd,22); +} + /// Buying Store System /// @@ -15762,6 +15863,35 @@ int clif_autoshadowspell_list(struct map_session_data *sd) { return 1; } +/*=========================================== + * Skill list for Four Elemental Analysis + * and Change Material skills. + *------------------------------------------*/ +int clif_skill_itemlistwindow( struct map_session_data *sd, int skill_id, int skill_lv ) +{ +#if PACKETVER >= 20090922 + int fd; + + nullpo_ret(sd); + + sd->menuskill_id = skill_id; // To prevent hacking. + sd->menuskill_val = skill_lv; + + if( skill_id == GN_CHANGEMATERIAL ) + skill_lv = 0; // Changematerial + + fd = sd->fd; + WFIFOHEAD(fd,packet_len(0x7e3)); + WFIFOW(fd,0) = 0x7e3; + WFIFOL(fd,2) = skill_lv; + WFIFOL(fd,4) = 0; + WFIFOSET(fd,packet_len(0x7e3)); + +#endif + + return 1; + +} /** * Sends a new status without a tick (currently used by the new mounts) **/ @@ -15826,11 +15956,11 @@ void clif_parse_SkillSelectMenu(int fd, struct map_session_data *sd) { if( pc_istrading(sd) ) { clif_skill_fail(sd,sd->ud.skillid,0,0); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); return; } skill_select_menu(sd,RFIFOL(fd,2),RFIFOW(fd,6)); - sd->menuskill_val = sd->menuskill_id = 0; + clif_menuskill_clear(sd); } /*========================================== @@ -16202,13 +16332,13 @@ static int packetdb_readdb(void) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //#0x07C0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #if PACKETVER < 20090617 6, 2, -1, 4, 4, 4, 4, 8, 8,254, 6, 8, 6, 54, 30, 54, #else // 0x7d9 changed 6, 2, -1, 4, 4, 4, 4, 8, 8,268, 6, 8, 6, 54, 30, 54, #endif - 0, 15, 8, 0, 0, 8, 8, 32, -1, 5, 0, 0, 0, 0, 0, 0, + 0, 15, 8, 6, -1, 8, 8, 32, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, -1, -1, -1, 8, 25, 0, 0, 26, 0, //#0x0800 #if PACKETVER < 20091229 @@ -16406,6 +16536,7 @@ static int packetdb_readdb(void) {clif_parse_mercenary_action,"mermenu"}, {clif_parse_progressbar,"progressbar"}, {clif_parse_SkillSelectMenu,"skillselectmenu"}, + {clif_parse_ItemListWindowSelected,"itemlistwindowselected"}, #if PACKETVER >= 20091229 {clif_parse_PartyBookingRegisterReq,"bookingregreq"}, {clif_parse_PartyBookingSearchReq,"bookingsearchreq"}, diff --git a/src/map/clif.h b/src/map/clif.h index 575798c6f..3dcab7379 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -429,7 +429,7 @@ void clif_skill_warppoint(struct map_session_data* sd, short skill_num, short sk void clif_skill_memomessage(struct map_session_data* sd, int type); void clif_skill_teleportmessage(struct map_session_data *sd, int type); void clif_skill_produce_mix_list(struct map_session_data *sd, int skillid, int trigger); -void clif_cooking_list(struct map_session_data *sd, int trigger); +void clif_cooking_list(struct map_session_data *sd, int trigger, int skill_id, int qty, int list_type); void clif_produceeffect(struct map_session_data* sd,int flag,int nameid); @@ -714,35 +714,27 @@ void clif_search_store_info_click_ack(struct map_session_data* sd, short x, shor **/ void clif_msgtable(int fd, int line); void clif_msgtable_num(int fd, int line, int num); -/** - * Elemental Converter List - **/ + int clif_elementalconverter_list(struct map_session_data *sd); -/** - * Rune Knight - **/ + void clif_millenniumshield(struct map_session_data *sd, short shields ); -/** - * Warlock - **/ + int clif_spellbook_list(struct map_session_data *sd); -/** - * Mechanic - **/ + int clif_magicdecoy_list(struct map_session_data *sd, int skill_lv, short x, short y); -/** - * Guilotine Cross - **/ + int clif_poison_list(struct map_session_data *sd, int skill_lv); -/** - * Shadow Chaser - **/ + int clif_autoshadowspell_list(struct map_session_data *sd); -/** - * New Mounts - **/ + int clif_status_load_notick(struct block_list *bl,int type,int flag,int val1, int val2, int val3); int clif_status_load_single(int fd, int id,int type,int flag,int val1, int val2, int val3); + + +int clif_skill_itemlistwindow( struct map_session_data *sd, int skill_id, int skill_lv ); +void clif_elemental_info(struct map_session_data *sd); +void clif_elemental_updatestatus(struct map_session_data *sd, int type); + /** * Color Table **/ @@ -753,4 +745,7 @@ enum clif_colors { }; unsigned long color_table[COLOR_MAX]; int clif_colormes(struct map_session_data * sd, enum clif_colors color, const char* msg); + +#define clif_menuskill_clear(sd) (sd)->menuskill_id = (sd)->menuskill_val = (sd)->menuskill_val2 = 0; + #endif /* _CLIF_H_ */ diff --git a/src/map/elemental.c b/src/map/elemental.c new file mode 100644 index 000000000..fc8c17e0e --- /dev/null +++ b/src/map/elemental.c @@ -0,0 +1,825 @@ +// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "../common/cbasetypes.h" +#include "../common/malloc.h" +#include "../common/socket.h" +#include "../common/timer.h" +#include "../common/nullpo.h" +#include "../common/mmo.h" +#include "../common/showmsg.h" +#include "../common/utils.h" + +#include "log.h" +#include "clif.h" +#include "chrif.h" +#include "intif.h" +#include "itemdb.h" +#include "map.h" +#include "pc.h" +#include "status.h" +#include "skill.h" +#include "mob.h" +#include "pet.h" +#include "battle.h" +#include "party.h" +#include "guild.h" +#include "atcommand.h" +#include "script.h" +#include "npc.h" +#include "trade.h" +#include "unit.h" +#include "elemental.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +struct s_elemental_db elemental_db[MAX_ELEMENTAL_CLASS]; // Elemental Database + +int elemental_search_index(int class_) { + int i; + ARR_FIND(0, MAX_ELEMENTAL_CLASS, i, elemental_db[i].class_ == class_); + return (i == MAX_ELEMENTAL_CLASS)?-1:i; +} + +bool elemental_class(int class_) { + return (bool)(elemental_search_index(class_) > -1); +} + +struct view_data * elemental_get_viewdata(int class_) { + int i = elemental_search_index(class_); + if( i < 0 ) + return 0; + + return &elemental_db[i].vd; +} + +int elemental_create(struct map_session_data *sd, int class_, unsigned int lifetime) { + struct s_elemental ele; + struct s_elemental_db *db; + int i; + + nullpo_retr(1,sd); + + if( (i = elemental_search_index(class_)) < 0 ) + return 0; + + db = &elemental_db[i]; + memset(&ele,0,sizeof(struct s_elemental)); + + ele.char_id = sd->status.char_id; + ele.class_ = class_; + ele.mode = EL_MODE_PASSIVE; // Initial mode + ele.hp = db->status.max_hp; + ele.sp = db->status.max_sp; + ele.life_time = lifetime; + + // Request Char Server to create this elemental + intif_elemental_create(&ele); + + return 1; +} + +int elemental_get_lifetime(struct elemental_data *ed) { + const struct TimerData * td; + if( ed == NULL || ed->summon_timer == INVALID_TIMER ) + return 0; + + td = get_timer(ed->summon_timer); + return (td != NULL) ? DIFF_TICK(td->tick, gettick()) : 0; +} + +int elemental_save(struct elemental_data *ed) { + ed->elemental.hp = ed->battle_status.hp; + ed->elemental.sp = ed->battle_status.sp; + ed->elemental.life_time = elemental_get_lifetime(ed); + + intif_elemental_save(&ed->elemental); + return 1; +} + +static int elemental_summon_end(int tid, unsigned int tick, int id, intptr data) { + struct map_session_data *sd; + struct elemental_data *ed; + + if( (sd = map_id2sd(id)) == NULL ) + return 1; + if( (ed = sd->ed) == NULL ) + return 1; + + if( ed->summon_timer != tid ) { + ShowError("elemental_summon_end %d != %d.\n", ed->summon_timer, tid); + return 0; + } + + ed->summon_timer = INVALID_TIMER; + elemental_delete(ed, 0); // Elemental's summon time is over. + + return 0; +} + +void elemental_summon_stop(struct elemental_data *ed) { + nullpo_retv(ed); + if( ed->summon_timer != INVALID_TIMER ) + delete_timer(ed->summon_timer, elemental_summon_end); + ed->summon_timer = INVALID_TIMER; +} + +int elemental_delete(struct elemental_data *ed, int reply) { + struct map_session_data *sd; + + nullpo_ret(ed); + + sd = ed->master; + ed->elemental.life_time = 0; + + elemental_clean_effect(ed); + elemental_summon_stop(ed); + + if( !sd ) + return unit_free(&ed->bl, 0); + + sd->ed = NULL; + sd->status.ele_id = 0; + + return unit_remove_map(&ed->bl, 0); +} + +void elemental_summon_init(struct elemental_data *ed) { + if( ed->summon_timer == INVALID_TIMER ) + ed->summon_timer = add_timer(gettick() + ed->elemental.life_time, elemental_summon_end, ed->master->bl.id, 0); + + ed->regen.state.block = 0; +} + +int elemental_data_received(struct s_elemental *ele, bool flag) { + struct map_session_data *sd; + struct elemental_data *ed; + struct s_elemental_db *db; + int i = elemental_search_index(ele->class_); + + if( (sd = map_charid2sd(ele->char_id)) == NULL ) + return 0; + + if( !flag || i < 0 ) { // Not created - loaded - DB info + sd->status.ele_id = 0; + return 0; + } + + db = &elemental_db[i]; + if( !sd->ed ) { // Initialize it after first summon. + sd->ed = ed = (struct elemental_data*)aCalloc(1,sizeof(struct elemental_data)); + ed->bl.type = BL_ELEM; + ed->bl.id = npc_get_new_npc_id(); + ed->master = sd; + ed->db = db; + memcpy(&ed->elemental, ele, sizeof(struct s_elemental)); + status_set_viewdata(&ed->bl, ed->elemental.class_); + ed->vd->head_mid = 10; // Why? + status_change_init(&ed->bl); + unit_dataset(&ed->bl); + ed->ud.dir = sd->ud.dir; + + ed->bl.m = sd->bl.m; + ed->bl.x = sd->bl.x; + ed->bl.y = sd->bl.y; + unit_calc_pos(&ed->bl, sd->bl.x, sd->bl.y, sd->ud.dir); + ed->bl.x = ed->ud.to_x; + ed->bl.y = ed->ud.to_y; + + map_addiddb(&ed->bl); + status_calc_elemental(ed,1); + ed->last_thinktime = gettick(); + ed->summon_timer = INVALID_TIMER; + ed->battle_status.mode = ele->mode = EL_MODE_PASSIVE; // Initial mode. + elemental_summon_init(ed); + } else { + memcpy(&sd->ed->elemental, ele, sizeof(struct s_elemental)); + ed = sd->ed; + } + + sd->status.ele_id = ele->elemental_id; + ed->battle_status.mode = ele->mode = EL_MODE_PASSIVE; // Initial mode. + + if( ed->bl.prev == NULL && sd->bl.prev != NULL ) { + map_addblock(&ed->bl); + clif_spawn(&ed->bl); + clif_elemental_info(sd); + clif_elemental_updatestatus(sd,SP_HP); + clif_hpmeter_single(sd->fd,ed->bl.id,ed->battle_status.hp,ed->battle_status.matk_max); + clif_elemental_updatestatus(sd,SP_SP); + } + + return 1; +} + +int elemental_clean_single_effect(struct elemental_data *ed, int skill_num) { + struct block_list *bl; + sc_type type = status_skill2sc(skill_num); + + nullpo_ret(ed); + + bl = battle_get_master(&ed->bl); + + if( type ) { + switch( type ) { + // Just remove status change. + case SC_PYROTECHNIC_OPTION: + case SC_HEATER_OPTION: + case SC_TROPIC_OPTION: + case SC_FIRE_CLOAK_OPTION: + case SC_AQUAPLAY_OPTION: + case SC_WATER_SCREEN_OPTION: + case SC_COOLER_OPTION: + case SC_CHILLY_AIR_OPTION: + case SC_GUST_OPTION: + case SC_WIND_STEP_OPTION: + case SC_BLAST_OPTION: + case SC_WATER_DROP_OPTION: + case SC_WIND_CURTAIN_OPTION: + case SC_WILD_STORM_OPTION: + case SC_PETROLOGY_OPTION: + case SC_SOLID_SKIN_OPTION: + case SC_CURSED_SOIL_OPTION: + case SC_STONE_SHIELD_OPTION: + case SC_UPHEAVAL_OPTION: + case SC_CIRCLE_OF_FIRE_OPTION: + case SC_TIDAL_WEAPON_OPTION: + if( bl ) status_change_end(bl,type,-1); // Master + status_change_end(&ed->bl,type-1,-1); // Elemental Spirit + break; + case SC_ZEPHYR: + if( bl ) status_change_end(bl,type,-1); + break; + } + } + if( skill_get_unit_id(skill_num,0) ) + skill_clear_unitgroup(&ed->bl); + + return 1; +} + +int elemental_clean_effect(struct elemental_data *ed) { + struct map_session_data *sd; + + nullpo_ret(ed); + + // Elemental side + status_change_end(&ed->bl, SC_TROPIC, INVALID_TIMER); + status_change_end(&ed->bl, SC_HEATER, INVALID_TIMER); + status_change_end(&ed->bl, SC_AQUAPLAY, INVALID_TIMER); + status_change_end(&ed->bl, SC_COOLER, INVALID_TIMER); + status_change_end(&ed->bl, SC_CHILLY_AIR, INVALID_TIMER); + status_change_end(&ed->bl, SC_PYROTECHNIC, INVALID_TIMER); + status_change_end(&ed->bl, SC_FIRE_CLOAK, INVALID_TIMER); + status_change_end(&ed->bl, SC_WATER_DROP, INVALID_TIMER); + status_change_end(&ed->bl, SC_WATER_SCREEN, INVALID_TIMER); + status_change_end(&ed->bl, SC_GUST, INVALID_TIMER); + status_change_end(&ed->bl, SC_WIND_STEP, INVALID_TIMER); + status_change_end(&ed->bl, SC_BLAST, INVALID_TIMER); + status_change_end(&ed->bl, SC_WIND_CURTAIN, INVALID_TIMER); + status_change_end(&ed->bl, SC_WILD_STORM, INVALID_TIMER); + status_change_end(&ed->bl, SC_PETROLOGY, INVALID_TIMER); + status_change_end(&ed->bl, SC_SOLID_SKIN, INVALID_TIMER); + status_change_end(&ed->bl, SC_CURSED_SOIL, INVALID_TIMER); + status_change_end(&ed->bl, SC_STONE_SHIELD, INVALID_TIMER); + status_change_end(&ed->bl, SC_UPHEAVAL, INVALID_TIMER); + status_change_end(&ed->bl, SC_CIRCLE_OF_FIRE, INVALID_TIMER); + status_change_end(&ed->bl, SC_TIDAL_WEAPON, INVALID_TIMER); + + skill_clear_unitgroup(&ed->bl); + + if( (sd = ed->master) == NULL ) + return 0; + + // Master side + status_change_end(&sd->bl, SC_TROPIC_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_HEATER_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_AQUAPLAY_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_COOLER_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_CHILLY_AIR_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_PYROTECHNIC_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_FIRE_CLOAK_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_WATER_DROP_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_WATER_SCREEN_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_GUST_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_WIND_STEP_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_BLAST_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_WATER_DROP_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_WIND_CURTAIN_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_WILD_STORM_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_ZEPHYR, INVALID_TIMER); + status_change_end(&sd->bl, SC_WIND_STEP_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_PETROLOGY_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_SOLID_SKIN_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_CURSED_SOIL_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_STONE_SHIELD_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_UPHEAVAL_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_CIRCLE_OF_FIRE_OPTION, INVALID_TIMER); + status_change_end(&sd->bl, SC_TIDAL_WEAPON_OPTION, INVALID_TIMER); + + return 1; +} + +int elemental_action(struct elemental_data *ed, struct block_list *bl, unsigned int tick) { + short skillnum, skilllv; + int i; + + nullpo_ret(ed); + nullpo_ret(bl); + + if( !ed->master ) + return 0; + + if( ed->target_id ) + elemental_unlocktarget(ed); // Remove previous target. + + ARR_FIND(0, MAX_ELESKILLTREE, i, ed->db->skill[i].id && (ed->db->skill[i].mode&EL_SKILLMODE_AGGRESSIVE)); + if( i == MAX_ELESKILLTREE ) + return 0; + + skillnum = ed->db->skill[i].id; + skilllv = ed->db->skill[i].lv; + + if( elemental_skillnotok(skillnum, ed) ) + return 0; + + if( ed->ud.skilltimer != -1 ) + return 0; + else if( DIFF_TICK(tick, ed->ud.canact_tick) < 0 ) + return 0; + + ed->target_id = ed->ud.skilltarget = bl->id; // Set new target + ed->last_thinktime = tick; + + // Not in skill range. + if( !battle_check_range(&ed->bl,bl,skill_get_range(skillnum,skilllv)) ) { + // Try to walk to the target. + if( !unit_walktobl(&ed->bl, bl, skill_get_range(skillnum,skilllv), 2) ) + elemental_unlocktarget(ed); + else { + // Walking, waiting to be in range. Client don't handle it, then we must handle it here. + int walk_dist = distance_bl(&ed->bl,bl) - skill_get_range(skillnum,skilllv); + ed->ud.skillid = skillnum; + ed->ud.skilllv = skilllv; + + if( skill_get_inf(skillnum) & INF_GROUND_SKILL ) + ed->ud.skilltimer = add_timer( tick+status_get_speed(&ed->bl)*walk_dist, skill_castend_pos, ed->bl.id, 0 ); + else + ed->ud.skilltimer = add_timer( tick+status_get_speed(&ed->bl)*walk_dist, skill_castend_id, ed->bl.id, 0 ); + } + return 1; + + } + //Otherwise, just cast the skill. + if( skill_get_inf(skillnum) & INF_GROUND_SKILL ) + unit_skilluse_pos(&ed->bl, bl->x, bl->y, skillnum, skilllv); + else + unit_skilluse_id(&ed->bl, bl->id, skillnum, skilllv); + + // Reset target. + ed->target_id = 0; + + return 1; +} + +/*=============================================================== + * Action that elemental perform after changing mode. + * Activates one of the skills of the new mode. + *-------------------------------------------------------------*/ +int elemental_change_mode_ack(struct elemental_data *ed, int mode) { + struct block_list *bl = &ed->master->bl; + short skillnum, skilllv; + int i; + + nullpo_ret(ed); + + if( !bl ) + return 0; + + // Select a skill. + ARR_FIND(0, MAX_ELESKILLTREE, i, ed->db->skill[i].id && (ed->db->skill[i].mode&mode)); + if( i == MAX_ELESKILLTREE ) + return 0; + + skillnum = ed->db->skill[i].id; + skilllv = ed->db->skill[i].lv; + + if( elemental_skillnotok(skillnum, ed) ) + return 0; + + if( ed->ud.skilltimer != -1 ) + return 0; + else if( DIFF_TICK(gettick(), ed->ud.canact_tick) < 0 ) + return 0; + + ed->target_id = bl->id; // Set new target + ed->last_thinktime = gettick(); + + if( skill_get_inf(skillnum) & INF_GROUND_SKILL ) + unit_skilluse_pos(&ed->bl, bl->x, bl->y, skillnum, skilllv); + else + unit_skilluse_id(&ed->bl,bl->id,skillnum,skilllv); + + ed->target_id = 0; // Reset target after casting the skill to avoid continious attack. + + return 1; +} + +/*=============================================================== + * Change elemental mode. + *-------------------------------------------------------------*/ +int elemental_change_mode(struct elemental_data *ed, int mode) { + nullpo_ret(ed); + + // Remove target + elemental_unlocktarget(ed); + + // Removes the effects of the previous mode. + if(ed->elemental.mode != mode ) elemental_clean_effect(ed); + + ed->battle_status.mode = ed->elemental.mode = mode; + + // Normalize elemental mode to elemental skill mode. + if( mode == EL_MODE_AGGRESSIVE ) mode = EL_SKILLMODE_AGGRESSIVE; // Aggressive spirit mode -> Aggressive spirit skill. + else if( mode == EL_MODE_ASSIST ) mode = EL_SKILLMODE_ASSIST; // Assist spirit mode -> Assist spirit skill. + else mode = EL_SKILLMODE_PASIVE; // Passive spirit mode -> Passive spirit skill. + + // Use a skill inmediately after every change mode. + if( mode != EL_SKILLMODE_AGGRESSIVE ) + elemental_change_mode_ack(ed,mode); + return 1; +} + +void elemental_damage(struct elemental_data *ed, struct block_list *src, int hp, int sp) { + if( hp ) + clif_elemental_updatestatus(ed->master, SP_HP); + if( sp ) + clif_elemental_updatestatus(ed->master, SP_SP); +} + +void elemental_heal(struct elemental_data *ed, int hp, int sp) { + if( hp ) + clif_elemental_updatestatus(ed->master, SP_HP); + if( sp ) + clif_elemental_updatestatus(ed->master, SP_SP); +} + +int elemental_dead(struct elemental_data *ed, struct block_list *src) { + elemental_delete(ed, 1); + return 0; +} + +int elemental_unlocktarget(struct elemental_data *ed) { + nullpo_ret(ed); + + ed->target_id = 0; + elemental_stop_attack(ed); + elemental_stop_walking(ed,1); + return 0; +} + +int elemental_skillnotok(int skillid, struct elemental_data *ed) { + int i = skill_get_index(skillid); + nullpo_retr(1,ed); + + if (i == 0) + return 1; // invalid skill id + + if( ed->blockskill[i] > 0 ) + return 1; + + return skillnotok(skillid, ed->master); +} + +int elemental_set_target( struct map_session_data *sd, struct block_list *bl ) { + struct elemental_data *ed = sd->ed; + + nullpo_ret(ed); + nullpo_ret(bl); + + if( ed->bl.m != bl->m || !check_distance_bl(&ed->bl, bl, ed->db->range2) ) + return 0; + + if( !status_check_skilluse(&ed->bl, bl, 0, 0) ) + return 0; + + if( ed->target_id == 0 ) + ed->target_id = bl->id; + + return 1; +} + +static int elemental_ai_sub_timer_activesearch(struct block_list *bl, va_list ap) { + struct elemental_data *ed; + struct block_list **target; + int dist; + + nullpo_ret(bl); + + ed = va_arg(ap,struct elemental_data *); + target = va_arg(ap,struct block_list**); + + //If can't seek yet, not an enemy, or you can't attack it, skip. + if( (*target) == bl || !status_check_skilluse(&ed->bl, bl, 0, 0) ) + return 0; + + if( battle_check_target(&ed->bl,bl,BCT_ENEMY) <= 0 ) + return 0; + + switch( bl->type ) { + case BL_PC: + if( !map_flag_vs(ed->bl.m) ) + return 0; + default: + dist = distance_bl(&ed->bl, bl); + if( ((*target) == NULL || !check_distance_bl(&ed->bl, *target, dist)) && battle_check_range(&ed->bl,bl,ed->db->range2) ) { //Pick closest target? + (*target) = bl; + ed->target_id = bl->id; + ed->min_chase = dist + ed->db->range3; + if( ed->min_chase > AREA_SIZE ) + ed->min_chase = AREA_SIZE; + return 1; + } + break; + } + return 0; +} + +static int elemental_ai_sub_timer(struct elemental_data *ed, struct map_session_data *sd, unsigned int tick) { + struct block_list *target = NULL; + int master_dist, view_range, mode; + + nullpo_ret(ed); + nullpo_ret(sd); + + if( ed->bl.prev == NULL || sd == NULL || sd->bl.prev == NULL ) + return 0; + + if( DIFF_TICK(tick,ed->last_thinktime) < MIN_ELETHINKTIME ) + return 0; + + ed->last_thinktime = tick; + + if( ed->ud.skilltimer != -1 ) + return 0; + + if( ed->ud.walktimer != -1 && ed->ud.walkpath.path_pos <= 2 ) + return 0; //No thinking when you just started to walk. + + if(ed->ud.walkpath.path_pos < ed->ud.walkpath.path_len && ed->ud.target == sd->bl.id) + return 0; //No thinking until be near the master. + + if( ed->sc.count && ed->sc.data[SC_BLIND] ) + view_range = 3; + else + view_range = ed->db->range2; + + mode = status_get_mode(&ed->bl); + + master_dist = distance_bl(&sd->bl, &ed->bl); + if( master_dist > AREA_SIZE ) { // Master out of vision range. + elemental_unlocktarget(ed); + unit_warp(&ed->bl,sd->bl.m,sd->bl.x,sd->bl.y,3); + return 0; + } else if( master_dist > MAX_ELEDISTANCE ) { // Master too far, chase. + short x = sd->bl.x, y = sd->bl.y; + if( ed->target_id ) + elemental_unlocktarget(ed); + if( ed->ud.walktimer != -1 && ed->ud.target == sd->bl.id ) + return 0; //Already walking to him + if( DIFF_TICK(tick, ed->ud.canmove_tick) < 0 ) + return 0; //Can't move yet. + if( map_search_freecell(&ed->bl, sd->bl.m, &x, &y, MIN_ELEDISTANCE, MIN_ELEDISTANCE, 1) + && unit_walktoxy(&ed->bl, x, y, 0) ) + return 0; + } + + if( mode == EL_MODE_AGGRESSIVE ) { + target = map_id2bl(ed->ud.target); + + if( !target ) + map_foreachinrange(elemental_ai_sub_timer_activesearch, &ed->bl, ed->db->range2, BL_CHAR, ed, &target, status_get_mode(&ed->bl)); + + if( !target ) { //No targets available. + elemental_unlocktarget(ed); + return 1; + } + + if( battle_check_range(&ed->bl,target,ed->db->range2) && rand()%100 < 2 ) { // 2% chance to cast attack skill. + if( elemental_action(ed,target,tick) ) + return 1; + } + + //Attempt to attack. + //At this point we know the target is attackable, we just gotta check if the range matches. + if( ed->ud.target == target->id && ed->ud.attacktimer != -1 ) //Already locked. + return 1; + + if( battle_check_range(&ed->bl, target, ed->base_status.rhw.range) ) {//Target within range, engage + unit_attack(&ed->bl,target->id,1); + return 1; + } + + //Follow up if possible. + if( !unit_walktobl(&ed->bl, target, ed->base_status.rhw.range, 2) ) + elemental_unlocktarget(ed); + } + + return 0; +} + +static int elemental_ai_sub_foreachclient(struct map_session_data *sd, va_list ap) { + unsigned int tick = va_arg(ap,unsigned int); + if(sd->status.ele_id && sd->ed) + elemental_ai_sub_timer(sd->ed,sd,tick); + + return 0; +} + +static int elemental_ai_timer(int tid, unsigned int tick, int id, intptr data) { + map_foreachpc(elemental_ai_sub_foreachclient,tick); + + return 0; +} + +int read_elementaldb(void) { + FILE *fp; + char line[1024], *p; + char *str[26]; + int i, j = 0, k = 0, ele; + struct s_elemental_db *db; + struct status_data *status; + + sprintf(line, "%s/%s", db_path, "elemental_db.txt"); + memset(elemental_db,0,sizeof(elemental_db)); + + fp = fopen(line, "r"); + if( !fp ) { + ShowError("read_elementaldb : can't read elemental_db.txt\n"); + return -1; + } + + while( fgets(line, sizeof(line), fp) && j < MAX_ELEMENTAL_CLASS ) { + k++; + if( line[0] == '/' && line[1] == '/' ) + continue; + + i = 0; + p = strtok(line, ","); + while( p != NULL && i < 26 ) { + str[i++] = p; + p = strtok(NULL, ","); + } + if( i < 26 ) { + ShowError("read_elementaldb : Incorrect number of columns at elemental_db.txt line %d.\n", k); + continue; + } + + db = &elemental_db[j]; + db->class_ = atoi(str[0]); + strncpy(db->sprite, str[1], NAME_LENGTH); + strncpy(db->name, str[2], NAME_LENGTH); + db->lv = atoi(str[3]); + + status = &db->status; + db->vd.class_ = db->class_; + + status->max_hp = atoi(str[4]); + status->max_sp = atoi(str[5]); + status->rhw.range = atoi(str[6]); + status->rhw.atk = atoi(str[7]); + status->rhw.atk2 = status->rhw.atk + atoi(str[8]); + status->def = atoi(str[9]); + status->mdef = atoi(str[10]); + status->str = atoi(str[11]); + status->agi = atoi(str[12]); + status->vit = atoi(str[13]); + status->int_ = atoi(str[14]); + status->dex = atoi(str[15]); + status->luk = atoi(str[16]); + db->range2 = atoi(str[17]); + db->range3 = atoi(str[18]); + status->size = atoi(str[19]); + status->race = atoi(str[20]); + + ele = atoi(str[21]); + status->def_ele = ele%10; + status->ele_lv = ele/20; + if( status->def_ele >= ELE_MAX ) { + ShowWarning("Elemental %d has invalid element type %d (max element is %d)\n", db->class_, status->def_ele, ELE_MAX - 1); + status->def_ele = ELE_NEUTRAL; + } + if( status->ele_lv < 1 || status->ele_lv > 4 ) { + ShowWarning("Elemental %d has invalid element level %d (max is 4)\n", db->class_, status->ele_lv); + status->ele_lv = 1; + } + + status->aspd_rate = 1000; + status->speed = atoi(str[22]); + status->adelay = atoi(str[23]); + status->amotion = atoi(str[24]); + status->dmotion = atoi(str[25]); + + j++; + } + + fclose(fp); + ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' elementals in '"CL_WHITE"db/elemental_db.txt"CL_RESET"'.\n",j); + + return 0; +} + +int read_elemental_skilldb(void) { + FILE *fp; + char line[1024], *p; + char *str[4]; + struct s_elemental_db *db; + int i, j = 0, k = 0, class_; + int skillid, skilllv, skillmode; + + sprintf(line, "%s/%s", db_path, "elemental_skill_db.txt"); + fp = fopen(line, "r"); + if( !fp ) { + ShowError("read_elemental_skilldb : can't read elemental_skill_db.txt\n"); + return -1; + } + + while( fgets(line, sizeof(line), fp) ) { + k++; + if( line[0] == '/' && line[1] == '/' ) + continue; + + i = 0; + p = strtok(line, ","); + while( p != NULL && i < 4 ) { + str[i++] = p; + p = strtok(NULL, ","); + } + if( i < 4 ) { + ShowError("read_elemental_skilldb : Incorrect number of columns at elemental_skill_db.txt line %d.\n", k); + continue; + } + + class_ = atoi(str[0]); + ARR_FIND(0, MAX_ELEMENTAL_CLASS, i, class_ == elemental_db[i].class_); + if( i == MAX_ELEMENTAL_CLASS ) { + ShowError("read_elemental_skilldb : Class not found in elemental_db for skill entry, line %d.\n", k); + continue; + } + + skillid = atoi(str[1]); + if( skillid < EL_SKILLBASE || skillid >= EL_SKILLBASE + MAX_ELEMENTALSKILL ) { + ShowError("read_elemental_skilldb : Skill out of range, line %d.\n", k); + continue; + } + + db = &elemental_db[i]; + skilllv = atoi(str[2]); + + skillmode = atoi(str[3]); + if( skillmode < EL_SKILLMODE_PASIVE || skillmode > EL_SKILLMODE_AGGRESSIVE ) { + ShowError("read_elemental_skilldb : Skillmode out of range, line %d.\n",k); + skillmode = EL_SKILLMODE_PASIVE; + continue; + } + ARR_FIND( 0, MAX_ELESKILLTREE, i, db->skill[i].id == 0 || db->skill[i].id == skillid ); + if( i == MAX_ELESKILLTREE ) { + ShowWarning("Unable to load skill %d into Elemental %d's tree. Maximum number of skills per elemental has been reached.\n", skillid, class_); + continue; + } + db->skill[i].id = skillid; + db->skill[i].lv = skilllv; + db->skill[i].mode = skillmode; + j++; + } + + fclose(fp); + ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"db/elemental_skill_db.txt"CL_RESET"'.\n",j); + return 0; +} + +void reload_elementaldb(void) { + read_elementaldb(); + reload_elemental_skilldb(); +} + +void reload_elemental_skilldb(void) { + read_elemental_skilldb(); +} + +int do_init_elemental(void) { + read_elementaldb(); + read_elemental_skilldb(); + + add_timer_func_list(elemental_ai_timer,"elemental_ai_timer"); + add_timer_interval(gettick()+MIN_ELETHINKTIME,elemental_ai_timer,0,0,MIN_ELETHINKTIME); + + return 0; +} + +void do_final_elemental(void) { + return; +} diff --git a/src/map/elemental.h b/src/map/elemental.h new file mode 100644 index 000000000..9f8ef1e22 --- /dev/null +++ b/src/map/elemental.h @@ -0,0 +1,95 @@ +// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#ifndef _ELEMENTAL_H_ +#define _ELEMENTAL_H_ + +#include "status.h" // struct status_data, struct status_change +#include "unit.h" // struct unit_data + +#define MIN_ELETHINKTIME 100 +#define MIN_ELEDISTANCE 2 +#define MAX_ELEDISTANCE 6 + +#define EL_MODE_AGGRESSIVE (MD_CANMOVE|MD_AGGRESSIVE|MD_CANATTACK) +#define EL_MODE_ASSIST (MD_CANMOVE|MD_ASSIST) +#define EL_MODE_PASSIVE MD_CANMOVE + +#define EL_SKILLMODE_PASIVE 0x1 +#define EL_SKILLMODE_ASSIST 0x2 +#define EL_SKILLMODE_AGGRESSIVE 0x4 + +struct elemental_skill { + unsigned short id, lv; + short mode; +}; + +struct s_elemental_db { + int class_; + char sprite[NAME_LENGTH], name[NAME_LENGTH]; + unsigned short lv; + short range2, range3; + struct status_data status; + struct view_data vd; + struct elemental_skill skill[MAX_ELESKILLTREE]; +}; + +extern struct s_elemental_db elemental_db[MAX_ELEMENTAL_CLASS]; + +struct elemental_data { + struct block_list bl; + struct unit_data ud; + struct view_data *vd; + struct status_data base_status, battle_status; + struct status_change sc; + struct regen_data regen; + + struct s_elemental_db *db; + struct s_elemental elemental; + char blockskill[MAX_SKILL]; + + struct map_session_data *master; + int summon_timer; + int skill_timer; + + unsigned last_thinktime, last_linktime; + short min_chase; + int target_id, attacked_id; +}; + +bool elemental_class(int class_); +struct view_data * elemental_get_viewdata(int class_); + +int elemental_create(struct map_session_data *sd, int class_, unsigned int lifetime); +int elemental_data_received(struct s_elemental *ele, bool flag); +int elemental_save(struct elemental_data *ed); + +int elemental_change_mode_ack(struct elemental_data *ed, int mode); +int elemental_change_mode(struct elemental_data *ed, int mode); + +void elemental_damage(struct elemental_data *ed, struct block_list *src, int hp, int sp); +void elemental_heal(struct elemental_data *ed, int hp, int sp); +int elemental_dead(struct elemental_data *ed, struct block_list *src); + +int elemental_delete(struct elemental_data *ed, int reply); +void elemental_summon_stop(struct elemental_data *ed); + +int elemental_get_lifetime(struct elemental_data *ed); + +int elemental_unlocktarget(struct elemental_data *ed); +int elemental_skillnotok(int skillid, struct elemental_data *ed); +int elemental_set_target( struct map_session_data *sd, struct block_list *bl ); +int elemental_clean_single_effect(struct elemental_data *ed, int skill_num); +int elemental_clean_effect(struct elemental_data *ed); +int elemental_action(struct elemental_data *ed, struct block_list *bl, unsigned int tick); + +#define elemental_stop_walking(ed, type) unit_stop_walking(&(ed)->bl, type) +#define elemental_stop_attack(ed) unit_stop_attack(&(ed)->bl) + +int read_elemental_skilldb(void); +void reload_elementaldb(void); +void reload_elemental_skilldb(void); +int do_init_elemental(void); +void do_final_elemental(void); + +#endif /* _ELEMENTAL_H_ */ diff --git a/src/map/intif.c b/src/map/intif.c index 78f3d585c..ce0ad8e6a 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -21,6 +21,7 @@ #include "atcommand.h" #include "mercenary.h" #include "homunculus.h" +#include "elemental.h" #include "mail.h" #include "quest.h" @@ -40,7 +41,7 @@ static const int packet_len_table[]={ -1, 0, 0,14, 0, 0, 0, 0, -1,74,-1,11, 11,-1, 0, 0, //0x3840 -1,-1, 7, 7, 7,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3850 Auctions [Zephyrus] -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3860 Quests [Kevin] [Inkfish] - -1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3870 Mercenaries [Zephyrus] + -1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, 3, 0, //0x3870 Mercenaries [Zephyrus] / Elemental [pakpil] 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3880 -1,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3890 Homunculus [albator] }; @@ -1988,6 +1989,94 @@ int intif_parse_mercenary_saved(int fd) return 0; } +/*========================================== + * Elemental's System + *------------------------------------------*/ +int intif_elemental_create(struct s_elemental *ele) +{ + int size = sizeof(struct s_elemental) + 4; + + if( CheckForCharServer() ) + return 0; + + WFIFOHEAD(inter_fd,size); + WFIFOW(inter_fd,0) = 0x307c; + WFIFOW(inter_fd,2) = size; + memcpy(WFIFOP(inter_fd,4), ele, sizeof(struct s_elemental)); + WFIFOSET(inter_fd,size); + return 0; +} + +int intif_parse_elemental_received(int fd) +{ + int len = RFIFOW(fd,2) - 5; + if( sizeof(struct s_elemental) != len ) + { + if( battle_config.etc_log ) + ShowError("intif: create elemental data size error %d != %d\n", sizeof(struct s_elemental), len); + return 0; + } + + elemental_data_received((struct s_elemental*)RFIFOP(fd,5), RFIFOB(fd,4)); + return 0; +} + +int intif_elemental_request(int ele_id, int char_id) +{ + if (CheckForCharServer()) + return 0; + + WFIFOHEAD(inter_fd,10); + WFIFOW(inter_fd,0) = 0x307d; + WFIFOL(inter_fd,2) = ele_id; + WFIFOL(inter_fd,6) = char_id; + WFIFOSET(inter_fd,10); + return 0; +} + +int intif_elemental_delete(int ele_id) +{ + if (CheckForCharServer()) + return 0; + + WFIFOHEAD(inter_fd,6); + WFIFOW(inter_fd,0) = 0x307e; + WFIFOL(inter_fd,2) = ele_id; + WFIFOSET(inter_fd,6); + return 0; +} + +int intif_parse_elemental_deleted(int fd) +{ + if( RFIFOB(fd,2) != 1 ) + ShowError("Elemental data delete failure\n"); + + return 0; +} + +int intif_elemental_save(struct s_elemental *ele) +{ + int size = sizeof(struct s_elemental) + 4; + + if( CheckForCharServer() ) + return 0; + + WFIFOHEAD(inter_fd,size); + WFIFOW(inter_fd,0) = 0x307f; + WFIFOW(inter_fd,2) = size; + memcpy(WFIFOP(inter_fd,4), ele, sizeof(struct s_elemental)); + WFIFOSET(inter_fd,size); + return 0; +} + +int intif_parse_elemental_saved(int fd) +{ + if( RFIFOB(fd,2) != 1 ) + ShowError("Elemental data save failure\n"); + + return 0; +} + //----------------------------------------------------------------- // inter serverからの通信 // エラーがあれば0(false)を返すこと @@ -2076,7 +2165,11 @@ int intif_parse(int fd) case 0x3870: intif_parse_mercenary_received(fd); break; case 0x3871: intif_parse_mercenary_deleted(fd); break; case 0x3872: intif_parse_mercenary_saved(fd); break; - +// Elemental System + case 0x387c: intif_parse_elemental_received(fd); break; + case 0x387d: intif_parse_elemental_deleted(fd); break; + case 0x387e: intif_parse_elemental_saved(fd); break; + case 0x3880: intif_parse_CreatePet(fd); break; case 0x3881: intif_parse_RecvPetData(fd); break; case 0x3882: intif_parse_SavePetOk(fd); break; diff --git a/src/map/intif.h b/src/map/intif.h index 847523593..c5f6cb158 100644 --- a/src/map/intif.h +++ b/src/map/intif.h @@ -11,6 +11,7 @@ struct guild_position; struct s_pet; struct s_homunculus; struct s_mercenary; +struct s_elemental; struct mail_message; struct auction_data; @@ -97,6 +98,11 @@ int intif_Auction_register(struct auction_data *auction); int intif_Auction_cancel(int char_id, unsigned int auction_id); int intif_Auction_close(int char_id, unsigned int auction_id); int intif_Auction_bid(int char_id, const char* name, unsigned int auction_id, int bid); +// ELEMENTAL SYSTEM +int intif_elemental_create(struct s_elemental *ele); +int intif_elemental_request(int ele_id, int char_id); +int intif_elemental_delete(int ele_id); +int intif_elemental_save(struct s_elemental *ele); int CheckForCharServer(void); diff --git a/src/map/itemdb.h b/src/map/itemdb.h index f2e6ae61d..390954e3f 100644 --- a/src/map/itemdb.h +++ b/src/map/itemdb.h @@ -160,6 +160,7 @@ struct item_data* itemdb_exists(int nameid); #define itemdb_is_poison(n) (n >= 12717 && n <= 12724) #define itemid_isgemstone(id) ( (id) >= ITEMID_YELLOW_GEMSTONE && (id) <= ITEMID_BLUE_GEMSTONE ) #define itemdb_iscashfood(id) ( (id) >= 12202 && (id) <= 12207 ) +#define itemdb_is_GNbomb(n) (n >= 13260 && n <= 13267) const char* itemdb_typename(int type); int itemdb_group_bonus(struct map_session_data* sd, int itemid); diff --git a/src/map/map.c b/src/map/map.c index fd0d43aa4..d0b454a52 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -41,6 +41,7 @@ #include "homunculus.h" #include "instance.h" #include "mercenary.h" +#include "elemental.h" #include "atcommand.h" #include "log.h" #include "mail.h" @@ -1722,8 +1723,14 @@ int map_quit(struct map_session_data *sd) // Return loot to owner if( sd->pd ) pet_lootitem_drop(sd->pd, sd); + if( sd->state.storage_flag == 1 ) sd->state.storage_flag = 0; // No need to Double Save Storage on Quit. + if( sd->ed ) { + elemental_clean_effect(sd->ed); + unit_remove_map(&sd->ed->bl,CLR_TELEPORT); + } + unit_remove_map_pc(sd,CLR_TELEPORT); if( map[sd->bl.m].instance_id ) @@ -3588,6 +3595,7 @@ void do_final(void) do_final_unit(); do_final_battleground(); do_final_duel(); + do_final_elemental(); map_db->destroy(map_db, map_db_final); @@ -3914,7 +3922,8 @@ int do_init(int argc, char *argv[]) do_init_unit(); do_init_battleground(); do_init_duel(); - + do_init_elemental(); + npc_event_do_oninit(); // npcのOnInitイベント?行 if( console ) diff --git a/src/map/map.h b/src/map/map.h index 660174055..b78e71b0c 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -233,12 +233,13 @@ enum bl_type { BL_SKILL = 0x040, BL_NPC = 0x080, BL_CHAT = 0x100, - + BL_ELEM = 0x200, + BL_ALL = 0xFFF, }; //For common mapforeach calls. Since pets cannot be affected, they aren't included here yet. -#define BL_CHAR (BL_PC|BL_MOB|BL_HOM|BL_MER) +#define BL_CHAR (BL_PC|BL_MOB|BL_HOM|BL_MER|BL_ELEM) enum npc_subtype { WARP, SHOP, SCRIPT, CASHSHOP }; @@ -738,6 +739,7 @@ typedef struct skill_unit TBL_SKILL; typedef struct pet_data TBL_PET; typedef struct homun_data TBL_HOM; typedef struct mercenary_data TBL_MER; +typedef struct elemental_data TBL_ELEM; #define BL_CAST(type_, bl) \ ( ((bl) == (struct block_list*)NULL || (bl)->type != (type_)) ? (T ## type_ *)NULL : (T ## type_ *)(bl) ) diff --git a/src/map/mob.c b/src/map/mob.c index 95b357e4f..ee5bda342 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -23,6 +23,7 @@ #include "mob.h" #include "homunculus.h" #include "mercenary.h" +#include "elemental.h" #include "guild.h" #include "itemdb.h" #include "skill.h" @@ -1896,6 +1897,15 @@ void mob_log_damage(struct mob_data *md, struct block_list *src, int damage) md->attacked_id = src->id; break; } + case BL_ELEM: + { + struct elemental_data *ele = (TBL_ELEM*)src; + if( ele->master ) + char_id = ele->master->status.char_id; + if( damage ) + md->attacked_id = src->id; + break; + } default: //For all unhandled types. md->attacked_id = src->id; } diff --git a/src/map/npc_chat.c b/src/map/npc_chat.c index 77c875a7e..84a6fab22 100644 --- a/src/map/npc_chat.c +++ b/src/map/npc_chat.c @@ -14,7 +14,7 @@ #include "pc.h" // struct map_session_data #include "script.h" // set_var() -#include <pcre.h> +#include "pcre.h" #include <stdio.h> #include <stdlib.h> diff --git a/src/map/pc.c b/src/map/pc.c index 9e548b038..7a0fc67fa 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -29,6 +29,7 @@ #include "homunculus.h" #include "instance.h" #include "mercenary.h" +#include "elemental.h" #include "npc.h" // fake_nd #include "pet.h" // pet_unlocktarget() #include "party.h" // party_search() @@ -1213,7 +1214,9 @@ int pc_reg_received(struct map_session_data *sd) intif_homunculus_requestload(sd->status.account_id, sd->status.hom_id); if( sd->status.mer_id > 0 ) intif_mercenary_request(sd->status.mer_id, sd->status.char_id); - + if( sd->status.ele_id > 0 ) + intif_elemental_request(sd->status.ele_id, sd->status.char_id); + map_addiddb(&sd->bl); map_delnickdb(sd->status.char_id, sd->status.name); if (!chrif_auth_finished(sd)) @@ -6155,6 +6158,9 @@ void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int h if( sd->status.pet_id > 0 && sd->pd && battle_config.pet_damage_support ) pet_target_check(sd,src,1); + if( sd->status.ele_id > 0 ) + elemental_set_target(sd,src); + sd->canlog_tick = gettick(); } @@ -6189,6 +6195,9 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) if( sd->md ) merc_delete(sd->md, 3); // Your mercenary soldier has ran away. + if( sd->ed ) + elemental_delete(sd->ed, 0); + // Leave duel if you die [LuzZza] if(battle_config.duel_autoleave_when_die) { if(sd->duel_group > 0) diff --git a/src/map/pc.h b/src/map/pc.h index e74d4a5d0..39ac3100a 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -205,7 +205,7 @@ struct map_session_data { short cook_mastery; // range: [0,1999] [Inkfish] unsigned char blockskill[MAX_SKILL]; int cloneskill_id, reproduceskill_id; - int menuskill_id, menuskill_val; + int menuskill_id, menuskill_val, menuskill_val2; int invincible_timer; unsigned int canlog_tick; @@ -377,6 +377,7 @@ struct map_session_data { struct pet_data *pd; struct homun_data *hd; // [blackhole89] struct mercenary_data *md; + struct elemental_data *ed; struct{ int m; //-1 - none, other: map index corresponding to map name. diff --git a/src/map/script.c b/src/map/script.c index d58233dc5..a2ffb54a0 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -7835,7 +7835,7 @@ BUILDIN_FUNC(cooking) return 0; trigger=script_getnum(st,2); - clif_cooking_list(sd, trigger); + clif_cooking_list(sd, trigger, AM_PHARMACY, 1, 1); return 0; } /*========================================== diff --git a/src/map/skill.c b/src/map/skill.c index d3ddc5562..252bb4bf1 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -20,6 +20,7 @@ #include "pet.h" #include "homunculus.h" #include "mercenary.h" +#include "elemental.h" #include "mob.h" #include "npc.h" #include "battle.h" @@ -49,6 +50,8 @@ #define MC_SKILLRANGEMAX (MC_SKILLRANGEMIN+MAX_MERCSKILL) #define HM_SKILLRANGEMIN 700 #define HM_SKILLRANGEMAX (HM_SKILLRANGEMIN+MAX_HOMUNSKILL) +#define EL_SKILLRANGEMIN MC_SKILLRANGEMAX + 1 +#define EL_SKILLRANGEMAX EL_SKILLRANGEMIN + MAX_ELEMENTALSKILL static struct eri *skill_unit_ers = NULL; //For handling skill_unit's [Skotlex] static struct eri *skill_timer_ers = NULL; //For handling skill_timerskills [Skotlex] @@ -132,20 +135,19 @@ int skill_get_index( int id ) // avoid ranges reserved for mapping guild/homun/mercenary skills if( (id >= GD_SKILLRANGEMIN && id <= GD_SKILLRANGEMAX) || (id >= HM_SKILLRANGEMIN && id <= HM_SKILLRANGEMAX) - || (id >= MC_SKILLRANGEMIN && id <= MC_SKILLRANGEMAX) ) + || (id >= MC_SKILLRANGEMIN && id <= MC_SKILLRANGEMAX) + || (id >= EL_SKILLRANGEMIN && id <= EL_SKILLRANGEMAX) ) return 0; - + // map skill id to skill db index if( id >= GD_SKILLBASE ) id = GD_SKILLRANGEMIN + id - GD_SKILLBASE; - else - if( id >= MC_SKILLBASE ) + else if( id >= EL_SKILLBASE ) + id = EL_SKILLRANGEMIN + id - EL_SKILLBASE; + else if( id >= MC_SKILLBASE ) id = MC_SKILLRANGEMIN + id - MC_SKILLBASE; - else - if( id >= HM_SKILLBASE ) + else if( id >= HM_SKILLBASE ) id = HM_SKILLRANGEMIN + id - HM_SKILLBASE; - else - ; // identity // validate result if( id <= 0 || id >= MAX_SKILL_DB ) @@ -1294,6 +1296,50 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int status_change_end(bl, SC_UNLIMITEDHUMMINGVOICE, INVALID_TIMER); } break; + case SO_EARTHGRAVE: + sc_start(bl, SC_BLEEDING, 5 * skilllv, skilllv, skill_get_time2(skillid, skilllv)); // Need official rate. [LimitLine] + break; + case SO_DIAMONDDUST: + rate = 5 + 5 * skilllv; + if( sc && sc->data[SC_COOLER_OPTION] ) + rate += rate * sc->data[SC_COOLER_OPTION]->val2 / 100; + sc_start(bl, SC_CRYSTALIZE, rate, skilllv, skill_get_time2(skillid, skilllv)); + break; + case SO_VARETYR_SPEAR: + sc_start(bl, SC_STUN, 5 + 5 * skilllv, skilllv, skill_get_time2(skillid, skilllv)); + break; + case GN_SLINGITEM_RANGEMELEEATK: + if( sd ) { + switch( sd->itemid ) { // Starting SCs here instead of do it in skill_additional_effect to simplify the code. + case 13261: + sc_start(bl, SC_STUN, 100, skilllv, skill_get_time2(GN_SLINGITEM, skilllv)); + sc_start(bl, SC_BLEEDING, 100, skilllv, skill_get_time2(GN_SLINGITEM, skilllv)); + break; + case 13262: + sc_start(bl, SC_MELON_BOMB, 100, skilllv, skill_get_time(GN_SLINGITEM, skilllv)); // Reduces ASPD and moviment speed + break; + case 13264: + sc_start(bl, SC_BANANA_BOMB, 100, skilllv, skill_get_time(GN_SLINGITEM, skilllv)); // Reduces LUK タ?Needed confirm it, may be it's bugged in kRORE? + sc_start(bl, SC_BANANA_BOMB_SITDOWN, 75, skilllv, skill_get_time(GN_SLINGITEM_RANGEMELEEATK,skilllv)); // Sitdown for 3 seconds. + break; + } + sd->itemid = -1; + } + break; + case EL_WIND_SLASH: // Non confirmed rate. + sc_start(bl, SC_BLEEDING, 25, skilllv, skill_get_time(skillid,skilllv)); + break; + case EL_STONE_HAMMER: + rate = 10 * skilllv; + sc_start(bl, SC_STUN, rate, skilllv, skill_get_time(skillid,skilllv)); + break; + case EL_ROCK_CRUSHER: + case EL_ROCK_CRUSHER_ATK: + sc_start(bl,status_skill2sc(skillid),50,skilllv,skill_get_time(EL_ROCK_CRUSHER,skilllv)); + break; + case EL_TYPOON_MIS: + sc_start(bl,SC_SILENCE,10*skilllv,skilllv,skill_get_time(skillid,skilllv)); + break; } if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai) @@ -2303,8 +2349,32 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds break; case LG_OVERBRAND_BRANDISH: case LG_OVERBRAND_PLUSATK: + case EL_FIRE_BOMB: + case EL_FIRE_BOMB_ATK: + case EL_FIRE_WAVE: + case EL_FIRE_WAVE_ATK: + case EL_FIRE_MANTLE: + case EL_CIRCLE_OF_FIRE: + case EL_FIRE_ARROW: + case EL_ICE_NEEDLE: + case EL_WATER_SCREW: + case EL_WATER_SCREW_ATK: + case EL_WIND_SLASH: + case EL_TIDAL_WEAPON: + case EL_ROCK_CRUSHER: + case EL_ROCK_CRUSHER_ATK: + case EL_HURRICANE: + case EL_HURRICANE_ATK: + case EL_TYPOON_MIS: + case EL_TYPOON_MIS_ATK: dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skillid,-1,5); break; + case GN_SLINGITEM_RANGEMELEEATK: + dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,GN_SLINGITEM,-2,6); + break; + case EL_STONE_RAIN: + dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skillid,-1,(flag&1)?8:5); + break; case WM_SEVERE_RAINSTORM_MELEE: dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,skilllv,5); break; @@ -2314,7 +2384,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds break; case AB_DUPLELIGHT_MELEE: case AB_DUPLELIGHT_MAGIC: - dmg.amotion = 300; + dmg.amotion = 300;/* makes the damage value not overlap with previous damage (when displayed by the client) */ default: if( flag&SD_ANIMATION && dmg.div_ < 2 ) //Disabling skill animation doesn't works on multi-hit. type = 5; @@ -2348,6 +2418,12 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds case WM_SEVERE_RAINSTORM_MELEE: copy_skill = WM_SEVERE_RAINSTORM; break; + case GN_CRAZYWEED_ATK: + copy_skill = GN_CRAZYWEED; + break; + case GN_HELLS_PLANT_ATK: + copy_skill = GN_HELLS_PLANT; + break; case LG_OVERBRAND_BRANDISH: case LG_OVERBRAND_PLUSATK: copy_skill = LG_OVERBRAND; @@ -2446,6 +2522,8 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds case SC_TRIANGLESHOT: case LG_OVERBRAND: case SR_KNUCKLEARROW: + case GN_WALLOFTHORN: + case EL_FIRE_MANTLE: direction = unit_getdir(bl);// backwards break; case WL_CRIMSONROCK: @@ -3051,6 +3129,10 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data) case SR_KNUCKLEARROW: skill_attack(BF_WEAPON, src, src, target, skl->skill_id, skl->skill_lv, tick, skl->flag|SD_LEVEL); break; + case GN_SPORE_EXPLOSION: + map_foreachinrange(skill_area_sub, target, skill_get_splash(skl->skill_id, skl->skill_lv), BL_CHAR, + src, skl->skill_id, skl->skill_lv, 0, skl->flag|1|BCT_ENEMY, skill_castend_damage_id); + break; default: skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); break; @@ -3315,6 +3397,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int case SR_GENTLETOUCH_QUIET: case WM_SEVERE_RAINSTORM_MELEE: case WM_GREAT_ECHO: + case GN_SLINGITEM_RANGEMELEEATK: skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); break; @@ -3538,8 +3621,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int case SR_RIDEINLIGHTNING: case WM_REVERBERATION: case WM_SOUND_OF_DESTRUCTION: - if( flag&1 ) - { //Recursive invocation + case SO_VARETYR_SPEAR: + case GN_CART_TORNADO: + case GN_CARTCANNON: + if( flag&1 ) {//Recursive invocation // skill_area_temp[0] holds number of targets in area // skill_area_temp[1] holds the id of the original target // skill_area_temp[2] counts how many targets have already been processed @@ -3550,20 +3635,26 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int sflag |= SD_ANIMATION; // original target gets no animation (as well as all NPC skills) heal = skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, sflag); - if( skillid == NPC_VAMPIRE_GIFT && heal > 0 ) - { + if( skillid == NPC_VAMPIRE_GIFT && heal > 0 ) { clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1); status_heal(src,heal,0,0); } - } - else { - if( skillid == NJ_BAKUENRYU || skillid == LG_EARTHDRIVE ) - clif_skill_nodamage(src,bl,skillid,skilllv,1); - else if( skillid == LG_MOONSLASHER ) - clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6); - //FIXME: Isn't EarthQuake a ground skill after all? - else if( skillid == NPC_EARTHQUAKE ) - skill_addtimerskill(src,tick+250,src->id,0,0,skillid,skilllv,2,flag|BCT_ENEMY|SD_SPLASH|1); + } else { + switch ( skillid ) { + case NJ_BAKUENRYU: + case LG_EARTHDRIVE: + case GN_CARTCANNON: + clif_skill_nodamage(src,bl,skillid,skilllv,1); + break; + case LG_MOONSLASHER: + clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6); + break; + case NPC_EARTHQUAKE://FIXME: Isn't EarthQuake a ground skill after all? + skill_addtimerskill(src,tick+250,src->id,0,0,skillid,skilllv,2,flag|BCT_ENEMY|SD_SPLASH|1); + break; + default: + break; + } skill_area_temp[0] = 0; skill_area_temp[1] = bl->id; @@ -3777,13 +3868,15 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int case NPC_SMOKING: case GS_FLING: case NJ_ZENYNAGE: + case GN_THORNS_TRAP: + case GN_BLOOD_SUCKER: + case GN_HELLS_PLANT_ATK: skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag); break; /** * Rune Knight **/ - case RK_DRAGONBREATH: - { + case RK_DRAGONBREATH: { struct status_change *tsc = NULL; if( (tsc = status_get_sc(bl)) && (tsc->data[SC_HIDING] )) { clif_skill_nodamage(src,src,skillid,skilllv,1); @@ -4237,7 +4330,135 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int sc_start(bl,status_skill2sc(skillid),100,skilllv,skill_get_time(skillid,skilllv)); break; - case 0: + case SO_POISON_BUSTER: { + struct status_change *tsc = status_get_sc(bl); + if( tsc && tsc->data[SC_POISON] ) { + skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, flag); + status_change_end(bl, SC_POISON, -1); + } + else if( sd ) + clif_skill_fail(sd, skillid, 0, 0); + } + break; + + case GN_SPORE_EXPLOSION: + if( flag&1 ) + skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, flag); + else { + clif_skill_nodamage(src, bl, skillid, 0, 1); + skill_addtimerskill(src, gettick() + skill_get_time(skillid, skilllv) - 1000, bl->id, 0, 0, skillid, skilllv, 0, 0); + } + break; + + case GN_CRAZYWEED: + if( rand()%100 < 75 ) { + if( bl->type == BL_SKILL ) { + struct skill_unit *su = (struct skill_unit *)bl; + if( !su ) + break; + if( skill_get_inf2(su->group->skill_id)&INF2_TRAP ) {// Still need confirm it. + skill_delunit(su); + break; + } + + switch( su->group->skill_id ) {// Unconfirmed list, based on info from irowiki. + case GN_WALLOFTHORN: + case GN_THORNS_TRAP: + case SC_BLOODYLUST: + case SC_CHAOSPANIC: + case SC_MAELSTROM: + case WZ_FIREPILLAR: + case SA_LANDPROTECTOR: + case SA_VOLCANO: + case SA_DELUGE: + case SA_VIOLENTGALE: + case MG_SAFETYWALL: + case AL_PNEUMA: + skill_delunit(su); + break; + } + break; + } + else + skill_attack(BF_WEAPON,src,src,bl,GN_CRAZYWEED_ATK,skilllv,tick,flag); + } + break; + + case EL_FIRE_BOMB: + case EL_FIRE_WAVE: + case EL_WATER_SCREW: + case EL_HURRICANE: + case EL_TYPOON_MIS: + if( flag&1 ) + skill_attack(skill_get_type(skillid+1),src,src,bl,skillid+1,skilllv,tick,flag); + else { + int i = skill_get_splash(skillid,skilllv); + clif_skill_nodamage(src,battle_get_master(src),skillid,skilllv,1); + clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6); + if( rand()%100 < 30 ) + map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skillid,skilllv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); + else + skill_attack(skill_get_type(skillid),src,src,bl,skillid,skilllv,tick,flag); + } + break; + + case EL_ROCK_CRUSHER: + clif_skill_nodamage(src,battle_get_master(src),skillid,skilllv,1); + clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6); + if( rand()%100 < 50 ) + skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); + else + skill_attack(BF_WEAPON,src,src,bl,EL_ROCK_CRUSHER_ATK,skilllv,tick,flag); + break; + + case EL_STONE_RAIN: + if( flag&1 ) + skill_attack(skill_get_type(skillid),src,src,bl,skillid,skilllv,tick,flag); + else { + int i = skill_get_splash(skillid,skilllv); + clif_skill_nodamage(src,battle_get_master(src),skillid,skilllv,1); + clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6); + if( rand()%100 < 30 ) + map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skillid,skilllv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); + else + skill_attack(skill_get_type(skillid),src,src,bl,skillid,skilllv,tick,flag); + } + break; + + case EL_FIRE_ARROW: + case EL_ICE_NEEDLE: + case EL_WIND_SLASH: + case EL_STONE_HAMMER: + clif_skill_nodamage(src,battle_get_master(src),skillid,skilllv,1); + clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6); + skill_attack(skill_get_type(skillid),src,src,bl,skillid,skilllv,tick,flag); + break; + + case EL_TIDAL_WEAPON: + if( src->type == BL_ELEM ) { + struct elemental_data *ele = BL_CAST(BL_ELEM,src); + struct status_change *sc = status_get_sc(&ele->bl); + struct status_change *tsc = status_get_sc(bl); + sc_type type = status_skill2sc(skillid), type2; + type2 = type-1; + + clif_skill_nodamage(src,battle_get_master(src),skillid,skilllv,1); + clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6); + if( (sc && sc->data[type2]) || (tsc && tsc->data[type]) ) { + elemental_clean_single_effect(ele, skillid); + } + if( rand()%100 < 50 ) + skill_attack(skill_get_type(skillid),src,src,bl,skillid,skilllv,tick,flag); + else { + sc_start(src,type2,100,skilllv,skill_get_time(skillid,skilllv)); + sc_start(battle_get_master(src),type,100,ele->bl.id,skill_get_time(skillid,skilllv)); + } + clif_skill_nodamage(src,src,skillid,skilllv,1); + } + break; + + + case 0:/* no skill - basic/normal attack */ if(sd) { if (flag & 3){ if (bl->id != skill_area_temp[1]) @@ -4895,9 +5116,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in case SR_GENTLETOUCH_ENERGYGAIN: case SR_GENTLETOUCH_CHANGE: case SR_GENTLETOUCH_REVITALIZE: + case GN_CARTBOOST: clif_skill_nodamage(src,bl,skillid,skilllv, sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); break; + + case SO_STRIKING: + if (sd) { + int bonus = 25 + 10 * skilllv; + bonus += (pc_checkskill(sd, SA_FLAMELAUNCHER)+pc_checkskill(sd, SA_FROSTWEAPON)+pc_checkskill(sd, SA_LIGHTNINGLOADER)+pc_checkskill(sd, SA_SEISMICWEAPON))*5; + clif_skill_nodamage( src, bl, skillid, skilllv, sc_start2(bl, type, 100, skilllv, bonus, skill_get_time(skillid,skilllv)) ); + } + break; + case NPC_STOP: if( clif_skill_nodamage(src,bl,skillid,skilllv, sc_start2(bl,type,100,skilllv,src->id,skill_get_time(skillid,skilllv)) ) ) @@ -5204,6 +5435,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in status_change_end(src,SC_OVERHEAT,-1); break; case SR_WINDMILL: + case GN_CART_TORNADO: clif_skill_nodamage(src,bl,skillid,skilllv,1); case SR_EARTHSHAKER: case NC_INFRAREDSCAN: @@ -6030,6 +6262,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in break; case SA_CASTCANCEL: + case SO_SPELLFIST: clif_skill_nodamage(src,bl,skillid,skilllv,1); unit_skillcastcancel(src,1); if(sd) { @@ -6037,6 +6270,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in sp = sp * (90 - (skilllv-1)*20) / 100; if(sp < 0) sp = 0; status_zap(src, 0, sp); + if( skillid == SO_SPELLFIST ) + sc_start4(src,type,100,skilllv+1,skilllv,(sd->skillid_old)?sd->skillid_old:MG_FIREBOLT,(sd->skilllv_old)?sd->skilllv_old:skilllv,skill_get_time(skillid,skilllv)); } break; case SA_SPELLBREAKER: @@ -8079,6 +8314,240 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in } break; + case SO_ARRULLO: + if( flag&1 ) + sc_start2(bl, type, 88 + 2 * skilllv, skilllv, 1, skill_get_time(skillid, skilllv)); + else { + clif_skill_nodamage(src, bl, skillid, 0, 1); + map_foreachinrange(skill_area_sub, bl, skill_get_splash(skillid, skilllv), BL_CHAR, + src, skillid, skilllv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); + } + break; + + case SO_SUMMON_AGNI: + case SO_SUMMON_AQUA: + case SO_SUMMON_VENTUS: + case SO_SUMMON_TERA: + if( sd ) { + int elemental_class = skill_get_elemental_type(skillid,skilllv); + + // Remove previous elemental fisrt. + if( sd->ed && elemental_delete(sd->ed,0) ) { + clif_skill_fail(sd,skillid,0,0); + break; + } + // Summoning the new one. + if( !elemental_create(sd,elemental_class,skill_get_time(skillid,skilllv)) ) { + clif_skill_fail(sd,skillid,0,0); + break; + } + clif_skill_nodamage(src,bl,skillid,skilllv,1); + } + break; + + case SO_EL_CONTROL: + if( sd ) { + int mode = EL_MODE_PASSIVE; // Standard mode. + if( !sd->ed ) { + clif_skill_fail(sd,skillid,0,0); + break; + } + if( skilllv == 4 ) {// At level 4 delete elementals. + if( elemental_delete(sd->ed, 0) ) + clif_skill_fail(sd,skillid,0,0); + break; + } + switch( skilllv ) {// Select mode bassed on skill level used. + case 1: mode = EL_MODE_PASSIVE; break; + case 2: mode = EL_MODE_ASSIST; break; + case 3: mode = EL_MODE_AGGRESSIVE; break; + } + if( !elemental_change_mode(sd->ed,mode) ) { + clif_skill_fail(sd,skillid,0,0); + break; + } + clif_skill_nodamage(src,bl,skillid,skilllv,1); + } + break; + + case SO_EL_ACTION: + if( sd ) { + if( !sd->ed ) + break; + elemental_action(sd->ed, bl, tick); + clif_skill_nodamage(src,bl,skillid,skilllv,1); + } + break; + + case SO_EL_CURE: + if( sd ) { + struct elemental_data *ed = sd->ed; + int s_hp = sd->battle_status.hp * 10 / 100, s_sp = sd->battle_status.sp * 10 / 100; + int e_hp, e_sp; + if( !ed ) { + clif_skill_fail(sd,skillid,0,0); + break; + } + if( !status_charge(&sd->bl,s_hp,s_sp) ) { + clif_skill_fail(sd,skillid,0,0); + break; + } + e_hp = ed->battle_status.max_hp * 10 / 100; + e_sp = ed->battle_status.max_sp * 10 / 100; + status_heal(&ed->bl,e_hp,e_sp,3); + clif_skill_nodamage(src,&ed->bl,skillid,skilllv,1); + } + break; + + case GN_CHANGEMATERIAL: + case SO_EL_ANALYSIS: + if( sd ) { + clif_skill_nodamage(src,bl,skillid,skilllv,1); + clif_skill_itemlistwindow(sd,skillid,skilllv); + } + break; + + case GN_BLOOD_SUCKER: + if( skill_unitsetting(src, skillid, skilllv, bl->x, bl->y, 0) ) { // Do we need this unit setting? [Xazax] + clif_skill_nodamage(src, bl, skillid, skilllv, 1); + sc_start2(bl, type, 100, skilllv, src->id, skill_get_time(skillid,skilllv)); + } else if( sd ) { + clif_skill_fail(sd, skillid, 0, 0); + break; + } + break; + + case GN_MANDRAGORA: + if( flag&1 ) { + if ( clif_skill_nodamage(bl, src, skillid, skilllv, + sc_start(bl, type, 35 + 10 * skilllv, skilllv, skill_get_time(skillid, skilllv))) ) + status_zap(bl, 0, status_get_max_sp(bl) / 100 * 25 + 5 * skilllv); + } else + map_foreachinrange(skill_area_sub, bl, skill_get_splash(skillid, skilllv), BL_CHAR, + src, skillid, skilllv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); + break; + + case GN_SLINGITEM: + if( sd ) { + short ammo_id; + i = sd->equip_index[EQI_AMMO]; + if( i <= 0 ) + break; // No ammo. + ammo_id = sd->inventory_data[i]->nameid; + if( ammo_id <= 0 ) + break; + sd->itemid = ammo_id; + if( itemdb_is_GNbomb(ammo_id) ) { + if(battle_check_target(src,bl,BCT_ENEMY) > 0) {// Only attack if the target is an enemy. + if( ammo_id == 13263 ) + map_foreachincell(skill_area_sub,bl->m,bl->x,bl->y,BL_CHAR,src,GN_SLINGITEM_RANGEMELEEATK,skilllv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); + else + skill_attack(BF_WEAPON,src,src,bl,GN_SLINGITEM_RANGEMELEEATK,skilllv,tick,flag); + } else //Otherwise, it fails, shows animation and removes items. + clif_skill_fail(sd,GN_SLINGITEM_RANGEMELEEATK,0xa,0); + } else { + struct script_code *script = sd->inventory_data[i]->script; + if( !script ) + break; + if( dstsd ) + run_script(script,0,dstsd->bl.id,fake_nd->bl.id); + else + run_script(script,0,src->id,0); + } + } + clif_skill_nodamage(src,bl,skillid,skilllv,1); + clif_skill_nodamage(src,bl,skillid,skilllv,1);// This packet is received twice actually, I think it is to show the animation. + break; + + case GN_MIX_COOKING: + if( sd ) { + clif_cooking_list(sd,27,skillid,(skilllv == 2) ? 10 : 1,6); + clif_skill_nodamage(src,bl,skillid,skilllv,1); + } + break; + + case GN_MAKEBOMB: + if( sd ) { + clif_cooking_list(sd,28,skillid,(skilllv==2) ? 10 : 1,5); + clif_skill_nodamage(src,bl,skillid,skilllv,1); + } + break; + + case GN_S_PHARMACY: + if( sd ) { + sd->skillid_old = skillid; + sd->skilllv_old = skilllv; + clif_cooking_list(sd,29,skillid,1,6); + clif_skill_nodamage(src,bl,skillid,skilllv,1); + } + break; + + case EL_CIRCLE_OF_FIRE: + case EL_PYROTECHNIC: + case EL_HEATER: + case EL_TROPIC: + case EL_AQUAPLAY: + case EL_COOLER: + case EL_CHILLY_AIR: + case EL_GUST: + case EL_BLAST: + case EL_WILD_STORM: + case EL_PETROLOGY: + case EL_CURSED_SOIL: + case EL_UPHEAVAL: + case EL_FIRE_CLOAK: + case EL_WATER_DROP: + case EL_WIND_CURTAIN: + case EL_SOLID_SKIN: + case EL_STONE_SHIELD: + case EL_WIND_STEP: { + struct elemental_data *ele = BL_CAST(BL_ELEM, src); + if( ele ) { + sc_type type2 = type-1; + struct status_change *sc = status_get_sc(&ele->bl); + + if( (sc && sc->data[type2]) || (tsc && tsc->data[type]) ) { + elemental_clean_single_effect(ele, skillid); + } else { + clif_skill_nodamage(src,bl,skillid,skilllv,1); + clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6); + if( skillid == EL_WIND_STEP ) // There aren't telemport, just push to the master. + skill_blown(src,bl,skill_get_blewcount(skillid,skilllv),(map_calc_dir(src,bl->x,bl->y)+4)%8,0); + sc_start(src,type2,100,skilllv,skill_get_time(skillid,skilllv)); + sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)); + } + } + } + break; + + case EL_FIRE_MANTLE: + case EL_WATER_BARRIER: + case EL_ZEPHYR: + case EL_POWER_OF_GAIA: + clif_skill_nodamage(src,src,skillid,skilllv,1); + clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6); + skill_unitsetting(src,skillid,skilllv,bl->x,bl->y,0); + break; + + case EL_WATER_SCREEN: { + struct elemental_data *ele = BL_CAST(BL_ELEM, src); + if( ele ) { + struct status_change *sc = status_get_sc(&ele->bl); + sc_type type2 = type-1; + + clif_skill_nodamage(src,src,skillid,skilllv,1); + if( (sc && sc->data[type2]) || (tsc && tsc->data[type]) ) { + elemental_clean_single_effect(ele, skillid); + } else { + // This not heals at the end. + clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6); + sc_start(src,type2,100,skilllv,skill_get_time(skillid,skilllv)); + sc_start(bl,type,100,src->id,skill_get_time(skillid,skilllv)); + } + } + } + break; + default: ShowWarning("skill_castend_nodamage_id: Unknown skill used:%d\n",skillid); clif_skill_nodamage(src,bl,skillid,skilllv,1); @@ -8142,8 +8611,8 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data) return 0; } - if(ud->skillid != SA_CASTCANCEL ) - {// otherwise handled in unit_skillcastcancel() + if(ud->skillid != SA_CASTCANCEL && + !(ud->skillid == SO_SPELLFIST && (sd && (sd->skillid_old == MG_FIREBOLT || sd->skillid_old == MG_COLDBOLT || sd->skillid_old == MG_LIGHTNINGBOLT))) ) {// otherwise handled in unit_skillcastcancel() if( ud->skilltimer != tid ) { ShowError("skill_castend_id: Timer mismatch %d!=%d!\n", ud->skilltimer, tid); ud->skilltimer = INVALID_TIMER; @@ -8188,6 +8657,11 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data) } ud->skilltimer=tid; return skill_castend_pos(tid,tick,id,data); + case GN_WALLOFTHORN: + ud->skillx = target->x; + ud->skilly = target->y; + ud->skilltimer = tid; + return skill_castend_pos(tid,tick,id,data); } if(ud->skillid == RG_BACKSTAP) { @@ -8736,6 +9210,18 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk case WM_REVERBERATION: case WM_SEVERE_RAINSTORM: case WM_POEMOFNETHERWORLD: + case SO_PSYCHIC_WAVE: + case SO_VACUUM_EXTREME: + case GN_WALLOFTHORN: + case GN_THORNS_TRAP: + case GN_DEMONIC_FIRE: + case GN_HELLS_PLANT: + case SO_EARTHGRAVE: + case SO_DIAMONDDUST: + case SO_FIRE_INSIGNIA: + case SO_WATER_INSIGNIA: + case SO_WIND_INSIGNIA: + case SO_EARTH_INSIGNIA: flag|=1;//Set flag to 1 to prevent deleting ammo (it will be deleted on group-delete). case GS_GROUNDDRIFT: //Ammo should be deleted right away. skill_unitsetting(src,skillid,skilllv,x,y,0); @@ -8768,6 +9254,12 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk map_foreachinarea(skill_graffitiremover,src->m,x-i,y-i,x+i,y+i,BL_SKILL); break; + case SO_CLOUD_KILL: + case SO_WARMER: + flag|=(skillid == SO_WARMER)?8:4; + skill_unitsetting(src,skillid,skilllv,x,y,0); + break; + case WZ_METEOR: { int area = skill_get_splash(skillid, skilllv); short tmpx = 0, tmpy = 0, x1 = 0, y1 = 0; @@ -9131,6 +9623,55 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid,skilllv),BL_CHAR, src, skillid, skilllv, tick, flag|BCT_ENEMY, skill_castend_damage_id); break; + case GN_CRAZYWEED: + i = skill_get_splash(skillid,skilllv); + map_foreachinarea(skill_area_sub,src->m,x-i,y-i,x+i,y+i,BL_CHAR|BL_SKILL, + src,skillid,skilllv,tick,flag|BCT_ENEMY|1, + skill_castend_damage_id); + break; + + case GN_FIRE_EXPANSION: { + int i; + struct unit_data *ud = unit_bl2ud(src); + + if( !ud ) break; + + for( i = 0; i < MAX_SKILLUNITGROUP && ud->skillunit[i]; i ++ ) { + if( ud->skillunit[i]->skill_id == GN_DEMONIC_FIRE && + distance_xy(x, y, ud->skillunit[i]->unit->bl.x, ud->skillunit[i]->unit->bl.y) < 4 ) { + switch( skilllv ) { + case 3: + ud->skillunit[i]->unit_id = UNT_FIRE_EXPANSION_SMOKE_POWDER; + clif_changetraplook(&ud->skillunit[i]->unit->bl, UNT_FIRE_EXPANSION_SMOKE_POWDER); + break; + case 4: + ud->skillunit[i]->unit_id = UNT_FIRE_EXPANSION_TEAR_GAS; + clif_changetraplook(&ud->skillunit[i]->unit->bl, UNT_FIRE_EXPANSION_TEAR_GAS); + break; + case 5: + map_foreachinarea(skill_area_sub, src->m, + ud->skillunit[i]->unit->bl.x - 3, ud->skillunit[i]->unit->bl.y - 3, + ud->skillunit[i]->unit->bl.x + 3, ud->skillunit[i]->unit->bl.y + 3, BL_CHAR, + src, CR_ACIDDEMONSTRATION, sd ? pc_checkskill(sd, CR_ACIDDEMONSTRATION) : skilllv, tick, flag|BCT_ENEMY|1|SD_LEVEL, skill_castend_damage_id); + skill_delunit(ud->skillunit[i]->unit); + break; + default: + ud->skillunit[i]->unit->val2 = skilllv; + ud->skillunit[i]->unit->group->val2 = skilllv; + break; + } + } + } + } + break; + + case SO_FIREWALK: + case SO_ELECTRICWALK: + if( sc && sc->data[type] ) + status_change_end(src,type,-1); + clif_skill_nodamage(src, src ,skillid, skilllv, + sc_start2(src, type, 100, skillid, skilllv, skill_get_time(skillid, skilllv))); + break; default: ShowWarning("skill_castend_pos2: Unknown skill used:%d\n",skillid); @@ -9683,6 +10224,18 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, short skilli if( map_getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) ) return NULL; break; + case SO_CLOUD_KILL: + skill_clear_group(src, 4); + break; + case SO_WARMER: + skill_clear_group(src, 8); + break; + + case GN_WALLOFTHORN: + if( flag&1 ) + limit = 3000; + val3 = (x<<16)|y; + break; } nullpo_retr(NULL, group=skill_initunitgroup(src,layout->count,skillid,skilllv,skill_get_unit_id(skillid,flag&1)+subunt, limit, interval)); @@ -9784,6 +10337,10 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, short skilli case WM_REVERBERATION: val1 = 1; break; + case GN_WALLOFTHORN: + val1 = 1000 * skilllv; // Need official value. [LimitLine] + val2 = src->id; + break; default: if (group->state.song_dance&0x1) val2 = unit_flag&(UF_DANCE|UF_SONG); //Store whether this is a song/dance @@ -10084,7 +10641,10 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns { int count=0; const int x = bl->x, y = bl->y; - + + if( sg->skill_id == GN_WALLOFTHORN && !map_flag_vs(bl->m) ) + break; + //Take into account these hit more times than the timer interval can handle. do skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick+count*sg->interval,0); @@ -10524,6 +11084,86 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns sc_start(bl, type, 100, sg->skill_lv, skill_get_time2(sg->skill_id,sg->skill_lv)); } break; + case UNT_THORNS_TRAP: + if( tsc ) { + if( !sg->val2 ) { + int sec = skill_get_time2(sg->skill_id, sg->skill_lv); + if( status_change_start(bl, type, 10000, sg->skill_lv, 0, 0, 0, sec, 0) ) { + const struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL; + if( td ) + sec = DIFF_TICK(td->tick, tick); + map_moveblock(bl, src->bl.x, src->bl.y, tick); + clif_fixpos(bl); + sg->val2 = bl->id; + } else + sec = 3000; // Couldn't trap it? + sg->limit = DIFF_TICK(tick, sg->tick) + sec; + } else if( tsc->data[SC_THORNSTRAP] && bl->id == sg->val2 ) + skill_attack(skill_get_type(GN_THORNS_TRAP), ss, ss, bl, sg->skill_id, sg->skill_lv, tick, SD_LEVEL|SD_ANIMATION); + } + break; + + case UNT_DEMONIC_FIRE: { + TBL_PC* sd = BL_CAST(BL_PC, ss); + switch( sg->val2 ) { + case 1: + case 2: + default: + sc_start(bl, SC_BURNING, 4 + 4 * sg->skill_lv, sg->skill_lv, + skill_get_time2(sg->skill_id, sg->skill_lv)); + skill_attack(skill_get_type(sg->skill_id), ss, &src->bl, bl, + sg->skill_id, sg->skill_lv + 10 * sg->val2, tick, 0); + break; + case 3: + skill_attack(skill_get_type(CR_ACIDDEMONSTRATION), ss, &src->bl, bl, + CR_ACIDDEMONSTRATION, sd ? pc_checkskill(sd, CR_ACIDDEMONSTRATION) : sg->skill_lv, tick, 0); + break; + + } + } + break; + + case UNT_FIRE_EXPANSION_SMOKE_POWDER: + sc_start(bl, status_skill2sc(GN_FIRE_EXPANSION_SMOKE_POWDER), 100, sg->skill_lv, 1000); + break; + + case UNT_FIRE_EXPANSION_TEAR_GAS: + sc_start(bl, status_skill2sc(GN_FIRE_EXPANSION_TEAR_GAS), 100, sg->skill_lv, 1000); + break; + + case UNT_HELLS_PLANT: + if( battle_check_target(&src->bl,bl,BCT_ENEMY) > 0 ) + skill_attack(skill_get_type(GN_HELLS_PLANT_ATK), ss, &src->bl, bl, GN_HELLS_PLANT_ATK, sg->skill_lv, tick, 0); + sg->limit = DIFF_TICK(tick, sg->tick) + 100; + break; + + case UNT_CLOUD_KILL: + if(tsc && !tsc->data[type]) + status_change_start(bl,type,10000,sg->skill_lv,sg->group_id,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),8); + skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); + break; + + case UNT_WARMER: + if( bl->type == BL_PC && !battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race != RC_DEMON ) { + int hp = 125 * sg->skill_lv; // Officially is 125 * skill_lv. + struct status_change *ssc = status_get_sc(ss); + if( ssc && ssc->data[SC_HEATER_OPTION] ) + hp += hp * ssc->data[SC_HEATER_OPTION]->val3 / 100; + status_heal(bl, hp, 0, 0); + if( tstatus->hp != tstatus->max_hp ) + clif_skill_nodamage(&src->bl, bl, AL_HEAL, hp, 0); + sc_start(bl, SC_WARMER, 100, sg->skill_lv, skill_get_time2(sg->skill_id,sg->skill_lv)); + } + break; + + case UNT_VACUUM_EXTREME: + sc_start(bl, SC_VACUUM_EXTREME, 100, sg->skill_lv, sg->limit); + break; + + case UNT_FIRE_MANTLE: + if( battle_check_target(&src->bl, bl, BCT_ENEMY) ) + skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); + break; } @@ -10639,6 +11279,9 @@ static int skill_unit_onleft (int skill_id, struct block_list *bl, unsigned int case NJ_SUITON: case SC_MAELSTROM: case SC_BLOODYLUST: + case EL_WATER_BARRIER: + case EL_ZEPHYR: + case EL_POWER_OF_GAIA: if (sce) status_change_end(bl, type, INVALID_TIMER); break; @@ -10968,20 +11611,26 @@ int skill_check_condition_castbegin(struct map_session_data* sd, short skill, sh return 1; } - if( sd->menuskill_id == AM_PHARMACY ) - { - switch( skill ) - { + switch( sd->menuskill_id ) { case AM_PHARMACY: - case AC_MAKINGARROW: - case BS_REPAIRWEAPON: - case AM_TWILIGHT1: - case AM_TWILIGHT2: - case AM_TWILIGHT3: - return 0; - } + switch( skill ) { + case AM_PHARMACY: + case AC_MAKINGARROW: + case BS_REPAIRWEAPON: + case AM_TWILIGHT1: + case AM_TWILIGHT2: + case AM_TWILIGHT3: + return 0; + } + break; + case GN_MIX_COOKING: + case GN_MAKEBOMB: + case GN_S_PHARMACY: + case GN_CHANGEMATERIAL: + if( sd->menuskill_id != skill ) + return 0; + break; } - status = &sd->battle_status; sc = &sd->sc; if( !sc->count ) @@ -11041,10 +11690,8 @@ int skill_check_condition_castbegin(struct map_session_data* sd, short skill, sh sd->state.arrow_atk = require.ammo?1:0; // Check the skills that can be used while mounted on a warg - if( pc_isridingwug(sd) ) - { - switch( skill ) - { + if( pc_isridingwug(sd) ) { + switch( skill ) { case HT_SKIDTRAP: case HT_LANDMINE: case HT_ANKLESNARE: case HT_SHOCKWAVE: case HT_SANDMAN: case HT_FLASHER: case HT_FREEZINGTRAP: case HT_BLASTMINE: case HT_CLAYMORETRAP: case HT_SPRINGTRAP: case RA_DETONATOR: case RA_CLUSTERBOMB: @@ -11057,473 +11704,493 @@ int skill_check_condition_castbegin(struct map_session_data* sd, short skill, sh } // perform skill-specific checks (and actions) - switch( skill ) - { - case SA_CASTCANCEL: - if(sd->ud.skilltimer == INVALID_TIMER) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case AL_WARP: - if(!battle_config.duel_allow_teleport && sd->duel_group) { // duel restriction [LuzZza] - clif_displaymessage(sd->fd, "Duel: Can't use warp in duel."); - return 0; - } - break; - case MO_CALLSPIRITS: - if(sd->spiritball >= lv) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case MO_FINGEROFFENSIVE: - case GS_FLING: - case SR_RAMPAGEBLASTER: - case SR_RIDEINLIGHTNING: - if( sd->spiritball > 0 && sd->spiritball < require.spiritball ) - sd->spiritball_old = require.spiritball = sd->spiritball; - else - sd->spiritball_old = require.spiritball; - break; - case MO_CHAINCOMBO: - if(!sc) - return 0; - if(sc->data[SC_BLADESTOP]) + switch( skill ) { + case SA_CASTCANCEL: + case SO_SPELLFIST: + if(sd->ud.skilltimer == INVALID_TIMER) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } break; - if(sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MO_TRIPLEATTACK) + case AL_WARP: + if(!battle_config.duel_allow_teleport && sd->duel_group) { // duel restriction [LuzZza] + clif_displaymessage(sd->fd, "Duel: Can't use warp in duel."); + return 0; + } break; - return 0; - case MO_COMBOFINISH: - if(!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MO_CHAINCOMBO)) - return 0; - break; - case CH_TIGERFIST: - if(!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MO_COMBOFINISH)) - return 0; - break; - case CH_CHAINCRUSH: - if(!(sc && sc->data[SC_COMBO])) - return 0; - if(sc->data[SC_COMBO]->val1 != MO_COMBOFINISH && sc->data[SC_COMBO]->val1 != CH_TIGERFIST) + case MO_CALLSPIRITS: + if(sd->spiritball >= lv) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + case MO_FINGEROFFENSIVE: + case GS_FLING: + case SR_RAMPAGEBLASTER: + case SR_RIDEINLIGHTNING: + if( sd->spiritball > 0 && sd->spiritball < require.spiritball ) + sd->spiritball_old = require.spiritball = sd->spiritball; + else + sd->spiritball_old = require.spiritball; + break; + case MO_CHAINCOMBO: + if(!sc) + return 0; + if(sc->data[SC_BLADESTOP]) + break; + if(sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MO_TRIPLEATTACK) + break; return 0; - break; - case MO_EXTREMITYFIST: -// if(sc && sc->data[SC_EXTREMITYFIST]) //To disable Asura during the 5 min skill block uncomment this... -// return 0; - if( sc && sc->data[SC_BLADESTOP] ) + case MO_COMBOFINISH: + if(!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MO_CHAINCOMBO)) + return 0; break; - if( sc && sc->data[SC_COMBO] ) - { - switch(sc->data[SC_COMBO]->val1) { - case MO_COMBOFINISH: - case CH_TIGERFIST: - case CH_CHAINCRUSH: + case CH_TIGERFIST: + if(!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MO_COMBOFINISH)) + return 0; + break; + case CH_CHAINCRUSH: + if(!(sc && sc->data[SC_COMBO])) + return 0; + if(sc->data[SC_COMBO]->val1 != MO_COMBOFINISH && sc->data[SC_COMBO]->val1 != CH_TIGERFIST) + return 0; + break; + case MO_EXTREMITYFIST: + // if(sc && sc->data[SC_EXTREMITYFIST]) //To disable Asura during the 5 min skill block uncomment this... + // return 0; + if( sc && sc->data[SC_BLADESTOP] ) + break; + if( sc && sc->data[SC_COMBO] ) + { + switch(sc->data[SC_COMBO]->val1) { + case MO_COMBOFINISH: + case CH_TIGERFIST: + case CH_CHAINCRUSH: + break; + default: + return 0; + } + } + else if( !unit_can_move(&sd->bl) ) + { //Placed here as ST_MOVE_ENABLE should not apply if rooted or on a combo. [Skotlex] + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + + case TK_MISSION: + if( (sd->class_&MAPID_UPPERMASK) != MAPID_TAEKWON ) + {// Cannot be used by Non-Taekwon classes + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + + case TK_READYCOUNTER: + case TK_READYDOWN: + case TK_READYSTORM: + case TK_READYTURN: + case TK_JUMPKICK: + if( (sd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER ) + {// Soul Linkers cannot use this skill + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + + case TK_TURNKICK: + case TK_STORMKICK: + case TK_DOWNKICK: + case TK_COUNTER: + if ((sd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) + return 0; //Anti-Soul Linker check in case you job-changed with Stances active. + if(!(sc && sc->data[SC_COMBO]) || sc->data[SC_COMBO]->val1 == TK_JUMPKICK) + return 0; //Combo needs to be ready + + if (sc->data[SC_COMBO]->val3) { //Kick chain + //Do not repeat a kick. + if (sc->data[SC_COMBO]->val3 != skill) break; - default: + status_change_end(&sd->bl, SC_COMBO, INVALID_TIMER); + return 0; + } + if(sc->data[SC_COMBO]->val1 != skill && !( sd && sd->status.base_level >= 90 && pc_famerank(sd->status.char_id, MAPID_TAEKWON) )) { //Cancel combo wait. + unit_cancel_combo(&sd->bl); + return 0; + } + break; //Combo ready. + case BD_ADAPTATION: + { + int time; + if(!(sc && sc->data[SC_DANCING])) + { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + time = 1000*(sc->data[SC_DANCING]->val3>>16); + if (skill_get_time( + (sc->data[SC_DANCING]->val1&0xFFFF), //Dance Skill ID + (sc->data[SC_DANCING]->val1>>16)) //Dance Skill LV + - time < skill_get_time2(skill,lv)) + { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); return 0; + } } - } - else if( !unit_can_move(&sd->bl) ) - { //Placed here as ST_MOVE_ENABLE should not apply if rooted or on a combo. [Skotlex] - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; + break; - case TK_MISSION: - if( (sd->class_&MAPID_UPPERMASK) != MAPID_TAEKWON ) - {// Cannot be used by Non-Taekwon classes - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; + case PR_BENEDICTIO: + if (skill_check_pc_partner(sd, skill, &lv, 1, 0) < 2) + { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; - case TK_READYCOUNTER: - case TK_READYDOWN: - case TK_READYSTORM: - case TK_READYTURN: - case TK_JUMPKICK: - if( (sd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER ) - {// Soul Linkers cannot use this skill - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; + case SL_SMA: + if(!(sc && sc->data[SC_SMA])) + return 0; + break; - case TK_TURNKICK: - case TK_STORMKICK: - case TK_DOWNKICK: - case TK_COUNTER: - if ((sd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) - return 0; //Anti-Soul Linker check in case you job-changed with Stances active. - if(!(sc && sc->data[SC_COMBO]) || sc->data[SC_COMBO]->val1 == TK_JUMPKICK) - return 0; //Combo needs to be ready + case HT_POWER: + if(!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == skill)) + return 0; + break; - if (sc->data[SC_COMBO]->val3) { //Kick chain - //Do not repeat a kick. - if (sc->data[SC_COMBO]->val3 != skill) - break; - status_change_end(&sd->bl, SC_COMBO, INVALID_TIMER); - return 0; - } - if(sc->data[SC_COMBO]->val1 != skill && !( sd && sd->status.base_level >= 90 && pc_famerank(sd->status.char_id, MAPID_TAEKWON) )) { //Cancel combo wait. - unit_cancel_combo(&sd->bl); - return 0; - } - break; //Combo ready. - case BD_ADAPTATION: - { - int time; - if(!(sc && sc->data[SC_DANCING])) + case CG_HERMODE: + if(!npc_check_areanpc(1,sd->bl.m,sd->bl.x,sd->bl.y,skill_get_splash(skill, lv))) { clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); return 0; } - time = 1000*(sc->data[SC_DANCING]->val3>>16); - if (skill_get_time( - (sc->data[SC_DANCING]->val1&0xFFFF), //Dance Skill ID - (sc->data[SC_DANCING]->val1>>16)) //Dance Skill LV - - time < skill_get_time2(skill,lv)) + break; + case CG_MOONLIT: //Check there's no wall in the range+1 area around the caster. [Skotlex] + { + int i,x,y,range = skill_get_splash(skill, lv)+1; + int size = range*2+1; + for (i=0;i<size*size;i++) { + x = sd->bl.x+(i%size-range); + y = sd->bl.y+(i/size-range); + if (map_getcell(sd->bl.m,x,y,CELL_CHKWALL)) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + } + } + break; + case PR_REDEMPTIO: + { + int exp; + if( ((exp = pc_nextbaseexp(sd)) > 0 && get_percentage(sd->status.base_exp, exp) < 1) || + ((exp = pc_nextjobexp(sd)) > 0 && get_percentage(sd->status.job_exp, exp) < 1)) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); //Not enough exp. + return 0; + } + break; + } + case AM_TWILIGHT2: + case AM_TWILIGHT3: + if (!party_skill_check(sd, sd->status.party_id, skill, lv)) { clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); return 0; } - } - break; - - case PR_BENEDICTIO: - if (skill_check_pc_partner(sd, skill, &lv, 1, 0) < 2) - { + break; + case SG_SUN_WARM: + case SG_MOON_WARM: + case SG_STAR_WARM: + if (sc && sc->data[SC_MIRACLE]) + break; + i = skill-SG_SUN_WARM; + if (sd->bl.m == sd->feel_map[i].m) + break; clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); return 0; - } - break; - - case SL_SMA: - if(!(sc && sc->data[SC_SMA])) + break; + case SG_SUN_COMFORT: + case SG_MOON_COMFORT: + case SG_STAR_COMFORT: + if (sc && sc->data[SC_MIRACLE]) + break; + i = skill-SG_SUN_COMFORT; + if (sd->bl.m == sd->feel_map[i].m && + (battle_config.allow_skill_without_day || sg_info[i].day_func())) + break; + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); return 0; - break; - - case HT_POWER: - if(!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == skill)) + case SG_FUSION: + if (sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_STAR) + break; + //Auron insists we should implement SP consumption when you are not Soul Linked. [Skotlex] + //Only invoke on skill begin cast (instant cast skill). [Kevin] + if( require.sp > 0 ) + { + if (status->sp < (unsigned int)require.sp) + clif_skill_fail(sd,skill,USESKILL_FAIL_SP_INSUFFICIENT,0); + else + status_zap(&sd->bl, 0, require.sp); + } return 0; - break; + case GD_BATTLEORDER: + case GD_REGENERATION: + case GD_RESTORE: + if (!map_flag_gvg2(sd->bl.m)) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + case GD_EMERGENCYCALL: + // other checks were already done in skillnotok() + if (!sd->status.guild_id || !sd->state.gmaster_flag) + return 0; + break; - case CG_HERMODE: - if(!npc_check_areanpc(1,sd->bl.m,sd->bl.x,sd->bl.y,skill_get_splash(skill, lv))) - { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case CG_MOONLIT: //Check there's no wall in the range+1 area around the caster. [Skotlex] - { - int i,x,y,range = skill_get_splash(skill, lv)+1; - int size = range*2+1; - for (i=0;i<size*size;i++) { - x = sd->bl.x+(i%size-range); - y = sd->bl.y+(i/size-range); - if (map_getcell(sd->bl.m,x,y,CELL_CHKWALL)) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + case GS_GLITTERING: + if(sd->spiritball >= 10) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + + case NJ_ISSEN: + if (status->hp < 2) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + case NJ_BUNSINJYUTSU: + if (!(sc && sc->data[SC_NEN])) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + + case NJ_ZENYNAGE: + if(sd->status.zeny < require.zeny) { + clif_skill_fail(sd,skill,USESKILL_FAIL_MONEY,0); + return 0; + } + break; + case PF_HPCONVERSION: + if (status->sp == status->max_sp) + return 0; //Unusable when at full SP. + break; + case AM_CALLHOMUN: //Can't summon if a hom is already out + if (sd->status.hom_id && sd->hd && !sd->hd->homunculus.vaporize) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + case AM_REST: //Can't vapo homun if you don't have an active homunc or it's hp is < 80% + if (!merc_is_hom_active(sd->hd) || sd->hd->battle_status.hp < (sd->hd->battle_status.max_hp*80/100)) + { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + /** + * Arch Bishop + **/ + case AB_ANCILLA: + { + int count = 0; + for( i = 0; i < MAX_INVENTORY; i ++ ) + if( sd->status.inventory[i].nameid == ITEMID_ANCILLA ) + count += sd->status.inventory[i].amount; + if( count >= 3 ) { + clif_skill_fail(sd, skill, USESKILL_FAIL_ANCILLA_NUMOVER, 0); return 0; } } - } - break; - case PR_REDEMPTIO: - { - int exp; - if( ((exp = pc_nextbaseexp(sd)) > 0 && get_percentage(sd->status.base_exp, exp) < 1) || - ((exp = pc_nextjobexp(sd)) > 0 && get_percentage(sd->status.job_exp, exp) < 1)) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); //Not enough exp. + break; + /** + * Keeping as a note: + * Bug Report #17 provides a link to a sep-2011 changelog that shows this requirement was removed + **/ + //case AB_LAUDAAGNUS: + //case AB_LAUDARAMUS: + // if( !sd->status.party_id ) { + // clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + // return 0; + // } + // break; + + case AB_ADORAMUS: + /** + * Warlock + **/ + case WL_COMET: + if( skill_check_pc_partner(sd,skill,&lv,1,0) <= 0 && ((i = pc_search_inventory(sd,require.itemid[0])) < 0 || sd->status.inventory[i].amount < require.amount[0]) ) + { + //clif_skill_fail(sd,skill,USESKILL_FAIL_NEED_ITEM,require.amount[0],require.itemid[0]); + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); return 0; } break; - } - case AM_TWILIGHT2: - case AM_TWILIGHT3: - if (!party_skill_check(sd, sd->status.party_id, skill, lv)) - { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case SG_SUN_WARM: - case SG_MOON_WARM: - case SG_STAR_WARM: - if (sc && sc->data[SC_MIRACLE]) + case WL_SUMMONFB: + case WL_SUMMONBL: + case WL_SUMMONWB: + case WL_SUMMONSTONE: + if( sc ) + { + ARR_FIND(SC_SPHERE_1,SC_SPHERE_5+1,i,!sc->data[i]); + if( i == SC_SPHERE_5+1 ) + { // No more free slots + clif_skill_fail(sd,skill,USESKILL_FAIL_SUMMON,0); + return 0; + } + } break; - i = skill-SG_SUN_WARM; - if (sd->bl.m == sd->feel_map[i].m) + /** + * Guilotine Cross + **/ + case GC_HALLUCINATIONWALK: + if( sc && (sc->data[SC_HALLUCINATIONWALK] || sc->data[SC_HALLUCINATIONWALK_POSTDELAY]) ) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } break; - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - break; - case SG_SUN_COMFORT: - case SG_MOON_COMFORT: - case SG_STAR_COMFORT: - if (sc && sc->data[SC_MIRACLE]) + case GC_COUNTERSLASH: + case GC_WEAPONCRUSH: + if( !(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == GC_WEAPONBLOCKING) ) { + clif_skill_fail(sd, skill, USESKILL_FAIL_GC_WEAPONBLOCKING, 0); + return 0; + } break; - i = skill-SG_SUN_COMFORT; - if (sd->bl.m == sd->feel_map[i].m && - (battle_config.allow_skill_without_day || sg_info[i].day_func())) + case GC_CROSSRIPPERSLASHER: + if( !(sc && sc->data[SC_ROLLINGCUTTER]) ) { + clif_skill_fail(sd, skill, USESKILL_FAIL_CONDITION, 0); + return 0; + } break; - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - case SG_FUSION: - if (sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_STAR) + case GC_POISONSMOKE: + case GC_VENOMPRESSURE: + if( !(sc && sc->data[SC_POISONINGWEAPON]) ) { + clif_skill_fail(sd, skill, USESKILL_FAIL_GC_POISONINGWEAPON, 0); + return 0; + } break; - //Auron insists we should implement SP consumption when you are not Soul Linked. [Skotlex] - //Only invoke on skill begin cast (instant cast skill). [Kevin] - if( require.sp > 0 ) - { - if (status->sp < (unsigned int)require.sp) - clif_skill_fail(sd,skill,USESKILL_FAIL_SP_INSUFFICIENT,0); - else - status_zap(&sd->bl, 0, require.sp); - } - return 0; - case GD_BATTLEORDER: - case GD_REGENERATION: - case GD_RESTORE: - if (!map_flag_gvg2(sd->bl.m)) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - case GD_EMERGENCYCALL: - // other checks were already done in skillnotok() - if (!sd->status.guild_id || !sd->state.gmaster_flag) - return 0; - break; - - case GS_GLITTERING: - if(sd->spiritball >= 10) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - - case NJ_ISSEN: - if (status->hp < 2) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - case NJ_BUNSINJYUTSU: - if (!(sc && sc->data[SC_NEN])) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - - case NJ_ZENYNAGE: - if(sd->status.zeny < require.zeny) { - clif_skill_fail(sd,skill,USESKILL_FAIL_MONEY,0); - return 0; - } - break; - case PF_HPCONVERSION: - if (status->sp == status->max_sp) - return 0; //Unusable when at full SP. - break; - case AM_CALLHOMUN: //Can't summon if a hom is already out - if (sd->status.hom_id && sd->hd && !sd->hd->homunculus.vaporize) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case AM_REST: //Can't vapo homun if you don't have an active homunc or it's hp is < 80% - if (!merc_is_hom_active(sd->hd) || sd->hd->battle_status.hp < (sd->hd->battle_status.max_hp*80/100)) - { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - /** - * Arch Bishop - **/ - case AB_ANCILLA: - { - int count = 0; - for( i = 0; i < MAX_INVENTORY; i ++ ) - if( sd->status.inventory[i].nameid == ITEMID_ANCILLA ) - count += sd->status.inventory[i].amount; - if( count >= 3 ) { - clif_skill_fail(sd, skill, USESKILL_FAIL_ANCILLA_NUMOVER, 0); + /** + * Ranger + **/ + case RA_SENSITIVEKEEN: + if(!pc_iswug(sd)) { + clif_skill_fail(sd,skill,USESKILL_FAIL_CONDITION,0); return 0; } - } - break; - /** - * Keeping as a note: - * Bug Report #17 provides a link to a sep-2011 changelog that shows this requirement was removed - **/ - //case AB_LAUDAAGNUS: - //case AB_LAUDARAMUS: - // if( !sd->status.party_id ) { - // clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - // return 0; - // } - // break; - - case AB_ADORAMUS: - /** - * Warlock - **/ - case WL_COMET: - if( skill_check_pc_partner(sd,skill,&lv,1,0) <= 0 && ((i = pc_search_inventory(sd,require.itemid[0])) < 0 || sd->status.inventory[i].amount < require.amount[0]) ) - { - //clif_skill_fail(sd,skill,USESKILL_FAIL_NEED_ITEM,require.amount[0],require.itemid[0]); - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case WL_SUMMONFB: - case WL_SUMMONBL: - case WL_SUMMONWB: - case WL_SUMMONSTONE: - if( sc ) - { - ARR_FIND(SC_SPHERE_1,SC_SPHERE_5+1,i,!sc->data[i]); - if( i == SC_SPHERE_5+1 ) - { // No more free slots - clif_skill_fail(sd,skill,USESKILL_FAIL_SUMMON,0); + break; + case RA_WUGMASTERY: + if( pc_isfalcon(sd) || pc_isridingwug(sd) || sd->sc.data[SC__GROOMY]) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + case RA_WUGRIDER: + if( !pc_isridingwug(sd) && !pc_iswug(sd) ) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + case RA_WUGDASH: + if(!pc_isridingwug(sd)) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + /** + * Royal Guard + **/ + case LG_BANDING: + if( sc && sc->data[SC_INSPIRATION] ) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + case LG_PRESTIGE: + if( sc && (sc->data[SC_BANDING] || sc->data[SC_INSPIRATION]) ) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + case LG_RAGEBURST: + if( sd->spiritball == 0 ) { + clif_skill_fail(sd,skill,USESKILL_FAIL_SKILLINTERVAL,0); return 0; } - } - break; - /** - * Guilotine Cross - **/ - case GC_HALLUCINATIONWALK: - if( sc && (sc->data[SC_HALLUCINATIONWALK] || sc->data[SC_HALLUCINATIONWALK_POSTDELAY]) ) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case GC_COUNTERSLASH: - case GC_WEAPONCRUSH: - if( !(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == GC_WEAPONBLOCKING) ) { - clif_skill_fail(sd, skill, USESKILL_FAIL_GC_WEAPONBLOCKING, 0); - return 0; - } - break; - case GC_CROSSRIPPERSLASHER: - if( !(sc && sc->data[SC_ROLLINGCUTTER]) ) { - clif_skill_fail(sd, skill, USESKILL_FAIL_CONDITION, 0); - return 0; - } - break; - case GC_POISONSMOKE: - case GC_VENOMPRESSURE: - if( !(sc && sc->data[SC_POISONINGWEAPON]) ) { - clif_skill_fail(sd, skill, USESKILL_FAIL_GC_POISONINGWEAPON, 0); - return 0; - } - break; - /** - * Ranger - **/ - case RA_SENSITIVEKEEN: - if(!pc_iswug(sd)) { - clif_skill_fail(sd,skill,USESKILL_FAIL_CONDITION,0); - return 0; - } - break; - case RA_WUGMASTERY: - if( pc_isfalcon(sd) || pc_isridingwug(sd) || sd->sc.data[SC__GROOMY]) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case RA_WUGRIDER: - if( !pc_isridingwug(sd) && !pc_iswug(sd) ) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case RA_WUGDASH: - if(!pc_isridingwug(sd)) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - /** - * Royal Guard - **/ - case LG_BANDING: - if( sc && sc->data[SC_INSPIRATION] ) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case LG_PRESTIGE: - if( sc && (sc->data[SC_BANDING] || sc->data[SC_INSPIRATION]) ) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case LG_RAGEBURST: - if( sd->spiritball == 0 ) { - clif_skill_fail(sd,skill,USESKILL_FAIL_SKILLINTERVAL,0); - return 0; - } - sd->spiritball_old = require.spiritball = sd->spiritball; - break; - case LG_RAYOFGENESIS: - if( sc && sc->data[SC_INSPIRATION] ) - return 1; // Don't check for partner. - if( !(sc && sc->data[SC_BANDING]) ) { - clif_skill_fail(sd,skill,USESKILL_FAIL,0); - return 0; - } else if( skill_check_pc_partner(sd,skill,&lv,skill_get_range(skill,lv),0) < 1 ) - return 0; // Just fails, no msg here. - break; - case LG_HESPERUSLIT: - if( !sc || !sc->data[SC_BANDING] ) { - clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); - return 0; - } - break; - case SR_FALLENEMPIRE: - if( !(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_DRAGONCOMBO) ) - return 0; - break; - case SR_CRESCENTELBOW: - if( sc && sc->data[SC_CRESCENTELBOW] ) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case SR_CURSEDCIRCLE: - if( sd->spiritball > 0 ) sd->spiritball_old = require.spiritball = sd->spiritball; - else { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case SR_GATEOFHELL: - if( sd->spiritball > 0 ) - sd->spiritball_old = require.spiritball; - break; - case SC_MANHOLE: - case SC_DIMENSIONDOOR: - if( sc && sc->data[SC_MAGNETICFIELD] ) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case WM_GREAT_ECHO: { - int count; - count = skill_check_pc_partner(sd, skill, &lv, skill_get_splash(skill,lv), 0); - if( count < 1 ) { - clif_skill_fail(sd,skill,0x11,0); + break; + case LG_RAYOFGENESIS: + if( sc && sc->data[SC_INSPIRATION] ) + return 1; // Don't check for partner. + if( !(sc && sc->data[SC_BANDING]) ) { + clif_skill_fail(sd,skill,USESKILL_FAIL,0); return 0; - } else - require.sp -= require.sp * 20 * count / 100; // -20% each W/M in the party. - } - break; + } else if( skill_check_pc_partner(sd,skill,&lv,skill_get_range(skill,lv),0) < 1 ) + return 0; // Just fails, no msg here. + break; + case LG_HESPERUSLIT: + if( !sc || !sc->data[SC_BANDING] ) { + clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); + return 0; + } + break; + case SR_FALLENEMPIRE: + if( !(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_DRAGONCOMBO) ) + return 0; + break; + case SR_CRESCENTELBOW: + if( sc && sc->data[SC_CRESCENTELBOW] ) { + clif_skill_fail(sd,skill,0,0); + return 0; + } + break; + case SR_CURSEDCIRCLE: + if( sd->spiritball > 0 ) + sd->spiritball_old = require.spiritball = sd->spiritball; + else { + clif_skill_fail(sd,skill,0,0); + return 0; + } + break; + case SR_GATEOFHELL: + if( sd->spiritball > 0 ) + sd->spiritball_old = require.spiritball; + break; + case SC_MANHOLE: + case SC_DIMENSIONDOOR: + if( sc && sc->data[SC_MAGNETICFIELD] ) { + clif_skill_fail(sd,skill,0,0); + return 0; + } + break; + case WM_GREAT_ECHO: { + int count; + count = skill_check_pc_partner(sd, skill, &lv, skill_get_splash(skill,lv), 0); + if( count < 1 ) { + clif_skill_fail(sd,skill,0x11,0); + return 0; + } else + require.sp -= require.sp * 20 * count / 100; // -20% each W/M in the party. + } + break; + case SO_FIREWALK: + case SO_ELECTRICWALK: // Can't be casted until you've walked all cells. + if( sc && sc->data[SC_PROPERTYWALK] && + sc->data[SC_PROPERTYWALK]->val3 < skill_get_maxcount(sc->data[SC_PROPERTYWALK]->val1,sc->data[SC_PROPERTYWALK]->val2) ) { + clif_skill_fail(sd,skill,0x0,0); + return 0; + } + break; + case SO_EL_CONTROL: + if( !sd->status.ele_id || !sd->ed ) { + clif_skill_fail(sd,skill,0x00,0); + return 0; + } + break; + case RETURN_TO_ELDICASTES: + if( sd->sc.option&OPTION_MADOGEAR ) { //Cannot be used if Mado is equipped. + clif_skill_fail(sd,skill,0,0); + return 0; + } + break; } switch(require.state) { @@ -11647,12 +12314,12 @@ int skill_check_condition_castbegin(struct map_session_data* sd, short skill, sh /** * Sorcerer **/ - //case ST_ELEMENTALSPIRIT: - // if(!sd->ed) { - // clif_skill_fail(sd,skill,USESKILL_FAIL_EL_SUMMON,0); - // return 0; - // } - // break; + case ST_ELEMENTALSPIRIT: + if(!sd->ed) { + clif_skill_fail(sd,skill,USESKILL_FAIL_EL_SUMMON,0); + return 0; + } + break; } if(require.mhp > 0 && get_percentage(status->hp, status->max_hp) > require.mhp) { @@ -11704,18 +12371,25 @@ int skill_check_condition_castend(struct map_session_data* sd, short skill, shor return 1; } - if( sd->menuskill_id == AM_PHARMACY ) - { // Cast start or cast end?? - switch( skill ) - { + switch( sd->menuskill_id ) { // Cast start or cast end?? case AM_PHARMACY: - case AC_MAKINGARROW: - case BS_REPAIRWEAPON: - case AM_TWILIGHT1: - case AM_TWILIGHT2: - case AM_TWILIGHT3: - return 0; - } + switch( skill ) { + case AM_PHARMACY: + case AC_MAKINGARROW: + case BS_REPAIRWEAPON: + case AM_TWILIGHT1: + case AM_TWILIGHT2: + case AM_TWILIGHT3: + return 0; + } + break; + case GN_MIX_COOKING: + case GN_MAKEBOMB: + case GN_S_PHARMACY: + case GN_CHANGEMATERIAL: + if( sd->menuskill_id != skill ) + return 0; + break; } if( sd->skillitem == skill ) // Casting finished (Item skill or Hocus-Pocus) @@ -11994,6 +12668,17 @@ struct skill_condition skill_get_requirement(struct map_session_data* sd, short if( itemid_isgemstone(skill_db[j].itemid[i]) && skill_check_pc_partner(sd,skill,&lv, 1, 0) ) continue; break; + case GN_FIRE_EXPANSION: + if( i < 5 ) + continue; + break; + case SO_SUMMON_AGNI: + case SO_SUMMON_AQUA: + case SO_SUMMON_VENTUS: + case SO_SUMMON_TERA: + if( i < 3 ) + continue; + break; } req.itemid[i] = skill_db[j].itemid[i]; @@ -12083,6 +12768,12 @@ struct skill_condition skill_get_requirement(struct map_session_data* sd, short if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE ) req.sp -= req.sp * 10 / 100; break; + case SO_SUMMON_AGNI: + case SO_SUMMON_AQUA: + case SO_SUMMON_VENTUS: + case SO_SUMMON_TERA: + req.sp -= req.sp * (5 + 5 * pc_checkskill(sd,SO_EL_SYMPATHY)) / 100; + break; } return req; @@ -12837,6 +13528,14 @@ int skill_clear_group (struct block_list *bl, int flag) if (flag&1) group[count++]= ud->skillunit[i]; break; + case SO_CLOUD_KILL: + if( flag&4 ) + group[count++]= ud->skillunit[i]; + break; + case SO_WARMER: + if( flag&8 ) + group[count++]= ud->skillunit[i]; + break; default: if (flag&2 && skill_get_inf2(ud->skillunit[i]->skill_id)&INF2_TRAP) group[count++]= ud->skillunit[i]; @@ -12866,6 +13565,8 @@ struct skill_unit_group *skill_locate_element_field(struct block_list *bl) case SA_VIOLENTGALE: case SA_LANDPROTECTOR: case NJ_SUITON: + case SO_WARMER: + case SO_CLOUD_KILL: return ud->skillunit[i]; } } @@ -13906,7 +14607,7 @@ int skill_unit_move_sub (struct block_list* bl, va_list ap) if( !unit->alive || target->prev == NULL ) return 0; - if( unit->group->skill_id == PF_SPIDERWEB && flag&1 ) + if( flag&1 && ( unit->group->skill_id == PF_SPIDERWEB || unit->group->skill_id == GN_THORNS_TRAP ) ) return 0; // Fiberlock is never supposed to trigger on skill_unit_move. [Inkfish] dissonance = skill_dance_switch(unit, 0); @@ -14182,7 +14883,7 @@ int skill_can_produce_mix (struct map_session_data *sd, int nameid, int trigger, int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, int slot1, int slot2, int slot3, int qty) { int slot[3]; - int i,sc,ele,idx,equip,wlv,make_per,flag; + int i,sc,ele,idx,equip,wlv,make_per,flag = 0, firstQty = qty; int num = -1; // exclude the recipe struct status_data *status; @@ -14267,7 +14968,7 @@ int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, in }while( j>=0 && x>0 ); } - if((equip=itemdb_isequip(nameid))) + if( (equip = (itemdb_isequip(nameid) && skill_id != GN_CHANGEMATERIAL && skill_id != GN_MAKEBOMB )) ) wlv = itemdb_wlv(nameid); if(!equip) { switch(skill_id){ @@ -14363,6 +15064,57 @@ int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, in make_per = 3000 + 500 * pc_checkskill(sd,GC_RESEARCHNEWPOISON); qty = 1+rnd()%pc_checkskill(sd,GC_RESEARCHNEWPOISON); break; + case GN_MIX_COOKING: + make_per = 3000; //As I can see this is not affectd by dex or int + break; + case GN_MAKEBOMB: + // TODO: find a proper chance. + make_per = (5000 + 50*status->dex + 30*status->luk); //Custom rate value. + break; + case GN_CHANGEMATERIAL: + switch( nameid ) { + case 1010: + qty *= 8; + break; + case 1061: + qty *= 2; + break; + // Throwable potions + case 13275: + case 13276: + case 13277: + case 13278: + case 13279: + case 13280: + case 13281: + case 13282: + case 13283: + qty *= 10; + break; + } + make_per = 100000; //100% success rate. + break; + case GN_S_PHARMACY: + // Note: This is not the chosen skill level but the highest available. Need confirmation/fix. + switch( sd->skilllv_old ) { + case 6: + case 7: + case 8: + qty = 3; + break; //3 items to make at once. + case 9: + qty = 3 + rand()%3; + break; //3~5 items to make at once. + case 10: + qty = 4 + rand()%3; + break; //4~6 items to make at once. + default: + qty = 2; + break; //2 item to make at once. + } + make_per = 100000; //100% success rate. + sd->skillid_old = sd->skilllv_old = 0; + break; default: if (sd->menuskill_id == AM_PHARMACY && sd->menuskill_val > 10 && sd->menuskill_val <= 20) @@ -14429,6 +15181,9 @@ int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, in case AM_TWILIGHT1: case AM_TWILIGHT2: case AM_TWILIGHT3: + case GN_MIX_COOKING: + case GN_MAKEBOMB: + case GN_S_PHARMACY: flag = battle_config.produce_item_name_input&0x2; break; case AL_HOLYWATER: @@ -14465,36 +15220,43 @@ int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, in } else { int fame = 0; tmp_item.amount = 0; - for (i=0; i< qty; i++) - { //Apply quantity modifiers. - if (rnd()%10000 < make_per || qty == 1) - { //Success - tmp_item.amount++; - if(nameid < 545 || nameid > 547) - continue; - if(skill_id != AM_PHARMACY && - skill_id != AM_TWILIGHT1 && - skill_id != AM_TWILIGHT2 && - skill_id != AM_TWILIGHT3) - continue; - //Add fame as needed. - switch(++sd->potion_success_counter) { - case 3: - fame+=1; // Success to prepare 3 Condensed Potions in a row - break; - case 5: - fame+=3; // Success to prepare 5 Condensed Potions in a row - break; - case 7: - fame+=10; // Success to prepare 7 Condensed Potions in a row - break; - case 10: - fame+=50; // Success to prepare 10 Condensed Potions in a row - sd->potion_success_counter = 0; - break; - } - } else //Failure - sd->potion_success_counter = 0; + if( skill_id == GN_MIX_COOKING && firstQty > 1 ) {// Mix Cooking level 2. + // Success. As I see the chance as level 2 is global, not indiviual. + if( rand()%10000 < make_per ) + tmp_item.amount = 5 + rand()%5; + } else { + for (i=0; i< qty; i++) { //Apply quantity modifiers. + if (rnd()%10000 < make_per || qty == 1) { //Success + tmp_item.amount++; + if(nameid < 545 || nameid > 547) + continue; + if( skill_id != AM_PHARMACY && + skill_id != AM_TWILIGHT1 && + skill_id != AM_TWILIGHT2 && + skill_id != AM_TWILIGHT3 && + skill_id != GN_MIX_COOKING && + skill_id != GN_MAKEBOMB && + skill_id != GN_S_PHARMACY ) + continue; + //Add fame as needed. + switch(++sd->potion_success_counter) { + case 3: + fame+=1; // Success to prepare 3 Condensed Potions in a row + break; + case 5: + fame+=3; // Success to prepare 5 Condensed Potions in a row + break; + case 7: + fame+=10; // Success to prepare 7 Condensed Potions in a row + break; + case 10: + fame+=50; // Success to prepare 10 Condensed Potions in a row + sd->potion_success_counter = 0; + break; + } + } else //Failure + sd->potion_success_counter = 0; + } } if (fame) pc_addfame(sd,fame); @@ -14519,6 +15281,12 @@ int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, in clif_produceeffect(sd,2,nameid); clif_misceffect(&sd->bl,5); break; + case GN_MAKEBOMB: + case GN_MIX_COOKING: + clif_msg_skill(sd,skill_id,0x627); + break; + case GN_S_PHARMACY: + break; // No effects here. default: //Those that don't require a skill? if( skill_produce_db[idx].itemlv > 10 && skill_produce_db[idx].itemlv <= 20) { //Cooking items. @@ -14568,6 +15336,30 @@ int skill_produce_mix (struct map_session_data *sd, int skill_id, int nameid, in clif_produceeffect(sd,3,nameid); clif_misceffect(&sd->bl,6); break; + case GN_MIX_COOKING: { + struct item tmp_item; + const int products[5][2] = {{13265,6500},{13266,4000},{13267,3000},{13268,500},{12435,500}}; + memset(&tmp_item,0,sizeof(tmp_item)); + tmp_item.nameid = nameid; + do { + i = rand()%5; + tmp_item.nameid = products[i][0]; + } + while( rand()%10000 >= products[i][1] ); + tmp_item.amount = (firstQty > 1 )? 5 + rand()%5 : 1; // When it fails it gives a random amount of items. + tmp_item.identify = 1; + if( pc_additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_PRODUCE) ) { + clif_additem(sd,0,0,flag); + map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + } + clif_msg_skill(sd,skill_id,0x628); + } + break; + case GN_S_PHARMACY: + break; // No effects here. + case GN_MAKEBOMB: + clif_msg_skill(sd,skill_id,0x628); + break; default: if( skill_produce_db[idx].itemlv > 10 && skill_produce_db[idx].itemlv <= 20 ) { //Cooking items. @@ -14785,6 +15577,114 @@ int skill_select_menu(struct map_session_data *sd,int flag,int skill_id) { sc_start4(&sd->bl,SC__AUTOSHADOWSPELL,100,id,lv,prob,0,skill_get_time(SC_AUTOSHADOWSPELL,aslvl)); return 0; } +int skill_elementalanalysis(struct map_session_data* sd, int n, int skill_lv, unsigned short* item_list) { + int i; + + nullpo_ret(sd); + nullpo_ret(item_list); + + if( n <= 0 ) + return 1; + + for( i = 0; i < n; i++ ) { + int nameid, add_amount, del_amount, idx, product, flag; + struct item tmp_item; + + idx = item_list[i*2+0]-2; + del_amount = item_list[i*2+1]; + + if( skill_lv == 2 ) + del_amount -= (del_amount % 10); + add_amount = (skill_lv == 1) ? del_amount * (5 + rand()%5) : del_amount / 10 ; + + if( (nameid = sd->status.inventory[idx].nameid) <= 0 || del_amount > sd->status.inventory[idx].amount ) { + clif_skill_fail(sd,SO_EL_ANALYSIS,0,0); + return 1; + } + + switch( nameid ) { + // Level 1 + case 994: product = 990; break; // Flame Heart -> Red Blood. + case 995: product = 991; break; // Mystic Frozen -> Crystal Blue. + case 996: product = 992; break; // Rough Wind -> Wind of Verdure. + case 997: product = 993; break; // Great Nature -> Green Live. + // Level 2 + case 990: product = 994; break; // Red Blood -> Flame Heart. + case 991: product = 995; break; // Crystal Blue -> Mystic Frozen. + case 992: product = 996; break; // Wind of Verdure -> Rough Wind. + case 993: product = 997; break; // Green Live -> Great Nature. + default: + clif_skill_fail(sd,SO_EL_ANALYSIS,0,0); + return 1; + } + + if( pc_delitem(sd,idx,del_amount,1,0,LOG_TYPE_CONSUME) ) { + clif_skill_fail(sd,SO_EL_ANALYSIS,0,0); + return 1; + } + + if( skill_lv == 2 && rand()%100 < 25 ) { // At level 2 have a fail chance. You loose your items if it fails. + clif_skill_fail(sd,SO_EL_ANALYSIS,0,0); + return 1; + } + + + memset(&tmp_item,0,sizeof(tmp_item)); + tmp_item.nameid = product; + tmp_item.amount = add_amount; + tmp_item.identify = 1; + + if( tmp_item.amount ) { + if( (flag = pc_additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_CONSUME)) ) { + clif_additem(sd,0,0,flag); + map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + } + } + + } + + return 0; +} + +int skill_changematerial(struct map_session_data *sd, int n, unsigned short *item_list) { + int i, j, k, c, p, nameid, amount; + + nullpo_ret(sd); + nullpo_ret(item_list); + + // Search for objects that can be created. + for( i = 0; i < MAX_SKILL_PRODUCE_DB; i++ ) { + if( skill_produce_db[i].itemlv == 26 ) { + p = 0; + do { + c = 0; + // Verification of overlap between the objects required and the list submitted. + for( j = 0; j < MAX_PRODUCE_RESOURCE; j++ ) { + if( skill_produce_db[i].mat_id[j] > 0 ) { + for( k = 0; k < n; k++ ) { + int idx = item_list[k*2+0]-2; + nameid = sd->status.inventory[idx].nameid; + amount = item_list[k*2+1]; + + if( nameid == skill_produce_db[i].mat_id[j] && (amount-p*skill_produce_db[i].mat_amount[j]) >= skill_produce_db[i].mat_amount[j] ) + c++; // match + } + } + else + break; // No more items required + } + p++; + } while(n == j && c == n); + p--; + if ( p > 0 ) { + skill_produce_mix(sd,GN_CHANGEMATERIAL,skill_produce_db[i].nameid,0,0,0,p); + return 1; + } + } + } + + return 0; +} /** * for Royal Guard's LG_TRAMPLE **/ @@ -15071,146 +15971,162 @@ void skill_init_unit_layout (void) for (i=0;i<MAX_SKILL_DB;i++) { if (!skill_db[i].unit_id[0] || skill_db[i].unit_layout_type[0] != -1) continue; - switch (i) { - case MG_FIREWALL: - case WZ_ICEWALL: - case WL_EARTHSTRAIN://Warlock - // these will be handled later - break; - case PR_SANCTUARY: - case NPC_EVILLAND: - { - static const int dx[] = { - -1, 0, 1,-2,-1, 0, 1, 2,-2,-1, - 0, 1, 2,-2,-1, 0, 1, 2,-1, 0, 1}; - static const int dy[]={ - -2,-2,-2,-1,-1,-1,-1,-1, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2}; - skill_unit_layout[pos].count = 21; - memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); - memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); - break; - } - case PR_MAGNUS: - { - static const int dx[] = { - -1, 0, 1,-1, 0, 1,-3,-2,-1, 0, - 1, 2, 3,-3,-2,-1, 0, 1, 2, 3, - -3,-2,-1, 0, 1, 2, 3,-1, 0, 1,-1, 0, 1}; - static const int dy[] = { - -3,-3,-3,-2,-2,-2,-1,-1,-1,-1, - -1,-1,-1, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3}; - skill_unit_layout[pos].count = 33; - memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); - memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); - break; - } - case AS_VENOMDUST: - { - static const int dx[] = {-1, 0, 0, 0, 1}; - static const int dy[] = { 0,-1, 0, 1, 0}; - skill_unit_layout[pos].count = 5; - memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); - memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); - break; - } - case CR_GRANDCROSS: - case NPC_GRANDDARKNESS: - { - static const int dx[] = { - 0, 0,-1, 0, 1,-2,-1, 0, 1, 2, - -4,-3,-2,-1, 0, 1, 2, 3, 4,-2, - -1, 0, 1, 2,-1, 0, 1, 0, 0}; - static const int dy[] = { - -4,-3,-2,-2,-2,-1,-1,-1,-1,-1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 2, 2, 2, 3, 4}; - skill_unit_layout[pos].count = 29; - memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); - memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); - break; - } - case PF_FOGWALL: - { - static const int dx[] = { - -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2}; - static const int dy[] = { - -1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}; - skill_unit_layout[pos].count = 15; - memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); - memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); - break; - } - case PA_GOSPEL: - { - static const int dx[] = { - -1, 0, 1,-1, 0, 1,-3,-2,-1, 0, - 1, 2, 3,-3,-2,-1, 0, 1, 2, 3, - -3,-2,-1, 0, 1, 2, 3,-1, 0, 1, - -1, 0, 1}; - static const int dy[] = { - -3,-3,-3,-2,-2,-2,-1,-1,-1,-1, - -1,-1,-1, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 3, 3, 3}; - skill_unit_layout[pos].count = 33; - memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); - memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); - break; + if( i >= HM_SKILLRANGEMIN && i <= EL_SKILLRANGEMAX ) { + int skill = i; + + if( i >= EL_SKILLRANGEMIN && i <= EL_SKILLRANGEMAX ) { + skill -= EL_SKILLRANGEMIN; + skill += EL_SKILLBASE; } - case NJ_KAENSIN: - { - static const int dx[] = {-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2}; - static const int dy[] = { 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2}; - skill_unit_layout[pos].count = 24; + if( skill == EL_FIRE_MANTLE ) { + static const int dx[] = {-1, 0, 1, 1, 1, 0,-1,-1}; + static const int dy[] = { 1, 1, 1, 0,-1,-1,-1, 0}; + skill_unit_layout[pos].count = 8; memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); - break; } - case NJ_TATAMIGAESHI: - { - //Level 1 (count 4, cross of 3x3) - static const int dx1[] = {-1, 1, 0, 0}; - static const int dy1[] = { 0, 0,-1, 1}; - //Level 2-3 (count 8, cross of 5x5) - static const int dx2[] = {-2,-1, 1, 2, 0, 0, 0, 0}; - static const int dy2[] = { 0, 0, 0, 0,-2,-1, 1, 2}; - //Level 4-5 (count 12, cross of 7x7 - static const int dx3[] = {-3,-2,-1, 1, 2, 3, 0, 0, 0, 0, 0, 0}; - static const int dy3[] = { 0, 0, 0, 0, 0, 0,-3,-2,-1, 1, 2, 3}; - //lv1 - j = 0; - skill_unit_layout[pos].count = 4; - memcpy(skill_unit_layout[pos].dx,dx1,sizeof(dx1)); - memcpy(skill_unit_layout[pos].dy,dy1,sizeof(dy1)); - skill_db[i].unit_layout_type[j] = pos; - //lv2/3 - j++; - pos++; - skill_unit_layout[pos].count = 8; - memcpy(skill_unit_layout[pos].dx,dx2,sizeof(dx2)); - memcpy(skill_unit_layout[pos].dy,dy2,sizeof(dy2)); - skill_db[i].unit_layout_type[j] = pos; - skill_db[i].unit_layout_type[++j] = pos; - //lv4/5 - j++; - pos++; - skill_unit_layout[pos].count = 12; - memcpy(skill_unit_layout[pos].dx,dx3,sizeof(dx3)); - memcpy(skill_unit_layout[pos].dy,dy3,sizeof(dy3)); - skill_db[i].unit_layout_type[j] = pos; - skill_db[i].unit_layout_type[++j] = pos; - //Fill in the rest using lv 5. - for (;j<MAX_SKILL_LEVEL;j++) - skill_db[i].unit_layout_type[j] = pos; - //Skip, this way the check below will fail and continue to the next skill. - pos++; - break; + } else { + switch (i) { + case MG_FIREWALL: + case WZ_ICEWALL: + case WL_EARTHSTRAIN://Warlock + // these will be handled later + break; + case PR_SANCTUARY: + case NPC_EVILLAND: { + static const int dx[] = { + -1, 0, 1,-2,-1, 0, 1, 2,-2,-1, + 0, 1, 2,-2,-1, 0, 1, 2,-1, 0, 1}; + static const int dy[]={ + -2,-2,-2,-1,-1,-1,-1,-1, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2}; + skill_unit_layout[pos].count = 21; + memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); + memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); + } + break; + case PR_MAGNUS: { + static const int dx[] = { + -1, 0, 1,-1, 0, 1,-3,-2,-1, 0, + 1, 2, 3,-3,-2,-1, 0, 1, 2, 3, + -3,-2,-1, 0, 1, 2, 3,-1, 0, 1,-1, 0, 1}; + static const int dy[] = { + -3,-3,-3,-2,-2,-2,-1,-1,-1,-1, + -1,-1,-1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3}; + skill_unit_layout[pos].count = 33; + memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); + memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); + } + break; + case AS_VENOMDUST: { + static const int dx[] = {-1, 0, 0, 0, 1}; + static const int dy[] = { 0,-1, 0, 1, 0}; + skill_unit_layout[pos].count = 5; + memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); + memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); + } + break; + case CR_GRANDCROSS: + case NPC_GRANDDARKNESS: { + static const int dx[] = { + 0, 0,-1, 0, 1,-2,-1, 0, 1, 2, + -4,-3,-2,-1, 0, 1, 2, 3, 4,-2, + -1, 0, 1, 2,-1, 0, 1, 0, 0}; + static const int dy[] = { + -4,-3,-2,-2,-2,-1,-1,-1,-1,-1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 2, 2, 2, 3, 4}; + skill_unit_layout[pos].count = 29; + memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); + memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); + } + break; + case PF_FOGWALL: { + static const int dx[] = { + -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2}; + static const int dy[] = { + -1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}; + skill_unit_layout[pos].count = 15; + memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); + memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); + } + break; + case PA_GOSPEL: { + static const int dx[] = { + -1, 0, 1,-1, 0, 1,-3,-2,-1, 0, + 1, 2, 3,-3,-2,-1, 0, 1, 2, 3, + -3,-2,-1, 0, 1, 2, 3,-1, 0, 1, + -1, 0, 1}; + static const int dy[] = { + -3,-3,-3,-2,-2,-2,-1,-1,-1,-1, + -1,-1,-1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, + 3, 3, 3}; + skill_unit_layout[pos].count = 33; + memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); + memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); + } + break; + case NJ_KAENSIN: { + static const int dx[] = {-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2}; + static const int dy[] = { 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2}; + skill_unit_layout[pos].count = 24; + memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); + memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); + } + break; + case NJ_TATAMIGAESHI: { + //Level 1 (count 4, cross of 3x3) + static const int dx1[] = {-1, 1, 0, 0}; + static const int dy1[] = { 0, 0,-1, 1}; + //Level 2-3 (count 8, cross of 5x5) + static const int dx2[] = {-2,-1, 1, 2, 0, 0, 0, 0}; + static const int dy2[] = { 0, 0, 0, 0,-2,-1, 1, 2}; + //Level 4-5 (count 12, cross of 7x7 + static const int dx3[] = {-3,-2,-1, 1, 2, 3, 0, 0, 0, 0, 0, 0}; + static const int dy3[] = { 0, 0, 0, 0, 0, 0,-3,-2,-1, 1, 2, 3}; + //lv1 + j = 0; + skill_unit_layout[pos].count = 4; + memcpy(skill_unit_layout[pos].dx,dx1,sizeof(dx1)); + memcpy(skill_unit_layout[pos].dy,dy1,sizeof(dy1)); + skill_db[i].unit_layout_type[j] = pos; + //lv2/3 + j++; + pos++; + skill_unit_layout[pos].count = 8; + memcpy(skill_unit_layout[pos].dx,dx2,sizeof(dx2)); + memcpy(skill_unit_layout[pos].dy,dy2,sizeof(dy2)); + skill_db[i].unit_layout_type[j] = pos; + skill_db[i].unit_layout_type[++j] = pos; + //lv4/5 + j++; + pos++; + skill_unit_layout[pos].count = 12; + memcpy(skill_unit_layout[pos].dx,dx3,sizeof(dx3)); + memcpy(skill_unit_layout[pos].dy,dy3,sizeof(dy3)); + skill_db[i].unit_layout_type[j] = pos; + skill_db[i].unit_layout_type[++j] = pos; + //Fill in the rest using lv 5. + for (;j<MAX_SKILL_LEVEL;j++) + skill_db[i].unit_layout_type[j] = pos; + //Skip, this way the check below will fail and continue to the next skill. + pos++; + } + break; + case GN_WALLOFTHORN: { + static const int dx[] = {-1,-2,-2,-2,-2,-2,-1, 0, 1, 2, 2, 2, 2, 2, 1, 0}; + static const int dy[] = { 2, 2, 1, 0,-1,-2,-2,-2,-2,-2,-1, 0, 1, 2, 2, 2}; + skill_unit_layout[pos].count = 16; + memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); + memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); + } + break; + default: + ShowError("unknown unit layout at skill %d\n",i); + break; } - default: - ShowError("unknown unit layout at skill %d\n",i); - break; } if (!skill_unit_layout[pos].count) continue; @@ -15364,6 +16280,21 @@ int skill_stasis_check(struct block_list *bl, int src_id, int skillid) { return 0; // Can Cast anything else like Weapon Skills } +int skill_get_elemental_type( int skill_id , int skill_lv ) { + int type = 0; + + switch( skill_id ) { + case SO_SUMMON_AGNI: type = 2114; break; + case SO_SUMMON_AQUA: type = 2117; break; + case SO_SUMMON_VENTUS: type = 2120; break; + case SO_SUMMON_TERA: type = 2123; break; + } + + type += skill_lv - 1; + + return type; +} + /** * reload stored skill cooldowns when a player logs in. * @param sd the affected player structure @@ -15408,8 +16339,8 @@ static bool skill_parse_row_skilldb(char* split[], int columns, int current) int i; if( (id >= GD_SKILLRANGEMIN && id <= GD_SKILLRANGEMAX) || (id >= HM_SKILLRANGEMIN && id <= HM_SKILLRANGEMAX) - || (id >= MC_SKILLRANGEMIN && id <= MC_SKILLRANGEMAX) ) - { + || (id >= MC_SKILLRANGEMIN && id <= MC_SKILLRANGEMAX) + || (id >= EL_SKILLRANGEMIN && id <= EL_SKILLRANGEMAX) ) { ShowWarning("skill_parse_row_skilldb: Skill id %d is forbidden (interferes with guild/homun/mercenary skill mapping)!\n", id); return false; } diff --git a/src/map/skill.h b/src/map/skill.h index 1275b3910..e7108e2f7 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -1705,49 +1705,49 @@ enum { UNT_EVILLAND, UNT_DARK_RUNNER, //TODO UNT_DARK_TRANSFER, //TODO - UNT_EPICLESIS, //TODO - UNT_EARTHSTRAIN, //TODO - UNT_MANHOLE, //TODO - UNT_DIMENSIONDOOR, //TODO - UNT_CHAOSPANIC, //TODO - UNT_MAELSTROM, //TODO - UNT_BLOODYLUST, //TODO - UNT_FEINTBOMB, //TODO - UNT_MAGENTATRAP, //TODO - UNT_COBALTTRAP, //TODO - UNT_MAIZETRAP, //TODO - UNT_VERDURETRAP, //TODO - UNT_FIRINGTRAP, //TODO - UNT_ICEBOUNDTRAP, //TODO - UNT_ELECTRICSHOCKER, //TODO - UNT_CLUSTERBOMB, //TODO - UNT_REVERBERATION, //TODO - UNT_SEVERE_RAINSTORM, //TODO - UNT_FIREWALK, //TODO - UNT_ELECTRICWALK, //TODO - UNT_NETHERWORLD, //TODO - UNT_PSYCHIC_WAVE, //TODO - UNT_CLOUD_KILL, //TODO - UNT_POISONSMOKE, //TODO - UNT_NEUTRALBARRIER, //TODO - UNT_STEALTHFIELD, //TODO - UNT_WARMER, //TODO - UNT_THORNS_TRAP, //TODO - UNT_WALLOFTHORN, //TODO - UNT_DEMONIC_FIRE, //TODO - UNT_FIRE_EXPANSION_SMOKE_POWDER, //TODO - UNT_FIRE_EXPANSION_TEAR_GAS, //TODO - UNT_HELLS_PLANT, //TODO - UNT_VACUUM_EXTREME, //TODO - UNT_BANDING, //TODO - UNT_FIRE_MANTLE, //TODO - UNT_WATER_BARRIER, //TODO - UNT_ZEPHYR, //TODO - UNT_POWER_OF_GAIA, //TODO - UNT_FIRE_INSIGNIA, //TODO - UNT_WATER_INSIGNIA, //TODO - UNT_WIND_INSIGNIA, //TODO - UNT_EARTH_INSIGNIA, //TODO + UNT_EPICLESIS, + UNT_EARTHSTRAIN, + UNT_MANHOLE, + UNT_DIMENSIONDOOR, + UNT_CHAOSPANIC, + UNT_MAELSTROM, + UNT_BLOODYLUST, + UNT_FEINTBOMB, + UNT_MAGENTATRAP, + UNT_COBALTTRAP, + UNT_MAIZETRAP, + UNT_VERDURETRAP, + UNT_FIRINGTRAP, + UNT_ICEBOUNDTRAP, + UNT_ELECTRICSHOCKER, + UNT_CLUSTERBOMB, + UNT_REVERBERATION, + UNT_SEVERE_RAINSTORM, + UNT_FIREWALK, + UNT_ELECTRICWALK, + UNT_NETHERWORLD, + UNT_PSYCHIC_WAVE, + UNT_CLOUD_KILL, + UNT_POISONSMOKE, + UNT_NEUTRALBARRIER, + UNT_STEALTHFIELD, + UNT_WARMER, + UNT_THORNS_TRAP, + UNT_WALLOFTHORN, + UNT_DEMONIC_FIRE, + UNT_FIRE_EXPANSION_SMOKE_POWDER, + UNT_FIRE_EXPANSION_TEAR_GAS, + UNT_HELLS_PLANT, + UNT_VACUUM_EXTREME, + UNT_BANDING, + UNT_FIRE_MANTLE, + UNT_WATER_BARRIER, + UNT_ZEPHYR, + UNT_POWER_OF_GAIA, + UNT_FIRE_INSIGNIA, + UNT_WATER_INSIGNIA, + UNT_WIND_INSIGNIA, + UNT_EARTH_INSIGNIA, UNT_POISON_MIST, UNT_LAVA_SLIDE, UNT_VOLCANIC_ASH, @@ -1823,4 +1823,9 @@ enum gx_poison { * Auto Shadow Spell (Shadow Chaser) **/ int skill_select_menu(struct map_session_data *sd,int flag,int skill_id); + +int skill_elementalanalysis(struct map_session_data *sd, int n, int type, unsigned short *item_list); // Sorcerer Four Elemental Analisys. +int skill_changematerial(struct map_session_data *sd, int n, unsigned short *item_list); // Genetic Change Material. +int skill_get_elemental_type(int skill_id, int skill_lv); + #endif /* _SKILL_H_ */ diff --git a/src/map/status.c b/src/map/status.c index 162765aa3..972553d94 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -29,6 +29,7 @@ #include "unit.h" #include "homunculus.h" #include "mercenary.h" +#include "elemental.h" #include "vending.h" #include <time.h> @@ -645,28 +646,57 @@ void initChangeTables(void) set_sc( WM_MELODYOFSINK , SC_MELODYOFSINK , SI_MELODYOFSINK , SCB_BATK|SCB_MATK ); set_sc( WM_BEYOND_OF_WARCRY , SC_BEYONDOFWARCRY , SI_WARCRYOFBEYOND , SCB_BATK|SCB_MATK ); set_sc( WM_UNLIMITED_HUMMING_VOICE, SC_UNLIMITEDHUMMINGVOICE, SI_UNLIMITEDHUMMINGVOICE, SCB_NONE ); - ///** - // * Sorcerer - // **/ - //set_sc( SO_FIREWALK , SC_PROPERTYWALK , SI_PROPERTYWALK , SCB_NONE ); - //set_sc( SO_ELECTRICWALK , SC_PROPERTYWALK , SI_PROPERTYWALK , SCB_NONE ); - //set_sc( SO_SPELLFIST , SC_SPELLFIST , SI_SPELLFIST , SCB_NONE ); - //set_sc( SO_CLOUD_KILL , SC_POISON , SI_CLOUDKILL , SCB_NONE ); - //set_sc( SO_STRIKING , SC_STRIKING , SI_STRIKING , SCB_WATK|SCB_CRI ); - //set_sc( SO_WARMER , SC_WARMER , SI_WARMER , SCB_NONE ); - //set_sc( SO_VACUUM_EXTREME , SC_VACUUM_EXTREME , SI_VACUUM_EXTREME , SCB_NONE ); - //set_sc( SO_ARRULLO , SC_DEEPSLEEP , SI_DEEPSLEEP , SCB_NONE ); - ///** - // * Genetic - // **/ - //set_sc( GN_CARTBOOST , SC_GN_CARTBOOST, SI_CARTSBOOST , SCB_SPEED ); - //set_sc( GN_THORNS_TRAP , SC_THORNSTRAP , SI_THORNTRAP , SCB_NONE ); - //set_sc( GN_BLOOD_SUCKER , SC_BLOODSUCKER , SI_BLOODSUCKER , SCB_NONE ); - //set_sc( GN_WALLOFTHORN , SC_STOP , SI_BLANK , SCB_NONE ); - //set_sc( GN_FIRE_EXPANSION_SMOKE_POWDER, SC_SMOKEPOWDER , SI_FIRE_EXPANSION_SMOKE_POWDER, SCB_NONE ); - //set_sc( GN_FIRE_EXPANSION_TEAR_GAS , SC_TEARGAS , SI_FIRE_EXPANSION_TEAR_GAS , SCB_NONE ); - //set_sc( GN_MANDRAGORA , SC_MANDRAGORA , SI_MANDRAGORA , SCB_INT ); - + /** + * Sorcerer + **/ + set_sc( SO_FIREWALK , SC_PROPERTYWALK , SI_PROPERTYWALK , SCB_NONE ); + set_sc( SO_ELECTRICWALK , SC_PROPERTYWALK , SI_PROPERTYWALK , SCB_NONE ); + set_sc( SO_SPELLFIST , SC_SPELLFIST , SI_SPELLFIST , SCB_NONE ); + set_sc( SO_DIAMONDDUST , SC_CRYSTALIZE , SI_COLD , SCB_NONE );//Will add flags in major balance update 8 [Rytech] + set_sc( SO_CLOUD_KILL , SC_POISON , SI_CLOUDKILL , SCB_NONE ); + set_sc( SO_STRIKING , SC_STRIKING , SI_STRIKING , SCB_WATK|SCB_CRI ); + set_sc( SO_WARMER , SC_WARMER , SI_WARMER , SCB_NONE ); + set_sc( SO_VACUUM_EXTREME , SC_VACUUM_EXTREME , SI_VACUUM_EXTREME , SCB_NONE ); + set_sc( SO_ARRULLO , SC_DEEPSLEEP , SI_DEEPSLEEP , SCB_NONE ); + /** + * Genetic + **/ + set_sc( GN_CARTBOOST , SC_GN_CARTBOOST, SI_CARTSBOOST , SCB_SPEED ); + set_sc( GN_THORNS_TRAP , SC_THORNSTRAP , SI_THORNTRAP , SCB_NONE ); + set_sc( GN_BLOOD_SUCKER , SC_BLOODSUCKER , SI_BLOODSUCKER , SCB_NONE ); + set_sc( GN_WALLOFTHORN , SC_STOP , SI_BLANK , SCB_NONE ); + set_sc( GN_FIRE_EXPANSION_SMOKE_POWDER, SC_SMOKEPOWDER , SI_FIRE_EXPANSION_SMOKE_POWDER, SCB_NONE ); + set_sc( GN_FIRE_EXPANSION_TEAR_GAS , SC_TEARGAS , SI_FIRE_EXPANSION_TEAR_GAS , SCB_NONE ); + set_sc( GN_MANDRAGORA , SC_MANDRAGORA , SI_MANDRAGORA , SCB_INT ); + + // Elemental Spirit summoner's 'side' status changes. + set_sc( EL_CIRCLE_OF_FIRE , SC_CIRCLE_OF_FIRE_OPTION, SI_CIRCLE_OF_FIRE_OPTION, SCB_NONE ); + set_sc( EL_FIRE_CLOAK , SC_FIRE_CLOAK_OPTION , SI_FIRE_CLOAK_OPTION , SCB_ALL ); + set_sc( EL_WATER_SCREEN , SC_WATER_SCREEN_OPTION , SI_WATER_SCREEN_OPTION , SCB_NONE ); + set_sc( EL_WATER_DROP , SC_WATER_DROP_OPTION , SI_WATER_DROP_OPTION , SCB_ALL ); + set_sc( EL_WATER_BARRIER , SC_WATER_BARRIER , SI_WATER_BARRIER , SCB_MDEF|SCB_WATK|SCB_MATK|SCB_FLEE ); + set_sc( EL_WIND_STEP , SC_WIND_STEP_OPTION , SI_WIND_STEP_OPTION , SCB_SPEED|SCB_FLEE ); + set_sc( EL_WIND_CURTAIN , SC_WIND_CURTAIN_OPTION , SI_WIND_CURTAIN_OPTION , SCB_ALL ); + set_sc( EL_ZEPHYR , SC_ZEPHYR , SI_ZEPHYR , SCB_FLEE ); + set_sc( EL_SOLID_SKIN , SC_SOLID_SKIN_OPTION , SI_SOLID_SKIN_OPTION , SCB_DEF|SCB_MAXHP ); + set_sc( EL_STONE_SHIELD , SC_STONE_SHIELD_OPTION , SI_STONE_SHIELD_OPTION , SCB_ALL ); + set_sc( EL_POWER_OF_GAIA , SC_POWER_OF_GAIA , SI_POWER_OF_GAIA , SCB_MAXHP|SCB_DEF|SCB_SPEED ); + set_sc( EL_PYROTECHNIC , SC_PYROTECHNIC_OPTION , SI_PYROTECHNIC_OPTION , SCB_WATK ); + set_sc( EL_HEATER , SC_HEATER_OPTION , SI_HEATER_OPTION , SCB_WATK ); + set_sc( EL_TROPIC , SC_TROPIC_OPTION , SI_TROPIC_OPTION , SCB_WATK ); + set_sc( EL_AQUAPLAY , SC_AQUAPLAY_OPTION , SI_AQUAPLAY_OPTION , SCB_MATK ); + set_sc( EL_COOLER , SC_COOLER_OPTION , SI_COOLER_OPTION , SCB_MATK ); + set_sc( EL_CHILLY_AIR , SC_CHILLY_AIR_OPTION , SI_CHILLY_AIR_OPTION , SCB_MATK ); + set_sc( EL_GUST , SC_GUST_OPTION , SI_GUST_OPTION , SCB_NONE ); + set_sc( EL_BLAST , SC_BLAST_OPTION , SI_BLAST_OPTION , SCB_NONE ); + set_sc( EL_WILD_STORM , SC_WILD_STORM_OPTION , SI_WILD_STORM_OPTION , SCB_NONE ); + set_sc( EL_PETROLOGY , SC_PETROLOGY_OPTION , SI_PETROLOGY_OPTION , SCB_NONE ); + set_sc( EL_CURSED_SOIL , SC_CURSED_SOIL_OPTION , SI_CURSED_SOIL_OPTION , SCB_NONE ); + set_sc( EL_UPHEAVAL , SC_UPHEAVAL_OPTION , SI_UPHEAVAL_OPTION , SCB_NONE ); + set_sc( EL_TIDAL_WEAPON , SC_TIDAL_WEAPON_OPTION , SI_TIDAL_WEAPON_OPTION , SCB_ALL ); + set_sc( EL_ROCK_CRUSHER , SC_ROCK_CRUSHER , SI_ROCK_CRUSHER , SCB_DEF ); + set_sc( EL_ROCK_CRUSHER_ATK, SC_ROCK_CRUSHER_ATK , SI_ROCK_CRUSHER_ATK , SCB_SPEED ); + // Storing the target job rather than simply SC_SPIRIT simplifies code later on. SkillStatusChangeTable[SL_ALCHEMIST] = (sc_type)MAPID_ALCHEMIST, SkillStatusChangeTable[SL_MONK] = (sc_type)MAPID_MONK, @@ -882,11 +912,20 @@ void initChangeTables(void) StatusChangeFlagTable[SC_SIROMA_ICE_TEA] |= SCB_DEX; StatusChangeFlagTable[SC_DROCERA_HERB_STEAMED] |= SCB_AGI; StatusChangeFlagTable[SC_PUTTI_TAILS_NOODLES] |= SCB_LUK; + StatusChangeFlagTable[SC_BOOST500] |= SCB_ASPD; + StatusChangeFlagTable[SC_FULL_SWING_K] |= SCB_BATK; + StatusChangeFlagTable[SC_MANA_PLUS] |= SCB_MATK; + StatusChangeFlagTable[SC_MUSTLE_M] |= SCB_MAXHP; + StatusChangeFlagTable[SC_LIFE_FORCE_F] |= SCB_MAXSP; + StatusChangeFlagTable[SC_EXTRACT_WHITE_POTION_Z] |= SCB_REGEN; + StatusChangeFlagTable[SC_VITATA_500] |= SCB_REGEN; + StatusChangeFlagTable[SC_EXTRACT_SALAMINE_JUICE] |= SCB_ASPD; #ifdef RENEWAL_EDP // renewal EDP increases your atk and weapon atk StatusChangeFlagTable[SC_EDP] |= SCB_BATK|SCB_WATK; #endif + if( !battle_config.display_hallucination ) //Disable Hallucination. StatusIconChangeTable[SC_HALLUCINATION] = SI_BLANK; } @@ -1077,6 +1116,7 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s case BL_MOB: mob_damage((TBL_MOB*)target, src, hp); break; case BL_HOM: merc_damage((TBL_HOM*)target,src,hp,sp); break; case BL_MER: mercenary_damage((TBL_MER*)target,src,hp,sp); break; + case BL_ELEM: elemental_damage((TBL_ELEM*)target,src,hp,sp); break; } if( target->type == BL_PC && ((TBL_PC*)target)->disguise && src ) @@ -1102,6 +1142,7 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s case BL_MOB: flag = mob_dead((TBL_MOB*)target, src, flag&4?3:0); break; case BL_HOM: flag = merc_hom_dead((TBL_HOM*)target,src); break; case BL_MER: flag = mercenary_dead((TBL_MER*)target,src); break; + case BL_ELEM: flag = elemental_dead((TBL_ELEM*)target,src); break; default: //Unhandled case, do nothing to object. flag = 0; break; @@ -1239,6 +1280,7 @@ int status_heal(struct block_list *bl,int hp,int sp, int flag) case BL_MOB: mob_heal((TBL_MOB*)bl,hp); break; case BL_HOM: merc_hom_heal((TBL_HOM*)bl,hp,sp); break; case BL_MER: mercenary_heal((TBL_MER*)bl,hp,sp); break; + case BL_ELEM: elemental_heal((TBL_ELEM*)bl,hp,sp); break; } return hp+sp; @@ -1378,6 +1420,8 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int //on dead characters, said checks are left to skill.c [Skotlex] if (target && status_isdead(target)) return 0; + if( src && (sc = status_get_sc(src)) && sc->data[SC_CRYSTALIZE] ) + return 0; } if (skill_num == PA_PRESSURE && flag && target) { @@ -1394,12 +1438,11 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int && (src->type != BL_PC || ((TBL_PC*)src)->skillitem != skill_num)) return 0; - if (src) sc = status_get_sc(src); + if ( src ) sc = status_get_sc(src); - if(sc && sc->count) - { - if(sc->opt1 >0 && sc->opt1 != OPT1_BURNING && skill_num != SR_GENTLETOUCH_CURE) - { //Stuned/Frozen/etc + if( sc && sc->count ) { + + if( sc->opt1 >0 && sc->opt1 != OPT1_BURNING && skill_num != SR_GENTLETOUCH_CURE ) { //Stuned/Frozen/etc if (flag != 1) //Can't cast, casted stuff can't damage. return 0; if (!(skill_get_inf(skill_num)&INF_GROUND_SKILL)) @@ -1570,11 +1613,12 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int return 0; case BL_HOM: case BL_MER: + case BL_ELEM: if( target->type == BL_HOM && skill_num && battle_config.hom_setting&0x1 && skill_get_inf(skill_num)&INF_SUPPORT_SKILL && battle_get_master(target) != src ) return 0; // Can't use support skills on Homunculus (only Master/Self) if( target->type == BL_MER && (skill_num == PR_ASPERSIO || (skill_num >= SA_FLAMELAUNCHER && skill_num <= SA_SEISMICWEAPON)) && battle_get_master(target) != src ) return 0; // Can't use Weapon endow skills on Mercenary (only Master) - if( target->type == BL_MER && skill_num == AM_POTIONPITCHER ) + if( skill_num == AM_POTIONPITCHER && ( target->type == BL_MER || target->type == BL_ELEM) ) return 0; // Can't use Potion Pitcher on Mercenaries default: //Check for chase-walk/hiding/cloaking opponents. @@ -2848,8 +2892,7 @@ int status_calc_pc_(struct map_session_data* sd, bool first) } if(sc->count){ - if(sc->data[SC_CONCENTRATE]) - { //Update the card-bonus data + if(sc->data[SC_CONCENTRATE]) { //Update the card-bonus data sc->data[SC_CONCENTRATE]->val3 = sd->param_bonus[1]; //Agi sc->data[SC_CONCENTRATE]->val4 = sd->param_bonus[4]; //Dex } @@ -2869,20 +2912,38 @@ int status_calc_pc_(struct map_session_data* sd, bool first) sd->subele[ELE_HOLY] += sc->data[SC_PROVIDENCE]->val2; sd->subrace[RC_DEMON] += sc->data[SC_PROVIDENCE]->val2; } - if(sc->data[SC_ARMOR_ELEMENT]) - { //This status change should grant card-type elemental resist. + if(sc->data[SC_ARMOR_ELEMENT]) { //This status change should grant card-type elemental resist. sd->subele[ELE_WATER] += sc->data[SC_ARMOR_ELEMENT]->val1; sd->subele[ELE_EARTH] += sc->data[SC_ARMOR_ELEMENT]->val2; sd->subele[ELE_FIRE] += sc->data[SC_ARMOR_ELEMENT]->val3; sd->subele[ELE_WIND] += sc->data[SC_ARMOR_ELEMENT]->val4; } - if(sc->data[SC_ARMOR_RESIST]) - { // Undead Scroll + if(sc->data[SC_ARMOR_RESIST]) { // Undead Scroll sd->subele[ELE_WATER] += sc->data[SC_ARMOR_RESIST]->val1; sd->subele[ELE_EARTH] += sc->data[SC_ARMOR_RESIST]->val2; sd->subele[ELE_FIRE] += sc->data[SC_ARMOR_RESIST]->val3; sd->subele[ELE_WIND] += sc->data[SC_ARMOR_RESIST]->val4; } + if( sc->data[SC_FIRE_CLOAK_OPTION] ) { + i = sc->data[SC_FIRE_CLOAK_OPTION]->val2; + sd->subele[ELE_FIRE] += i; + sd->subele[ELE_EARTH] -= i; + } + if( sc->data[SC_WATER_DROP_OPTION] ) { + i = sc->data[SC_WATER_DROP_OPTION]->val2; + sd->subele[ELE_WATER] += i; + sd->subele[ELE_WIND] -= i; + } + if( sc->data[SC_WIND_CURTAIN_OPTION] ) { + i = sc->data[SC_WIND_CURTAIN_OPTION]->val2; + sd->subele[ELE_WIND] += i; + sd->subele[ELE_WATER] -= i; + } + if( sc->data[SC_STONE_SHIELD_OPTION] ) { + i = sc->data[SC_STONE_SHIELD_OPTION]->val2; + sd->subele[ELE_EARTH] += i; + sd->subele[ELE_FIRE] -= i; + } } status_cpy(&sd->battle_status, status); @@ -3006,6 +3067,45 @@ int status_calc_homunculus_(struct homun_data *hd, bool first) return 1; } +int status_calc_elemental_(struct elemental_data *ed, bool first) { + struct status_data *status = &ed->base_status; + struct s_elemental *ele = &ed->elemental; + struct map_session_data *sd = ed->master; + + if( !sd ) + return 0; + + status->str = ele->str; + status->agi = ele->agi; + status->vit = ele->vit; + status->dex = ele->dex; + status->int_ = ele->int_; + status->luk = ele->luk; + + if( first ) { + memcpy(status, &ed->db->status, sizeof(struct status_data)); + status->mode = MD_CANMOVE|MD_CANATTACK; + status->max_hp += 4000 + 500 * pc_checkskill(sd,SO_EL_SYMPATHY); + status->max_sp += 300 + 50 * pc_checkskill(sd,SO_EL_SYMPATHY); + status->hp = status->max_hp; + status->sp = status->max_sp; + status->str += sd->base_status.str * 25 / 100; + status->agi += sd->base_status.agi * 25 / 100; + status->vit += sd->base_status.vit * 25 / 100; + status->int_ += sd->base_status.int_ * 25 / 100; + status->def += sd->base_status.dex * 25 / 100; + status->luk += sd->base_status.luk * 25 / 100; + + status_calc_misc(&ed->bl, status, ed->db->lv); + memcpy(&ed->battle_status,status,sizeof(struct status_data)); + } else { + status_calc_misc(&ed->bl, status, ed->db->lv); + status_cpy(&ed->battle_status, status); + } + + return 0; +} + static unsigned short status_calc_str(struct block_list *,struct status_change *,int); static unsigned short status_calc_agi(struct block_list *,struct status_change *,int); static unsigned short status_calc_vit(struct block_list *,struct status_change *,int); @@ -3107,27 +3207,28 @@ void status_calc_regen(struct block_list *bl, struct status_data *status, struct sregen->sp = cap_value(val, 0, SHRT_MAX); } - if( bl->type == BL_HOM ) - { + if( bl->type == BL_HOM ) { struct homun_data *hd = (TBL_HOM*)bl; - if( (skill = merc_hom_checkskill(hd,HAMI_SKIN)) > 0 ) - { + if( (skill = merc_hom_checkskill(hd,HAMI_SKIN)) > 0 ) { val = regen->hp*(100+5*skill)/100; regen->hp = cap_value(val, 1, SHRT_MAX); } - if( (skill = merc_hom_checkskill(hd,HLIF_BRAIN)) > 0 ) - { + if( (skill = merc_hom_checkskill(hd,HLIF_BRAIN)) > 0 ) { val = regen->sp*(100+3*skill)/100; regen->sp = cap_value(val, 1, SHRT_MAX); } - } - else if( bl->type == BL_MER ) - { + } else if( bl->type == BL_MER ) { val = (status->max_hp * status->vit / 10000 + 1) * 6; regen->hp = cap_value(val, 1, SHRT_MAX); val = (status->max_sp * (status->int_ + 10) / 750) + 1; regen->sp = cap_value(val, 1, SHRT_MAX); + } else if( bl->type == BL_ELEM ) { + val = (status->max_hp * status->vit / 10000 + 1) * 6; + regen->hp = cap_value(val, 1, SHRT_MAX); + + val = (status->max_sp * (status->int_ + 10) / 750) + 1; + regen->sp = cap_value(val, 1, SHRT_MAX); } } @@ -3241,7 +3342,7 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) if(flag&SCB_VIT) { status->vit = status_calc_vit(bl, sc, b_status->vit); flag|=SCB_DEF2|SCB_MDEF2; - if( bl->type&(BL_PC|BL_HOM|BL_MER) ) + if( bl->type&(BL_PC|BL_HOM|BL_MER|BL_ELEM) ) flag |= SCB_MAXHP; if( bl->type&BL_HOM ) flag |= SCB_DEF; @@ -3250,7 +3351,7 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) if(flag&SCB_INT) { status->int_ = status_calc_int(bl, sc, b_status->int_); flag|=SCB_MATK|SCB_MDEF2; - if( bl->type&(BL_PC|BL_HOM|BL_MER) ) + if( bl->type&(BL_PC|BL_HOM|BL_MER|BL_ELEM) ) flag |= SCB_MAXSP; if( bl->type&BL_HOM ) flag |= SCB_MDEF; @@ -3582,15 +3683,14 @@ void status_calc_bl_(struct block_list* bl, enum scb_flag flag, bool first) status = status_get_status_data(bl); memcpy(&b_status, status, sizeof(struct status_data)); - if( flag&SCB_BASE ) - {// calculate the object's base status too - switch( bl->type ) - { + if( flag&SCB_BASE ) {// calculate the object's base status too + switch( bl->type ) { case BL_PC: status_calc_pc_(BL_CAST(BL_PC,bl), first); break; case BL_MOB: status_calc_mob_(BL_CAST(BL_MOB,bl), first); break; case BL_PET: status_calc_pet_(BL_CAST(BL_PET,bl), first); break; case BL_HOM: status_calc_homunculus_(BL_CAST(BL_HOM,bl), first); break; case BL_MER: status_calc_mercenary_(BL_CAST(BL_MER,bl), first); break; + case BL_ELEM: status_calc_elemental_(BL_CAST(BL_ELEM,bl), first); break; } } @@ -3671,17 +3771,11 @@ void status_calc_bl_(struct block_list* bl, enum scb_flag flag, bool first) clif_updatestatus(sd,SP_HP); if(b_status.sp != status->sp) clif_updatestatus(sd,SP_SP); - } - else - if( bl->type == BL_HOM ) - { + } else if( bl->type == BL_HOM ) { TBL_HOM* hd = BL_CAST(BL_HOM, bl); if( hd->master && memcmp(&b_status, status, sizeof(struct status_data)) != 0 ) clif_hominfo(hd->master,hd,0); - } - else - if( bl->type == BL_MER ) - { + } else if( bl->type == BL_MER ) { TBL_MER* md = BL_CAST(BL_MER, bl); if( b_status.rhw.atk != status->rhw.atk || b_status.rhw.atk2 != status->rhw.atk2 ) clif_mercenary_updatestatus(md->master, SP_ATK1); @@ -3707,7 +3801,17 @@ void status_calc_bl_(struct block_list* bl, enum scb_flag flag, bool first) clif_mercenary_updatestatus(md->master, SP_HP); if( b_status.sp != status->sp ) clif_mercenary_updatestatus(md->master, SP_SP); - } + } else if( bl->type == BL_ELEM ) { + TBL_ELEM* ed = BL_CAST(BL_ELEM, bl); + if( b_status.max_hp != status->max_hp ) + clif_elemental_updatestatus(ed->master, SP_MAXHP); + if( b_status.max_sp != status->max_sp ) + clif_elemental_updatestatus(ed->master, SP_MAXSP); + if( b_status.hp != status->hp ) + clif_elemental_updatestatus(ed->master, SP_HP); + if( b_status.sp != status->sp ) + clif_mercenary_updatestatus(ed->master, SP_SP); + } } /*========================================== @@ -4641,6 +4745,10 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha val = max( val, 75 ); if( sc->data[SC_CLOAKINGEXCEED] ) val = max( val, sc->data[SC_CLOAKINGEXCEED]->val3); + if( sc->data[SC_HOVERING] ) + val = max( val, 10 ); + if( sc->data[SC_GN_CARTBOOST] ) + val = max( val, sc->data[SC_GN_CARTBOOST]->val2 ); if( sc->data[SC_GT_REVITALIZE] ) val = max( val, sc->data[SC_GT_REVITALIZE]->val2 ); if( sc->data[SC_SWINGDANCE] ) @@ -5005,8 +5113,7 @@ static unsigned short status_calc_mode(struct block_list *bl, struct status_chan return cap_value(mode,0,USHRT_MAX); } -const char* status_get_name(struct block_list *bl) -{ +const char* status_get_name(struct block_list *bl) { nullpo_ret(bl); switch (bl->type) { case BL_PC: return ((TBL_PC *)bl)->fakename[0] != '\0' ? ((TBL_PC*)bl)->fakename : ((TBL_PC*)bl)->status.name; @@ -5022,17 +5129,16 @@ const char* status_get_name(struct block_list *bl) * 対象のClassを返す(汎用) * 戻りは整数で0以上 *------------------------------------------*/ -int status_get_class(struct block_list *bl) -{ +int status_get_class(struct block_list *bl) { nullpo_ret(bl); - switch( bl->type ) - { - case BL_PC: return ((TBL_PC*)bl)->status.class_; - case BL_MOB: return ((TBL_MOB*)bl)->vd->class_; //Class used on all code should be the view class of the mob. - case BL_PET: return ((TBL_PET*)bl)->pet.class_; - case BL_HOM: return ((TBL_HOM*)bl)->homunculus.class_; - case BL_MER: return ((TBL_MER*)bl)->mercenary.class_; - case BL_NPC: return ((TBL_NPC*)bl)->class_; + switch( bl->type ) { + case BL_PC: return ((TBL_PC*)bl)->status.class_; + case BL_MOB: return ((TBL_MOB*)bl)->vd->class_; //Class used on all code should be the view class of the mob. + case BL_PET: return ((TBL_PET*)bl)->pet.class_; + case BL_HOM: return ((TBL_HOM*)bl)->homunculus.class_; + case BL_MER: return ((TBL_MER*)bl)->mercenary.class_; + case BL_NPC: return ((TBL_NPC*)bl)->class_; + case BL_ELEM: return ((TBL_ELEM*)bl)->elemental.class_; } return 0; } @@ -5040,8 +5146,7 @@ int status_get_class(struct block_list *bl) * 対象のレベルを返す(汎用) * 戻りは整数で0以上 *------------------------------------------*/ -int status_get_lv(struct block_list *bl) -{ +int status_get_lv(struct block_list *bl) { nullpo_ret(bl); switch (bl->type) { case BL_PC: return ((TBL_PC*)bl)->status.base_level; @@ -5049,6 +5154,7 @@ int status_get_lv(struct block_list *bl) case BL_PET: return ((TBL_PET*)bl)->pet.level; case BL_HOM: return ((TBL_HOM*)bl)->homunculus.level; case BL_MER: return ((TBL_MER*)bl)->db->lv; + case BL_ELEM: return ((TBL_ELEM*)bl)->db->lv; } return 1; } @@ -5060,6 +5166,7 @@ struct regen_data *status_get_regen_data(struct block_list *bl) case BL_PC: return &((TBL_PC*)bl)->regen; case BL_HOM: return &((TBL_HOM*)bl)->regen; case BL_MER: return &((TBL_MER*)bl)->regen; + case BL_ELEM: return &((TBL_ELEM*)bl)->regen; default: return NULL; } @@ -5075,6 +5182,7 @@ struct status_data *status_get_status_data(struct block_list *bl) case BL_PET: return &((TBL_PET*)bl)->status; case BL_HOM: return &((TBL_HOM*)bl)->battle_status; case BL_MER: return &((TBL_MER*)bl)->battle_status; + case BL_ELEM: return &((TBL_ELEM*)bl)->battle_status; default: return &dummy_status; } @@ -5089,6 +5197,7 @@ struct status_data *status_get_base_status(struct block_list *bl) case BL_PET: return &((TBL_PET*)bl)->db->status; case BL_HOM: return &((TBL_HOM*)bl)->base_status; case BL_MER: return &((TBL_MER*)bl)->base_status; + case BL_ELEM: return &((TBL_ELEM*)bl)->base_status; default: return NULL; } @@ -5111,115 +5220,120 @@ unsigned short status_get_speed(struct block_list *bl) return status_get_status_data(bl)->speed; } -int status_get_party_id(struct block_list *bl) -{ +int status_get_party_id(struct block_list *bl) { nullpo_ret(bl); switch (bl->type) { - case BL_PC: - return ((TBL_PC*)bl)->status.party_id; - case BL_PET: - if (((TBL_PET*)bl)->msd) - return ((TBL_PET*)bl)->msd->status.party_id; - break; - case BL_MOB: - { - struct mob_data *md=(TBL_MOB*)bl; - if( md->master_id>0 ) - { - struct map_session_data *msd; - if (md->special_state.ai && (msd = map_id2sd(md->master_id)) != NULL) - return msd->status.party_id; - return -md->master_id; - } - } - break; - case BL_HOM: - if (((TBL_HOM*)bl)->master) - return ((TBL_HOM*)bl)->master->status.party_id; - break; - case BL_MER: - if (((TBL_MER*)bl)->master) - return ((TBL_MER*)bl)->master->status.party_id; - break; - case BL_SKILL: - return ((TBL_SKILL*)bl)->group->party_id; + case BL_PC: + return ((TBL_PC*)bl)->status.party_id; + case BL_PET: + if (((TBL_PET*)bl)->msd) + return ((TBL_PET*)bl)->msd->status.party_id; + break; + case BL_MOB: { + struct mob_data *md=(TBL_MOB*)bl; + if( md->master_id > 0 ) { + struct map_session_data *msd; + if (md->special_state.ai && (msd = map_id2sd(md->master_id)) != NULL) + return msd->status.party_id; + return -md->master_id; + } + } + break; + case BL_HOM: + if (((TBL_HOM*)bl)->master) + return ((TBL_HOM*)bl)->master->status.party_id; + break; + case BL_MER: + if (((TBL_MER*)bl)->master) + return ((TBL_MER*)bl)->master->status.party_id; + break; + case BL_SKILL: + return ((TBL_SKILL*)bl)->group->party_id; + case BL_ELEM: + if (((TBL_ELEM*)bl)->master) + return ((TBL_ELEM*)bl)->master->status.party_id; + break; } return 0; } -int status_get_guild_id(struct block_list *bl) -{ +int status_get_guild_id(struct block_list *bl) { nullpo_ret(bl); switch (bl->type) { - case BL_PC: - return ((TBL_PC*)bl)->status.guild_id; - case BL_PET: - if (((TBL_PET*)bl)->msd) - return ((TBL_PET*)bl)->msd->status.guild_id; - break; - case BL_MOB: - { - struct map_session_data *msd; - struct mob_data *md = (struct mob_data *)bl; - if (md->guardian_data) //Guardian's guild [Skotlex] - return md->guardian_data->guild_id; - if (md->special_state.ai && (msd = map_id2sd(md->master_id)) != NULL) - return msd->status.guild_id; //Alchemist's mobs [Skotlex] - } - break; - case BL_HOM: - if (((TBL_HOM*)bl)->master) - return ((TBL_HOM*)bl)->master->status.guild_id; - break; - case BL_MER: - if (((TBL_MER*)bl)->master) - return ((TBL_MER*)bl)->master->status.guild_id; - break; - case BL_NPC: - if (((TBL_NPC*)bl)->subtype == SCRIPT) - return ((TBL_NPC*)bl)->u.scr.guild_id; - break; - case BL_SKILL: - return ((TBL_SKILL*)bl)->group->guild_id; + case BL_PC: + return ((TBL_PC*)bl)->status.guild_id; + case BL_PET: + if (((TBL_PET*)bl)->msd) + return ((TBL_PET*)bl)->msd->status.guild_id; + break; + case BL_MOB: { + struct map_session_data *msd; + struct mob_data *md = (struct mob_data *)bl; + if (md->guardian_data) //Guardian's guild [Skotlex] + return md->guardian_data->guild_id; + if (md->special_state.ai && (msd = map_id2sd(md->master_id)) != NULL) + return msd->status.guild_id; //Alchemist's mobs [Skotlex] + } + break; + case BL_HOM: + if (((TBL_HOM*)bl)->master) + return ((TBL_HOM*)bl)->master->status.guild_id; + break; + case BL_MER: + if (((TBL_MER*)bl)->master) + return ((TBL_MER*)bl)->master->status.guild_id; + break; + case BL_NPC: + if (((TBL_NPC*)bl)->subtype == SCRIPT) + return ((TBL_NPC*)bl)->u.scr.guild_id; + break; + case BL_SKILL: + return ((TBL_SKILL*)bl)->group->guild_id; + case BL_ELEM: + if (((TBL_ELEM*)bl)->master) + return ((TBL_ELEM*)bl)->master->status.guild_id; + break; } return 0; } -int status_get_emblem_id(struct block_list *bl) -{ +int status_get_emblem_id(struct block_list *bl) { nullpo_ret(bl); switch (bl->type) { - case BL_PC: - return ((TBL_PC*)bl)->guild_emblem_id; - case BL_PET: - if (((TBL_PET*)bl)->msd) - return ((TBL_PET*)bl)->msd->guild_emblem_id; - break; - case BL_MOB: - { - struct map_session_data *msd; - struct mob_data *md = (struct mob_data *)bl; - if (md->guardian_data) //Guardian's guild [Skotlex] - return md->guardian_data->emblem_id; - if (md->special_state.ai && (msd = map_id2sd(md->master_id)) != NULL) - return msd->guild_emblem_id; //Alchemist's mobs [Skotlex] - } - break; - case BL_HOM: - if (((TBL_HOM*)bl)->master) - return ((TBL_HOM*)bl)->master->guild_emblem_id; - break; - case BL_MER: - if (((TBL_MER*)bl)->master) - return ((TBL_MER*)bl)->master->guild_emblem_id; - break; - case BL_NPC: - if (((TBL_NPC*)bl)->subtype == SCRIPT && ((TBL_NPC*)bl)->u.scr.guild_id > 0) { - struct guild *g = guild_search(((TBL_NPC*)bl)->u.scr.guild_id); - if (g) - return g->emblem_id; - } - break; + case BL_PC: + return ((TBL_PC*)bl)->guild_emblem_id; + case BL_PET: + if (((TBL_PET*)bl)->msd) + return ((TBL_PET*)bl)->msd->guild_emblem_id; + break; + case BL_MOB: { + struct map_session_data *msd; + struct mob_data *md = (struct mob_data *)bl; + if (md->guardian_data) //Guardian's guild [Skotlex] + return md->guardian_data->emblem_id; + if (md->special_state.ai && (msd = map_id2sd(md->master_id)) != NULL) + return msd->guild_emblem_id; //Alchemist's mobs [Skotlex] + } + break; + case BL_HOM: + if (((TBL_HOM*)bl)->master) + return ((TBL_HOM*)bl)->master->guild_emblem_id; + break; + case BL_MER: + if (((TBL_MER*)bl)->master) + return ((TBL_MER*)bl)->master->guild_emblem_id; + break; + case BL_NPC: + if (((TBL_NPC*)bl)->subtype == SCRIPT && ((TBL_NPC*)bl)->u.scr.guild_id > 0) { + struct guild *g = guild_search(((TBL_NPC*)bl)->u.scr.guild_id); + if (g) + return g->emblem_id; + } + break; + case BL_ELEM: + if (((TBL_ELEM*)bl)->master) + return ((TBL_ELEM*)bl)->master->guild_emblem_id; + break; } return 0; } @@ -5271,6 +5385,7 @@ struct view_data* status_get_viewdata(struct block_list *bl) case BL_NPC: return ((TBL_NPC*)bl)->vd; case BL_HOM: return ((TBL_HOM*)bl)->vd; case BL_MER: return ((TBL_MER*)bl)->vd; + case BL_ELEM: return ((TBL_ELEM*)bl)->vd; } return NULL; } @@ -5287,6 +5402,8 @@ void status_set_viewdata(struct block_list *bl, int class_) vd = merc_get_hom_viewdata(class_); else if (merc_class(class_)) vd = merc_get_viewdata(class_); + else if (elemental_class(class_)) + vd = elemental_get_viewdata(class_); else vd = NULL; @@ -5394,6 +5511,15 @@ void status_set_viewdata(struct block_list *bl, int class_) ShowError("status_set_viewdata (MERCENARY): No view data for class %d\n", class_); } break; + case BL_ELEM: + { + struct elemental_data *ed = (struct elemental_data*)bl; + if (vd) + ed->vd = vd; + else + ShowError("status_set_viewdata (ELEMENTAL): No view data for class %d\n", class_); + } + break; } vd = status_get_viewdata(bl); if (vd && vd->cloth_color && ( @@ -5405,15 +5531,15 @@ void status_set_viewdata(struct block_list *bl, int class_) } /// Returns the status_change data of bl or NULL if it doesn't exist. -struct status_change *status_get_sc(struct block_list *bl) -{ +struct status_change *status_get_sc(struct block_list *bl) { if( bl ) switch (bl->type) { - case BL_PC: return &((TBL_PC*)bl)->sc; - case BL_MOB: return &((TBL_MOB*)bl)->sc; - case BL_NPC: return &((TBL_NPC*)bl)->sc; - case BL_HOM: return &((TBL_HOM*)bl)->sc; - case BL_MER: return &((TBL_MER*)bl)->sc; + case BL_PC: return &((TBL_PC*)bl)->sc; + case BL_MOB: return &((TBL_MOB*)bl)->sc; + case BL_NPC: return &((TBL_NPC*)bl)->sc; + case BL_HOM: return &((TBL_HOM*)bl)->sc; + case BL_MER: return &((TBL_MER*)bl)->sc; + case BL_ELEM: return &((TBL_ELEM*)bl)->sc; } return NULL; } @@ -9336,8 +9462,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data) break; case SC_BLOODSUCKER: - if( --(sce->val4) >= 0 ) - { + if( --(sce->val4) >= 0 ) { struct block_list *src = map_id2bl(sce->val2); int damage; if( !src || (src && (status_isdead(src) || src->m != bl->m || distance_bl(src, bl) >= 12)) ) diff --git a/src/map/status.h b/src/map/status.h index 9b90c88b7..fd4c32319 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -592,6 +592,8 @@ typedef enum sc_type { SC_SOULCOLD, //510 SC_HAWKEYES, SC_ODINS_POWER, + + SC_MAX, //Automatically updated max, used in for's to check we are within bounds. } sc_type; @@ -1038,7 +1040,7 @@ enum si_type { SI_COLD = 437, SI_GLOOMYDAY = 438, SI_SONGOFMANA = 439, - SI_CLOUD_KILL = 440, + SI_CLOUDKILL = 440, SI_DANCEWITHWUG = 441, SI_RUSHWINDMILL = 442, SI_ECHOSONG = 443, @@ -1059,10 +1061,10 @@ enum si_type { SI_FREEZE_SP = 458, SI_GN_TRAINING_SWORD = 459, SI_GN_REMODELING_CART = 460, - SI_GN_CARTBOOST = 461, + SI_CARTSBOOST = 461, SI_FIXEDCASTINGTM_REDUCE = 462, - SI_THORNS_TRAP = 463, - SI_BLOOD_SUCKER = 464, + SI_THORNTRAP = 463, + SI_BLOODSUCKER = 464, SI_SPORE_EXPLOSION = 465, SI_DEMONIC_FIRE = 466, SI_FIRE_EXPANSION_SMOKE_POWDER = 467, @@ -1132,11 +1134,11 @@ enum si_type { SI_STONE_SHIELD = 531, SI_STONE_SHIELD_OPTION = 532, SI_POWER_OF_GAIA = 533, - SI_EL_WAIT = 534, - SI_EL_PASSIVE = 535, - SI_EL_DEFENSIVE = 536, - SI_EL_OFFENSIVE = 537, - SI_EL_COST = 538, + // SI_EL_WAIT = 534, + // SI_EL_PASSIVE = 535, + // SI_EL_DEFENSIVE = 536, + // SI_EL_OFFENSIVE = 537, + // SI_EL_COST = 538, SI_PYROTECHNIC = 539, SI_PYROTECHNIC_OPTION = 540, SI_HEATER = 541, @@ -1671,6 +1673,7 @@ int status_change_clear_buffs(struct block_list* bl, int type); #define status_calc_pc(sd, first) status_calc_bl_(&(sd)->bl, SCB_ALL, first) #define status_calc_homunculus(hd, first) status_calc_bl_(&(hd)->bl, SCB_ALL, first) #define status_calc_mercenary(md, first) status_calc_bl_(&(md)->bl, SCB_ALL, first) +#define status_calc_elemental(ed, first) status_calc_bl_(&(ed)->bl, SCB_ALL, first) void status_calc_bl_(struct block_list *bl, enum scb_flag flag, bool first); int status_calc_mob_(struct mob_data* md, bool first); @@ -1678,6 +1681,7 @@ int status_calc_pet_(struct pet_data* pd, bool first); int status_calc_pc_(struct map_session_data* sd, bool first); int status_calc_homunculus_(struct homun_data *hd, bool first); int status_calc_mercenary_(struct mercenary_data *md, bool first); +int status_calc_elemental_(struct elemental_data *ed, bool first); void status_calc_misc(struct block_list *bl, struct status_data *status, int level); void status_calc_regen(struct block_list *bl, struct status_data *status, struct regen_data *regen); diff --git a/src/map/unit.c b/src/map/unit.c index 6224af787..2dd33af10 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -16,6 +16,7 @@ #include "homunculus.h" #include "instance.h" #include "mercenary.h" +#include "elemental.h" #include "skill.h" #include "clif.h" #include "duel.h" @@ -50,6 +51,7 @@ struct unit_data* unit_bl2ud(struct block_list *bl) if( bl->type == BL_NPC) return &((struct npc_data*)bl)->ud; if( bl->type == BL_HOM) return &((struct homun_data*)bl)->ud; if( bl->type == BL_MER) return &((struct mercenary_data*)bl)->ud; + if( bl->type == BL_ELEM) return &((struct elemental_data*)bl)->ud; return NULL; } @@ -2006,148 +2008,155 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, skill_cleartimerskill(bl); } - switch( bl->type ) - { - case BL_PC: - { - struct map_session_data *sd = (struct map_session_data*)bl; - - //Leave/reject all invitations. - if(sd->chatID) - chat_leavechat(sd,0); - if(sd->trade_partner) - trade_tradecancel(sd); - vending_closevending(sd); - buyingstore_close(sd); - searchstore_close(sd); - if(sd->state.storage_flag == 1) - storage_storage_quit(sd,0); - else if (sd->state.storage_flag == 2) - storage_guild_storage_quit(sd,0); - sd->state.storage_flag = 0; //Force close it when being warped. - if(sd->party_invite>0) - party_reply_invite(sd,sd->party_invite,0); - if(sd->guild_invite>0) - guild_reply_invite(sd,sd->guild_invite,0); - if(sd->guild_alliance>0) - guild_reply_reqalliance(sd,sd->guild_alliance_account,0); - if(sd->menuskill_id) - sd->menuskill_id = sd->menuskill_val = 0; - if( sd->touching_id ) - npc_touchnext_areanpc(sd,true); - - sd->npc_shopid = 0; - sd->adopt_invite = 0; + switch( bl->type ) { + case BL_PC: { + struct map_session_data *sd = (struct map_session_data*)bl; - if(sd->pvp_timer != INVALID_TIMER) { - delete_timer(sd->pvp_timer,pc_calc_pvprank_timer); - sd->pvp_timer = INVALID_TIMER; - sd->pvp_rank = 0; - } - if(sd->duel_group > 0) - duel_leave(sd->duel_group, sd); + //Leave/reject all invitations. + if(sd->chatID) + chat_leavechat(sd,0); + if(sd->trade_partner) + trade_tradecancel(sd); + vending_closevending(sd); + buyingstore_close(sd); + searchstore_close(sd); + if(sd->state.storage_flag == 1) + storage_storage_quit(sd,0); + else if (sd->state.storage_flag == 2) + storage_guild_storage_quit(sd,0); + sd->state.storage_flag = 0; //Force close it when being warped. + if(sd->party_invite>0) + party_reply_invite(sd,sd->party_invite,0); + if(sd->guild_invite>0) + guild_reply_invite(sd,sd->guild_invite,0); + if(sd->guild_alliance>0) + guild_reply_reqalliance(sd,sd->guild_alliance_account,0); + if(sd->menuskill_id) + sd->menuskill_id = sd->menuskill_val = 0; + if( sd->touching_id ) + npc_touchnext_areanpc(sd,true); + + sd->npc_shopid = 0; + sd->adopt_invite = 0; + + if(sd->pvp_timer != INVALID_TIMER) { + delete_timer(sd->pvp_timer,pc_calc_pvprank_timer); + sd->pvp_timer = INVALID_TIMER; + sd->pvp_rank = 0; + } + if(sd->duel_group > 0) + duel_leave(sd->duel_group, sd); - if(pc_issit(sd)) { - pc_setstand(sd); - skill_sit(sd,0); - } - party_send_dot_remove(sd);//minimap dot fix [Kevin] - guild_send_dot_remove(sd); - bg_send_dot_remove(sd); + if(pc_issit(sd)) { + pc_setstand(sd); + skill_sit(sd,0); + } + party_send_dot_remove(sd);//minimap dot fix [Kevin] + guild_send_dot_remove(sd); + bg_send_dot_remove(sd); - if( map[bl->m].users <= 0 || sd->state.debug_remove_map ) - {// this is only place where map users is decreased, if the mobs were removed too soon then this function was executed too many times [FlavioJS] - if( sd->debug_file == NULL || !(sd->state.debug_remove_map) ) + if( map[bl->m].users <= 0 || sd->state.debug_remove_map ) + {// this is only place where map users is decreased, if the mobs were removed too soon then this function was executed too many times [FlavioJS] + if( sd->debug_file == NULL || !(sd->state.debug_remove_map) ) + { + sd->debug_file = ""; + sd->debug_line = 0; + sd->debug_func = ""; + } + ShowDebug("unit_remove_map: unexpected state when removing player AID/CID:%d/%d" + " (active=%d connect_new=%d rewarp=%d changemap=%d debug_remove_map=%d)" + " from map=%s (users=%d)." + " Previous call from %s:%d(%s), current call from %s:%d(%s)." + " Please report this!!!\n", + sd->status.account_id, sd->status.char_id, + sd->state.active, sd->state.connect_new, sd->state.rewarp, sd->state.changemap, sd->state.debug_remove_map, + map[bl->m].name, map[bl->m].users, + sd->debug_file, sd->debug_line, sd->debug_func, file, line, func); + } + else + if (--map[bl->m].users == 0 && battle_config.dynamic_mobs) //[Skotlex] + map_removemobs(bl->m); + if( !(sd->sc.option&OPTION_INVISIBLE) ) + {// decrement the number of active pvp players on the map + --map[bl->m].users_pvp; + } + if( map[bl->m].instance_id ) { - sd->debug_file = ""; - sd->debug_line = 0; - sd->debug_func = ""; + instance[map[bl->m].instance_id].users--; + instance_check_idle(map[bl->m].instance_id); } - ShowDebug("unit_remove_map: unexpected state when removing player AID/CID:%d/%d" - " (active=%d connect_new=%d rewarp=%d changemap=%d debug_remove_map=%d)" - " from map=%s (users=%d)." - " Previous call from %s:%d(%s), current call from %s:%d(%s)." - " Please report this!!!\n", - sd->status.account_id, sd->status.char_id, - sd->state.active, sd->state.connect_new, sd->state.rewarp, sd->state.changemap, sd->state.debug_remove_map, - map[bl->m].name, map[bl->m].users, - sd->debug_file, sd->debug_line, sd->debug_func, file, line, func); - } - else - if (--map[bl->m].users == 0 && battle_config.dynamic_mobs) //[Skotlex] - map_removemobs(bl->m); - if( !(sd->sc.option&OPTION_INVISIBLE) ) - {// decrement the number of active pvp players on the map - --map[bl->m].users_pvp; - } - if( map[bl->m].instance_id ) - { - instance[map[bl->m].instance_id].users--; - instance_check_idle(map[bl->m].instance_id); - } - sd->state.debug_remove_map = 1; // temporary state to track double remove_map's [FlavioJS] - sd->debug_file = file; - sd->debug_line = line; - sd->debug_func = func; + sd->state.debug_remove_map = 1; // temporary state to track double remove_map's [FlavioJS] + sd->debug_file = file; + sd->debug_line = line; + sd->debug_func = func; - break; - } - case BL_MOB: - { - struct mob_data *md = (struct mob_data*)bl; - // Drop previous target mob_slave_keep_target: no. - if (!battle_config.mob_slave_keep_target) - md->target_id=0; + break; + } + case BL_MOB: { + struct mob_data *md = (struct mob_data*)bl; + // Drop previous target mob_slave_keep_target: no. + if (!battle_config.mob_slave_keep_target) + md->target_id=0; - md->attacked_id=0; - md->state.skillstate= MSS_IDLE; + md->attacked_id=0; + md->state.skillstate= MSS_IDLE; - break; - } - case BL_PET: - { - struct pet_data *pd = (struct pet_data*)bl; - if( pd->pet.intimate <= 0 && !(pd->msd && !pd->msd->state.active) ) - { //If logging out, this is deleted on unit_free - clif_clearunit_area(bl,clrtype); - map_delblock(bl); - unit_free(bl,CLR_OUTSIGHT); - map_freeblock_unlock(); - return 0; + break; } + case BL_PET: { + struct pet_data *pd = (struct pet_data*)bl; + if( pd->pet.intimate <= 0 && !(pd->msd && !pd->msd->state.active) ) + { //If logging out, this is deleted on unit_free + clif_clearunit_area(bl,clrtype); + map_delblock(bl); + unit_free(bl,CLR_OUTSIGHT); + map_freeblock_unlock(); + return 0; + } - break; - } - case BL_HOM: - { - struct homun_data *hd = (struct homun_data *)bl; - ud->canact_tick = ud->canmove_tick; //It appears HOM do reset the can-act tick. - if( !hd->homunculus.intimacy && !(hd->master && !hd->master->state.active) ) - { //If logging out, this is deleted on unit_free - clif_emotion(bl, E_SOB); - clif_clearunit_area(bl,clrtype); - map_delblock(bl); - unit_free(bl,CLR_OUTSIGHT); - map_freeblock_unlock(); - return 0; + break; } - break; - } - case BL_MER: - { - struct mercenary_data *md = (struct mercenary_data *)bl; - ud->canact_tick = ud->canmove_tick; - if( mercenary_get_lifetime(md) <= 0 && !(md->master && !md->master->state.active) ) - { - clif_clearunit_area(bl,clrtype); - map_delblock(bl); - unit_free(bl,CLR_OUTSIGHT); - map_freeblock_unlock(); - return 0; + case BL_HOM: { + struct homun_data *hd = (struct homun_data *)bl; + ud->canact_tick = ud->canmove_tick; //It appears HOM do reset the can-act tick. + if( !hd->homunculus.intimacy && !(hd->master && !hd->master->state.active) ) + { //If logging out, this is deleted on unit_free + clif_emotion(bl, E_SOB); + clif_clearunit_area(bl,clrtype); + map_delblock(bl); + unit_free(bl,CLR_OUTSIGHT); + map_freeblock_unlock(); + return 0; + } + break; } - break; - } - default: ;// do nothing + case BL_MER: { + struct mercenary_data *md = (struct mercenary_data *)bl; + ud->canact_tick = ud->canmove_tick; + if( mercenary_get_lifetime(md) <= 0 && !(md->master && !md->master->state.active) ) + { + clif_clearunit_area(bl,clrtype); + map_delblock(bl); + unit_free(bl,CLR_OUTSIGHT); + map_freeblock_unlock(); + return 0; + } + break; + } + case BL_ELEM: { + struct elemental_data *ed = (struct elemental_data *)bl; + ud->canact_tick = ud->canmove_tick; + if( elemental_get_lifetime(ed) <= 0 && !(ed->master && !ed->master->state.active) ) + { + clif_clearunit_area(bl,clrtype); + map_delblock(bl); + unit_free(bl,0); + map_freeblock_unlock(); + return 0; + } + break; + } + default: break;// do nothing } /** * BL_MOB is handled by mob_dead unless the monster is not dead. @@ -2391,6 +2400,24 @@ int unit_free(struct block_list *bl, clr_type clrtype) merc_contract_stop(md); break; } + case BL_ELEM: { + struct elemental_data *ed = (TBL_ELEM*)bl; + struct map_session_data *sd = ed->master; + if( clrtype >= 0 ) { + if( elemental_get_lifetime(ed) > 0 ) + elemental_save(ed); + else { + intif_elemental_delete(ed->elemental.elemental_id); + if( sd ) + sd->status.ele_id = 0; + } + } + if( sd ) + sd->ed = NULL; + + elemental_summon_stop(ed); + break; + } } skill_clear_unitgroup(bl); diff --git a/vcproj-10/char-server_sql.vcxproj b/vcproj-10/char-server_sql.vcxproj index e070d3e34..74c6c835e 100644 --- a/vcproj-10/char-server_sql.vcxproj +++ b/vcproj-10/char-server_sql.vcxproj @@ -154,6 +154,7 @@ <ClInclude Include="..\src\common\utils.h" /> <ClInclude Include="..\src\char\char.h" /> <ClInclude Include="..\src\char\int_auction.h" /> + <ClInclude Include="..\src\char\int_elemental.h" /> <ClInclude Include="..\src\char\int_guild.h" /> <ClInclude Include="..\src\char\int_homun.h" /> <ClInclude Include="..\src\char\int_mail.h" /> @@ -187,6 +188,7 @@ <ClCompile Include="..\src\common\utils.c" /> <ClCompile Include="..\src\char\char.c" /> <ClCompile Include="..\src\char\int_auction.c" /> + <ClCompile Include="..\src\char\int_elemental.c" /> <ClCompile Include="..\src\char\int_guild.c" /> <ClCompile Include="..\src\char\int_homun.c" /> <ClCompile Include="..\src\char\int_mail.c" /> diff --git a/vcproj-10/map-server_sql.vcxproj b/vcproj-10/map-server_sql.vcxproj index ad546cada..605f03fae 100644 --- a/vcproj-10/map-server_sql.vcxproj +++ b/vcproj-10/map-server_sql.vcxproj @@ -164,6 +164,7 @@ <ClInclude Include="..\src\map\clif.h" /> <ClInclude Include="..\src\map\date.h" /> <ClInclude Include="..\src\map\duel.h" /> + <ClInclude Include="..\src\map\elemental.h" /> <ClInclude Include="..\src\map\guild.h" /> <ClInclude Include="..\src\map\intif.h" /> <ClInclude Include="..\src\map\itemdb.h" /> @@ -231,6 +232,7 @@ <ClCompile Include="..\src\map\clif.c" /> <ClCompile Include="..\src\map\date.c" /> <ClCompile Include="..\src\map\duel.c" /> + <ClCompile Include="..\src\map\elemental.c" /> <ClCompile Include="..\src\map\guild.c" /> <ClCompile Include="..\src\map\intif.c" /> <ClCompile Include="..\src\map\itemdb.c" /> diff --git a/vcproj-9/char-server_sql.vcproj b/vcproj-9/char-server_sql.vcproj index 2ef9ec81b..3e6e85558 100644 --- a/vcproj-9/char-server_sql.vcproj +++ b/vcproj-9/char-server_sql.vcproj @@ -465,6 +465,14 @@ > </File> <File + RelativePath="..\src\char\int_elemental.c" + > + </File> + <File + RelativePath="..\src\char\int_elemental.h" + > + </File> + <File RelativePath="..\src\char\int_party.c" > </File> diff --git a/vcproj-9/map-server_sql.vcproj b/vcproj-9/map-server_sql.vcproj index 7945f8846..a9f2b4fba 100644 --- a/vcproj-9/map-server_sql.vcproj +++ b/vcproj-9/map-server_sql.vcproj @@ -604,6 +604,14 @@ > </File> <File + RelativePath="..\src\map\elemental.c" + > + </File> + <File + RelativePath="..\src\map\elemental.h" + > + </File> + <File RelativePath="..\src\map\mob.c" > </File> |