Browse Source

Split delta trap operation from realtime trap operation

pull/5177/head
staphen 4 years ago committed by Anders Jenbo
parent
commit
748bb1f84d
  1. 2
      Source/msg.cpp
  2. 24
      Source/objects.cpp
  3. 1
      Source/objects.h

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

24
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<missile_id>(trap._oVar3), TARGET_PLAYERS, -1, 0, 0);
PlaySfxLoc(IS_TRAP, trigger.position);
trigger._oTrapFlag = false;
PlaySfxLoc(IS_TRAP, triggerPosition);
}
void ProcessObjects()

1
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();

Loading…
Cancel
Save