summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/groups.conf1
-rw-r--r--db/elemental_db.txt27
-rw-r--r--db/elemental_skill_db.txt51
-rw-r--r--db/produce_db.txt82
-rw-r--r--db/re/skill_cast_db.txt56
-rw-r--r--db/re/skill_db.txt390
-rw-r--r--db/re/skill_require_db.txt99
-rw-r--r--db/re/skill_tree.txt1903
-rw-r--r--db/re/skill_unit_db.txt24
-rw-r--r--sql-files/main.sql24
-rw-r--r--sql-files/upgrade_svn15885_log.sql26
-rw-r--r--src/char/Makefile.in4
-rw-r--r--src/char/char.c54
-rw-r--r--src/char/int_elemental.c164
-rw-r--r--src/char/int_elemental.h15
-rw-r--r--src/char/inter.c6
-rw-r--r--src/common/mmo.h19
-rw-r--r--src/map/Makefile.in4
-rw-r--r--src/map/atcommand.c3
-rw-r--r--src/map/battle.c252
-rw-r--r--src/map/chrif.c3
-rw-r--r--src/map/clif.c305
-rw-r--r--src/map/clif.h39
-rw-r--r--src/map/elemental.c825
-rw-r--r--src/map/elemental.h95
-rw-r--r--src/map/intif.c97
-rw-r--r--src/map/intif.h6
-rw-r--r--src/map/itemdb.h1
-rw-r--r--src/map/map.c11
-rw-r--r--src/map/map.h6
-rw-r--r--src/map/mob.c10
-rw-r--r--src/map/npc_chat.c2
-rw-r--r--src/map/pc.c11
-rw-r--r--src/map/pc.h3
-rw-r--r--src/map/script.c2
-rw-r--r--src/map/skill.c2245
-rw-r--r--src/map/skill.h91
-rw-r--r--src/map/status.c477
-rw-r--r--src/map/status.h22
-rw-r--r--src/map/unit.c287
-rw-r--r--vcproj-10/char-server_sql.vcxproj2
-rw-r--r--vcproj-10/map-server_sql.vcxproj2
-rw-r--r--vcproj-9/char-server_sql.vcproj8
-rw-r--r--vcproj-9/map-server_sql.vcproj8
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>