Browse Source

Use player by reference in OperateShrine

pull/4814/head
Anders Jenbo 4 years ago
parent
commit
b68fd1ff5e
  1. 271
      Source/objects.cpp

271
Source/objects.cpp

@ -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);
}

Loading…
Cancel
Save