1#pragma once
2
3#include "container/seadOffsetList.h"
4#include "controller/seadControllerBase.h"
5#include "controller/seadControllerDefine.h"
6
7namespace sead
8{
9class ControllerAddon;
10class ControllerMgr;
11class ControllerWrapperBase;
12
13class Controller : public ControllerBase
14{
15 SEAD_RTTI_OVERRIDE(Controller, ControllerBase)
16public:
17 enum PadIdx
18 {
19 cPadIdx_A = 0,
20 cPadIdx_B = 1,
21 cPadIdx_C = 2,
22 cPadIdx_X = 3,
23 cPadIdx_Y = 4,
24 cPadIdx_Z = 5,
25 cPadIdx_2 = 6, // Also Right-Stick Click
26 cPadIdx_1 = 7, // Also Left-Stick Click
27 cPadIdx_Home = 8,
28 cPadIdx_Minus = 9,
29 cPadIdx_Plus = 10,
30 cPadIdx_Start = 11,
31 cPadIdx_Select = 12,
32 cPadIdx_ZL = cPadIdx_C,
33 cPadIdx_ZR = cPadIdx_Z,
34 cPadIdx_L = 13,
35 cPadIdx_R = 14,
36 cPadIdx_Touch = 15,
37 cPadIdx_Up = 16,
38 cPadIdx_Down = 17,
39 cPadIdx_Left = 18,
40 cPadIdx_Right = 19,
41 cPadIdx_LeftStickUp = 20,
42 cPadIdx_LeftStickDown = 21,
43 cPadIdx_LeftStickLeft = 22,
44 cPadIdx_LeftStickRight = 23,
45 cPadIdx_RightStickUp = 24,
46 cPadIdx_RightStickDown = 25,
47 cPadIdx_RightStickLeft = 26,
48 cPadIdx_RightStickRight = 27,
49 cPadIdx_Max = 28
50 };
51
52 explicit Controller(ControllerMgr* mgr);
53 virtual ~Controller();
54
55 virtual void calc();
56 virtual bool isConnected() const;
57 ControllerAddon* getAddonByOrder(ControllerDefine::AddonId id, int index) const;
58 ControllerAddon* getAddon(ControllerDefine::AddonId id) const;
59
60 template <typename T>
61 T getAddonAs() const;
62
63protected:
64 virtual void calcImpl_() = 0;
65 virtual bool isIdle_();
66 virtual void setIdle_();
67
68 ControllerDefine::ControllerId mId;
69
70private:
71 ControllerMgr* mMgr;
72 OffsetList<ControllerAddon> mAddons;
73 OffsetList<ControllerWrapperBase> mWrappers;
74
75 friend class ControllerWrapperBase;
76 friend class ControllerMgr;
77};
78#ifdef cafe
79static_assert(sizeof(Controller) == 0x15C, "sead::Controller size mismatch");
80#endif // cafe
81
82template <typename T>
83T Controller::getAddonAs() const
84{
85 for (auto& addon : mAddons)
86 {
87 T result = DynamicCast<typename std::remove_pointer<T>>(addon);
88 if (result)
89 return result;
90 }
91
92 return nullptr;
93}
94
95} // namespace sead
96