Browse Source

Updates Reflect Damage to official behavior - bugreport:7393
Fixes Weapon Crush to be an auto-attack skill - bugreport:7422

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

akinari1087 12 years ago
parent
commit
5fdada6013
4 changed files with 16 additions and 12 deletions
  1. 1 1
      db/re/skill_db.txt
  2. 7 3
      src/map/battle.c
  3. 1 1
      src/map/skill.c
  4. 7 7
      src/map/status.c

+ 1 - 1
db/re/skill_db.txt

@@ -760,7 +760,7 @@
 2027,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,		GC_POISONINGWEAPON,Poisoning Weapon
 2028,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,		GC_WEAPONBLOCKING,Weapon Blocking
 2029,-2,6,4,-1,0x2,1,5,1,no,0,0,0,weapon,3,	GC_COUNTERSLASH,Counter Slash
-2030,-2,6,4,-1,0x1,0,5,1,no,0,0x200,0,weapon,0,	GC_WEAPONCRUSH,Weapon Crush //CHECK SHould this and the above skill have INF2 0x200?
+2030,-2,6,4,-1,0,0,5,1,no,0,0x200,0,weapon,0,	GC_WEAPONCRUSH,Weapon Crush
 2031,1,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,	GC_VENOMPRESSURE,Venom Pressure
 2032,5,6,2,0,0x1,0,5,1,yes,0,0,1,none,0,	GC_POISONSMOKE,Poison Smoke
 2033,0,6,4,0,0x1,0,5,1,no,0,0,0,weapon,0,	GC_CLOAKINGEXCEED,Cloaking Exceed

+ 7 - 3
src/map/battle.c

@@ -4612,9 +4612,13 @@ int battle_calc_return_damage(struct block_list* bl, struct block_list *src, int
 	sc = status_get_sc(bl);
 
 	if( sc && sc->data[SC_REFLECTDAMAGE] ) {
-		int max_damage = (int64)status_get_max_hp(bl) * status_get_lv(bl) / 100;
-		rdamage = (int64)(*dmg) * sc->data[SC_REFLECTDAMAGE]->val2 / 100;
-		if( rdamage > max_damage ) rdamage = max_damage;
+		if( rnd()%100 <= sc->data[SC_REFLECTDAMAGE]->val1*10 + 30 ){
+			int max_damage = (int64)status_get_max_hp(bl) * status_get_lv(bl) / 100;
+			rdamage = (int64)(*dmg) * sc->data[SC_REFLECTDAMAGE]->val2 / 100;
+			if( --(sc->data[SC_REFLECTDAMAGE]->val3) < 1)
+				status_change_end(bl,SC_REFLECTDAMAGE,INVALID_TIMER);
+			if( rdamage > max_damage ) rdamage = max_damage;
+		}
 	}else if( sc && sc->data[SC_CRESCENTELBOW] && !is_boss(src) && rnd()%100 < sc->data[SC_CRESCENTELBOW]->val2 ){
 		//ATK [{(Target HP / 100) x Skill Level} x Caster Base Level / 125] % + [Received damage x {1 + (Skill Level x 0.2)}]
 		int ratio = (int64)(status_get_hp(src) / 100) * sc->data[SC_CRESCENTELBOW]->val1 * status_get_lv(bl) / 125;

+ 1 - 1
src/map/skill.c

@@ -2450,7 +2450,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 		damage = 1;
 
 	if( damage > 0 && (( dmg.flag&BF_WEAPON && src != bl && ( src == dsrc || ( dsrc->type == BL_SKILL && ( skill_id == SG_SUN_WARM || skill_id == SG_MOON_WARM || skill_id == SG_STAR_WARM ) ) ))
-			|| (sc && sc->data[SC_REFLECTDAMAGE])) )
+			|| ((sc && sc->data[SC_REFLECTDAMAGE]) && !dmg.flag&(BF_MAGIC|BF_LONG) && !skill_get_inf2(skill_id)&INF2_TRAP)) )
 		rdamage = battle_calc_return_damage(bl,src, &damage, dmg.flag, skill_id);
 
 	if( damage && sc && sc->data[SC_GENSOU] && dmg.flag&BF_MAGIC ){

+ 7 - 7
src/map/status.c

@@ -8472,10 +8472,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			}
 			break;
 		case SC_REFLECTDAMAGE:
-			val2 = 15 + 5 * val1;
-			val3 = (val1==5)?20:(val1+4)*2; // SP consumption
-			val4 = tick/10000;
-			tick_time = 10000; // [GodLesZ] tick time
+			val2 = 15 + 5 * val1; // Reflect amount
+			val3 = val1*5 + 25; // Number of reflects
+			val4 = tick/1000; // Number of SP cycles (duration)
+			tick_time = 1000; // [GodLesZ] tick time
 			break;
 		case SC_FORCEOFVANGUARD: // This is not the official way to handle it but I think we should use it. [pakpil]
 			val2 = 20 + 12 * (val1 - 1); // Chance
@@ -10604,9 +10604,9 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
 
 	case SC_REFLECTDAMAGE:
 		if( --(sce->val4) >= 0 ) {
-			if( !status_charge(bl,0,sce->val3) )
-				break;
-			sc_timer_next(10000 + tick, status_change_timer, bl->id, data);
+			if( !status_charge(bl,0,10) )
+ 				break;
+			sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
 			return 0;
 		}
 		break;