From 1261d92c43f0e410333f9c48c6bc0dd4f2274968 Mon Sep 17 00:00:00 2001 From: aleos Date: Tue, 11 Apr 2017 21:17:23 -0400 Subject: [PATCH] Corrected Feint Bomb behavior (fixes #1999) * Feint Bomb will no longer give players permanent effects of AoE when they backslide into them. * Feint Bomb no longer consumes 1 SP every second while hidden. * Stealth Field will now apply to all targets, not just allies (party + guildmates). * Miscellaneous cleanups for Neutral Barrier and Stealth Field. Thanks to @feltenc! --- db/pre-re/skill_unit_db.txt | 2 +- db/re/skill_unit_db.txt | 2 +- src/map/pc.h | 2 +- src/map/status.c | 28 ++++++---------------------- 4 files changed, 9 insertions(+), 25 deletions(-) diff --git a/db/pre-re/skill_unit_db.txt b/db/pre-re/skill_unit_db.txt index a4a6f26fa0..270a3ad84a 100644 --- a/db/pre-re/skill_unit_db.txt +++ b/db/pre-re/skill_unit_db.txt @@ -127,7 +127,7 @@ 2254,0xd7, , 0, 1,1000,enemy, 0x8002 //RA_ICEBOUNDTRAP 2273,0xe2, , 2, 0, -1,all, 0x000 //NC_NEUTRALBARRIER -2274,0xe3, , 2, 0, -1,ally, 0x000 //NC_STEALTHFIELD +2274,0xe3, , 2, 0, -1,all, 0x000 //NC_STEALTHFIELD 2299,0xcc, , 0, 1,1000,all, 0x8006 //SC_MANHOLE 2300,0xcd, , 0, 0,1000,all, 0x8006 //SC_DIMENSIONDOOR diff --git a/db/re/skill_unit_db.txt b/db/re/skill_unit_db.txt index ff134a5698..0c6fa42464 100644 --- a/db/re/skill_unit_db.txt +++ b/db/re/skill_unit_db.txt @@ -128,7 +128,7 @@ 2254,0xd7, , 0, 1,1000,enemy, 0x8002 //RA_ICEBOUNDTRAP 2273,0xe2, , 2, 0, -1,all, 0x000 //NC_NEUTRALBARRIER -2274,0xe3, , 2, 0, -1,ally, 0x000 //NC_STEALTHFIELD +2274,0xe3, , 2, 0, -1,all, 0x000 //NC_STEALTHFIELD 2299,0xcc, , 0, 1,1000,all, 0x8006 //SC_MANHOLE 2300,0xcd, , 0, 0,1000,all, 0x8006 //SC_DIMENSIONDOOR diff --git a/src/map/pc.h b/src/map/pc.h index d00296186e..adf167e91b 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -878,7 +878,7 @@ struct { #define pc_isfalcon(sd) ( (sd)->sc.option&OPTION_FALCON ) #define pc_isriding(sd) ( (sd)->sc.option&OPTION_RIDING ) -#define pc_isinvisible(sd) ( (sd)->sc.option&OPTION_INVISIBLE ) +#define pc_isinvisible(sd) ( (sd)->sc.option&OPTION_INVISIBLE && !((sd)->sc.data && (sd)->sc.data[SC__FEINTBOMB]) ) #define pc_is50overweight(sd) ( (sd)->weight*100 >= (sd)->max_weight*battle_config.natural_heal_weight_rate ) #define pc_is90overweight(sd) ( (sd)->weight*10 >= (sd)->max_weight*9 ) diff --git a/src/map/status.c b/src/map/status.c index d804a85968..b28c46e8f9 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -682,7 +682,7 @@ void initChangeTables(void) set_sc( NC_ANALYZE , SC_ANALYZE , SI_ANALYZE , SCB_DEF|SCB_DEF2|SCB_MDEF|SCB_MDEF2 ); set_sc( NC_MAGNETICFIELD , SC_MAGNETICFIELD , SI_MAGNETICFIELD , SCB_NONE ); set_sc( NC_NEUTRALBARRIER , SC_NEUTRALBARRIER , SI_NEUTRALBARRIER , SCB_DEF|SCB_MDEF ); - set_sc( NC_STEALTHFIELD , SC_STEALTHFIELD , SI_STEALTHFIELD , SCB_NONE ); + set_sc( NC_STEALTHFIELD , SC_STEALTHFIELD , SI_STEALTHFIELD , SCB_SPEED ); /* Royal Guard */ set_sc( LG_REFLECTDAMAGE , SC_REFLECTDAMAGE , SI_LG_REFLECTDAMAGE , SCB_NONE ); @@ -1188,7 +1188,6 @@ void initChangeTables(void) StatusChangeFlagTable[SC_MERC_SPUP] |= SCB_MAXSP; StatusChangeFlagTable[SC_MERC_HITUP] |= SCB_HIT; - StatusChangeFlagTable[SC_STEALTHFIELD_MASTER] |= SCB_SPEED; StatusChangeFlagTable[SC_HALLUCINATIONWALK_POSTDELAY] |= SCB_SPEED|SCB_ASPD; StatusChangeFlagTable[SC_PARALYSE] |= SCB_FLEE|SCB_SPEED|SCB_ASPD; StatusChangeFlagTable[SC_DEATHHURT] |= SCB_REGEN; @@ -6425,7 +6424,7 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc, if(sc->data[SC_BURNING]) mdef -= 25 * mdef / 100; if( sc->data[SC_NEUTRALBARRIER] ) - mdef += mdef * sc->data[SC_NEUTRALBARRIER]->val3 / 100; + mdef += mdef * sc->data[SC_NEUTRALBARRIER]->val2 / 100; if(sc->data[SC_ANALYZE]) mdef -= mdef * ( 14 * sc->data[SC_ANALYZE]->val1 ) / 100; if(sc->data[SC_SYMPHONYOFLOVER]) @@ -10207,12 +10206,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty sc_start(src,bl,SC_STRIPWEAPON,100,val1,tick); sc_start(src,bl,SC_STRIPSHIELD,100,val1,tick); break; - case SC__FEINTBOMB: - val2 = 1; // -1 SP each iteration - val4 = tick / 1000; - tick_time = 1000; - val_flag |= 1|2; - break; case SC_GN_CARTBOOST: if( val1 < 3 ) val2 = 50; @@ -10725,8 +10718,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val4 = 0; break; case SC_NEUTRALBARRIER: - val2 = 10 + val1 * 5; // Def - val3 = 10 + val1 * 5; // Mdef + val2 = 10 + val1 * 5; // Def/Mdef + tick = -1; break; /* Rebellion */ @@ -11161,7 +11154,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; case SC__FEINTBOMB: sc->option |= OPTION_INVISIBLE; - opt_flag = 2; + opt_flag |= 2|4; break; case SC_SIGHT: sc->option |= OPTION_SIGHT; @@ -12180,7 +12173,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const break; case SC__FEINTBOMB: sc->option &= ~OPTION_INVISIBLE; - opt_flag |= 2; + opt_flag |= 2|4; break; case SC_SIGHT: sc->option &= ~OPTION_SIGHT; @@ -12862,15 +12855,6 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data) sc_timer_next(1000 + tick, status_change_timer, bl->id, data); return 0; - case SC__FEINTBOMB: - if( --(sce->val4) >= 0) { - if( !status_charge(bl, 0, sce->val2) ) - break; - sc_timer_next(1000 + tick, status_change_timer, bl->id, data); - return 0; - } - break; - case SC_STRIKING: if( --(sce->val4) >= 0 ) { if( !status_charge(bl,0, sce->val3 ) )