From 6ba747880532b4278fed801896216146ac63a90d Mon Sep 17 00:00:00 2001 From: protimus Date: Sun, 8 Jan 2012 02:46:19 +0000 Subject: Fixed Exceed Break to work properly. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@15407 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/battle.c | 6 ++++++ src/map/skill.c | 2 +- src/map/status.c | 16 ++++++++-------- src/map/unit.c | 6 +++--- 4 files changed, 18 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/map/battle.c b/src/map/battle.c index bc42609ec..c3d22a489 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -3850,6 +3850,12 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t tsc->data[SC_KAAHI]->val4 = add_timer(tick + skill_get_time2(SL_KAAHI,tsc->data[SC_KAAHI]->val1), kaahi_heal_timer, target->id, SC_KAAHI); //Activate heal. wd = battle_calc_attack(BF_WEAPON, src, target, 0, 0, flag); + + if(sc && sc->data[SC_EXEEDBREAK]) + { + wd.damage = wd.damage * sc->data[SC_EXEEDBREAK]->val1 / 100; + status_change_end(src, SC_EXEEDBREAK, INVALID_TIMER); + } if (sd && sd->state.arrow_atk) //Consume arrow. battle_consume_ammo(sd, 0, 0); diff --git a/src/map/skill.c b/src/map/skill.c index f0790efe3..60c8e0dc4 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -12364,7 +12364,7 @@ static int skill_trap_splash (struct block_list *bl, va_list ap) int skill_enchant_elemental_end (struct block_list *bl, int type) { struct status_change *sc; - const enum sc_type scs[] = { SC_ENCPOISON, SC_ASPERSIO, SC_FIREWEAPON, SC_WATERWEAPON, SC_WINDWEAPON, SC_EARTHWEAPON, SC_SHADOWWEAPON, SC_GHOSTWEAPON, SC_ENCHANTARMS }; + const enum sc_type scs[] = { SC_ENCPOISON, SC_ASPERSIO, SC_FIREWEAPON, SC_WATERWEAPON, SC_WINDWEAPON, SC_EARTHWEAPON, SC_SHADOWWEAPON, SC_GHOSTWEAPON, SC_ENCHANTARMS, SC_EXEEDBREAK }; int i; nullpo_ret(bl); nullpo_ret(sc= status_get_sc(bl)); diff --git a/src/map/status.c b/src/map/status.c index 2565d8856..41ef41ea8 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -4288,9 +4288,12 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha if( sc == NULL ) return cap_value(speed,10,USHRT_MAX); - if( sd && sd->ud.skilltimer != INVALID_TIMER && pc_checkskill(sd,SA_FREECAST) > 0 ) + if( sd && sd->ud.skilltimer != INVALID_TIMER && (pc_checkskill(sd,SA_FREECAST) > 0 || sd->ud.skillid == LG_EXEEDBREAK) ) { - speed_rate = 175 - 5 * pc_checkskill(sd,SA_FREECAST); + if( sd->ud.skillid == LG_EXEEDBREAK ) + speed_rate = 100 + 60 - (sd->ud.skilllv * 10); + else + speed_rate = 175 - 5 * pc_checkskill(sd,SA_FREECAST); } else { @@ -7124,16 +7127,13 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val break; case SC_EXEEDBREAK: val1 *= 150; // 150 * skill_lv - if( sd ) - { // Chars. - struct item_data *id = sd->inventory_data[sd->equip_index[EQI_HAND_R]]; - if( id ) val1 += (id->weight/10 * id->wlv * status_get_lv(bl) / 100); // (weapon_weight * weapon_level * base_lvl)/100 - val1 += 15 * sd->status.job_level; // 15 * job_lvl + if( sd && sd->inventory_data[sd->equip_index[EQI_HAND_R]] ) { // Chars. + val1 += (sd->inventory_data[sd->equip_index[EQI_HAND_R]]->weight/10 * sd->inventory_data[sd->equip_index[EQI_HAND_R]]->wlv * status_get_lv(bl) / 100); + val1 += 15 * (sd ? sd->status.job_level:50) + 100; } else // Mobs val1 += (400 * status_get_lv(bl) / 100) + (15 * (status_get_lv(bl) / 2)); // About 1138% at mob_lvl 99. Is an aproximation to a standard weapon. [pakpil] break; - case SC_PRESTIGE: // Bassed on suggested formula in iRO Wiki and some test, still need more test. [pakpil] val2 = ((status->int_ + status->luk) / 6) + 5; // Chance to evade magic damage. val1 *= 15; // Defence added diff --git a/src/map/unit.c b/src/map/unit.c index 85a1b89f9..1cfa2bfa2 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -884,7 +884,7 @@ int unit_can_move(struct block_list *bl) if (!ud) return 0; - if (ud->skilltimer != INVALID_TIMER && (!sd || !pc_checkskill(sd, SA_FREECAST) || skill_get_inf2(ud->skillid)&INF2_GUILD_SKILL)) + if (ud->skilltimer != INVALID_TIMER && ud->skillid != LG_EXEEDBREAK && (!sd || !pc_checkskill(sd, SA_FREECAST) || skill_get_inf2(ud->skillid)&INF2_GUILD_SKILL)) return 0; // prevent moving while casting if (DIFF_TICK(ud->canmove_tick, gettick()) > 0) @@ -1286,7 +1286,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, short skill_num, sh if( casttime > 0 ) { ud->skilltimer = add_timer( tick+casttime, skill_castend_id, src->id, 0 ); - if( sd && pc_checkskill(sd,SA_FREECAST) > 0 ) + if( sd && (pc_checkskill(sd,SA_FREECAST) > 0 || skill_num == LG_EXEEDBREAK) ) status_calc_bl(&sd->bl, SCB_SPEED); } else @@ -1401,7 +1401,7 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, sh unit_stop_walking(src,1); clif_skillcasting(src, src->id, 0, skill_x, skill_y, skill_num, skill_get_ele(skill_num, skill_lv), casttime); ud->skilltimer = add_timer( tick+casttime, skill_castend_pos, src->id, 0 ); - if( sd && pc_checkskill(sd,SA_FREECAST) > 0 ) + if( (sd && pc_checkskill(sd,SA_FREECAST) > 0) || skill_num == LG_EXEEDBREAK) status_calc_bl(&sd->bl, SCB_SPEED); } else -- cgit v1.2.3-60-g2f50