summaryrefslogtreecommitdiff
path: root/src/manager/regionTriggerManager.c
blob: b8e534b08a5e53413382b183f5df4760691d5fc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
 * @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);
    }
}