summaryrefslogtreecommitdiff
path: root/src/REL/d/t/d_t_touch.cpp
blob: 99b46ad27aca7e9cc3160f1a72f0931813738edf (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
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "d/t/d_t_touch.h"

#include "c/c_math.h"
#include "d/flag/sceneflag_manager.h"
#include "s/s_Math.h"
#include "toBeSorted/area_math.h"

SPECIAL_ACTOR_PROFILE(TOUCH_TAG, dTgTouchTag, fProfile::TOUCH_TAG, 0x028E, 0, 0);

STATE_DEFINE(dTgTouchTag, Wait);

const static u16 ACTIVATORS[] = {
    fProfile::BOMB,
    fProfile::BOMB,
};

int dTgTouchTag::create() {
    mActivatorIndex = !(getActivatorIndex() == 0xF) ? getActivatorIndex() : 0;
    mZoneFlag = getZoneFlag();
    mChkFlag = getChkFlag();
    matrixCreateFromPosRotYScale(mAreaOfEffect, mPosition, mRotation.y, mScale, nullptr, 0.0f);
    mStateMgr.changeState(StateID_Wait);
    return SUCCEEDED;
}

int dTgTouchTag::doDelete() {
    return SUCCEEDED;
}

int dTgTouchTag::actorExecute() {
    if (mChkFlag != 0xFF && SceneflagManager::sInstance->checkBoolFlag(mRoomID, mChkFlag)) {
        SceneflagManager::sInstance->unsetFlag(mRoomID, mZoneFlag);
        return SUCCEEDED;
    }

    mStateMgr.executeState();
    return SUCCEEDED;
}

int dTgTouchTag::draw() {
    return SUCCEEDED;
}

void dTgTouchTag::initializeState_Wait() {
    mFlagTimer = 0;
}
void dTgTouchTag::executeState_Wait() {
    dAcBase_c *actor = static_cast<dAcBase_c *>(fManager_c::searchBaseByProfName(ACTIVATORS[mActivatorIndex], nullptr));

    while (actor != nullptr) {
        if (actor->mRoomID == mRoomID && checkAreaBox(mAreaOfEffect, actor->mPosition)) {
            mFlagTimer = 5;
            if (mZoneFlag != 0xFF) {
                SceneflagManager::sInstance->setFlag(mRoomID, mZoneFlag);
            }
            break;
        }

        actor = static_cast<dAcBase_c *>(fManager_c::searchBaseByProfName(ACTIVATORS[mActivatorIndex], actor));
    }

    if (sLib::calcTimer(&mFlagTimer) == 0) {
        if (mZoneFlag != 0xFF && SceneflagManager::sInstance->checkBoolFlag(mRoomID, mZoneFlag)) {
            SceneflagManager::sInstance->unsetFlag(mRoomID, mZoneFlag);
        }
    }
}
void dTgTouchTag::finalizeState_Wait() {}