tmc/src/manager/regionTriggerManager.c

50 lines
1.4 KiB
C

/**
* @file regionTriggerManager.c
* @ingroup Managers
*
* @brief Set a flag if the player moves into a region.
*/
#include "manager/regionTriggerManager.h"
#include "asm.h"
#include "flags.h"
enum RegionTriggerManager_State { Init, ObserveRegion };
void RegionTriggerManager_Init(RegionTriggerManager*);
void RegionTriggerManager_ObserveRegion(RegionTriggerManager*);
void RegionTriggerManager_Main(RegionTriggerManager* this) {
static void (*const RegionTriggerManager_Actions[2])(RegionTriggerManager*) = {
RegionTriggerManager_Init,
RegionTriggerManager_ObserveRegion,
};
RegionTriggerManager_Actions[super->action](this);
}
void RegionTriggerManager_Init(RegionTriggerManager* this) {
super->action = ObserveRegion;
this->radiusX >>= 1;
this->posX += this->radiusX;
this->radiusY >>= 1;
this->posY += this->radiusY;
if (!super->type) {
if (CheckFlags(this->playerInRegionFlag)) {
DeleteManager(super);
return;
}
}
RegionTriggerManager_ObserveRegion(this);
}
void RegionTriggerManager_ObserveRegion(RegionTriggerManager* this) {
if (CheckPlayerInRegion(this->posX, this->posY, this->radiusX, this->radiusY)) {
SetFlag(this->playerInRegionFlag);
if (!super->type) {
DeleteManager(super);
return;
}
} else {
ClearFlag(this->playerInRegionFlag);
}
}