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 };