summaryrefslogtreecommitdiff
path: root/include/d/a/e/d_a_en_base.h
blob: 258cc9b7fddc3b35027335ea2af9f47bb1b357f8 (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
#ifndef D_A_EN_BASE_H
#define D_A_EN_BASE_H

#include "common.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/a/obj/d_a_obj_bomb.h"
#include "d/d_cc.h"
#include "m/m3d/m_mdl.h"
#include "m/m_angle.h"
#include "m/m_vec.h"

struct dAcEnData {
    // Unknown Size yet
};

// Ghidra: ActorEnemyBase
//   size:
// non-official name
class dAcEnBase_c : public dAcObjBase_c {
public:
    enum InteractionFlags_e {
        INTERACT_0x1 = (1 << 0),
        INTERACT_0x4 = (1 << 2),
        INTERACT_0x40 = (1 << 6),
        INTERACT_0x1000 = (1 << 12),
        INTERACT_0x2000 = (1 << 13),
    };

public:
    dAcEnBase_c();
    virtual ~dAcEnBase_c();

    virtual int preExecute() override;
    virtual void postExecute(MAIN_STATE_e state) override;
    virtual int preDraw() override;

    virtual void *getObjectListEntry() override {
        return &mEnemyLink;
    }

    virtual void vt_0x80() {
        return;
    }
    virtual void vt_0x84() {
        return;
    }
    virtual UNKWORD vt_0x88(UNKWORD a) {
        return a;
    };
    /* 0x330 */ dAcRef_c<dAcEnBase_c> mEnemyLink;
    /* 0x33C */ u32 mInteractionFlags;
    /* 0x340 */ u16 field_0x338;
    /* 0x342 */ u16 mHealth;
    /* 0x344 */ u8 _344[0x358 - 0x344];
    /* 0x358 */ mVec3_c mFinalBlowPosition;
    /* 0x364 */ u8 _364[0x374 - 0x364];
    /* 0x374 */ dAcEnData *mpEnemyData;

    bool checkInteractionFlags(u32 mask) {
        return mInteractionFlags & mask;
    }
    void setInteractionFlags(u32 flag) {
        mInteractionFlags |= flag;
    }
    void resetInteractionFlags(u32 flag) {
        mInteractionFlags &= ~flag;
    }

    dAcBomb_c *getBombWithinRadius(f32 radius); // fn_8002f700

    // Deals with dealing damage to Enemy
    // Returns a value 0-13 (similar to mStts rank?)
    int fn_8002FDE0(cCcD_Obj &mCc, u16 *pTgOut);
    void checkSlope(const mVec3_c &pos, s16 &, s16 &, f32);
    // Returns 0-3 based on collision
    int fn_800301b0(const mVec3_c &pos, mAng ang, bool, f32);
    void fn_80030400(m3d::mdl_c &, u8, bool, u8);
    void fn_800306d0();
    void fn_80030700();

    static void fn_80030980(m3d::mdl_c &, s32, bool markDirty);

    void fn_80030c20(u32 flags, f32, f32, f32, f32);

    s32 someEnemyDamageCollisionStuffMaybe(dColliderLinkedList &list, u16 *pOutFlags);

    bool ChkCrossPlayer(f32 height);

protected:
    // TODO: Make accessors for this list to auto-convert to dAcEnBase?
    static fLiMgBa_c sEnemyList;
};

#endif