1 #pragma once 2 #include "stdafx.h" 3 #include "StandardController.h" 4 #include "Zapper.h" 5 #include "IKeyManager.h" 6 #include "KeyManager.h" 7 8 class BandaiHyperShot : public StandardController 9 { 10 private: 11 uint32_t _stateBuffer = 0; 12 shared_ptr<Console> _console; 13 14 protected: 15 enum ZapperButtons { Fire = 9 }; 16 HasCoordinates()17 bool HasCoordinates() override { return true; } 18 GetKeyNames()19 string GetKeyNames() override 20 { 21 return StandardController::GetKeyNames() + "F"; 22 } 23 InternalSetStateFromInput()24 void InternalSetStateFromInput() override 25 { 26 StandardController::InternalSetStateFromInput(); 27 28 if(_console->GetSettings()->InputEnabled()) { 29 SetPressedState(ZapperButtons::Fire, KeyManager::IsMouseButtonPressed(MouseButton::LeftButton)); 30 31 MousePosition pos = KeyManager::GetMousePosition(); 32 if(KeyManager::IsMouseButtonPressed(MouseButton::RightButton)) { 33 pos.X = -1; 34 pos.Y = -1; 35 } 36 SetCoordinates(pos); 37 } 38 } 39 IsLightFound()40 bool IsLightFound() 41 { 42 return Zapper::StaticIsLightFound(GetCoordinates(), _console); 43 } 44 StreamState(bool saving)45 void StreamState(bool saving) override 46 { 47 BaseControlDevice::StreamState(saving); 48 Stream(_stateBuffer); 49 } 50 51 public: BandaiHyperShot(shared_ptr<Console> console,KeyMappingSet keyMappings)52 BandaiHyperShot(shared_ptr<Console> console, KeyMappingSet keyMappings) : StandardController(console, BaseControlDevice::ExpDevicePort, keyMappings) 53 { 54 _console = console; 55 } 56 RefreshStateBuffer()57 void RefreshStateBuffer() override 58 { 59 _stateBuffer = (uint32_t)ToByte(); 60 } 61 ReadRAM(uint16_t addr)62 uint8_t ReadRAM(uint16_t addr) override 63 { 64 if(addr == 0x4016) { 65 uint8_t output = (_stateBuffer & 0x01) << 1; 66 _stateBuffer >>= 1; 67 StrobeProcessRead(); 68 return output; 69 } else { 70 return (IsLightFound() ? 0 : 0x08) | (IsPressed(BandaiHyperShot::ZapperButtons::Fire) ? 0x10 : 0x00); 71 } 72 } 73 WriteRAM(uint16_t addr,uint8_t value)74 void WriteRAM(uint16_t addr, uint8_t value) override 75 { 76 StrobeProcessWrite(value); 77 } 78 };