Selaa lähdekoodia

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!

aleos 8 vuotta sitten
vanhempi
commit
1261d92c43
4 muutettua tiedostoa jossa 9 lisäystä ja 25 poistoa
  1. 1 1
      db/pre-re/skill_unit_db.txt
  2. 1 1
      db/re/skill_unit_db.txt
  3. 1 1
      src/map/pc.h
  4. 6 22
      src/map/status.c

+ 1 - 1
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

+ 1 - 1
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

+ 1 - 1
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 )
 

+ 6 - 22
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 ) )