summaryrefslogtreecommitdiff
path: root/include/d/a/d_a_salbage_obj.h
blob: 742224bda8dfc9a65a9d05ac8e75c565086ed6b0 (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#ifndef D_A_SALBAGE_OBJ_H
#define D_A_SALBAGE_OBJ_H

#include "common.h"
#include "d/a/d_a_salbage_if.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/col/bg/d_bg_s_acch.h"
#include "d/col/cc/d_cc_d.h"
#include "d/d_shadow.h"
#include "m/m3d/m_smdl.h"
#include "m/m_mtx.h"
#include "m/m_quat.h"
#include "m/m_vec.h"
#include "s/s_State.hpp"
#include "toBeSorted/dowsing_target.h"

class dAcSalbageObj_c;

enum SalvageObj_e {
    SALVAGE_OBJ_PROPERA = 0,
    SALVAGE_OBJ_ROULETTE = 1,
    SALVAGE_OBJ_DIVINER_CRYSTAL = 2,
    SALVAGE_OBJ_WATER_JAR = 5,
    SALVAGE_OBJ_POT = 6,
};

class dSalvageIfObj_c : public dSalvageIf_c {
public:
    dSalvageIfObj_c(dAcSalbageObj_c *obj, s32 id) : mpObj(obj), mCarried(false), mHidden(false), mSalvageObjId(id) {}

    /* vt 0x08 */ virtual ~dSalvageIfObj_c() {}
    /* vt 0x0C */ virtual void setCarried() override {
        mCarried = true;
    }
    /* vt 0x10 */ virtual void setNotCarried() override {
        mCarried = false;
    }
    /* vt 0x14 */ virtual bool isCarried() const override {
        return mCarried;
    }
    /* vt 0x18 */ virtual void setHidden() override {
        mHidden = true;
    }
    /* vt 0x1C */ virtual void setNotHidden() override {
        mHidden = false;
    }
    /* vt 0x20 */ virtual bool isHidden() const override {
        return mHidden;
    }
    /* vt 0x24 */ virtual s32 getSalvageObjId() const override {
        return mSalvageObjId;
    }
    /* vt 0x28 */ virtual void doDemoThrow() override;

private:
    /* 0x04 */ dAcSalbageObj_c *mpObj;
    /* 0x08 */ bool mCarried;
    /* 0x09 */ bool mHidden;
    /* 0x0C */ s32 mSalvageObjId;
};

/**
 * Actor - Object - Salvage
 *
 * Base class for objects that can be carried by
 * the Salvage Robot NPC, AKA Scrapper.
 */
class dAcSalbageObj_c : public dAcObjBase_c {
    friend class dSalvageIfObj_c;

    enum Behavior_e {
        /// The object is stationary and disappears when picked up
        BEHAVIOR_STATIONARY,
        /// The object is being carried and disappears when dropped
        BEHAVIOR_CARRY,
        /// The object is being carried in the Sky by the salvage robot
        BEHAVIOR_FLY,
    };

public:
    dAcSalbageObj_c(m3d::smdl_c *mdl, s32 salvageObjId)
        : field_0x330(0),
          mpMdl(mdl),
          mStateMgr(*this),
          mSalvageIf(this, salvageObjId),
          mDowsingTarget(this, DowsingTarget::SLOT_NONE),
          mIsDemoState(false),
          mpNextStateId(nullptr) {}
    virtual ~dAcSalbageObj_c() {}

    virtual int preExecute() override;
    virtual int draw() override;
    virtual int preDraw() override;

    virtual int actorExecute() override;
    virtual void doInteraction(s32) override;

    /* vt 0x80 */ virtual bool vt_0x80() const {
        return false;
    }

    /* vt 0x84-0x8C */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, Wait);
    /* vt 0x90-0x98 */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, Carried);
    /* vt 0x9C-0xA4 */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, Demo);
    /* vt 0xA8-0xB0 */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, DemoThrow);
    /* vt 0xB4-0xBC */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, Fly);
    /* vt 0xC0-0xC8 */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, After);
    STATE_FUNC_DECLARE(dAcSalbageObj_c, Kill);

protected:
    bool shouldBeActiveDowsingTarget() const;
    void initSalbageObj();
    void loadBehaviorFromParams();
    void calcMtxFromSalbageNpc(mMtx_c &ret);
    void addAttentionTargetIfNeeded();
    void addAttentionTarget();

    void initCcAndBg();

    void executeInternal();
    void updateCc();
    void updateBgAcchCir();
    void updateMdl();

    /* vt 0xCC */ virtual mMtx_c calcWorldMtx();
    /* vt 0xD0 */ virtual void vt_0xD0() {}

    /* vt 0xD4 */ virtual bool isInStateWait() const {
        return mStateMgr.isState(StateID_Wait);
    }
    /* vt 0xD8 */ virtual bool isInStateWaitOrDemoThrow() const {
        return mStateMgr.isState(StateID_Wait) || mStateMgr.isState(StateID_DemoThrow);
    }
    /* vt 0xDC */ virtual DowsingTarget::DowsingSlot getDowsingSlot() const {
        return DowsingTarget::SLOT_QUEST;
    }
    /* vt 0xE0 */ virtual f32 getCcRadius() const {
        return 0.0f;
    }
    /* vt 0xE4 */ virtual f32 getCcHeight() const {
        return 0.0f;
    }
    /* vt 0xE8 */ virtual f32 getBgAcchCirRadius() const {
        return 0.0f;
    }
    /* vt 0xEC */ virtual f32 getBgAcchCirHeight() const {
        return 0.0f;
    }
    /* vt 0xF0 */ virtual f32 getPoscopy2YOffset() const {
        return 0.0f;
    }
    /* vt 0xF4 */ virtual f32 getPoscopy3YOffset() const {
        return 0.0f;
    }
    /* vt 0xF8 */ virtual f32 getDowsingUnusedF32() const {
        return 1500.0f;
    }
    /* vt 0xFC */ virtual f32 getDowsingTargetYOffset() const {
        return 50.0f;
    }

    /* 0x330 */ UNKWORD field_0x330;

    /* 0x334 */ m3d::smdl_c *mpMdl;
    /* 0x338 */ dShadowCircle_c mShadow;
    /* 0x340 */ mQuat_c mShadowRot;
    /* 0x350 */ dBgS_AcchCir mBgAcchCir;
    /* 0x3AC */ dBgS_ObjAcch mBgObjAcch;
    /* 0x75C */ dCcD_Cyl mCcCyl;
    /* 0x8AC */ STATE_MGR_DECLARE(dAcSalbageObj_c);
    /* 0x8E8 */ s32 mBehavior;
    /* 0x8EC */ bool mIsDemoState;
    /* 0x8F0 */ dSalvageIfObj_c mSalvageIf;
    /* 0x900 */ f32 field_0x900;
    /* 0x904 */ s16 field_0x904;
    /* 0x908 */ mMtx_c mWorldSRMtx;
    /* 0x938 */ f32 field_0x938;
    /* 0x93C */ DowsingTarget mDowsingTarget;
    /* 0x95C */ mVec3_c field_0x95C;
    /* 0x968 */ bool mIsDowsingRegistered;
    /* 0x96C */ const sStateID_c *mpNextStateId;
};

#endif