From 2eec605a3bbdf6ec0292e97692b2ffb8790ab227 Mon Sep 17 00:00:00 2001 From: rud0lp20 Date: Sat, 29 Dec 2012 20:51:38 +0000 Subject: Fixed bugreport:6074 updated Renewal Def and MDef damage reduction formula. Special thanks to KyleZ. Fixed bugreport:7028 where damage bonus of SR_GATEOFHELL has interchange with normal damage bonus. Fixed bugreport:6946 where CH_PALMSTRIKE causes damage when caster hides after casting. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@17062 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/battle.c | 61 +++++++++++++++++++++++++++++++++++--------------------- src/map/pc.c | 6 +++++- src/map/pc.h | 1 + src/map/skill.c | 4 +++- 4 files changed, 47 insertions(+), 25 deletions(-) (limited to 'src/map') diff --git a/src/map/battle.c b/src/map/battle.c index 9fb46bfff..aab2ad3eb 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -2981,9 +2981,9 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo case SR_GATEOFHELL: ATK_ADD (sstatus->max_hp - status_get_hp(src)); if(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE){ - ATK_ADD ( ((int64)sstatus->sp * (1 + skill_lv * 2 / 10)) + 10 * status_get_lv(src) ); - }else{ ATK_ADD ( ((int64)sstatus->max_sp * (1 + skill_lv * 2 / 10)) + 40 * status_get_lv(src) ); + }else{ + ATK_ADD ( ((int64)sstatus->sp * (1 + skill_lv * 2 / 10)) + 10 * status_get_lv(src) ); } break; case SR_TIGERCANNON: // (Tiger Cannon skill level x 240) + (Target Base Level x 40) @@ -3173,47 +3173,64 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo } //Vitality reduction from rodatazone: http://rodatazone.simgaming.net/mechanics/substats.php#def if (tsd) //Sd vit-eq - { //[VIT*0.5] + rnd([VIT*0.3], max([VIT*0.3],[VIT^2/150]-1)) + { +#ifndef RENEWAL + //[VIT*0.5] + rnd([VIT*0.3], max([VIT*0.3],[VIT^2/150]-1)) vit_def = def2*(def2-15)/150; vit_def = def2/2 + (vit_def>0?rnd()%vit_def:0); - +#else + vit_def = def2; +#endif if((battle_check_undead(sstatus->race,sstatus->def_ele) || sstatus->race==RC_DEMON) && //This bonus already doesnt work vs players src->type == BL_MOB && (skill=pc_checkskill(tsd,AL_DP)) > 0) vit_def += skill*(int)(3 +(tsd->status.base_level+1)*0.04); // submitted by orn if( src->type == BL_MOB && (skill=pc_checkskill(tsd,RA_RANGERMAIN))>0 && (sstatus->race == RC_BRUTE || sstatus->race == RC_FISH || sstatus->race == RC_PLANT) ) vit_def += skill*5; - } else { //Mob-Pet vit-eq + } + else { //Mob-Pet vit-eq +#ifndef RENEWAL //VIT + rnd(0,[VIT/20]^2-1) vit_def = (def2/20)*(def2/20); vit_def = def2 + (vit_def>0?rnd()%vit_def:0); +#else + vit_def = def2; +#endif } + if (battle_config.weapon_defense_type) { vit_def += def1*battle_config.weapon_defense_type; def1 = 0; } #ifdef RENEWAL - /** - * In Renewal 100% damage reduction is 900 DEF - * Formula: (1+(900-def1)/9)% - **/ - if (def1 > 900) def1 = 900; - ATK_RATE2( - flag.idef ?100:(flag.pdef ? (flag.pdef*(def1+vit_def)) : (1+(900-def1)/9)), - flag.idef2?100:(flag.pdef2 ? (flag.pdef2*(def1+vit_def)) : (1+(900-def1)/9)) - ); + /** + * RE DEF Reduction + * Damage = Attack * (4000+eDEF)/(4000+eDEF) - sDEF + * Icepick no longer bypasses defense, but gains 1 atk per def + **/ + + ATK_ADD2( + flag.pdef ?(def1+vit_def):0, + flag.pdef2?(def1+vit_def):0 + ); + if (!flag.idef || !flag.idef2){ + wd.damage = wd.damage * (4000+def1) / (4000+10*def1) - vit_def; + if(flag.lh) + wd.damage2 = wd.damage2 * (4000+def1) / (4000+10*def1) - vit_def; + } + #else if (def1 > 100) def1 = 100; ATK_RATE2( flag.idef ?100:(flag.pdef ? (flag.pdef*(def1+vit_def)) : (100-def1)), flag.idef2?100:(flag.pdef2? (flag.pdef2*(def1+vit_def)) : (100-def1)) ); + ATK_ADD2( + flag.idef ||flag.pdef ?0:-vit_def, + flag.idef2||flag.pdef2?0:-vit_def + ); #endif - ATK_ADD2( - flag.idef ||flag.pdef ?0:-vit_def, - flag.idef2||flag.pdef2?0:-vit_def - ); } //Post skill/vit reduction damage increases @@ -4055,12 +4072,10 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list } #ifdef RENEWAL /** - * RE MDEF Reduction (from doddler:?title=Renewal_Changes#MDEF) - * Damage from magic = Magic Attack * 111.5/(111.5+eMDEF) - * Damage = Magic Attack * 111.5/(111.5+eMDEF) - sMDEF + * RE MDEF Reduction + * Damage = Magic Attack * (1000+eMDEF)/(1000+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 = ad.damage * (1000 + mdef) / (1000 + mdef * 10) - mdef2; #else if(battle_config.magic_defense_type) ad.damage = ad.damage - mdef*battle_config.magic_defense_type - mdef2; diff --git a/src/map/pc.c b/src/map/pc.c index 1f7697b0d..c7c9d7114 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -2057,8 +2057,12 @@ int pc_bonus(struct map_session_data *sd,int type,int val) break; case SP_BASE_ATK: if(sd->state.lr_flag != 2) { +//#ifdef RENEWAL +// sd->bonus.eatk += val; +//#else bonus = status->batk + val; status->batk = cap_value(bonus, 0, USHRT_MAX); +//#endif } break; case SP_DEF1: @@ -2592,7 +2596,7 @@ int pc_bonus(struct map_session_data *sd,int type,int val) if(sd->state.lr_flag != 2) sd->bonus.itemhealrate2 += val; break; - case SP_EMATK: + case SP_EMATK: if(sd->state.lr_flag != 2) sd->bonus.ematk += val; break; diff --git a/src/map/pc.h b/src/map/pc.h index 9b7a3b964..e04602b99 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -320,6 +320,7 @@ struct map_session_data { unsigned short unstripable_equip; int fixcastrate,varcastrate; int ematk; // matk bonus from equipment +// int eatk; // atk bonus from equipment } bonus; // zeroed vars end here. diff --git a/src/map/skill.c b/src/map/skill.c index e2dc2c03b..ece45ce92 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -3282,7 +3282,9 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data) case CH_PALMSTRIKE: { struct status_change* tsc = status_get_sc(target); - if( tsc && tsc->option&OPTION_HIDE ){ + struct status_change* sc = status_get_sc(src); + if( tsc && tsc->option&OPTION_HIDE || + sc && sc->option&OPTION_HIDE ){ skill_blown(src,target,skill_get_blewcount(skl->skill_id, skl->skill_lv), -1, 0x0 ); break; } -- cgit v1.2.3-70-g09d2