HOPKINS: Add keymapper support

This commit is contained in:
NabeelShabbir 2024-08-01 21:33:41 +05:00 committed by Filippos Karapetis
parent 409e069a51
commit 268cb21764
3 changed files with 93 additions and 6 deletions

View File

@ -30,6 +30,8 @@
#include "common/textconsole.h"
#include "graphics/cursorman.h"
#include "backends/keymapper/keymapper.h"
namespace Hopkins {
EventsManager::EventsManager(HopkinsEngine *vm) {
@ -251,9 +253,11 @@ void EventsManager::pollEvents() {
case Common::EVENT_RETURN_TO_LAUNCHER:
return;
case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
handleKey(event);
return;
case Common::EVENT_KEYDOWN:
_keyState[(byte)toupper(event.kbd.ascii)] = true;
handleKey(event);
return;
case Common::EVENT_KEYUP:
_keyState[(byte)toupper(event.kbd.ascii)] = false;
@ -281,15 +285,15 @@ void EventsManager::pollEvents() {
}
void EventsManager::handleKey(const Common::Event &event) {
_escKeyFl = (event.kbd.keycode == Common::KEYCODE_ESCAPE);
_escKeyFl = (event.customType == kActionEscape);
if (event.kbd.keycode == Common::KEYCODE_i || event.kbd.keycode == Common::KEYCODE_TAB)
if (event.customType == kActionInventory)
_gameKey = KEY_INVENTORY;
else if (event.kbd.keycode == Common::KEYCODE_F5)
else if (event.customType == kActionSave)
_gameKey = KEY_SAVE;
else if (event.kbd.keycode == Common::KEYCODE_F7)
else if (event.customType == kActionLoad)
_gameKey = KEY_LOAD;
else if (event.kbd.keycode == Common::KEYCODE_F1 || event.kbd.keycode == Common::KEYCODE_o)
else if (event.customType == kActionOptions)
_gameKey = KEY_OPTIONS;
}
@ -298,6 +302,10 @@ void EventsManager::handleKey(const Common::Event &event) {
* @return Keypress, or -1 if game quit was requested
*/
int EventsManager::waitKeyPress() {
Common::Keymapper *keymapper = _vm->getEventManager()->getKeymapper();
keymapper->getKeymap("game-shortcuts")->setEnabled(false);
char foundChar = '\0';
while (!foundChar) {
@ -338,6 +346,8 @@ int EventsManager::waitKeyPress() {
g_system->delayMillis(10);
}
keymapper->getKeymap("game-shortcuts")->setEnabled(true);
// Return character
return foundChar;
}

View File

@ -61,6 +61,15 @@ namespace Hopkins {
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
enum HOPKINSAction {
kActionNone,
kActionEscape,
kActionInventory,
kActionSave,
kActionLoad,
kActionOptions
};
enum HopkinsDebugChannels {
kDebugPath = 1 << 0,
kDebugGraphics = 1 << 1

View File

@ -30,6 +30,10 @@
#include "common/system.h"
#include "graphics/surface.h"
#include "backends/keymapper/action.h"
#include "backends/keymapper/keymapper.h"
#include "backends/keymapper/standard-actions.h"
#include "hopkins/detection.h"
#define MAX_SAVES 99
@ -103,6 +107,8 @@ public:
int getMaximumSaveSlot() const override;
void removeSaveState(const char *target, int slot) const override;
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;
Common::KeymapArray initKeymaps(const char *target) const override;
};
bool HopkinsMetaEngine::hasFeature(MetaEngineFeature f) const {
@ -195,6 +201,68 @@ SaveStateDescriptor HopkinsMetaEngine::querySaveMetaInfos(const char *target, in
return SaveStateDescriptor();
}
Common::KeymapArray HopkinsMetaEngine::initKeymaps(const char *target) const {
using namespace Common;
using namespace Hopkins;
Keymap *engineKeyMap = new Keymap(Keymap::kKeymapTypeGame, "hopkins-default", _("Default keymappings"));
Keymap *gameKeyMap = new Keymap(Keymap::kKeymapTypeGame, "game-shortcuts", _("Game keymappings"));
Action *act;
act = new Action(kStandardActionLeftClick, _("Left click"));
act->setLeftClickEvent();
act->addDefaultInputMapping("MOUSE_LEFT");
act->addDefaultInputMapping("JOY_A");
engineKeyMap->addAction(act);
act = new Action(kStandardActionRightClick, _("Right click"));
act->setRightClickEvent();
act->addDefaultInputMapping("MOUSE_RIGHT");
act->addDefaultInputMapping("JOY_B");
engineKeyMap->addAction(act);
act = new Action("ESCAPE", _("Exit/Skip"));
act->setCustomEngineActionEvent(kActionEscape);
act->addDefaultInputMapping("ESCAPE");
act->addDefaultInputMapping("JOY_BACK");
gameKeyMap->addAction(act);
act = new Action("INVENTORY", _("Open inventory"));
act->setCustomEngineActionEvent(kActionInventory);
act->addDefaultInputMapping("i");
act->addDefaultInputMapping("TAB");
act->addDefaultInputMapping("JOY_X");
gameKeyMap->addAction(act);
act = new Action("SAVE", _("Save game"));
act->setCustomEngineActionEvent(kActionSave);
act->addDefaultInputMapping("F5");
act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
gameKeyMap->addAction(act);
act = new Action("LOAD", _("Load game"));
act->setCustomEngineActionEvent(kActionLoad);
act->addDefaultInputMapping("F7");
act->addDefaultInputMapping("JOY_RIGHT_SHOULDER");
gameKeyMap->addAction(act);
act = new Action("OPTIONS", _("Option dialog"));
act->setCustomEngineActionEvent(kActionOptions);
act->addDefaultInputMapping("o");
act->addDefaultInputMapping("F1");
act->addDefaultInputMapping("JOY_Y");
gameKeyMap->addAction(act);
KeymapArray keymaps(2);
keymaps[0] = engineKeyMap;
keymaps[1] = gameKeyMap;
return keymaps;
}
#if PLUGIN_ENABLED_DYNAMIC(HOPKINS)
REGISTER_PLUGIN_DYNAMIC(HOPKINS, PLUGIN_TYPE_ENGINE, HopkinsMetaEngine);
#else