summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorxantara <xantara@54d463be-8e91-2dee-dedb-b68131a5f0ec>2012-02-04 05:46:00 +0000
committerxantara <xantara@54d463be-8e91-2dee-dedb-b68131a5f0ec>2012-02-04 05:46:00 +0000
commitca6e392f184c64701f6b1d99f5a47cf6c3d81a22 (patch)
tree098b03abb777e816028c9e1e2270a392e6c33c9a /src
parent87cd1ffa303774588be237e68f82b43532452ec2 (diff)
downloadhercules-ca6e392f184c64701f6b1d99f5a47cf6c3d81a22.tar.gz
hercules-ca6e392f184c64701f6b1d99f5a47cf6c3d81a22.tar.bz2
hercules-ca6e392f184c64701f6b1d99f5a47cf6c3d81a22.tar.xz
hercules-ca6e392f184c64701f6b1d99f5a47cf6c3d81a22.zip
` 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
Diffstat (limited to 'src')
-rw-r--r--src/map/pc.c6
-rw-r--r--src/map/skill.c18
-rw-r--r--src/map/status.c17
3 files changed, 35 insertions, 6 deletions
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] )