mirror of https://github.com/PrimeDecomp/prime.git
62 lines
1.7 KiB
C++
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;
|
|
}
|