diff --git a/db/abra_db.txt b/db/abra_db.txt index 41c1b6eae3..98d45061a8 100644 --- a/db/abra_db.txt +++ b/db/abra_db.txt @@ -1,322 +1,224 @@ -// Hocus-Pocus (Abrakadabra) Castable Skills Database +// Hocus-Pocus (Abracadabra) Castable Skills Database // // Structure of Database: -// SkillID,DummyName,RequiredHocusPocusLevel,Rate +// SkillID,DummyName,RatePerLvl // // 01. SkillID Skill ID to be casted by hocus pocus. // 02. DummyName Name of the skill (informative, not used by server). -// 03. RequiredHocusPocusLevel Minimum skill level of hocus pocus for the current skill to be selected. -// 04. Rate Chance at which the skill is selected (1 = 0.01%, 10000 = 100%). +// 03. RatePerLvl Chance at which the skill is selected (1 = 0.01%, 10000 = 100%). // // NOTE: The skill is picked at random from the entire database and then tested for rate. If it -// does not succeed at that rate, an another skill is picked and tested. This continues -// until a skill succeeds. +// does not succeed at that rate, another skill is picked and tested. This continues +// until a skill succeeds. Abracadabra-specific skills have a different chance to occur +// depending on skill level used. All other skills have an equal chance and appear from +// level 1 onward. -//1,Basic Skill,1,0 +5,Bash,500 +6,Provoke,500 +7,Magnum Break,500 +8,Endure,500 -//2,Sword Mastery,1,0 -//3,Two-Handed Sword Mastery,1,0 -//4,Increase HP Recovery,1,0 -5,Bash,1,5000 -6,Provoke,1,5000 -7,Magnum Break,1,5000 -8,Endure,1,5000 +10,Sight,500 +11,Napalm Beat,500 +12,Safety Wall,500 +13,Soul Strike,500 +14,Cold Bolt,500 +15,Frost Diver,500 +16,Stone Curse,500 +17,Fire Ball,500 +18,Fire Wall,500 +19,Fire Bolt,500 +20,Lightning Bolt,500 +21,Thunder Storm,500 -//9,Increase SP Recovery,1,0 -10,Sight,1,5000 -11,Napalm Beat,1,5000 -12,Safety Wall,4,5000 -13,Soul Strike,2,5000 -14,Cold Bolt,1,5000 -15,Frost Diver,2,5000 -16,Stone Curse,1,5000 -17,Fire Ball,2,5000 -18,Fire Wall,4,5000 -19,Fire Bolt,1,5000 -20,Lightning Bolt,1,5000 -21,Thunder Storm,2,5000 +24,Ruwach,500 +25,Pneuma,500 +26,Teleport,500 +27,Warp Portal,500 +28,Heal,500 +29,Increase AGI,500 +30,Decrease AGI,500 +31,Aqua Benedicta,500 +32,Signum Crucis,500 +33,Angelus,500 +34,Blessing,500 +35,Cure,500 -//22,Divine Protection,1,0 -//23,Demon Bane,1,0 -24,Ruwach,1,5000 -25,Pneuma,6,5000 -26,Teleport,2,5000 -27,Warp Portal,4,5000 -28,Heal,1,5000 -29,Increase AGI,2,5000 -30,Decrease AGI,4,5000 -31,Aqua Benedicta,1,5000 -32,Signum Crucis,1,5000 -33,Angelus,1,5000 -34,Blessing,2,5000 -35,Cure,1,5000 +40,Item Appraisal,500 +41,Vending,500 +42,Mammonite,500 -//36,Enlarge Weight Limit,1,0 -//37,Discount,1,0 -//38,Overcharge,1,0 -//39,Pushcart,1,0 -40,Item Appraisal,1,5000 -41,Vending,4,5000 -42,Mammonite,1,5000 +45,Improve Concentration,500 +46,Double Strafe,500 +47,Arrow Shower,500 -//43,Owl's Eye,1,0 -//44,Vulture's Eye,1,0 -45,Improve Concentration,4,5000 -46,Double Strafe,1,5000 -47,Arrow Shower,2,5000 +50,Steal,500 +51,Hiding,500 +52,Envenom,500 +53,Detoxify,500 -//48,Double Attack,1,0 -//49,Improve Dodge,1,0 -50,Steal,2,5000 -51,Hiding,2,5000 -52,Envenom,1,5000 -53,Detoxify,1,5000 +54,Resurrection,500 -54,Resurrection,1,5000 +56,Pierce,500 +57,Brandish Spear,500 +58,Spear Stab,500 +59,Spear Boomerang,500 +60,TwoHand Quicken,500 +61,Counter Attack,500 +62,Bowling Bash,500 -//55,Spear Mastery,1,0 -56,Pierce,2,4000 -57,Brandish Spear,6,4000 -58,Spear Stab,1,4000 -59,Spear Boomerang,4,4000 -60,TwoHand Quicken,1,4000 -61,Counter Attack,2,4000 -62,Bowling Bash,6,4000 -//63,Peco Peco Riding,1,0 -//64,Cavalier Mastery,1,0 +66,Impositio Manus,500 +67,Suffragium,500 +68,Aspersio,500 +69,B.S Sacramenti,500 +70,Sanctuary,500 +71,Slow poison,500 +72,Status Recovery,500 +73,Kyrie Eleison,500 +74,Magnificat,500 +75,Gloria,500 +76,Lex Divina,500 +77,Turn Undead,500 +78,Lex Aeterna,500 +79,Magnus Exorcismus,500 -//65,Mace Mastery,1,0 -66,Impositio Manus,1,4000 -67,Suffragium,2,4000 -68,Aspersio,2,4000 -69,B.S Sacramenti,4,4000 -70,Sanctuary,2,4000 -71,Slow poison,1,4000 -72,Status Recovery,1,4000 -73,Kyrie Eleison,2,4000 -74,Magnificat,2,4000 -75,Gloria,4,4000 -76,Lex Divina,2,4000 -77,Turn Undead,2,4000 -78,Lex Aeterna,4,4000 -79,Magnus Exorcismus,6,4000 +80,Fire Pillar,500 +81,Sightrasher,500 +//82,Fire Ivy,500 +83,Meteor Storm,500 +84,Jupitel Thunder,500 +85,Lord of Vermilion,500 +86,Water Ball,500 +87,Ice Wall,500 +88,Frost Nova,500 +89,Storm Gust,500 +90,Earth spike,500 +91,Heaven's Drive,500 +92,Quagmire,500 +93,Sense,500 -80,Fire Pillar,2,4000 -81,Sightrasher,2,4000 -//82,Fire Ivy,1,0 -83,Meteor Storm,6,4000 -84,Jupitel Thunder,2,4000 -85,Lord of Vermilion,6,4000 -86,Water Ball,4,4000 -87,Ice Wall,2,4000 -88,Frost Nova,1,4000 -89,Storm Gust,6,4000 -90,Earth spike,1,4000 -91,Heaven's Drive,2,4000 -92,Quagmire,4,4000 -93,Sense,1,4000 +//108,Weapon Repair,500 +110,Hammer Fall,500 +111,Adrenaline Rush,500 +112,Weapon Perfection,500 +113,Power-Thrust,500 +114,Maximize Power,500 -//94,Iron Tempering,1,0 -//95,Steel Tempering,1,0 -//96,Enchanted Stone Craft,1,0 -//97,Oridecon Research,1,0 -//98,Smith Dagger,1,0 -//99,Smith Sword,1,0 -//100,Smith Two-handed Sword,1,0 -//101,Smith Axe,1,0 -//102,Smith Mace,1,0 -//103,Smith Knucklebrace,1,0 -//104,Smith Spear,1,0 -//105,Hilt Binding,1,0 -//106,Ore Discovery,1,0 -//107,Weaponry Research,1,0 -108,Weapon Repair,1,0 -//109,Skin Tempering,1,0 -110,Hammer Fall,1,4000 -111,Adrenaline Rush,2,4000 -112,Weapon Perfection,4,4000 -113,Power-Thrust,4,4000 -114,Maximize Power,6,4000 +115,Skid Trap,500 +116,Land Mine,500 +117,Ankle Snare,500 +118,Shockwave Trap,500 +119,Sandman,500 +120,Flasher,500 +121,Freezing Trap,500 +122,Blast Mine,500 +123,Claymore Trap,500 +124,Remove Trap,500 +125,Talkie box,500 +129,Blitz Beat,500 +130,Detect,500 +131,Spring Trap,500 -115,Skid Trap,1,4000 -116,Land Mine,2,4000 -117,Ankle Snare,2,4000 -118,Shockwave Trap,4,4000 -119,Sandman,4,4000 -120,Flasher,4,4000 -121,Freezing Trap,4,4000 -122,Blast Mine,4,4000 -123,Claymore Trap,6,4000 -124,Remove Trap,1,4000 -125,Talkie box,1,4000 -//126,Beast Bane,1,0 -//127,Falconry Mastery,1,0 -//128,Steel Crow,1,0 -129,Blitz Beat,4,4000 -130,Detect,1,4000 -131,Spring Trap,1,4000 - -//132,Righthand Mastery,1,0 -//133,Lefthand Mastery,1,0 -//134,Katar Mastery,1,0 -135,Cloaking,2,4000 -136,Sonic Blow,2,4000 -137,Grimtooth,4,4000 -138,Enchant Poison,2,4000 -139,Poison React,2,4000 -140,Venom Dust,4,4000 -141,Venom Splasher,4,4000 - -//---JP2.0 Additional skill--- -142,First Aid,1,5000 -143,Act Dead,1,5000 -//144,Moving HP-Recovery,1,0 -//145,Fatal Blow,1,0 -146,Auto Berserk,1,0 -147,Arrow Crafting,1,5000 -148,Arrow Repel,1,5000 -149,Throw Sand,1,5000 -150,Back sliding,1,5000 -151,Find Stone,1,5000 -152,Stone Fling,1,5000 -153,Cart Revolution,1,5000 -154,Change Cart,1,5000 -155,Crazy Uproar,1,5000 -156,Holy Light,1,5000 -157,Energy Coat,1,5000 +135,Cloaking,500 +136,Sonic Blow,500 +137,Grimtooth,500 +138,Enchant Poison,500 +139,Poison React,500 +140,Venom Dust,500 +141,Venom Splasher,500 //---EP4.0 Skill--- -//210,Gank,1,0 -211,Mug,1,4000 -212,Back Stab,4,4000 -//213,Stalk,1,0 -214,Sightless Raid,2,4000 -215,Divest Weapon,4,4000 -216,Divest shield,4,4000 -217,Divest armor,4,4000 -218,Divest helm,4,4000 -219,Snatch,4,4000 -220,Scribble,1,4000 -221,Piece,1,0 -222,Remover,4,4000 -//223,Slyness,1,0 -//224,Haggle,1,0 -//225,Intimidate,1,0 +211,Mug,500 +212,Back Stab,500 +214,Sightless Raid,500 +215,Divest Weapon,500 +216,Divest Shield,500 +217,Divest Armor,500 +218,Divest Helm,500 +219,Snatch,500 +220,Scribble,500 +//221,Piece,500 +222,Remover,500 -//226,Axe Mastery,1,0 -//227,Potion Research,1,0 -228,Prepare Potion,1,4000 -229,Bomb,2,4000 -230,Acid terror,2,4000 -231,Aid Potion,2,4000 -232,Summon Flora,4,4000 -233,Summon Marine Sphere,4,4000 -234,Alchemical Weapon,4,4000 -235,Synthesized Shield,4,4000 -236,Synthetic Armor,4,4000 -237,Biochemical Helm,4,4000 +249,Guard,500 +250,Smite,500 +251,Shield Boomerang,500 +252,Shield Reflect,500 +253,Holy Cross,500 +254,Grand Cross,500 +255,Sacrifice,500 +256,Resistant Souls,500 +257,Defending Aura,500 +258,Spear Quicken,500 -//238,Bioethics,1,0 -//239,Biotechnology,1,0 -//240,Life Creation,1,0 -//241,Cultivation,1,0 -//242,Flame control,1,0 -//243,Call Homunculus,1,0 -//244,Vaporize,1,0 -//245,Drillmaster,1,0 -//246,Heal Homunculus,1,0 -//247,Resurrect Homunculus,1,0 +261,Summon Spirit Sphere,500 +262,Absorb Spirit Sphere,500 +264,Snap,500 +266,Occult Impact,500 +267,Throw Spirit Sphere,500 +268,Mental Strength,500 +269,Root,500 +270,Fury,500 +271,Asura Strike,500 +//272,Raging Quadruple Blow,500 +//273,Raging Thrust,500 -//248,Faith,1,0 -249,Guard,1,4000 -250,Smite,2,4000 -251,Shield boomerang,2,4000 -252,Shield Reflect,4,4000 -253,Holy cross,2,4000 -254,Grand cross,6,4000 -255,Sacrifice,4,4000 -256,Resistant Souls,2,4000 -257,Defending Aura,4,4000 -258,Spear Quicken,1,4000 - -//259,Iron fists,1,0 -//260,Spiritual Cadence,1,0 -261,Summon Spirit Sphere,1,4000 -262,Absorb Spirit Sphere,1,4000 -//263,Raging Trifecta Blow,1,0 -264,Snap,4,4000 -//265,Dodge,1,0 -266,Occult Impact,2,4000 -267,Throw Spirit Sphere,2,4000 -268,Mental Strength,4,4000 -269,Root,2,4000 -270,Fury,2,4000 -271,Asura Strike,6,4000 -272,Raging Quadruple Blow,1,0 -273,Raging Thrust,1,0 - -//274,Study,1,0 -275,Cast Cancel,1,4000 -276,Magic Rod,1,4000 -277,Spell Break,2,4000 -//278,Free Cast,1,0 -279,Hindsight,2,4000 -280,Endow Blaze,2,4000 -281,Endow Tsunami,2,4000 -282,Endow Tornado,2,4000 -283,Endow Quake,2,4000 -//284,Dragonology,1,0 -285,Volcano,4,4000 -286,Deluge,4,4000 -287,Whirlwind,4,4000 -288,Magnetic Earth,4,4000 -289,Dispel,6,4000 -290,Hocus-pocus,4,4000 +275,Cast Cancel,500 +276,Magic Rod,500 +277,Spell Break,500 +279,Hindsight,500 +280,Endow Blaze,500 +281,Endow Tsunami,500 +282,Endow Tornado,500 +283,Endow Quake,500 +285,Volcano,500 +286,Deluge,500 +287,Whirlwind,500 +288,Magnetic Earth,500 +289,Dispel,500 // Abracadabra Derivation Skill -291,Monocell,4,2500 -292,Class Change,8,2500 -293,Summon Monster,6,3500 -294,Grampus Morph,4,5000 -295,Grim Reaper,8,2000 -//296,Gold Digger,6,4000 -297,Beastly Hypnosis,6,4000 -298,Questioning,4,5000 -299,Gravity,4,5000 -//300,Leveling,10,500 -301,Suicide,4,2000 -302,Rejuvination,8,3000 -303,Coma,4,4000 +291,Monocell,250:500:750:1000:1250:1200:1750:2000:2250:2500 +292,Class Change,0:0:0:0:10:10:20:20:30:30 +293,Summon Monster,100:200:300:400:500:600:700:800:900:1000 +294,Grampus Morph,0:0:0:0:0:0:0:10:50:100 +295,Grim Reaper,50:100:150:200:250:300:350:400:450:500 +//296,Gold Digger,50:100:150:200:250:300:350:400:450:500 +//297,Beastly Hypnosis,50:100:150:200:250:300:350:400:450:500 +298,Questioning,1000:800:600:400:200:0:0:0:0:0 +299,Gravity,0:0:0:0:0:0:0:20:50:100 +//300,Leveling,0:0:0:0:0:0:0:0:10:50 +301,Suicide,0:0:0:0:0:0:0:10:50:100 +302,Rejuvination,0:0:0:0:0:0:20:50:100:200 +303,Coma,0:0:0:0:100:200:300:400:500:600 // Dancer / Bard commonness -304,Amp,1,0 -305,Encore,1,0 -306,Lullaby,1,0 -307,Mental Sensing,1,0 -308,Down Tempo,1,0 -309,Battle Theme,1,0 -310,Harmonic Lick,1,0 -311,Classical Pluck,1,0 -312,Power Chord,1,0 -313,Acoustic Rhythm,1,0 -//314,Ragnarok,1,0 +//304,Amp,500 +//305,Encore,500 +//306,Lullaby,500 +//307,Mental Sensing,500 +//308,Down Tempo,500 +//309,Battle Theme,500 +//310,Harmonic Lick,500 +//311,Classical Pluck,500 +//312,Power Chord,500 +//313,Acoustic Rhythm,500 +//314,Ragnarok,500 // Bard skill -//315,Music Lessons,1,0 -316,Melody Strike,1,4000 -317,Unchained Serenade,1,0 -318,Unbarring Octave,2,4000 -319,Perfect Tablature,1,0 -320,Impressive Riff,1,0 -321,Magic Strings,1,0 -322,Song of Lutie,1,0 +316,Melody Strike,500 +//317,Unchained Serenade,500 +318,Unbarring Octave,500 +//319,Perfect Tablature,500 +//320,Impressive Riff,500 +//321,Magic Strings,500 +//322,Song of Lutie,500 // Dancer skill -//323,Dance Lessons,1,0 -324,Slinging Arrow,1,4000 -325,Hip Shaker,1,0 -326,Dazzler,2,4000 -327,Focus Ballet,1,0 -328,Slow Grace,1,0 -329,Lady Luck,1,0 -330,Gypsy's Kiss,1,0 +324,Slinging Arrow,500 +//325,Hip Shaker,500 +326,Dazzler,500 +//327,Focus Ballet,500 +//328,Slow Grace,500 +//329,Lady Luck,500 +//330,Gypsy's Kiss,500 diff --git a/src/common/mapindex.h b/src/common/mapindex.h index f39bb06ffb..2d9700c71f 100644 --- a/src/common/mapindex.h +++ b/src/common/mapindex.h @@ -46,6 +46,7 @@ extern char mapindex_cfgfile[80]; #define MAP_MALANGDO "malangdo" #define MAP_MALAYA "malaya" #define MAP_ECLAGE "eclage" +#define MAP_ECLAGE_IN "ecl_in01" // When a map index search fails, return results from what map? #define MAP_DEFAULT MAP_PRONTERA diff --git a/src/map/skill.c b/src/map/skill.c index 603f5cfa57..6606848e84 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -5116,11 +5116,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui do { i = rnd() % MAX_SKILL_ABRA_DB; abra_skill_id = skill_abra_db[i].skill_id; + abra_skill_lv = min(skill_lv, skill_get_max(abra_skill_id)); } while (abra_skill_id == 0 || - skill_abra_db[i].req_lv > skill_lv || //Required lv for it to appear - rnd()%10000 >= skill_abra_db[i].per + rnd()%10000 >= skill_abra_db[i].per[abra_skill_lv] ); - abra_skill_lv = min(skill_lv, skill_get_max(abra_skill_id)); + clif_skill_nodamage (src, bl, skill_id, skill_lv, 1); if( sd ) @@ -8770,26 +8770,26 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case ECLAGE_RECALL: if( sd ) { - short x, y; // Destiny position. - unsigned short mapindex; + short x=0, y=0; // Destiny position. + unsigned short mapindex=0; - if ( skill_id == RETURN_TO_ELDICASTES ) - { + switch(skill_id){ + default: + case RETURN_TO_ELDICASTES: x = 198; y = 187; mapindex = mapindex_name2id(MAP_DICASTES); - } - else if ( skill_id == ALL_GUARDIAN_RECALL ) - { + break; + case ALL_GUARDIAN_RECALL: x = 44; y = 151; mapindex = mapindex_name2id(MAP_MORA); - } - else if ( skill_id == ECLAGE_RECALL ) - { + break; + case ECLAGE_RECALL: x = 47; y = 31; - mapindex = mapindex_name2id("ecl_in01"); + mapindex = mapindex_name2id(MAP_ECLAGE_IN); + break; } if(!mapindex) @@ -8806,33 +8806,31 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case ECL_PEONYMAMY: case ECL_SADAGUI: case ECL_SEQUOIADUST: - if ( skill_id == ECL_SNOWFLIP ) - { + switch(skill_id){ + case ECL_SNOWFLIP: status_change_end(bl, SC_SLEEP, INVALID_TIMER); status_change_end(bl, SC_BLEEDING, INVALID_TIMER); status_change_end(bl, SC_BURNING, INVALID_TIMER); status_change_end(bl, SC_DEEPSLEEP, INVALID_TIMER); - } - else if ( skill_id == ECL_PEONYMAMY ) - { + break; + case ECL_PEONYMAMY: status_change_end(bl, SC_FREEZE, INVALID_TIMER); status_change_end(bl, SC_FREEZING, INVALID_TIMER); status_change_end(bl, SC_CRYSTALIZE, INVALID_TIMER); - } - else if ( skill_id == ECL_SADAGUI ) - { + break; + case ECL_SADAGUI: status_change_end(bl, SC_STUN, INVALID_TIMER); status_change_end(bl, SC_CONFUSION, INVALID_TIMER); status_change_end(bl, SC_HALLUCINATION, INVALID_TIMER); status_change_end(bl, SC_FEAR, INVALID_TIMER); - } - else if ( skill_id == ECL_SEQUOIADUST ) - { + break; + case ECL_SEQUOIADUST: status_change_end(bl, SC_STONE, INVALID_TIMER); status_change_end(bl, SC_POISON, INVALID_TIMER); status_change_end(bl, SC_CURSE, INVALID_TIMER); status_change_end(bl, SC_BLIND, INVALID_TIMER); status_change_end(bl, SC_ORCISH, INVALID_TIMER); + break; } clif_skill_nodamage(src,bl,skill_id,skill_lv,1); break; @@ -12720,7 +12718,7 @@ int skill_isammotype (struct map_session_data *sd, int skill) (sd->status.weapon == W_BOW || (sd->status.weapon >= W_REVOLVER && sd->status.weapon <= W_GRENADE)) && skill != HT_PHANTASMIC && skill_get_type(skill) == BF_WEAPON && - !(skill_get_nk(skill)&NK_NO_DAMAGE) && + !(skill_get_nk(skill)&NK_NO_DAMAGE) && !skill_get_spiritball(skill,1) //Assume spirit spheres are used as ammo instead. ); } @@ -18225,7 +18223,7 @@ static bool skill_parse_row_reproducedb(char* split[], int column, int current) static bool skill_parse_row_abradb(char* split[], int columns, int current) -{// skill_id,DummyName,RequiredHocusPocusLevel,Rate +{// skill_id,DummyName,RatePerLvl uint16 skill_id = atoi(split[0]); if( !skill_get_index(skill_id) || !skill_get_max(skill_id) ) { @@ -18239,8 +18237,8 @@ static bool skill_parse_row_abradb(char* split[], int columns, int current) } skill_abra_db[current].skill_id = skill_id; - skill_abra_db[current].req_lv = atoi(split[2]); - skill_abra_db[current].per = atoi(split[3]); + safestrncpy(skill_abra_db[current].name, trim(split[1]), sizeof(skill_abra_db[current].name)); //store dummyname + skill_split_atoi(split[2],skill_abra_db[current].per); return true; } @@ -18321,7 +18319,7 @@ static void skill_readdb(void) skill_init_unit_layout(); sv_readdb(db_path, "produce_db.txt" , ',', 4, 4+2*MAX_PRODUCE_RESOURCE, MAX_SKILL_PRODUCE_DB, skill_parse_row_producedb); sv_readdb(db_path, "create_arrow_db.txt" , ',', 1+2, 1+2*MAX_ARROW_RESOURCE, MAX_SKILL_ARROW_DB, skill_parse_row_createarrowdb); - sv_readdb(db_path, "abra_db.txt" , ',', 4, 4, MAX_SKILL_ABRA_DB, skill_parse_row_abradb); + sv_readdb(db_path, "abra_db.txt" , ',', 3, 3, MAX_SKILL_ABRA_DB, skill_parse_row_abradb); //Warlock sv_readdb(db_path, "spellbook_db.txt" , ',', 3, 3, MAX_SKILL_SPELLBOOK_DB, skill_parse_row_spellbookdb); //Guillotine Cross diff --git a/src/map/skill.h b/src/map/skill.h index a5c2deae58..ccb35c23ad 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -217,8 +217,8 @@ extern struct s_skill_arrow_db skill_arrow_db[MAX_SKILL_ARROW_DB]; struct s_skill_abra_db { uint16 skill_id; - int req_lv; - int per; + char name[NAME_LENGTH]; + int per[MAX_SKILL_LEVEL]; }; extern struct s_skill_abra_db skill_abra_db[MAX_SKILL_ABRA_DB];