Sfoglia il codice sorgente

Item Updates and New Status Changes (#1539)

* Item Updates
* Added new Status Changes
* Implemented effect for respective items
  * 12874,Frost_Giant_Blood: SC_GVG_GIANT
  * 12875,Golem_Stone: SC_GVG_GOLEM
  * 12876,Elf_Tear_Stun: SC_GVG_STUN
  * 12877,Elf_Tear_Stone_Curse: SC_GVG_STONE
  * 12878,Elf_Tear_Freezing: SC_GVG_FREEZ
  * 12879,Elf_Tear_Sleep: SC_GVG_SLEEP
  * 12880,Elf_Tear_Curse: SC_GVG_CURSE
  * 12881,Elf_Tear_Silence: SC_GVG_SILENCE
  * 12882,Elf_Tear_Blind: SC_GVG_BLIND
* Thanks Divine-Pride.net

Signed-off-by: Cydh Ramdh <cydh@pservero.com>

* Follow up 9267a32d8c4828bde19f2fe80f83aeec7056b18f
* Updated Status Change doc
Cydh Ramdh 8 anni fa
parent
commit
b46e4332df
6 ha cambiato i file con 145 aggiunte e 14 eliminazioni
  1. 9 9
      db/re/item_db.txt
  2. 49 0
      doc/status_change.txt
  3. 15 0
      src/map/battle.c
  4. 9 0
      src/map/script_constants.h
  5. 54 5
      src/map/status.c
  6. 9 0
      src/map/status.h

+ 9 - 9
db/re/item_db.txt

@@ -6989,15 +6989,15 @@
 12860,Mommy_Day_Cake,Mommy Day Cake,2,0,,200,,,,,0xFFFFFFFF,63,2,,,,,,{ percentheal 50,50; skilleffect "HP_ASSUMPTIO",0; sc_start SC_ASSUMPTIO,100000,5; },{},{}
 12863,Treasure_Chest_Summoned_II,Treasure Chest Summoned II,2,10,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ monster "this",-1,-1,"--ja--",rand(1324,1363),1,""; },{},{}
 12873,TE_Potion_Box,TE Potion Box,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem(11558,10); },{},{}
-12874,Frost_Giant_Blood,Frost Giant Blood,2,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{}
-12875,Golem_Stone,Golem Stone,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{}
-12876,Elf_Tear_Stun,Elf Tear Stun,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{}
-12877,Elf_Tear_Stone_Curse,Elf Tear Stone Curse,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{}
-12878,Elf_Tear_Freezing,Elf Tear Freezing,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{}
-12879,Elf_Tear_Sleep,Elf Tear Sleep,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{}
-12880,Elf_Tear_Curse,Elf Tear Curse,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{}
-12881,Elf_Tear_Silence,Elf Tear Silence,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{}
-12882,Elf_Tear_Blind,Elf Tear Blind,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{}
+12874,Frost_Giant_Blood,Frost Giant Blood,2,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_POTION_CON; sc_start4 SC_GVG_GIANT,10000,3000,0,100,100; },{},{}
+12875,Golem_Stone,Golem Stone,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_POTION_CON; sc_start4 SC_GVG_GOLEM,10000,0,200,50,50; },{},{}
+12876,Elf_Tear_Stun,Elf Tear Stun,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start2 SC_GVG_STUN,10000,3000,0; },{},{}
+12877,Elf_Tear_Stone_Curse,Elf Tear Stone Curse,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start2 SC_GVG_STONE,10000,3000,0; },{},{}
+12878,Elf_Tear_Freezing,Elf Tear Freezing,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start2 SC_GVG_FREEZ,10000,3000,0; },{},{}
+12879,Elf_Tear_Sleep,Elf Tear Sleep,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start2 SC_GVG_SLEEP,10000,3000,0; },{},{}
+12880,Elf_Tear_Curse,Elf Tear Curse,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start2 SC_GVG_CURSE,10000,3000,0; },{},{}
+12881,Elf_Tear_Silence,Elf Tear Silence,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start2 SC_GVG_SILENCE,10000,3000,0; },{},{}
+12882,Elf_Tear_Blind,Elf Tear Blind,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start2 SC_GVG_BLIND,10000,3000,0; },{},{}
 12883,Almighty,Almighty,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_BASH3D; sc_start SC_2011RWC_SCROLL,1800000,10; },{},{}
 12884,Infinite_Concentration_Potion,Infinite Concentration Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION0,1800000,4; },{},{}
 12885,Infinite_Awakening_Potion,Infinite Awakening Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION1,1800000,6; },{},{}

+ 49 - 0
doc/status_change.txt

@@ -2528,6 +2528,55 @@ SC_CHASEWALK2	(SI_CHASEWALK2)
 	desc: 2nd effect of Chasewalk
 	val1: +STR
 
+SC_GVG_GIANT	(SI_GVG_GIANT)
+	desc: Instantly consumes HP/SP, increases Physical/Magic damage on player enemies by n%.
+	val1: Amount of HP that are instantly consumed
+	val2: Amount of SP that are instantly consumed
+	val3: Increases % Physical damage
+	val4: Increases % Magical damage
+
+SC_GVG_GOLEM	(SI_GVG_GOLEM)
+	desc: Instantly consumes HP/SP, decreases n% damage received from other adventurers.
+	val1: Amount of HP that are instantly consumed
+	val2: Amount of SP that are instantly consumed
+	val3: Decreases % damage received of physical attack
+	val4: Decreases % damage received of magical attack
+
+SC_GVG_STUN	(SI_GVG_STUN)
+	desc: Instantly consumes HP/SP, immunizes you against Stun.
+	val1: Amount of HP that are instantly consumed
+	val2: Amount of SP that are instantly consumed
+
+SC_GVG_STONE	(SI_GVG_STONE)
+	desc: Instantly consumes HP/SP, immunizes you against Petrification.
+	val1: Amount of HP that are instantly consumed
+	val2: Amount of SP that are instantly consumed
+
+SC_GVG_FREEZ	(SI_GVG_FREEZ)
+	desc: Instantly consumes HP/SP, immunizes you against Frost.
+	val1: Amount of HP that are instantly consumed
+	val2: Amount of SP that are instantly consumed
+
+SC_GVG_SLEEP	(SI_GVG_SLEEP)
+	desc: Instantly consumes HP/SP, immunizes you against Sleep.
+	val1: Amount of HP that are instantly consumed
+	val2: Amount of SP that are instantly consumed
+
+SC_GVG_CURSE	(SI_GVG_CURSE)
+	desc: Instantly consumes HP/SP, immunizes you against Curse.
+	val1: Amount of HP that are instantly consumed
+	val2: Amount of SP that are instantly consumed
+
+SC_GVG_SILENCE	(SI_GVG_SILENCE)
+	desc: Instantly consumes HP/SP, immunizes you against Silence.
+	val1: Amount of HP that are instantly consumed
+	val2: Amount of SP that are instantly consumed
+
+SC_GVG_BLIND	(SI_GVG_BLIND)
+	desc: Instantly consumes HP/SP, immunizes you against Blind.
+	val1: Amount of HP that are instantly consumed
+	val2: Amount of SP that are instantly consumed
+
 SC_EXTREMITYFIST2	()
 	desc:
 	val1:

+ 15 - 0
src/map/battle.c

@@ -1357,6 +1357,13 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
 				status_change_end(bl, SC_STONEHARDSKIN, INVALID_TIMER);
 		}
 
+		if (src->type == BL_PC && sc->data[SC_GVG_GOLEM]) {
+			if (flag&BF_WEAPON)
+				damage -= damage * sc->data[SC_GVG_GOLEM]->val3 / 100;
+			if (flag&BF_MAGIC)
+				damage -= damage * sc->data[SC_GVG_GOLEM]->val4 / 100;
+		}
+
 #ifdef RENEWAL
 		// Renewal: steel body reduces all incoming damage to 1/10 [helvetica]
 		if( sc->data[SC_STEELBODY] )
@@ -1448,6 +1455,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
 		if ((sce = sc->data[SC_BLOODLUST]) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3)
 			status_heal(src, damage * sce->val4 / 100, 0, 3);
 
+		if (flag&BF_MAGIC && bl->type == BL_PC && sc->data[SC_GVG_GIANT] && sc->data[SC_GVG_GIANT]->val4)
+			damage += damage * sc->data[SC_GVG_GIANT]->val4 / 100;
+
 		// [Epoque]
 		if (bl->type == BL_MOB) {
 			if ( (((sce=sc->data[SC_MANU_ATK]) && (flag&BF_WEAPON)) ||
@@ -4476,6 +4486,11 @@ struct Damage battle_attack_sc_bonus(struct Damage wd, struct block_list *src, s
 				RE_ALLATK_ADDRATE(wd, sc->data[SC_ARCLOUSEDASH]->val4);
 			}
 		}
+
+		if (sd && wd.flag&BF_WEAPON && sc->data[SC_GVG_GIANT] && sc->data[SC_GVG_GIANT]->val3) {
+			ATK_ADDRATE(wd.damage, wd.damage2, sc->data[SC_GVG_GIANT]->val3);
+			RE_ALLATK_ADDRATE(wd, sc->data[SC_GVG_GIANT]->val3);
+		}
 	}
 
 	if ((wd.flag&(BF_LONG|BF_MAGIC)) == BF_LONG) {

+ 9 - 0
src/map/script_constants.h

@@ -1404,6 +1404,15 @@
 	export_constant(SC_MAPLE_FALLS);
 	export_constant(SC_TIME_ACCESSORY);
 	export_constant(SC_MAGICAL_FEATHER);
+	export_constant(SC_GVG_GIANT);
+	export_constant(SC_GVG_GOLEM);
+	export_constant(SC_GVG_STUN);
+	export_constant(SC_GVG_STONE);
+	export_constant(SC_GVG_FREEZ);
+	export_constant(SC_GVG_SLEEP);
+	export_constant(SC_GVG_CURSE);
+	export_constant(SC_GVG_SILENCE);
+	export_constant(SC_GVG_BLIND);
 #ifdef RENEWAL
 	export_constant(SC_EXTREMITYFIST2);
 #endif

+ 54 - 5
src/map/status.c

@@ -1053,6 +1053,15 @@ void initChangeTables(void)
 	StatusIconChangeTable[SC_MTF_MSP] = SI_MTF_MSP;
 	StatusIconChangeTable[SC_MTF_PUMPKIN] = SI_MTF_PUMPKIN;
 	StatusIconChangeTable[SC_NORECOVER_STATE] = SI_HANDICAPSTATE_NORECOVER;
+	StatusIconChangeTable[SC_GVG_GIANT] = SI_GVG_GIANT;
+	StatusIconChangeTable[SC_GVG_GOLEM] = SI_GVG_GOLEM;
+	StatusIconChangeTable[SC_GVG_STUN] = SI_GVG_STUN;
+	StatusIconChangeTable[SC_GVG_STONE] = SI_GVG_STONE;
+	StatusIconChangeTable[SC_GVG_FREEZ] = SI_GVG_FREEZ;
+	StatusIconChangeTable[SC_GVG_SLEEP] = SI_GVG_SLEEP;
+	StatusIconChangeTable[SC_GVG_CURSE] = SI_GVG_CURSE;
+	StatusIconChangeTable[SC_GVG_SILENCE] = SI_GVG_SILENCE;
+	StatusIconChangeTable[SC_GVG_BLIND] = SI_GVG_BLIND;
 
 	// Costumes
 	StatusIconChangeTable[SC_MOONSTAR] = SI_MOONSTAR;
@@ -8085,25 +8094,53 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			return 0;
 		break;
 	case SC_STONE:
+		// Undead are immune to Stone
+		if (undead_flag && !(flag&SCSTART_NOAVOID))
+			return 0;
 		if(sc->data[SC_POWER_OF_GAIA])
 			return 0;
+		if (sc->data[SC_GVG_STONE])
+			return 0;
+		break;
 	case SC_FREEZE:
-		// Undead are immune to Freeze/Stone
+		// Undead are immune to Freeze
 		if (undead_flag && !(flag&SCSTART_NOAVOID))
 			return 0;
-	case SC_DEEPSLEEP:
-	case SC_SLEEP:
-	case SC_STUN:
+		if (sc->data[SC_GVG_FREEZ])
+			return 0;
 	case SC_FREEZING:
 	case SC_CRYSTALIZE:
 		if (sc->opt1)
 			return 0; // Cannot override other opt1 status changes. [Skotlex]
-		if((type == SC_FREEZE || type == SC_FREEZING || type == SC_CRYSTALIZE) && sc->data[SC_WARMER])
+		if (sc->data[SC_WARMER])
 			return 0; // Immune to Frozen and Freezing status if under Warmer status. [Jobbie]
 		break;
+	case SC_SLEEP:
+		if (sc->data[SC_GVG_SLEEP])
+			return 0;
+	case SC_DEEPSLEEP:
+		if (sc->opt1)
+			return 0; // Cannot override other opt1 status changes. [Skotlex]
+		break;
+	case SC_STUN:
+		if (sc->opt1)
+			return 0; // Cannot override other opt1 status changes. [Skotlex]
+		if (sc->data[SC_GVG_STUN])
+			return 0;
+		break;
 	case SC_BLIND:
 		if (sc->data[SC_FEAR])
 			return 0;
+		if (sc->data[SC_GVG_BLIND])
+			return 0;
+		break;
+	case SC_CURSE:
+		if (sc->data[SC_GVG_CURSE])
+			return 0;
+		break;
+	case SC_SILENCE:
+		if (sc->data[SC_GVG_SILENCE])
+			return 0;
 		break;
 	case SC_ALL_RIDING:
 		if( !sd || !&sd->sc || sc->option&(OPTION_RIDING|OPTION_DRAGON|OPTION_WUGRIDER|OPTION_MADOGEAR) )
@@ -11086,6 +11123,18 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			if (src->type == BL_PC && (sd = map_id2sd(src->id)))
 				clif_crimson_marker(sd, bl, false);
 			break;
+		case SC_GVG_GIANT:
+		case SC_GVG_GOLEM:
+		case SC_GVG_STUN:
+		case SC_GVG_STONE:
+		case SC_GVG_FREEZ:
+		case SC_GVG_SLEEP:
+		case SC_GVG_CURSE:
+		case SC_GVG_SILENCE:
+		case SC_GVG_BLIND:
+			if (val1 || val2)
+				status_zap(bl, val1 ? val1 : 0, val2 ? val2 : 0);
+			break;
 	}
 
 	if( opt_flag&2 && sd && sd->touching_id )

+ 9 - 0
src/map/status.h

@@ -769,6 +769,15 @@ typedef enum sc_type {
 	SC_MAPLE_FALLS,
 	SC_TIME_ACCESSORY,
 	SC_MAGICAL_FEATHER,
+	SC_GVG_GIANT,
+	SC_GVG_GOLEM,
+	SC_GVG_STUN,
+	SC_GVG_STONE,
+	SC_GVG_FREEZ,
+	SC_GVG_SLEEP,
+	SC_GVG_CURSE,
+	SC_GVG_SILENCE,
+	SC_GVG_BLIND,
 
 #ifdef RENEWAL
 	SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled