From 2aaaa844ead26a041c8bc06285f67a87b36bf466 Mon Sep 17 00:00:00 2001 From: qndel Date: Tue, 7 Jan 2020 23:23:42 +0100 Subject: [PATCH] [hellfire] OperateShrine (#1931) --- Source/objects.cpp | 172 +++++++++++++++++++++++++++++++++++++++++++++ enums.h | 2 +- 2 files changed, 173 insertions(+), 1 deletion(-) diff --git a/Source/objects.cpp b/Source/objects.cpp index 42b8192b0..038e0780b 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -3654,6 +3654,178 @@ void OperateShrine(int pnum, int i, int sType) CheckStats(myplr); } break; +#ifdef HELLFIRE + case SHRINE_OILY: + if (deltaload) + return; + if (pnum != myplr) + return; + InitDiabloMsg(EMSG_SHRINE_OILY); + + switch (plr[myplr]._pClass) { + case PC_WARRIOR: + ModifyPlrStr(myplr, 2); + break; + case PC_ROGUE: + ModifyPlrDex(myplr, 2); + break; + case PC_SORCERER: + ModifyPlrMag(myplr, 2); + break; + case PC_MONK: + ModifyPlrStr(myplr, 1); + ModifyPlrDex(myplr, 1); + break; + case PC_BARD: + ModifyPlrDex(myplr, 1); + ModifyPlrMag(myplr, 1); + break; + case PC_BARBARIAN: + ModifyPlrVit(myplr, 2); + break; + } + CheckStats(myplr); + AddMissile( + object[i]._ox, + object[i]._oy, + plr[myplr].WorldX, + plr[myplr].WorldY, + plr[myplr]._pdir, + MIS_FIREWALL, + 1, + 0, + 2 * currlevel + 2, + 0); + break; + + case SHRINE_GLOWING: { + if (deltaload) + return; + if (pnum != myplr) + return; + InitDiabloMsg(EMSG_SHRINE_GLOWING); + int playerXP = plr[myplr]._pExperience; + int xpLoss, magicGain; + if (playerXP > 5000) { + magicGain = 5; + xpLoss = (signed __int64)((double)playerXP * 0.95); + } else { + xpLoss = 0; + magicGain = playerXP / 1000; + } + ModifyPlrMag(myplr, magicGain); + plr[myplr]._pExperience = xpLoss; + CheckStats(myplr); + } break; + + case SHRINE_MENDICANT: + if (deltaload) + return; + if (pnum != myplr) + return; + InitDiabloMsg(EMSG_SHRINE_MENDICANT); + AddPlrExperience(myplr, plr[myplr]._pLevel, plr[myplr]._pGold / 2); + TakePlrsMoney(plr[myplr]._pGold / 2); + CheckStats(myplr); + break; + case SHRINE_SPARKLING: + if (deltaload) + return; + if (pnum != myplr) + return; + InitDiabloMsg(EMSG_SHRINE_SPARKLING); + AddPlrExperience(myplr, plr[myplr]._pLevel, 1000 * currlevel); + AddMissile( + object[i]._ox, + object[i]._oy, + plr[myplr].WorldX, + plr[myplr].WorldY, + plr[myplr]._pdir, + MIS_FLASH, + 1, + 0, + 3 * currlevel + 2, + 0); + CheckStats(myplr); + break; + case SHRINE_TOWN: + if (deltaload) + return; + if (pnum != myplr) + return; + InitDiabloMsg(EMSG_SHRINE_TOWN); + AddMissile( + object[i]._ox, + object[i]._oy, + plr[myplr].WorldX, + plr[myplr].WorldY, + plr[myplr]._pdir, + MIS_TOWN, + 1, + 0, + 0, + 0); + break; + case SHRINE_SHIMMERING: + if (deltaload) + return; + if (pnum != myplr) + return; + InitDiabloMsg(EMSG_SHRINE_SHIMMERING); + plr[myplr]._pMana = plr[myplr]._pMaxMana; + plr[myplr]._pManaBase = plr[myplr]._pMaxManaBase; + break; + + case SHRINE_SOLAR: { + if (deltaload) + return; + if (pnum != myplr) + return; + time_t tm = time(0); + int hour = localtime(&tm)->tm_hour; + if (hour > 20 || hour < 4) { + InitDiabloMsg(EMSG_SHRINE_SOLAR4); + ModifyPlrVit(myplr, 2); + } else if (hour <= 18) { + if (hour <= 12) { + if (hour > 4) { + InitDiabloMsg(EMSG_SHRINE_SOLAR1); + ModifyPlrDex(myplr, 2); + } + } else { + InitDiabloMsg(EMSG_SHRINE_SOLAR2); + ModifyPlrStr(myplr, 2); + } + } else { + InitDiabloMsg(EMSG_SHRINE_SOLAR3); + ModifyPlrMag(myplr, 2); + } + CheckStats(myplr); + } break; + + case SHRINE_MURPHYS: + if (deltaload) + return; + if (pnum != myplr) + return; + InitDiabloMsg(EMSG_SHRINE_MURPHYS); + BOOLEAN broke = FALSE; + for (int j = 0; j < NUM_INVLOC; j++) { + if (plr[pnum].InvBody[j]._itype != ITYPE_NONE && random_(0, 3) == 0) { + if (plr[pnum].InvBody[j]._iDurability != DUR_INDESTRUCTIBLE) { + if (plr[pnum].InvBody[j]._iDurability) { + plr[pnum].InvBody[j]._iDurability /= 2; + broke = TRUE; + break; + } + } + } + } + if (!broke) { + TakePlrsMoney(plr[myplr]._pGold / 3); + } + break; +#endif } CalcPlrInv(pnum, TRUE); diff --git a/enums.h b/enums.h index 2d275f69b..7ca5b47e4 100644 --- a/enums.h +++ b/enums.h @@ -3322,7 +3322,7 @@ typedef enum shrine_type { SHRINE_TOWN = 30, SHRINE_SHIMMERING = 31, SHRINE_SOLAR = 32, - SHRINE_MURPYS = 33, + SHRINE_MURPHYS = 33, #endif NUM_SHRINETYPE } shrine_type;