* Added support for skill names to script commands:

- skill, addtoskill, guildskill, getskilllv, getgdskilllv, itemskill, petskillattack, petskillattack2, petskillsupport, skilleffect, npcskilleffect, unitskilluseid, unitskillusepos
- bonus/bonus2/bonus3/bonus4/bonus5 for bonuses bAutoSpell, bSkillAtk, bSkillHeal, bAutoSpellWhenHit, bAddSkillBlow, bCastrate

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@12814 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
FlavioJS 2008-06-12 09:30:12 +00:00
parent 2352b1996e
commit 625f9f62fd
7 changed files with 181 additions and 95 deletions

View File

@ -4,6 +4,13 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2008/06/12
* Added support for skill names to script commands: [FlavioJS]
- skill, addtoskill, guildskill, getskilllv, getgdskilllv, itemskill,
petskillattack, petskillattack2, petskillsupport, skilleffect,
npcskilleffect, unitskilluseid, unitskillusepos
- bonus/bonus2/bonus3/bonus4/bonus5 for bonuses bAutoSpell, bSkillAtk,
bSkillHeal, bAutoSpellWhenHit, bAddSkillBlow, bCastrate
2008/06/11 2008/06/11
* Added partylock/guildlock checking for @changeleader/@changegm * Added partylock/guildlock checking for @changeleader/@changegm
(bugreport:72) [ultramage] (bugreport:72) [ultramage]

View File

@ -3,16 +3,20 @@
//===== By ================================================ //===== By ================================================
//= Developers //= Developers
//===== Version =========================================== //===== Version ===========================================
//= 1.0 //= 1.1.20080612
//========================================================= //=========================================================
//= 1.0 - Standardized doc file //= 1.0 - Standardized doc file
//= 1.1.20080612 - skill command and bonuses (bAutoSpell, bSkillAtk,
//= bSkillHeal, bAutoSpellWhenHit, bAddSkillBlow, bCastrate) accept
//= skill names [FlavioJS]
//=
//===== Description ======================================= //===== Description =======================================
//= List of script instructions used in item bonuses, //= List of script instructions used in item bonuses,
//= mainly bonus/bonus2/bonus3/bonus4/bonus5 arguments //= mainly bonus/bonus2/bonus3/bonus4/bonus5 arguments
//========================================================= //=========================================================
skill i,n; Gives skill #i at level n skill i,n; Gives skill #i at level n (supports skill names)
bonus bStr,n; STR + n bonus bStr,n; STR + n
bonus bAgi,n; AGI + n bonus bAgi,n; AGI + n
@ -114,7 +118,7 @@ bonus2 bAddEff,e,x; Adds a x/10000 chance to cause effect e to the target when
e: Eff_Blind, Eff_Sleep, Eff_Poison, Eff_Freeze, Eff_Silence, Eff_Stan, Eff_Curse, Eff_Confusion, Eff_Stone, Eff_Bleeding e: Eff_Blind, Eff_Sleep, Eff_Poison, Eff_Freeze, Eff_Silence, Eff_Stan, Eff_Curse, Eff_Confusion, Eff_Stone, Eff_Bleeding
bonus2 bResEff,e,x; Adds a x/10000 tolerance to effect e (e.g. x=100 makes 1% tolerance, x=10000 makes 100% tolerance, etc) bonus2 bResEff,e,x; Adds a x/10000 tolerance to effect e (e.g. x=100 makes 1% tolerance, x=10000 makes 100% tolerance, etc)
e: Eff_Blind, Eff_Sleep, Eff_Poison, Eff_Freeze, Eff_Silence, Eff_Stan, Eff_Curse, Eff_Confusion, Eff_Stone, Eff_Bleeding e: Eff_Blind, Eff_Sleep, Eff_Poison, Eff_Freeze, Eff_Silence, Eff_Stan, Eff_Curse, Eff_Confusion, Eff_Stone, Eff_Bleeding
bonus2 bCastrate,n,x; Adjust casting time of skill n by x% bonus2 bCastrate,n,x; Adjust casting time of skill n by x% (supports skill names)
bonus2 bAddSize,n,x; +x% physical damage against size n. bonus2 bAddSize,n,x; +x% physical damage against size n.
n: 0=Small 1=Medium 2=Large n: 0=Small 1=Medium 2=Large
bonus2 bMagicAddSize,n,x; +x% magical damage against size n. bonus2 bMagicAddSize,n,x; +x% magical damage against size n.
@ -168,7 +172,7 @@ bonus3 bAddMonsterDropItem,n,x,y; When killing monsters from race x with physica
10=Boss monster, 11=Other than (normal monster) boss monster 10=Boss monster, 11=Other than (normal monster) boss monster
if 'x' is negative value, then it's a part of formula if 'x' is negative value, then it's a part of formula
chance = -x*(killed_mob_level/10)+1 chance = -x*(killed_mob_level/10)+1
bonus3 bAutoSpell,n,x,y; Auto Spell casting on attack of spell n at level x with y/10% chance. bonus3 bAutoSpell,n,x,y; Auto Spell casting on attack of spell n at level x with y/10% chance. (supports skill names)
Skill is casted on target unless it is a self or support (inf = 4/16) skill. Skill is casted on target unless it is a self or support (inf = 4/16) skill.
// bAddDamageClass, bAddMagicDamageClass and bAddMonsterDropItem it is setting possible up to 10. Those which exceed 10 are ignored. // bAddDamageClass, bAddMagicDamageClass and bAddMonsterDropItem it is setting possible up to 10. Those which exceed 10 are ignored.
@ -198,15 +202,16 @@ bonus2 bCriticalAddRace,n,r; Critical + n vs. enemies of race r
bonus2 bHPRegenRate,n,x; Gain n HP every x milliseconds bonus2 bHPRegenRate,n,x; Gain n HP every x milliseconds
bonus2 bHPLossRate,n,x; Lose n HP every x milliseconds bonus2 bHPLossRate,n,x; Lose n HP every x milliseconds
bonus2 bAddEffWhenHit,n,x; x/100% chance to cause n state to the enemy when being hit by physical damage bonus2 bAddEffWhenHit,n,x; x/100% chance to cause n state to the enemy when being hit by physical damage
bonus2 bSkillAtk,n,x; Increase damage of skill n by x% bonus2 bSkillAtk,n,x; Increase damage of skill n by x% (supports skill names)
bonus2 bSkillHeal,n,x; Increase heal amount of skill n by x% bonus2 bSkillHeal,n,x; Increase heal amount of skill n by x% (supports skill names)
bonus2 bAddDamageByClass,n,x; When being hit by monster of class n increase damage by x% bonus2 bAddDamageByClass,n,x; When being hit by monster of class n increase damage by x%
bonus2 bAddRace2,n,x; Increase damage by x% vs. enemies of race n bonus2 bAddRace2,n,x; Increase damage by x% vs. enemies of race n
(Check db/mob_race2_db.txt) (Check db/mob_race2_db.txt)
y: 0=Don't show damage 1=Show damage y: 0=Don't show damage 1=Show damage
bonus3 bAutoSpellWhenHit,x,y,n; n/10% chance to cast skill x of level y on bonus3 bAutoSpellWhenHit,x,y,n; n/10% chance to cast skill x of level y on
attacker (unless it is a self or support skill) when being hit by a attacker (unless it is a self or support skill) when being hit by a
direct attack. Target must be within spell's range to go off. direct attack. (supports skill names)
Target must be within spell's range to go off.
bonus3 bSPDrainRate,n,x,y; When attacking there is a n% chance to either gain SP equivalent to x% of damage dealt, bonus3 bSPDrainRate,n,x,y; When attacking there is a n% chance to either gain SP equivalent to x% of damage dealt,
OR drain the amount of sp from the enemy. OR drain the amount of sp from the enemy.
y: 0=gain sp 1:drain enemy sp y: 0=gain sp 1:drain enemy sp
@ -214,20 +219,20 @@ bonus3 bSPDrainValue,n,x,y; When attacking there is a n% chance to either gain
OR drain the amount of sp from the enemy. OR drain the amount of sp from the enemy.
y:0=gain sp 1:drain enemy sp y:0=gain sp 1:drain enemy sp
(Note: setting x to -1 or below will reduce YOUR sp) (Note: setting x to -1 or below will reduce YOUR sp)
bonus4 bAutoSpell,x,y,n,i; n/10% chance to cast skill x of level y when attacking bonus4 bAutoSpell,x,y,n,i; n/10% chance to cast skill x of level y when attacking (supports skill names)
i: i:
0=cast on self 0=cast on self
1=cast on enemy, not on self 1=cast on enemy, not on self
2=use random skill lv in [1..y] 2=use random skill lv in [1..y]
3=1+2 (random lv on enemy) 3=1+2 (random lv on enemy)
bonus4 bAutoSpellWhenHit,x,y,n,i; n/10% chance to cast skill x of level y when being hit by a direct attack. bonus4 bAutoSpellWhenHit,x,y,n,i; n/10% chance to cast skill x of level y when being hit by a direct attack. (supports skill names)
Target must be within spell's range to go off. Target must be within spell's range to go off.
i: i:
0=cast on self 0=cast on self
1=cast on enemy, not on self 1=cast on enemy, not on self
2=use random skill lv in [1..y] 2=use random skill lv in [1..y]
3=1+2 (random lv on enemy) 3=1+2 (random lv on enemy)
bonus5 bAutoSpell,x,y,n,t,i; n/10% chance to cast skill x of level y when attacking bonus5 bAutoSpell,x,y,n,t,i; n/10% chance to cast skill x of level y when attacking (supports skill names)
t: Trigger criteria: t: Trigger criteria:
BF_SHORT: Trigger on melee attack BF_SHORT: Trigger on melee attack
BF_LONG: Trigger on ranged attack BF_LONG: Trigger on ranged attack
@ -249,9 +254,8 @@ bonus5 bAutoSpell,x,y,n,t,i; n/10% chance to cast skill x of level y when attac
2=use random skill lv in [1..y] 2=use random skill lv in [1..y]
3=1+2 (random lv on enemy) 3=1+2 (random lv on enemy)
bonus5 bAutoSpellWhenHit,x,y,n,t,i; n/10% chance to cast skill x of level y when being hit by a direct attack. bonus5 bAutoSpellWhenHit,x,y,n,t,i; n/10% chance to cast skill x of level y when being hit by a direct attack. (supports skill names)
Target must be within spell's range to go Target must be within spell's range to go off.
off.
t: Trigger criteria: t: Trigger criteria:
BF_SHORT: Trigger on melee attack BF_SHORT: Trigger on melee attack
BF_LONG: Trigger on ranged attack BF_LONG: Trigger on ranged attack
@ -324,4 +328,4 @@ bonus2 bWeaponComaRace,x,y; y/100% chance to cause Coma when attacking a monste
bAddStealRate,n; n/100% increase to Steal skill success chance bAddStealRate,n; n/100% increase to Steal skill success chance
bonus2 bAddSkillBlow,x,y; Pushback the target by y cells when using skill x bonus2 bAddSkillBlow,x,y; Pushback the target by y cells when using skill x (supports skill names)

View File

@ -4,7 +4,7 @@
//= A reference manual for the eAthena scripting language. //= A reference manual for the eAthena scripting language.
//= Commands are sorted depending on their functionality. //= Commands are sorted depending on their functionality.
//===== Version =========================================== //===== Version ===========================================
//= 3.19.20080407 //= 3.21.20080612
//========================================================= //=========================================================
//= 1.0 - First release, filled will as much info as I could //= 1.0 - First release, filled will as much info as I could
//= remember or figure out, most likely there are errors, //= remember or figure out, most likely there are errors,
@ -113,6 +113,11 @@
//= 3.20.20080425 //= 3.20.20080425
//= Corrected 'getitem', 'getitem2' & 'delitem2' (charid instead of accountid) [Toms] //= Corrected 'getitem', 'getitem2' & 'delitem2' (charid instead of accountid) [Toms]
//= Modified 'delitem' (added optional accountid parameter) [Toms] //= Modified 'delitem' (added optional accountid parameter) [Toms]
//= 3.21.20080612
//= Script commands extended to support skill names: [FlavioJS]
//= skill, addtoskill, guildskill, getskilllv, getgdskilllv, itemskill,
//= petskillattack, petskillattack2, petskillsupport, skilleffect, npcskilleffect,
//= unitskilluseid, unitskillusepos, bonus/bonus2/bonus3/bonus4/bonus5
//========================================================= //=========================================================
This document is a reference manual for all the scripting commands and functions This document is a reference manual for all the scripting commands and functions
@ -2734,6 +2739,7 @@ anything, obviously.
--------------------------------------- ---------------------------------------
*getgdskilllv(<guild id>,<skill id>) *getgdskilllv(<guild id>,<skill id>)
*getgdskilllv(<guild id>,"<skill name>")
This function returns the level of the skill <skill id> of the guild <guild id>. This function returns the level of the skill <skill id> of the guild <guild id>.
If the guild does not have that skill, 0 is returned. If the guild does not have that skill, 0 is returned.
@ -2769,6 +2775,7 @@ Example(s):
--------------------------------------- ---------------------------------------
*getskilllv(<skill id>) *getskilllv(<skill id>)
*getskilllv("<skill name>")
This function returns the level of the specified skill that the invoking This function returns the level of the specified skill that the invoking
character has. If they don't have the skill, 0 will be returned. The full list character has. If they don't have the skill, 0 will be returned. The full list
@ -3936,6 +3943,7 @@ effect is still in effect).
--------------------------------------- ---------------------------------------
*itemskill <skill id>,<skill level>; *itemskill <skill id>,<skill level>;
*itemskill "<skill name>",<skill level>;
This is a command meant for item scripts to replicate single-use skills. It will This is a command meant for item scripts to replicate single-use skills. It will
not work properly in NPC scripts a lot of the time because casting a skill is not work properly in NPC scripts a lot of the time because casting a skill is
@ -4132,6 +4140,7 @@ any guild.
--------------------------------------- ---------------------------------------
*guildskill <skill id>,<level> *guildskill <skill id>,<level>
*guildskill "<skill name>",<level>
This command will bump up the specified guild skill by the specified number of This command will bump up the specified guild skill by the specified number of
levels. This refers to the invoking character and will only work if the invoking levels. This refers to the invoking character and will only work if the invoking
@ -4256,6 +4265,7 @@ should be rather obvious.
--------------------------------------- ---------------------------------------
*skilleffect <skill id>,<number>; *skilleffect <skill id>,<number>;
*skilleffect "<skill name>",<number>;
This command will display the visual and sound effects of a specified skill (see This command will display the visual and sound effects of a specified skill (see
'db/skill_db.txt' for a full list of skills) on the invoking character's sprite. 'db/skill_db.txt' for a full list of skills) on the invoking character's sprite.
@ -4278,6 +4288,7 @@ effect displays a floating number, the number given will float up.
--------------------------------------- ---------------------------------------
*npcskilleffect <skill id>,<number>,<x>,<y>; *npcskilleffect <skill id>,<number>,<x>,<y>;
*npcskilleffect "<skill name>",<number>,<x>,<y>;
This command behaves identically to 'skilleffect', however, the effect will not This command behaves identically to 'skilleffect', however, the effect will not
be centered on the invoking character's sprite, nor on the NPC sprite, if any, be centered on the invoking character's sprite, nor on the NPC sprite, if any,
@ -4383,7 +4394,9 @@ autoscript).
--------------------------------------- ---------------------------------------
*skill <skill id>,<level>{,<flag>}; *skill <skill id>,<level>{,<flag>};
*addtoskill <skill id>,<level>{,<flag>} *skill "<skill name",<level>{,<flag>};
*addtoskill <skill id>,<level>{,<flag>};
*addtoskill "<skill name>",<level>{,<flag>};
These commands will give the invoking character a specified skill. This is also These commands will give the invoking character a specified skill. This is also
used for item scripts. used for item scripts.
@ -5830,8 +5843,10 @@ Example(s):
--------------------------------------- ---------------------------------------
*unitskilluseid <GID>,<skill id>,<skill lvl>; *unitskilluseid <GID>,<skill id>,<skill lvl>{,<target id>};
*unitskilluseid <GID>,"<skill name>",<skill lvl>{,<target id>};
*unitskillusepos <GID>,<skill id>,<skill lvl>,<x>,<y>; *unitskillusepos <GID>,<skill id>,<skill lvl>,<x>,<y>;
*unitskillusepos <GID>,"<skill name>",<skill lvl>,<x>,<y>;
This is the replacement of the older commands, these use the same values for This is the replacement of the older commands, these use the same values for
GID as the other unit* commands (See 'GID'). GID as the other unit* commands (See 'GID').
@ -6064,6 +6079,7 @@ specified. Pet will store items and return them when the maximum is reached or
when pet performance is activated. when pet performance is activated.
*petskillsupport <skill id>,<skill level>,<delay>,<percent hp>,<percent sp>; *petskillsupport <skill id>,<skill level>,<delay>,<percent hp>,<percent sp>;
*petskillsupport "<skill name>",<skill level>,<delay>,<percent hp>,<percent sp>;
*petheal <level>,<delay>,<percent hp>,<percent sp>; *petheal <level>,<delay>,<percent hp>,<percent sp>;
This will make the pet use a specified support skill on the owner whenever the This will make the pet use a specified support skill on the owner whenever the
@ -6075,7 +6091,9 @@ It's not quite certain who's stats will be used for the skills cast, the
character's or the pets. Probably, Skotlex can answer that question. character's or the pets. Probably, Skotlex can answer that question.
*petskillattack <skill id>,<skill level>,<rate>,<bonusrate>; *petskillattack <skill id>,<skill level>,<rate>,<bonusrate>;
*petskillattack "<skill name>",<skill level>,<rate>,<bonusrate>;
*petskillattack2 <skill id>,<damage>,<number of attacks>,<rate>,<bonusrate>; *petskillattack2 <skill id>,<damage>,<number of attacks>,<rate>,<bonusrate>;
*petskillattack2 "<skill name>",<damage>,<number of attacks>,<rate>,<bonusrate>;
These two commands will make the pet cast an attack skill on the enemy the pet's These two commands will make the pet cast an attack skill on the enemy the pet's
owner is currently fighting. Skill IDs and levels are as per 'petskillsupport'. owner is currently fighting. Skill IDs and levels are as per 'petskillsupport'.

View File

@ -609,6 +609,7 @@ struct DBMap {
#define stridb_alloc(opt,maxlen) db_alloc(__FILE__,__LINE__,DB_ISTRING,(opt),(maxlen)) #define stridb_alloc(opt,maxlen) db_alloc(__FILE__,__LINE__,DB_ISTRING,(opt),(maxlen))
#define db_destroy(db) ( (db)->destroy((db),NULL) ) #define db_destroy(db) ( (db)->destroy((db),NULL) )
// Other macros // Other macros
#define db_clear(db) ( (db)->clear(db,NULL) )
#define db_iterator(db) ( (db)->iterator(db) ) #define db_iterator(db) ( (db)->iterator(db) )
#define dbi_first(dbi) ( (dbi)->first(dbi,NULL) ) #define dbi_first(dbi) ( (dbi)->first(dbi,NULL) )
#define dbi_last(dbi) ( (dbi)->last(dbi,NULL) ) #define dbi_last(dbi) ( (dbi)->last(dbi,NULL) )

View File

@ -90,6 +90,9 @@
/// Pushes a copy of the data in the target index /// Pushes a copy of the data in the target index
#define script_pushcopy(st,i) push_copy((st)->stack, (st)->start + (i)) #define script_pushcopy(st,i) push_copy((st)->stack, (st)->start + (i))
#define script_isstring(st,i) data_isstring(script_getdata(st,i))
#define script_isint(st,i) data_isint(script_getdata(st,i))
#define script_getnum(st,val) conv_num(st, script_getdata(st,val)) #define script_getnum(st,val) conv_num(st, script_getdata(st,val))
#define script_getstr(st,val) conv_str(st, script_getdata(st,val)) #define script_getstr(st,val) conv_str(st, script_getdata(st,val))
#define script_getref(st,val) ( script_getdata(st,val)->ref ) #define script_getref(st,val) ( script_getdata(st,val)->ref )
@ -6581,11 +6584,11 @@ BUILDIN_FUNC(statusup2)
BUILDIN_FUNC(bonus) BUILDIN_FUNC(bonus)
{ {
int type; int type;
int type2; int val1;
int type3; int val2 = 0;
int type4; int val3 = 0;
int type5; int val4 = 0;
int val; int val5 = 0;
TBL_PC* sd; TBL_PC* sd;
sd = script_rid2sd(st); sd = script_rid2sd(st);
@ -6593,39 +6596,52 @@ BUILDIN_FUNC(bonus)
return 0; // no player attached return 0; // no player attached
type = script_getnum(st,2); type = script_getnum(st,2);
switch( script_lastdata(st) ){ switch( type )
case 3: {
val = script_getnum(st,3); case SP_AUTOSPELL:
pc_bonus(sd, type, val); case SP_AUTOSPELL_WHENHIT:
break; case SP_SKILL_ATK:
case 4: case SP_SKILL_HEAL:
type2 = script_getnum(st,3); case SP_ADD_SKILL_BLOW:
val = script_getnum(st,4); case SP_CASTRATE:
pc_bonus2(sd, type, type2, val); // these bonuses support skill names
break; val1 = ( script_isstring(st,3) ? skill_name2id(script_getstr(st,3)) : script_getnum(st,3) );
case 5:
type2 = script_getnum(st,3);
type3 = script_getnum(st,4);
val = script_getnum(st,5);
pc_bonus3(sd, type, type2, type3, val);
break;
case 6:
type2 = script_getnum(st,3);
type3 = script_getnum(st,4);
type4 = script_getnum(st,5);
val = script_getnum(st,6);
pc_bonus4(sd, type, type2, type3, type4, val);
break;
case 7:
type2 = script_getnum(st,3);
type3 = script_getnum(st,4);
type4 = script_getnum(st,5);
type5 = script_getnum(st,6);
val = script_getnum(st,7);
pc_bonus5(sd, type, type2, type3, type4, type5, val);
break; break;
default: default:
ShowDebug("buildin_bonus: unexpected number of arguments (%d)\n", (script_lastdata(st) - 2)); val1 = script_getnum(st,3);
break;
}
switch( script_lastdata(st)-2 )
{
case 1:
pc_bonus(sd, type, val1);
break;
case 2:
val2 = script_getnum(st,4);
pc_bonus2(sd, type, val1, val2);
break;
case 3:
val2 = script_getnum(st,4);
val3 = script_getnum(st,5);
pc_bonus3(sd, type, val1, val2, val3);
break;
case 4:
val2 = script_getnum(st,4);
val3 = script_getnum(st,5);
val4 = script_getnum(st,6);
pc_bonus4(sd, type, val1, val2, val3, val4);
break;
case 5:
val2 = script_getnum(st,4);
val3 = script_getnum(st,5);
val4 = script_getnum(st,6);
val5 = script_getnum(st,7);
pc_bonus5(sd, type, val1, val2, val3, val4, val5);
break;
default:
ShowDebug("buildin_bonus: unexpected number of arguments (%d)\n", (script_lastdata(st) - 1));
break;
} }
return 0; return 0;
@ -6692,6 +6708,8 @@ BUILDIN_FUNC(bonusautoscript2)
/// ///
/// skill <skill id>,<level>,<flag> /// skill <skill id>,<level>,<flag>
/// skill <skill id>,<level> /// skill <skill id>,<level>
/// skill "<skill name>",<level>,<flag>
/// skill "<skill name>",<level>
BUILDIN_FUNC(skill) BUILDIN_FUNC(skill)
{ {
int id; int id;
@ -6703,7 +6721,7 @@ BUILDIN_FUNC(skill)
if( sd == NULL ) if( sd == NULL )
return 0;// no player attached, report source return 0;// no player attached, report source
id = script_getnum(st,2); id = ( script_isstring(st,2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
level = script_getnum(st,3); level = script_getnum(st,3);
if( script_hasdata(st,4) ) if( script_hasdata(st,4) )
flag = script_getnum(st,4); flag = script_getnum(st,4);
@ -6717,6 +6735,8 @@ BUILDIN_FUNC(skill)
/// ///
/// addtoskill <skill id>,<amount>,<flag> /// addtoskill <skill id>,<amount>,<flag>
/// addtoskill <skill id>,<amount> /// addtoskill <skill id>,<amount>
/// addtoskill "<skill name>",<amount>,<flag>
/// addtoskill "<skill name>",<amount>
/// ///
/// @see skill /// @see skill
BUILDIN_FUNC(addtoskill) BUILDIN_FUNC(addtoskill)
@ -6730,7 +6750,7 @@ BUILDIN_FUNC(addtoskill)
if( sd == NULL ) if( sd == NULL )
return 0;// no player attached, report source return 0;// no player attached, report source
id = script_getnum(st,2); id = ( script_isstring(st,2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
level = script_getnum(st,3); level = script_getnum(st,3);
if( script_hasdata(st,4) ) if( script_hasdata(st,4) )
flag = script_getnum(st,4); flag = script_getnum(st,4);
@ -6742,6 +6762,7 @@ BUILDIN_FUNC(addtoskill)
/// Increases the level of a guild skill. /// Increases the level of a guild skill.
/// ///
/// guildskill <skill id>,<amount>; /// guildskill <skill id>,<amount>;
/// guildskill "<skill name>",<amount>;
BUILDIN_FUNC(guildskill) BUILDIN_FUNC(guildskill)
{ {
int id; int id;
@ -6753,7 +6774,7 @@ BUILDIN_FUNC(guildskill)
if( sd == NULL ) if( sd == NULL )
return 0;// no player attached, report source return 0;// no player attached, report source
id = script_getnum(st,2); id = ( script_isstring(st,2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
level = script_getnum(st,3); level = script_getnum(st,3);
for( i=0; i < level; i++ ) for( i=0; i < level; i++ )
guild_skillup(sd, id); guild_skillup(sd, id);
@ -6764,6 +6785,7 @@ BUILDIN_FUNC(guildskill)
/// Returns the level of the player skill. /// Returns the level of the player skill.
/// ///
/// getskilllv(<skill id>) -> <level> /// getskilllv(<skill id>) -> <level>
/// getskilllv("<skill name>") -> <level>
BUILDIN_FUNC(getskilllv) BUILDIN_FUNC(getskilllv)
{ {
int id; int id;
@ -6773,7 +6795,7 @@ BUILDIN_FUNC(getskilllv)
if( sd == NULL ) if( sd == NULL )
return 0;// no player attached, report source return 0;// no player attached, report source
id = script_getnum(st,2); id = ( script_isstring(st,2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
script_pushint(st, pc_checkskill(sd,id)); script_pushint(st, pc_checkskill(sd,id));
return 0; return 0;
@ -6782,6 +6804,7 @@ BUILDIN_FUNC(getskilllv)
/// Returns the level of the guild skill. /// Returns the level of the guild skill.
/// ///
/// getgdskilllv(<guild id>,<skill id>) -> <level> /// getgdskilllv(<guild id>,<skill id>) -> <level>
/// getgdskilllv(<guild id>,"<skill name>") -> <level>
BUILDIN_FUNC(getgdskilllv) BUILDIN_FUNC(getgdskilllv)
{ {
int guild_id; int guild_id;
@ -6789,7 +6812,7 @@ BUILDIN_FUNC(getgdskilllv)
struct guild* g; struct guild* g;
guild_id = script_getnum(st,2); guild_id = script_getnum(st,2);
skill_id = script_getnum(st,3); skill_id = ( script_isstring(st,3) ? skill_name2id(script_getstr(st,3)) : script_getnum(st,3) );
g = guild_search(guild_id); g = guild_search(guild_id);
if( g == NULL ) if( g == NULL )
script_pushint(st, -1); script_pushint(st, -1);
@ -7225,17 +7248,21 @@ BUILDIN_FUNC(guildopenstorage)
/*========================================== /*==========================================
* *
*------------------------------------------*/ *------------------------------------------*/
/// itemskill <skill id>,<level>
/// itemskill "<skill name>",<level>
BUILDIN_FUNC(itemskill) BUILDIN_FUNC(itemskill)
{ {
int id,lv; int id;
TBL_PC *sd=script_rid2sd(st); int lv;
TBL_PC* sd;
id=script_getnum(st,2); sd = script_rid2sd(st);
lv=script_getnum(st,3); if( sd == NULL || sd->ud.skilltimer != INVALID_TIMER )
if(!sd || sd->ud.skilltimer != -1)
return 0; return 0;
id = ( script_isstring(st,2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
lv = script_getnum(st,3);
sd->skillitem=id; sd->skillitem=id;
sd->skillitemlv=lv; sd->skillitemlv=lv;
clif_item_skill(sd,id,lv); clif_item_skill(sd,id,lv);
@ -10489,6 +10516,8 @@ BUILDIN_FUNC(petheal)
/*========================================== /*==========================================
* pet attack skills [Valaris] //Rewritten by [Skotlex] * pet attack skills [Valaris] //Rewritten by [Skotlex]
*------------------------------------------*/ *------------------------------------------*/
/// petskillattack <skill id>,<level>,<rate>,<bonusrate>
/// petskillattack "<skill name>",<level>,<rate>,<bonusrate>
BUILDIN_FUNC(petskillattack) BUILDIN_FUNC(petskillattack)
{ {
struct pet_data *pd; struct pet_data *pd;
@ -10501,7 +10530,7 @@ BUILDIN_FUNC(petskillattack)
if (pd->a_skill == NULL) if (pd->a_skill == NULL)
pd->a_skill = (struct pet_skill_attack *)aMalloc(sizeof(struct pet_skill_attack)); pd->a_skill = (struct pet_skill_attack *)aMalloc(sizeof(struct pet_skill_attack));
pd->a_skill->id=script_getnum(st,2); pd->a_skill->id=( script_isstring(st,2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
pd->a_skill->lv=script_getnum(st,3); pd->a_skill->lv=script_getnum(st,3);
pd->a_skill->div_ = 0; pd->a_skill->div_ = 0;
pd->a_skill->rate=script_getnum(st,4); pd->a_skill->rate=script_getnum(st,4);
@ -10513,6 +10542,8 @@ BUILDIN_FUNC(petskillattack)
/*========================================== /*==========================================
* pet attack skills [Valaris] * pet attack skills [Valaris]
*------------------------------------------*/ *------------------------------------------*/
/// petskillattack2 <skill id>,<level>,<div>,<rate>,<bonusrate>
/// petskillattack2 "<skill name>",<level>,<div>,<rate>,<bonusrate>
BUILDIN_FUNC(petskillattack2) BUILDIN_FUNC(petskillattack2)
{ {
struct pet_data *pd; struct pet_data *pd;
@ -10525,7 +10556,7 @@ BUILDIN_FUNC(petskillattack2)
if (pd->a_skill == NULL) if (pd->a_skill == NULL)
pd->a_skill = (struct pet_skill_attack *)aMalloc(sizeof(struct pet_skill_attack)); pd->a_skill = (struct pet_skill_attack *)aMalloc(sizeof(struct pet_skill_attack));
pd->a_skill->id=script_getnum(st,2); pd->a_skill->id=( script_isstring(st,2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
pd->a_skill->lv=script_getnum(st,3); pd->a_skill->lv=script_getnum(st,3);
pd->a_skill->div_ = script_getnum(st,4); pd->a_skill->div_ = script_getnum(st,4);
pd->a_skill->rate=script_getnum(st,5); pd->a_skill->rate=script_getnum(st,5);
@ -10537,6 +10568,8 @@ BUILDIN_FUNC(petskillattack2)
/*========================================== /*==========================================
* pet support skills [Skotlex] * pet support skills [Skotlex]
*------------------------------------------*/ *------------------------------------------*/
/// petskillsupport <skill id>,<level>,<delay>,<hp>,<sp>
/// petskillsupport "<skill name>",<level>,<delay>,<hp>,<sp>
BUILDIN_FUNC(petskillsupport) BUILDIN_FUNC(petskillsupport)
{ {
struct pet_data *pd; struct pet_data *pd;
@ -10558,7 +10591,7 @@ BUILDIN_FUNC(petskillsupport)
} else //init memory } else //init memory
pd->s_skill = (struct pet_skill_support *) aMalloc(sizeof(struct pet_skill_support)); pd->s_skill = (struct pet_skill_support *) aMalloc(sizeof(struct pet_skill_support));
pd->s_skill->id=script_getnum(st,2); pd->s_skill->id=( script_isstring(st,2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
pd->s_skill->lv=script_getnum(st,3); pd->s_skill->lv=script_getnum(st,3);
pd->s_skill->delay=script_getnum(st,4); pd->s_skill->delay=script_getnum(st,4);
pd->s_skill->hp=script_getnum(st,5); pd->s_skill->hp=script_getnum(st,5);
@ -10576,11 +10609,13 @@ BUILDIN_FUNC(petskillsupport)
/*========================================== /*==========================================
* Scripted skill effects [Celest] * Scripted skill effects [Celest]
*------------------------------------------*/ *------------------------------------------*/
/// skilleffect <skill id>,<level>
/// skilleffect "<skill name>",<level>
BUILDIN_FUNC(skilleffect) BUILDIN_FUNC(skilleffect)
{ {
TBL_PC *sd; TBL_PC *sd;
int skillid=script_getnum(st,2); int skillid=( script_isstring(st,2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
int skilllv=script_getnum(st,3); int skilllv=script_getnum(st,3);
sd=script_rid2sd(st); sd=script_rid2sd(st);
@ -10592,11 +10627,13 @@ BUILDIN_FUNC(skilleffect)
/*========================================== /*==========================================
* NPC skill effects [Valaris] * NPC skill effects [Valaris]
*------------------------------------------*/ *------------------------------------------*/
/// npcskilleffect <skill id>,<level>,<x>,<y>
/// npcskilleffect "<skill name>",<level>,<x>,<y>
BUILDIN_FUNC(npcskilleffect) BUILDIN_FUNC(npcskilleffect)
{ {
struct block_list *bl= map_id2bl(st->oid); struct block_list *bl= map_id2bl(st->oid);
int skillid=script_getnum(st,2); int skillid=( script_isstring(st,2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
int skilllv=script_getnum(st,3); int skilllv=script_getnum(st,3);
int x=script_getnum(st,4); int x=script_getnum(st,4);
int y=script_getnum(st,5); int y=script_getnum(st,5);
@ -12871,6 +12908,7 @@ BUILDIN_FUNC(unitemote)
/// Makes the unit cast the skill on the target or self if no target is specified /// Makes the unit cast the skill on the target or self if no target is specified
/// ///
/// unitskilluseid <unit_id>,<skill_id>,<skill_lv>{,<target_id>}; /// unitskilluseid <unit_id>,<skill_id>,<skill_lv>{,<target_id>};
/// unitskilluseid <unit_id>,"<skill name>",<skill_lv>{,<target_id>};
BUILDIN_FUNC(unitskilluseid) BUILDIN_FUNC(unitskilluseid)
{ {
int unit_id; int unit_id;
@ -12880,7 +12918,7 @@ BUILDIN_FUNC(unitskilluseid)
struct block_list* bl; struct block_list* bl;
unit_id = script_getnum(st,2); unit_id = script_getnum(st,2);
skill_id = script_getnum(st,3); skill_id = ( script_isstring(st,3) ? skill_name2id(script_getstr(st,3)) : script_getnum(st,3) );
skill_lv = script_getnum(st,4); skill_lv = script_getnum(st,4);
target_id = ( script_hasdata(st,5) ? script_getnum(st,5) : unit_id ); target_id = ( script_hasdata(st,5) ? script_getnum(st,5) : unit_id );
@ -12894,6 +12932,7 @@ BUILDIN_FUNC(unitskilluseid)
/// Makes the unit cast the skill on the target position. /// Makes the unit cast the skill on the target position.
/// ///
/// unitskillusepos <unit_id>,<skill_id>,<skill_lv>,<target_x>,<target_y>; /// unitskillusepos <unit_id>,<skill_id>,<skill_lv>,<target_x>,<target_y>;
/// unitskillusepos <unit_id>,"<skill name>",<skill_lv>,<target_x>,<target_y>;
BUILDIN_FUNC(unitskillusepos) BUILDIN_FUNC(unitskillusepos)
{ {
int unit_id; int unit_id;
@ -12904,7 +12943,7 @@ BUILDIN_FUNC(unitskillusepos)
struct block_list* bl; struct block_list* bl;
unit_id = script_getnum(st,2); unit_id = script_getnum(st,2);
skill_id = script_getnum(st,3); skill_id = ( script_isstring(st,3) ? skill_name2id(script_getstr(st,3)) : script_getnum(st,3) );
skill_lv = script_getnum(st,4); skill_lv = script_getnum(st,4);
skill_x = script_getnum(st,5); skill_x = script_getnum(st,5);
skill_y = script_getnum(st,6); skill_y = script_getnum(st,6);
@ -13344,18 +13383,18 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(failedrefitem,"i"), BUILDIN_DEF(failedrefitem,"i"),
BUILDIN_DEF(statusup,"i"), BUILDIN_DEF(statusup,"i"),
BUILDIN_DEF(statusup2,"ii"), BUILDIN_DEF(statusup2,"ii"),
BUILDIN_DEF(bonus,"ii"), BUILDIN_DEF(bonus,"iv"),
BUILDIN_DEF2(bonus,"bonus2","iii"), BUILDIN_DEF2(bonus,"bonus2","ivi"),
BUILDIN_DEF2(bonus,"bonus3","iiii"), BUILDIN_DEF2(bonus,"bonus3","ivii"),
BUILDIN_DEF2(bonus,"bonus4","iiiii"), BUILDIN_DEF2(bonus,"bonus4","iviii"),
BUILDIN_DEF2(bonus,"bonus5","iiiiii"), BUILDIN_DEF2(bonus,"bonus5","iviiii"),
BUILDIN_DEF(bonusautoscript,"si?"), BUILDIN_DEF(bonusautoscript,"si?"),
BUILDIN_DEF(bonusautoscript2,"si?"), BUILDIN_DEF(bonusautoscript2,"si?"),
BUILDIN_DEF(skill,"ii?"), BUILDIN_DEF(skill,"vi?"),
BUILDIN_DEF(addtoskill,"ii?"), // [Valaris] BUILDIN_DEF(addtoskill,"vi?"), // [Valaris]
BUILDIN_DEF(guildskill,"ii"), BUILDIN_DEF(guildskill,"vi"),
BUILDIN_DEF(getskilllv,"i"), BUILDIN_DEF(getskilllv,"v"),
BUILDIN_DEF(getgdskilllv,"ii"), BUILDIN_DEF(getgdskilllv,"iv"),
BUILDIN_DEF(basicskillcheck,""), BUILDIN_DEF(basicskillcheck,""),
BUILDIN_DEF(getgmlevel,""), BUILDIN_DEF(getgmlevel,""),
BUILDIN_DEF(end,""), BUILDIN_DEF(end,""),
@ -13374,7 +13413,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(gettimestr,"si"), BUILDIN_DEF(gettimestr,"si"),
BUILDIN_DEF(openstorage,""), BUILDIN_DEF(openstorage,""),
BUILDIN_DEF(guildopenstorage,"*"), BUILDIN_DEF(guildopenstorage,"*"),
BUILDIN_DEF(itemskill,"ii"), BUILDIN_DEF(itemskill,"vi"),
BUILDIN_DEF(produce,"i"), BUILDIN_DEF(produce,"i"),
BUILDIN_DEF(monster,"siisii*"), BUILDIN_DEF(monster,"siisii*"),
BUILDIN_DEF(areamonster,"siiiisii*"), BUILDIN_DEF(areamonster,"siiiisii*"),
@ -13481,11 +13520,11 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(petrecovery,"ii"), // [Valaris] BUILDIN_DEF(petrecovery,"ii"), // [Valaris]
BUILDIN_DEF(petloot,"i"), // [Valaris] BUILDIN_DEF(petloot,"i"), // [Valaris]
BUILDIN_DEF(petheal,"iiii"), // [Valaris] BUILDIN_DEF(petheal,"iiii"), // [Valaris]
BUILDIN_DEF(petskillattack,"iiii"), // [Skotlex] BUILDIN_DEF(petskillattack,"viii"), // [Skotlex]
BUILDIN_DEF(petskillattack2,"iiiii"), // [Valaris] BUILDIN_DEF(petskillattack2,"viiii"), // [Valaris]
BUILDIN_DEF(petskillsupport,"iiiii"), // [Skotlex] BUILDIN_DEF(petskillsupport,"viiii"), // [Skotlex]
BUILDIN_DEF(skilleffect,"ii"), // skill effect [Celest] BUILDIN_DEF(skilleffect,"vi"), // skill effect [Celest]
BUILDIN_DEF(npcskilleffect,"iiii"), // npc skill effect [Valaris] BUILDIN_DEF(npcskilleffect,"viii"), // npc skill effect [Valaris]
BUILDIN_DEF(specialeffect,"i*"), // npc skill effect [Valaris] BUILDIN_DEF(specialeffect,"i*"), // npc skill effect [Valaris]
BUILDIN_DEF(specialeffect2,"i*"), // skill effect on players[Valaris] BUILDIN_DEF(specialeffect2,"i*"), // skill effect on players[Valaris]
BUILDIN_DEF(nude,""), // nude command [Valaris] BUILDIN_DEF(nude,""), // nude command [Valaris]
@ -13587,8 +13626,8 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(unitstop,"i"), BUILDIN_DEF(unitstop,"i"),
BUILDIN_DEF(unittalk,"is"), BUILDIN_DEF(unittalk,"is"),
BUILDIN_DEF(unitemote,"ii"), BUILDIN_DEF(unitemote,"ii"),
BUILDIN_DEF(unitskilluseid,"iii?"), // originally by Qamera [Celest] BUILDIN_DEF(unitskilluseid,"ivi?"), // originally by Qamera [Celest]
BUILDIN_DEF(unitskillusepos,"iiiii"), // [Celest] BUILDIN_DEF(unitskillusepos,"iviii"), // [Celest]
// <--- [zBuffer] List of mob control commands // <--- [zBuffer] List of mob control commands
BUILDIN_DEF(sleep,"i"), BUILDIN_DEF(sleep,"i"),
BUILDIN_DEF(sleep2,"i"), BUILDIN_DEF(sleep2,"i"),

View File

@ -47,6 +47,7 @@
static struct eri *skill_unit_ers = NULL; //For handling skill_unit's [Skotlex] 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] static struct eri *skill_timer_ers = NULL; //For handling skill_timerskills [Skotlex]
DBMap* skilldb_name2id = NULL;
struct s_skill_db skill_db[MAX_SKILL_DB]; struct s_skill_db skill_db[MAX_SKILL_DB];
struct s_skill_produce_db skill_produce_db[MAX_SKILL_PRODUCE_DB]; struct s_skill_produce_db skill_produce_db[MAX_SKILL_PRODUCE_DB];
struct s_skill_arrow_db skill_arrow_db[MAX_SKILL_ARROW_DB]; struct s_skill_arrow_db skill_arrow_db[MAX_SKILL_ARROW_DB];
@ -59,6 +60,15 @@ int icewall_unit_pos;
//Since only mob-casted splash skills can hit ice-walls //Since only mob-casted splash skills can hit ice-walls
#define splash_target(bl) (bl->type==BL_MOB?BL_SKILL|BL_CHAR:BL_CHAR) #define splash_target(bl) (bl->type==BL_MOB?BL_SKILL|BL_CHAR:BL_CHAR)
/// Returns the id of the skill, or 0 if not found.
int skill_name2id(const char* name)
{
if( name == NULL )
return 0;
return (int)strdb_get(skilldb_name2id, name);
}
/// Maps skill ids to skill db offsets. /// Maps skill ids to skill db offsets.
/// Returns the skill's array index, or 0 (Unknown Skill). /// Returns the skill's array index, or 0 (Unknown Skill).
int skill_get_index( int id ) int skill_get_index( int id )
@ -10743,16 +10753,17 @@ void skill_init_unit_layout (void)
static bool skill_parse_row_skilldb(char* split[], int columns, int current) static bool skill_parse_row_skilldb(char* split[], int columns, int current)
{// id,range,hit,inf,element,nk,splash,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count,name,description {// id,range,hit,inf,element,nk,splash,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count,name,description
int i = atoi(split[0]); int id = atoi(split[0]);
if( i >= GD_SKILLRANGEMIN && i <= GD_SKILLRANGEMAX ) { int i;
if( id >= GD_SKILLRANGEMIN && id <= GD_SKILLRANGEMAX ) {
ShowWarning("skill_parse_row_skilldb: Skill id %d is forbidden (interferes with guild skill mapping)!\n"); ShowWarning("skill_parse_row_skilldb: Skill id %d is forbidden (interferes with guild skill mapping)!\n");
return false; return false;
} }
if( i >= HM_SKILLRANGEMIN && i <= HM_SKILLRANGEMAX ) { if( id >= HM_SKILLRANGEMIN && id <= HM_SKILLRANGEMAX ) {
ShowWarning("skill_parse_row_skilldb: Skill id %d is forbidden (interferes with homunculus skill mapping)!\n"); ShowWarning("skill_parse_row_skilldb: Skill id %d is forbidden (interferes with homunculus skill mapping)!\n");
return false; return false;
} }
i = skill_get_index(i); i = skill_get_index(id);
if( !i ) // invalid skill id if( !i ) // invalid skill id
return false; return false;
@ -10783,6 +10794,7 @@ static bool skill_parse_row_skilldb(char* split[], int columns, int current)
skill_split_atoi(split[14],skill_db[i].blewcount); skill_split_atoi(split[14],skill_db[i].blewcount);
safestrncpy(skill_db[i].name, trim(split[15]), sizeof(skill_db[i].name)); safestrncpy(skill_db[i].name, trim(split[15]), sizeof(skill_db[i].name));
safestrncpy(skill_db[i].desc, trim(split[16]), sizeof(skill_db[i].desc)); safestrncpy(skill_db[i].desc, trim(split[16]), sizeof(skill_db[i].desc));
strdb_put(skilldb_name2id, skill_db[i].name, (void*)id);
return true; return true;
} }
@ -11012,6 +11024,7 @@ static bool skill_parse_row_abradb(char* split[], int columns, int current)
static void skill_readdb(void) static void skill_readdb(void)
{ {
// init skill db structures // init skill db structures
db_clear(skilldb_name2id);
memset(skill_db,0,sizeof(skill_db)); memset(skill_db,0,sizeof(skill_db));
memset(skill_produce_db,0,sizeof(skill_produce_db)); memset(skill_produce_db,0,sizeof(skill_produce_db));
memset(skill_arrow_db,0,sizeof(skill_arrow_db)); memset(skill_arrow_db,0,sizeof(skill_arrow_db));
@ -11042,6 +11055,7 @@ void skill_reload (void)
*------------------------------------------*/ *------------------------------------------*/
int do_init_skill (void) int do_init_skill (void)
{ {
skilldb_name2id = strdb_alloc(DB_OPT_DUP_KEY, 0);
skill_readdb(); skill_readdb();
skill_unit_ers = ers_new(sizeof(struct skill_unit_group)); skill_unit_ers = ers_new(sizeof(struct skill_unit_group));
@ -11060,6 +11074,7 @@ int do_init_skill (void)
int do_final_skill(void) int do_final_skill(void)
{ {
db_destroy(skilldb_name2id);
ers_destroy(skill_unit_ers); ers_destroy(skill_unit_ers);
ers_destroy(skill_timer_ers); ers_destroy(skill_timer_ers);
return 0; return 0;

View File

@ -249,6 +249,8 @@ int skill_tree_get_max( int id, int b_class ); // Celest
const char* skill_get_name( int id ); // [Skotlex] const char* skill_get_name( int id ); // [Skotlex]
const char* skill_get_desc( int id ); // [Skotlex] const char* skill_get_desc( int id ); // [Skotlex]
int skill_name2id(const char* name);
int skill_isammotype(struct map_session_data *sd, int skill); int skill_isammotype(struct map_session_data *sd, int skill);
int skill_castend_id(int tid, unsigned int tick, int id, intptr data); int skill_castend_id(int tid, unsigned int tick, int id, intptr data);
int skill_castend_pos(int tid, unsigned int tick, int id, intptr data); int skill_castend_pos(int tid, unsigned int tick, int id, intptr data);