Browse Source

Break out crux search logic from BreakCrux/SyncCrux

Really blanking on a good name for that function. Might not even be necessary given I think the BreakCrux use is effectively dead code, it could be rolled back into SyncCrux.
pull/2341/head
ephphatha 5 years ago committed by Anders Jenbo
parent
commit
ea63eecd17
  1. 48
      Source/objects.cpp

48
Source/objects.cpp

@ -5009,6 +5009,30 @@ void SyncOpObject(int pnum, int cmd, int i)
}
}
/**
* @brief Checks if all active crux objects of the given type have been broken.
*
* Called by BreakCrux and SyncCrux to see if the linked map area needs to be updated. In practice I think this is
* always true when called by BreakCrux as there *should* only be one instance of each crux with a given _oVar8 value?
*
* @param cruxType Discriminator/type (_oVar8 value) of the crux object which is currently changing state
* @return true if all active cruxes of that type on the level are broken, false if at least one remains unbroken
*/
bool AreAllCruxesOfTypeBroken(int cruxType)
{
for (int j = 0; j < ActiveObjectCount; j++) {
const auto &testObject = Objects[ActiveObjects[j]];
if (IsNoneOf(testObject._otype, OBJ_CRUX1, OBJ_CRUX2, OBJ_CRUX3))
continue; // Not a Crux object, keep searching
if (cruxType != testObject._oVar8 || testObject._oBreak == -1)
continue; // Found either a different crux or a previously broken crux, keep searching
// Found an unbroken crux of this type
return false;
}
return true;
}
void BreakCrux(ObjectStruct &crux)
{
crux._oAnimFlag = 1;
@ -5018,17 +5042,10 @@ void BreakCrux(ObjectStruct &crux)
crux._oMissFlag = true;
crux._oBreak = -1;
crux._oSelFlag = 0;
bool triggered = true;
for (int j = 0; j < ActiveObjectCount; j++) {
const auto &testObject = Objects[ActiveObjects[j]];
if (IsNoneOf(testObject._otype, OBJ_CRUX1, OBJ_CRUX2, OBJ_CRUX3))
continue;
if (crux._oVar8 != testObject._oVar8 || testObject._oBreak == -1)
continue;
triggered = false;
}
if (!triggered)
if (!AreAllCruxesOfTypeBroken(crux._oVar8))
return;
if (!deltaload)
PlaySfxLoc(IS_LEVER, crux.position);
ObjChangeMap(crux._oVar1, crux._oVar2, crux._oVar3, crux._oVar4);
@ -5144,16 +5161,7 @@ void SyncBreakObj(int pnum, int oi)
void SyncCrux(const ObjectStruct &crux)
{
bool found = true;
for (int j = 0; j < ActiveObjectCount; j++) {
const auto &testObject = Objects[ActiveObjects[j]];
if (IsNoneOf(testObject._otype, OBJ_CRUX1, OBJ_CRUX2, OBJ_CRUX3))
continue;
if (crux._oVar8 != testObject._oVar8 || testObject._oBreak == -1)
continue;
found = false;
}
if (found)
if (AreAllCruxesOfTypeBroken(crux._oVar8))
ObjChangeMap(crux._oVar1, crux._oVar2, crux._oVar3, crux._oVar4);
}

Loading…
Cancel
Save