14 using std::shared_ptr;
25 , name(name_), press(press_), release(release_) {}
26 const string&
getName()
const {
return name; }
29 template<
typename Archive>
void serialize(Archive& ar,
unsigned )
31 ar.template serializeBase<StateChange>(*this);
32 ar.serialize(
"name", name);
33 ar.serialize(
"press", press);
34 ar.serialize(
"release", release);
47 : eventDistributor(eventDistributor_)
48 , stateChangeDistributor(stateChangeDistributor_)
51 "key for direction up", Keys::
K_UP))
53 "key for direction down", Keys::
K_DOWN))
55 "key for direction left", Keys::
K_LEFT))
57 "key for direction right", Keys::
K_RIGHT))
59 "key for trigger A", Keys::
K_SPACE))
61 "key for trigger B", Keys::
K_M))
76 const string& KeyJoystick::getName()
const
83 return "Key-Joystick, use your keyboard to emulate an MSX joystick. "
84 "See manual for information on how to configure this.";
113 void KeyJoystick::signalEvent(
const shared_ptr<const Event>& event,
118 switch (event->getType()) {
121 auto& keyEvent = checked_cast<
const KeyEvent&>(*event);
125 if (key == up->getValue()) press =
JOY_UP;
126 else if (key == down->getValue()) press =
JOY_DOWN;
127 else if (key == left->getValue()) press =
JOY_LEFT;
128 else if (key == right->getValue()) press =
JOY_RIGHT;
129 else if (key == trigA->getValue()) press =
JOY_BUTTONA;
130 else if (key == trigB->getValue()) press =
JOY_BUTTONB;
132 if (key == up->getValue()) release =
JOY_UP;
133 else if (key == down->getValue()) release =
JOY_DOWN;
134 else if (key == left->getValue()) release =
JOY_LEFT;
135 else if (key == right->getValue()) release =
JOY_RIGHT;
136 else if (key == trigA->getValue()) release =
JOY_BUTTONA;
137 else if (key == trigB->getValue()) release =
JOY_BUTTONB;
146 if (((status & ~press) | release) != status) {
147 stateChangeDistributor.
distributeNew(std::make_shared<KeyJoyState>(
148 time, name, press, release));
153 void KeyJoystick::signalStateChange(
const shared_ptr<StateChange>& event)
155 auto kjs =
dynamic_cast<const KeyJoyState*
>(
event.get());
157 if (kjs->getName() != name)
return;
159 status = (status & ~kjs->getPress()) | kjs->getRelease();
167 if (newStatus != status) {
168 byte release = newStatus & ~status;
169 stateChangeDistributor.
distributeNew(std::make_shared<KeyJoyState>(
170 time, name, 0, release));
178 template<
typename Archive>
181 if (ar.versionAtLeast(version, 2)) {
182 ar.serialize(
"status", status);