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.
This commit is contained in:
parent
a1d4bdc98d
commit
ea63eecd17
1 changed files with 28 additions and 20 deletions
|
|
@ -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…
Add table
Add a link
Reference in a new issue