Jelajahi Sumber

` 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://svn.code.sf.net/p/rathena/svn/trunk@15539 54d463be-8e91-2dee-dedb-b68131a5f0ec

xantara 13 tahun lalu
induk
melakukan
2daf269fee
4 mengubah file dengan 234 tambahan dan 6 penghapusan
  1. 199 0
      db/const.txt
  2. 6 0
      src/map/pc.c
  3. 17 1
      src/map/skill.c
  4. 12 5
      src/map/status.c

+ 199 - 0
db/const.txt

@@ -986,6 +986,205 @@ SC_FOOD_VIT_CASH	305
 SC_FOOD_DEX_CASH	306
 SC_FOOD_INT_CASH	307
 SC_FOOD_LUK_CASH	308
+SC_FEAR	309
+SC_BURNING	310
+SC_FREEZING	311
+SC_ENCHANTBLADE	312
+SC_DEATHBOUND	313
+SC_MILLENNIUMSHIELD	314
+SC_CRUSHSTRIKE	315
+SC_REFRESH	316
+SC_REUSE_REFRESH	317
+SC_GIANTGROWTH	318
+SC_STONEHARDSKIN	319
+SC_VITALITYACTIVATION	320
+SC_STORMBLAST	321
+SC_FIGHTINGSPIRIT	322
+SC_ABUNDANCE	323
+SC_ADORAMUS	324
+SC_EPICLESIS	325
+SC_ORATIO	326
+SC_LAUDAAGNUS	327
+SC_LAUDARAMUS	328
+SC_RENOVATIO	329
+SC_EXPIATIO	330
+SC_DUPLELIGHT	331
+SC_SECRAMENT	332
+SC_WHITEIMPRISON	333
+SC_MARSHOFABYSS	334
+SC_RECOGNIZEDSPELL	335
+SC_STASIS	336
+SC_SPHERE_1	337
+SC_SPHERE_2	338
+SC_SPHERE_3	339
+SC_SPHERE_4	340
+SC_SPHERE_5	341
+SC_READING_SB	342
+SC_FREEZINGSPELL	343
+SC_FEARBREEZE	344
+SC_ELECTRICSHOCKER	345
+SC_WUGDASH	346
+SC_BITE	347
+SC_CAMOUFLAGE	348
+SC_ACCELERATION	349
+SC_HOVERING	350
+SC_SHAPESHIFT	351
+SC_INFRAREDSCAN	352
+SC_ANALYZE	353
+SC_MAGNETICFIELD	354
+SC_NEUTRALBARRIER	355
+SC_NEUTRALBARRIER_MASTER	356
+SC_STEALTHFIELD	357
+SC_STEALTHFIELD_MASTER	358
+SC_OVERHEAT	359
+SC_OVERHEAT_LIMITPOINT	360
+SC_VENOMIMPRESS	361
+SC_POISONINGWEAPON	362
+SC_WEAPONBLOCKING	363
+SC_CLOAKINGEXCEED	364
+SC_HALLUCINATIONWALK	365
+SC_HALLUCINATIONWALK_POSTDELAY	366
+SC_ROLLINGCUTTER	367
+SC_TOXIN	368
+SC_PARALYSE	369
+SC_VENOMBLEED	370
+SC_MAGICMUSHROOM	371
+SC_DEATHHURT	372
+SC_PYREXIA	373
+SC_OBLIVIONCURSE	374
+SC_LEECHESEND	375
+SC_REFLECTDAMAGE	376
+SC_FORCEOFVANGUARD	377
+SC_SHIELDSPELL_DEF	378
+SC_SHIELDSPELL_MDEF	379
+SC_SHIELDSPELL_REF	380
+SC_EXEEDBREAK	381
+SC_PRESTIGE	382
+SC_BANDING	383
+SC_BANDING_DEFENCE	384
+SC_EARTHDRIVE	385
+SC_INSPIRATION	386
+SC_SPELLFIST	387
+SC_CRYSTALIZE	388
+SC_STRIKING	389
+SC_WARMER	390
+SC_VACUUM_EXTREME	391
+SC_PROPERTYWALK	392
+SC_SWINGDANCE	393
+SC_SYMPHONYOFLOVER	394
+SC_MOONLITSERENADE	395
+SC_RUSHWINDMILL	396
+SC_ECHOSONG	397
+SC_HARMONIZE	398
+SC_VOICEOFSIREN	399
+SC_DEEPSLEEP	400
+SC_SIRCLEOFNATURE	401
+SC_GLOOMYDAY	402
+SC_GLOOMYDAY_SK	403
+SC_SONGOFMANA	404
+SC_DANCEWITHWUG	405
+SC_SATURDAYNIGHTFEVER	406
+SC_LERADSDEW	407
+SC_MELODYOFSINK	408
+SC_BEYONDOFWARCRY	409
+SC_UNLIMITEDHUMMINGVOICE	410
+SC_SITDOWN_FORCE	411
+SC_CRESCENTELBOW	412
+SC_CURSEDCIRCLE_ATKER	413
+SC_CURSEDCIRCLE_TARGET	414
+SC_LIGHTNINGWALK	415
+SC_RAISINGDRAGON	416
+SC_GT_ENERGYGAIN	417
+SC_GT_CHANGE	418
+SC_GT_REVITALIZE	419
+SC_GN_CARTBOOST	420
+SC_THORNSTRAP	421
+SC_BLOODSUCKER	422
+SC_SMOKEPOWDER	423
+SC_TEARGAS	424
+SC_MANDRAGORA	425
+SC_STOMACHACHE	426
+SC_MYSTERIOUS_POWDER	427
+SC_MELON_BOMB	428
+SC_BANANA_BOMB	429
+SC_BANANA_BOMB_SITDOWN	430
+SC_SAVAGE_STEAK	431
+SC_COCKTAIL_WARG_BLOOD	432
+SC_MINOR_BBQ	433
+SC_SIROMA_ICE_TEA	434
+SC_DROCERA_HERB_STEAMED	435
+SC_PUTTI_TAILS_NOODLES	436
+SC_BOOST500	437
+SC_FULL_SWING_K	438
+SC_MANA_PLUS	439
+SC_MUSTLE_M	440
+SC_LIFE_FORCE_F	441
+SC_EXTRACT_WHITE_POTION_Z	442
+SC_VITATA_500	443
+SC_EXTRACT_SALAMINE_JUICE	444
+SC__REPRODUCE	445
+SC__AUTOSHADOWSPELL	446
+SC__SHADOWFORM	447
+SC__BODYPAINT	448
+SC__INVISIBILITY	449
+SC__DEADLYINFECT	450
+SC__ENERVATION	451
+SC__GROOMY	452
+SC__IGNORANCE	453
+SC__LAZINESS	454
+SC__UNLUCKY	455
+SC__WEAKNESS	456
+SC__STRIPACCESSORY	457
+SC__MANHOLE	458
+SC_CHAOS	459
+SC__BLOODYLUST	460
+SC_CIRCLE_OF_FIRE	461
+SC_CIRCLE_OF_FIRE_OPTION	462
+SC_FIRE_CLOAK	463
+SC_FIRE_CLOAK_OPTION	464
+SC_WATER_SCREEN	465
+SC_WATER_SCREEN_OPTION	466
+SC_WATER_DROP	467
+SC_WATER_DROP_OPTION	468
+SC_WATER_BARRIER	469
+SC_WIND_STEP	470
+SC_WIND_STEP_OPTION	471
+SC_WIND_CURTAIN	472
+SC_WIND_CURTAIN_OPTION	473
+SC_ZEPHYR	474
+SC_SOLID_SKIN	475
+SC_SOLID_SKIN_OPTION	476
+SC_STONE_SHIELD	477
+SC_STONE_SHIELD_OPTION	478
+SC_POWER_OF_GAIA	479
+SC_PYROTECHNIC	480
+SC_PYROTECHNIC_OPTION	481
+SC_HEATER	482
+SC_HEATER_OPTION	483
+SC_TROPIC	484
+SC_TROPIC_OPTION	485
+SC_AQUAPLAY	486
+SC_AQUAPLAY_OPTION	487
+SC_COOLER	488
+SC_COOLER_OPTION	489
+SC_CHILLY_AIR	490
+SC_CHILLY_AIR_OPTION	491
+SC_GUST	492
+SC_GUST_OPTION	493
+SC_BLAST	494
+SC_BLAST_OPTION	495
+SC_WILD_STORM	496
+SC_WILD_STORM_OPTION	497
+SC_PETROLOGY	498
+SC_PETROLOGY_OPTION	499
+SC_CURSED_SOIL	500
+SC_CURSED_SOIL_OPTION	501
+SC_UPHEAVAL	502
+SC_UPHEAVAL_OPTION	503
+SC_TIDAL_WEAPON	504
+SC_TIDAL_WEAPON_OPTION	505
+SC_ROCK_CRUSHER	506
+SC_ROCK_CRUSHER_ATK	507
 
 e_gasp	0
 e_what	1

+ 6 - 0
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);
 }

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

+ 12 - 5
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] )