summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/map/battle.c6
-rw-r--r--src/map/skill.c2
-rw-r--r--src/map/status.c16
-rw-r--r--src/map/unit.c6
4 files changed, 18 insertions, 12 deletions
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