Browse Source

Clean up OperateShrine.

pull/100/head
Sergey Semushin 7 years ago committed by Anders Jenbo
parent
commit
07f076d2fa
  1. 499
      Source/objects.cpp

499
Source/objects.cpp

@ -2905,18 +2905,12 @@ int ItemMiscIdIdx(int imiscid)
void OperateShrine(int pnum, int i, int sType)
{
int v1;
int v12; // edx
int v21; // eax
int v60; // ebx
int j; // edi
int v72; // edi
int v88; // ebx
int v107; // ST38_4
int v108; // ST34_4
int v133; // eax
int cnt;
int r, j;
DWORD lv, t;
int xx, yy;
int min, max;
int v1, v2, v3, v4;
unsigned __int64 spell, spells;
if (dropGoldFlag) {
dropGoldFlag = FALSE;
@ -2925,24 +2919,25 @@ void OperateShrine(int pnum, int i, int sType)
/// ASSERT: assert((DWORD)i < MAXOBJECTS);
if (!object[i]._oSelFlag)
if (object[i]._oSelFlag == 0)
return;
SetRndSeed(object[i]._oRndSeed);
object[i]._oSelFlag = 0;
if (deltaload) {
object[i]._oAnimFlag = 0;
object[i]._oAnimFrame = object[i]._oAnimLen;
} else {
if (!deltaload) {
PlaySfxLoc(sType, object[i]._ox, object[i]._oy);
object[i]._oAnimFlag = 1;
object[i]._oAnimDelay = 1;
} else {
object[i]._oAnimFlag = 0;
object[i]._oAnimFrame = object[i]._oAnimLen;
}
switch (object[i]._oVar1) {
case SHRINE_MYSTERIOUS:
if (deltaload || pnum != myplr)
if (deltaload)
return;
if (pnum != myplr)
return;
ModifyPlrStr(pnum, -1);
ModifyPlrMag(pnum, -1);
@ -2966,42 +2961,47 @@ void OperateShrine(int pnum, int i, int sType)
InitDiabloMsg(EMSG_SHRINE_MYSTERIOUS);
break;
case SHRINE_HIDDEN:
v12 = 0;
if (deltaload || pnum != myplr)
cnt = 0;
if (deltaload)
return;
if (pnum != myplr)
return;
for (j = 0; j < 7; j++) {
if (plr[pnum].InvBody[j]._itype != ITYPE_NONE)
v12++;
cnt++;
}
if (v12 > 0) {
if (cnt > 0) {
for (j = 0; j < 7; j++) {
if (plr[pnum].InvBody[j]._itype != ITYPE_NONE
&& plr[pnum].InvBody[j]._iMaxDur != 255
&& plr[pnum].InvBody[j]._iMaxDur) {
&& plr[pnum].InvBody[j]._iMaxDur != 0) {
plr[pnum].InvBody[j]._iDurability += 10;
plr[pnum].InvBody[j]._iMaxDur += 10;
if (plr[pnum].InvBody[j]._iDurability > plr[pnum].InvBody[j]._iMaxDur)
plr[pnum].InvBody[j]._iDurability = plr[pnum].InvBody[j]._iMaxDur;
}
}
v12 = 0;
for (j = 0; j < 7; j++) {
if (plr[pnum].InvBody[j]._itype != ITYPE_NONE
&& plr[pnum].InvBody[j]._iMaxDur != 255
&& plr[pnum].InvBody[j]._iMaxDur)
v12++;
}
if (v12 > 0) { // check
do {
v21 = random(0, 7);
} while (plr[pnum].InvBody[v21]._itype == ITYPE_NONE || plr[pnum].InvBody[v21]._iMaxDur == 255 || !plr[pnum].InvBody[v21]._iMaxDur);
plr[pnum].InvBody[v21]._iDurability -= 20;
plr[pnum].InvBody[v21]._iMaxDur -= 20;
if (plr[pnum].InvBody[v21]._iDurability <= 0)
plr[pnum].InvBody[v21]._iDurability = 1;
if (plr[pnum].InvBody[v21]._iMaxDur <= 0)
plr[pnum].InvBody[v21]._iMaxDur = 1;
while (TRUE) {
cnt = 0;
for (j = 0; j < 7; j++) {
if (plr[pnum].InvBody[j]._itype != ITYPE_NONE
&& plr[pnum].InvBody[j]._iMaxDur != 255
&& plr[pnum].InvBody[j]._iMaxDur != 0)
cnt++;
}
if (cnt == 0)
break;
r = random(0, 7);
if (plr[pnum].InvBody[r]._itype == -1 || plr[pnum].InvBody[r]._iMaxDur == 255 || plr[pnum].InvBody[r]._iMaxDur == 0)
continue;
plr[pnum].InvBody[r]._iDurability -= 20;
plr[pnum].InvBody[r]._iMaxDur -= 20;
if (plr[pnum].InvBody[r]._iDurability <= 0)
plr[pnum].InvBody[r]._iDurability = 1;
if (plr[pnum].InvBody[r]._iMaxDur <= 0)
plr[pnum].InvBody[r]._iMaxDur = 1;
break;
}
}
InitDiabloMsg(EMSG_SHRINE_HIDDEN);
@ -3009,59 +3009,77 @@ void OperateShrine(int pnum, int i, int sType)
case SHRINE_GLOOMY:
if (deltaload)
return;
if (pnum == myplr) {
if (plr[pnum].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE)
plr[pnum].InvBody[INVLOC_HEAD]._iAC += 2;
if (plr[pnum].InvBody[INVLOC_CHEST]._itype != ITYPE_NONE)
plr[pnum].InvBody[INVLOC_CHEST]._iAC += 2;
if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE) {
if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD) {
plr[pnum].InvBody[INVLOC_HAND_LEFT]._iAC += 2;
} else {
plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam--;
if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam < plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMinDam)
plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam = plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMinDam;
}
if (pnum != myplr)
break;
if (plr[pnum].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE)
plr[pnum].InvBody[INVLOC_HEAD]._iAC += 2;
if (plr[pnum].InvBody[INVLOC_CHEST]._itype != ITYPE_NONE)
plr[pnum].InvBody[INVLOC_CHEST]._iAC += 2;
if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE) {
if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD) {
plr[pnum].InvBody[INVLOC_HAND_LEFT]._iAC += 2;
} else {
plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam--;
if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam < plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMinDam)
plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam = plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMinDam;
}
if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {
if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) {
plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iAC += 2;
} else {
plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam--;
if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam < plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMinDam)
plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam = plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMinDam;
}
}
if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {
if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) {
plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iAC += 2;
} else {
plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam--;
if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam < plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMinDam)
plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam = plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMinDam;
}
for (j = 0; j < plr[pnum]._pNumInv; j++) {
if (plr[pnum].InvList[j]._itype > 0) {
if (plr[pnum].InvList[j]._itype <= ITYPE_MACE || plr[pnum].InvList[j]._itype == ITYPE_STAFF) { // check
plr[pnum].InvList[j]._iMaxDam--;
if (plr[pnum].InvList[j]._iMaxDam < plr[pnum].InvList[j]._iMinDam)
plr[pnum].InvList[j]._iMaxDam = plr[pnum].InvList[j]._iMinDam;
} else if (plr[pnum].InvList[j]._itype <= 9) {
plr[pnum].InvList[j]._iAC += 2;
}
}
}
for (j = 0; j < plr[pnum]._pNumInv; j++) {
switch (plr[pnum].InvList[j]._itype) {
case ITYPE_SWORD:
case ITYPE_AXE:
case ITYPE_BOW:
case ITYPE_MACE:
case ITYPE_STAFF:
plr[pnum].InvList[j]._iMaxDam--;
if (plr[pnum].InvList[j]._iMaxDam < plr[pnum].InvList[j]._iMinDam)
plr[pnum].InvList[j]._iMaxDam = plr[pnum].InvList[j]._iMinDam;
break;
case ITYPE_SHIELD:
case ITYPE_LARMOR:
case ITYPE_HELM:
case ITYPE_MARMOR:
case ITYPE_HARMOR:
plr[pnum].InvList[j]._iAC += 2;
break;
}
InitDiabloMsg(EMSG_SHRINE_GLOOMY);
}
InitDiabloMsg(EMSG_SHRINE_GLOOMY);
break;
case SHRINE_WEIRD:
if (deltaload)
return;
if (pnum == myplr) {
if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_SHIELD)
plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam++;
if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_SHIELD)
plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam++;
for (j = 0; j < plr[pnum]._pNumInv; j++) {
if (plr[pnum].InvList[j]._itype > 0 && (plr[pnum].InvList[j]._itype <= ITYPE_MACE || plr[pnum].InvList[j]._itype == ITYPE_STAFF))
plr[pnum].InvList[j]._iMaxDam++;
if (pnum != myplr)
break;
if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_SHIELD)
plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam++;
if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_SHIELD)
plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam++;
for (j = 0; j < plr[pnum]._pNumInv; j++) {
switch (plr[pnum].InvList[j]._itype) {
case ITYPE_SWORD:
case ITYPE_AXE:
case ITYPE_BOW:
case ITYPE_MACE:
case ITYPE_STAFF:
plr[pnum].InvList[j]._iMaxDam++;
break;
}
InitDiabloMsg(EMSG_SHRINE_WEIRD);
}
InitDiabloMsg(EMSG_SHRINE_WEIRD);
break;
case SHRINE_MAGICAL:
case SHRINE_MAGICAL2:
if (deltaload)
return;
@ -3083,57 +3101,66 @@ void OperateShrine(int pnum, int i, int sType)
case SHRINE_STONE:
if (deltaload)
return;
if (pnum == myplr) {
for (j = 0; j < 7; j++) {
if (plr[pnum].InvBody[j]._itype == ITYPE_STAFF)
plr[pnum].InvBody[j]._iCharges = plr[pnum].InvBody[j]._iMaxCharges;
}
for (j = 0; j < plr[pnum]._pNumInv; j++) {
if (plr[pnum].InvList[j]._itype == ITYPE_STAFF)
plr[pnum].InvList[j]._iCharges = plr[pnum].InvList[j]._iMaxCharges;
}
for (j = 0; j < 8; j++) {
if (plr[pnum].SpdList[j]._itype == ITYPE_STAFF)
plr[pnum].SpdList[j]._iCharges = plr[pnum].SpdList[j]._iMaxCharges; // belt items don't have charges?
}
InitDiabloMsg(EMSG_SHRINE_STONE);
if (pnum != myplr)
break;
for (j = 0; j < NUM_INVLOC; j++) {
if (plr[pnum].InvBody[j]._itype == ITYPE_STAFF)
plr[pnum].InvBody[j]._iCharges = plr[pnum].InvBody[j]._iMaxCharges;
}
for (j = 0; j < plr[pnum]._pNumInv; j++) {
if (plr[pnum].InvList[j]._itype == ITYPE_STAFF)
plr[pnum].InvList[j]._iCharges = plr[pnum].InvList[j]._iMaxCharges;
}
for (j = 0; j < MAXBELTITEMS; j++) {
if (plr[pnum].SpdList[j]._itype == ITYPE_STAFF)
plr[pnum].SpdList[j]._iCharges = plr[pnum].SpdList[j]._iMaxCharges; // belt items don't have charges?
}
InitDiabloMsg(EMSG_SHRINE_STONE);
break;
case SHRINE_RELIGIOUS:
if (deltaload)
return;
if (pnum == myplr) {
for (j = 0; j < 7; j++)
plr[pnum].InvBody[j]._iDurability = plr[pnum].InvBody[j]._iMaxDur;
for (j = 0; j < plr[pnum]._pNumInv; j++)
plr[pnum].InvList[j]._iDurability = plr[pnum].InvList[j]._iMaxDur;
for (j = 0; j < 8; j++)
plr[pnum].SpdList[j]._iDurability = plr[pnum].SpdList[j]._iMaxDur; // belt items don't have durability?
InitDiabloMsg(EMSG_SHRINE_RELIGIOUS);
}
if (pnum != myplr)
break;
for (j = 0; j < NUM_INVLOC; j++)
plr[pnum].InvBody[j]._iDurability = plr[pnum].InvBody[j]._iMaxDur;
for (j = 0; j < plr[pnum]._pNumInv; j++)
plr[pnum].InvList[j]._iDurability = plr[pnum].InvList[j]._iMaxDur;
for (j = 0; j < MAXBELTITEMS; j++)
plr[pnum].SpdList[j]._iDurability = plr[pnum].SpdList[j]._iMaxDur; // belt items don't have durability?
InitDiabloMsg(EMSG_SHRINE_RELIGIOUS);
break;
case SHRINE_ENCHANTED:
if (deltaload || pnum != myplr)
if (deltaload)
return;
if (pnum != myplr)
return;
v12 = 0;
for (j = 1; j <= 37; j++) {
if (plr[pnum]._pMemSpells & ((__int64)1 << (j - 1))) // j
v12++;
cnt = 0;
spell = 1;
spells = plr[pnum]._pMemSpells;
for (j = 0; j < MAX_SPELLS; j++) {
if (spell & spells)
cnt++;
spell <<= 1;
}
if (v12 > 1) {
for (j = 1; j <= 37; j++) {
if (plr[pnum]._pMemSpells & ((__int64)1 << (j - 1))) { // j
if (cnt > 1) {
spell = 1;
for (j = 1; j <= MAX_SPELLS; j++) {
if (plr[pnum]._pMemSpells & spell) {
if (plr[pnum]._pSplLvl[j] < 15)
plr[pnum]._pSplLvl[j]++;
}
spell <<= 1;
}
do {
v60 = random(0, 37) + 1;
} while (!(plr[pnum]._pMemSpells & ((__int64)1 << (v60 - 1))));
if (plr[pnum]._pSplLvl[v60] < 2)
plr[pnum]._pSplLvl[v60] = 0;
r = random(0, 37);
} while (!(plr[pnum]._pMemSpells & ((__int64)1 << r)));
if (plr[pnum]._pSplLvl[r] >= 2)
plr[pnum]._pSplLvl[r] -= 2;
else
plr[pnum]._pSplLvl[v60] -= 2;
plr[pnum]._pSplLvl[r] = 0;
}
InitDiabloMsg(EMSG_SHRINE_ENCHANTED);
break;
@ -3145,8 +3172,8 @@ void OperateShrine(int pnum, int i, int sType)
|| object[v1]._otype == OBJ_CHEST2
|| object[v1]._otype == OBJ_CHEST3)
&& !object[v1]._oSelFlag) {
object[v1]._oAnimFrame -= 2;
object[v1]._oRndSeed = GetRndSeed();
object[v1]._oAnimFrame -= 2;
object[v1]._oSelFlag = 1;
}
}
@ -3156,27 +3183,30 @@ void OperateShrine(int pnum, int i, int sType)
InitDiabloMsg(EMSG_SHRINE_THAUMATURGIC);
break;
case SHRINE_FASCINATING:
if (deltaload || pnum != myplr)
if (deltaload)
return;
if (pnum != myplr)
return;
plr[pnum]._pMemSpells |= (__int64)1 << (SPL_FIREBOLT - 1);
if (plr[pnum]._pSplLvl[SPL_FIREBOLT] < 15)
plr[pnum]._pSplLvl[SPL_FIREBOLT]++;
if (plr[pnum]._pSplLvl[SPL_FIREBOLT] < 15)
plr[pnum]._pSplLvl[SPL_FIREBOLT]++;
v72 = plr[pnum]._pMaxManaBase / 10;
min = plr[pnum]._pMana - plr[pnum]._pManaBase;
max = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;
plr[pnum]._pManaBase -= v72;
plr[pnum]._pMana -= v72;
plr[pnum]._pMaxManaBase -= v72;
plr[pnum]._pMaxMana -= v72;
t = plr[pnum]._pMaxManaBase / 10;
v1 = plr[pnum]._pMana - plr[pnum]._pManaBase;
v2 = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;
plr[pnum]._pManaBase -= t;
plr[pnum]._pMana -= t;
plr[pnum]._pMaxMana -= t;
plr[pnum]._pMaxManaBase -= t;
if (plr[pnum]._pMana >> 6 <= 0) {
plr[pnum]._pMana = min;
plr[pnum]._pManaBase = 0;
plr[pnum]._pMana = v1;
}
if (plr[pnum]._pMaxMana >> 6 <= 0) {
plr[pnum]._pMaxMana = max;
plr[pnum]._pMaxManaBase = 0;
plr[pnum]._pMaxMana = v2;
}
InitDiabloMsg(EMSG_SHRINE_FASCINATING);
break;
@ -3203,62 +3233,66 @@ void OperateShrine(int pnum, int i, int sType)
case SHRINE_ELDRITCH: /// BUGFIX: change `plr[pnum].HoldItem` to use a temporary buffer to prevent deleting item in hand
if (deltaload)
return;
if (pnum == myplr) {
for (j = 0; j < plr[pnum]._pNumInv; j++) {
if (!plr[pnum].InvList[j]._itype) {
if (plr[pnum].InvList[j]._iMiscId == IMISC_HEAL
|| plr[pnum].InvList[j]._iMiscId == IMISC_MANA) {
SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_REJUV));
GetPlrHandSeed(&plr[pnum].HoldItem);
plr[pnum].HoldItem._iStatFlag = 1;
plr[pnum].InvList[j] = plr[pnum].HoldItem;
}
if (plr[pnum].InvList[j]._iMiscId == IMISC_FULLHEAL
|| plr[pnum].InvList[j]._iMiscId == IMISC_FULLMANA) {
SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));
GetPlrHandSeed(&plr[pnum].HoldItem);
plr[pnum].HoldItem._iStatFlag = 1;
plr[pnum].InvList[j] = plr[pnum].HoldItem;
}
if (pnum != myplr)
break;
for (j = 0; j < plr[pnum]._pNumInv; j++) {
if (plr[pnum].InvList[j]._itype == ITYPE_MISC) {
if (plr[pnum].InvList[j]._iMiscId == IMISC_HEAL
|| plr[pnum].InvList[j]._iMiscId == IMISC_MANA) {
SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_REJUV));
GetPlrHandSeed(&plr[pnum].HoldItem);
plr[pnum].HoldItem._iStatFlag = 1;
plr[pnum].InvList[j] = plr[pnum].HoldItem;
}
if (plr[pnum].InvList[j]._iMiscId == IMISC_FULLHEAL
|| plr[pnum].InvList[j]._iMiscId == IMISC_FULLMANA) {
SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));
GetPlrHandSeed(&plr[pnum].HoldItem);
plr[pnum].HoldItem._iStatFlag = 1;
plr[pnum].InvList[j] = plr[pnum].HoldItem;
}
}
for (j = 0; j < 8; j++) {
if (!plr[pnum].SpdList[j]._itype) {
if (plr[pnum].SpdList[j]._iMiscId == IMISC_HEAL
|| plr[pnum].SpdList[j]._iMiscId == IMISC_MANA) {
SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_REJUV));
GetPlrHandSeed(&plr[pnum].HoldItem);
plr[pnum].HoldItem._iStatFlag = 1;
plr[pnum].SpdList[j] = plr[pnum].HoldItem;
}
if (plr[pnum].SpdList[j]._iMiscId == IMISC_FULLHEAL
|| plr[pnum].SpdList[j]._iMiscId == IMISC_FULLMANA) {
SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));
GetPlrHandSeed(&plr[pnum].HoldItem);
plr[pnum].HoldItem._iStatFlag = 1;
plr[pnum].SpdList[j] = plr[pnum].HoldItem;
}
}
for (j = 0; j < MAXBELTITEMS; j++) {
if (plr[pnum].SpdList[j]._itype == ITYPE_MISC) {
if (plr[pnum].SpdList[j]._iMiscId == IMISC_HEAL
|| plr[pnum].SpdList[j]._iMiscId == IMISC_MANA) {
SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_REJUV));
GetPlrHandSeed(&plr[pnum].HoldItem);
plr[pnum].HoldItem._iStatFlag = 1;
plr[pnum].SpdList[j] = plr[pnum].HoldItem;
}
if (plr[pnum].SpdList[j]._iMiscId == IMISC_FULLHEAL
|| plr[pnum].SpdList[j]._iMiscId == IMISC_FULLMANA) {
SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));
GetPlrHandSeed(&plr[pnum].HoldItem);
plr[pnum].HoldItem._iStatFlag = 1;
plr[pnum].SpdList[j] = plr[pnum].HoldItem;
}
}
InitDiabloMsg(EMSG_SHRINE_ELDRITCH);
}
InitDiabloMsg(EMSG_SHRINE_ELDRITCH);
break;
case SHRINE_EERIE:
if (deltaload || pnum != myplr)
if (deltaload)
return;
if (pnum != myplr)
return;
ModifyPlrMag(pnum, 2);
CheckStats(pnum);
InitDiabloMsg(EMSG_SHRINE_EERIE);
break;
case SHRINE_DIVINE:
if (deltaload || pnum != myplr)
if (deltaload)
return;
if (2 * currlevel >= 7) {
CreateTypeItem(object[i]._ox, object[i]._oy, 0, ITYPE_MISC, IMISC_FULLREJUV, 0, 1);
CreateTypeItem(object[i]._ox, object[i]._oy, 0, ITYPE_MISC, IMISC_FULLREJUV, 0, 1);
} else {
if (pnum != myplr)
return;
if (2 * currlevel < 7) {
CreateTypeItem(object[i]._ox, object[i]._oy, 0, ITYPE_MISC, IMISC_FULLMANA, 0, 1);
CreateTypeItem(object[i]._ox, object[i]._oy, 0, ITYPE_MISC, IMISC_FULLHEAL, 0, 1);
} else {
CreateTypeItem(object[i]._ox, object[i]._oy, 0, ITYPE_MISC, IMISC_FULLREJUV, 0, 1);
CreateTypeItem(object[i]._ox, object[i]._oy, 0, ITYPE_MISC, IMISC_FULLREJUV, 0, 1);
}
plr[pnum]._pMana = plr[pnum]._pMaxMana;
plr[pnum]._pManaBase = plr[pnum]._pMaxManaBase;
@ -3269,12 +3303,15 @@ void OperateShrine(int pnum, int i, int sType)
case SHRINE_HOLY:
if (deltaload)
return;
v88 = 0;
j = 0;
do {
v88++;
xx = random(159, MAXDUNX);
yy = random(159, MAXDUNY);
} while (v88 <= MAXDUNX * 112 && (nSolidTable[dPiece[xx][yy]] || dObject[xx][yy] || dMonster[xx][yy]));
j++;
if (j > MAXDUNX * 112)
break;
lv = dPiece[xx][yy];
} while (nSolidTable[lv] || dObject[xx][yy] || dMonster[xx][yy]);
AddMissile(plr[pnum].WorldX, plr[pnum].WorldY, xx, yy, plr[pnum]._pdir, MIS_RNDTELEPORT, -1, pnum, 0, 2 * leveltype);
if (pnum != myplr)
return;
@ -3288,37 +3325,39 @@ void OperateShrine(int pnum, int i, int sType)
plr[pnum]._pSplLvl[SPL_CBOLT]++;
if (plr[pnum]._pSplLvl[SPL_CBOLT] < 15)
plr[pnum]._pSplLvl[SPL_CBOLT]++;
v72 = plr[pnum]._pMaxManaBase / 10;
min = plr[pnum]._pMana - plr[pnum]._pManaBase;
max = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;
plr[pnum]._pManaBase -= v72;
plr[pnum]._pMana -= v72;
plr[pnum]._pMaxManaBase -= v72;
plr[pnum]._pMaxMana -= v72;
t = plr[pnum]._pMaxManaBase / 10;
v1 = plr[pnum]._pMana - plr[pnum]._pManaBase;
v2 = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;
plr[pnum]._pManaBase -= t;
plr[pnum]._pMana -= t;
plr[pnum]._pMaxMana -= t;
plr[pnum]._pMaxManaBase -= t;
if (plr[pnum]._pMana >> 6 <= 0) {
plr[pnum]._pMana = min;
plr[pnum]._pMana = v1;
plr[pnum]._pManaBase = 0;
}
if (plr[pnum]._pMaxMana >> 6 <= 0) {
plr[pnum]._pMaxMana = max;
plr[pnum]._pMaxMana = v2;
plr[pnum]._pMaxManaBase = 0;
}
InitDiabloMsg(EMSG_SHRINE_SACRED);
break;
case SHRINE_SPIRITUAL:
if (deltaload || pnum != myplr)
if (deltaload)
return;
if (pnum != myplr)
return;
for (j = 0; j < 40; j++) {
for (j = 0; j < NUM_INV_GRID_ELEM; j++) {
if (!plr[pnum].InvGrid[j]) {
v107 = 5 * leveltype + random(160, 10 * leveltype);
v108 = plr[pnum]._pNumInv; // check
plr[pnum].InvList[v108] = golditem;
r = 5 * leveltype + random(160, 10 * leveltype);
t = plr[pnum]._pNumInv; // check
plr[pnum].InvList[t] = golditem;
plr[pnum].InvList[t]._iSeed = GetRndSeed();
plr[pnum]._pNumInv++;
plr[pnum].InvList[v108]._iSeed = GetRndSeed();
plr[pnum].InvGrid[j] = plr[pnum]._pNumInv;
plr[pnum].InvList[v108]._ivalue = v107;
plr[pnum]._pGold += v107;
SetGoldCurs(pnum, v108);
plr[pnum].InvList[t]._ivalue = r;
plr[pnum]._pGold += r;
SetGoldCurs(pnum, t);
}
}
InitDiabloMsg(EMSG_SHRINE_SPIRITUAL);
@ -3337,7 +3376,9 @@ void OperateShrine(int pnum, int i, int sType)
}
break;
case SHRINE_ABANDONED:
if (deltaload || pnum != myplr)
if (deltaload)
return;
if (pnum != myplr)
return;
ModifyPlrDex(pnum, 2);
CheckStats(pnum);
@ -3345,7 +3386,9 @@ void OperateShrine(int pnum, int i, int sType)
InitDiabloMsg(EMSG_SHRINE_ABANDONED);
break;
case SHRINE_CREEPY:
if (deltaload || pnum != myplr)
if (deltaload)
return;
if (pnum != myplr)
return;
ModifyPlrStr(pnum, 2);
CheckStats(pnum);
@ -3353,7 +3396,9 @@ void OperateShrine(int pnum, int i, int sType)
InitDiabloMsg(EMSG_SHRINE_CREEPY);
break;
case SHRINE_QUIET:
if (deltaload || pnum != myplr)
if (deltaload)
return;
if (pnum != myplr)
return;
ModifyPlrVit(pnum, 2);
CheckStats(pnum);
@ -3363,42 +3408,47 @@ void OperateShrine(int pnum, int i, int sType)
case SHRINE_SECLUDED:
if (deltaload)
return;
if (pnum == myplr) {
for (yy = 0; yy < DMAXY; yy++) {
for (xx = 0; xx < DMAXX; xx++) {
automapview[xx][yy] = 1;
}
if (pnum != myplr)
break;
for (yy = 0; yy < DMAXY; yy++) {
for (xx = 0; xx < DMAXX; xx++) {
automapview[xx][yy] = 1;
}
InitDiabloMsg(EMSG_SHRINE_SECLUDED);
}
InitDiabloMsg(EMSG_SHRINE_SECLUDED);
break;
case SHRINE_ORNATE:
if (deltaload || pnum != myplr)
if (deltaload)
return;
if (pnum != myplr)
return;
plr[pnum]._pMemSpells |= (__int64)1 << (SPL_HBOLT - 1);
if (plr[pnum]._pSplLvl[SPL_HBOLT] < 15)
plr[pnum]._pSplLvl[SPL_HBOLT]++;
if (plr[pnum]._pSplLvl[SPL_HBOLT] < 15)
plr[pnum]._pSplLvl[SPL_HBOLT]++;
v72 = plr[pnum]._pMaxManaBase / 10;
min = plr[pnum]._pMana - plr[pnum]._pManaBase;
max = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;
plr[pnum]._pManaBase -= v72;
plr[pnum]._pMana -= v72;
plr[pnum]._pMaxManaBase -= v72;
plr[pnum]._pMaxMana -= v72;
t = plr[pnum]._pMaxManaBase / 10;
v1 = plr[pnum]._pMana - plr[pnum]._pManaBase;
v2 = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;
plr[pnum]._pManaBase -= t;
plr[pnum]._pMana -= t;
plr[pnum]._pMaxMana -= t;
plr[pnum]._pMaxManaBase -= t;
if (plr[pnum]._pMana >> 6 <= 0) {
plr[pnum]._pMana = min;
plr[pnum]._pMana = v1;
plr[pnum]._pManaBase = 0;
}
if (plr[pnum]._pMaxMana >> 6 <= 0) {
plr[pnum]._pMaxMana = max;
plr[pnum]._pMaxMana = v2;
plr[pnum]._pMaxManaBase = 0;
}
InitDiabloMsg(EMSG_SHRINE_ORNATE);
break;
case SHRINE_GLIMMERING:
if (deltaload || pnum != myplr)
if (deltaload)
return;
if (pnum != myplr)
return;
for (j = 0; j < 7; j++) {
if (plr[pnum].InvBody[j]._iMagical && !plr[pnum].InvBody[j]._iIdentified)
@ -3421,11 +3471,30 @@ void OperateShrine(int pnum, int i, int sType)
InitDiabloMsg(EMSG_SHRINE_TAINTED1);
} else {
InitDiabloMsg(EMSG_SHRINE_TAINTED2);
v133 = random(155, 4);
ModifyPlrStr(myplr, v133 == 0 ? 1 : -1);
ModifyPlrMag(myplr, v133 == 1 ? 1 : -1);
ModifyPlrDex(myplr, v133 == 2 ? 1 : -1);
ModifyPlrVit(myplr, v133 == 3 ? 1 : -1);
r = random(155, 4);
if (r != 0)
v1 = -1;
else
v1 = 1;
if (r != 1)
v2 = -1;
else
v2 = 1;
if (r == 2)
v3 = 1;
else
v3 = -1;
if (r == 3)
v4 = 1;
else
v4 = -1;
ModifyPlrStr(myplr, v1);
ModifyPlrMag(myplr, v2);
ModifyPlrDex(myplr, v3);
ModifyPlrVit(myplr, v4);
CheckStats(myplr);
}
break;

Loading…
Cancel
Save