diff --git a/db/pre-re/skill_unit_db.txt b/db/pre-re/skill_unit_db.txt index f45c23bdf0..4cad9ce85c 100644 --- a/db/pre-re/skill_unit_db.txt +++ b/db/pre-re/skill_unit_db.txt @@ -150,10 +150,10 @@ 2450,0xe0, , 3, 0, -1,enemy, 0xA010 //SO_CLOUD_KILL 2452,0xe4, , 3, 0, -1,all, 0xA010 //SO_WARMER 2453,0xeb, , 0, 1:1:2:2:3,500,enemy,0x8010 //SO_VACUUM_EXTREME -2465,0xf1, , 0, 1,1000,all, 0x010 //SO_FIRE_INSIGNIA -2466,0xf2, , 0, 1,1000,all, 0x010 //SO_WATER_INSIGNIA -2467,0xf3, , 0, 1,1000,all, 0x010 //SO_WIND_INSIGNIA -2468,0xf4, , 0, 1,1000,all, 0x010 //SO_EARTH_INSIGNIA +2465,0xf1, , 1, 0, -1,all, 0x2010 //SO_FIRE_INSIGNIA +2466,0xf2, , 1, 0, -1,all, 0x2010 //SO_WATER_INSIGNIA +2467,0xf3, , 1, 0, -1,all, 0x2010 //SO_WIND_INSIGNIA +2468,0xf4, , 1, 0, -1,all, 0x2010 //SO_EARTH_INSIGNIA 2479,0xe5, , 0, 1,1000,enemy, 0x8006 //GN_THORNS_TRAP 2482,0xe6,0x7f, -1, 1, 300,enemy, 0x8000 //GN_WALLOFTHORN diff --git a/db/re/skill_unit_db.txt b/db/re/skill_unit_db.txt index 3c857e4df8..5d5169d0e2 100644 --- a/db/re/skill_unit_db.txt +++ b/db/re/skill_unit_db.txt @@ -151,10 +151,10 @@ 2450,0xe0, , 3, 0, -1,enemy, 0xA010 //SO_CLOUD_KILL 2452,0xe4, , 3, 0, -1,all, 0xA010 //SO_WARMER 2453,0xeb, , 0, 1:1:2:2:3,500,enemy,0x8010 //SO_VACUUM_EXTREME -2465,0xf1, , 0, 1,1000,all, 0x010 //SO_FIRE_INSIGNIA -2466,0xf2, , 0, 1,1000,all, 0x010 //SO_WATER_INSIGNIA -2467,0xf3, , 0, 1,1000,all, 0x010 //SO_WIND_INSIGNIA -2468,0xf4, , 0, 1,1000,all, 0x010 //SO_EARTH_INSIGNIA +2465,0xf1, , 1, 0, -1,all, 0x2010 //SO_FIRE_INSIGNIA +2466,0xf2, , 1, 0, -1,all, 0x2010 //SO_WATER_INSIGNIA +2467,0xf3, , 1, 0, -1,all, 0x2010 //SO_WIND_INSIGNIA +2468,0xf4, , 1, 0, -1,all, 0x2010 //SO_EARTH_INSIGNIA 2479,0xe5, , 0, 1,1000,enemy, 0x8006 //GN_THORNS_TRAP 2482,0xe6,0x7f, -1, 1, 300,enemy, 0x8000 //GN_WALLOFTHORN diff --git a/src/map/battle.cpp b/src/map/battle.cpp index d5ca70b5d6..cf189b356a 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1908,11 +1908,16 @@ static int battle_calc_base_weapon_attack(struct block_list *src, struct status_ * Initial refactoring by Baalberith * 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; short type = 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(flag&4) { @@ -1962,6 +1967,38 @@ static int64 battle_calc_base_damage(struct status_data *status, struct weapon_a // Size fix only for players 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; + } 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 @@ -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); 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] - 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); 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); } } @@ -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.masteryAtk = 0; // weapon mastery is ignored for spiral } 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? @@ -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. } 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; @@ -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)| (!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)) - 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 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; } } - 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)) - 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 if (nk&NK_SPLASHSPLIT){ // Divide ATK among targets if(wd.miscflag > 0) { @@ -5064,7 +5101,7 @@ struct Damage battle_calc_weapon_final_atk_modifiers(struct Damage wd, struct bl int64 rdamage = 0; 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 - 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; 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, @@ -6177,6 +6214,14 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list 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); //Constant/misc additions from skills diff --git a/src/map/skill.cpp b/src/map/skill.cpp index b086c48c60..a77fa75fce 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -13344,6 +13344,10 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, un case UNT_VOLCANO: case UNT_DELUGE: case UNT_VIOLENTGALE: + case UNT_FIRE_INSIGNIA: + case UNT_WATER_INSIGNIA: + case UNT_WIND_INSIGNIA: + case UNT_EARTH_INSIGNIA: if(!sce) sc_start(ss, bl,type,100,sg->skill_lv,sg->limit); 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); 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: 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) diff --git a/src/map/status.cpp b/src/map/status.cpp index 595256b310..82e02e738d 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -780,9 +780,9 @@ void initChangeTables(void) 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_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_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 ); /* 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; if (sc->data[SC_MTF_CRIDAMAGE]) 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); @@ -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->state.walk = 1; } - if ((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 1) // If insignia lvl 1 - || (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 1) - || (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 1) - || (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 1)) - regen->rate.hp *= 2; + if (bl->type == BL_ELEM) { // Recovery bonus only applies to the Elementals. + int ele_class = status_get_class(bl); + + switch (ele_class) { + 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]) regen->rate.hp += (unsigned short)(regen->rate.hp * sc->data[SC_EXTRACT_WHITE_POTION_Z]->val1 / 100.); 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]) batk += 100; #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]) batk += sc->data[SC_FULL_SWING_K]->val1; 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; if(sc->data[SC_RUSHWINDMILL]) 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) || (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_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2)) - watk += watk / 10; + watk += watk * 10 / 100; if(sc->data[SC_PYROTECHNIC_OPTION]) watk += sc->data[SC_PYROTECHNIC_OPTION]->val2; 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; if (sc->data[SC_STAR_COMFORT]) 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; @@ -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; if( sc->data[SC_GOLDENE_FERSE]) 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); } @@ -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_SUITON: case SC_SWINGDANCE: + case SC_FIRE_INSIGNIA: + case SC_WATER_INSIGNIA: + case SC_WIND_INSIGNIA: + case SC_EARTH_INSIGNIA: return 0; } } @@ -10894,6 +10912,13 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty else val4 = 0; 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: val2 = 10 + val1 * 5; // Def/Mdef tick = -1; @@ -13457,6 +13482,49 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data) sce->val4 = 0; } 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: if (--(sce->val4) >= 0) { status_percent_damage(bl, bl, -(sce->val2), 0, 0);