TWINE: started to split keymaps for ui, game and cutscenes

This commit is contained in:
Martin Gerhardy 2020-10-23 20:09:33 +02:00 committed by Eugene Sandulenko
parent c59fd6a32e
commit d417478b8c
11 changed files with 432 additions and 249 deletions

View file

@ -21,11 +21,19 @@
*/
#include "twine/input.h"
#include "backends/keymapper/keymapper.h"
#include "common/events.h"
#include "common/keyboard.h"
#include "common/system.h"
#include "twine/actor.h"
#include "twine/twine.h"
namespace TwinE {
const char *mainKeyMapId = "mainKeyMap";
const char *uiKeyMapId = "uiKeyMap";
const char *cutsceneKeyMapId = "cutsceneKeyMap";
/** Pressed key char map - scanCodeTab2 */
static const struct KeyProperties {
uint8 high;
@ -65,22 +73,62 @@ static const struct KeyProperties {
{0x00, false, 0x00}};
static_assert(ARRAYSIZE(pressedKeyCharMap) == 31, "Expected size of key char map");
Input::Input(TwinEEngine *engine) : _engine(engine) {}
bool Input::isAnyKeyPressed() const {
return internalKeyCode != 0;
ScopedKeyMapperDisable::ScopedKeyMapperDisable() {
g_system->getEventManager()->getKeymapper()->setEnabled(false);
}
bool Input::isPressed(Common::KeyCode keycode) const {
return false; // TODO:
ScopedKeyMapperDisable::~ScopedKeyMapperDisable() {
g_system->getEventManager()->getKeymapper()->setEnabled(true);
}
ScopedKeyMap::ScopedKeyMap(TwinEEngine* engine, const char *id) : _engine(engine) {
_prevKeyMap = _engine->_input->currentKeyMap();
_engine->_input->enabledKeyMap(cutsceneKeyMapId);
}
ScopedKeyMap::~ScopedKeyMap() {
_engine->_input->enabledKeyMap(_prevKeyMap.c_str());
}
Input::Input(TwinEEngine *engine) : _engine(engine) {}
bool Input::isPressed(Common::KeyCode keycode, bool onlyFirstTime) const {
if (onlyFirstTime) {
return _pressed[keycode] == 1;
}
return _pressed[keycode] > 0;
}
bool Input::isActionActive(TwinEActionType actionType, bool onlyFirstTime) const {
if (onlyFirstTime) {
return actionStates[actionType] == 1;
}
return actionStates[actionType] > 0;
}
bool Input::toggleActionIfActive(TwinEActionType actionType) {
if (actionStates[actionType] > 0) {
actionStates[actionType] = 0;
return true;
}
return false;
}
bool Input::isQuickBehaviourActionActive() const {
return isActionActive(TwinEActionType::QuickBehaviourNormal) || isActionActive(TwinEActionType::QuickBehaviourAthletic) || isActionActive(TwinEActionType::QuickBehaviourAggressive) || isActionActive(TwinEActionType::QuickBehaviourDiscreet);
}
void Input::enabledKeyMap(const char *id) {
Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
const Common::KeymapArray &keymaps = keymapper->getKeymaps();
for (Common::Keymap *keymap : keymaps) {
keymap->setEnabled(keymap->getId() == id);
}
_currentKeyMap = id;
}
void Input::readKeys() {
if (_engine->shouldQuit()) {
internalKeyCode = 1;
skippedKey = 1;
return;
}
++_tickCounter;
skippedKey = 0;
internalKeyCode = 0;
@ -89,7 +137,7 @@ void Input::readKeys() {
uint8 localKey = 0;
switch (event.type) {
case Common::EVENT_CUSTOM_ENGINE_ACTION_END:
actionStates[event.customType] = false;
actionStates[event.customType] = 0;
localKey = twineactions[event.customType].localKey;
break;
case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
@ -103,29 +151,25 @@ void Input::readKeys() {
break;
default:
localKey = twineactions[event.customType].localKey;
actionStates[event.customType] = true;
debug("repeat: %i", event.kbdRepeat);
actionStates[event.customType] = 1 + event.kbdRepeat;
break;
}
} else {
localKey = twineactions[event.customType].localKey;
actionStates[event.customType] = true;
debug("repeat: %i", event.kbdRepeat);
actionStates[event.customType] = 1 + event.kbdRepeat;
}
break;
case Common::EVENT_LBUTTONDOWN:
leftMouse = 1;
break;
case Common::EVENT_KEYDOWN: {
if (event.kbd.keycode == Common::KeyCode::KEYCODE_RETURN || event.kbd.keycode == Common::KeyCode::KEYCODE_KP_ENTER) {
_hitEnter = true;
}
case Common::EVENT_KEYDOWN:
_pressed[event.kbd.keycode] = 1 + event.kbdRepeat;
break;
}
case Common::EVENT_KEYUP: {
if (event.kbd.keycode == Common::KeyCode::KEYCODE_RETURN || event.kbd.keycode == Common::KeyCode::KEYCODE_KP_ENTER) {
_hitEnter = false;
}
case Common::EVENT_KEYUP:
_pressed[event.kbd.keycode] = 0;
break;
}
case Common::EVENT_RBUTTONDOWN:
rightMouse = 1;
break;