|
@@ -2973,31 +2973,11 @@ static struct Damage battle_calc_attack_masteries(struct Damage wd, struct block
|
|
}
|
|
}
|
|
|
|
|
|
if (sc) { // Status change considered as masteries
|
|
if (sc) { // Status change considered as masteries
|
|
- uint8 i;
|
|
|
|
-
|
|
|
|
#ifdef RENEWAL
|
|
#ifdef RENEWAL
|
|
if (sc->data[SC_NIBELUNGEN]) // With renewal, the level 4 weapon limitation has been removed
|
|
if (sc->data[SC_NIBELUNGEN]) // With renewal, the level 4 weapon limitation has been removed
|
|
ATK_ADD(wd.masteryAtk, wd.masteryAtk2, sc->data[SC_NIBELUNGEN]->val2);
|
|
ATK_ADD(wd.masteryAtk, wd.masteryAtk2, sc->data[SC_NIBELUNGEN]->val2);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- if (sc->data[SC_MIRACLE])
|
|
|
|
- i = 2; //Star anger
|
|
|
|
- else
|
|
|
|
- ARR_FIND(0, MAX_PC_FEELHATE, i, t_class == sd->hate_mob[i]);
|
|
|
|
-
|
|
|
|
- if (i < MAX_PC_FEELHATE && (skill=pc_checkskill(sd,sg_info[i].anger_id))) {
|
|
|
|
- int skillratio = sd->status.base_level + sstatus->dex + sstatus->luk;
|
|
|
|
-
|
|
|
|
- if (i == 2)
|
|
|
|
- skillratio += sstatus->str; //Star Anger
|
|
|
|
- if (skill < 4)
|
|
|
|
- skillratio /= 12 - 3 * skill;
|
|
|
|
- ATK_ADDRATE(wd.damage, wd.damage2, skillratio);
|
|
|
|
-#ifdef RENEWAL
|
|
|
|
- ATK_ADDRATE(wd.masteryAtk, wd.masteryAtk2, skillratio);
|
|
|
|
-#endif
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if(sc->data[SC_CAMOUFLAGE]) {
|
|
if(sc->data[SC_CAMOUFLAGE]) {
|
|
ATK_ADD(wd.damage, wd.damage2, 30 * min(10, sc->data[SC_CAMOUFLAGE]->val3));
|
|
ATK_ADD(wd.damage, wd.damage2, 30 * min(10, sc->data[SC_CAMOUFLAGE]->val3));
|
|
#ifdef RENEWAL
|
|
#ifdef RENEWAL
|
|
@@ -4464,6 +4444,7 @@ struct Damage battle_attack_sc_bonus(struct Damage wd, struct block_list *src, s
|
|
struct status_data *sstatus = status_get_status_data(src);
|
|
struct status_data *sstatus = status_get_status_data(src);
|
|
struct status_data *tstatus = status_get_status_data(target);
|
|
struct status_data *tstatus = status_get_status_data(target);
|
|
int inf3 = skill_get_inf3(skill_id);
|
|
int inf3 = skill_get_inf3(skill_id);
|
|
|
|
+ uint8 anger_id = 0; // SLS Anger
|
|
|
|
|
|
// Kagerou/Oboro Earth Charm effect +15% wATK
|
|
// Kagerou/Oboro Earth Charm effect +15% wATK
|
|
if(sd && sd->spiritcharm_type == CHARM_TYPE_LAND && sd->spiritcharm > 0) {
|
|
if(sd && sd->spiritcharm_type == CHARM_TYPE_LAND && sd->spiritcharm > 0) {
|
|
@@ -4625,6 +4606,9 @@ struct Damage battle_attack_sc_bonus(struct Damage wd, struct block_list *src, s
|
|
ATK_ADDRATE(wd.damage, wd.damage2, sc->data[SC_GVG_GIANT]->val3);
|
|
ATK_ADDRATE(wd.damage, wd.damage2, sc->data[SC_GVG_GIANT]->val3);
|
|
RE_ALLATK_ADDRATE(wd, sc->data[SC_GVG_GIANT]->val3);
|
|
RE_ALLATK_ADDRATE(wd, sc->data[SC_GVG_GIANT]->val3);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (sc->data[SC_MIRACLE])
|
|
|
|
+ anger_id = 2; // Always treat all monsters as star flagged monster when in miracle state
|
|
}
|
|
}
|
|
|
|
|
|
if ((wd.flag&(BF_LONG|BF_MAGIC)) == BF_LONG) {
|
|
if ((wd.flag&(BF_LONG|BF_MAGIC)) == BF_LONG) {
|
|
@@ -4637,6 +4621,23 @@ struct Damage battle_attack_sc_bonus(struct Damage wd, struct block_list *src, s
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (sd != nullptr && !anger_id)
|
|
|
|
+ ARR_FIND(0, MAX_PC_FEELHATE, anger_id, status_get_class(target) == sd->hate_mob[anger_id]);
|
|
|
|
+
|
|
|
|
+ uint16 anger_level;
|
|
|
|
+ if (sd != nullptr && anger_id < MAX_PC_FEELHATE && (anger_level = pc_checkskill(sd, sg_info[anger_id].anger_id))) {
|
|
|
|
+ int skillratio = sd->status.base_level + sstatus->dex + sstatus->luk;
|
|
|
|
+
|
|
|
|
+ if (anger_id == 2)
|
|
|
|
+ skillratio += sstatus->str; // SG_STAR_ANGER additionally has STR added in its formula.
|
|
|
|
+ if (anger_level < 4)
|
|
|
|
+ skillratio /= 12 - 3 * anger_level;
|
|
|
|
+ ATK_ADDRATE(wd.damage, wd.damage2, skillratio);
|
|
|
|
+#ifdef RENEWAL
|
|
|
|
+ RE_ALLATK_ADDRATE(wd, skillratio);
|
|
|
|
+#endif
|
|
|
|
+ }
|
|
|
|
+
|
|
return wd;
|
|
return wd;
|
|
}
|
|
}
|
|
|
|
|