Updated Sorcerer Insignia Skills (#2645)
* Updated Sorcerer Insignia Skills * Fixes #2630. * Added missing Elemental 20% damage bonus for level 1 Insignia. * Adjusted the recovery bonus to only apply to Elementals. * Adjusted 25% magic damage bonus calculation. * Added the missing ASPD bonus for Wind Insignia. * Insignias should not affect status immune. * Removed the BATK addition. * Miscellaneous cleanups. Thanks to @admkakaroto and @exneval!
This commit is contained in:
parent
d08bc1ce2d
commit
0f33de9b4d
@ -150,10 +150,10 @@
|
|||||||
2450,0xe0, , 3, 0, -1,enemy, 0xA010 //SO_CLOUD_KILL
|
2450,0xe0, , 3, 0, -1,enemy, 0xA010 //SO_CLOUD_KILL
|
||||||
2452,0xe4, , 3, 0, -1,all, 0xA010 //SO_WARMER
|
2452,0xe4, , 3, 0, -1,all, 0xA010 //SO_WARMER
|
||||||
2453,0xeb, , 0, 1:1:2:2:3,500,enemy,0x8010 //SO_VACUUM_EXTREME
|
2453,0xeb, , 0, 1:1:2:2:3,500,enemy,0x8010 //SO_VACUUM_EXTREME
|
||||||
2465,0xf1, , 0, 1,1000,all, 0x010 //SO_FIRE_INSIGNIA
|
2465,0xf1, , 1, 0, -1,all, 0x2010 //SO_FIRE_INSIGNIA
|
||||||
2466,0xf2, , 0, 1,1000,all, 0x010 //SO_WATER_INSIGNIA
|
2466,0xf2, , 1, 0, -1,all, 0x2010 //SO_WATER_INSIGNIA
|
||||||
2467,0xf3, , 0, 1,1000,all, 0x010 //SO_WIND_INSIGNIA
|
2467,0xf3, , 1, 0, -1,all, 0x2010 //SO_WIND_INSIGNIA
|
||||||
2468,0xf4, , 0, 1,1000,all, 0x010 //SO_EARTH_INSIGNIA
|
2468,0xf4, , 1, 0, -1,all, 0x2010 //SO_EARTH_INSIGNIA
|
||||||
|
|
||||||
2479,0xe5, , 0, 1,1000,enemy, 0x8006 //GN_THORNS_TRAP
|
2479,0xe5, , 0, 1,1000,enemy, 0x8006 //GN_THORNS_TRAP
|
||||||
2482,0xe6,0x7f, -1, 1, 300,enemy, 0x8000 //GN_WALLOFTHORN
|
2482,0xe6,0x7f, -1, 1, 300,enemy, 0x8000 //GN_WALLOFTHORN
|
||||||
|
@ -151,10 +151,10 @@
|
|||||||
2450,0xe0, , 3, 0, -1,enemy, 0xA010 //SO_CLOUD_KILL
|
2450,0xe0, , 3, 0, -1,enemy, 0xA010 //SO_CLOUD_KILL
|
||||||
2452,0xe4, , 3, 0, -1,all, 0xA010 //SO_WARMER
|
2452,0xe4, , 3, 0, -1,all, 0xA010 //SO_WARMER
|
||||||
2453,0xeb, , 0, 1:1:2:2:3,500,enemy,0x8010 //SO_VACUUM_EXTREME
|
2453,0xeb, , 0, 1:1:2:2:3,500,enemy,0x8010 //SO_VACUUM_EXTREME
|
||||||
2465,0xf1, , 0, 1,1000,all, 0x010 //SO_FIRE_INSIGNIA
|
2465,0xf1, , 1, 0, -1,all, 0x2010 //SO_FIRE_INSIGNIA
|
||||||
2466,0xf2, , 0, 1,1000,all, 0x010 //SO_WATER_INSIGNIA
|
2466,0xf2, , 1, 0, -1,all, 0x2010 //SO_WATER_INSIGNIA
|
||||||
2467,0xf3, , 0, 1,1000,all, 0x010 //SO_WIND_INSIGNIA
|
2467,0xf3, , 1, 0, -1,all, 0x2010 //SO_WIND_INSIGNIA
|
||||||
2468,0xf4, , 0, 1,1000,all, 0x010 //SO_EARTH_INSIGNIA
|
2468,0xf4, , 1, 0, -1,all, 0x2010 //SO_EARTH_INSIGNIA
|
||||||
|
|
||||||
2479,0xe5, , 0, 1,1000,enemy, 0x8006 //GN_THORNS_TRAP
|
2479,0xe5, , 0, 1,1000,enemy, 0x8006 //GN_THORNS_TRAP
|
||||||
2482,0xe6,0x7f, -1, 1, 300,enemy, 0x8000 //GN_WALLOFTHORN
|
2482,0xe6,0x7f, -1, 1, 300,enemy, 0x8000 //GN_WALLOFTHORN
|
||||||
|
@ -1908,11 +1908,16 @@ static int battle_calc_base_weapon_attack(struct block_list *src, struct status_
|
|||||||
* Initial refactoring by Baalberith
|
* Initial refactoring by Baalberith
|
||||||
* Refined and optimized by helvetica
|
* Refined and optimized by helvetica
|
||||||
*/
|
*/
|
||||||
static int64 battle_calc_base_damage(struct status_data *status, struct weapon_atk *wa, struct status_change *sc, unsigned short t_size, struct map_session_data *sd, int flag)
|
static int64 battle_calc_base_damage(struct block_list *src, struct status_data *status, struct weapon_atk *wa, struct status_change *sc, unsigned short t_size, int flag)
|
||||||
{
|
{
|
||||||
unsigned int atkmin = 0, atkmax = 0;
|
unsigned int atkmin = 0, atkmax = 0;
|
||||||
short type = 0;
|
short type = 0;
|
||||||
int64 damage = 0;
|
int64 damage = 0;
|
||||||
|
struct map_session_data *sd = NULL;
|
||||||
|
|
||||||
|
nullpo_retr(damage, src);
|
||||||
|
|
||||||
|
sd = BL_CAST(BL_PC, src);
|
||||||
|
|
||||||
if (!sd) { //Mobs/Pets
|
if (!sd) { //Mobs/Pets
|
||||||
if(flag&4) {
|
if(flag&4) {
|
||||||
@ -1962,6 +1967,38 @@ static int64 battle_calc_base_damage(struct status_data *status, struct weapon_a
|
|||||||
// Size fix only for players
|
// Size fix only for players
|
||||||
if (!(sd->special_state.no_sizefix || (flag&8)))
|
if (!(sd->special_state.no_sizefix || (flag&8)))
|
||||||
damage = damage * (type == EQI_HAND_L ? sd->left_weapon.atkmods[t_size] : sd->right_weapon.atkmods[t_size]) / 100;
|
damage = damage * (type == EQI_HAND_L ? sd->left_weapon.atkmods[t_size] : sd->right_weapon.atkmods[t_size]) / 100;
|
||||||
|
} else if (src->type == BL_ELEM) {
|
||||||
|
struct status_change *ele_sc = status_get_sc(src);
|
||||||
|
int ele_class = status_get_class(src);
|
||||||
|
|
||||||
|
if (ele_sc) {
|
||||||
|
switch (ele_class) {
|
||||||
|
case ELEMENTALID_AGNI_S:
|
||||||
|
case ELEMENTALID_AGNI_M:
|
||||||
|
case ELEMENTALID_AGNI_L:
|
||||||
|
if (ele_sc->data[SC_FIRE_INSIGNIA] && ele_sc->data[SC_FIRE_INSIGNIA]->val1 == 1)
|
||||||
|
damage += damage * 20 / 100;
|
||||||
|
break;
|
||||||
|
case ELEMENTALID_AQUA_S:
|
||||||
|
case ELEMENTALID_AQUA_M:
|
||||||
|
case ELEMENTALID_AQUA_L:
|
||||||
|
if (ele_sc->data[SC_WATER_INSIGNIA] && ele_sc->data[SC_WATER_INSIGNIA]->val1 == 1)
|
||||||
|
damage += damage * 20 / 100;
|
||||||
|
break;
|
||||||
|
case ELEMENTALID_VENTUS_S:
|
||||||
|
case ELEMENTALID_VENTUS_M:
|
||||||
|
case ELEMENTALID_VENTUS_L:
|
||||||
|
if (ele_sc->data[SC_WIND_INSIGNIA] && ele_sc->data[SC_WIND_INSIGNIA]->val1 == 1)
|
||||||
|
damage += damage * 20 / 100;
|
||||||
|
break;
|
||||||
|
case ELEMENTALID_TERA_S:
|
||||||
|
case ELEMENTALID_TERA_M:
|
||||||
|
case ELEMENTALID_TERA_L:
|
||||||
|
if (ele_sc->data[SC_EARTH_INSIGNIA] && ele_sc->data[SC_EARTH_INSIGNIA]->val1 == 1)
|
||||||
|
damage += damage * 20 / 100;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Finally, add baseatk
|
//Finally, add baseatk
|
||||||
@ -2833,11 +2870,11 @@ static struct Damage battle_calc_element_damage(struct Damage wd, struct block_l
|
|||||||
wd.damage2 = battle_attr_fix(src, target, wd.damage2, left_element ,tstatus->def_ele, tstatus->ele_lv);
|
wd.damage2 = battle_attr_fix(src, target, wd.damage2, left_element ,tstatus->def_ele, tstatus->ele_lv);
|
||||||
if (sc && sc->data[SC_WATK_ELEMENT] && (wd.damage || wd.damage2)) {
|
if (sc && sc->data[SC_WATK_ELEMENT] && (wd.damage || wd.damage2)) {
|
||||||
// Descriptions indicate this means adding a percent of a normal attack in another element. [Skotlex]
|
// Descriptions indicate this means adding a percent of a normal attack in another element. [Skotlex]
|
||||||
int64 damage = battle_calc_base_damage(sstatus, &sstatus->rhw, sc, tstatus->size, sd, (is_skill_using_arrow(src, skill_id)?2:0)) * sc->data[SC_WATK_ELEMENT]->val2 / 100;
|
int64 damage = battle_calc_base_damage(src, sstatus, &sstatus->rhw, sc, tstatus->size, (is_skill_using_arrow(src, skill_id)?2:0)) * sc->data[SC_WATK_ELEMENT]->val2 / 100;
|
||||||
|
|
||||||
wd.damage += battle_attr_fix(src, target, damage, sc->data[SC_WATK_ELEMENT]->val1, tstatus->def_ele, tstatus->ele_lv);
|
wd.damage += battle_attr_fix(src, target, damage, sc->data[SC_WATK_ELEMENT]->val1, tstatus->def_ele, tstatus->ele_lv);
|
||||||
if (is_attack_left_handed(src, skill_id)) {
|
if (is_attack_left_handed(src, skill_id)) {
|
||||||
damage = battle_calc_base_damage(sstatus, &sstatus->lhw, sc, tstatus->size, sd, (is_skill_using_arrow(src, skill_id)?2:0)) * sc->data[SC_WATK_ELEMENT]->val2 / 100;
|
damage = battle_calc_base_damage(src, sstatus, &sstatus->lhw, sc, tstatus->size, (is_skill_using_arrow(src, skill_id)?2:0)) * sc->data[SC_WATK_ELEMENT]->val2 / 100;
|
||||||
wd.damage2 += battle_attr_fix(src, target, damage, sc->data[SC_WATK_ELEMENT]->val1, tstatus->def_ele, tstatus->ele_lv);
|
wd.damage2 += battle_attr_fix(src, target, damage, sc->data[SC_WATK_ELEMENT]->val1, tstatus->def_ele, tstatus->ele_lv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3077,7 +3114,7 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
|
|||||||
wd = battle_calc_damage_parts(wd, src, target, skill_id, skill_lv);
|
wd = battle_calc_damage_parts(wd, src, target, skill_id, skill_lv);
|
||||||
wd.masteryAtk = 0; // weapon mastery is ignored for spiral
|
wd.masteryAtk = 0; // weapon mastery is ignored for spiral
|
||||||
} else {
|
} else {
|
||||||
wd.damage = battle_calc_base_damage(sstatus, &sstatus->rhw, sc, tstatus->size, sd, 0); //Monsters have no weight and use ATK instead
|
wd.damage = battle_calc_base_damage(src, sstatus, &sstatus->rhw, sc, tstatus->size, 0); //Monsters have no weight and use ATK instead
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (tstatus->size) { //Size-fix. Is this modified by weapon perfection?
|
switch (tstatus->size) { //Size-fix. Is this modified by weapon perfection?
|
||||||
@ -3108,7 +3145,7 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
|
|||||||
|
|
||||||
ATK_ADDRATE(wd.damage, wd.damage2, 50*skill_lv); //Skill modifier applies to weight only.
|
ATK_ADDRATE(wd.damage, wd.damage2, 50*skill_lv); //Skill modifier applies to weight only.
|
||||||
} else {
|
} else {
|
||||||
wd.damage = battle_calc_base_damage(sstatus, &sstatus->rhw, sc, tstatus->size, sd, 0); //Monsters have no weight and use ATK instead
|
wd.damage = battle_calc_base_damage(src, sstatus, &sstatus->rhw, sc, tstatus->size, 0); //Monsters have no weight and use ATK instead
|
||||||
}
|
}
|
||||||
|
|
||||||
i = sstatus->str/10;
|
i = sstatus->str/10;
|
||||||
@ -3197,9 +3234,9 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
|
|||||||
i = (is_attack_critical(wd, src, target, skill_id, skill_lv, false)?1:0)|
|
i = (is_attack_critical(wd, src, target, skill_id, skill_lv, false)?1:0)|
|
||||||
(!skill_id && sc && sc->data[SC_CHANGE]?4:0);
|
(!skill_id && sc && sc->data[SC_CHANGE]?4:0);
|
||||||
|
|
||||||
wd.damage = battle_calc_base_damage(sstatus, &sstatus->rhw, sc, tstatus->size, sd, i);
|
wd.damage = battle_calc_base_damage(src, sstatus, &sstatus->rhw, sc, tstatus->size, i);
|
||||||
if (is_attack_left_handed(src, skill_id))
|
if (is_attack_left_handed(src, skill_id))
|
||||||
wd.damage2 = battle_calc_base_damage(sstatus, &sstatus->lhw, sc, tstatus->size, sd, i);
|
wd.damage2 = battle_calc_base_damage(src, sstatus, &sstatus->lhw, sc, tstatus->size, i);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
i = (is_attack_critical(wd, src, target, skill_id, skill_lv, false)?1:0)|
|
i = (is_attack_critical(wd, src, target, skill_id, skill_lv, false)?1:0)|
|
||||||
@ -3221,9 +3258,9 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wd.damage = battle_calc_base_damage(sstatus, &sstatus->rhw, sc, tstatus->size, sd, i);
|
wd.damage = battle_calc_base_damage(src, sstatus, &sstatus->rhw, sc, tstatus->size, i);
|
||||||
if (is_attack_left_handed(src, skill_id))
|
if (is_attack_left_handed(src, skill_id))
|
||||||
wd.damage2 = battle_calc_base_damage(sstatus, &sstatus->lhw, sc, tstatus->size, sd, i);
|
wd.damage2 = battle_calc_base_damage(src, sstatus, &sstatus->lhw, sc, tstatus->size, i);
|
||||||
#endif
|
#endif
|
||||||
if (nk&NK_SPLASHSPLIT){ // Divide ATK among targets
|
if (nk&NK_SPLASHSPLIT){ // Divide ATK among targets
|
||||||
if(wd.miscflag > 0) {
|
if(wd.miscflag > 0) {
|
||||||
@ -5064,7 +5101,7 @@ struct Damage battle_calc_weapon_final_atk_modifiers(struct Damage wd, struct bl
|
|||||||
int64 rdamage = 0;
|
int64 rdamage = 0;
|
||||||
int ratio = (int64)(status_get_hp(src) / 100) * tsc->data[SC_CRESCENTELBOW]->val1 * status_get_lv(target) / 125;
|
int ratio = (int64)(status_get_hp(src) / 100) * tsc->data[SC_CRESCENTELBOW]->val1 * status_get_lv(target) / 125;
|
||||||
if (ratio > 5000) ratio = 5000; // Maximum of 5000% ATK
|
if (ratio > 5000) ratio = 5000; // Maximum of 5000% ATK
|
||||||
rdamage = battle_calc_base_damage(tstatus,&tstatus->rhw,tsc,sstatus->size,tsd,0);
|
rdamage = battle_calc_base_damage(target,tstatus,&tstatus->rhw,tsc,sstatus->size,0);
|
||||||
rdamage = (int64)rdamage * ratio / 100 + wd.damage * (10 + tsc->data[SC_CRESCENTELBOW]->val1 * 20 / 10) / 10;
|
rdamage = (int64)rdamage * ratio / 100 + wd.damage * (10 + tsc->data[SC_CRESCENTELBOW]->val1 * 20 / 10) / 10;
|
||||||
skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->data[SC_CRESCENTELBOW]->val1), unit_getdir(src), BLOWN_NONE);
|
skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->data[SC_CRESCENTELBOW]->val1), unit_getdir(src), BLOWN_NONE);
|
||||||
clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage,
|
clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage,
|
||||||
@ -6177,6 +6214,14 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sc) {// Insignia's increases the damage of offensive magic by a fixed percentage depending on the element.
|
||||||
|
if ((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 3 && s_ele == ELE_FIRE) ||
|
||||||
|
(sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 3 && s_ele == ELE_WATER) ||
|
||||||
|
(sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 3 && s_ele == ELE_WIND) ||
|
||||||
|
(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 3 && s_ele == ELE_EARTH))
|
||||||
|
skillratio += 25;
|
||||||
|
}
|
||||||
|
|
||||||
MATK_RATE(skillratio);
|
MATK_RATE(skillratio);
|
||||||
|
|
||||||
//Constant/misc additions from skills
|
//Constant/misc additions from skills
|
||||||
|
@ -13344,6 +13344,10 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, un
|
|||||||
case UNT_VOLCANO:
|
case UNT_VOLCANO:
|
||||||
case UNT_DELUGE:
|
case UNT_DELUGE:
|
||||||
case UNT_VIOLENTGALE:
|
case UNT_VIOLENTGALE:
|
||||||
|
case UNT_FIRE_INSIGNIA:
|
||||||
|
case UNT_WATER_INSIGNIA:
|
||||||
|
case UNT_WIND_INSIGNIA:
|
||||||
|
case UNT_EARTH_INSIGNIA:
|
||||||
if(!sce)
|
if(!sce)
|
||||||
sc_start(ss, bl,type,100,sg->skill_lv,sg->limit);
|
sc_start(ss, bl,type,100,sg->skill_lv,sg->limit);
|
||||||
break;
|
break;
|
||||||
@ -14140,29 +14144,6 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns
|
|||||||
sc_start(ss, bl, type, 100, sg->skill_lv, sg->interval);
|
sc_start(ss, bl, type, 100, sg->skill_lv, sg->interval);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UNT_FIRE_INSIGNIA:
|
|
||||||
case UNT_WATER_INSIGNIA:
|
|
||||||
case UNT_WIND_INSIGNIA:
|
|
||||||
case UNT_EARTH_INSIGNIA:
|
|
||||||
sc_start(ss, bl, type, 100, sg->skill_lv, sg->interval);
|
|
||||||
if (!battle_check_undead(tstatus->race, tstatus->def_ele)) {
|
|
||||||
int hp = tstatus->max_hp / 100; //+1% each 5s
|
|
||||||
if ((sg->val3) % 5) { //each 5s
|
|
||||||
if (tstatus->def_ele == skill_get_ele(sg->skill_id,sg->skill_lv)){
|
|
||||||
status_heal(bl, hp, 0, 2);
|
|
||||||
} else if((sg->unit_id == UNT_FIRE_INSIGNIA && tstatus->def_ele == ELE_EARTH)
|
|
||||||
||(sg->unit_id == UNT_WATER_INSIGNIA && tstatus->def_ele == ELE_FIRE)
|
|
||||||
||(sg->unit_id == UNT_WIND_INSIGNIA && tstatus->def_ele == ELE_WATER)
|
|
||||||
||(sg->unit_id == UNT_EARTH_INSIGNIA && tstatus->def_ele == ELE_WIND)
|
|
||||||
){
|
|
||||||
status_heal(bl, -hp, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sg->val3++; //timer
|
|
||||||
if (sg->val3 > 5) sg->val3 = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UNT_VACUUM_EXTREME:
|
case UNT_VACUUM_EXTREME:
|
||||||
if (tsc && (tsc->data[SC_HALLUCINATIONWALK] || tsc->data[SC_HOVERING] || tsc->data[SC_VACUUM_EXTREME] ||
|
if (tsc && (tsc->data[SC_HALLUCINATIONWALK] || tsc->data[SC_HOVERING] || tsc->data[SC_VACUUM_EXTREME] ||
|
||||||
(tsc->data[SC_VACUUM_EXTREME_POSTDELAY] && tsc->data[SC_VACUUM_EXTREME_POSTDELAY]->val2 == sg->group_id))) // Ignore post delay from other vacuum (this will make stack effect enabled)
|
(tsc->data[SC_VACUUM_EXTREME_POSTDELAY] && tsc->data[SC_VACUUM_EXTREME_POSTDELAY]->val2 == sg->group_id))) // Ignore post delay from other vacuum (this will make stack effect enabled)
|
||||||
|
@ -780,9 +780,9 @@ void initChangeTables(void)
|
|||||||
set_sc( SO_WARMER , SC_WARMER , SI_WARMER , SCB_NONE );
|
set_sc( SO_WARMER , SC_WARMER , SI_WARMER , SCB_NONE );
|
||||||
set_sc( SO_VACUUM_EXTREME , SC_VACUUM_EXTREME , SI_VACUUM_EXTREME , SCB_NONE );
|
set_sc( SO_VACUUM_EXTREME , SC_VACUUM_EXTREME , SI_VACUUM_EXTREME , SCB_NONE );
|
||||||
set_sc( SO_ARRULLO , SC_DEEPSLEEP , SI_DEEPSLEEP , SCB_NONE );
|
set_sc( SO_ARRULLO , SC_DEEPSLEEP , SI_DEEPSLEEP , SCB_NONE );
|
||||||
set_sc( SO_FIRE_INSIGNIA , SC_FIRE_INSIGNIA , SI_FIRE_INSIGNIA , SCB_MATK|SCB_BATK|SCB_WATK|SCB_ATK_ELE|SCB_REGEN );
|
set_sc( SO_FIRE_INSIGNIA , SC_FIRE_INSIGNIA , SI_FIRE_INSIGNIA , SCB_MATK|SCB_WATK|SCB_ATK_ELE|SCB_REGEN );
|
||||||
set_sc( SO_WATER_INSIGNIA , SC_WATER_INSIGNIA , SI_WATER_INSIGNIA , SCB_WATK|SCB_ATK_ELE|SCB_REGEN );
|
set_sc( SO_WATER_INSIGNIA , SC_WATER_INSIGNIA , SI_WATER_INSIGNIA , SCB_WATK|SCB_ATK_ELE|SCB_REGEN );
|
||||||
set_sc( SO_WIND_INSIGNIA , SC_WIND_INSIGNIA , SI_WIND_INSIGNIA , SCB_WATK|SCB_ATK_ELE|SCB_REGEN );
|
set_sc( SO_WIND_INSIGNIA , SC_WIND_INSIGNIA , SI_WIND_INSIGNIA , SCB_WATK|SCB_ASPD|SCB_ATK_ELE|SCB_REGEN );
|
||||||
set_sc( SO_EARTH_INSIGNIA , SC_EARTH_INSIGNIA , SI_EARTH_INSIGNIA , SCB_MDEF|SCB_DEF|SCB_MAXHP|SCB_MAXSP|SCB_WATK|SCB_ATK_ELE|SCB_REGEN );
|
set_sc( SO_EARTH_INSIGNIA , SC_EARTH_INSIGNIA , SI_EARTH_INSIGNIA , SCB_MDEF|SCB_DEF|SCB_MAXHP|SCB_MAXSP|SCB_WATK|SCB_ATK_ELE|SCB_REGEN );
|
||||||
|
|
||||||
/* Genetic */
|
/* Genetic */
|
||||||
@ -4165,14 +4165,6 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
|
|||||||
sd->subele[ELE_NEUTRAL] += sc->data[SC_MTF_MLEATKED]->val3;
|
sd->subele[ELE_NEUTRAL] += sc->data[SC_MTF_MLEATKED]->val3;
|
||||||
if (sc->data[SC_MTF_CRIDAMAGE])
|
if (sc->data[SC_MTF_CRIDAMAGE])
|
||||||
sd->bonus.crit_atk_rate += sc->data[SC_MTF_CRIDAMAGE]->val1;
|
sd->bonus.crit_atk_rate += sc->data[SC_MTF_CRIDAMAGE]->val1;
|
||||||
if( sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 3 )
|
|
||||||
sd->magic_addele[ELE_FIRE] += 25;
|
|
||||||
if( sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 3 )
|
|
||||||
sd->magic_addele[ELE_WATER] += 25;
|
|
||||||
if( sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 3 )
|
|
||||||
sd->magic_addele[ELE_WIND] += 25;
|
|
||||||
if( sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 3 )
|
|
||||||
sd->magic_addele[ELE_EARTH] += 25;
|
|
||||||
}
|
}
|
||||||
status_cpy(&sd->battle_status, base_status);
|
status_cpy(&sd->battle_status, base_status);
|
||||||
|
|
||||||
@ -4605,11 +4597,36 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str
|
|||||||
regen->hp += cap_value(regen->hp * sc->data[SC_GT_REVITALIZE]->val3/100, 1, SHRT_MAX);
|
regen->hp += cap_value(regen->hp * sc->data[SC_GT_REVITALIZE]->val3/100, 1, SHRT_MAX);
|
||||||
regen->state.walk = 1;
|
regen->state.walk = 1;
|
||||||
}
|
}
|
||||||
if ((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 1) // If insignia lvl 1
|
if (bl->type == BL_ELEM) { // Recovery bonus only applies to the Elementals.
|
||||||
|| (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 1)
|
int ele_class = status_get_class(bl);
|
||||||
|| (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 1)
|
|
||||||
|| (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 1))
|
switch (ele_class) {
|
||||||
regen->rate.hp *= 2;
|
case ELEMENTALID_AGNI_S:
|
||||||
|
case ELEMENTALID_AGNI_M:
|
||||||
|
case ELEMENTALID_AGNI_L:
|
||||||
|
if (sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 1)
|
||||||
|
regen->rate.hp += 100;
|
||||||
|
break;
|
||||||
|
case ELEMENTALID_AQUA_S:
|
||||||
|
case ELEMENTALID_AQUA_M:
|
||||||
|
case ELEMENTALID_AQUA_L:
|
||||||
|
if (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 1)
|
||||||
|
regen->rate.hp += 100;
|
||||||
|
break;
|
||||||
|
case ELEMENTALID_VENTUS_S:
|
||||||
|
case ELEMENTALID_VENTUS_M:
|
||||||
|
case ELEMENTALID_VENTUS_L:
|
||||||
|
if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 1)
|
||||||
|
regen->rate.hp += 100;
|
||||||
|
break;
|
||||||
|
case ELEMENTALID_TERA_S:
|
||||||
|
case ELEMENTALID_TERA_M:
|
||||||
|
case ELEMENTALID_TERA_L:
|
||||||
|
if (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 1)
|
||||||
|
regen->rate.hp += 100;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (sc->data[SC_EXTRACT_WHITE_POTION_Z])
|
if (sc->data[SC_EXTRACT_WHITE_POTION_Z])
|
||||||
regen->rate.hp += (unsigned short)(regen->rate.hp * sc->data[SC_EXTRACT_WHITE_POTION_Z]->val1 / 100.);
|
regen->rate.hp += (unsigned short)(regen->rate.hp * sc->data[SC_EXTRACT_WHITE_POTION_Z]->val1 / 100.);
|
||||||
if (sc->data[SC_VITATA_500])
|
if (sc->data[SC_VITATA_500])
|
||||||
@ -5812,15 +5829,6 @@ static unsigned short status_calc_batk(struct block_list *bl, struct status_chan
|
|||||||
if(sc->data[SC_MADNESSCANCEL])
|
if(sc->data[SC_MADNESSCANCEL])
|
||||||
batk += 100;
|
batk += 100;
|
||||||
#endif
|
#endif
|
||||||
if(sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 2)
|
|
||||||
batk += 50;
|
|
||||||
if(bl->type == BL_ELEM
|
|
||||||
&& ((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 1)
|
|
||||||
|| (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 1)
|
|
||||||
|| (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 1)
|
|
||||||
|| (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 1))
|
|
||||||
)
|
|
||||||
batk += batk / 5;
|
|
||||||
if(sc->data[SC_FULL_SWING_K])
|
if(sc->data[SC_FULL_SWING_K])
|
||||||
batk += sc->data[SC_FULL_SWING_K]->val1;
|
batk += sc->data[SC_FULL_SWING_K]->val1;
|
||||||
if(sc->data[SC_ASH])
|
if(sc->data[SC_ASH])
|
||||||
@ -5939,11 +5947,13 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan
|
|||||||
watk += sc->data[SC_STRIKING]->val2;
|
watk += sc->data[SC_STRIKING]->val2;
|
||||||
if(sc->data[SC_RUSHWINDMILL])
|
if(sc->data[SC_RUSHWINDMILL])
|
||||||
watk += sc->data[SC_RUSHWINDMILL]->val3;
|
watk += sc->data[SC_RUSHWINDMILL]->val3;
|
||||||
|
if(sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 2)
|
||||||
|
watk += 50;
|
||||||
if((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 2)
|
if((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 2)
|
||||||
|| (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 2)
|
|| (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 2)
|
||||||
|| (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2)
|
|| (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2)
|
||||||
|| (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2))
|
|| (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2))
|
||||||
watk += watk / 10;
|
watk += watk * 10 / 100;
|
||||||
if(sc->data[SC_PYROTECHNIC_OPTION])
|
if(sc->data[SC_PYROTECHNIC_OPTION])
|
||||||
watk += sc->data[SC_PYROTECHNIC_OPTION]->val2;
|
watk += sc->data[SC_PYROTECHNIC_OPTION]->val2;
|
||||||
if(sc->data[SC_HEATER_OPTION])
|
if(sc->data[SC_HEATER_OPTION])
|
||||||
@ -6877,6 +6887,8 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b
|
|||||||
bonus += sc->data[SC_GATLINGFEVER]->val1;
|
bonus += sc->data[SC_GATLINGFEVER]->val1;
|
||||||
if (sc->data[SC_STAR_COMFORT])
|
if (sc->data[SC_STAR_COMFORT])
|
||||||
bonus += 3 * sc->data[SC_STAR_COMFORT]->val1;
|
bonus += 3 * sc->data[SC_STAR_COMFORT]->val1;
|
||||||
|
if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2)
|
||||||
|
bonus += 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
return bonus;
|
return bonus;
|
||||||
@ -7051,6 +7063,8 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change *
|
|||||||
aspd_rate += sc->data[SC_PAIN_KILLER]->val2 * 10;
|
aspd_rate += sc->data[SC_PAIN_KILLER]->val2 * 10;
|
||||||
if( sc->data[SC_GOLDENE_FERSE])
|
if( sc->data[SC_GOLDENE_FERSE])
|
||||||
aspd_rate -= sc->data[SC_GOLDENE_FERSE]->val3 * 10;
|
aspd_rate -= sc->data[SC_GOLDENE_FERSE]->val3 * 10;
|
||||||
|
if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2)
|
||||||
|
aspd_rate -= 100;
|
||||||
|
|
||||||
return (short)cap_value(aspd_rate,0,SHRT_MAX);
|
return (short)cap_value(aspd_rate,0,SHRT_MAX);
|
||||||
}
|
}
|
||||||
@ -7889,6 +7903,10 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
|
|||||||
case SC_QUAGMIRE:
|
case SC_QUAGMIRE:
|
||||||
case SC_SUITON:
|
case SC_SUITON:
|
||||||
case SC_SWINGDANCE:
|
case SC_SWINGDANCE:
|
||||||
|
case SC_FIRE_INSIGNIA:
|
||||||
|
case SC_WATER_INSIGNIA:
|
||||||
|
case SC_WIND_INSIGNIA:
|
||||||
|
case SC_EARTH_INSIGNIA:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10894,6 +10912,13 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
|||||||
else
|
else
|
||||||
val4 = 0;
|
val4 = 0;
|
||||||
break;
|
break;
|
||||||
|
case SC_FIRE_INSIGNIA:
|
||||||
|
case SC_WATER_INSIGNIA:
|
||||||
|
case SC_WIND_INSIGNIA:
|
||||||
|
case SC_EARTH_INSIGNIA:
|
||||||
|
tick_time = 5000;
|
||||||
|
val4 = tick / tick_time;
|
||||||
|
break;
|
||||||
case SC_NEUTRALBARRIER:
|
case SC_NEUTRALBARRIER:
|
||||||
val2 = 10 + val1 * 5; // Def/Mdef
|
val2 = 10 + val1 * 5; // Def/Mdef
|
||||||
tick = -1;
|
tick = -1;
|
||||||
@ -13457,6 +13482,49 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
|
|||||||
sce->val4 = 0;
|
sce->val4 = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SC_FIRE_INSIGNIA:
|
||||||
|
if (--(sce->val4) >= 0) {
|
||||||
|
if (status->def_ele == ELE_FIRE)
|
||||||
|
status_heal(bl, status->max_hp / 100, 0, 1);
|
||||||
|
else if (status->def_ele == ELE_EARTH)
|
||||||
|
status_zap(bl, status->max_hp / 100, 0);
|
||||||
|
sc_timer_next(5000 + tick, status_change_timer, bl->id, data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SC_WATER_INSIGNIA:
|
||||||
|
if (--(sce->val4) >= 0) {
|
||||||
|
if (status->def_ele == ELE_WATER)
|
||||||
|
status_heal(bl, status->max_hp / 100, 0, 1);
|
||||||
|
else if (status->def_ele == ELE_FIRE)
|
||||||
|
status_zap(bl, status->max_hp / 100, 0);
|
||||||
|
sc_timer_next(5000 + tick, status_change_timer, bl->id, data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SC_WIND_INSIGNIA:
|
||||||
|
if (--(sce->val4) >= 0) {
|
||||||
|
if (status->def_ele == ELE_WIND)
|
||||||
|
status_heal(bl, status->max_hp / 100, 0, 1);
|
||||||
|
else if (status->def_ele == ELE_WATER)
|
||||||
|
status_zap(bl, status->max_hp / 100, 0);
|
||||||
|
sc_timer_next(5000 + tick, status_change_timer, bl->id, data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SC_EARTH_INSIGNIA:
|
||||||
|
if (--(sce->val4) >= 0) {
|
||||||
|
if (status->def_ele == ELE_EARTH)
|
||||||
|
status_heal(bl, status->max_hp / 100, 0, 1);
|
||||||
|
else if (status->def_ele == ELE_WIND)
|
||||||
|
status_zap(bl, status->max_hp / 100, 0);
|
||||||
|
sc_timer_next(5000 + tick, status_change_timer, bl->id, data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case SC_BITESCAR:
|
case SC_BITESCAR:
|
||||||
if (--(sce->val4) >= 0) {
|
if (--(sce->val4) >= 0) {
|
||||||
status_percent_damage(bl, bl, -(sce->val2), 0, 0);
|
status_percent_damage(bl, bl, -(sce->val2), 0, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user