Ver Fonte

* Fixed a mistake that was causing Ruwach to only work in PvP and PvM
* Updated code for Joint Beat

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

(no author) há 20 anos atrás
pai
commit
d5b829dbfb
6 ficheiros alterados com 82 adições e 18 exclusões
  1. 4 0
      Changelog.txt
  2. 1 1
      conf-tmpl/battle_athena.conf
  3. 1 1
      db/skill_require_db.txt
  4. 21 6
      src/map/battle.c
  5. 1 1
      src/map/skill.c
  6. 54 9
      src/map/status.c

+ 4 - 0
Changelog.txt

@@ -1,5 +1,9 @@
 Date	Added
 
+02/03
+        * Fixed a mistake that was causing Ruwach to only work in PvP and PvM [celest]
+        * Added DracoRPG's code for Joint Beat effects, thanks! [celest]
+
 02/02
 	* Added checks to prevent some crashes in skill.c
 	  [Full credit to shinomori] [SVN 1022: Ajarn]

+ 1 - 1
conf-tmpl/battle_athena.conf

@@ -551,7 +551,7 @@ gvg_magic_attack_damage_rate: 50
 // Misc damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
 gvg_misc_attack_damage_rate: 60
 
-// When the empelium is broken with WoE mode on, How Long Before The Declaration Of Castle Owner
+// When the emperium is broken with WoE mode on, How Long Before The Declaration Of Castle Owner
 // and Removal of Monsters/Players from Castle. (in milliseconds)
 gvg_eliminate_time: 7000
 

+ 1 - 1
db/skill_require_db.txt

@@ -281,7 +281,7 @@
 396,0,0,1,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CG_MARIONETTE#マリオネットコントロ?ル#
 397,0,0,18:21:23:25:28,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_SPIRALPIERCE#スパイラルピア?ス#
 398,0,0,23,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_HEADCRUSH#ヘッドクラッシュ#
-399,0,0,22:24:26:28:30:32:34:36:38:40,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_JOINTBEAT#ジョイントビ?ト#
+399,0,0,12:12:14:14:16:16:18:18:20:20,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_JOINTBEAT#ジョイントビ?ト#
 400,0,0,10:25:40:55:70,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HW_NAPALMVULCAN#ナパ?ムバルカン#
 401,0,0,20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CH_SOULCOLLECT#狂?功#
 402,0,0,4:5:6:7:8:9:10:11:12:13,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PF_MINDBREAKER#マインドブレ?カ?#

+ 21 - 6
src/map/battle.c

@@ -689,8 +689,13 @@ static struct Damage battle_calc_pet_weapon_attack(
 		if(cri < 1)
 			cri = 1;
 	}
-	if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 )
-		cri <<=1;
+	if(t_sc_data) {
+		if (t_sc_data[SC_SLEEP].timer!=-1)
+			cri <<=1;
+		if(t_sc_data[SC_JOINTBEAT].timer != -1 &&
+			t_sc_data[SC_JOINTBEAT].val2 == 6) // Always take crits with Neck broken by Joint Beat [DracoRPG]
+			cri = 1000;
+	}
 
 	if(skill_num == 0 && battle_config.enemy_critical && (rand() % 1000) < cri)
 	{
@@ -1155,8 +1160,13 @@ static struct Damage battle_calc_mob_weapon_attack(
 		if(cri < 1)
 			cri = 1;
 	}
-	if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 )	// 睡眠中はクリティカルが倍に
-		cri <<=1;
+	if(t_sc_data) {
+		if (t_sc_data[SC_SLEEP].timer!=-1 )	// 睡眠中はクリティカルが倍に
+			cri <<=1;
+		if(t_sc_data[SC_JOINTBEAT].timer != -1 &&
+			t_sc_data[SC_JOINTBEAT].val2 == 6) // Always take crits with Neck broken by Joint Beat [DracoRPG]
+			cri = 1000;
+	}
 
 	if(ac_flag) cri = 1000;
 
@@ -1767,8 +1777,13 @@ static struct Damage battle_calc_pc_weapon_attack(
 				// カタールの場合、クリティカルを倍に
 			cri <<=1;
 		cri -= status_get_luk(target) * 3;
-		if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 )	// 睡眠中はクリティカルが倍に
-			cri <<=1;
+		if(t_sc_data) {
+			if (t_sc_data[SC_SLEEP].timer!=-1 )	// 睡眠中はクリティカルが倍に
+				cri <<=1;
+			if(t_sc_data[SC_JOINTBEAT].timer != -1 &&
+				t_sc_data[SC_JOINTBEAT].val2 == 6) // Always take crits with Neck broken by Joint Beat [DracoRPG]
+				cri = 1000;
+		}
 		if(ac_flag) cri = 1000;
 
 		if(skill_num == KN_AUTOCOUNTER) {

+ 1 - 1
src/map/skill.c

@@ -1238,7 +1238,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl,int s
 			break;
 	case LK_JOINTBEAT:				/* ジョイントビ?ト */
 		//?件が良く分からないので適?に
-		if( rand()%100 < (2*skilllv+10)*sc_def_vit/100 )
+		if( rand()%100 < (5*skilllv+5)*sc_def_vit/100 )
 			status_change_start(bl,SC_JOINTBEAT,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
 		break;
 	case PF_SPIDERWEB:		/* スパイダ?ウェッブ */

+ 54 - 9
src/map/status.c

@@ -1007,6 +1007,28 @@ int status_calc_pc(struct map_session_data* sd,int first)
 		if(sd->sc_data[SC_BARRIER].timer!=-1)
 			sd->mdef = 100;
 
+		if(sd->sc_data[SC_JOINTBEAT].timer!=-1) { // Random break [DracoRPG]
+			switch(sd->sc_data[SC_JOINTBEAT].val2) {
+			case 1: //Ankle break
+				sd->speed_rate += 50;
+				break;
+			case 2:	//Wrist	break
+				sd->aspd_rate += 25;
+				break;
+			case 3:	//Knee break
+				sd->speed_rate += 30;
+				sd->aspd_rate += 10;
+				break;
+			case 4:	//Shoulder break
+				sd->def2 -= sd->def2*50/100;
+				break;
+			case 5:	//Waist	break
+				sd->def2 -= sd->def2*50/100;
+				sd->base_atk -= sd->base_atk*25/100;
+				break;
+			}
+		}
+
 		if(sd->sc_data[SC_GOSPEL].timer!=-1) {
 			if (sd->sc_data[SC_GOSPEL].val4 == BCT_PARTY){
 				switch (sd->sc_data[SC_GOSPEL].val3)
@@ -2023,6 +2045,12 @@ int status_get_def(struct block_list *bl)
 						sc_data[SC_GOSPEL].val3 == 5)
 						def = 0;
 				}
+				if(sc_data[SC_JOINTBEAT].timer!=-1) {
+					if (sc_data[SC_JOINTBEAT].val2 == 4)
+						def -= def*50/100;
+					else if (sc_data[SC_JOINTBEAT].val2 == 5)
+						def -= def*25/100;
+				}
 			}
 		}
 		//詠唱中は詠唱時減算率に基づいて減算
@@ -2194,6 +2222,12 @@ int status_get_speed(struct block_list *bl)
 				sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
 				sc_data[SC_GOSPEL].val3 == 8)
 				speed = speed*125/100;
+			if(sc_data[SC_JOINTBEAT].timer!=-1) {
+				if (sc_data[SC_JOINTBEAT].val2 == 1)
+					speed = speed*150/100;
+				else if (sc_data[SC_JOINTBEAT].val2 == 3)
+					speed = speed*130/100;				
+			}
 		}
 		if(speed < 1) speed = 1;
 		return speed;
@@ -2258,6 +2292,12 @@ int status_get_adelay(struct block_list *bl)
 				sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
 				sc_data[SC_GOSPEL].val3 == 8)
 				aspd_rate = aspd_rate*125/100;
+			if(sc_data[SC_JOINTBEAT].timer!=-1) {
+				if (sc_data[SC_JOINTBEAT].val2 == 2)
+					aspd_rate = aspd_rate*125/100;
+				else if (sc_data[SC_JOINTBEAT].val2 == 3)
+					aspd_rate = aspd_rate*110/100;
+			}
 		}
 		if(aspd_rate != 100)
 			adelay = adelay*aspd_rate/100;
@@ -3295,7 +3335,7 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
 		case SC_PARRYING:		/* パリイング */
 //		case SC_ASSUMPTIO:		/*  */
 		case SC_HEADCRUSH:		/* ヘッドクラッシュ */
-		case SC_JOINTBEAT:		/* ジョイントビ?ト */
+//		case SC_JOINTBEAT:		/* ジョイントビ?ト */
 //		case SC_MARIONETTE:		/* マリオネットコントロ?ル */
 
 			//とりあえず手?き
@@ -3330,6 +3370,12 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
 			calc_flag = 1;
 			val2 = (val1 / 2); //Flee上昇率
 			break;
+		
+		case SC_JOINTBEAT: // Random break [DracoRPG]
+			calc_flag = 1;
+			val2 = rand()%6 + 1;
+			if (val2 == 6) status_change_start(bl,SC_BLEEDING,val1,0,0,0,skill_get_time2(type,val1),0);
+			break;
 
 		case SC_BERSERK:		/* バ?サ?ク */
 			if(sd){
@@ -4549,15 +4595,14 @@ int status_change_timer_sub(struct block_list *bl, va_list ap )
 		break;
 	case SC_RUWACH:	/* ルアフ */
 		if( (*status_get_option(bl))&6 ){
-			if(battle_check_target( src,bl, BCT_ENEMY ) > 0) {
-				struct status_change *sc_data = status_get_sc_data(bl);	// check whether the target is hiding/cloaking [celest]
-				if (sc_data && (sc_data[SC_HIDING].timer != -1 ||	// if the target is using a special hiding, i.e not using normal hiding/cloaking, don't bother
-					sc_data[SC_CLOAKING].timer != -1)) {
-					status_change_end( bl, SC_HIDING, -1);
-					status_change_end( bl, SC_CLOAKING, -1);
-					skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,sc_data[type].val1,tick,0);
-				}
+			struct status_change *sc_data = status_get_sc_data(bl);	// check whether the target is hiding/cloaking [celest]
+			if (sc_data && (sc_data[SC_HIDING].timer != -1 ||	// if the target is using a special hiding, i.e not using normal hiding/cloaking, don't bother
+				sc_data[SC_CLOAKING].timer != -1)) {
+				status_change_end( bl, SC_HIDING, -1);
+				status_change_end( bl, SC_CLOAKING, -1);
 			}
+			if(battle_check_target( src,bl, BCT_ENEMY ) > 0)
+				skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,sc_data[type].val1,tick,0);
 		}
 		break;
 	}