Browse Source

[hellfire] OperateShrine (#1931)

pull/876/head
qndel 6 years ago committed by Anders Jenbo
parent
commit
2aaaa844ea
  1. 172
      Source/objects.cpp
  2. 2
      enums.h

172
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);

2
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;

Loading…
Cancel
Save