소스 검색

- 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://svn.code.sf.net/p/rathena/svn/trunk@5141 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 19 년 전
부모
커밋
b488f26468
4개의 변경된 파일72개의 추가작업 그리고 63개의 파일을 삭제
  1. 5 0
      Changelog-Trunk.txt
  2. 57 26
      src/map/battle.c
  3. 2 0
      src/map/battle.h
  4. 8 37
      src/map/skill.c

+ 5 - 0
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]

+ 57 - 26
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);

+ 2 - 0
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

+ 8 - 37
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;
-
 /* スキルデ?タベ?ス */
 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)
-	{ //武器スキル&ダメ?ジあり&使用者と?象者が違う&src=dsrc
-		if(dmg.flag&BF_SHORT) { //近距離攻?時?※
-			if(tsd && tsd->short_weapon_damage_return > 0)
-			{ //近距離攻?跳ね返し?※
-				rdamage += damage * tsd->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(dmg.flag&BF_LONG) { //遠距離攻?時?※
-			if(tsd && tsd->long_weapon_damage_return > 0)
-			{ //遠距離攻?跳ね返し?※
-				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);
 
 //武器スキル?ここまで
 	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)