prime/src/MetroidPrime/CInputGenerator.cpp

62 lines
1.7 KiB
C++

#include "MetroidPrime/CInputGenerator.hpp"
#include "MetroidPrime/CArchitectureQueue.hpp"
#include "MetroidPrime/Decode.hpp"
#include "Kyoto/Basics/COsContext.hpp"
CInputGenerator::CInputGenerator(COsContext* ctx, float leftDiv, float rightDiv)
: x0_context(ctx)
, x4_controller(IController::Create(*ctx))
, xc_leftDiv(leftDiv)
, x10_rightDiv(rightDiv) {
for (uint i = 0; i <= kIOP_Player4; ++i) {
x8_connectedControllers[i] = false;
}
}
bool CInputGenerator::Update(float dt, CArchitectureQueue& queue) {
int availSlot = 0;
if (!x0_context->Update()) {
return false;
}
bool firstController = false;
if (!x4_controller.null()) {
int count = x4_controller->GetDeviceCount();
x4_controller->Poll();
for (int i = 0; i < count; ++i) {
const CControllerGamepadData& cont = x4_controller->GetGamepadData(i);
if (cont.DeviceIsPresent()) {
if (i == 0) {
firstController = true;
}
{
CFinalInput input(i, dt, cont, xc_leftDiv, x10_rightDiv);
CArchitectureMessage msg = MakeMsg::CreateUserInput(kAMT_Game, input);
queue.Push(msg);
}
++availSlot;
}
bool connected = cont.DeviceIsPresent();
if (x8_connectedControllers[i] != connected) {
CArchitectureMessage msg = MakeMsg::CreateControllerStatus(kAMT_Game, i, connected);
queue.Push(msg);
x8_connectedControllers[i] = connected;
}
}
}
if (!firstController) {
CArchitectureMessage msg = MakeMsg::CreateUserInput(kAMT_Game, CFinalInput(0, dt, *x0_context));
queue.Push(msg);
} else {
CArchitectureMessage msg =
MakeMsg::CreateUserInput(kAMT_Game, CFinalInput(availSlot, dt, *x0_context));
queue.Push(msg);
}
return true;
}