- Removed bonus bAddEffWhenHitShort as it is unneeded and unused.

- Corrected getpetinfo so it actually returns "null" when there's no pet and you request the name (the docs state it so).
- Also cleaned up a bit getpetinfo
- Added gethominfo (which behaves in the same way as getpetinfo).
- The 'maxcount' skill_db field now can store independant values per skill-level, required for Kamaitachi since it uses different range values per level.
- Corrected bonus3 bAutoSpell(WhenHit) to select target enemy (rather than self) for skills with inf self and inf2 'don't target self' (aka: auto-select target skills).
- Corrected map_foreachinpath to do a wall check for targets beyond the initially selected tile.
- Corrected Kamaitachi's range to be 9, and the path range to be 4+SkillLv


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11169 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2007-09-10 17:07:35 +00:00
parent 58ee1bc152
commit 7233562a1a
12 changed files with 117 additions and 46 deletions

View File

@ -3,6 +3,16 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/09/09
* Removed bonus bAddEffWhenHitShort as it is unneeded and unused.
* Corrected getpetinfo so it actually returns "null" when there's no pet
and you request the name (the docs state it so).
* Added gethominfo (which behaves in the same way as getpetinfo).
* Corrected bonus3 bAutoSpell(WhenHit) to select target enemy (rather than
self) for skills with inf self and inf2 'don't target self' (aka:
auto-select target skills).
* Corrected map_foreachinpath to do a wall check for targets beyond the
initially selected tile.
2007/09/09
* Modified bonus3 bAddEff/bAddEffWhenHit so that the last parameter is now
passed directly as "trigger" flag. The possible trigger values are

View File

@ -28,6 +28,8 @@
========================
09/10
* Corrected Kamaitachi's range to be 9, and the path range to be 4+SkillLv
[Skotlex]
* Fixed Garm's and Bacsojin's skills being cancelable [Playtester]
* Fixed Asura Strike autocast being self targetted [Playtester]
09/09

View File

@ -395,7 +395,7 @@ bSPDrainValueRace 2029
bExpAddRace 2030
bSPGainRace 2031
bSubRace2 2032
bAddEffWhenHitShort 2033
bUnstripableWeapon 2034
bUnstripableArmor 2035
bUnstripableHelm 2036

View File

@ -581,7 +581,7 @@
539,0,6,4,1,0x2,3,5,1,yes,0,0,0,magic,0 //NJ_HYOUSYOURAKU#NJ_HYOUSYOURAKU#
540,9,8,1,4,0,0,10,1:2:2:3:3:4:4:5:5:6,yes,0,0,0,magic,0 //NJ_HUUJIN#NJ_HUUJIN#
541,9,6,4,4,0x2,2:2:3:3:4,5,1,yes,0,0,0,magic,0 //NJ_RAIGEKISAI#NJ_RAIGEKISAI#
542,5:6:7:8:9,8,1,4,0,3,5,1,yes,0,0,9,magic,0 //NJ_KAMAITACHI#NJ_KAMAITACHI#
542,9,8,1,4,0,3,5,1,yes,0,0,5:6:7:8:9,magic,0 //NJ_KAMAITACHI#NJ_KAMAITACHI#
543,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0 //NJ_NEN#NJ_NEN#
544,-5,6,1,0,0x40,0,10,1,no,0,0,0,weapon,0 //NJ_ISSEN#NJ_ISSEN#

View File

@ -165,8 +165,6 @@ bonus2 bHPRegenRate,n,x; Gain 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 bAddEffWhenHitShort,n,x; n% chance to cause x state to the enemy when
being hit by physical close range damage
bonus2 bSkillAtk,n,x; Increase damage of skill n by x%
bonus2 bSkillHeal,n,x; Increase heal amount of skill n by x%
bonus2 bAddDamageByClass,n,x; When being hit by monster of class n increase

View File

@ -80,6 +80,8 @@
//= Removed the messy 'unitdeadsit' command reference [ultramage]
//= 3.05.20070823
//= Fixed typo in 'areamonster' description (missing argument) [ultramage]
//= 3.06 20070909
//= Added 'gethominfo' description [Skotlex]
//===== Description =======================================
//= A reference manual for the eAthena scripting language,
//= sorted out depending on their functionality.
@ -2761,7 +2763,7 @@ currently has active. Valid types are:
0 - Unique pet ID number as stored by the char server and distinguishing it
from all other pets the characters actually have. This value is currently
useless, at most you can use it to tell pets apart reliably.
1 - Pet ID number as per 'db/pet_db.txt' - will tell you what kind of a pet it
1 - Pet class number as per 'db/pet_db.txt' - will tell you what kind of a pet it
is.
2 - Pet name. Will return "null" if there's no pet.
3 - Pet friendly level (intimacy score). 1000 is full loyalty.
@ -2769,6 +2771,19 @@ currently has active. Valid types are:
5 - Pet rename flag. 0 means this pet has not been named yet.
---------------------------------------
*gethominfo(<type>)
This function works as a direct counterpart of 'getpetinfo':
0 - Homunculus unique ID
1 - Homunculus Class
2 - Name
3 - Friendly level (intimacy score). 100000 is full loyalty.
4 - Hungry level. 100 is completely full.
5 - Rename flag. 0 means this homunculus has not been named yet.
6 - Homunculus level
---------------------------------------
*petstat(<flag>)
Returns current pet status, all are integers except name.

View File

@ -1154,7 +1154,10 @@ int map_foreachinpath(int (*func)(struct block_list*,va_list),int m,int x0,int y
k = (xi-x0)*(x1-x0) + (yi-y0)*(y1-y0);
if (k < 0 || k > len_limit) //Since more skills use this, check for ending point as well.
continue;
if (k > magnitude2 && !path_search_long(NULL,m,x0,y0,xi,yi))
continue; //Targets beyond the initial ending point need the wall check.
//All these shifts are to increase the precision of the intersection point and distance considering how it's
//int math.
k = (k<<4)/magnitude2; //k will be between 1~16 instead of 0~1
@ -1186,7 +1189,10 @@ int map_foreachinpath(int (*func)(struct block_list*,va_list),int m,int x0,int y
k = (xi-x0)*(x1-x0) + (yi-y0)*(y1-y0);
if (k < 0 || k > len_limit)
continue;
if (k > magnitude2 && !path_search_long(NULL,m,x0,y0,xi,yi))
continue; //Targets beyond the initial ending point need the wall check.
k = (k<<4)/magnitude2; //k will be between 1~16 instead of 0~1
xi<<=4;
yi<<=4;

View File

@ -1193,12 +1193,13 @@ enum _sp {
SP_SKILL_ATK, SP_UNSTRIPABLE, SP_FREE, // 2018-2020
SP_SP_GAIN_VALUE, SP_HP_REGEN_RATE, SP_HP_LOSS_RATE, SP_ADDRACE2, SP_HP_GAIN_VALUE, // 2021-2025
SP_SUBSIZE, SP_HP_DRAIN_VALUE_RACE, SP_ADD_ITEM_HEAL_RATE, SP_SP_DRAIN_VALUE_RACE, SP_EXP_ADDRACE, // 2026-2030
SP_SP_GAIN_RACE, SP_SUBRACE2, SP_ADDEFF_WHENHIT_SHORT, // 2031-2033
SP_SP_GAIN_RACE, SP_SUBRACE2, SP_FREE2, // 2031-2033
SP_UNSTRIPABLE_WEAPON,SP_UNSTRIPABLE_ARMOR,SP_UNSTRIPABLE_HELM,SP_UNSTRIPABLE_SHIELD, // 2034-2037
SP_INTRAVISION, SP_ADD_MONSTER_DROP_ITEMGROUP, SP_SP_LOSS_RATE, // 2038-2040
SP_ADD_SKILL_BLOW, SP_SP_VANISH_RATE //2041
//Before adding new bonuses, reuse the currently free slots:
//2020 (SP_FREE) (previously SP_ADD_DAMAGE_BY_CLASS)
//2033 (SP_FREE2) (previously SP_ADDEFF_WHENHIT_SHORT)
};
enum _look {

View File

@ -2201,14 +2201,6 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
if(sd->state.lr_flag != 2)
pc_bonus_addeff(sd->addeff2, ARRAYLENGTH(sd->addeff2), type2, val, 0, 0);
break;
case SP_ADDEFF_WHENHIT_SHORT:
if (type2 > SC_MAX) {
ShowWarning("pc_bonus2 (Add Effect when hit short): %d is not supported.\n", type2);
break;
}
if(sd->state.lr_flag != 2)
pc_bonus_addeff(sd->addeff2, ARRAYLENGTH(sd->addeff2), type2, val, 0, ATF_SHORT);
break;
case SP_SKILL_ATK:
if(sd->state.lr_flag == 2)
break;
@ -2387,15 +2379,21 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
break;
case SP_AUTOSPELL:
if(sd->state.lr_flag != 2)
{
int target = skill_get_inf(type2); //Support or Self (non-auto-target) skills should pick self.
target = target&INF_SUPPORT_SKILL || (target&INF_SELF_SKILL && !(skill_get_inf2(type2)&INF2_NO_TARGET_SELF));
pc_bonus_autospell(sd->autospell, ARRAYLENGTH(sd->autospell),
skill_get_inf(type2)&(INF_SELF_SKILL|INF_SUPPORT_SKILL)?-type2:type2,
type3, val, 0, current_equip_card_id);
target?-type2:type2, type3, val, 0, current_equip_card_id);
}
break;
case SP_AUTOSPELL_WHENHIT:
if(sd->state.lr_flag != 2)
{
int target = skill_get_inf(type2); //Support or Self (non-auto-target) skills should pick self.
target = target&INF_SUPPORT_SKILL || (target&INF_SELF_SKILL && !(skill_get_inf2(type2)&INF2_NO_TARGET_SELF));
pc_bonus_autospell(sd->autospell2, ARRAYLENGTH(sd->autospell2),
skill_get_inf(type2)&(INF_SELF_SKILL|INF_SUPPORT_SKILL)?-type2:type2,
type3, val, 0, current_equip_card_id);
target?-type2:type2, type3, val, 0, current_equip_card_id);
}
break;
case SP_SP_DRAIN_RATE:
if(!sd->state.lr_flag) {

View File

@ -11062,27 +11062,68 @@ BUILDIN_FUNC(recovery)
BUILDIN_FUNC(getpetinfo)
{
TBL_PC *sd=script_rid2sd(st);
struct pet_data *pd;
TBL_PET *pd;
int type=script_getnum(st,2);
if(sd && sd->status.pet_id && sd->pd){
pd = sd->pd;
switch(type){
case 0: script_pushint(st,sd->status.pet_id); break;
case 1: script_pushint(st,pd->pet.class_); break;
case 2: script_pushstr(st,aStrdup(pd->pet.name)); break;
case 3: script_pushint(st,pd->pet.intimate); break;
case 4: script_pushint(st,pd->pet.hungry); break;
case 5: script_pushint(st,pd->pet.rename_flag); break;
default:
script_pushint(st,0);
break;
}
}else{
script_pushint(st,0);
if(!sd || !sd->pd) {
if (type == 2)
script_pushconststr(st,"null");
else
script_pushint(st,0);
return 0;
}
pd = sd->pd;
switch(type){
case 0: script_pushint(st,pd->pet.pet_id); break;
case 1: script_pushint(st,pd->pet.class_); break;
case 2: script_pushstr(st,aStrdup(pd->pet.name)); break;
case 3: script_pushint(st,pd->pet.intimate); break;
case 4: script_pushint(st,pd->pet.hungry); break;
case 5: script_pushint(st,pd->pet.rename_flag); break;
default:
script_pushint(st,0);
break;
}
return 0;
}
/*==========================================
* Get your homunculus info: gethominfo(n)
* n -> 0:hom_id 1:class 2:name
* 3:friendly 4:hungry, 5: rename flag.
* 6: level
*------------------------------------------*/
BUILDIN_FUNC(gethominfo)
{
TBL_PC *sd=script_rid2sd(st);
TBL_HOM *hd;
int type=script_getnum(st,2);
hd = sd?sd->hd:NULL;
if(!merc_is_hom_active(hd))
{
if (type == 2)
script_pushconststr(st,"null");
else
script_pushint(st,0);
return 0;
}
switch(type){
case 0: script_pushint(st,hd->homunculus.hom_id); break;
case 1: script_pushint(st,hd->homunculus.class_); break;
case 2: script_pushstr(st,aStrdup(hd->homunculus.name)); break;
case 3: script_pushint(st,hd->homunculus.intimacy); break;
case 4: script_pushint(st,hd->homunculus.hunger); break;
case 5: script_pushint(st,hd->homunculus.rename_flag); break;
case 6: script_pushint(st,hd->homunculus.level); break;
default:
script_pushint(st,0);
break;
}
return 0;
}
/*==========================================
* Shows wether your inventory(and equips) contain
selected card or not.

View File

@ -709,7 +709,7 @@ int skill_get_ammotype( int id ){ skill_get (skill_db[id].ammo, id, 1); }
int skill_get_ammo_qty( int id, int lv ){ skill_get (skill_db[id].ammo_qty[lv-1], id, lv); }
int skill_get_inf2( int id ){ skill_get (skill_db[id].inf2, id, 1); }
int skill_get_castcancel( int id ){ skill_get (skill_db[id].castcancel, id, 1); }
int skill_get_maxcount( int id ){ skill_get (skill_db[id].maxcount, id, 1); }
int skill_get_maxcount( int id ,int lv ){ skill_get (skill_db[id].maxcount[lv-1], id, lv); }
int skill_get_blewcount( int id ,int lv ){ skill_get (skill_db[id].blewcount[lv-1], id, lv); }
int skill_get_mhp( int id ,int lv ){ skill_get (skill_db[id].mhp[lv-1], id, lv); }
int skill_get_castnodex( int id ,int lv ){ skill_get (skill_db[id].castnodex[lv-1], id, lv); }
@ -2920,7 +2920,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
//line of sight between caster and target.
skill_area_temp[1] = bl->id;
map_foreachinpath (skill_attack_area,src->m,src->x,src->y,bl->x,bl->y,
skill_get_splash(skillid, skilllv),skill_get_maxcount(skillid), BL_CHAR,
skill_get_splash(skillid, skilllv),skill_get_maxcount(skillid,skilllv), BL_CHAR,
skill_get_type(skillid),src,src,skillid,skilllv,tick,flag,BCT_ENEMY);
break;
@ -2931,7 +2931,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
case NPC_THUNDERBREATH:
skill_area_temp[1] = bl->id;
map_foreachinpath(skill_attack_area,src->m,src->x,src->y,bl->x,bl->y,
skill_get_splash(skillid, skilllv),skill_get_maxcount(skillid), BL_CHAR,
skill_get_splash(skillid, skilllv),skill_get_maxcount(skillid,skilllv), BL_CHAR,
skill_get_type(skillid),src,src,skillid,skilllv,tick,flag,BCT_ENEMY);
break;
@ -5974,7 +5974,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
break;
if(battle_config.land_skill_limit && src->type&battle_config.land_skill_limit &&
(maxcount = skill_get_maxcount(ud->skillid)) > 0
(maxcount = skill_get_maxcount(ud->skillid, ud->skilllv)) > 0
) {
int i;
for(i=0;i<MAX_SKILLUNITGROUP && ud->skillunit[i] && maxcount;i++) {
@ -6492,7 +6492,7 @@ int skill_castend_map (struct map_session_data *sd, int skill_num, const char *m
p[2] = &sd->status.memo_point[1];
p[3] = &sd->status.memo_point[2];
if((maxcount = skill_get_maxcount(skill_num)) > 0) {
if((maxcount = skill_get_maxcount(skill_num, sd->menuskill_val)) > 0) {
for(i=0;i<MAX_SKILLUNITGROUP && sd->ud.skillunit[i] && maxcount;i++) {
if(sd->ud.skillunit[i]->skill_id == skill_num)
maxcount--;
@ -8388,7 +8388,7 @@ int skill_check_condition (struct map_session_data *sd, int skill, int lv, int t
int c=0;
int summons[5] = { 1589, 1579, 1575, 1555, 1590 };
//int summons[5] = { 1020, 1068, 1118, 1500, 1368 };
int maxcount = (skill==AM_CANNIBALIZE)? 6-lv : skill_get_maxcount(skill);
int maxcount = (skill==AM_CANNIBALIZE)? 6-lv : skill_get_maxcount(skill,lv);
int mob_class = (skill==AM_CANNIBALIZE)? summons[lv-1] :1142;
if(battle_config.land_skill_limit && maxcount>0 && (battle_config.land_skill_limit&BL_PC)) {
i = map_foreachinmap(skill_check_condition_mob_master_sub ,sd->bl.m, BL_MOB, sd->bl.id, mob_class, skill, &c);
@ -11355,7 +11355,7 @@ int skill_readdb (void)
skill_db[i].castcancel=0;
skill_db[i].cast_def_rate=atoi(split[10]);
skill_db[i].inf2=(int)strtol(split[11], NULL, 0);
skill_db[i].maxcount=atoi(split[12]);
skill_split_atoi(split[12], skill_db[i].maxcount);
if(strcmpi(split[13],"weapon") == 0)
skill_db[i].skill_type=BF_WEAPON;
else if(strcmpi(split[13],"magic") == 0)

View File

@ -66,7 +66,7 @@ struct skill_db {
int cast[MAX_SKILL_LEVEL],walkdelay[MAX_SKILL_LEVEL],delay[MAX_SKILL_LEVEL];
int upkeep_time[MAX_SKILL_LEVEL],upkeep_time2[MAX_SKILL_LEVEL];
int castcancel,cast_def_rate;
int inf2,maxcount,skill_type;
int inf2,maxcount[MAX_SKILL_LEVEL],skill_type;
int blewcount[MAX_SKILL_LEVEL];
int hp[MAX_SKILL_LEVEL],sp[MAX_SKILL_LEVEL],mhp[MAX_SKILL_LEVEL],hp_rate[MAX_SKILL_LEVEL],sp_rate[MAX_SKILL_LEVEL],zeny[MAX_SKILL_LEVEL];
int weapon,ammo,ammo_qty[MAX_SKILL_LEVEL],state,spiritball[MAX_SKILL_LEVEL];
@ -179,7 +179,7 @@ int skill_get_nocast( int id );
int skill_get_unit_id(int id,int flag);
int skill_get_inf2( int id );
int skill_get_castcancel( int id );
int skill_get_maxcount( int id );
int skill_get_maxcount( int id ,int lv );
int skill_get_blewcount( int id ,int lv );
int skill_get_unit_flag( int id );
int skill_get_unit_target( int id );