From 1b31cc9de6ee1eae20f7c70615db3997797e7fb1 Mon Sep 17 00:00:00 2001 From: skotlex Date: Tue, 31 Jan 2006 17:00:34 +0000 Subject: - PF_SOULBURN no longer ignores mdef. - HW_GRAVITATION should now invoke auto spells. - Added function battle_calc_return_damage to unify the return damage code. - Added autospell triggering to returned damage from normal attacks. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@5141 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 5 ++++ src/map/battle.c | 83 ++++++++++++++++++++++++++++++++++++----------------- src/map/battle.h | 2 ++ src/map/skill.c | 45 ++++++----------------------- 4 files changed, 72 insertions(+), 63 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index a38ae4d4c..8075b3a63 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -5,6 +5,11 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. EV GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS 2006/01/31 + * PF_SOULBURN no longer ignores mdef. [Skotlex] + * HW_GRAVITATION should now invoke auto spells. [Skotlex] + * Cleaned up damage return code. Reflect Shield and the like now should + also trigger autospells from normal attacks (previously it was only worked + on skill attack returned damage) [Skotlex] * Cleaned up Summon Slave mob skill to only summon number of missing mobs to complete the skill level (that is, SS level 5 will always bring the total count of slaves to 5, never above). [Skotlex] diff --git a/src/map/battle.c b/src/map/battle.c index 4bfee43f0..a00c3cbbd 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -2441,10 +2441,10 @@ struct Damage battle_calc_magic_attack( flag.imdef = 1; break; case PR_ASPERSIO: - case PF_SOULBURN: case HW_GRAVITATION: case ASC_BREAKER: flag.imdef = 1; + case PF_SOULBURN: //Does not ignores mdef flag.elefix = 0; flag.cardfix = 0; break; @@ -2932,6 +2932,46 @@ struct Damage battle_calc_attack( int attack_type, } return d; } + +int battle_calc_return_damage(struct block_list *bl, int damage, int flag) { + struct map_session_data *sd=NULL; + struct status_change *sc_data; + int rdamage = 0; + + if (bl->type == BL_PC) sd = (struct map_session_data*)bl; + sc_data = status_get_sc_data(bl); + + if(flag&BF_WEAPON) { + if (flag & BF_SHORT) { + if (sd && sd->short_weapon_damage_return) + { + rdamage += damage * sd->short_weapon_damage_return / 100; + if(rdamage < 1) rdamage = 1; + } + if (sc_data && sc_data[SC_REFLECTSHIELD].timer != -1) + { + rdamage += damage * sc_data[SC_REFLECTSHIELD].val2 / 100; + if (rdamage < 1) rdamage = 1; + } + } else if (flag & BF_LONG) { + if (sd && sd->long_weapon_damage_return) + { + rdamage += damage * sd->long_weapon_damage_return / 100; + if (rdamage < 1) rdamage = 1; + } + } + } else + // magic_damage_return by [AppleGirl] and [Valaris] + if(flag&BF_MAGIC) + { + if(sd && sd->magic_damage_return > 0 ) + { + rdamage += damage * sd->magic_damage_return / 100; + if(rdamage < 1) rdamage = 1; + } + } + return rdamage; +} /*========================================== * ’Ê?í?UŒ‚?ˆ—?‚Ü‚Æ‚ß *------------------------------------------ @@ -2941,7 +2981,7 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target, { struct map_session_data *sd = NULL, *tsd = NULL; struct status_change *sc_data, *tsc_data; - int race, ele, damage, rdamage = 0; + int race, ele, damage,rdamage=0; struct Damage wd; nullpo_retr(0, src); @@ -3005,55 +3045,46 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target, } } - //Recycled the rdamage variable rather than use a new one... [Skotlex] - if(sd && (rdamage = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0 && sd->status.weapon <= 16) // triple blow works with bows ^^ [celest] + //Recycled the damage variable rather than use a new one... [Skotlex] + if(sd && (damage = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0 && sd->status.weapon <= 16) // triple blow works with bows ^^ [celest] { - int triple_rate= 30 - rdamage; //Base Rate + int triple_rate= 30 - damage; //Base Rate if (sc_data && sc_data[SC_SKILLRATE_UP].timer!=-1 && sc_data[SC_SKILLRATE_UP].val1 == MO_TRIPLEATTACK) { triple_rate+= triple_rate*(sc_data[SC_SKILLRATE_UP].val2)/100; status_change_end(src,SC_SKILLRATE_UP,-1); } - if (rand()%100 < triple_rate) return skill_attack(BF_WEAPON,src,src,target,MO_TRIPLEATTACK,rdamage,tick,0); + if (rand()%100 < triple_rate) return skill_attack(BF_WEAPON,src,src,target,MO_TRIPLEATTACK,damage,tick,0); } else if (sc_data && sc_data[SC_SACRIFICE].timer != -1) return skill_attack(BF_WEAPON,src,src,target,PA_SACRIFICE,sc_data[SC_SACRIFICE].val1,tick,0); wd = battle_calc_weapon_attack(src,target, 0, 0,0); - - if ((damage = wd.damage + wd.damage2) > 0 && src != target) { - rdamage = 0; - if (wd.flag & BF_SHORT) { - if (tsd && tsd->short_weapon_damage_return) - rdamage += damage * tsd->short_weapon_damage_return / 100; - if (tsc_data && tsc_data[SC_REFLECTSHIELD].timer != -1) { - rdamage += damage * tsc_data[SC_REFLECTSHIELD].val2 / 100; - if (rdamage < 1) rdamage = 1; - } - } else if (wd.flag & BF_LONG) { - if (tsd && tsd->long_weapon_damage_return) - rdamage += damage * tsd->long_weapon_damage_return / 100; - } + + damage = wd.damage + wd.damage2; + if (damage > 0 && src != target) { + rdamage = battle_calc_return_damage(target, damage, wd.flag); if (rdamage > 0) clif_damage(src, src, tick, wd.amotion, wd.dmotion, rdamage, 1, 4, 0); + //Use Reflect Shield to signal this kind of skill trigger. [Skotlex] + skill_additional_effect(target,src,CR_REFLECTSHIELD, 1,BF_WEAPON,tick); } - clif_damage(src, target, tick, wd.amotion, wd.dmotion, wd.damage, wd.div_ , wd.type, wd.damage2); //“ñ“?—¬?¶Žè‚ƃJƒ^?[ƒ‹’ÇŒ‚‚̃~ƒX•\Ž¦(–³—?‚â‚è?`) if(sd && sd->status.weapon >= 16 && wd.damage2 == 0) clif_damage(src, target, tick+10, wd.amotion, wd.dmotion,0, 1, 0, 0); - if (sd && sd->splash_range > 0 && (wd.damage > 0 || wd.damage2 > 0)) + if (sd && sd->splash_range > 0 && damage > 0) skill_castend_damage_id(src, target, 0, -1, tick, 0); map_freeblock_lock(); - battle_delay_damage(tick+wd.amotion, src, target, BF_WEAPON, 0, 0, (wd.damage+wd.damage2), wd.dmg_lv, 0); + battle_delay_damage(tick+wd.amotion, src, target, BF_WEAPON, 0, 0, damage, wd.dmg_lv, 0); - if (wd.dmg_lv == ATK_DEF || wd.damage > 0 || wd.damage2 > 0) //Added counter effect [Skotlex] + if (wd.dmg_lv == ATK_DEF || damage > 0) //Added counter effect [Skotlex] skill_counter_additional_effect(src, target, 0, 0, BF_WEAPON, tick); - if (!status_isdead(target) && (wd.damage > 0 || wd.damage2 > 0)) { + if (!status_isdead(target) && damage > 0) { if (sd) { int boss = status_get_mode(target)&MD_BOSS; if ( @@ -3098,7 +3129,7 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target, } } if (sd) { - if (wd.flag & BF_WEAPON && src != target && (wd.damage > 0 || wd.damage2 > 0)) { + if (wd.flag & BF_WEAPON && src != target && damage > 0) { int hp = 0, sp = 0; if (!battle_config.left_cardfix_to_right) { // “ñ“?—¬?¶ŽèƒJ?[ƒh‚Ì‹zŽûŒnŒø‰Ê‚ð‰EŽè‚ɒljÁ‚µ‚È‚¢?ê?‡ hp += battle_calc_drain(wd.damage, sd->right_weapon.hp_drain_rate, sd->right_weapon.hp_drain_per, sd->right_weapon.hp_drain_value); diff --git a/src/map/battle.h b/src/map/battle.h index 947b59a82..56404f0c9 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -25,6 +25,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); + int battle_attr_fix(struct block_list *src, struct block_list *target, int damage,int atk_elem,int def_elem); // ƒ_ƒ[ƒWÅIŒvŽZ diff --git a/src/map/skill.c b/src/map/skill.c index 965c75fd6..e1f6d6715 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -560,8 +560,6 @@ const struct skill_name_db skill_names[] = { static const int dirx[8]={0,-1,-1,-1,0,1,1,1}; static const int diry[8]={1,1,0,-1,-1,-1,0,1}; -static int rdamage; - /* ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */ struct skill_db skill_db[MAX_SKILL_DB]; @@ -1641,12 +1639,11 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds struct Damage dmg; struct status_change *sc_data; struct map_session_data *sd=NULL, *tsd=NULL; - int type,lv,damage; + int type,lv,damage,rdamage=0; static int tmpdmg = 0; if(skillid > 0 && skilllv <= 0) return 0; - rdamage = 0; nullpo_retr(0, src); //Source is the master behind the attack (player/mob/pet) nullpo_retr(0, dsrc); //dsrc is the actual originator of the damage, can be the same as src, or a skill casted by src. nullpo_retr(0, bl); //Target to be attacked. @@ -1862,36 +1859,9 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds break; } //Switch End } - if(attack_type&BF_WEAPON && damage > 0 && src != bl && src == dsrc) - { //•ŠíƒXƒLƒ‹•ƒ_ƒ?ƒW‚ ‚è•Žg—pŽÒ‚Æ?ÛŽÒ‚ªˆá‚¤•src=dsrc - if(dmg.flag&BF_SHORT) { //‹ß‹——£U?ŽžH¦ - if(tsd && tsd->short_weapon_damage_return > 0) - { //‹ß‹——£U?’µ‚Ë•Ô‚µH¦ - rdamage += damage * tsd->short_weapon_damage_return / 100; - if(rdamage < 1) rdamage = 1; - } - if(sc_data && sc_data[SC_REFLECTSHIELD].timer != -1) { //ƒŠƒtƒŒƒNƒgƒV?ƒ‹ƒhŽž - rdamage += damage * sc_data[SC_REFLECTSHIELD].val2 / 100; //’µ‚Ë•Ô‚µŒvŽZ - if(rdamage < 1) rdamage = 1; - } - } - else if(dmg.flag&BF_LONG) { //‰“‹——£U?ŽžH¦ - if(tsd && tsd->long_weapon_damage_return > 0) - { //‰“‹——£U?’µ‚Ë•Ô‚µH¦ - rdamage += damage * tsd->long_weapon_damage_return / 100; - if(rdamage < 1) rdamage = 1; - } - } - } else - // magic_damage_return by [AppleGirl] and [Valaris] - if(attack_type&BF_MAGIC && damage > 0 && src != bl && src == dsrc) - { - if(tsd && tsd->magic_damage_return > 0 ) - { - rdamage += damage * tsd->magic_damage_return / 100; - if(rdamage < 1) rdamage = 1; - } - } + + if (damage > 0 && src != bl && src == dsrc) + rdamage = battle_calc_return_damage(bl, damage, dmg.flag); //•ŠíƒXƒLƒ‹H‚±‚±‚Ü‚Å switch(skillid){ @@ -1966,7 +1936,7 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds //Delayed damage must be dealt after the knockback (it needs to know actual position of target) if ((skillid || flag) && attack_type&BF_WEAPON && skillid != ASC_BREAKER) { // do not really deal damage for ASC_BREAKER's 1st attack - battle_delay_damage(tick+dmg.amotion,src,bl,attack_type,skillid,skilllv,damage,dmg.dmg_lv,0); + battle_delay_damage(tick+dmg.amotion,src,bl,attack_type,skillid,skilllv,damage,dmg.dmg_lv,0); } if(skillid == RG_INTIMIDATE && damage > 0 && !(status_get_mode(bl)&MD_BOSS)/* && !map_flag_gvg(src->m)*/) { @@ -2048,7 +2018,7 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds map_freeblock_unlock(); - return (dmg.damage+dmg.damage2); /* ?ƒ_ƒ?‚ð•Ô‚· */ + return damage; /* ?ƒ_ƒ?‚ð•Ô‚· */ } /*========================================== @@ -7416,7 +7386,8 @@ int skill_unit_onplace_timer(struct skill_unit *src,struct block_list *bl,unsign break; case UNT_GRAVITATION: - skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); + if (skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0)) + skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MAGIC,tick); break; } if (sg->val3 == HW_MAGICPOWER && ssc_data && ssc_data[SC_MAGICPOWER].timer < 0 && ssc_data[SC_MAGICPOWER].val1 > 0) -- cgit v1.2.3-70-g09d2