diff options
author | rud0lp20 <rud0lp20@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2012-07-23 15:00:12 +0000 |
---|---|---|
committer | rud0lp20 <rud0lp20@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2012-07-23 15:00:12 +0000 |
commit | 98cabc236656a475473c7b4c07a81210a1eb9541 (patch) | |
tree | 4fadf225f15bce90e3924f60da00997b0e5b28bc /src/map/status.c | |
parent | 211a15e56f8ec2344790421930024d2eb401f291 (diff) | |
download | hercules-98cabc236656a475473c7b4c07a81210a1eb9541.tar.gz hercules-98cabc236656a475473c7b4c07a81210a1eb9541.tar.bz2 hercules-98cabc236656a475473c7b4c07a81210a1eb9541.tar.xz hercules-98cabc236656a475473c7b4c07a81210a1eb9541.zip |
Updated most Ranger skills to its official behavior and damage formula.(bugreport:5272, bugreport:6249, bugreport:5548, bugreport:5888)
Fixed issues with traps: (bugreport:5906)
- if RA_REASERCHTRAP is learned Alloy Traps can now be used to Hunter traps.
- if Hunter traps expire it will now return either Booby Trap or Alloy Trap depending on item used.
- some traps should now give full damage to plants.
- update list of skills that can hit/damage/affect traps.
- damage through skills can now be shown when hitting traps.
- proper knock back behaviors
- proper animation when triggers and triggering of item bonus script 'bHPDrainRate'
Fixed an issues where some skills cannot damage UNT_REVERBERATION/UNT_POEMOFNETHERWORLD and doesn't deal 1 damage
Updated some official behavior where informational must shown when hitting, targeting, casting skills to targets.
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@16483 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/status.c')
-rw-r--r-- | src/map/status.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/src/map/status.c b/src/map/status.c index f6a5e5997..541123050 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -569,7 +569,7 @@ void initChangeTables(void) { set_sc( RA_FEARBREEZE , SC_FEARBREEZE , SI_FEARBREEZE , SCB_NONE ); set_sc( RA_ELECTRICSHOCKER , SC_ELECTRICSHOCKER , SI_ELECTRICSHOCKER , SCB_NONE ); set_sc( RA_WUGDASH , SC_WUGDASH , SI_WUGDASH , SCB_SPEED ); - set_sc( RA_CAMOUFLAGE , SC_CAMOUFLAGE , SI_CAMOUFLAGE , SCB_CRI|SCB_SPEED ); + set_sc( RA_CAMOUFLAGE , SC_CAMOUFLAGE , SI_CAMOUFLAGE , SCB_SPEED ); add_sc( RA_MAGENTATRAP , SC_ELEMENTALCHANGE ); add_sc( RA_COBALTTRAP , SC_ELEMENTALCHANGE ); add_sc( RA_MAIZETRAP , SC_ELEMENTALCHANGE ); @@ -982,6 +982,7 @@ void initChangeTables(void) { StatusChangeStateTable[SC_CURSEDCIRCLE_TARGET] |= SCS_NOMOVE; StatusChangeStateTable[SC_CRYSTALIZE] |= SCS_NOMOVE|SCS_NOMOVECOND; StatusChangeStateTable[SC_NETHERWORLD] |= SCS_NOMOVE; + StatusChangeStateTable[SC_CAMOUFLAGE] |= SCS_NOMOVE|SCS_NOMOVECOND; /* StatusChangeState (SCS_) NOPICKUPITEMS */ StatusChangeStateTable[SC_HIDING] |= SCS_NOPICKITEM; @@ -3415,6 +3416,8 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, enum sc || (sc->data[SC_CLOAKING] && //Need wall at level 1-2 sc->data[SC_CLOAKING]->val1 < 3 && !(sc->data[SC_CLOAKING]->val4&1)) || (sc->data[SC_CRYSTALIZE] && bl->type != BL_MOB) + || (sc->data[SC_CAMOUFLAGE] && sc->data[SC_CAMOUFLAGE]->val1 < 3 + && !(sc->data[SC_CAMOUFLAGE]->val3&1)) ) { sc->cant.move += ( start ? 1 : -1 ); } @@ -4487,8 +4490,6 @@ static signed short status_calc_critical(struct block_list *bl, struct status_ch critical += sc->data[SC_STRIKING]->val1; if(sc->data[SC__INVISIBILITY]) critical += critical * sc->data[SC__INVISIBILITY]->val3 / 100; - if(sc->data[SC_CAMOUFLAGE]) - critical += 100; if(sc->data[SC__UNLUCKY]) critical -= critical * sc->data[SC__UNLUCKY]->val2 / 100; #ifdef RENEWAL @@ -4929,7 +4930,7 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha if( sc->data[SC_MARSHOFABYSS] ) val = max( val, 40 + 10 * sc->data[SC_MARSHOFABYSS]->val1 ); if( sc->data[SC_CAMOUFLAGE] && (sc->data[SC_CAMOUFLAGE]->val3&1) == 0 ) - val = max( val, sc->data[SC_CAMOUFLAGE]->val1 < 3 ? 300 : 25 * (6 - sc->data[SC_CAMOUFLAGE]->val1) ); + val = max( val, sc->data[SC_CAMOUFLAGE]->val1 < 3 ? 0 : 25 * (5 - sc->data[SC_CAMOUFLAGE]->val1) ); if( sc->data[SC__GROOMY] ) val = max( val, sc->data[SC__GROOMY]->val2); if( sc->data[SC_STEALTHFIELD_MASTER] ) @@ -6028,14 +6029,14 @@ int status_get_sc_def(struct block_list *bl, enum sc_type type, int rate, int ti case SC_OBLIVIONCURSE: // 100% - (100 - 0.8 x INT) sc_def = 100 - ( 100 - status->int_* 8 / 10 ); sc_def = max(sc_def, 5); // minimum of 5% + break; + case SC_BITE: // {(Base Success chance) - (Target's AGI / 4)} + rate -= status->agi*1000/4; + rate = max(rate,50000); // minimum of 50% break; case SC_ELECTRICSHOCKER: - case SC_BITE: { - if( bl->type == BL_MOB ) - tick -= 1000 * (status->agi/10); - if( sd && type != SC_ELECTRICSHOCKER ) - tick >>= 1; - } + if( bl->type == BL_MOB ) + tick -= 1000 * (status->agi/10); break; case SC_CRYSTALIZE: tick -= (1000*(status->vit/10))+(status_get_lv(bl)/50); @@ -7836,7 +7837,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val tick_time = 1000; // [GodLesZ] tick time break; case SC_CAMOUFLAGE: - //val3 |= battle_config.pc_camouflage_check_type&7; + val4 = tick/1000; tick_time = 1000; // [GodLesZ] tick time break; case SC_WUGDASH: @@ -9874,10 +9875,12 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data) break; case SC_CAMOUFLAGE: - if( !status_charge(bl,0,7 - sce->val1) ) - break; - sc_timer_next(1000 + tick, status_change_timer, bl->id, data); - return 0; + if(--(sce->val4) > 0){ + status_charge(bl,0,7 - sce->val1); + sc_timer_next(1000 + tick, status_change_timer, bl->id, data); + return 0; + } + break; case SC__REPRODUCE: if(!status_charge(bl, 0, 1)) |