summaryrefslogtreecommitdiff
path: root/src/manager/tileChangeObserveManager.c
blob: e24a8787c118be0b5df7bfc5f7a610693ed6aa86 (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
50
51
52
53
54
55
/**
 * @file tileChangeObserveManager.c
 * @ingroup Managers
 *
 * @brief Loads entity lists when a tile changes
 *
 * e.g. Puffstools in DWS if you suck away the dirt
 * spawns the red portal in FoW if you move the stone
 */
#include "manager/tileChangeObserveManager.h"
#include "flags.h"
#include "room.h"
#include "map.h"

void TileChangeObserveManager_Init(TileChangeObserveManager*);
void TileChangeObserveManager_Action1(TileChangeObserveManager*);
void TileChangeObserveManager_Action2(TileChangeObserveManager*);

void TileChangeObserveManager_Main(TileChangeObserveManager* this) {
    static void (*const TileChangeObserveManager_Actions[])(TileChangeObserveManager*) = {
        TileChangeObserveManager_Init,
        TileChangeObserveManager_Action1,
        TileChangeObserveManager_Action2,
    };
    TileChangeObserveManager_Actions[super->action](this);
}

void TileChangeObserveManager_Init(TileChangeObserveManager* this) {
    u16* tileIndex;
    if (CheckFlags(this->flag) != 0) {
        DeleteThisEntity();
    } else {
        super->action = 1;
        tileIndex = &GetLayerByIndex(this->field_0x3a)->mapData[this->tilePos];
        this->observedTile = tileIndex;
        this->initialTile = tileIndex[0];
    }
}

void TileChangeObserveManager_Action1(TileChangeObserveManager* this) {
    if (this->initialTile != this->observedTile[0]) {
        super->action++;
        super->timer = 15;
    }
}

void TileChangeObserveManager_Action2(TileChangeObserveManager* this) {
    if (--super->timer == 0) {
        SetFlag(this->flag);
        if (super->type != 0) {
            LoadRoomEntityList((EntityData*)GetCurrentRoomProperty(super->type));
        }
        DeleteManager(super);
    }
}