From 748bb1f84d655ef77a6777af7f4a81c8fe0b969e Mon Sep 17 00:00:00 2001 From: staphen Date: Wed, 3 Aug 2022 00:36:40 -0400 Subject: [PATCH] Split delta trap operation from realtime trap operation --- Source/msg.cpp | 2 +- Source/objects.cpp | 24 ++++++++++++++++-------- Source/objects.h | 1 + 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/Source/msg.cpp b/Source/msg.cpp index 4b39a5b0b..99362077c 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -2550,7 +2550,7 @@ void DeltaLoadLevel() for (int i = 0; i < ActiveObjectCount; i++) { Object &object = Objects[ActiveObjects[i]]; if (object.IsTrap()) { - OperateTrap(object); + UpdateTrapState(object); } } } diff --git a/Source/objects.cpp b/Source/objects.cpp index 9051e61c5..9a4cc12a1 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -4433,10 +4433,10 @@ Object *AddObject(_object_id objType, Point objPos) return &object; } -void OperateTrap(Object &trap) +bool UpdateTrapState(Object &trap) { if (trap._oVar4 != 0) - return; + return false; Object &trigger = ObjectAtPosition({ trap._oVar1, trap._oVar2 }); switch (trigger._otype) { @@ -4449,7 +4449,7 @@ void OperateTrap(Object &trap) case OBJ_L5LDOOR: case OBJ_L5RDOOR: if (trigger._oVar4 == 0) - return; + return false; break; case OBJ_LEVER: case OBJ_CHEST1: @@ -4460,16 +4460,25 @@ void OperateTrap(Object &trap) case OBJ_L5LEVER: case OBJ_L5SARC: if (trigger._oSelFlag != 0) - return; + return false; break; default: - return; + return false; } trap._oVar4 = 1; + trigger._oTrapFlag = false; + return true; +} + +void OperateTrap(Object &trap) +{ + if (!UpdateTrapState(trap)) + return; // default to firing at the trigger object - Point target = trigger.position; + Point triggerPosition = { trap._oVar1, trap._oVar2 }; + Point target = triggerPosition; PointsInRectangleRange searchArea { Rectangle { target, 1 } }; // look for a player near the trigger (using a reverse search to match vanilla behaviour) @@ -4481,8 +4490,7 @@ void OperateTrap(Object &trap) Direction dir = GetDirection(trap.position, target); AddMissile(trap.position, target, dir, static_cast(trap._oVar3), TARGET_PLAYERS, -1, 0, 0); - PlaySfxLoc(IS_TRAP, trigger.position); - trigger._oTrapFlag = false; + PlaySfxLoc(IS_TRAP, triggerPosition); } void ProcessObjects() diff --git a/Source/objects.h b/Source/objects.h index 1cfff9bb8..305aa302e 100644 --- a/Source/objects.h +++ b/Source/objects.h @@ -306,6 +306,7 @@ void SetMapObjects(const uint16_t *dunData, int startx, int starty); * @param objPos tile coordinates */ Object *AddObject(_object_id objType, Point objPos); +bool UpdateTrapState(Object &trap); void OperateTrap(Object &trap); void ProcessObjects(); void RedoPlayerVision();