Pārlūkot izejas kodu

4th Class Job Improvement Bundle
* This includes several updates in accordance to Gravity's patch for 4th classes.
* Changelog: https://ro.gnjoy.com/news/notice/View.asp?BBSMode=10001&seq=7462&curpage=1
* Additional Changelog: https://ro.gnjoy.com/news/notice/View.asp?BBSMode=10001&seq=7468&curpage=1

aleos 3 gadi atpakaļ
vecāks
revīzija
c8db7d3aa1
7 mainītis faili ar 396 papildinājumiem un 257 dzēšanām
  1. 212 157
      db/re/skill_db.yml
  2. 10 1
      db/re/status.yml
  3. 138 76
      src/map/battle.cpp
  4. 2 0
      src/map/script_constants.hpp
  5. 16 12
      src/map/skill.cpp
  6. 15 11
      src/map/status.cpp
  7. 3 0
      src/map/status.hpp

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 212 - 157
db/re/skill_db.yml


+ 10 - 1
db/re/status.yml

@@ -7764,7 +7764,8 @@ Body:
     Icon: EFST_ATTACK_STANCE
     DurationLookup: IG_ATTACK_STANCE
     CalcFlags:
-      Watk: true
+      Patk: true
+      Smatk: true
       Def: true
     Flags:
       NoRemoveOnDead: true
@@ -8109,3 +8110,11 @@ Body:
       All: true
     Flags:
       RemoveElementalOption: true
+  - Status: Rush_Quake1
+    Icon: EFST_RUSH_QUAKE1
+    DurationLookup: MT_RUSH_QUAKE
+    Flags:
+      BlEffect: true
+  - Status: Rush_Quake2
+    Icon: EFST_RUSH_QUAKE2
+    DurationLookup: MT_RUSH_QUAKE

+ 138 - 76
src/map/battle.cpp

@@ -693,8 +693,6 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
 				}
 				cardfix = cardfix * (100 + sd->indexed_bonus.magic_addsize[tstatus->size] + sd->indexed_bonus.magic_addsize[SZ_ALL]) / 100;
 				cardfix = cardfix * (100 + sd->indexed_bonus.magic_addclass[tstatus->class_] + sd->indexed_bonus.magic_addclass[CLASS_ALL]) / 100;
-				if (sd->status.weapon == W_2HSTAFF)// 2-Handed Staff Mastery
-					cardfix = cardfix * (100 + pc_checkskill(sd, AG_TWOHANDSTAFF)) / 100;
 				for (const auto &it : sd->add_mdmg) {
 					if (it.id == t_class) {
 						cardfix = cardfix * (100 + it.val) / 100;
@@ -1537,6 +1535,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
 		if (sc->data[SC_SHADOW_SCAR])// Need official adjustment for this too.
 			damage += damage * (10 * sc->data[SC_SHADOW_SCAR]->val1) / 100;
 
+		if (sc->data[SC_RUSH_QUAKE1] && (flag & BF_WEAPONMASK) == BF_WEAPON)
+			damage += damage * 50 / 100;
+
 		// Damage reductions
 		// Assumptio increases DEF on RE mode, otherwise gives a reduction on the final damage. [Igniz]
 #ifndef RENEWAL
@@ -1805,6 +1806,18 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
 				pc_addsoulball(tsd, 5 + 3 * pc_checkskill(tsd, SP_SOULENERGY));
 			}
 		}
+
+		if (sc->data[SC_RUSH_QUAKE2] && (flag & BF_WEAPONMASK) == BF_WEAPON)
+			damage += damage * (5 * sc->data[SC_RUSH_QUAKE2]->val1) / 100;
+
+		if (sc->data[SC_SHADOW_EXCEED]) {
+			switch (skill_id) {
+				case SHC_ETERNAL_SLASH:
+				case SHC_SAVAGE_IMPACT:
+					damage += damage / 4; // !TODO: What's the damage increase?
+					break;
+			}
+		}
 	} //End of caster SC_ check
 
 	//PK damage rates
@@ -2446,7 +2459,6 @@ static int battle_range_type(struct block_list *src, struct block_list *target,
 		// Renewal changes to ranged physical damage
 #endif
 		case SR_RAMPAGEBLASTER:
-		case DK_HACKANDSLASHER_ATK: // 2 cell cast range.
 			return BF_LONG;
 		case NJ_KIRIKAGE: // Cast range mimics NJ_SHADOWJUMP but damage is considered melee
 		case GC_CROSSIMPACT: // Cast range is 7 cells and player jumps to target but skill is considered melee
@@ -2463,6 +2475,17 @@ static int battle_range_type(struct block_list *src, struct block_list *target,
 			if (sd && (sd->status.weapon == W_MACE || sd->status.weapon == W_2HMACE))
 				return BF_LONG;
 		}
+		case DK_HACKANDSLASHER:
+		case DK_HACKANDSLASHER_ATK: { // Range depends on weapon type.
+			map_session_data *sd = BL_CAST(BL_PC, src);
+
+			if (sd) {
+				if (sd->status.weapon == W_2HSWORD)
+					return BF_SHORT;
+				if (sd->status.weapon == W_2HSPEAR)
+					return BF_LONG;
+			}
+		}
 	}
 
 	//Skill Range Criteria
@@ -2799,7 +2822,6 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
 #ifdef RENEWAL
 			case ASC_BREAKER:
 #endif
-			case LG_CANNONSPEAR:
 			case GC_CROSSIMPACT:
 			case SHC_SAVAGE_IMPACT:
 			case SHC_ETERNAL_SLASH:
@@ -3012,7 +3034,7 @@ static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct
 					hitrate += pc_checkskill(sd, GN_REMODELING_CART) * 4;
 				break;
 			case LG_BANISHINGPOINT:
-				hitrate += 3 * skill_lv;
+				hitrate += 5 * skill_lv;
 				break;
 			case GC_VENOMPRESSURE:
 				hitrate += 10 + 4 * skill_lv;
@@ -3611,6 +3633,8 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *
 					damagevalue = damagevalue * (90 + 10 * pc_checkskill(sd, RK_DRAGONTRAINING)) / 100;
 				if (sc && sc->data[SC_DRAGONIC_AURA])// Need official damage increase. [Rytech]
 					damagevalue += damagevalue * 50 / 100;
+				if (pc_checkskill(sd, DK_DRAGONIC_AURA)) // !TODO: Confirm
+					damagevalue += damagevalue * (sstatus->patk + sstatus->pow) / 500;
 				ATK_ADD(wd->damage, wd->damage2, damagevalue);
 #ifdef RENEWAL
 				ATK_ADD(wd->weaponAtk, wd->weaponAtk2, damagevalue);
@@ -4271,8 +4295,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 #else
 			skillratio += 30 * skill_lv;
 #endif
-			if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech]
-				skillratio += skillratio * 50 / 100;
+			if (sc && sc->data[SC_SHIELD_POWER])
+				skillratio += 50 + ((sd) ? pc_checkskill(sd, IG_SHIELD_MASTERY) * 60 : 0);
 			break;
 		case WS_CARTTERMINATION:
 			i = 10 * (16 - skill_lv);
@@ -4437,7 +4461,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 				if (sc->data[SC_CHARGINGPIERCE_COUNT] && sc->data[SC_CHARGINGPIERCE_COUNT]->val1 >= 10)
 					skillratio *= 2;
 				if (sc->data[SC_DRAGONIC_AURA])// Need official damage increase. [Rytech]
-					skillratio += skillratio * 50 / 100;
+					skillratio += 280 * skill_lv;
 			}
 			break;
 		case RK_WINDCUTTER:
@@ -4552,7 +4576,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			skillratio += 50 * skill_lv;
 			break;
 		case NC_BOOSTKNUCKLE:
-			skillratio += 200 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus?
+			skillratio += 240 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus?
 			RE_LVL_DMOD(100);
 			break;
 		case NC_PILEBUNKER:
@@ -4560,7 +4584,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			RE_LVL_DMOD(100);
 			break;
 		case NC_VULCANARM:
-			skillratio += -100 + 140 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus?
+			skillratio += -100 + 230 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus?
 			RE_LVL_DMOD(100);
 			break;
 		case NC_FLAMELAUNCHER:
@@ -4569,7 +4593,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			RE_LVL_DMOD(150);
 			break;
 		case NC_ARMSCANNON:
-			skillratio += -100 + 400 + 300 * skill_lv;
+			skillratio += -100 + 400 + 350 * skill_lv;
 			RE_LVL_DMOD(100);
 			break;
 		case NC_AXEBOOMERANG:
@@ -4594,14 +4618,14 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 		case NC_AXETORNADO:
 			skillratio += -100 + 200 + 180 * skill_lv + sstatus->vit / 6; // !TODO: What's the VIT bonus?
 			RE_LVL_DMOD(100);
-			if (sc && sc->data[SC_AXE_STOMP])// Whats the official increase? [Rytech]
-				skillratio += skillratio * 50 / 100;
+			if (sc && sc->data[SC_AXE_STOMP])
+				skillratio += 120 * skill_lv;
 			break;
 		case SC_FATALMENACE:
-			skillratio += 120 * skill_lv + sstatus->agi / 6; // !TODO: What's the AGI bonus?
+			skillratio += -100 + 120 * skill_lv + sstatus->agi / 6; // !TODO: What's the AGI bonus?
 			RE_LVL_DMOD(100);
 			if (sc && sc->data[SC_ABYSS_DAGGER])
-				skillratio += skillratio * 50 / 100;
+				skillratio += 300;
 			break;
 		case SC_TRIANGLESHOT:
 			skillratio += -100 + 230 * skill_lv + 3 * sstatus->agi;
@@ -4612,19 +4636,19 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			RE_LVL_DMOD(120);
 			break;
 		case LG_CANNONSPEAR:
-			skillratio += -100 + skill_lv * (50 + sstatus->str);
+			skillratio += -100 + 120 * skill_lv + (skill_lv * sstatus->str);
 			RE_LVL_DMOD(100);
 			if (sc && sc->data[SC_SPEAR_SCAR])// Whats the official increase? [Rytech]
 				skillratio += skillratio * 50 / 100;
 			break;
 		case LG_BANISHINGPOINT:
-			skillratio += -100 + (80 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 30 : 0);
+			skillratio += -100 + (100 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 70 : 0);
 			RE_LVL_DMOD(100);
 			if (sc && sc->data[SC_SPEAR_SCAR])// Whats the official increase? [Rytech]
 				skillratio += skillratio * 50 / 100;
 			break;
 		case LG_SHIELDPRESS:
-			skillratio += -100 + 200 * skill_lv + sstatus->str;
+			skillratio += -100 + 200 * skill_lv + sstatus->str + sstatus->vit; // !TODO: What's the STR/VIT bonus?
 			if (sd) {
 				short index = sd->equip_index[EQI_HAND_L];
 
@@ -4632,8 +4656,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 					skillratio += sd->inventory_data[index]->weight / 10;
 			}
 			RE_LVL_DMOD(100);
-			if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech]
-				skillratio += skillratio * 50 / 100;
+			if (sc && sc->data[SC_SHIELD_POWER])
+				skillratio += 100 + ((sd) ? pc_checkskill(sd, IG_SHIELD_MASTERY) * 200 : 0);
 			break;
 		case LG_PINPOINTATTACK:
 			skillratio += -100 + 100 * skill_lv + 5 * status_get_agi(src);
@@ -4652,17 +4676,18 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			break;
 		case LG_OVERBRAND:
 			if(sc && sc->data[SC_OVERBRANDREADY])
-				skillratio += -100 + 450 * skill_lv;
+				skillratio += -100 + 500 * skill_lv;
 			else
 				skillratio += -100 + 300 * skill_lv;
+			skillratio += sstatus->dex / 2 + sstatus->str / 2; // !TODO: What's the STR/DEX bonus?
 			skillratio += ((sd) ? pc_checkskill(sd, CR_SPEARQUICKEN) * 50 : 0);
 			RE_LVL_DMOD(100);
 			break;
 		case LG_EARTHDRIVE:
 			skillratio += -100 + 380 * skill_lv + ((sstatus->str + sstatus->vit) / 6); // !TODO: What's the STR/VIT bonus?
 			RE_LVL_DMOD(100);
-			if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech]
-				skillratio += skillratio * 50 / 100;
+			if (sc && sc->data[SC_SHIELD_POWER])
+				skillratio += 150 + ((sd) ? pc_checkskill(sd, IG_SHIELD_MASTERY) * 180 : 0);
 			break;
 		case LG_HESPERUSLIT:
 			if (sc && sc->data[SC_INSPIRATION])
@@ -5041,7 +5066,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 				skillratio += skillratio * sc->data[SC_LIGHTOFSTAR]->val2 / 100;
 			break;
 		case DK_SERVANTWEAPON_ATK:
-			skillratio += 50 + 50 * skill_lv + 5 * sstatus->pow;
+			skillratio += 100 + 50 * skill_lv + 5 * sstatus->pow;
 			RE_LVL_DMOD(100);
 			break;
 		case DK_SERVANT_W_PHANTOM:
@@ -5072,11 +5097,19 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 				skillratio += 450 * skill_lv;
 			RE_LVL_DMOD(100);
 			break;
-		case DK_MADNESS_CRUSHER:// How does weight affect the damage? [Rytech]
-			skillratio += -100 + 450 * skill_lv + 5 * sstatus->pow;
+		case DK_MADNESS_CRUSHER:
+			skillratio += -100 + 600 * skill_lv + 5 * sstatus->pow;
 			RE_LVL_DMOD(100);
 			if (sc && sc->data[SC_CHARGINGPIERCE_COUNT] && sc->data[SC_CHARGINGPIERCE_COUNT]->val1 >= 10)
 				skillratio *= 2;
+			if (sd && (sd->status.weapon == W_2HSWORD || sd->status.weapon == W_2HSPEAR)) {
+				short index = sd->equip_index[EQI_HAND_L];
+
+				if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON) {
+					skillratio += sd->inventory_data[index]->weight / 10; // !TODO: What's the bonus?
+					skillratio += sd->inventory_data[index]->weapon_level * 50; // !TODO: What's the bonus?
+				}
+			}
 			break;
 		case DK_STORMSLASH:
 			skillratio += -100 + 120 * skill_lv + 5 * sstatus->pow;
@@ -5095,10 +5128,10 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			RE_LVL_DMOD(100);
 			break;
 		case IQ_EXPOSION_BLASTER:
-			skillratio += -100 + 450 * skill_lv + 5 * sstatus->pow;
+			skillratio += -100 + 650 * skill_lv + 5 * sstatus->pow;
 			RE_LVL_DMOD(100);
 			if (tsc && tsc->data[SC_HOLY_OIL])
-				skillratio += skillratio * 50 / 100;
+				skillratio += 200 * skill_lv;
 			break;
 		case IQ_FIRST_BRAND:
 			skillratio += -100 + 450 * skill_lv + 5 * sstatus->pow;
@@ -5117,11 +5150,12 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			RE_LVL_DMOD(100);
 			break;
 		case IQ_THIRD_PUNISH:
-			skillratio += -100 + 550 * skill_lv + 5 * sstatus->pow;
+			skillratio += -100 + 650 * skill_lv + 5 * sstatus->pow;
 			RE_LVL_DMOD(100);
 			break;
 		case IQ_THIRD_FLAME_BOMB:
 			skillratio += -100 + 650 * skill_lv + 5 * sstatus->pow;
+			skillratio += sstatus->max_hp * 20 / 100;
 			RE_LVL_DMOD(100);
 			break;
 		case IQ_THIRD_CONSECRATION:
@@ -5145,8 +5179,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 					skillratio += sd->inventory_data[index]->weight / 20 * sd->inventory.u.items_inventory[index].refine;
 			}
 			RE_LVL_DMOD(100);
-			if ((i = pc_checkskill_imperial_guard(sd, 3)) > 0)
-				skillratio += skillratio * i / 100;
+			if ((i = pc_checkskill_imperial_guard(sd, 1)) > 0)
+				skillratio += skill_lv * i * 15;
 			break;
 		case IG_OVERSLASH:
 			skillratio += -100 + 60 * skill_lv + 5 * sstatus->pow;
@@ -5169,7 +5203,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			RE_LVL_DMOD(100);
 			break;
 		case SHC_SAVAGE_IMPACT:
-			skillratio += -100 + 350 * skill_lv + 5 * sstatus->pow;
+			skillratio += -100 + 60 * skill_lv + 5 * sstatus->pow;
 			RE_LVL_DMOD(100);
 			break;
 		case SHC_ETERNAL_SLASH:
@@ -5191,7 +5225,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			RE_LVL_DMOD(100);
 			break;
 		case MT_AXE_STOMP:
-			skillratio += -100 + 350 * skill_lv + 5 * sstatus->pow;
+			skillratio += -100 + 400 * skill_lv + 5 * sstatus->pow;
 			RE_LVL_DMOD(100);
 			break;
 		case MT_RUSH_QUAKE:
@@ -5205,18 +5239,21 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			RE_LVL_DMOD(100);
 			break;
 		case ABC_ABYSS_DAGGER:
-			skillratio += -100 + 550 * skill_lv + 5 * sstatus->pow;
+			skillratio += -100 + 350 * skill_lv + 5 * sstatus->pow;
 			RE_LVL_DMOD(100);
 			break;
 		case ABC_UNLUCKY_RUSH:
-			skillratio += -100 + 500 * skill_lv + 5 * sstatus->crt;
+			skillratio += -100 + 100 + 300 * skill_lv + 5 * sstatus->pow;
 			RE_LVL_DMOD(100);
 			break;
 		case ABC_CHAIN_REACTION_SHOT:
-		case ABC_CHAIN_REACTION_SHOT_ATK:// Same damage formula? [Rytech]
 			skillratio += -100 + 600 * skill_lv + 5 * sstatus->con;
 			RE_LVL_DMOD(100);
 			break;
+		case ABC_CHAIN_REACTION_SHOT_ATK:
+			skillratio += -100 + 950 * skill_lv + 5 * sstatus->con;
+			RE_LVL_DMOD(100);
+			break;
 		case ABC_DEFT_STAB:
 			skillratio += -100 + 360 * skill_lv + 5 * sstatus->pow;
 			RE_LVL_DMOD(100);
@@ -5226,7 +5263,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			RE_LVL_DMOD(100);
 			break;
 		case WH_HAWKRUSH:
-			skillratio += -100 + 100 * skill_lv + 5 * sstatus->con;
+			skillratio += -100 + 200 * skill_lv + 5 * sstatus->con;
 			RE_LVL_DMOD(100);
 			break;
 		case WH_HAWKBOOMERANG:// Affected by trait stats??? CON for sure but the other one unknown. Likely POW. [Rytech]
@@ -5236,7 +5273,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			RE_LVL_DMOD(100);
 			break;
 		case WH_GALESTORM:
-			skillratio += -100 + 250 * skill_lv + 5 * sstatus->con;
+			skillratio += -100 + 250 * skill_lv + 7 * sstatus->con;
 			RE_LVL_DMOD(100);
 			if (sc && sc->data[SC_CALAMITYGALE] && (tstatus->race == RC_BRUTE || tstatus->race == RC_FISH))
 					skillratio += skillratio * 50 / 100;
@@ -5272,7 +5309,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 		case BO_ACIDIFIED_ZONE_GROUND_ATK:
 		case BO_ACIDIFIED_ZONE_WIND_ATK:
 		case BO_ACIDIFIED_ZONE_FIRE_ATK:
-			skillratio += -100 + 250 * skill_lv + 5 * sstatus->pow;
+			skillratio += -100 + 400 * skill_lv + 5 * sstatus->pow;
 			RE_LVL_DMOD(100);
 			if (sc && sc->data[SC_RESEARCHREPORT]) { // Does this also affect skills like acid demo? [Rytech]
 				skillratio += skillratio * 50 / 100;
@@ -5287,23 +5324,34 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
 			}
 			break;
 		case TR_ROSEBLOSSOM:
-		case TR_ROSEBLOSSOM_ATK:// Same damage formula? [Rytech]
-			skillratio += -100 + 500 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con;
+			skillratio += -100 + 750 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con;
 			RE_LVL_DMOD(100);
 			if (sc && sc->data[SC_MYSTIC_SYMPHONY]) {
-				skillratio += skillratio * 40 / 100;
+				skillratio *= 2;
 
 				if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
 					skillratio += skillratio * 50 / 100;
 			}
 			if (tsc && tsc->data[SC_SOUNDBLEND])
-				skillratio += skillratio * 50 / 100;
+				skillratio += 250 * skill_lv;
+			break;
+		case TR_ROSEBLOSSOM_ATK:
+			skillratio += -100 + 350 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con;
+			RE_LVL_DMOD(100);
+			if (sc && sc->data[SC_MYSTIC_SYMPHONY]) {
+				skillratio *= 2;
+
+				if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
+					skillratio += skillratio * 50 / 100;
+			}
+			if (tsc && tsc->data[SC_SOUNDBLEND])
+				skillratio += 400 * skill_lv;
 			break;
 		case TR_RHYTHMSHOOTING:
 			skillratio += -100 + 120 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con;
 			RE_LVL_DMOD(100);
 			if (sc && sc->data[SC_MYSTIC_SYMPHONY]) {
-				skillratio += skillratio * 40 / 100;
+				skillratio *= 2;
 
 				if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
 					skillratio += skillratio * 50 / 100;
@@ -6219,7 +6267,11 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
 				wd.div_ = min(wd.div_ + wd.miscflag, 3); // Number of hits doesn't go above 3.
 				break;
 			case IG_OVERSLASH:
-				wd.div_ = min(wd.div_ + wd.miscflag, 5); // Number of hits doesn't appear to go above 5.
+				wd.div_ = min(wd.div_ + wd.miscflag, 7); // Number of hits doesn't appear to go above 5.
+				break;
+			case SHC_SAVAGE_IMPACT:
+				if (sc && sc->data[SC_CLOAKINGEXCEED])
+					wd.div_ = 5;
 				break;
 			case SHC_ETERNAL_SLASH:
 				if (sc && sc->data[SC_E_SLASH_COUNT])
@@ -6235,7 +6287,11 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
 				break;
 			case MT_AXE_STOMP:
 				if (sd && sd->status.weapon == W_2HAXE)
-					wd.div_ = 2;
+					wd.div_ = 3;
+				break;
+			case ABC_FRENZY_SHOT:
+				if (rnd() % 100 < 5 * skill_lv)
+					wd.div_ = 3;
 				break;
 		}
 	} else {
@@ -7172,7 +7228,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						RE_LVL_DMOD(100); // ! TODO: Confirm new formula
 						break;
 					case LG_RAYOFGENESIS:
-						skillratio += -100 + 230 * skill_lv + sstatus->int_ / 6; // !TODO: What's the INT bonus?
+						skillratio += -100 + 350 * skill_lv + sstatus->int_ / 6; // !TODO: What's the INT bonus?
 						if (sc && sc->data[SC_INSPIRATION])
 							skillratio += 70 * skill_lv;
 						RE_LVL_DMOD(100);
@@ -7372,7 +7428,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						RE_LVL_DMOD(100);
 						break;
 					case AG_MYSTERY_ILLUSION:
-						skillratio += -100 + 250 * skill_lv + 5 * sstatus->spl;
+						skillratio += -100 + 500 * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
 						break;
 					case AG_VIOLENT_QUAKE_ATK:
@@ -7447,21 +7503,22 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						RE_LVL_DMOD(100);
 						break;
 					case AG_ROCK_DOWN:
-						skillratio += -100 + 750 * skill_lv + 5 * sstatus->spl;
-						RE_LVL_DMOD(100);
-						break;
 					case AG_STORM_CANNON:
+					case AG_FROZEN_SLASH:
 						skillratio += -100 + 600 * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
+						if (sc && sc->data[SC_CLIMAX])
+							skillratio += 250 * skill_lv;
 						break;
 					case AG_CRIMSON_ARROW:
-					case AG_CRIMSON_ARROW_ATK:
 						skillratio += -100 + 300 * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
 						break;
-					case AG_FROZEN_SLASH:
-						skillratio += -100 + 750 * skill_lv + 5 * sstatus->spl;
+					case AG_CRIMSON_ARROW_ATK:
+						skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
+						if (sc && sc->data[SC_CLIMAX])
+							skillratio *= 2;
 						break;
 					case IG_JUDGEMENT_CROSS:
 						skillratio += -100 + 750 * skill_lv + 10 * sstatus->spl;
@@ -7471,17 +7528,24 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						if ((i = pc_checkskill_imperial_guard(sd, 3)) > 0)
 							skillratio += skillratio * i / 100;
 						break;
-					case IG_CROSS_RAIN:// Need official damage increase from Spear and Sword Mastery. [Rytech]
-						skillratio += -100 + 30 * skill_lv + 5 * sstatus->spl + 5 * pc_checkskill(sd, IG_SPEAR_SWORD_M);
+					case IG_CROSS_RAIN:
+						skillratio += -100 + 30 * skill_lv + 5 * sstatus->spl + (skill_lv * 5 * pc_checkskill(sd, IG_SPEAR_SWORD_M));
 						RE_LVL_DMOD(100);
 						if ((i = pc_checkskill_imperial_guard(sd, 3)) > 0)
 							skillratio += skillratio * i / 100;
 						if (sc && sc->data[SC_HOLY_S])
-							skillratio += 20 * skill_lv;
+							skillratio += 20 * skill_lv + (skill_lv * 5 * pc_checkskill(sd, IG_SPEAR_SWORD_M));
 						break;
 					case CD_ARBITRIUM:
+						skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl;
+						if (sd)
+							skillratio += 100 * pc_checkskill(sd, CD_FIDUS_ANIMUS);
+						RE_LVL_DMOD(100);
+						break;
 					case CD_ARBITRIUM_ATK:
-						skillratio += -100 + 200 * skill_lv + 5 * sstatus->spl;
+						skillratio += -100 + 550 * skill_lv + 5 * sstatus->spl;
+						if (sd)
+							skillratio += 100 * pc_checkskill(sd, CD_FIDUS_ANIMUS);
 						RE_LVL_DMOD(100);
 						break;
 					case CD_PNEUMATICUS_PROCELLA:
@@ -7508,51 +7572,53 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						break;
 					case ABC_ABYSS_SQUARE:
 						skillratio += -100 + 140 * skill_lv + 5 * sstatus->spl;
+						if (sd)
+							skillratio += pc_checkskill(sd, ABC_MAGIC_SWORD_M) * 130;
 						RE_LVL_DMOD(100);
 						break;
 					case TR_METALIC_FURY:
-						skillratio += -100 + 600 * skill_lv + 5 * sstatus->spl;
+						skillratio += -100 + 900 * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
 						break;
 					case TR_SOUNDBLEND:
 						skillratio += -100 + 120 * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
 						if (sc && sc->data[SC_MYSTIC_SYMPHONY]) {
-							skillratio += skillratio * 40 / 100;
+							skillratio *= 2;
 
 							if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
 								skillratio += skillratio * 50 / 100;
 						}
 						break;
 					case EM_DIAMOND_STORM:
-						skillratio += -100 + 700 * skill_lv + 5 * sstatus->spl;
+						skillratio += -100 + 1250 * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
 						if (sc && sc->data[SC_SUMMON_ELEMENTAL_DILUVIO])
-							skillratio += skillratio * 30 / 100;
+							skillratio += 3500 + 500 * skill_lv;
 						break;
 					case EM_LIGHTNING_LAND:
-						skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl;
+						skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
 						if (sc && sc->data[SC_SUMMON_ELEMENTAL_PROCELLA])
-							skillratio += skillratio * 30 / 100;
+							skillratio += 400 * skill_lv;
 						break;
 					case EM_VENOM_SWAMP:
-						skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl;
+						skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
 						if (sc && sc->data[SC_SUMMON_ELEMENTAL_SERPENS])
-							skillratio += skillratio * 30 / 100;
+							skillratio += 400 * skill_lv;
 						break;
 					case EM_CONFLAGRATION:
-						skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl;
+						skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
 						if (sc && sc->data[SC_SUMMON_ELEMENTAL_ARDOR])
-							skillratio += skillratio * 30 / 100;
+							skillratio += 400 * skill_lv;
 						break;
 					case EM_TERRA_DRIVE:
-						skillratio += -100 + 700 * skill_lv + 5 * sstatus->spl;
+						skillratio += -100 + 1250 * skill_lv + 5 * sstatus->spl;
 						RE_LVL_DMOD(100);
 						if (sc && sc->data[SC_SUMMON_ELEMENTAL_TERREMOTUS])
-							skillratio += skillratio * 30 / 100;
+							skillratio += 3500 + 500 * skill_lv;
 						break;
 					case ABC_FROM_THE_ABYSS_ATK:
 						skillratio += 50 + 70 * skill_lv + 5 * sstatus->spl;
@@ -8968,9 +9034,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
 		}
 
 		if( sc ){
-			// It has a success chance of triggering even tho the description says nothing about it.
-			// TODO: Need to find out what the official success chance is. [Rytech]
-			if( sc->data[SC_SERVANTWEAPON] && sd->servantball > 0 && rnd() % 100 < 20 ){
+			if( sc->data[SC_SERVANTWEAPON] && sd->servantball > 0 && rnd() % 100 < 15) {
 				uint16 skill_id = DK_SERVANTWEAPON_ATK;
 				uint16 skill_lv = sc->data[SC_SERVANTWEAPON]->val1;
 
@@ -8992,9 +9056,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
 				sd->state.autocast = 0;
 			}
 
-			// It has a success chance of triggering even tho the description says nothing about it.
-			// TODO: Need to find out what the official success chance is. [Rytech]
-			if( sc->data[SC_ABYSSFORCEWEAPON] && sd->abyssball > 0 && rnd() % 100 < 20 ){
+			if( sc->data[SC_ABYSSFORCEWEAPON] && sd->abyssball > 0 && rnd() % 100 < 15 ){
 				uint16 skill_id = ABC_FROM_THE_ABYSS_ATK;
 				uint16 skill_lv = sc->data[SC_ABYSSFORCEWEAPON]->val1;
 

+ 2 - 0
src/map/script_constants.hpp

@@ -1839,6 +1839,8 @@
 	export_constant(SC_DEEP_POISONING_OPTION);
 	export_constant(SC_POISON_SHIELD);
 	export_constant(SC_POISON_SHIELD_OPTION);
+	export_constant(SC_RUSH_QUAKE1);
+	export_constant(SC_RUSH_QUAKE2);
 
 #ifdef RENEWAL
 	export_constant(SC_EXTREMITYFIST2);

+ 16 - 12
src/map/skill.cpp

@@ -2119,6 +2119,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
 	case AG_CRYSTAL_IMPACT:// Targets hit are dealt aftershock damage.
 		skill_castend_damage_id(src, bl, AG_CRYSTAL_IMPACT_ATK, skill_lv, tick, SD_LEVEL);
 		break;
+	case AG_CRIMSON_ARROW:
+		skill_castend_damage_id(src, bl, AG_CRIMSON_ARROW_ATK, skill_lv, tick, SD_LEVEL);
+		break;
 	case IQ_OLEUM_SANCTUM:
 		sc_start(src, bl, SC_HOLY_OIL, 100, skill_lv, skill_get_time(skill_id, skill_lv));
 		break;
@@ -2183,6 +2186,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
 	case EM_TERRA_DRIVE:
 		sc_start(src, bl, SC_HANDICAPSTATE_CRYSTALLIZATION, 40 + 10 * skill_lv, skill_lv, skill_get_time2(skill_id, skill_lv));
 		break;
+	case MT_RUSH_QUAKE:
+		sc_start(src, bl, SC_RUSH_QUAKE1, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
+		break;
 	} //end switch skill_id
 
 	if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai && md->special_state.ai != AI_ABR && md->special_state.ai != AI_BIONIC)
@@ -4014,10 +4020,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 				if (skill_area_temp[1] == bl->id && rnd()%100 < 4 * skill_lv)// Need official autocast chance. [Rytech]
 					skill_addtimerskill(src, tick + dmg.amotion, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, 2);
 				break;
-			case ABC_FRENZY_SHOT:
-				if (rnd()%100 < 4 * skill_lv)// Need official autocast chance. [Rytech]
-					skill_addtimerskill(src, tick + dmg.amotion, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, 2);
-				break;
 		}
 	}
 
@@ -4603,11 +4605,8 @@ static TIMER_FUNC(skill_timerskill){
 					}
 					break;
 				case NPC_PULSESTRIKE2:
-					skill_castend_damage_id(src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
-					break;
 				case ABC_DEFT_STAB:
-				case ABC_FRENZY_SHOT:
-					skill_castend_damage_id(src, target, skl->skill_id, skl->skill_lv, tick, skl->flag);
+					skill_castend_damage_id(src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
 					break;
 				default:
 					skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
@@ -5258,8 +5257,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 				skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv), splash_target(src),
 				skill_get_type(skill_id), src, src, skill_id, skill_lv, tick, flag, BCT_ENEMY);
 		}
-		if (skill_id == AG_CRIMSON_ARROW)
-			skill_attack(skill_get_type(AG_CRIMSON_ARROW_ATK), src, src, bl, AG_CRIMSON_ARROW_ATK, skill_lv, tick, flag|SD_LEVEL|SD_ANIMATION);
 		break;
 
 	case MO_INVESTIGATE:
@@ -5480,6 +5477,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 	case AG_SOUL_VC_STRIKE:
 	case AG_CRYSTAL_IMPACT:
 	case AG_CRYSTAL_IMPACT_ATK:
+	case AG_CRIMSON_ARROW_ATK:
 	case AG_ROCK_DOWN:
 	case AG_FROZEN_SLASH:
 	case IQ_OLEUM_SANCTUM:
@@ -5539,6 +5537,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 			if (skill_id == DK_SERVANT_W_DEMOL && !(tsc && tsc->data[SC_SERVANT_SIGN] && tsc->data[SC_SERVANT_SIGN]->val1 == src->id))
 				break;
 
+			// Over Slash - Appears to deal a number of hits equal to 2 + Number of Enemys In AoE. Max of 7 hits.
+			if (skill_id == IG_OVERSLASH)
+				sflag |= skill_area_temp[0];
+
 			// Deft Stab - Make sure the flag of 2 is passed on when the skill is double casted.
 			if (skill_id == ABC_DEFT_STAB && flag&2)
 				sflag |= 2;
@@ -5612,10 +5614,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 					if (sd && pc_search_inventory(sd, skill_db.find(SU_LUNATICCARROTBEAT)->require.itemid[0]) >= 0)
 						skill_id = SU_LUNATICCARROTBEAT2;
 					break;
+				case MT_RUSH_QUAKE:
+					sc_start(src, src, SC_RUSH_QUAKE2, 100, skill_lv, skill_get_time(skill_id, skill_lv));
+					// Fallthrough
 				case DK_SERVANT_W_PHANTOM:
 				case SHC_SAVAGE_IMPACT:
 				case SHC_FATAL_SHADOW_CROW:
-				case MT_RUSH_QUAKE:
 					// Jump to the target before attacking.
 					if (skill_check_unit_movepos(5, src, bl->x, bl->y, 0, 1))
 						skill_blown(src, src, 1, (map_calc_dir(bl, src->x, src->y) + 4) % 8, BLOWN_NONE);
@@ -7768,7 +7772,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case EM_INCREASING_ACTIVITY:
 		if (bl->type == BL_PC) {
 			clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
-			status_heal(bl, 0, 0, 20 + 5 * skill_lv, 0);
+			status_heal(bl, 0, 0, 10 + 10 * skill_lv, 0);
 		} else
 			clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
 		break;

+ 15 - 11
src/map/status.cpp

@@ -2365,9 +2365,9 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
 						// Its unknown how the summoner's stats affects the ABR's stats.
 						// I decided to do something similar to elementals for now until I know.
 						// Also added hit increase from ABR-Mastery for balance reasons. [Rytech]
-						status->max_hp = (5000 + 2000 * abr_mastery) * mstatus->vit / 100;
-						status->rhw.atk = (2 * mstatus->batk + 500 + 200 * abr_mastery) * 70 / 100;
-						status->rhw.atk2 = 2 * mstatus->batk + 500 + 200 * abr_mastery;
+						status->max_hp = (5000 + 40000 * abr_mastery) * mstatus->vit / 100;
+						status->rhw.atk = (2 * mstatus->batk + 200 + 600 * abr_mastery) * 70 / 100;
+						status->rhw.atk2 = 2 * mstatus->batk + 200 + 600 * abr_mastery;
 						status->def = mstatus->def + 20 * abr_mastery;
 						status->mdef = mstatus->mdef + 4 * abr_mastery;
 						status->hit = mstatus->hit + 5 * abr_mastery / 2;
@@ -2400,10 +2400,10 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
 						// Its unknown how the summoner's stats affects the bionic's stats.
 						// I decided to do something similar to elementals for now until I know.
 						// Also added hit increase from Bionic-Mastery for balance reasons. [Rytech]
-						status->max_hp = (5000 + 2000 * bionic_mastery) * mstatus->vit / 100;
+						status->max_hp = (5000 + 40000 * bionic_mastery) * mstatus->vit / 100;
 						//status->max_sp = (50 + 20 * bionic_mastery) * mstatus->int_ / 100;// Wait what??? Bionic Mastery increases MaxSP? They have SP???
-						status->rhw.atk = (2 * mstatus->batk + 200 * bionic_mastery) * 70 / 100;
-						status->rhw.atk2 = 2 * mstatus->batk + 200 * bionic_mastery;
+						status->rhw.atk = (2 * mstatus->batk + 600 * bionic_mastery) * 70 / 100;
+						status->rhw.atk2 = 2 * mstatus->batk + 600 * bionic_mastery;
 						status->def = mstatus->def + 20 * bionic_mastery;
 						status->mdef = mstatus->mdef + 4 * bionic_mastery;
 						status->hit = mstatus->hit + 5 * bionic_mastery / 2;
@@ -2415,7 +2415,7 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
 						// costing summon. [Rytech]
 						if (ud->skill_id == BO_HELLTREE) {
 							status->max_hp += 20000;
-							status->rhw.atk += 1400; // 70% of 2000
+							status->rhw.atk += 5600; // 70% of 2000
 							status->rhw.atk2 += 2000;
 						}
 					}
@@ -3827,6 +3827,8 @@ int status_calc_pc_sub(struct map_session_data* sd, uint8 opt)
 		base_status->patk += skill * 3;
 		base_status->smatk += skill * 3;
 	}
+	if (sd->status.weapon == W_2HSTAFF && (skill = pc_checkskill(sd, AG_TWOHANDSTAFF)) > 0)
+		base_status->smatk += skill * 2;
 
 // ----- PHYSICAL RESISTANCE CALCULATION -----
 	if ((skill = pc_checkskill_imperial_guard(sd, 1)) > 0)// IG_SHIELD_MASTERY
@@ -6488,8 +6490,6 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan
 		watk += sc->data[SC_POWERFUL_FAITH]->val2;
 	if (sc->data[SC_GUARD_STANCE])
 		watk -= sc->data[SC_GUARD_STANCE]->val3;
-	if (sc->data[SC_ATTACK_STANCE])
-		watk += sc->data[SC_ATTACK_STANCE]->val3;
 
 	return (unsigned short)cap_value(watk,0,USHRT_MAX);
 }
@@ -7762,6 +7762,8 @@ static signed short status_calc_patk(struct block_list *bl, struct status_change
 		patk += sc->data[SC_ABYSS_SLAYER]->val2;
 	if (sc->data[SC_PRON_MARCH])
 		patk += sc->data[SC_PRON_MARCH]->val2;
+	if (sc->data[SC_ATTACK_STANCE])
+		patk += sc->data[SC_ATTACK_STANCE]->val3;
 
 	return (short)cap_value(patk, 0, SHRT_MAX);
 }
@@ -7786,6 +7788,8 @@ static signed short status_calc_smatk(struct block_list *bl, struct status_chang
 		smatk += sc->data[SC_JAWAII_SERENADE]->val2;
 	if (sc->data[SC_SPELL_ENCHANTING])
 		smatk += sc->data[SC_SPELL_ENCHANTING]->val2;
+	if (sc->data[SC_ATTACK_STANCE])
+		smatk += sc->data[SC_ATTACK_STANCE]->val3;
 
 	return (short)cap_value(smatk, 0, SHRT_MAX);
 }
@@ -11764,7 +11768,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			tick = INFINITE_TICK;
 			break;
 		case SC_GUARDIAN_S:
-			val2 = status->max_hp * (50 * val1) / 100;// Barrier HP
+			val2 = (status->max_hp / 2) * (50 * val1 + status_get_lv(src) + status->sta * 15) / 100;// Barrier HP
 			break;
 		case SC_REBOUND_S:
 			val2 = 10 * val1;// Reduced Damage From Devotion
@@ -11773,7 +11777,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			break;
 		case SC_ATTACK_STANCE:
 			val2 = 40 * val1;// DEF Decrease
-			val3 = 5 + 5 * val1;// ATK Increase
+			val3 = 3 * val1;// P.ATK/S.MATK Increase
 			tick = INFINITE_TICK;
 			break;
 		case SC_HOLY_S:

+ 3 - 0
src/map/status.hpp

@@ -1174,6 +1174,9 @@ enum sc_type : int16 {
 	SC_POISON_SHIELD,
 	SC_POISON_SHIELD_OPTION,
 
+	SC_RUSH_QUAKE1,
+	SC_RUSH_QUAKE2,
+
 #ifdef RENEWAL
 	SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
 #endif

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels