From db1f65c3ed119044754d1a4deefc6cf36461554b Mon Sep 17 00:00:00 2001 From: ultramage Date: Tue, 16 Oct 2007 23:24:39 +0000 Subject: * Venom Splasher fixes according to bugreport:230 - added passive skillv*30% bonus from Poison React - added official splash damage calculation - damage gets split by the number of targets at range 1, then applied to all targets in range 2 - reverted some very old code - clif_calc_delay() - that was preventing skills from displaying properly, by erroneously assuming that if the target has ddelay 0, it has endure effect activated - TODO: the skill should not consume a gemstone when it fails git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@11494 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/battle.c | 6 +++--- src/map/clif.c | 12 ++++-------- src/map/skill.c | 11 ++++++----- 3 files changed, 13 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/map/battle.c b/src/map/battle.c index 1d0cbd046..eade2f167 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -1464,9 +1464,9 @@ static struct Damage battle_calc_weapon_attack( skillratio += 100+100*skill_lv; break; case AS_SPLASHER: - i = 400+50*skill_lv; - if (wflag>1) i /= 4; // FIXME: Should be 25% of damage inflicted to target, not 25% of skillratio bonus - skillratio += i; + skillratio += 400+50*skill_lv; + if(sd) + skillratio += 30 * pc_checkskill(sd,AS_POISONREACT); break; case ASC_BREAKER: skillratio += 100*skill_lv-100; diff --git a/src/map/clif.c b/src/map/clif.c index bb5d2a7ec..02bfe2e95 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -3712,9 +3712,6 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl) } } -//Modifies the type of damage according to status changes [Skotlex] -#define clif_calc_delay(type,delay) (type==1||type==4||type==0x0a)?type:(delay==0?9:type) - /*========================================== * Estimates walk delay based on the damage criteria. [Skotlex] *------------------------------------------*/ @@ -3758,10 +3755,10 @@ int clif_damage(struct block_list* src, struct block_list* dst, unsigned int tic nullpo_retr(0, src); nullpo_retr(0, dst); - type = clif_calc_delay(type, ddelay); //Type defaults to 0 for normal attacks. - sc = status_get_sc(dst); if(sc && sc->count) { + if(type != 4 && dst->type == BL_PC && sc->data[SC_ENDURE].timer != -1 && !map_flag_gvg(dst->m)) + type = 9; if(sc->data[SC_HALLUCINATION].timer != -1) { if(damage > 0) damage = damage*(5+sc->data[SC_HALLUCINATION].val1) + rand()%100; if(damage2 > 0) damage2 = damage2*(5+sc->data[SC_HALLUCINATION].val1) + rand()%100; @@ -4329,11 +4326,10 @@ int clif_skill_damage(struct block_list *src,struct block_list *dst,unsigned int nullpo_retr(0, src); nullpo_retr(0, dst); - if( type == 0 ) type = skill_get_hit(skill_id); - type = clif_calc_delay(type, ddelay); sc = status_get_sc(dst); - if(sc && sc->count) { + if(type != 4 && dst->type == BL_PC && sc->data[SC_ENDURE].timer != -1 && !map_flag_gvg(dst->m)) + type = 9; if(sc->data[SC_HALLUCINATION].timer != -1 && damage > 0) damage = damage*(5+sc->data[SC_HALLUCINATION].val1) + rand()%100; } diff --git a/src/map/skill.c b/src/map/skill.c index c1617ab06..2d3f83ee1 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -3126,8 +3126,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int // if skill damage should be split among targets, count them //SD_LEVEL -> Forced splash damage for Auto Blitz-Beat -> count targets + //special case: Venom Splasher uses a different range for searching than for splashing if( flag&SD_LEVEL || skill_get_nk(skillid)&NK_SPLASHSPLIT ) - skill_area_temp[0] = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skillid, skilllv), BL_CHAR, src, skillid, skilllv, tick, BCT_ENEMY, skill_area_sub_count); + skill_area_temp[0] = map_foreachinrange(skill_area_sub, bl, (skillid == AS_SPLASHER)?1:skill_get_splash(skillid, skilllv), BL_CHAR, src, skillid, skilllv, tick, BCT_ENEMY, skill_area_sub_count); // recursive invocation of skill_castend_damage_id() with flag|1 map_foreachinrange(skill_area_sub, bl, skill_get_splash(skillid, skilllv), splash_target(src), src, skillid, skilllv, tick, flag|BCT_ENEMY|1, skill_castend_damage_id); @@ -5256,8 +5257,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in return 1; } clif_skill_nodamage(src,bl,skillid,skilllv, - sc_start4(bl,type,100, - skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000)); + sc_start4(bl,type,100,skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000)); + if (sd) skill_blockpc_start (sd, skillid, skill_get_time(skillid, skilllv)+3000); break; case PF_MINDBREAKER: @@ -5938,9 +5939,9 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data) map_freeblock_unlock(); return 1; } while(0); + //Skill failed. - if (ud->skillid == MO_EXTREMITYFIST && sd && - !(sc && sc->count && sc->data[SC_FOGWALL].timer != -1)) + if (ud->skillid == MO_EXTREMITYFIST && sd && !(sc && sc->count && sc->data[SC_FOGWALL].timer != -1)) { //When Asura fails... (except when it fails from Fog of Wall) //Consume SP/spheres skill_check_condition(sd,ud->skillid, ud->skilllv,1); -- cgit v1.2.3-70-g09d2