Mesen2/Core/NES/Input/BandaiHyperShot.h
2022-09-08 21:29:52 -04:00

78 lines
No EOL
1.7 KiB
C++

#pragma once
#include "pch.h"
#include "NES/Input/NesController.h"
#include "NES/Input/Zapper.h"
#include "NES/NesConsole.h"
#include "Shared/KeyManager.h"
class BandaiHyperShot : public NesController
{
private:
NesConsole* _console;
uint32_t _hypershotState = 0;
protected:
enum ZapperButtons { Fire = 9 };
bool HasCoordinates() override { return true; }
string GetKeyNames() override
{
return NesController::GetKeyNames() + "F";
}
void InternalSetStateFromInput() override
{
NesController::InternalSetStateFromInput();
MousePosition pos = KeyManager::GetMousePosition();
for(KeyMapping& keyMapping : _keyMappings) {
SetPressedState(ZapperButtons::Fire, KeyManager::IsKeyPressed(keyMapping.CustomKeys[0]));
if(KeyManager::IsKeyPressed(keyMapping.CustomKeys[1])) {
pos.X = -1;
pos.Y = -1;
}
}
SetCoordinates(pos);
}
bool IsLightFound()
{
return Zapper::StaticIsLightFound(GetCoordinates(), _console);
}
void Serialize(Serializer& s) override
{
NesController::Serialize(s);
SV(_hypershotState);
}
public:
BandaiHyperShot(NesConsole* console, KeyMappingSet keyMappings) : NesController(console->GetEmulator(), ControllerType::BandaiHyperShot, BaseControlDevice::ExpDevicePort, keyMappings)
{
_console = console;
}
void RefreshStateBuffer() override
{
_hypershotState = (uint32_t)ToByte();
}
uint8_t ReadRam(uint16_t addr) override
{
if(addr == 0x4016) {
StrobeProcessRead();
uint8_t output = (_hypershotState & 0x01) << 1;
_hypershotState >>= 1;
return output;
} else {
return (IsLightFound() ? 0 : 0x08) | (IsPressed(ZapperButtons::Fire) ? 0x10 : 0x00);
}
}
void WriteRam(uint16_t addr, uint8_t value) override
{
StrobeProcessWrite(value);
}
};