diff --git a/db/re/item_db.txt b/db/re/item_db.txt index b0b83c6038..896eafe1c9 100644 --- a/db/re/item_db.txt +++ b/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; },{},{} diff --git a/doc/status_change.txt b/doc/status_change.txt index 05d65001b6..148b3661d2 100644 --- a/doc/status_change.txt +++ b/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: diff --git a/src/map/battle.c b/src/map/battle.c index 941d9f7bf4..b9d673cbde 100644 --- a/src/map/battle.c +++ b/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) { diff --git a/src/map/script_constants.h b/src/map/script_constants.h index a87e07865b..3f8bcac6fd 100644 --- a/src/map/script_constants.h +++ b/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 diff --git a/src/map/status.c b/src/map/status.c index 8861d13761..053a6a3b9a 100644 --- a/src/map/status.c +++ b/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: - if(sc->data[SC_POWER_OF_GAIA]) - return 0; - case SC_FREEZE: - // Undead are immune to Freeze/Stone + // Undead are immune to Stone if (undead_flag && !(flag&SCSTART_NOAVOID)) return 0; - case SC_DEEPSLEEP: - case SC_SLEEP: - case SC_STUN: + 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 + if (undead_flag && !(flag&SCSTART_NOAVOID)) + return 0; + 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 ) diff --git a/src/map/status.h b/src/map/status.h index 069582f7af..2d84c1da57 100644 --- a/src/map/status.h +++ b/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