summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/map/battle.c76
1 files changed, 66 insertions, 10 deletions
diff --git a/src/map/battle.c b/src/map/battle.c
index cb470f938..2482da47c 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -3202,17 +3202,67 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
if (battle_check_undead(tstatus->race,tstatus->def_ele))
skillratio += 5*skill_lv;
break;
- case MG_FIREWALL:
- skillratio -= 50;
+ case MG_FIREWALL: {
+ struct status_change *sc = status_get_sc(src);
+ skillratio -= 50;
+ if( sc && sc->data[SC_PYROTECHNIC_OPTION] )
+ skillratio += skillratio * sc->data[SC_PYROTECHNIC_OPTION]->val3 / 100;
+ }
break;
- /**
- * in Renewal Thunder Storm boost is 100% (in pre-re, 80%)
- **/
- #ifndef RENEWAL
- case MG_THUNDERSTORM:
- skillratio -= 20;
+ case MG_COLDBOLT: {
+ struct status_change *sc = status_get_sc(src);
+ if ( sc && sc->count ) {
+ if ( sc->data[SC_SPELLFIST] && (!sd || !sd->state.autocast) ) {
+ skillratio += (sc->data[SC_SPELLFIST]->val4 * 100) + (sc->data[SC_SPELLFIST]->val2 * 100) - 100;// val4 = used bolt level, val2 = used spellfist level. [Rytech]
+ ad.div_ = 1;// ad mods, to make it work similar to regular hits [Xazax]
+ ad.flag = BF_WEAPON|BF_SHORT;
+ ad.type = 0;
+ }
+ if( sc->data[SC_AQUAPLAY_OPTION] )
+ skillratio += skillratio * sc->data[SC_AQUAPLAY_OPTION]->val3 / 100;
+ }
+ }
+ break;
+ case MG_FIREBOLT: {
+ struct status_change *sc = status_get_sc(src);
+ if ( sc && sc->count ) {
+ if ( sc->data[SC_SPELLFIST] && (!sd || !sd->state.autocast) ) {
+ skillratio += (sc->data[SC_SPELLFIST]->val4 * 100) + (sc->data[SC_SPELLFIST]->val2 * 100) - 100;
+ ad.div_ = 1;
+ ad.flag = BF_WEAPON|BF_SHORT;
+ ad.type = 0;
+ }
+ if( sc->data[SC_PYROTECHNIC_OPTION] )
+ skillratio += skillratio * sc->data[SC_PYROTECHNIC_OPTION]->val3 / 100;
+ }
+ }
+ break;
+ case MG_LIGHTNINGBOLT: {
+ struct status_change *sc = status_get_sc(src);
+ if ( sc && sc->count ) {
+ if ( sc->data[SC_SPELLFIST] && (!sd || !sd->state.autocast) ) {
+ skillratio += (sc->data[SC_SPELLFIST]->val4 * 100) + (sc->data[SC_SPELLFIST]->val2 * 100) - 100;
+ ad.div_ = 1;
+ ad.flag = BF_WEAPON|BF_SHORT;
+ ad.type = 0;
+ }
+ if( sc->data[SC_GUST_OPTION] )
+ skillratio += skillratio * sc->data[SC_GUST_OPTION]->val2 / 100;
+ }
+ }
+ break;
+ case MG_THUNDERSTORM: {
+ struct status_change *sc = status_get_sc(src);
+ /**
+ * in Renewal Thunder Storm boost is 100% (in pre-re, 80%)
+ **/
+ #ifndef RENEWAL
+ skillratio -= 20;
+ #endif
+ if( sc && sc->data[SC_GUST_OPTION] )
+ skillratio += skillratio * sc->data[SC_GUST_OPTION]->val2 / 100;
+ }
break;
- #endif
case MG_FROSTDIVER:
skillratio += 10*skill_lv;
break;
@@ -4285,11 +4335,17 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
wd = battle_calc_attack(BF_WEAPON, src, target, 0, 0, flag);
- if(sc) {
+ if( sc && sc->count ) {
if (sc->data[SC_EXEEDBREAK]) {
wd.damage = wd.damage * sc->data[SC_EXEEDBREAK]->val1 / 100;
status_change_end(src, SC_EXEEDBREAK, INVALID_TIMER);
}
+ if( sc->data[SC_SPELLFIST] ) {
+ if( --(sc->data[SC_SPELLFIST]->val1) >= 0 )
+ wd = battle_calc_attack(BF_MAGIC,src,target,sc->data[SC_SPELLFIST]->val3,sc->data[SC_SPELLFIST]->val4,flag);
+ else
+ status_change_end(src,SC_SPELLFIST,-1);
+ }
if( sc->data[SC_GIANTGROWTH] && (wd.flag&BF_SHORT) && rand()%100 < sc->data[SC_GIANTGROWTH]->val2 )
wd.damage *= 3; // Triple Damage
}