summaryrefslogtreecommitdiff
path: root/src/KingSystem/Chemical/chmRoot.h
blob: 48dd7a4ba64703f6f6601f6f47658b0397c2ebac (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
#pragma once

#include <container/seadBuffer.h>
#include <hostio/seadHostIONode.h>
#include <utility/aglParameter.h>
#include <utility/aglParameterIO.h>
#include <utility/aglParameterList.h>
#include <utility/aglParameterObj.h>
#include "KingSystem/Chemical/chmRigid.h"
#include "KingSystem/Chemical/chmShape.h"
#include "KingSystem/Utils/Types.h"

namespace ksys::chm {

class IRoot {
public:
    virtual int getNumShapes() const = 0;
    virtual const IShape& getShape(int idx) const = 0;

    virtual bool isRigidAttribute0Set(int idx) const = 0;
    virtual bool isRigidAttribute1Set(int idx) const = 0;
    virtual const sead::SafeString& getRigidSetName(int idx) const = 0;
    virtual bool isRigidAttribute2Set(int idx) const = 0;
    virtual const sead::SafeString& getRigidName(int idx) const = 0;
    virtual bool rigidHasBurnOutTime(int idx) const = 0;
    virtual float getRigidBurnOutTime(int idx) const = 0;
    virtual bool isRigidAttribute3Set(int idx) const = 0;
    virtual bool isRigidAttribute15Set(int idx) const = 0;
    virtual float getRigidVolume(int idx) const = 0;
    virtual bool isRigidAttribute9Set(int idx) const = 0;
    virtual bool isRigidAttribute10Set(int idx) const = 0;
    virtual float getRigidMass(int idx) const = 0;
    virtual bool isRigidAttribute6Or14Set(int idx) const = 0;
    virtual bool isRigidAttribute5Set(int idx) const = 0;
    virtual bool isRigidAttribute4Set(int idx) const = 0;
    virtual bool isRigidAttribute11Set(int idx) const = 0;
    virtual bool isRigidAttribute12Set(int idx) const = 0;
    virtual bool isRigidAttribute13Set(int idx) const = 0;
    virtual bool isRigidAttribute14Set(int idx) const = 0;
    virtual bool isRigidAttribute16Set(int idx) const = 0;
};

class Root : public agl::utl::ParameterList, public sead::hostio::Node, public IRoot {
public:
    Root();
    ~Root() override;
    Root(const Root&) = delete;
    auto operator=(const Root&) = delete;

    void parse(const agl::utl::ResParameterList& res_list, sead::Heap* heap);

    int getNumShapes() const override { return shapes.size(); }
    const IShape& getShape(int idx) const override { return shapes[idx]; }
    bool isRigidAttribute0Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 0);
    }
    bool isRigidAttribute1Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 1);
    }
    const sead::SafeString& getRigidSetName(int idx) const override {
        return rigids[idx].getRigidSetName();
    }
    bool isRigidAttribute2Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 2);
    }
    const sead::SafeString& getRigidName(int idx) const override {
        return rigids[idx].getRigidName();
    }
    bool rigidHasBurnOutTime(int idx) const override { return rigids[idx].getBurnOutTime() > 0.0; }
    float getRigidBurnOutTime(int idx) const override { return rigids[idx].getBurnOutTime(); }
    bool isRigidAttribute3Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 3);
    }
    bool isRigidAttribute15Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 15);
    }
    float getRigidVolume(int idx) const override { return rigids[idx].getVolume(); }
    bool isRigidAttribute9Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 9);
    }
    bool isRigidAttribute10Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 10);
    }
    float getRigidMass(int idx) const override { return rigids[idx].getMass(); }
    bool isRigidAttribute6Or14Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 6) || isRigidAttribute14Set(idx);
    }
    bool isRigidAttribute5Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 5);
    }
    bool isRigidAttribute4Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 4);
    }
    bool isRigidAttribute11Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 11);
    }
    bool isRigidAttribute12Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 12);
    }
    bool isRigidAttribute13Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 13);
    }
    bool isRigidAttribute14Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 14);
    }
    bool isRigidAttribute16Set(int idx) const override {
        return rigids[idx].getAttribute() & (1 << 16);
    }

private:
    agl::utl::ParameterObj chemical_header;
    agl::utl::Parameter<u32> res_shape_num;
    agl::utl::ParameterList chemical_body;
    sead::Buffer<Shape> shapes;
    sead::Buffer<Rigid> rigids;
};

}  // namespace ksys::chm