21static constexpr int POS_MIN = 55;
22static constexpr int POS_MAX = 325;
23static constexpr int POS_CENTER = 236;
24static constexpr int SCALE = 2;
31 ArkanoidState(EmuTime::param time_,
int delta_,
bool press_,
bool release_)
33 , delta(delta_), press(press_), release(release_) {}
34 [[nodiscard]]
int getDelta()
const {
return delta; }
35 [[nodiscard]]
bool getPress()
const {
return press; }
36 [[nodiscard]]
bool getRelease()
const {
return release; }
38 template<
typename Archive>
void serialize(Archive& ar,
unsigned )
40 ar.template serializeBase<StateChange>(*
this);
41 ar.serialize(
"delta", delta,
53 : eventDistributor(eventDistributor_)
54 , stateChangeDistributor(stateChangeDistributor_)
62 ArkanoidPad::unplugHelper(EmuTime::dummy());
68std::string_view ArkanoidPad::getName()
const
73std::string_view ArkanoidPad::getDescription()
const
75 return "Arkanoid pad";
78void ArkanoidPad::plugHelper(
Connector& , EmuTime::param )
84void ArkanoidPad::unplugHelper(EmuTime::param )
91uint8_t ArkanoidPad::read(EmuTime::param )
93 return buttonStatus | ((shiftReg & 0x100) >> 8);
96void ArkanoidPad::write(uint8_t value, EmuTime::param )
98 uint8_t diff = lastValue ^ value;
101 if (diff & value & 0x4) {
105 if (diff & value & 0x1) {
107 shiftReg = (shiftReg << 1) | (shiftReg & 1);
112void ArkanoidPad::signalMSXEvent(
const Event& event,
113 EmuTime::param time)
noexcept
116 [&](
const MouseMotionEvent&
e) {
119 dialPos +
e.getX() / SCALE));
120 int delta = newPos - dialPos;
122 stateChangeDistributor.distributeNew<ArkanoidState>(
123 time, delta,
false,
false);
126 [&](
const MouseButtonDownEvent& ) {
128 if (buttonStatus & 2) {
129 stateChangeDistributor.distributeNew<ArkanoidState>(
130 time, 0,
true,
false);
133 [&](
const MouseButtonUpEvent& ) {
135 if (!(buttonStatus & 2)) {
136 stateChangeDistributor.distributeNew<ArkanoidState>(
137 time, 0,
false,
true);
140 [](
const EventBase&) { }
145void ArkanoidPad::signalStateChange(
const StateChange& event)
147 const auto* as =
dynamic_cast<const ArkanoidState*
>(&event);
150 dialPos += as->getDelta();
151 if (as->getPress()) buttonStatus &= ~2;
152 if (as->getRelease()) buttonStatus |= 2;
155void ArkanoidPad::stopReplay(EmuTime::param time)
noexcept
158 int delta = POS_CENTER - dialPos;
159 bool release = (buttonStatus & 2) == 0;
160 if ((delta != 0) || release) {
161 stateChangeDistributor.distributeNew<ArkanoidState>(
162 time, delta,
false, release);
171template<
typename Archive>
174 ar.serialize(
"shiftreg", shiftReg,
175 "lastValue", lastValue);
176 if (ar.versionAtLeast(version, 2)) {
177 ar.serialize(
"dialpos", dialPos,
178 "buttonStatus", buttonStatus);
180 if constexpr (Archive::IS_LOADER) {
void serialize(Archive &ar, unsigned version)
ArkanoidPad(MSXEventDistributor &eventDistributor, StateChangeDistributor &stateChangeDistributor)
ArkanoidState(EmuTime::param time_, int delta_, bool press_, bool release_)
void serialize(Archive &ar, unsigned)
void registerEventListener(MSXEventListener &listener)
Registers a given object to receive certain events.
void unregisterEventListener(MSXEventListener &listener)
Unregisters a previously registered event listener.
bool isPluggedIn() const
Returns true if this pluggable is currently plugged into a connector.
Connector * getConnector() const
Get the connector this Pluggable is plugged into.
void registerListener(StateChangeListener &listener)
(Un)registers the given object to receive state change events.
void unregisterListener(StateChangeListener &listener)
Base class for all external MSX state changing events.
constexpr vecN< N, T > min(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr vecN< N, T > max(const vecN< N, T > &x, const vecN< N, T > &y)
This file implemented 3 utility functions:
REGISTER_POLYMORPHIC_INITIALIZER(Pluggable, CassettePlayer, "CassettePlayer")
std::variant< KeyUpEvent, KeyDownEvent, MouseMotionEvent, MouseButtonUpEvent, MouseButtonDownEvent, MouseWheelEvent, JoystickAxisMotionEvent, JoystickHatEvent, JoystickButtonUpEvent, JoystickButtonDownEvent, OsdControlReleaseEvent, OsdControlPressEvent, WindowEvent, TextEvent, FileDropEvent, QuitEvent, FinishFrameEvent, CliCommandEvent, GroupEvent, BootEvent, FrameDrawnEvent, BreakEvent, SwitchRendererEvent, TakeReverseSnapshotEvent, AfterTimedEvent, MachineLoadedEvent, MachineActivatedEvent, MachineDeactivatedEvent, MidiInReaderEvent, MidiInWindowsEvent, MidiInCoreMidiEvent, MidiInCoreMidiVirtualEvent, MidiInALSAEvent, Rs232TesterEvent, ImGuiDelayedActionEvent, ImGuiActiveEvent > Event
REGISTER_POLYMORPHIC_CLASS(StateChange, AutofireStateChange, "AutofireStateChange")
#define INSTANTIATE_SERIALIZE_METHODS(CLASS)