Skip to content

Commit

Permalink
Isolate shrine RNG from global RNG state
Browse files Browse the repository at this point in the history
  • Loading branch information
StephenCWills committed Nov 24, 2023
1 parent 3fc2017 commit def170b
Showing 1 changed file with 22 additions and 22 deletions.
44 changes: 22 additions & 22 deletions Source/objects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2233,7 +2233,7 @@ void OperatePedestal(Player &player, Object &pedestal, bool sendmsg)
}
}

void OperateShrineMysterious(Player &player)
void OperateShrineMysterious(DiabloGenerator &rng, Player &player)
{
if (&player != MyPlayer)
return;
Expand All @@ -2243,7 +2243,7 @@ void OperateShrineMysterious(Player &player)
ModifyPlrDex(player, -1);
ModifyPlrVit(player, -1);

switch (static_cast<CharacterAttribute>(GenerateRnd(4))) {
switch (static_cast<CharacterAttribute>(rng.generateRnd(4))) {
case CharacterAttribute::Strength:
ModifyPlrStr(player, 6);
break;
Expand All @@ -2265,7 +2265,7 @@ void OperateShrineMysterious(Player &player)
InitDiabloMsg(EMSG_SHRINE_MYSTERIOUS);
}

void OperateShrineHidden(Player &player)
void OperateShrineHidden(DiabloGenerator &rng, Player &player)
{
if (&player != MyPlayer)
return;
Expand Down Expand Up @@ -2295,7 +2295,7 @@ void OperateShrineHidden(Player &player)
}
if (cnt == 0)
break;
int r = GenerateRnd(NUM_INVLOC);
int r = rng.generateRnd(NUM_INVLOC);
if (player.InvBody[r].isEmpty() || player.InvBody[r]._iMaxDur == DUR_INDESTRUCTIBLE || player.InvBody[r]._iMaxDur == 0)
continue;

Expand Down Expand Up @@ -2422,7 +2422,7 @@ void OperateShrineReligious(Player &player)
InitDiabloMsg(EMSG_SHRINE_RELIGIOUS);
}

void OperateShrineEnchanted(Player &player)
void OperateShrineEnchanted(DiabloGenerator &rng, Player &player)
{
if (&player != MyPlayer)
return;
Expand All @@ -2439,7 +2439,7 @@ void OperateShrineEnchanted(Player &player)
if (cnt > 1) {
int spellToReduce;
do {
spellToReduce = GenerateRnd(maxSpells) + 1;
spellToReduce = rng.generateRnd(maxSpells) + 1;
} while ((player._pMemSpells & GetSpellBitmask(static_cast<SpellID>(spellToReduce))) == 0);

spell = 1;
Expand Down Expand Up @@ -2471,12 +2471,12 @@ void OperateShrineEnchanted(Player &player)
InitDiabloMsg(EMSG_SHRINE_ENCHANTED);
}

void OperateShrineThaumaturgic(const Player &player)
void OperateShrineThaumaturgic(DiabloGenerator &rng, const Player &player)
{
for (int j = 0; j < ActiveObjectCount; j++) {
Object &object = Objects[ActiveObjects[j]];
if (object.IsChest() && object._oSelFlag == 0) {
object._oRndSeed = AdvanceRndSeed();
object._oRndSeed = rng.advanceRndSeed();
object._oSelFlag = 1;
object._oAnimFrame -= 2;
}
Expand Down Expand Up @@ -2640,15 +2640,15 @@ void OperateShrineHoly(const Player &player)
InitDiabloMsg(EMSG_SHRINE_HOLY);
}

void OperateShrineSpiritual(Player &player)
void OperateShrineSpiritual(DiabloGenerator &rng, Player &player)
{
if (&player != MyPlayer)
return;

for (int8_t &itemIndex : player.InvGrid) {
if (itemIndex == 0) {
Item &goldItem = player.InvList[player._pNumInv];
MakeGoldStack(goldItem, 5 * leveltype + GenerateRnd(10 * leveltype));
MakeGoldStack(goldItem, 5 * leveltype + rng.generateRnd(10 * leveltype));
player._pNumInv++;
itemIndex = player._pNumInv;

Expand Down Expand Up @@ -2746,14 +2746,14 @@ void OperateShrineGlimmering(Player &player)
InitDiabloMsg(EMSG_SHRINE_GLIMMERING);
}

void OperateShrineTainted(const Player &player)
void OperateShrineTainted(DiabloGenerator &rng, const Player &player)
{
if (&player == MyPlayer) {
InitDiabloMsg(EMSG_SHRINE_TAINTED1);
return;
}

int r = GenerateRnd(4);
int r = rng.generateRnd(4);

int v1 = r == 0 ? 1 : -1;
int v2 = r == 1 ? 1 : -1;
Expand Down Expand Up @@ -2949,14 +2949,14 @@ void OperateShrineSolar(Player &player)
RedrawEverything();
}

void OperateShrineMurphys(Player &player)
void OperateShrineMurphys(DiabloGenerator &rng, Player &player)
{
if (&player != MyPlayer)
return;

bool broke = false;
for (auto &item : player.InvBody) {
if (!item.isEmpty() && FlipCoin(3)) {
if (!item.isEmpty() && rng.flipCoin(3)) {
if (item._iDurability != DUR_INDESTRUCTIBLE) {
if (item._iDurability > 0) {
item._iDurability /= 2;
Expand All @@ -2980,7 +2980,7 @@ void OperateShrine(Player &player, Object &shrine, SfxID sType)

CloseGoldDrop();

SetRndSeed(shrine._oRndSeed);
DiabloGenerator rng(shrine._oRndSeed);
shrine._oSelFlag = 0;

PlaySfxLoc(sType, shrine.position);
Expand All @@ -2989,10 +2989,10 @@ void OperateShrine(Player &player, Object &shrine, SfxID sType)

switch (shrine._oVar1) {
case ShrineMysterious:
OperateShrineMysterious(player);
OperateShrineMysterious(rng, player);
break;
case ShrineHidden:
OperateShrineHidden(player);
OperateShrineHidden(rng, player);
break;
case ShrineGloomy:
OperateShrineGloomy(player);
Expand All @@ -3011,10 +3011,10 @@ void OperateShrine(Player &player, Object &shrine, SfxID sType)
OperateShrineReligious(player);
break;
case ShrineEnchanted:
OperateShrineEnchanted(player);
OperateShrineEnchanted(rng, player);
break;
case ShrineThaumaturgic:
OperateShrineThaumaturgic(player);
OperateShrineThaumaturgic(rng, player);
break;
case ShrineFascinating:
OperateShrineCostOfWisdom(player, SpellID::Firebolt, EMSG_SHRINE_FASCINATING);
Expand All @@ -3038,7 +3038,7 @@ void OperateShrine(Player &player, Object &shrine, SfxID sType)
OperateShrineCostOfWisdom(player, SpellID::ChargedBolt, EMSG_SHRINE_SACRED);
break;
case ShrineSpiritual:
OperateShrineSpiritual(player);
OperateShrineSpiritual(rng, player);
break;
case ShrineSpooky:
OperateShrineSpooky(player);
Expand All @@ -3062,7 +3062,7 @@ void OperateShrine(Player &player, Object &shrine, SfxID sType)
OperateShrineGlimmering(player);
break;
case ShrineTainted:
OperateShrineTainted(player);
OperateShrineTainted(rng, player);
break;
case ShrineOily:
OperateShrineOily(player, shrine.position);
Expand All @@ -3086,7 +3086,7 @@ void OperateShrine(Player &player, Object &shrine, SfxID sType)
OperateShrineSolar(player);
break;
case ShrineMurphys:
OperateShrineMurphys(player);
OperateShrineMurphys(rng, player);
break;
}

Expand Down

0 comments on commit def170b

Please sign in to comment.