|
@@ -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;
|
|
|
|