From ca6e392f184c64701f6b1d99f5a47cf6c3d81a22 Mon Sep 17 00:00:00 2001 From: xantara Date: Sat, 4 Feb 2012 05:46:00 +0000 Subject: ` Fixed Guillotine Cross Poisons (bugreport:5275) -- Paralyze decreases attack speed, flee, and movement speed -- Death Hurt decreases the effectiveness of recovery -- Venom Bleed reduces max HP -- Oblivion Curse blocks natural SP recovery and skill use is denied ` Updated const.txt with the latest (renewal) statuses (SC_) values git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@15539 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/pc.c | 6 ++++++ src/map/skill.c | 18 +++++++++++++++++- src/map/status.c | 17 ++++++++++++----- 3 files changed, 35 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/map/pc.c b/src/map/pc.c index abdaf6671..bbd6c3da9 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -6570,6 +6570,12 @@ int pc_itemheal(struct map_session_data *sd,int itemid, int hp,int sp) hp -= hp * sd->sc.data[SC_CRITICALWOUND]->val2 / 100; sp -= sp * sd->sc.data[SC_CRITICALWOUND]->val2 / 100; } + + if (sd->sc.data[SC_DEATHHURT]) + { + hp -= hp * 20 / 100; + sp -= sp * 20 / 100; + } return status_heal(&sd->bl, hp, sp, 1); } diff --git a/src/map/skill.c b/src/map/skill.c index cacb29e04..f7abeb1ca 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -391,6 +391,8 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, int skill { if( sc->data[SC_CRITICALWOUND] && heal ) // Critical Wound has no effect on offensive heal. [Inkfish] hp -= hp * sc->data[SC_CRITICALWOUND]->val2/100; + if( sc->data[SC_DEATHHURT] && heal ) + hp -= hp * 20/100; if( sc->data[SC_INCHEALRATE] && skill_id != NPC_EVILLAND && skill_id != BA_APPLEIDUN ) hp += hp * sc->data[SC_INCHEALRATE]->val1/100; // Only affects Heal, Sanctuary and PotionPitcher.(like bHealPower) [Inkfish] } @@ -5633,6 +5635,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in hp -= hp * tsc->data[SC_CRITICALWOUND]->val2 / 100; sp -= sp * tsc->data[SC_CRITICALWOUND]->val2 / 100; } + if( tsc && tsc->data[SC_DEATHHURT] ) + { + hp -= hp * 20 / 100; + sp -= sp * 20 / 100; + } clif_skill_nodamage(src,bl,skillid,skilllv,1); if( hp > 0 || (skillid == AM_POTIONPITCHER && sp <= 0) ) clif_skill_nodamage(NULL,bl,AL_HEAL,hp,1); @@ -6296,6 +6303,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in hp -= hp * tsc->data[SC_CRITICALWOUND]->val2 / 100; sp -= sp * tsc->data[SC_CRITICALWOUND]->val2 / 100; } + if (tsc && tsc->data[SC_DEATHHURT]) + { + hp -= hp * 20 / 100; + sp -= sp * 20 / 100; + } if(hp > 0) clif_skill_nodamage(NULL,bl,AL_HEAL,hp,1); if(sp > 0) @@ -8597,7 +8609,11 @@ int skill_castend_map (struct map_session_data *sd, short skill_num, const char * Warlock **/ sd->sc.data[SC_WHITEIMPRISON] || - (sd->sc.data[SC_STASIS] && skill_stasis_check(&sd->bl, sd->sc.data[SC_STASIS]->val2, skill_num)) + (sd->sc.data[SC_STASIS] && skill_stasis_check(&sd->bl, sd->sc.data[SC_STASIS]->val2, skill_num)) || + /** + * Guillotine Cross + **/ + sd->sc.data[SC_OBLIVIONCURSE] )) { skill_failed(sd); return 0; diff --git a/src/map/status.c b/src/map/status.c index d15343d91..44fdb3401 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -812,6 +812,11 @@ void initChangeTables(void) StatusChangeFlagTable[SC_MERC_HPUP] |= SCB_MAXHP; StatusChangeFlagTable[SC_MERC_SPUP] |= SCB_MAXSP; StatusChangeFlagTable[SC_MERC_HITUP] |= SCB_HIT; + // Guillotine Cross Poison Effects + StatusChangeFlagTable[SC_PARALYSE] |= SCB_ASPD|SCB_FLEE|SCB_SPEED; + StatusChangeFlagTable[SC_DEATHHURT] |= SCB_REGEN; + StatusChangeFlagTable[SC_VENOMBLEED] |= SCB_MAXHP; + StatusChangeFlagTable[SC_OBLIVIONCURSE] |= SCB_REGEN; #if RE_EDP /** * In RE EDP increases your atk and weapon atk @@ -1399,7 +1404,8 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int (sc->data[SC_MARIONETTE] && skill_num != CG_MARIONETTE) || //Only skill you can use is marionette again to cancel it (sc->data[SC_MARIONETTE2] && skill_num == CG_MARIONETTE) || //Cannot use marionette if you are being buffed by another sc->data[SC_STEELBODY] || - sc->data[SC_BERSERK] + sc->data[SC_BERSERK] || + sc->data[SC_OBLIVIONCURSE] )) return 0; @@ -3074,12 +3080,11 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str regen->flag = 0; if ( - sc->data[SC_DANCING] + sc->data[SC_DANCING] || sc->data[SC_OBLIVIONCURSE] || sc->data[SC_MAXIMIZEPOWER] || ( (bl->type == BL_PC && ((TBL_PC*)bl)->class_&MAPID_UPPERMASK) == MAPID_MONK && (sc->data[SC_EXTREMITYFIST] || (sc->data[SC_EXPLOSIONSPIRITS] && (!sc->data[SC_SPIRIT] || sc->data[SC_SPIRIT]->val2 != SL_MONK))) ) - || sc->data[SC_MAXIMIZEPOWER] ) //No natural SP regen regen->flag &=~RGN_SP; @@ -4075,7 +4080,7 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change if(sc->data[SC_FEAR]) flee -= flee * 20 / 100; if(sc->data[SC_PARALYSE]) - flee -= flee / 10; // 10% Flee reduction + flee -= flee * 10 / 100; // 10% Flee reduction if(sc->data[SC_INFRAREDSCAN]) flee -= flee * 30 / 100; if( sc->data[SC__LAZINESS] ) @@ -4448,6 +4453,8 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha { if( sd && pc_iscarton(sd) ) speed += speed * (50 - 5 * pc_checkskill(sd,MC_PUSHCART)) / 100; + if( sc->data[SC_PARALYSE] ) + speed += speed * 50 / 100; if( speed_rate != 100 ) speed = speed * speed_rate / 100; if( sc->data[SC_STEELBODY] ) @@ -4576,7 +4583,7 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change * if( sc->data[SC_FIGHTINGSPIRIT] && sc->data[SC_FIGHTINGSPIRIT]->val2 ) aspd_rate -= sc->data[SC_FIGHTINGSPIRIT]->val2; if( sc->data[SC_PARALYSE] ) - aspd_rate += 100; + aspd_rate += aspd_rate * 10 / 100; if( sc->data[SC__BODYPAINT] ) aspd_rate += aspd_rate * (20 + 5 * sc->data[SC__BODYPAINT]->val1) / 100; if( sc->data[SC__INVISIBILITY] ) -- cgit v1.2.3-60-g2f50