GliderPRO/Sources/Triggers.c

1 line
4.3 KiB
C
Executable File

//============================================================================
//----------------------------------------------------------------------------
// Triggers.c
//----------------------------------------------------------------------------
//============================================================================
#include "Externs.h"
#define kMaxTriggers 16
typedef struct
{
short object, room;
short index, timer;
short what;
Boolean armed;
} trigType, *trigPtr;
short FindEmptyTriggerSlot (void);
void FireTrigger (short);
trigType triggers[kMaxTriggers];
//============================================================== Functions
//-------------------------------------------------------------- ArmTrigger
void ArmTrigger (hotPtr who)
{
short where, whoLinked;
if (who->stillOver)
return;
where = FindEmptyTriggerSlot();
if (where != -1)
{
whoLinked = who->who; // what is trigger's obj. #
triggers[where].room = masterObjects[whoLinked].roomLink;
triggers[where].object = masterObjects[whoLinked].objectLink;
triggers[where].index = whoLinked;
triggers[where].timer = masterObjects[whoLinked].theObject.data.e.delay * 3;
triggers[where].what = masterObjects[triggers[where].object].theObject.what;
triggers[where].armed = true;
}
who->stillOver = true;
}
//-------------------------------------------------------------- FindEmptyTriggerSlot
short FindEmptyTriggerSlot (void)
{
short where, i;
where = -1;
for (i = 0; i < kMaxTriggers; i++)
{
if (!triggers[i].armed)
{
where = i;
break;
}
}
return (where);
}
//-------------------------------------------------------------- HandleTriggers
void HandleTriggers (void)
{
short i;
for (i = 0; i < kMaxTriggers; i++)
{
if (triggers[i].armed)
{
triggers[i].timer--;
if (triggers[i].timer <= 0)
{
triggers[i].timer = 0;
triggers[i].armed = false;
FireTrigger(i);
}
}
}
}
//-------------------------------------------------------------- FireTrigger
void FireTrigger (short index)
{
short triggerIs, triggeredIs;
char wasState;
triggerIs = triggers[index].index;
if (masterObjects[triggerIs].localLink != -1)
{
triggeredIs = masterObjects[triggerIs].localLink;
switch (masterObjects[triggeredIs].theObject.what)
{
case kGreaseRt:
case kGreaseLf:
if (SetObjectState(triggers[index].room, triggers[index].object,
kForceOn, triggeredIs))
{
SpillGrease(masterObjects[triggeredIs].dynaNum,
masterObjects[triggeredIs].hotNum);
}
break;
case kLightSwitch:
case kMachineSwitch:
case kThermostat:
case kPowerSwitch:
case kKnifeSwitch:
case kInvisSwitch:
TriggerSwitch(masterObjects[triggeredIs].dynaNum);
break;
case kSoundTrigger:
PlayPrioritySound(kChordSound, kChordPriority); // Change me
break;
case kToaster:
TriggerToast(masterObjects[triggeredIs].dynaNum);
break;
case kGuitar:
PlayPrioritySound(kChordSound, kChordPriority);
break;
case kCoffee:
PlayPrioritySound(kCoffeeSound, kCoffeePriority);
break;
case kOutlet:
TriggerOutlet(masterObjects[triggeredIs].dynaNum);
break;
case kBalloon:
TriggerBalloon(masterObjects[triggeredIs].dynaNum);
break;
case kCopterLf:
case kCopterRt:
TriggerCopter(masterObjects[triggeredIs].dynaNum);
break;
case kDartLf:
case kDartRt:
TriggerDart(masterObjects[triggeredIs].dynaNum);
break;
case kDrip:
TriggerDrip(masterObjects[triggeredIs].dynaNum);
break;
case kFish:
TriggerFish(masterObjects[triggeredIs].dynaNum);
break;
}
}
else
{
wasState = HGetState((Handle)thisHouse);
HLock((Handle)thisHouse);
triggeredIs = masterObjects[triggerIs].localLink;
switch ((*thisHouse)->rooms[triggers[index].room].
objects[triggers[index].object].what)
{
case kGreaseRt:
case kGreaseLf:
if (SetObjectState(triggers[index].room, triggers[index].object,
kForceOn, triggeredIs))
{
SpillGrease(masterObjects[triggeredIs].dynaNum,
masterObjects[triggeredIs].hotNum);
}
break;
}
HSetState((Handle)thisHouse, wasState);
}
}
//-------------------------------------------------------------- ZeroTriggers
void ZeroTriggers (void)
{
short i;
for (i = 0; i < kMaxTriggers; i++)
triggers[i].armed = false;
}