Browse Source

Updated Soul Breaker

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1214 54d463be-8e91-2dee-dedb-b68131a5f0ec
celest 20 năm trước cách đây
mục cha
commit
659b7611dc
3 tập tin đã thay đổi với 21 bổ sung19 xóa
  1. 2 1
      Changelog-SVN.txt
  2. 4 17
      src/map/battle.c
  3. 15 1
      src/map/skill.c

+ 2 - 1
Changelog-SVN.txt

@@ -1,11 +1,12 @@
 Date	Added
 
 03/08
+        * Added DracoRPG's code for Soul Breaker - the magic attack part should work
+          as it should now, thanks! ^^ [celest]
         * Reverted the reverted jA event change but this time without bugs (hopefully) [Shinomori]
         * corrected status_change_timer as far as I understand the functionality
           (better have a look at it, Celest), added a some security to prevent pending timers
         * moved two variable declarations to scope start (mob.c and skill.c)
-
         * Fixes Icewall can be directly cast on players and monsters -- also removes
           the 'unsupported layout' message [celest]
         * Added the new turbo_room and alde_tt to the maps config [celest]

+ 4 - 17
src/map/battle.c

@@ -2289,9 +2289,6 @@ static struct Damage battle_calc_pc_weapon_attack(
 					// calculate physical part of damage
 					damage = damage * skill_lv;
 					damage2 = damage2 * skill_lv;
-					// calculate magic part of damage
-					damage3 = skill_lv * status_get_int(src) * 5;
-
 					flag=(flag&~BF_RANGEMASK)|BF_LONG;
 				}
 				break;
@@ -2558,12 +2555,6 @@ static struct Damage battle_calc_pc_weapon_attack(
 //カード補正による左手ダメージ増加
 //カードによるダメージ増加処理(左手)ここまで
 
-// -- moonsoul (cardfix for magic damage portion of ASC_BREAKER)
-	if(skill_num == ASC_BREAKER) {
-		damage3 = damage3 * cardfix / 100;
-		dmg_lv = ATK_DEF; // ignores flee [celest]
-	}
-
 //カードによるダメージ減衰処理ここから
 	if(tsd){ //対象がPCの場合
 		cardfix=100;
@@ -2761,14 +2752,6 @@ static struct Damage battle_calc_pc_weapon_attack(
 			}
 		}
 
-
-// -- moonsoul (final combination of phys, mag damage for ASC_BREAKER)
-	if(skill_num == ASC_BREAKER) {
-		damage3 += rand()%500+500;
-		damage += damage3;
-//		damage2 += damage3;
-	}
-
 	wd.damage=damage;
 	wd.damage2=damage2;
 	wd.type=type;
@@ -3039,6 +3022,10 @@ struct Damage battle_calc_magic_attack(
 				matk_flag = 0; // don't consider matk and matk2
 			}
 			break;
+		case ASC_BREAKER:
+			damage = rand()%500 + 500 + skill_lv * status_get_int(bl) * 5;
+			matk_flag = 0; // don't consider matk and matk2
+			break;
 		}
 	}
 

+ 15 - 1
src/map/skill.c

@@ -1236,6 +1236,7 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds
 	struct Damage dmg;
 	struct status_change *sc_data;
 	int type,lv,damage;
+	static int tmpdmg = 0;
 
 	if(skillid > 0 && skilllv <= 0) return 0;
 
@@ -1440,6 +1441,13 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds
 	case AS_SPLASHER:
 		clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, -1, 5);
 		break;
+	case ASC_BREAKER:	// [celest]
+		if (attack_type&BF_MAGIC) {	// only display damage for the 2nd attack
+			clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage+tmpdmg, dmg.div_, skillid, skilllv, type);
+			tmpdmg = 0;	// clear the temporary damage
+		} else
+			tmpdmg = damage;	// store the temporary weapon damage
+		break;
 	case NPC_SELFDESTRUCTION:
 	case NPC_SELFDESTRUCTION2:
 		break;
@@ -2156,13 +2164,19 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
 //	case PA_SACRIFICE:	/* サクリファイス */
 //	case SN_SHARPSHOOTING:			/* シャ?プシュ?ティング */
 	case CG_ARROWVULCAN:			/* アロ?バルカン */
-	case ASC_BREAKER:				/* ソウルブレ?カ? */
+//	case ASC_BREAKER:				/* ソウルブレ?カ? */
 	case HW_MAGICCRASHER:		/* マジッククラッシャ? */
 	case ASC_METEORASSAULT:	/* メテオアサルト */
 	case ITM_TOMAHAWK:
 		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
 		break;
 
+	case ASC_BREAKER:				/* ソウルブレ?カ? */	// [DracoRPG]
+		// separate weapon and magic attacks
+		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+		skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
+		break;		
+	
 	case SN_SHARPSHOOTING:			/* シャ?プシュ?ティング */
 			map_foreachinpath (skill_attack_area,src->m,					// function, map
 					src->x,src->y,											// source xy