Index: battle.c
===================================================================
--- battle.c (revision 16990)
+++ battle.c (working copy)
@@ -414,9 +414,9 @@
ARR_FIND(1, 6, t, tsd->talisman[t] > 0);
if (t < 5 && atk_elem == t)
- damage -= damage * tsd->talisman[t] * 3 / 100; // -3% custom value
+ damage -= (int)(damage * (tsd->talisman[t] * 3 / 100.0)); // -3% custom value
}
- return damage*ratio/100;
+ return (int)(damage*(ratio/100.0));
}
/*==========================================
* Calculates card bonuses damage adjustments.
@@ -439,6 +439,7 @@
if( !damage )
return 0;
+ #define bccDAMAGE_RATE(a){ damage = (int)(damage * ((a) / 1000.0));}
switch(attack_type){
case BF_MAGIC:
if ( sd && !(nk&NK_NO_CARDFIX_ATK) ) {
@@ -454,7 +455,8 @@
}
}
if (cardfix != 1000)
- damage = damage * cardfix / 1000;
+ bccDAMAGE_RATE(cardfix);
+
}
if( tsd && !(nk&NK_NO_CARDFIX_DEF) )
@@ -498,7 +500,7 @@
cardfix = cardfix * ( 100 - tsd->sc.data[SC_MDEF_RATE]->val1 ) / 100;
if (cardfix != 1000)
- damage = damage * cardfix / 1000;
+ bccDAMAGE_RATE(cardfix);
}
break;
case BF_WEAPON:
@@ -630,10 +632,11 @@
cardfix_ = cardfix_ * (100 + sd->sc.data[SC_EDP]->val1 * 60 ) / 100;
}
#endif
- if( (left&1) && cardfix_ != 1000 )
- damage = damage * cardfix_ / 1000;
- else if( cardfix != 1000 )
- damage = damage * cardfix / 1000;
+ if( (left&1) && cardfix_ != 1000 ){
+ bccDAMAGE_RATE(cardfix_);
+ }else if( cardfix != 1000 ){
+ bccDAMAGE_RATE(cardfix);
+ }
}else if( tsd && !(nk&NK_NO_CARDFIX_DEF) ){
if( !(nk&NK_NO_ELEFIX) )
@@ -687,7 +690,7 @@
cardfix = cardfix * ( 100 - tsd->sc.data[SC_DEF_RATE]->val1 ) / 100;
if( cardfix != 1000 )
- damage = damage * cardfix / 1000;
+ bccDAMAGE_RATE(cardfix);
}
break;
case BF_MISC:
@@ -721,7 +724,7 @@
cardfix = cardfix * ( 100 - tsd->bonus.long_attack_def_rate ) / 100;
if (cardfix != 10000)
- damage = (int)( (int64)damage * cardfix / 1000);
+ bccDAMAGE_RATE(cardfix);
}
break;
}
@@ -748,17 +751,20 @@
if (battle_config.ksprotection && mob_ksprotected(src, bl))
return 0;
+ #define DAMAGE_RATE(a){damage = (int)(damage * ((a)/100.0)); }
+ #define DAMAGE_SUBRATE(a){damage -= (int)(damage * ((a)/100.0)); }
+ #define DAMAGE_ADDRATE(a){damage += (int)(damage * ((a)/100.0)); }
if (bl->type == BL_PC) {
sd=(struct map_session_data *)bl;
//Special no damage states
if (flag&BF_WEAPON && sd->special_state.no_weapon_damage)
- damage -= damage*sd->special_state.no_weapon_damage/100;
+ DAMAGE_SUBRATE(sd->special_state.no_weapon_damage);
if (flag&BF_MAGIC && sd->special_state.no_magic_damage)
- damage -= damage*sd->special_state.no_magic_damage/100;
+ DAMAGE_SUBRATE(sd->special_state.no_magic_damage);
if (flag&BF_MISC && sd->special_state.no_misc_damage)
- damage -= damage*sd->special_state.no_misc_damage/100;
+ DAMAGE_SUBRATE(sd->special_state.no_misc_damage);
if (!damage) return 0;
}
@@ -947,7 +953,7 @@
#ifdef RENEWAL
if (sc->data[SC_RAID]) {
- damage += 20*damage/100;
+ DAMAGE_ADDRATE(20);
if (--sc->data[SC_RAID]->val1 == 0)
status_change_end(bl, SC_RAID, INVALID_TIMER);
@@ -957,7 +963,7 @@
if (damage) {
struct map_session_data *tsd = BL_CAST(BL_PC, src);
if (sc->data[SC_DEEPSLEEP]) {
- damage += damage / 2; // 1.5 times more damage while in Deep Sleep.
+ damage += damage>>1; // 1.5 times more damage while in Deep Sleep.
status_change_end(bl,SC_DEEPSLEEP,INVALID_TIMER);
}
if (tsd && sd && sc->data[SC_CRYSTALIZE] && flag&BF_WEAPON) {
@@ -966,7 +972,7 @@
case W_2HMACE:
case W_1HAXE:
case W_2HAXE:
- damage = damage * 150 / 100;
+ DAMAGE_RATE(150);
break;
case W_MUSICAL:
case W_WHIP:
@@ -981,7 +987,7 @@
case W_DAGGER:
case W_1HSWORD:
case W_2HSWORD:
- damage = damage * 50 / 100;
+ DAMAGE_RATE(50);
break;
}
}
@@ -995,7 +1001,7 @@
#ifndef RENEWAL
if (sc->data[SC_ASSUMPTIO]) {
if (map_flag_vs(bl->m))
- damage = damage*2/3; //Receive 66% damage
+ damage = damage/3*2; //Receive 66% damage
else
damage >>= 1; //Receive 50% damage
}
@@ -1003,16 +1009,16 @@
if (sc->data[SC_DEFENDER] &&
(flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON))
- damage=damage*(100-sc->data[SC_DEFENDER]->val2)/100;
+ DAMAGE_RATE(100-sc->data[SC_DEFENDER]->val2);
if (sc->data[SC_ADJUSTMENT] &&
(flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON))
- damage -= 20*damage/100;
+ DAMAGE_SUBRATE(20);
if (sc->data[SC_FOGWALL] && skill_num != RK_DRAGONBREATH) {
- if (flag&BF_SKILL) //25% reduction
- damage -= 25*damage/100;
- else if ((flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON))
+ if (flag&BF_SKILL){ //25% reduction
+ DAMAGE_SUBRATE(25);
+ }else if ((flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON))
damage >>= 2; //75% reduction
}
@@ -1022,20 +1028,20 @@
if (sc->data[SC_MANU_DEF])
for (i=0; ARRAYLENGTH(mob_manuk)>i; i++)
if (mob_manuk[i]==((TBL_MOB *)src)->class_) {
- damage -= sc->data[SC_MANU_DEF]->val1*damage/100;
+ DAMAGE_SUBRATE(sc->data[SC_MANU_DEF]->val1);
break;
}
if (sc->data[SC_SPL_DEF])
for (i=0; ARRAYLENGTH(mob_splendide)>i; i++)
if (mob_splendide[i]==((TBL_MOB *)src)->class_) {
- damage -= sc->data[SC_SPL_DEF]->val1*damage/100;
+ DAMAGE_SUBRATE(sc->data[SC_SPL_DEF]->val1);
break;
}
}
if ((sce=sc->data[SC_ARMOR]) && //NPC_DEFENDER
sce->val3&flag && sce->val4&flag)
- damage -= damage*sc->data[SC_ARMOR]->val2/100;
+ DAMAGE_SUBRATE(sc->data[SC_ARMOR]->val2);
#ifdef RENEWAL
if (sc->data[SC_ENERGYCOAT] && (flag&BF_WEAPON || flag&BF_MAGIC) && skill_num != WS_CARTTERMINATION)
@@ -1050,13 +1056,13 @@
if (!status_charge(bl, 0, (10+5*per)*status->max_sp/1000))
status_change_end(bl, SC_ENERGYCOAT, INVALID_TIMER);
//Reduction: 6% + 6% every 20%
- damage -= damage * 6 * (1+per) / 100;
+ DAMAGE_SUBRATE(6 * (1+per));
}
if (sc->data[SC_GRANITIC_ARMOR]) {
- damage -= damage * sc->data[SC_GRANITIC_ARMOR]->val2/100;
+ DAMAGE_SUBRATE(sc->data[SC_GRANITIC_ARMOR]->val2);
}
if (sc->data[SC_PAIN_KILLER]) {
- damage -= damage * sc->data[SC_PAIN_KILLER]->val3/100;
+ DAMAGE_SUBRATE(sc->data[SC_PAIN_KILLER]->val3);
}
if ((sce=sc->data[SC_MAGMA_FLOW]) && (rnd()%100 <= sce->val2)) {
skill_castend_damage_id(bl,src,MH_MAGMA_FLOW,sce->val1,gettick(),0);
@@ -1067,7 +1073,7 @@
**/
#ifdef RENEWAL
if (sc->data[SC_STEELBODY]) {
- damage = damage > 10 ? damage / 10 : 1;
+ damage = damage > 19 ? damage / 10 : 1;
}
#endif
@@ -1153,7 +1159,7 @@
if (sc && sc->count) {
if (sc->data[SC_INVINCIBLE] && !sc->data[SC_INVINCIBLEOFF])
- damage += damage * 75 / 100;
+ DAMAGE_ADDRATE(75);
// [Epoque]
if (bl->type == BL_MOB) {
int i;
@@ -1163,7 +1169,7 @@
)
for (i=0; ARRAYLENGTH(mob_manuk)>i; i++)
if (((TBL_MOB *)bl)->class_==mob_manuk[i]) {
- damage += damage*sce->val1/100;
+ DAMAGE_ADDRATE(sce->val1);
break;
}
if (((sce=sc->data[SC_SPL_ATK]) && (flag&BF_WEAPON)) ||
@@ -1171,7 +1177,7 @@
)
for (i=0; ARRAYLENGTH(mob_splendide)>i; i++)
if (((TBL_MOB *)bl)->class_==mob_splendide[i]) {
- damage += damage*sce->val1/100;
+ DAMAGE_ADDRATE(sce->val1);
break;
}
}
@@ -1188,16 +1194,16 @@
if (battle_config.pk_mode && sd && bl->type == BL_PC && damage && map[bl->m].flag.pvp) {
if (flag & BF_SKILL) { //Skills get a different reduction than non-skills. [Skotlex]
if (flag&BF_WEAPON)
- damage = damage * battle_config.pk_weapon_damage_rate/100;
+ DAMAGE_RATE(battle_config.pk_weapon_damage_rate);
if (flag&BF_MAGIC)
- damage = damage * battle_config.pk_magic_damage_rate/100;
+ DAMAGE_RATE(battle_config.pk_magic_damage_rate);
if (flag&BF_MISC)
- damage = damage * battle_config.pk_misc_damage_rate/100;
+ DAMAGE_RATE(battle_config.pk_misc_damage_rate);
} else { //Normal attacks get reductions based on range.
if (flag & BF_SHORT)
- damage = damage * battle_config.pk_short_damage_rate/100;
+ DAMAGE_RATE(battle_config.pk_short_damage_rate);
if (flag & BF_LONG)
- damage = damage * battle_config.pk_long_damage_rate/100;
+ DAMAGE_RATE(battle_config.pk_long_damage_rate);
}
if (!damage) damage = 1;
}
@@ -1251,7 +1257,7 @@
if (map[bl->m].flag.battleground && (md->class_ == MOBID_BLUE_CRYST || md->class_ == MOBID_PINK_CRYST) && flag&BF_SKILL)
return 0; // Crystal cannot receive skill damage on battlegrounds
}
-
+ #define bcbgDAMAGE_RATE(a){ damage = (int)(damage * ((a)/100.0)); }
switch (skill_num) {
case PA_PRESSURE:
case HW_GRAVITATION:
@@ -1262,17 +1268,17 @@
if (flag&BF_SKILL) {
//Skills get a different reduction than non-skills. [Skotlex]
if (flag&BF_WEAPON)
- damage = damage * battle_config.bg_weapon_damage_rate/100;
+ bcbgDAMAGE_RATE(battle_config.bg_weapon_damage_rate);
if (flag&BF_MAGIC)
- damage = damage * battle_config.bg_magic_damage_rate/100;
+ bcbgDAMAGE_RATE(battle_config.bg_magic_damage_rate);
if (flag&BF_MISC)
- damage = damage * battle_config.bg_misc_damage_rate/100;
+ bcbgDAMAGE_RATE(battle_config.bg_misc_damage_rate);
} else {
//Normal attacks get reductions based on range.
if (flag&BF_SHORT)
- damage = damage * battle_config.bg_short_damage_rate/100;
+ bcbgDAMAGE_RATE(battle_config.bg_short_damage_rate);
if (flag&BF_LONG)
- damage = damage * battle_config.bg_long_damage_rate/100;
+ bcbgDAMAGE_RATE(battle_config.bg_long_damage_rate);
}
if (!damage) damage = 1;
@@ -1291,7 +1297,7 @@
if (!damage) //No reductions to make.
return 0;
-
+#define bcgdDAMAGE_RATE(a){ damage = (int)(damage * ((a)/100.0));}
if (md && md->guardian_data) {
if (class_ == MOBID_EMPERIUM && flag&BF_SKILL) {
//Skill immunity.
@@ -1331,16 +1337,16 @@
*/
if (flag & BF_SKILL) { //Skills get a different reduction than non-skills. [Skotlex]
if (flag&BF_WEAPON)
- damage = damage * battle_config.gvg_weapon_damage_rate/100;
+ bcgdDAMAGE_RATE(battle_config.gvg_weapon_damage_rate);
if (flag&BF_MAGIC)
- damage = damage * battle_config.gvg_magic_damage_rate/100;
+ bcgdDAMAGE_RATE(battle_config.gvg_magic_damage_rate);
if (flag&BF_MISC)
- damage = damage * battle_config.gvg_misc_damage_rate/100;
+ bcgdDAMAGE_RATE(battle_config.gvg_misc_damage_rate);
} else { //Normal attacks get reductions based on range.
if (flag & BF_SHORT)
- damage = damage * battle_config.gvg_short_damage_rate/100;
+ bcgdDAMAGE_RATE(battle_config.gvg_short_damage_rate);
if (flag & BF_LONG)
- damage = damage * battle_config.gvg_long_damage_rate/100;
+ bcgdDAMAGE_RATE(battle_config.gvg_long_damage_rate);
}
if (!damage) damage = 1;
}
@@ -1539,9 +1545,9 @@
//SizeFix only for players
if (!(sd->special_state.no_sizefix || (flag&8)))
- damage = damage*(type==EQI_HAND_L?
+ damage = (int)(damage*((type==EQI_HAND_L?
sd->left_weapon.atkmods[t_size]:
- sd->right_weapon.atkmods[t_size])/100;
+ sd->right_weapon.atkmods[t_size])/100.0));
}
//Finally, add baseatk
@@ -1557,12 +1563,12 @@
if (sd->left_weapon.overrefine)
damage += rnd()%sd->left_weapon.overrefine+1;
if (sd->weapon_atk_rate[sd->weapontype2])
- damage += damage*sd->weapon_atk_rate[sd->weapontype2]/100;;
+ damage += (int)(damage*(sd->weapon_atk_rate[sd->weapontype2]/100.0));
} else { //Right hand
if (sd->right_weapon.overrefine)
damage += rnd()%sd->right_weapon.overrefine+1;
if (sd->weapon_atk_rate[sd->weapontype1])
- damage += damage*sd->weapon_atk_rate[sd->weapontype1]/100;;
+ damage += (int)(damage*(sd->weapon_atk_rate[sd->weapontype1]/100.0));
}
}
return damage;
@@ -2019,11 +2025,13 @@
//Assuming that 99% of the cases we will not need to check for the flag.rh... we don't.
//ATK_RATE scales the damage. 100 = no change. 50 is halved, 200 is doubled, etc
-#define ATK_RATE( a ) { wd.damage= wd.damage*(a)/100 ; if(flag.lh) wd.damage2= wd.damage2*(a)/100; }
-#define ATK_RATE2( a , b ) { wd.damage= wd.damage*(a)/100 ; if(flag.lh) wd.damage2= wd.damage2*(b)/100; }
+#define ATK_RATE( a ) { wd.damage= (int)(wd.damage*((a)/100.0)); if(flag.lh) wd.damage2= (int)(wd.damage2*((a)/100.0)); }
+#define ATK_RATE1( a ) { wd.damage= (int)(wd.damage*((a)/100.0)); }
+#define ATK_RATE2( a ) { wd.damage2= (int)(wd.damage2*((a)/100.0)); }
+#define ATK_RATE3( a , b ) { wd.damage= (int)(wd.damage*((a)/100.0)) ; if(flag.lh) wd.damage2= wd.damage2*(b)/100; }
//Adds dmg%. 100 = +100% (double) damage. 10 = +10% damage
-#define ATK_ADDRATE( a ) { wd.damage+= wd.damage*(a)/100 ; if(flag.lh) wd.damage2+= wd.damage2*(a)/100; }
-#define ATK_ADDRATE2( a , b ) { wd.damage+= wd.damage*(a)/100 ; if(flag.lh) wd.damage2+= wd.damage2*(b)/100; }
+#define ATK_ADDRATE( a ) { wd.damage+= (int)(wd.damage * ((a)/100.0)); if(flag.lh) wd.damage2+= (int)(wd.damage2*((a)/100.0)); }
+#define ATK_ADDRATE2( a , b ) { wd.damage+= (int)(wd.damage*((a)/100.0)); if(flag.lh) wd.damage2+= (int)(wd.damage*((b)/100.0)); }
//Adds an absolute value to damage. 100 = +100 damage
#define ATK_ADD( a ) { wd.damage+= a; if (flag.lh) wd.damage2+= a; }
#define ATK_ADD2( a , b ) { wd.damage+= a; if (flag.lh) wd.damage2+= b; }
@@ -2036,7 +2044,7 @@
status_set_hp(src, 1, 0);
break;
case PA_SACRIFICE:
- wd.damage = sstatus->max_hp* 9/100;
+ wd.damage = (int)(sstatus->max_hp* 0.09);
wd.damage2 = 0;
break;
#ifndef RENEWAL
@@ -2106,7 +2114,7 @@
i |= 16; // for ex. shuriken must not be influenced by DEX
}
wd.damage = battle_calc_base_damage(sstatus, &sstatus->rhw, sc, tstatus->size, sd, i);
- if (flag.lh)
+ if (flag.lh)
wd.damage2 = battle_calc_base_damage(sstatus, &sstatus->lhw, sc, tstatus->size, sd, i);
if (nk&NK_SPLASHSPLIT) { // Divide ATK among targets
@@ -3167,13 +3175,13 @@
* Formula: (1+(900-def1)/9)%
**/
if (def1 > 900) def1 = 900;
- ATK_RATE2(
+ ATK_RATE3(
flag.idef ?100:(flag.pdef ?(int)(flag.pdef *(def1+vit_def)):(1+(900-def1)/9)),
flag.idef2?100:(flag.pdef2?(int)(flag.pdef2*(def1+vit_def)):(1+(900-def1)/9))
);
#else
if (def1 > 100) def1 = 100;
- ATK_RATE2(
+ ATK_RATE3(
flag.idef ?100:(flag.pdef ?(int)(flag.pdef *(def1+vit_def)):(100-def1)),
flag.idef2?100:(flag.pdef2?(int)(flag.pdef2*(def1+vit_def)):(100-def1))
);
@@ -3357,22 +3365,26 @@
flag.lh=0;
} else if (flag.rh && flag.lh) { //Dual-wield
if (wd.damage) {
- if ((skill = pc_checkskill(sd,AS_RIGHT)))
- wd.damage = wd.damage * (50 + (skill * 10))/100;
- else if ((skill = pc_checkskill(sd,KO_RIGHT)))
- wd.damage = wd.damage * (70 + (skill * 10))/100;
+ if ((skill = pc_checkskill(sd,AS_RIGHT))){
+ ATK_RATE1(50 + (skill * 10)); }
+ else if ((skill = pc_checkskill(sd,KO_RIGHT))){
+ ATK_RATE1(70 + (skill * 10)); }
if (wd.damage < 1) wd.damage = 1;
}
if (wd.damage2) {
if ((skill = pc_checkskill(sd,AS_LEFT)))
- wd.damage2 = wd.damage2 * (30 + (skill * 10))/100;
- else if ((skill = pc_checkskill(sd,KO_LEFT)))
- wd.damage2 = wd.damage2 * (50 + (skill * 10))/100;
- if (wd.damage2 < 1) wd.damage2 = 1;
+ {
+ ATK_RATE2(30 + (skill * 10));
+ }
+ else if ((skill = pc_checkskill(sd,KO_LEFT)))
+ {
+ ATK_RATE2(50 + (skill * 10));
+ }
+ if (wd.damage2 < 1) wd.damage2 = 1;
}
} else if (sd->status.weapon == W_KATAR && !skill_num) { //Katars (offhand damage only applies to normal attacks, tested on Aegis 10.2)
skill = pc_checkskill(sd,TF_DOUBLE);
- wd.damage2 = wd.damage * (1 + (skill * 2))/100;
+ ATK_RATE2(1 + (skill * 2));
if (wd.damage && !wd.damage2) wd.damage2 = 1;
flag.lh = 1;
@@ -3406,7 +3418,7 @@
wd.damage = battle_calc_gvg_damage(src,target,wd.damage,wd.div_,skill_num,skill_lv,wd.flag);
else if (map[target->m].flag.battleground)
wd.damage = battle_calc_bg_damage(src,target,wd.damage,wd.div_,skill_num,skill_lv,wd.flag);
- wd.damage2 = (d2*100/d1)*wd.damage/100;
+ wd.damage2 = (int)(((int)(d2*(100.0/d1)))*(wd.damage/100.0));
if (wd.damage > 1 && wd.damage2 < 1) wd.damage2 = 1;
wd.damage-=wd.damage2;
}
@@ -3420,7 +3432,7 @@
)) &&
rnd()%100 < tsc->data[SC_REJECTSWORD]->val2
) {
- wd.damage = wd.damage * 50 / 100;
+ wd.damage >>= 1;
status_fix_damage(target,src,wd.damage,clif_damage(target,src,gettick(),0,0,wd.damage,0,0,0));
clif_skill_nodamage(target,target,ST_REJECTSWORD,tsc->data[SC_REJECTSWORD]->val1,1);
if (--(tsc->data[SC_REJECTSWORD]->val3) <= 0)
@@ -3568,9 +3580,9 @@
if (!flag.infdef) { //No need to do the math for plants
//MATK_RATE scales the damage. 100 = no change. 50 is halved, 200 is doubled, etc
-#define MATK_RATE( a ) { ad.damage= ad.damage*(a)/100; }
+#define MATK_RATE( a ) { ad.damage= (int)(ad.damage*((a)/100.0)); }
//Adds dmg%. 100 = +100% (double) damage. 10 = +10% damage
-#define MATK_ADDRATE( a ) { ad.damage+= ad.damage*(a)/100; }
+#define MATK_ADDRATE( a ) { ad.damage+= (int)(ad.damage*((a)/100.0)); }
//Adds an absolute value to damage. 100 = +100 damage
#define MATK_ADD( a ) { ad.damage+= a; }
@@ -4071,12 +4083,12 @@
* Damage = Magic Attack * 111.5/(111.5+eMDEF) - sMDEF
**/
if (mdef < -111) mdef = -111; // value smaller -111 brings back the damage to origin up to -223.
- ad.damage = ad.damage * 1115 / (1115 + mdef * 10) - mdef2;
+ ad.damage = ((int)(ad.damage * (1115.0 / (1115 + mdef * 10)))) - mdef2;
#else
if (battle_config.magic_defense_type)
ad.damage = ad.damage - mdef*battle_config.magic_defense_type - mdef2;
else
- ad.damage = ad.damage * (100-mdef)/100 - mdef2;
+ ad.damage = ((int)(ad.damage * ((100-mdef)/100.0))) - mdef2;
#endif
}
@@ -4101,7 +4113,7 @@
ad.damage = battle_attr_fix(src, target, wd.damage + ad.damage, s_ele, tstatus->def_ele, tstatus->ele_lv) * (100 + 40*skill_lv)/100;
if (src == target) {
if (src->type == BL_PC)
- ad.damage = ad.damage/2;
+ ad.damage >>= 1; //ad.damage/2;
else
ad.damage = 0;
}
@@ -4248,14 +4260,10 @@
break;
case CR_ACIDDEMONSTRATION: // updated the formula based on a Japanese formula found to be exact [Reddozen]
if (tstatus->vit+sstatus->int_) //crash fix
- md.damage = (int)((int64)7*tstatus->vit*sstatus->int_*sstatus->int_ / (10*(tstatus->vit+sstatus->int_)));
+ md.damage = (int)(7*tstatus->vit*sstatus->int_*(sstatus->int_ / (10.0*(tstatus->vit+sstatus->int_))));
else
md.damage = 0;
if (tsd) md.damage>>=1;
- if (md.damage < 0 || md.damage > INT_MAX>>1)
- //Overflow prevention, will anyone whine if I cap it to a few billion?
- //Not capped to INT_MAX to give some room for further damage increase.
- md.damage = INT_MAX>>1;
break;
case NJ_ZENYNAGE:
case KO_MUCHANAGE:
@@ -4265,13 +4273,13 @@
if (is_boss(target))
md.damage=md.damage / (skill_num==NJ_ZENYNAGE?3:2);
else if (tsd) // need confirmation for KO_MUCHANAGE
- md.damage=md.damage/2;
+ md.damage >>=1; //md.damage/2;
break;
case GS_FLING:
md.damage = sd?sd->status.job_level:status_get_lv(src);
break;
case HVAN_EXPLOSION: //[orn]
- md.damage = sstatus->max_hp * (50 + 50 * skill_lv) / 100 ;
+ md.damage = (int)(sstatus->max_hp * ((50 + 50 * skill_lv) / 100.0));
break ;
case ASC_BREAKER:
md.damage = 500+rnd()%500 + 5*skill_lv * sstatus->int_;
@@ -4287,7 +4295,7 @@
case RK_DRAGONBREATH:
md.damage = ((status_get_hp(src) / 50) + (status_get_max_sp(src) / 4)) * skill_lv;
RE_LVL_MDMOD(150);
- if (sd) md.damage = md.damage * (100 + 5 * (pc_checkskill(sd,RK_DRAGONTRAINING) - 1)) / 100;
+ if (sd) md.damage = (int)(md.damage * ((100 + 5 * (pc_checkskill(sd,RK_DRAGONTRAINING) - 1)) / 100.0));
md.flag |= BF_LONG|BF_WEAPON;
break;
/**
@@ -4321,7 +4329,7 @@
case KO_HAPPOKUNAI: {
struct Damage wd = battle_calc_weapon_attack(src,target,skill_num,skill_lv,mflag);
short totaldef = tstatus->def2 + (short)status_get_def(target);
- md.damage = wd.damage * 60 * (5 + skill_lv) / 100;
+ md.damage = (int)(wd.damage * (60 * (5 + skill_lv) / 100.0));
md.damage -= totaldef;
}
break;