summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-07-28 13:33:51 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-07-28 13:33:51 +0000
commit71140a6d9bb8b15fdee82745b559db0ca6a0052d (patch)
tree0337ec2f6a388fdfb9862e7823f67446206629ee /src
parent16cb5fef019d99367ef818e7c1d52a8c2deb8162 (diff)
downloadhercules-71140a6d9bb8b15fdee82745b559db0ca6a0052d.tar.gz
hercules-71140a6d9bb8b15fdee82745b559db0ca6a0052d.tar.bz2
hercules-71140a6d9bb8b15fdee82745b559db0ca6a0052d.tar.xz
hercules-71140a6d9bb8b15fdee82745b559db0ca6a0052d.zip
- Some cleaning of battle_drain, Evil Druid card should work now.
- Made status_damage allow damaging of objects not on a map, this should fix pet-catching making the mob never respawn again. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@7946 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src')
-rw-r--r--src/map/battle.c18
-rw-r--r--src/map/battle.h3
-rw-r--r--src/map/skill.c6
-rw-r--r--src/map/status.c6
4 files changed, 17 insertions, 16 deletions
diff --git a/src/map/battle.c b/src/map/battle.c
index 84978c67f..23531c62b 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -2765,7 +2765,7 @@ int battle_calc_return_damage(struct block_list *bl, int *damage, int flag) {
return rdamage;
}
-void battle_drain(TBL_PC *sd, TBL_PC* tsd, int rdamage, int ldamage, int race, int boss)
+void battle_drain(TBL_PC *sd, struct block_list *tbl, int rdamage, int ldamage, int race, int boss)
{
struct weapon_data *wd;
int type, thp = 0, tsp = 0, rhp = 0, rsp = 0, hp, sp, i, *damage;
@@ -2803,17 +2803,17 @@ void battle_drain(TBL_PC *sd, TBL_PC* tsd, int rdamage, int ldamage, int race, i
tsp += sp;
}
}
+
+ if (sd->sp_vanish_rate && rand()%1000 < sd->sp_vanish_rate)
+ status_percent_damage(&sd->bl, tbl, 0, (unsigned char)sd->sp_vanish_per);
if (!thp && !tsp) return;
status_heal(&sd->bl, thp, tsp, battle_config.show_hp_sp_drain?3:1);
- if (tsd) {
- if (rhp || rsp)
- status_zap(&tsd->bl, rhp, rsp);
- if (rand()%1000 < sd->sp_vanish_rate)
- status_percent_damage(&sd->bl, &tsd->bl, 0, (unsigned char)sd->sp_vanish_per);
- }
+ if (rhp || rsp)
+ status_zap(tbl, rhp, rsp);
}
+
/*==========================================
* ’Ê?í?UŒ‚?ˆ—?‚Ü‚Æ‚ß
*------------------------------------------
@@ -2978,9 +2978,9 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
if (sd) {
if (wd.flag & BF_WEAPON && src != target && damage > 0) {
if (battle_config.left_cardfix_to_right)
- battle_drain(sd, tsd, wd.damage, wd.damage, tstatus->race, is_boss(target));
+ battle_drain(sd, target, wd.damage, wd.damage, tstatus->race, is_boss(target));
else
- battle_drain(sd, tsd, wd.damage, wd.damage2, tstatus->race, is_boss(target));
+ battle_drain(sd, target, wd.damage, wd.damage2, tstatus->race, is_boss(target));
}
}
if (rdamage > 0) //By sending attack type "none" skill_additional_effect won't be invoked. [Skotlex]
diff --git a/src/map/battle.h b/src/map/battle.h
index 641bf9927..12e4b2488 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -26,7 +26,8 @@ struct block_list;
struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
int battle_calc_return_damage(struct block_list *bl, int *damage, int flag);
-void battle_drain(struct map_session_data *sd, struct map_session_data *tsd, int rdamage, int ldamage, int race, int boss);
+
+void battle_drain(struct map_session_data *sd, struct block_list *tbl, int rdamage, int ldamage, int race, int boss);
int battle_attr_fix(struct block_list *src, struct block_list *target, int damage,int atk_elem,int def_type, int def_lv);
diff --git a/src/map/skill.c b/src/map/skill.c
index 08c8469a9..683a38e7e 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -2087,9 +2087,9 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
if(sd && dmg.flag&BF_WEAPON && src != bl && src == dsrc && damage > 0) {
if (battle_config.left_cardfix_to_right)
- battle_drain(sd, tsd, dmg.damage, dmg.damage, tstatus->race, tstatus->mode&MD_BOSS);
+ battle_drain(sd, bl, dmg.damage, dmg.damage, tstatus->race, tstatus->mode&MD_BOSS);
else
- battle_drain(sd, tsd, dmg.damage, dmg.damage2, tstatus->race, tstatus->mode&MD_BOSS);
+ battle_drain(sd, bl, dmg.damage, dmg.damage2, tstatus->race, tstatus->mode&MD_BOSS);
}
if (rdamage>0) {
@@ -3711,8 +3711,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
if (skill_break_equip(bl, EQP_WEAPON, 10000, BCT_PARTY) && sd && sd != dstsd)
clif_displaymessage(sd->fd,"You broke target's weapon");
}
- //FIXME : Why clif_skill_nodamage 2 times ?
- //clif_skill_nodamage(src,bl,skillid,skilllv,i);
break;
case PR_ASPERSIO: /* アスペルシオ */
diff --git a/src/map/status.c b/src/map/status.c
index ebb9d151e..a0483f0a9 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -566,8 +566,10 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s
if (status == &dummy_status || !status->hp)
return 0; //Invalid targets: no damage or dead
- if (!target->prev && !(flag&2))
- return 0; //Cannot damage a bl not on a map, except when "charging" hp/sp
+// Let through. battle.c/skill.c have the whole logic of when it's possible or
+// not to hurt someone (and this check breaks pet catching) [Skotlex]
+// if (!target->prev && !(flag&2))
+// return 0; //Cannot damage a bl not on a map, except when "charging" hp/sp
sc = status_get_sc(target);