3#include "game/system/GhostFile.hh"
5#include <egg/math/Vector.hh>
13 return (
static_cast<f32
>(rawStick) - 7.0f) / 7.0f;
16enum class ControlSource {
36struct RaceInputState {
38 virtual ~RaceInputState() {}
42 [[nodiscard]]
bool isValid()
const;
49 return !(buttons & ~0xf);
69 [[nodiscard]]
bool accelerate()
const {
70 return !!(buttons & 0x1);
73 [[nodiscard]]
bool brake()
const {
74 return !!(buttons & 0x2);
77 [[nodiscard]]
bool item()
const {
78 return !!(buttons & 0x4);
81 [[nodiscard]]
bool drift()
const {
82 return !!(buttons & 0x8);
85 [[nodiscard]]
bool trickUp()
const {
86 return trick == Trick::Up;
89 [[nodiscard]]
bool trickDown()
const {
90 return trick == Trick::Down;
103struct KPadGhostButtonsStream {
104 KPadGhostButtonsStream();
105 ~KPadGhostButtonsStream();
110 [[nodiscard]]
virtual bool readIsNewSequence()
const {
111 return readSequenceFrames >= (currentSequence & 0xFF);
115 [[nodiscard]]
virtual u8 readVal()
const {
116 return currentSequence >> 8;
121 u16 readSequenceFrames;
137struct KPadGhostFaceButtonsStream :
public KPadGhostButtonsStream {
138 KPadGhostFaceButtonsStream();
139 ~KPadGhostFaceButtonsStream();
148struct KPadGhostDirectionButtonsStream :
public KPadGhostButtonsStream {
149 KPadGhostDirectionButtonsStream();
150 ~KPadGhostDirectionButtonsStream();
159struct KPadGhostTrickButtonsStream :
public KPadGhostButtonsStream {
160 KPadGhostTrickButtonsStream();
161 ~KPadGhostTrickButtonsStream();
164 [[nodiscard]]
bool readIsNewSequence()
const override {
165 u16 duration = currentSequence & 0xFF;
166 duration += 256 * (currentSequence >> 8 & 0xF);
167 return duration <= readSequenceFrames;
171 [[nodiscard]] u8 readVal()
const override {
172 return currentSequence >> 0x8 & ~0x80;
177class KPadController {
180 virtual ~KPadController() {}
183 [[nodiscard]]
virtual ControlSource controlSource()
const {
184 return ControlSource::Unknown;
187 virtual void reset(
bool ) {}
188 virtual void calcImpl() {}
197 void setDriftIsAuto(
bool driftIsAuto) {
201 [[nodiscard]]
bool driftIsAuto()
const {
213class KPadGhostController :
public KPadController {
215 KPadGhostController();
216 ~KPadGhostController()
override;
219 [[nodiscard]] ControlSource controlSource()
const override {
220 return ControlSource::Ghost;
223 void reset(
bool driftIsAuto)
override;
227 void calcImpl()
override;
229 void setAcceptingInputs(
bool set) {
230 m_acceptingInputs = set;
234 const u8 *m_ghostBuffer;
235 std::array<KPadGhostButtonsStream *, 3> m_buttonsStreams;
236 bool m_acceptingInputs;
241class KPadHostController :
public KPadController {
243 KPadHostController();
244 ~KPadHostController()
override;
246 [[nodiscard]] ControlSource controlSource()
const override {
247 return ControlSource::Host;
250 void reset(
bool driftIsAuto)
override;
257 return setInputs(state.buttons, state.stick, state.trick);
279 bool setInputs(u16 buttons, f32 stickX, f32 stickY, Trick trick) {
320 return m_currentInputState;
327 [[nodiscard]]
bool driftIsAuto()
const {
328 return m_controller->driftIsAuto();
338class KPadPlayer :
public KPad {
343 void setGhostController(
KPadGhostController *controller,
const u8 *inputs,
bool driftIsAuto);
350 u8 m_ghostBuffer[RKG_UNCOMPRESSED_INPUT_DATA_SECTION_SIZE];
A stream of data stored in memory.
An abstraction for a controller object. It is associated with an input state.
bool m_driftIsAuto
True for auto transmission, false for manual.
bool m_connected
Whether the controller is active.
RaceInputState m_raceInputState
The current inputs from this controller.
The abstraction of a controller object but for ghost playback.
void readGhostBuffer(const u8 *buffer, bool driftIsAuto)
Reads in the raw input data section from the ghost RKG file.
The abstraction of a controller object but for external usage.
bool setInputs(u16 buttons, f32 stickX, f32 stickY, Trick trick)
Sets the inputs of the controller.
bool setInputs(const RaceInputState &state)
Sets the inputs of the controller.
bool setInputs(u16 buttons, const EGG::Vector2f &stick, Trick trick)
Sets the inputs of the controller.
bool setInputsRawStickZeroCenter(u16 buttons, s8 stickXRaw, s8 stickYRaw, Trick trick)
Sets the inputs of the controller.
bool setInputsRawStick(u16 buttons, u8 stickXRaw, u8 stickYRaw, Trick trick)
Sets the inputs of the controller.
void startGhostProxy()
Signals to start reading ghost data after fade-in.
void endGhostProxy()
Signals to stop reading ghost data after race completion.
RaceInputState m_lastInputState
Used to determine changes in input state.
Represents the host application.
High-level handling for generic system operations, such as input reading, race configuration,...
static constexpr f32 RawStickToState(u8 rawStick)
Converts a raw stick input into an input usable by the state.