浏览代码

Added some renewal behaviors of skills from bugreport:5302 (all under renewal mode)
- Steel body no longer sets def and mdef at 90, instead it reduces incoming damage by 1/10.
- Storm Gust no longer possesses a hit counter; instead every hit have a chance to freeze of 20+(5 x skill_level).
- Thunder Storm skill ratio was increased from 80% to 100%
- Misc: added isOFF macro to replace REMODE == 0 compiler-level-checks.

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

shennetsind 13 年之前
父节点
当前提交
99917b3183
共有 5 个文件被更改,包括 49 次插入10 次删除
  1. 14 2
      src/map/battle.c
  2. 1 0
      src/map/config/Data/Const.h
  3. 12 1
      src/map/skill.c
  4. 17 7
      src/map/status.c
  5. 5 0
      src/map/status.h

+ 14 - 2
src/map/battle.c

@@ -544,7 +544,14 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,struct Damag
 			//Reduction: 6% + 6% every 20%
 			//Reduction: 6% + 6% every 20%
 			damage -= damage * 6 * (1+per) / 100;
 			damage -= damage * 6 * (1+per) / 100;
 		}
 		}
-
+/**
+ * In renewal steel body reduces all incoming damage by 1/10
+ **/
+#if REMODE
+		if( sc->data[SC_STEELBODY] ) {
+			damage = damage > 10 ? damage / 10 : 1;
+		}
+#endif
 		// FIXME:
 		// FIXME:
 		// So Reject Sword calculates the redirected damage before calculating WoE/BG reduction? This is weird. [Inkfish]
 		// So Reject Sword calculates the redirected damage before calculating WoE/BG reduction? This is weird. [Inkfish]
 		if((sce=sc->data[SC_REJECTSWORD]) && flag&BF_WEAPON &&
 		if((sce=sc->data[SC_REJECTSWORD]) && flag&BF_WEAPON &&
@@ -727,7 +734,7 @@ int battle_calc_gvg_damage(struct block_list *src,struct block_list *bl,int dama
 		if(class_ == MOBID_EMPERIUM && flag&BF_SKILL) {
 		if(class_ == MOBID_EMPERIUM && flag&BF_SKILL) {
 		//Skill immunity.
 		//Skill immunity.
 			switch (skill_num) {
 			switch (skill_num) {
-#if REMODE == 0
+#if isOFF(REMODE)
 			case MO_TRIPLEATTACK:
 			case MO_TRIPLEATTACK:
 #endif
 #endif
 			case HW_GRAVITATION:
 			case HW_GRAVITATION:
@@ -2862,9 +2869,14 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 					case MG_FIREWALL:
 					case MG_FIREWALL:
 						skillratio -= 50;
 						skillratio -= 50;
 						break;
 						break;
+				/**
+				 * in Renewal Thunder Storm boost is 100% (in pre-re, 80%)
+				 **/
+				#if isOFF(REMODE)
 					case MG_THUNDERSTORM:
 					case MG_THUNDERSTORM:
 						skillratio -= 20;
 						skillratio -= 20;
 						break;
 						break;
+				#endif
 					case MG_FROSTDIVER:
 					case MG_FROSTDIVER:
 						skillratio += 10*skill_lv;
 						skillratio += 10*skill_lv;
 						break;
 						break;

+ 1 - 0
src/map/config/Data/Const.h

@@ -26,6 +26,7 @@
 	#define CONST_CASTRATE_CALC (status_get_dex(bl))
 	#define CONST_CASTRATE_CALC (status_get_dex(bl))
 #endif
 #endif
 
 
+#define isOFF(def) (def == 0)
 
 
 /**
 /**
  * "Sane Checks" to save you from compiling with cool bugs 
  * "Sane Checks" to save you from compiling with cool bugs 

+ 12 - 1
src/map/skill.c

@@ -800,6 +800,12 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 		break;
 		break;
 
 
 	case WZ_STORMGUST:
 	case WZ_STORMGUST:
+	/**
+	 * Storm Gust counter was dropped in renewal
+	 **/
+	#if REMODE
+		sc_start(bl,SC_FREEZE,20+(5*skilllv),skilllv,skill_get_time2(skillid,skilllv));
+	#else
 		 //Tharis pointed out that this is normal freeze chance with a base of 300%
 		 //Tharis pointed out that this is normal freeze chance with a base of 300%
 		if(tsc->sg_counter >= 3 &&
 		if(tsc->sg_counter >= 3 &&
 			sc_start(bl,SC_FREEZE,300,skilllv,skill_get_time2(skillid,skilllv)))
 			sc_start(bl,SC_FREEZE,300,skilllv,skill_get_time2(skillid,skilllv)))
@@ -809,6 +815,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 		 **/
 		 **/
 		else if( tsc->sg_counter > 250 )
 		else if( tsc->sg_counter > 250 )
 			tsc->sg_counter = 0;
 			tsc->sg_counter = 0;
+	#endif
 		break;
 		break;
 
 
 	case WZ_METEOR:
 	case WZ_METEOR:
@@ -9564,13 +9571,17 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 						++count < SKILLUNITTIMER_INTERVAL/sg->interval && !status_isdead(bl) );
 						++count < SKILLUNITTIMER_INTERVAL/sg->interval && !status_isdead(bl) );
 				}
 				}
 				break;
 				break;
+		/**
+		 * The storm gust counter was dropped in renewal
+		 **/
+		#if isOFF(REMODE)
 				case WZ_STORMGUST: //SG counter does not reset per stormgust. IE: One hit from a SG and two hits from another will freeze you.
 				case WZ_STORMGUST: //SG counter does not reset per stormgust. IE: One hit from a SG and two hits from another will freeze you.
 					if (tsc) 
 					if (tsc) 
 						tsc->sg_counter++; //SG hit counter.
 						tsc->sg_counter++; //SG hit counter.
 					if (skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0) <= 0 && tsc)
 					if (skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0) <= 0 && tsc)
 						tsc->sg_counter=0; //Attack absorbed.
 						tsc->sg_counter=0; //Attack absorbed.
 				break;
 				break;
-
+		#endif
 				case GS_DESPERADO:
 				case GS_DESPERADO:
 					if (rnd()%100 < src->val1)
 					if (rnd()%100 < src->val1)
 						skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
 						skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);

+ 17 - 7
src/map/status.c

@@ -2635,7 +2635,7 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
 		status->def = cap_value(i, CHAR_MIN, CHAR_MAX);
 		status->def = cap_value(i, CHAR_MIN, CHAR_MAX);
 #endif
 #endif
 	}
 	}
-#if REMODE == 0
+#if isOFF(REMODE)
 	/**
 	/**
 	 * The following setting does not affect Renewal Mode
 	 * The following setting does not affect Renewal Mode
 	 **/
 	 **/
@@ -2658,7 +2658,7 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
 		status->mdef = cap_value(i, CHAR_MIN, CHAR_MAX);
 		status->mdef = cap_value(i, CHAR_MIN, CHAR_MAX);
 #endif
 #endif
 	}
 	}
-#if REMODE == 0
+#if isOFF(REMODE)
 	/**
 	/**
 	 * The following setting does not affect Renewal Mode
 	 * The following setting does not affect Renewal Mode
 	 **/
 	 **/
@@ -3387,14 +3387,14 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
 		if( bl->type&BL_PC && sd->matk_rate != 100 )
 		if( bl->type&BL_PC && sd->matk_rate != 100 )
 		{
 		{
 			//Bonuses from previous matk
 			//Bonuses from previous matk
-		#if REMODE == 0 //Only changed in non-re [RRInd]
+		#if isOFF(REMODE) //Only changed in non-re [RRInd]
 			status->matk_max = status->matk_max * sd->matk_rate/100;
 			status->matk_max = status->matk_max * sd->matk_rate/100;
 		#endif
 		#endif
 			status->matk_min = status->matk_min * sd->matk_rate/100;
 			status->matk_min = status->matk_min * sd->matk_rate/100;
 		}
 		}
 			
 			
 		status->matk_min = status_calc_matk(bl, sc, status->matk_min);
 		status->matk_min = status_calc_matk(bl, sc, status->matk_min);
-		#if REMODE == 0 //Only changed in non-re [RRInd]
+		#if isOFF(REMODE) //Only changed in non-re [RRInd]
 			status->matk_max = status_calc_matk(bl, sc, status->matk_max);
 			status->matk_max = status_calc_matk(bl, sc, status->matk_max);
 		#endif
 		#endif
 
 
@@ -4136,8 +4136,13 @@ static signed short status_calc_flee2(struct block_list *bl, struct status_chang
 		return 100;
 		return 100;
 	if(sc->data[SC_KEEPING])
 	if(sc->data[SC_KEEPING])
 		return 90;
 		return 90;
+/**
+ * In renewal it no longer provides 90 def
+ **/
+#if isOFF(REMODE)
 	if(sc->data[SC_STEELBODY])
 	if(sc->data[SC_STEELBODY])
 		return 90;
 		return 90;
+#endif
 	if(sc->data[SC_ARMORCHANGE])
 	if(sc->data[SC_ARMORCHANGE])
 		def += sc->data[SC_ARMORCHANGE]->val2;
 		def += sc->data[SC_ARMORCHANGE]->val2;
 	if(sc->data[SC_DRUMBATTLE])
 	if(sc->data[SC_DRUMBATTLE])
@@ -4252,8 +4257,13 @@ static signed short status_calc_def2(struct block_list *bl, struct status_change
 		return 0;
 		return 0;
 	if(sc->data[SC_BARRIER])
 	if(sc->data[SC_BARRIER])
 		return 100;
 		return 100;
+/**
+ * In renewal it no longer provides 90 mdef
+ **/
+#if isOFF(REMODE)
 	if(sc->data[SC_STEELBODY])
 	if(sc->data[SC_STEELBODY])
 		return 90;
 		return 90;
+#endif
 	if(sc->data[SC_ARMORCHANGE])
 	if(sc->data[SC_ARMORCHANGE])
 		mdef += sc->data[SC_ARMORCHANGE]->val3;
 		mdef += sc->data[SC_ARMORCHANGE]->val3;
 	if(sc->data[SC_STONE] && sc->opt1 == OPT1_STONE)
 	if(sc->data[SC_STONE] && sc->opt1 == OPT1_STONE)
@@ -4472,7 +4482,7 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha
 /// Note that the scale of aspd_rate is 1000 = 100%.
 /// Note that the scale of aspd_rate is 1000 = 100%.
 static short status_calc_aspd_rate(struct block_list *bl, struct status_change *sc, int aspd_rate)
 static short status_calc_aspd_rate(struct block_list *bl, struct status_change *sc, int aspd_rate)
 {
 {
-#if REMODE == 0
+#if isOFF(REMODE)
 	/**
 	/**
 	 * this variable is not used unless in non-RE
 	 * this variable is not used unless in non-RE
 	 **/
 	 **/
@@ -4546,7 +4556,7 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change *
 		else if(sc->data[SC_MADNESSCANCEL])
 		else if(sc->data[SC_MADNESSCANCEL])
 			aspd_rate -= 200;
 			aspd_rate -= 200;
 	}
 	}
-#if REMODE == 0
+#if isOFF(REMODE)
 	/**
 	/**
 	 * in RE they give a fixed boost -- we do so along SERVICE4U in status_base_amotion_pc
 	 * in RE they give a fixed boost -- we do so along SERVICE4U in status_base_amotion_pc
 	 **/
 	 **/
@@ -6205,7 +6215,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 		case SC_EXPLOSIONSPIRITS:
 		case SC_EXPLOSIONSPIRITS:
 			val2 = 75 + 25*val1; //Cri bonus
 			val2 = 75 + 25*val1; //Cri bonus
 			break;
 			break;
-#if REMODE == 0
+#if isOFF(REMODE)
 		/**
 		/**
 		 * Only in non-RE it's var is changed
 		 * Only in non-RE it's var is changed
 		 **/
 		 **/

+ 5 - 0
src/map/status.h

@@ -1446,7 +1446,12 @@ struct status_change {
 	unsigned short mp_matk_min, mp_matk_max; //Previous matk min/max for ground spells (Amplify magic power)
 	unsigned short mp_matk_min, mp_matk_max; //Previous matk min/max for ground spells (Amplify magic power)
 	//int sg_id; //ID of the previous Storm gust that hit you
 	//int sg_id; //ID of the previous Storm gust that hit you
 	short comet_x, comet_y; // Point where src casted Comet - required to calculate damage from this point
 	short comet_x, comet_y; // Point where src casted Comet - required to calculate damage from this point
+/**
+ * The Storm Gust counter was dropped in renewal
+ **/
+#if isOFF(REMODE)
 	unsigned char sg_counter; //Storm gust counter (previous hits from storm gust)
 	unsigned char sg_counter; //Storm gust counter (previous hits from storm gust)
+#endif
 	struct status_change_entry *data[SC_MAX];
 	struct status_change_entry *data[SC_MAX];
 };
 };