[Scummvm-git-logs] scummvm master -> a84f448f3032a46188b92b2b4c954bbfc846e1f6

sev- noreply at scummvm.org
Mon Sep 1 14:48:26 UTC 2025


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
a84f448f30 PETKA: Add keymapper support


Commit: a84f448f3032a46188b92b2b4c954bbfc846e1f6
    https://github.com/scummvm/scummvm/commit/a84f448f3032a46188b92b2b4c954bbfc846e1f6
Author: aunnoman1 (aunnoman123 at outlook.com)
Date: 2025-09-01T16:48:22+02:00

Commit Message:
PETKA: Add keymapper support

Changed paths:
    engines/petka/metaengine.cpp
    engines/petka/petka.cpp
    engines/petka/petka.h
    engines/petka/q_system.cpp


diff --git a/engines/petka/metaengine.cpp b/engines/petka/metaengine.cpp
index 6e451ecbc12..b6068b47723 100644
--- a/engines/petka/metaengine.cpp
+++ b/engines/petka/metaengine.cpp
@@ -26,6 +26,11 @@
 
 #include "petka/petka.h"
 
+#include "common/translation.h"
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/keymapper/standard-actions.h"
+
 class PetkaMetaEngine : public AdvancedMetaEngine<ADGameDescription> {
 public:
 	const char *getName() const override {
@@ -38,6 +43,7 @@ public:
 	bool removeSaveState(const char *target, int slot) const override;
 	SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;
 	Common::Error createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override;
+	Common::KeymapArray initKeymaps(const char *target) const override;
 };
 
 bool PetkaMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -100,6 +106,108 @@ Common::Error PetkaMetaEngine::createInstance(OSystem *syst, Engine **engine, co
 	return Common::kNoError;
 }
 
+Common::KeymapArray PetkaMetaEngine::initKeymaps(const char *target) const {
+	using namespace Common;
+	using namespace Petka;
+
+	Keymap *engineKeymap = new Keymap(Keymap::kKeymapTypeGame, "petka-default", _("Default keymappings"));
+
+	Action *act;
+
+	act = new Action(kStandardActionLeftClick, _("Interact / Skip dialog"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	engineKeymap->addAction(act);
+
+	// I18N: (Game Name: Red Comrades 1: Save the Galaxy) The game has multiple actions that you can perform(take, use, etc.), the action menu allows you to select one of them.
+	act = new Action(kStandardActionRightClick, _("Open action menu / Close current interface"));
+	act->setRightClickEvent();
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("JOY_B");
+	engineKeymap->addAction(act);
+
+	act = new Action("LOOK", _("Look"));
+	act->setCustomEngineActionEvent(kActionCursorLook);
+	act->addDefaultInputMapping("1");
+	act->addDefaultInputMapping("l");
+	act->addDefaultInputMapping("JOY_DOWN");
+	engineKeymap->addAction(act);
+
+	act = new Action("WALK", _("Walk"));
+	act->setCustomEngineActionEvent(kActionCursorWalk);
+	act->addDefaultInputMapping("2");
+	act->addDefaultInputMapping("w");
+	act->addDefaultInputMapping("JOY_LEFT");
+	engineKeymap->addAction(act);
+
+	act = new Action("TAKE", _("Take"));
+	act->setCustomEngineActionEvent(kActionCursorTake);
+	act->addDefaultInputMapping("3");
+	act->addDefaultInputMapping("g");
+	act->addDefaultInputMapping("JOY_UP");
+	engineKeymap->addAction(act);
+
+	act = new Action("USE", _("Use"));
+	act->setCustomEngineActionEvent(kActionCursorUse);
+	act->addDefaultInputMapping("4");
+	act->addDefaultInputMapping("u");
+	act->addDefaultInputMapping("JOY_RIGHT");
+	engineKeymap->addAction(act);
+
+	act = new Action("TALK", _("Talk"));
+	act->setCustomEngineActionEvent(kActionCursorTalk);
+	act->addDefaultInputMapping("5");
+	act->addDefaultInputMapping("t");
+	act->addDefaultInputMapping("JOY_X");
+	engineKeymap->addAction(act);
+
+	// I18N: (Game Name: Red Comrades 1: Save the Galaxy) The game features two characters, but all actions are normally performed by Petka. This action allows you to "use" an object specifically with Chapayev instead.
+	act = new Action("CHAPAYEV", _("Chapayev use object"));
+	act->setCustomEngineActionEvent(kActionCursorChapayev);
+	act->addDefaultInputMapping("6");
+	act->addDefaultInputMapping("c");
+	act->addDefaultInputMapping("JOY_RIGHT_TRIGGER");
+	engineKeymap->addAction(act);
+
+	act = new Action("INVENTORY", _("Inventory"));
+	act->setCustomEngineActionEvent(kActionInventory);
+	act->addDefaultInputMapping("i");
+	act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+	engineKeymap->addAction(act);
+
+	act = new Action("MAP", _("Map"));
+	act->setCustomEngineActionEvent(kActionMap);
+	act->addDefaultInputMapping("TAB");
+	act->addDefaultInputMapping("m");
+	act->addDefaultInputMapping("JOY_RIGHT_SHOULDER");
+	engineKeymap->addAction(act);
+
+	act = new Action("OPTIONS", _("Show / Hide options screen"));
+	act->setCustomEngineActionEvent(kActionOptions);
+	act->addDefaultInputMapping("o");
+	act->addDefaultInputMapping("JOY_LEFT_TRIGGER");
+	engineKeymap->addAction(act);
+
+	act = new Action("PREVIOUS_INTERFACE", _("Close current interface"));
+	act->setCustomEngineActionEvent(kActionPrevInterface);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_Y");
+	engineKeymap->addAction(act);
+
+	act = new Action("SAVE", _("Save game"));
+	act->setCustomEngineActionEvent(kActionSave);
+	act->addDefaultInputMapping("F2");
+	engineKeymap->addAction(act);
+
+	act = new Action("LOAD", _("Load game"));
+	act->setCustomEngineActionEvent(kActionLoad);
+	act->addDefaultInputMapping("F3");
+	engineKeymap->addAction(act);
+
+	return Keymap::arrayOf(engineKeymap);
+}
+
 #if PLUGIN_ENABLED_DYNAMIC(PETKA)
 	REGISTER_PLUGIN_DYNAMIC(PETKA, PLUGIN_TYPE_ENGINE, PetkaMetaEngine);
 #else
diff --git a/engines/petka/petka.cpp b/engines/petka/petka.cpp
index ea99e9e2dd5..e1d3a58b415 100644
--- a/engines/petka/petka.cpp
+++ b/engines/petka/petka.cpp
@@ -249,6 +249,7 @@ void PetkaEngine::playVideo(Common::SeekableReadStream *stream) {
 			case Common::EVENT_LBUTTONDOWN:
 			case Common::EVENT_RBUTTONDOWN:
 			case Common::EVENT_KEYDOWN:
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
 				goto end;
 			default:
 				break;
diff --git a/engines/petka/petka.h b/engines/petka/petka.h
index 89f61f3523b..6dadd90fc09 100644
--- a/engines/petka/petka.h
+++ b/engines/petka/petka.h
@@ -80,6 +80,23 @@ enum {
 	GF_COMPRESSED = (1 << 0),
 };
 
+enum PETKAActions {
+	kActionNone,
+	kActionCursorLook,
+	kActionCursorWalk,
+	kActionCursorTake,
+	kActionCursorUse,
+	kActionCursorTalk,
+	kActionCursorChapayev,
+	kActionInventory,
+	kActionMap,
+	kActionOptions,
+	kActionPrevInterface,
+	kActionSave,
+	kActionLoad,
+	kActionSkip,
+};
+
 class PetkaEngine : public Engine {
 public:
 	PetkaEngine(OSystem *syst, const ADGameDescription *desc);
diff --git a/engines/petka/q_system.cpp b/engines/petka/q_system.cpp
index 90dbcfed2f6..84498dce01f 100644
--- a/engines/petka/q_system.cpp
+++ b/engines/petka/q_system.cpp
@@ -376,61 +376,55 @@ void QSystem::onEvent(const Common::Event &event) {
 		_currInterface->onRightButtonDown(p);
 		break;
 	}
-	case Common::EVENT_KEYDOWN:
-		switch (event.kbd.keycode) {
-		case Common::KEYCODE_1:
-		case Common::KEYCODE_l:
+	case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+		switch (event.customType) {
+		case kActionCursorLook:
 			setCursorAction(kActionLook);
 			break;
-		case Common::KEYCODE_2:
-		case Common::KEYCODE_w:
+		case kActionCursorWalk:
 			setCursorAction(kActionWalk);
 			break;
-		case Common::KEYCODE_3:
-		case Common::KEYCODE_g:
+		case kActionCursorTake:
 			setCursorAction(kActionTake);
 			break;
-		case Common::KEYCODE_4:
-		case Common::KEYCODE_u:
+		case kActionCursorUse:
 			setCursorAction(kActionUse);
 			break;
-		case Common::KEYCODE_5:
-		case Common::KEYCODE_t:
+		case kActionCursorTalk:
 			setCursorAction(kActionTalk);
 			break;
-		case Common::KEYCODE_6:
-		case Common::KEYCODE_c:
+		case kActionCursorChapayev:
 			setCursorAction(kActionObjUseChapayev);
 			break;
-		case Common::KEYCODE_i:
+		case kActionInventory:
 			toggleCase();
 			break;
-		case Common::KEYCODE_TAB:
-		case Common::KEYCODE_m:
+		case kActionMap:
 			toggleMapInterface();
 			break;
-		case Common::KEYCODE_o:
+		case kActionOptions:
 			togglePanelInterface();
 			break;
-		case Common::KEYCODE_ESCAPE:
+		case kActionPrevInterface:
 			goPrevInterface();
 			break;
-		case Common::KEYCODE_F2: {
+		case kActionSave: {
 			InterfaceSaveLoad::saveScreen();
 			startSaveLoad(kSaveMode);
 			break;
 		}
-		case Common::KEYCODE_F3:
+		case kActionLoad:
 			startSaveLoad(kLoadMode);
 			break;
-		case Common::KEYCODE_r:
-			if (event.kbd.flags & Common::KBD_ALT) {
-				_mainInterface->_dialog.fixCursor(); // Buggy in original
-			}
-			break;
 		default:
 			break;
 		}
+	case Common::EVENT_KEYDOWN:
+		if (event.kbd.keycode == Common::KEYCODE_r)
+			if (event.kbd.flags & Common::KBD_ALT) {
+				_mainInterface->_dialog.fixCursor(); // Buggy in original
+			}
+		break;
 	default:
 		break;
 	}




More information about the Scummvm-git-logs mailing list