Compare commits

...

2 Commits

Author SHA1 Message Date
Joam
2f6c4d20de
Update cast time, skill delay, cooldown match to official (#6961) 2022-05-19 02:53:38 +07:00
aleos
c8db7d3aa1 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
2022-04-12 12:04:57 -04:00
7 changed files with 676 additions and 509 deletions

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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