From 7c4d769234258ef6fa4b14cc15a6e7d4e2a76122 Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 13 Jun 2018 15:55:30 -0400 Subject: [PATCH] Added Old Glastheim Buffs (#3167) * Fixes #2772. * Added missing Old Glastheim buffs. * Added buffs to Old Glastheim script. * Renamed Glastheim -> Glast Heim. Thanks to @Atemo and @mrjnumber1! --- db/re/mob_race2_db.txt | 4 ++ npc/re/instances/OldGlastHeim.txt | 21 +++++++---- src/map/battle.cpp | 6 +++ src/map/map.cpp | 7 ++++ src/map/map.hpp | 2 + src/map/script_constants.hpp | 9 +++++ src/map/skill.cpp | 10 ++++- src/map/status.cpp | 61 +++++++++++++++++++++++++++++++ src/map/status.hpp | 9 +++++ 9 files changed, 120 insertions(+), 9 deletions(-) diff --git a/db/re/mob_race2_db.txt b/db/re/mob_race2_db.txt index fa538c3561..6934ede50c 100644 --- a/db/re/mob_race2_db.txt +++ b/db/re/mob_race2_db.txt @@ -30,3 +30,7 @@ RC2_MANUK,1986,1987,1988,1989,1990,1997,1998,1999 RC2_SPLENDIDE,1991,1992,1993,1994,1995 // Scaraba RC2_SCARABA,2083,2084,2085,2086,2087,2088,2089,2090,2091,2144,2145,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2304,2693,2799,2896 +// Old Glast Heim - SC_GLASTHEIM_ATK/SC_GLASTHEIM_DEF +RC2_OGH_ATK_DEF,2475,2476 +// Old Glast Heim - SC_GLASTHEIM_HIDDEN +RC2_OGH_HIDDEN,2337,2343//,2495 diff --git a/npc/re/instances/OldGlastHeim.txt b/npc/re/instances/OldGlastHeim.txt index e3604f94b2..f39619e669 100644 --- a/npc/re/instances/OldGlastHeim.txt +++ b/npc/re/instances/OldGlastHeim.txt @@ -1554,12 +1554,19 @@ OnMobDead: end; OnTouch: specialeffect2 EF_ENHANCE; - // buff - // .@num = atoi( replacestr(strnpcinfo(2), "Buff", "") ); - // if (.@num == 1) - // else if (.@num == 2) - // else if (.@num == 3) - // else + .@num = atoi( replacestr(strnpcinfo(2), "Buff", "") ); + if (.@num == 1) + sc_start SC_GLASTHEIM_HIDDEN,30000,1,10000,SCSTART_NOTICKDEF; + else if (.@num == 2) + sc_start SC_GLASTHEIM_STATE,30000,1,10000,SCSTART_NOTICKDEF; + else if (.@num == 3) { + sc_start SC_GLASTHEIM_HEAL,30000,1,10000,SCSTART_NOTICKDEF; + sc_start SC_GLASTHEIM_HPSP,30000,1,10000,SCSTART_NOTICKDEF; + } + else { + sc_start SC_GLASTHEIM_DEF,30000,1,10000,SCSTART_NOTICKDEF; + sc_start SC_GLASTHEIM_ITEMDEF,30000,1,10000,SCSTART_NOTICKDEF; + } end; OnEvent: initnpctimer; @@ -1572,7 +1579,7 @@ OnEvent: else if (.@num == 3) npctalk "Varmundt's Ghost: If you don't want to be attacked by Amdarais' zombie, come to me and get more power!"; else - npctalk "Varmundt's Ghost: If you don't want to be attacked by Amdarais's power, come to me and get more power! "; + npctalk "Varmundt's Ghost: If you don't want to be attacked by Amdarais's power, come to me and get more power!"; end; OnTimer10000: stopnpctimer; diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 6d3d182239..efa2b93cd3 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1334,6 +1334,10 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if( sc->data[SC_SPL_DEF] && status_get_race2(src) == RC2_SPLENDIDE ){ damage -= damage * sc->data[SC_SPL_DEF]->val1 / 100; } + if (sc->data[SC_GLASTHEIM_DEF] && status_get_race2(src) == RC2_OGH_ATK_DEF) + return 0; + if (sc->data[SC_GLASTHEIM_HIDDEN] && status_get_race2(src) == RC2_OGH_HIDDEN) + damage -= damage * sc->data[SC_GLASTHEIM_HIDDEN]->val1 / 100; } if((sce=sc->data[SC_ARMOR]) && //NPC_DEFENDER @@ -1506,6 +1510,8 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam ) { damage += damage * sce->val1 / 100; } + if (sc->data[SC_GLASTHEIM_ATK] && status_get_race2(bl) == RC2_OGH_ATK_DEF) + damage <<= 1; } /* Self Buff that destroys the armor of any target hit with melee or ranged physical attacks */ if( sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 1 && flag&BF_WEAPON ) { diff --git a/src/map/map.cpp b/src/map/map.cpp index a18ff35a7f..c61ab14678 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -2053,6 +2053,13 @@ int map_quit(struct map_session_data *sd) { status_change_end(&sd->bl, SC_E_CHAIN, INVALID_TIMER); status_change_end(&sd->bl, SC_SIGHTBLASTER, INVALID_TIMER); status_change_end(&sd->bl, SC_BENEDICTIO, INVALID_TIMER); + status_change_end(&sd->bl, SC_GLASTHEIM_ATK, INVALID_TIMER); + status_change_end(&sd->bl, SC_GLASTHEIM_DEF, INVALID_TIMER); + status_change_end(&sd->bl, SC_GLASTHEIM_HEAL, INVALID_TIMER); + status_change_end(&sd->bl, SC_GLASTHEIM_HIDDEN, INVALID_TIMER); + status_change_end(&sd->bl, SC_GLASTHEIM_STATE, INVALID_TIMER); + status_change_end(&sd->bl, SC_GLASTHEIM_ITEMDEF, INVALID_TIMER); + status_change_end(&sd->bl, SC_GLASTHEIM_HPSP, INVALID_TIMER); } } diff --git a/src/map/map.hpp b/src/map/map.hpp index 9eb74f868e..9bc4b71565 100644 --- a/src/map/map.hpp +++ b/src/map/map.hpp @@ -325,6 +325,8 @@ enum e_race2 : uint8{ RC2_MANUK, RC2_SPLENDIDE, RC2_SCARABA, + RC2_OGH_ATK_DEF, + RC2_OGH_HIDDEN, RC2_MAX }; diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 7d717abc5b..5938b6c809 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -1485,6 +1485,13 @@ export_constant(SC_FALLEN_ANGEL); export_constant(SC_CHEERUP); export_constant(SC_DRESSUP); + export_constant(SC_GLASTHEIM_ATK); + export_constant(SC_GLASTHEIM_DEF); + export_constant(SC_GLASTHEIM_HEAL); + export_constant(SC_GLASTHEIM_HIDDEN); + export_constant(SC_GLASTHEIM_STATE); + export_constant(SC_GLASTHEIM_ITEMDEF); + export_constant(SC_GLASTHEIM_HPSP); #ifdef RENEWAL export_constant(SC_EXTREMITYFIST2); #endif @@ -3594,6 +3601,8 @@ export_constant(RC2_MANUK); export_constant(RC2_SPLENDIDE); export_constant(RC2_SCARABA); + export_constant(RC2_OGH_ATK_DEF); + export_constant(RC2_OGH_HIDDEN); export_constant(RC2_MAX); /* classes */ diff --git a/src/map/skill.cpp b/src/map/skill.cpp index f139c4a93b..e917786748 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -513,8 +513,12 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk if( tsd && (skill = pc_skillheal2_bonus(tsd, skill_id)) ) hp_bonus += skill; - if( sc && sc->data[SC_OFFERTORIUM] && (skill_id == AB_HIGHNESSHEAL || skill_id == AB_CHEAL || skill_id == PR_SANCTUARY || skill_id == AL_HEAL) ) - hp_bonus += sc->data[SC_OFFERTORIUM]->val2; + if (sc && sc->count) { + if (sc->data[SC_OFFERTORIUM] && (skill_id == AB_HIGHNESSHEAL || skill_id == AB_CHEAL || skill_id == PR_SANCTUARY || skill_id == AL_HEAL)) + hp_bonus += sc->data[SC_OFFERTORIUM]->val2; + if (sc->data[SC_GLASTHEIM_HEAL] && skill_id != NPC_EVILLAND && skill_id != BA_APPLEIDUN) + hp_bonus += sc->data[SC_GLASTHEIM_HEAL]->val1; + } if (tsc && tsc->count) { if (skill_id != NPC_EVILLAND && skill_id != BA_APPLEIDUN) { @@ -522,6 +526,8 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk hp_bonus += tsc->data[SC_INCHEALRATE]->val1; //Only affects Heal, Sanctuary and PotionPitcher.(like bHealPower) [Inkfish] if (tsc->data[SC_EXTRACT_WHITE_POTION_Z]) hp_bonus += tsc->data[SC_EXTRACT_WHITE_POTION_Z]->val1; + if (tsc->data[SC_GLASTHEIM_HEAL]) + hp_bonus += sc->data[SC_GLASTHEIM_HEAL]->val2; } } diff --git a/src/map/status.cpp b/src/map/status.cpp index 4f434e37ea..f4c3161d8d 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -1157,6 +1157,15 @@ void initChangeTables(void) StatusIconChangeTable[SC_DRESSUP] = EFST_DRESS_UP; + // Old Glast Heim + StatusIconChangeTable[SC_GLASTHEIM_ATK] = EFST_GLASTHEIM_ATK; + StatusIconChangeTable[SC_GLASTHEIM_DEF] = EFST_GLASTHEIM_DEF; + StatusIconChangeTable[SC_GLASTHEIM_HEAL] = EFST_GLASTHEIM_HEAL; + StatusIconChangeTable[SC_GLASTHEIM_HIDDEN] = EFST_GLASTHEIM_HIDDEN; + StatusIconChangeTable[SC_GLASTHEIM_STATE] = EFST_GLASTHEIM_STATE; + StatusIconChangeTable[SC_GLASTHEIM_ITEMDEF] = EFST_GLASTHEIM_ITEMDEF; + StatusIconChangeTable[SC_GLASTHEIM_HPSP] = EFST_GLASTHEIM_HPSP; + /* Other SC which are not necessarily associated to skills */ StatusChangeFlagTable[SC_ASPDPOTION0] |= SCB_ASPD; StatusChangeFlagTable[SC_ASPDPOTION1] |= SCB_ASPD; @@ -1304,6 +1313,12 @@ void initChangeTables(void) // RODEX StatusChangeFlagTable[SC_DAILYSENDMAILCNT] |= SCB_NONE; + // Old Glast Heim + StatusChangeFlagTable[SC_GLASTHEIM_ATK] |= SCB_ALL; + StatusChangeFlagTable[SC_GLASTHEIM_STATE] |= SCB_STR|SCB_AGI|SCB_VIT|SCB_DEX|SCB_INT|SCB_LUK; + StatusChangeFlagTable[SC_GLASTHEIM_ITEMDEF] |= SCB_DEF|SCB_MDEF; + StatusChangeFlagTable[SC_GLASTHEIM_HPSP] |= SCB_MAXHP|SCB_MAXSP; + // Summoner StatusChangeFlagTable[SC_SHRIMPBLESSING] |= SCB_REGEN; StatusChangeFlagTable[SC_DORAM_WALKSPEED] |= SCB_SPEED; @@ -3003,6 +3018,8 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { bonus += 30; if(sc->data[SC_CROSSBOWCLAN]) bonus += 30; + if(sc->data[SC_GLASTHEIM_HPSP]) + bonus += sc->data[SC_GLASTHEIM_HPSP]->val1; } } else if (type == STATUS_BONUS_RATE) { struct status_change *sc = status_get_sc(bl); @@ -3124,6 +3141,8 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { bonus += 10; if(sc->data[SC_CROSSBOWCLAN]) bonus += 10; + if(sc->data[SC_GLASTHEIM_HPSP]) + bonus += sc->data[SC_GLASTHEIM_HPSP]->val2; } } else if (type == STATUS_BONUS_RATE) { struct status_change *sc = status_get_sc(bl); @@ -4186,6 +4205,10 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) sd->subele[ELE_NEUTRAL] += sc->data[SC_MTF_MLEATKED]->val3; if (sc->data[SC_MTF_CRIDAMAGE]) sd->bonus.crit_atk_rate += sc->data[SC_MTF_CRIDAMAGE]->val1; + if (sc->data[SC_GLASTHEIM_ATK]) { + sd->ignore_mdef_by_race[RC_UNDEAD] += sc->data[SC_GLASTHEIM_ATK]->val1; + sd->ignore_mdef_by_race[RC_DEMON] += sc->data[SC_GLASTHEIM_ATK]->val1; + } } status_cpy(&sd->battle_status, base_status); @@ -5467,6 +5490,8 @@ static unsigned short status_calc_str(struct block_list *bl, struct status_chang str += str * sc->data[SC_FULL_THROTTLE]->val3 / 100; if(sc->data[SC_CHEERUP]) str += 3; + if(sc->data[SC_GLASTHEIM_STATE]) + str += sc->data[SC_GLASTHEIM_STATE]->val1; return (unsigned short)cap_value(str,0,USHRT_MAX); } @@ -5541,6 +5566,8 @@ static unsigned short status_calc_agi(struct block_list *bl, struct status_chang agi += sc->data[SC_ARCLOUSEDASH]->val2; if(sc->data[SC_CHEERUP]) agi += 3; + if(sc->data[SC_GLASTHEIM_STATE]) + agi += sc->data[SC_GLASTHEIM_STATE]->val1; return (unsigned short)cap_value(agi,0,USHRT_MAX); } @@ -5607,6 +5634,8 @@ static unsigned short status_calc_vit(struct block_list *bl, struct status_chang #endif if(sc->data[SC_CHEERUP]) vit += 3; + if(sc->data[SC_GLASTHEIM_STATE]) + vit += sc->data[SC_GLASTHEIM_STATE]->val1; return (unsigned short)cap_value(vit,0,USHRT_MAX); } @@ -5679,6 +5708,8 @@ static unsigned short status_calc_int(struct block_list *bl, struct status_chang int_ += int_ * sc->data[SC_FULL_THROTTLE]->val3 / 100; if(sc->data[SC_CHEERUP]) int_ += 3; + if(sc->data[SC_GLASTHEIM_STATE]) + int_ += sc->data[SC_GLASTHEIM_STATE]->val1; if(bl->type != BL_PC) { if(sc->data[SC_STRIPHELM]) @@ -5762,6 +5793,8 @@ static unsigned short status_calc_dex(struct block_list *bl, struct status_chang dex += dex * sc->data[SC_FULL_THROTTLE]->val3 / 100; if(sc->data[SC_CHEERUP]) dex += 3; + if(sc->data[SC_GLASTHEIM_STATE]) + dex += sc->data[SC_GLASTHEIM_STATE]->val1; return (unsigned short)cap_value(dex,0,USHRT_MAX); } @@ -5826,6 +5859,8 @@ static unsigned short status_calc_luk(struct block_list *bl, struct status_chang luk += luk * sc->data[SC_FULL_THROTTLE]->val3 / 100; if(sc->data[SC_CHEERUP]) luk += 3; + if(sc->data[SC_GLASTHEIM_STATE]) + luk += sc->data[SC_GLASTHEIM_STATE]->val1; return (unsigned short)cap_value(luk,0,USHRT_MAX); } @@ -6436,6 +6471,8 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc, def -= def * sc->data[SC_ASH]->val3/100; if( sc->data[SC_OVERED_BOOST] && bl->type == BL_HOM ) def -= def * sc->data[SC_OVERED_BOOST]->val4 / 100; + if(sc->data[SC_GLASTHEIM_ITEMDEF]) + def += sc->data[SC_GLASTHEIM_ITEMDEF]->val1; return (defType)cap_value(def,DEFTYPE_MIN,DEFTYPE_MAX);; } @@ -6567,6 +6604,8 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc, } if (sc->data[SC_ODINS_POWER]) mdef -= 20 * sc->data[SC_ODINS_POWER]->val1; + if(sc->data[SC_GLASTHEIM_ITEMDEF]) + mdef += sc->data[SC_GLASTHEIM_ITEMDEF]->val2; return (defType)cap_value(mdef,DEFTYPE_MIN,DEFTYPE_MAX); } @@ -11085,6 +11124,28 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val4 = 1; break; + case SC_GLASTHEIM_ATK: + val1 = 100; // Undead/Demon MDEF ignore rate + break; + case SC_GLASTHEIM_HEAL: + val1 = 100; // Heal Power rate bonus + val2 = 50; // Received heal rate bonus + break; + case SC_GLASTHEIM_HIDDEN: + val1 = 90; // Damage rate reduction bonus + break; + case SC_GLASTHEIM_STATE: + val1 = 20; // All-stat bonus + break; + case SC_GLASTHEIM_ITEMDEF: + val1 = 200; // DEF bonus + val2 = 50; // MDEF bonus + break; + case SC_GLASTHEIM_HPSP: + val1 = 10000; // HP bonus + val2 = 1000; // SP bonus + break; + default: if( calc_flag == SCB_NONE && StatusSkillChangeTable[type] == -1 && StatusIconChangeTable[type] == EFST_BLANK ) { // Status change with no calc, no icon, and no skill associated...? diff --git a/src/map/status.hpp b/src/map/status.hpp index 88c7fe7b1b..f82728cbca 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -843,6 +843,15 @@ enum sc_type : int16 { SC_CHEERUP, SC_DRESSUP, + // Old Glast Heim Buffs + SC_GLASTHEIM_ATK, + SC_GLASTHEIM_DEF, + SC_GLASTHEIM_HEAL, + SC_GLASTHEIM_HIDDEN, + SC_GLASTHEIM_STATE, + SC_GLASTHEIM_ITEMDEF, + SC_GLASTHEIM_HPSP, + #ifdef RENEWAL SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled #endif