|
|
|
|
@ -2551,13 +2551,11 @@ void OperatePedistal(int pnum, int i)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineMysterious(int pnum) |
|
|
|
|
void OperateShrineMysterious(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
ModifyPlrStr(player, -1); |
|
|
|
|
ModifyPlrMag(player, -1); |
|
|
|
|
ModifyPlrDex(player, -1); |
|
|
|
|
@ -2585,13 +2583,11 @@ void OperateShrineMysterious(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_MYSTERIOUS); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineHidden(int pnum) |
|
|
|
|
void OperateShrineHidden(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
int cnt = 0; |
|
|
|
|
for (const auto &item : player.InvBody) { |
|
|
|
|
if (!item.isEmpty()) |
|
|
|
|
@ -2634,13 +2630,11 @@ void OperateShrineHidden(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_HIDDEN); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineGloomy(int pnum) |
|
|
|
|
void OperateShrineGloomy(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
// Increment armor class by 2 and decrements max damage by 1.
|
|
|
|
|
for (Item &item : PlayerItemsRange(player)) { |
|
|
|
|
switch (item._itype) { |
|
|
|
|
@ -2665,18 +2659,16 @@ void OperateShrineGloomy(int pnum)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CalcPlrInv(Players[pnum], true); |
|
|
|
|
CalcPlrInv(player, true); |
|
|
|
|
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_GLOOMY); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineWeird(int pnum) |
|
|
|
|
void OperateShrineWeird(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
if (!player.InvBody[INVLOC_HAND_LEFT].isEmpty() && player.InvBody[INVLOC_HAND_LEFT]._itype != ItemType::Shield) |
|
|
|
|
player.InvBody[INVLOC_HAND_LEFT]._iMaxDam++; |
|
|
|
|
if (!player.InvBody[INVLOC_HAND_RIGHT].isEmpty() && player.InvBody[INVLOC_HAND_RIGHT]._itype != ItemType::Shield) |
|
|
|
|
@ -2696,7 +2688,7 @@ void OperateShrineWeird(int pnum)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CalcPlrInv(Players[pnum], true); |
|
|
|
|
CalcPlrInv(player, true); |
|
|
|
|
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_WEIRD); |
|
|
|
|
} |
|
|
|
|
@ -2705,9 +2697,6 @@ void OperateShrineMagical(int pnum)
|
|
|
|
|
{ |
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
AddMissile( |
|
|
|
|
player.position.tile, |
|
|
|
|
player.position.tile, |
|
|
|
|
@ -2718,15 +2707,18 @@ void OperateShrineMagical(int pnum)
|
|
|
|
|
0, |
|
|
|
|
2 * leveltype); |
|
|
|
|
|
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_MAGICAL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineStone(int pnum) |
|
|
|
|
void OperateShrineStone(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
for (Item &item : PlayerItemsRange { Players[pnum] }) { |
|
|
|
|
for (Item &item : PlayerItemsRange { player }) { |
|
|
|
|
if (item._itype == ItemType::Staff) |
|
|
|
|
item._iCharges = item._iMaxCharges; |
|
|
|
|
} |
|
|
|
|
@ -2736,25 +2728,23 @@ void OperateShrineStone(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_STONE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineReligious(int pnum) |
|
|
|
|
void OperateShrineReligious(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
for (Item &item : PlayerItemsRange { Players[pnum] }) { |
|
|
|
|
for (Item &item : PlayerItemsRange { player }) { |
|
|
|
|
item._iDurability = item._iMaxDur; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_RELIGIOUS); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineEnchanted(int pnum) |
|
|
|
|
void OperateShrineEnchanted(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
int cnt = 0; |
|
|
|
|
uint64_t spell = 1; |
|
|
|
|
int maxSpells = gbIsHellfire ? MAX_SPELLS : 37; |
|
|
|
|
@ -2786,7 +2776,7 @@ void OperateShrineEnchanted(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_ENCHANTED); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineThaumaturgic(int pnum) |
|
|
|
|
void OperateShrineThaumaturgic(Player &player) |
|
|
|
|
{ |
|
|
|
|
for (int j = 0; j < ActiveObjectCount; j++) { |
|
|
|
|
int v1 = ActiveObjects[j]; |
|
|
|
|
@ -2798,19 +2788,17 @@ void OperateShrineThaumaturgic(int pnum)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_THAUMATURGIC); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineCostOfWisdom(int pnum, spell_id spellId, diablo_message message) |
|
|
|
|
void OperateShrineCostOfWisdom(Player &player, spell_id spellId, diablo_message message) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
player._pMemSpells |= GetSpellBitmask(spellId); |
|
|
|
|
|
|
|
|
|
if (player._pSplLvl[spellId] < MAX_SPELL_LEVEL) |
|
|
|
|
@ -2853,7 +2841,7 @@ void OperateShrineCryptic(int pnum)
|
|
|
|
|
0, |
|
|
|
|
2 * leveltype); |
|
|
|
|
|
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
player._pMana = player._pMaxMana; |
|
|
|
|
@ -2864,12 +2852,12 @@ void OperateShrineCryptic(int pnum)
|
|
|
|
|
force_redraw = 255; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineEldritch(int pnum) |
|
|
|
|
void OperateShrineEldritch(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
for (Item &item : InventoryAndBeltPlayerItemsRange { Players[pnum] }) { |
|
|
|
|
for (Item &item : InventoryAndBeltPlayerItemsRange { player }) { |
|
|
|
|
if (item._itype != ItemType::Misc) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
@ -2890,13 +2878,11 @@ void OperateShrineEldritch(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_ELDRITCH); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineEerie(int pnum) |
|
|
|
|
void OperateShrineEerie(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
ModifyPlrMag(player, 2); |
|
|
|
|
CheckStats(player); |
|
|
|
|
CalcPlrInv(player, true); |
|
|
|
|
@ -2908,18 +2894,15 @@ void OperateShrineEerie(int pnum)
|
|
|
|
|
/**
|
|
|
|
|
* @brief Fully restores HP and Mana of the active player and spawns a pair of potions |
|
|
|
|
* in response to the player activating a Divine shrine |
|
|
|
|
* @param pnum The player that activated the shrine |
|
|
|
|
* @param spawnPosition The map tile where the potions will be spawned |
|
|
|
|
* @return false if the shrine was activated by another player in a multiplayer game and |
|
|
|
|
* no changes were made by this instance, true otherwise. |
|
|
|
|
*/ |
|
|
|
|
void OperateShrineDivine(int pnum, Point spawnPosition) |
|
|
|
|
void OperateShrineDivine(Player &player, Point spawnPosition) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
if (currlevel < 4) { |
|
|
|
|
CreateTypeItem(spawnPosition, false, ItemType::Misc, IMISC_FULLMANA, false, true); |
|
|
|
|
CreateTypeItem(spawnPosition, false, ItemType::Misc, IMISC_FULLHEAL, false, true); |
|
|
|
|
@ -2940,21 +2923,21 @@ void OperateShrineDivine(int pnum, Point spawnPosition)
|
|
|
|
|
|
|
|
|
|
void OperateShrineHoly(int pnum) |
|
|
|
|
{ |
|
|
|
|
AddMissile(Players[pnum].position.tile, { 0, 0 }, Direction::South, MIS_RNDTELEPORT, TARGET_PLAYERS, pnum, 0, 2 * leveltype); |
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
AddMissile(player.position.tile, { 0, 0 }, Direction::South, MIS_RNDTELEPORT, TARGET_PLAYERS, pnum, 0, 2 * leveltype); |
|
|
|
|
|
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_HOLY); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineSpiritual(int pnum) |
|
|
|
|
void OperateShrineSpiritual(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
for (int8_t &itemIndex : player.InvGrid) { |
|
|
|
|
if (itemIndex == 0) { |
|
|
|
|
Item &goldItem = player.InvList[player._pNumInv]; |
|
|
|
|
@ -2969,9 +2952,9 @@ void OperateShrineSpiritual(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_SPIRITUAL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineSpooky(int pnum) |
|
|
|
|
void OperateShrineSpooky(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum == MyPlayerId) { |
|
|
|
|
if (&player == MyPlayer) { |
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_SPOOKY1); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
@ -2988,13 +2971,11 @@ void OperateShrineSpooky(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_SPOOKY2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineAbandoned(int pnum) |
|
|
|
|
void OperateShrineAbandoned(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
ModifyPlrDex(player, 2); |
|
|
|
|
CheckStats(player); |
|
|
|
|
CalcPlrInv(player, true); |
|
|
|
|
@ -3003,13 +2984,11 @@ void OperateShrineAbandoned(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_ABANDONED); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineCreepy(int pnum) |
|
|
|
|
void OperateShrineCreepy(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
ModifyPlrStr(player, 2); |
|
|
|
|
CheckStats(player); |
|
|
|
|
CalcPlrInv(player, true); |
|
|
|
|
@ -3018,13 +2997,11 @@ void OperateShrineCreepy(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_CREEPY); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineQuiet(int pnum) |
|
|
|
|
void OperateShrineQuiet(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
ModifyPlrVit(player, 2); |
|
|
|
|
CheckStats(player); |
|
|
|
|
CalcPlrInv(player, true); |
|
|
|
|
@ -3033,9 +3010,9 @@ void OperateShrineQuiet(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_QUIET); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineSecluded(int pnum) |
|
|
|
|
void OperateShrineSecluded(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
for (int x = 0; x < DMAXX; x++) |
|
|
|
|
@ -3045,26 +3022,26 @@ void OperateShrineSecluded(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_SECLUDED); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineGlimmering(int pnum) |
|
|
|
|
void OperateShrineGlimmering(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
for (Item &item : PlayerItemsRange { Players[pnum] }) { |
|
|
|
|
for (Item &item : PlayerItemsRange { player }) { |
|
|
|
|
if (item._iMagical != ITEM_QUALITY_NORMAL && !item._iIdentified) { |
|
|
|
|
item._iIdentified = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CalcPlrInv(Players[pnum], true); |
|
|
|
|
CalcPlrInv(player, true); |
|
|
|
|
force_redraw = 255; |
|
|
|
|
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_GLIMMERING); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineTainted(int pnum) |
|
|
|
|
void OperateShrineTainted(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum == MyPlayerId) { |
|
|
|
|
if (&player == MyPlayer) { |
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_TAINTED1); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
@ -3076,15 +3053,15 @@ void OperateShrineTainted(int pnum)
|
|
|
|
|
int v3 = r == 2 ? 1 : -1; |
|
|
|
|
int v4 = r == 3 ? 1 : -1; |
|
|
|
|
|
|
|
|
|
Player &player = *MyPlayer; |
|
|
|
|
Player &myPlayer = *MyPlayer; |
|
|
|
|
|
|
|
|
|
ModifyPlrStr(player, v1); |
|
|
|
|
ModifyPlrMag(player, v2); |
|
|
|
|
ModifyPlrDex(player, v3); |
|
|
|
|
ModifyPlrVit(player, v4); |
|
|
|
|
ModifyPlrStr(myPlayer, v1); |
|
|
|
|
ModifyPlrMag(myPlayer, v2); |
|
|
|
|
ModifyPlrDex(myPlayer, v3); |
|
|
|
|
ModifyPlrVit(myPlayer, v4); |
|
|
|
|
|
|
|
|
|
CheckStats(player); |
|
|
|
|
CalcPlrInv(player, true); |
|
|
|
|
CheckStats(myPlayer); |
|
|
|
|
CalcPlrInv(myPlayer, true); |
|
|
|
|
force_redraw = 255; |
|
|
|
|
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_TAINTED2); |
|
|
|
|
@ -3093,16 +3070,13 @@ void OperateShrineTainted(int pnum)
|
|
|
|
|
/**
|
|
|
|
|
* @brief Oily shrines increase the players primary stat(s) by a total of two, but spawn a |
|
|
|
|
* firewall near the shrine that will spread towards the player |
|
|
|
|
* @param pnum The player that activated the shrine |
|
|
|
|
* @param spawnPosition Start location for the firewall |
|
|
|
|
*/ |
|
|
|
|
void OperateShrineOily(int pnum, Point spawnPosition) |
|
|
|
|
void OperateShrineOily(Player &player, Point spawnPosition) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
switch (player._pClass) { |
|
|
|
|
case HeroClass::Warrior: |
|
|
|
|
ModifyPlrStr(player, 2); |
|
|
|
|
@ -3126,8 +3100,8 @@ void OperateShrineOily(int pnum, Point spawnPosition)
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CheckStats(Players[pnum]); |
|
|
|
|
CalcPlrInv(Players[pnum], true); |
|
|
|
|
CheckStats(player); |
|
|
|
|
CalcPlrInv(player, true); |
|
|
|
|
force_redraw = 255; |
|
|
|
|
|
|
|
|
|
AddMissile( |
|
|
|
|
@ -3143,13 +3117,11 @@ void OperateShrineOily(int pnum, Point spawnPosition)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_OILY); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineGlowing(int pnum) |
|
|
|
|
void OperateShrineGlowing(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
// Add 0-5 points to Magic (0.1% of the players XP)
|
|
|
|
|
ModifyPlrMag(player, static_cast<int>(std::min<uint32_t>(player._pExperience / 1000, 5))); |
|
|
|
|
|
|
|
|
|
@ -3165,13 +3137,11 @@ void OperateShrineGlowing(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_GLOWING); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineMendicant(int pnum) |
|
|
|
|
void OperateShrineMendicant(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
int gold = player._pGold / 2; |
|
|
|
|
AddPlrExperience(player, player._pLevel, gold); |
|
|
|
|
TakePlrsMoney(gold); |
|
|
|
|
@ -3183,16 +3153,13 @@ void OperateShrineMendicant(int pnum)
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Grants experience to the player based on their current level while also triggering a magic trap |
|
|
|
|
* @param pnum The player that activated the shrine |
|
|
|
|
* @param spawnPosition The trap results in casting flash from this location targeting the player |
|
|
|
|
*/ |
|
|
|
|
void OperateShrineSparkling(int pnum, Point spawnPosition) |
|
|
|
|
void OperateShrineSparkling(Player &player, Point spawnPosition) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
AddPlrExperience(player, player._pLevel, 1000 * currlevel); |
|
|
|
|
|
|
|
|
|
AddMissile( |
|
|
|
|
@ -3217,15 +3184,15 @@ void OperateShrineSparkling(int pnum, Point spawnPosition)
|
|
|
|
|
*/ |
|
|
|
|
void OperateShrineTown(int pnum, Point spawnPosition) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
return; |
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
Player &myPlayer = *MyPlayer; |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
AddMissile( |
|
|
|
|
spawnPosition, |
|
|
|
|
myPlayer.position.tile, |
|
|
|
|
myPlayer._pdir, |
|
|
|
|
player.position.tile, |
|
|
|
|
player._pdir, |
|
|
|
|
MIS_TOWN, |
|
|
|
|
TARGET_PLAYERS, |
|
|
|
|
pnum, |
|
|
|
|
@ -3235,13 +3202,11 @@ void OperateShrineTown(int pnum, Point spawnPosition)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_TOWN); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineShimmering(int pnum) |
|
|
|
|
void OperateShrineShimmering(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
player._pMana = player._pMaxMana; |
|
|
|
|
player._pManaBase = player._pMaxManaBase; |
|
|
|
|
|
|
|
|
|
@ -3250,13 +3215,11 @@ void OperateShrineShimmering(int pnum)
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_SHIMMERING); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineSolar(int pnum) |
|
|
|
|
void OperateShrineSolar(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
time_t tm = time(nullptr); |
|
|
|
|
int hour = localtime(&tm)->tm_hour; |
|
|
|
|
if (hour >= 20 || hour < 4) { |
|
|
|
|
@ -3278,15 +3241,13 @@ void OperateShrineSolar(int pnum)
|
|
|
|
|
force_redraw = 255; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void OperateShrineMurphys(int pnum) |
|
|
|
|
void OperateShrineMurphys(Player &player) |
|
|
|
|
{ |
|
|
|
|
if (pnum != MyPlayerId) |
|
|
|
|
if (&player != MyPlayer) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
Player &myPlayer = *MyPlayer; |
|
|
|
|
|
|
|
|
|
bool broke = false; |
|
|
|
|
for (auto &item : myPlayer.InvBody) { |
|
|
|
|
for (auto &item : player.InvBody) { |
|
|
|
|
if (!item.isEmpty() && GenerateRnd(3) == 0) { |
|
|
|
|
if (item._iDurability != DUR_INDESTRUCTIBLE) { |
|
|
|
|
if (item._iDurability > 0) { |
|
|
|
|
@ -3298,7 +3259,7 @@ void OperateShrineMurphys(int pnum)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (!broke) { |
|
|
|
|
TakePlrsMoney(myPlayer._pGold / 3); |
|
|
|
|
TakePlrsMoney(player._pGold / 3); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
InitDiabloMsg(EMSG_SHRINE_MURPHYS); |
|
|
|
|
@ -3324,110 +3285,112 @@ void OperateShrine(int pnum, int i, _sfx_id sType)
|
|
|
|
|
shrine._oAnimFlag = true; |
|
|
|
|
shrine._oAnimDelay = 1; |
|
|
|
|
|
|
|
|
|
Player &player = Players[pnum]; |
|
|
|
|
|
|
|
|
|
switch (shrine._oVar1) { |
|
|
|
|
case ShrineMysterious: |
|
|
|
|
OperateShrineMysterious(pnum); |
|
|
|
|
OperateShrineMysterious(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineHidden: |
|
|
|
|
OperateShrineHidden(pnum); |
|
|
|
|
OperateShrineHidden(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineGloomy: |
|
|
|
|
OperateShrineGloomy(pnum); |
|
|
|
|
OperateShrineGloomy(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineWeird: |
|
|
|
|
OperateShrineWeird(pnum); |
|
|
|
|
OperateShrineWeird(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineMagical: |
|
|
|
|
case ShrineMagicaL2: |
|
|
|
|
OperateShrineMagical(pnum); |
|
|
|
|
break; |
|
|
|
|
case ShrineStone: |
|
|
|
|
OperateShrineStone(pnum); |
|
|
|
|
OperateShrineStone(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineReligious: |
|
|
|
|
OperateShrineReligious(pnum); |
|
|
|
|
OperateShrineReligious(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineEnchanted: |
|
|
|
|
OperateShrineEnchanted(pnum); |
|
|
|
|
OperateShrineEnchanted(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineThaumaturgic: |
|
|
|
|
OperateShrineThaumaturgic(pnum); |
|
|
|
|
OperateShrineThaumaturgic(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineFascinating: |
|
|
|
|
OperateShrineCostOfWisdom(pnum, SPL_FIREBOLT, EMSG_SHRINE_FASCINATING); |
|
|
|
|
OperateShrineCostOfWisdom(player, SPL_FIREBOLT, EMSG_SHRINE_FASCINATING); |
|
|
|
|
break; |
|
|
|
|
case ShrineCryptic: |
|
|
|
|
OperateShrineCryptic(pnum); |
|
|
|
|
break; |
|
|
|
|
case ShrineEldritch: |
|
|
|
|
OperateShrineEldritch(pnum); |
|
|
|
|
OperateShrineEldritch(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineEerie: |
|
|
|
|
OperateShrineEerie(pnum); |
|
|
|
|
OperateShrineEerie(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineDivine: |
|
|
|
|
OperateShrineDivine(pnum, shrine.position); |
|
|
|
|
OperateShrineDivine(player, shrine.position); |
|
|
|
|
break; |
|
|
|
|
case ShrineHoly: |
|
|
|
|
OperateShrineHoly(pnum); |
|
|
|
|
break; |
|
|
|
|
case ShrineSacred: |
|
|
|
|
OperateShrineCostOfWisdom(pnum, SPL_CBOLT, EMSG_SHRINE_SACRED); |
|
|
|
|
OperateShrineCostOfWisdom(player, SPL_CBOLT, EMSG_SHRINE_SACRED); |
|
|
|
|
break; |
|
|
|
|
case ShrineSpiritual: |
|
|
|
|
OperateShrineSpiritual(pnum); |
|
|
|
|
OperateShrineSpiritual(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineSpooky: |
|
|
|
|
OperateShrineSpooky(pnum); |
|
|
|
|
OperateShrineSpooky(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineAbandoned: |
|
|
|
|
OperateShrineAbandoned(pnum); |
|
|
|
|
OperateShrineAbandoned(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineCreepy: |
|
|
|
|
OperateShrineCreepy(pnum); |
|
|
|
|
OperateShrineCreepy(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineQuiet: |
|
|
|
|
OperateShrineQuiet(pnum); |
|
|
|
|
OperateShrineQuiet(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineSecluded: |
|
|
|
|
OperateShrineSecluded(pnum); |
|
|
|
|
OperateShrineSecluded(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineOrnate: |
|
|
|
|
OperateShrineCostOfWisdom(pnum, SPL_HBOLT, EMSG_SHRINE_ORNATE); |
|
|
|
|
OperateShrineCostOfWisdom(player, SPL_HBOLT, EMSG_SHRINE_ORNATE); |
|
|
|
|
break; |
|
|
|
|
case ShrineGlimmering: |
|
|
|
|
OperateShrineGlimmering(pnum); |
|
|
|
|
OperateShrineGlimmering(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineTainted: |
|
|
|
|
OperateShrineTainted(pnum); |
|
|
|
|
OperateShrineTainted(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineOily: |
|
|
|
|
OperateShrineOily(pnum, shrine.position); |
|
|
|
|
OperateShrineOily(player, shrine.position); |
|
|
|
|
break; |
|
|
|
|
case ShrineGlowing: |
|
|
|
|
OperateShrineGlowing(pnum); |
|
|
|
|
OperateShrineGlowing(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineMendicant: |
|
|
|
|
OperateShrineMendicant(pnum); |
|
|
|
|
OperateShrineMendicant(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineSparkling: |
|
|
|
|
OperateShrineSparkling(pnum, shrine.position); |
|
|
|
|
OperateShrineSparkling(player, shrine.position); |
|
|
|
|
break; |
|
|
|
|
case ShrineTown: |
|
|
|
|
OperateShrineTown(pnum, shrine.position); |
|
|
|
|
break; |
|
|
|
|
case ShrineShimmering: |
|
|
|
|
OperateShrineShimmering(pnum); |
|
|
|
|
OperateShrineShimmering(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineSolar: |
|
|
|
|
OperateShrineSolar(pnum); |
|
|
|
|
OperateShrineSolar(player); |
|
|
|
|
break; |
|
|
|
|
case ShrineMurphys: |
|
|
|
|
OperateShrineMurphys(pnum); |
|
|
|
|
OperateShrineMurphys(player); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (pnum == MyPlayerId) |
|
|
|
|
if (&player == MyPlayer) |
|
|
|
|
NetSendCmdParam2(false, CMD_PLROPOBJ, pnum, i); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|