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!
This commit is contained in:
aleos 2017-04-11 21:17:23 -04:00
parent 9af37d21b7
commit 1261d92c43
4 changed files with 9 additions and 25 deletions

View File

@ -127,7 +127,7 @@
2254,0xd7, , 0, 1,1000,enemy, 0x8002 //RA_ICEBOUNDTRAP 2254,0xd7, , 0, 1,1000,enemy, 0x8002 //RA_ICEBOUNDTRAP
2273,0xe2, , 2, 0, -1,all, 0x000 //NC_NEUTRALBARRIER 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 2299,0xcc, , 0, 1,1000,all, 0x8006 //SC_MANHOLE
2300,0xcd, , 0, 0,1000,all, 0x8006 //SC_DIMENSIONDOOR 2300,0xcd, , 0, 0,1000,all, 0x8006 //SC_DIMENSIONDOOR

View File

@ -128,7 +128,7 @@
2254,0xd7, , 0, 1,1000,enemy, 0x8002 //RA_ICEBOUNDTRAP 2254,0xd7, , 0, 1,1000,enemy, 0x8002 //RA_ICEBOUNDTRAP
2273,0xe2, , 2, 0, -1,all, 0x000 //NC_NEUTRALBARRIER 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 2299,0xcc, , 0, 1,1000,all, 0x8006 //SC_MANHOLE
2300,0xcd, , 0, 0,1000,all, 0x8006 //SC_DIMENSIONDOOR 2300,0xcd, , 0, 0,1000,all, 0x8006 //SC_DIMENSIONDOOR

View File

@ -878,7 +878,7 @@ struct {
#define pc_isfalcon(sd) ( (sd)->sc.option&OPTION_FALCON ) #define pc_isfalcon(sd) ( (sd)->sc.option&OPTION_FALCON )
#define pc_isriding(sd) ( (sd)->sc.option&OPTION_RIDING ) #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_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 ) #define pc_is90overweight(sd) ( (sd)->weight*10 >= (sd)->max_weight*9 )

View File

@ -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_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_MAGNETICFIELD , SC_MAGNETICFIELD , SI_MAGNETICFIELD , SCB_NONE );
set_sc( NC_NEUTRALBARRIER , SC_NEUTRALBARRIER , SI_NEUTRALBARRIER , SCB_DEF|SCB_MDEF ); 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 */ /* Royal Guard */
set_sc( LG_REFLECTDAMAGE , SC_REFLECTDAMAGE , SI_LG_REFLECTDAMAGE , SCB_NONE ); 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_SPUP] |= SCB_MAXSP;
StatusChangeFlagTable[SC_MERC_HITUP] |= SCB_HIT; StatusChangeFlagTable[SC_MERC_HITUP] |= SCB_HIT;
StatusChangeFlagTable[SC_STEALTHFIELD_MASTER] |= SCB_SPEED;
StatusChangeFlagTable[SC_HALLUCINATIONWALK_POSTDELAY] |= SCB_SPEED|SCB_ASPD; StatusChangeFlagTable[SC_HALLUCINATIONWALK_POSTDELAY] |= SCB_SPEED|SCB_ASPD;
StatusChangeFlagTable[SC_PARALYSE] |= SCB_FLEE|SCB_SPEED|SCB_ASPD; StatusChangeFlagTable[SC_PARALYSE] |= SCB_FLEE|SCB_SPEED|SCB_ASPD;
StatusChangeFlagTable[SC_DEATHHURT] |= SCB_REGEN; 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]) if(sc->data[SC_BURNING])
mdef -= 25 * mdef / 100; mdef -= 25 * mdef / 100;
if( sc->data[SC_NEUTRALBARRIER] ) 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]) if(sc->data[SC_ANALYZE])
mdef -= mdef * ( 14 * sc->data[SC_ANALYZE]->val1 ) / 100; mdef -= mdef * ( 14 * sc->data[SC_ANALYZE]->val1 ) / 100;
if(sc->data[SC_SYMPHONYOFLOVER]) 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_STRIPWEAPON,100,val1,tick);
sc_start(src,bl,SC_STRIPSHIELD,100,val1,tick); sc_start(src,bl,SC_STRIPSHIELD,100,val1,tick);
break; 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: case SC_GN_CARTBOOST:
if( val1 < 3 ) if( val1 < 3 )
val2 = 50; val2 = 50;
@ -10725,8 +10718,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val4 = 0; val4 = 0;
break; break;
case SC_NEUTRALBARRIER: case SC_NEUTRALBARRIER:
val2 = 10 + val1 * 5; // Def val2 = 10 + val1 * 5; // Def/Mdef
val3 = 10 + val1 * 5; // Mdef tick = -1;
break; break;
/* Rebellion */ /* Rebellion */
@ -11161,7 +11154,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
break; break;
case SC__FEINTBOMB: case SC__FEINTBOMB:
sc->option |= OPTION_INVISIBLE; sc->option |= OPTION_INVISIBLE;
opt_flag = 2; opt_flag |= 2|4;
break; break;
case SC_SIGHT: case SC_SIGHT:
sc->option |= OPTION_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; break;
case SC__FEINTBOMB: case SC__FEINTBOMB:
sc->option &= ~OPTION_INVISIBLE; sc->option &= ~OPTION_INVISIBLE;
opt_flag |= 2; opt_flag |= 2|4;
break; break;
case SC_SIGHT: case SC_SIGHT:
sc->option &= ~OPTION_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); sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
return 0; 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: case SC_STRIKING:
if( --(sce->val4) >= 0 ) { if( --(sce->val4) >= 0 ) {
if( !status_charge(bl,0, sce->val3 ) ) if( !status_charge(bl,0, sce->val3 ) )