summaryrefslogtreecommitdiff
path: root/src/KingSystem/Map/mapObjectLink.h
blob: 382aa804d677f9470021196c487143a2d509395f (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
#pragma once

#include <basis/seadTypes.h>
#include <container/seadBuffer.h>
#include "KingSystem/Map/mapMubinIter.h"
#include "KingSystem/Utils/Types.h"

namespace ksys::act {
class Actor;
class ActorLinkConstDataAccess;
}  // namespace ksys::act

namespace ksys::map {

class GenGroup;
class Object;
class Rail;

enum class MapLinkDefType {
    BasicSig = 0,
    AxisX = 1,
    AxisY = 2,
    AxisZ = 3,
    NAxisX = 4,
    NAxisY = 5,
    NAxisZ = 6,
    GimmickSuccess = 7,
    VelocityControl = 8,
    BasicSigOnOnly = 9,
    Remains = 10,
    DeadUp = 11,
    LifeZero = 12,
    Stable = 13,
    ChangeAtnSig = 14,
    Create = 15,
    Delete = 16,
    MtxCopyCreate = 17,
    Freeze = 18,
    ForbidAttention = 19,
    SyncLink = 20,
    CopyWaitRevival = 21,
    OffWaitRevival = 22,
    Recreate = 23,
    AreaCol = 24,
    SensorBlind = 25,
    ForSale = 26,
    ModelBind = 27,
    PlacementLOD = 28,
    DemoMember = 29,
    PhysSystemGroup = 30,
    StackLink = 31,
    FixedCs = 32,
    HingeCs = 33,
    LimitHingeCs = 34,
    SliderCs = 35,
    PulleyCs = 36,
    BAndSCs = 37,
    BAndSLimitAngYCs = 38,
    CogWheelCs = 39,
    RackAndPinionCs = 40,
    Reference = 41,
    Invalid = 42,
};

struct ObjectLink {
    ~ObjectLink() {}
    act::Actor* getObjectActor() const;
    bool getObjectProcWithAccessor(act::ActorLinkConstDataAccess& accessor) const;
    const char* getDescription() const;
    static const char* getDescriptionForType(MapLinkDefType t);
    static MapLinkDefType getTypeForName(const sead::SafeString& name);
    static bool sub_7100D4E310(MapLinkDefType t);
    static bool isPlacementLODOrForSaleLink(MapLinkDefType t);

    Object* other_obj = nullptr;
    MapLinkDefType type = MapLinkDefType::Invalid;
    MubinIter iter{};
};
KSYS_CHECK_SIZE_NX150(ObjectLink, 0x20);

struct ObjectLinkArray {
    bool checkLink(MapLinkDefType t, bool b);

    ObjectLink* findLinkWithType(MapLinkDefType type);
    ObjectLink* findLinkWithType_0(MapLinkDefType type);

    sead::Buffer<ObjectLink> links;
};
KSYS_CHECK_SIZE_NX150(ObjectLinkArray, 0x10);

class ObjectLinkData {
public:
    ObjectLinkData();

    void deleteArrays();
    void release(Object* obj, bool a1);
    bool allocLinksToSelf(s32 num_links, sead::Heap* heap);

    bool sub_7100D4EC40(Object* src, ObjectLink* link, Object* dest);
    void sub_7100D4FB78(Object* obj);
    bool checkCreateLinkObjRevival() const;
    bool checkDeleteLinkObjRevival() const;

    ObjectLink* findLinkWithType(MapLinkDefType t);
    ObjectLink* findLinkWithType_0(MapLinkDefType t);

    void setGenGroup(GenGroup* group);

    void x_1(act::Actor* actor, Object* obj);

    bool checkCreateOrDeleteLinkObjRevival() const {
        return checkDeleteLinkObjRevival() || checkCreateLinkObjRevival();
    }

    Object* mCreateLinksSrcObj = nullptr;
    Object* mDeleteLinksSrcObj = nullptr;

    sead::Buffer<Object*> mObjects;
    ObjectLinkArray mLinksOther{};
    ObjectLinkArray mLinksCs{};
    ObjectLinkArray mLinksToSelf{};

    u32 field_50 = 0;
    bool field_54 = false;
    bool mAppearFade = false;
    bool mNoAutoDemoMember = false;
    bool field_57 = false;

    GenGroup* mGenGroup = nullptr;
    Rail* mRails = nullptr;
};
KSYS_CHECK_SIZE_NX150(ObjectLinkData, 0x68);

}  // namespace ksys::map