Forráskód Böngészése

- Additional damage bonuses (True Sight, EDP, Assassin Link, Crusader Link, Card skill damage bonuses) are now applied independently of each other, which lets them stack.
- Some minor cleanings on the code vecinity.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9492 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 18 éve
szülő
commit
6a95b7a245
2 módosított fájl, 33 hozzáadás és 26 törlés
  1. 3 0
      Changelog-Trunk.txt
  2. 30 26
      src/map/battle.c

+ 3 - 0
Changelog-Trunk.txt

@@ -4,6 +4,9 @@ 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.
 
 2006/12/13
+	* Additional damage bonuses (True Sight, EDP, Assassin Link, Crusader Link,
+	  Card skill damage bonuses) are now applied independently of each other,
+	  which lets them stack. [Skotlex]
 	* Modified flush_fifo so the code do what is written in the comment [Toms]
 	* Modified flush_fifo so you can decide whether to block the current thread
 	  or not until the data is sent. The server-tick reply no longer blocks the

+ 30 - 26
src/map/battle.c

@@ -1633,44 +1633,48 @@ static struct Damage battle_calc_weapon_attack(
 		}
 		//Div fix.
 		damage_div_fix(wd.damage, wd.div_);
-		//Here comes a second pass for skills that stack to the previously defined % damage. [Skotlex]
-		skillratio = 100;
-		//Skill damage modifiers that affect linearly stacked damage.
-		if (sc && skill_num != PA_SACRIFICE) {
+
+		//The following are applied on top of current damage and are stackable.
+		if (sc) {
 			if(sc->data[SC_TRUESIGHT].timer != -1)
-				skillratio += 2*sc->data[SC_TRUESIGHT].val1;
-			// It is still not quite decided whether it works on bosses or not...
-			if(sc->data[SC_EDP].timer != -1 /*&& !(t_mode&MD_BOSS)*/ && skill_num != ASC_BREAKER && skill_num != ASC_METEORASSAULT)
-				skillratio += sc->data[SC_EDP].val3;
+				ATK_ADDRATE(2*sc->data[SC_TRUESIGHT].val1);
+
+			if(sc->data[SC_EDP].timer != -1 &&
+			  	skill_num != ASC_BREAKER &&
+				skill_num != ASC_METEORASSAULT)
+				ATK_ADDRATE(sc->data[SC_EDP].val3);
 		}
+
 		switch (skill_num) {
 			case AS_SONICBLOW:
-				if (sc && sc->data[SC_SPIRIT].timer != -1 && sc->data[SC_SPIRIT].val2 == SL_ASSASIN)
-					skillratio += (map_flag_gvg(src->m))?25:100; //+25% dmg on woe/+100% dmg on nonwoe
+				if (sc && sc->data[SC_SPIRIT].timer != -1 &&
+					sc->data[SC_SPIRIT].val2 == SL_ASSASIN)
+					ATK_ADDRATE(map_flag_gvg(src->m)?25:100); //+25% dmg on woe/+100% dmg on nonwoe
+
 				if(sd && pc_checkskill(sd,AS_SONICACCEL)>0)
-					skillratio += 10;
+					ATK_ADDRATE(10);
 			break;
 			case CR_SHIELDBOOMERANG:
-				if (sc && sc->data[SC_SPIRIT].timer != -1 && sc->data[SC_SPIRIT].val2 == SL_CRUSADER)
-					skillratio += 100;
+				if(sc && sc->data[SC_SPIRIT].timer != -1 &&
+					sc->data[SC_SPIRIT].val2 == SL_CRUSADER)
+					ATK_ADDRATE(100);
 				break;
 		}
-		if (sd && sd->skillatk[0].id != 0)
-		{
-			for (i = 0; i < MAX_PC_BONUS && sd->skillatk[i].id != 0 && sd->skillatk[i].id != skill_num; i++);
-			if (i < MAX_PC_BONUS && sd->skillatk[i].id == skill_num)
-				//May seem wrong as it also applies on top of other modifiers, but adding, say, 10%
-				//to 800% dmg -> 810% would make the bonus a little lame. [Skotlex]
-				skillratio += sd->skillatk[i].val;
-		}
-		if (skillratio != 100)
-			ATK_RATE(skillratio);
 		
 		if(sd)
 		{
-			if (skill_num != PA_SACRIFICE && skill_num != MO_INVESTIGATE
-				&& skill_num != CR_GRANDCROSS && skill_num != NPC_GRANDDARKNESS
-				&& skill_num != PA_SHIELDCHAIN
+			if (skill_num && sd->skillatk[0].id)
+			{	//Additional skill damage.
+				for (i = 0; i < MAX_PC_BONUS && sd->skillatk[i].id &&
+				  	sd->skillatk[i].id != skill_num; i++);
+
+				if (i < MAX_PC_BONUS && sd->skillatk[i].id == skill_num)
+					ATK_ADDRATE(sd->skillatk[i].val);
+			}
+
+			if(skill_num != PA_SACRIFICE && skill_num != MO_INVESTIGATE &&
+				skill_num != CR_GRANDCROSS && skill_num != NPC_GRANDDARKNESS &&
+				skill_num != PA_SHIELDCHAIN
 			  	&& !flag.cri)
 			{	//Elemental/Racial adjustments
 				if(sd->right_weapon.def_ratio_atk_ele & (1<<tstatus->def_ele) ||