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

sev- noreply at scummvm.org
Thu Jun 19 22:00:02 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:
aada306ffe SUPERNOVA: Add keymapper support


Commit: aada306ffee9279e0008ed3eef2bbfed3e62c033
    https://github.com/scummvm/scummvm/commit/aada306ffee9279e0008ed3eef2bbfed3e62c033
Author: aunnoman1 (aunnoman123 at outlook.com)
Date: 2025-06-19T23:59:59+02:00

Commit Message:
SUPERNOVA: Add keymapper support

Changed paths:
    engines/supernova/game-manager.cpp
    engines/supernova/game-manager.h
    engines/supernova/metaengine.cpp
    engines/supernova/supernova.cpp
    engines/supernova/supernova.h
    engines/supernova/supernova1/state.cpp
    engines/supernova/supernova2/state.cpp


diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index 0d3f8ac77f1..02435a693c7 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -29,6 +29,8 @@
 #include "supernova/supernova.h"
 #include "supernova/game-manager.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Supernova {
 
 bool GameManager::serialize(Common::WriteStream *out) {
@@ -247,11 +249,10 @@ bool GameManager::canSaveGameStateCurrently() {
 void GameManager::updateEvents() {
 }
 
-void GameManager::processInput(Common::KeyState &state) {
-	_key = state;
+void GameManager::processInput(Common::CustomEventType action) {
 
-	switch (state.keycode) {
-	case Common::KEYCODE_F1:
+	switch (action) {
+	case kActionHelp:
 		// help
 		if (!_guiEnabled)
 			return;
@@ -260,74 +261,72 @@ void GameManager::processInput(Common::KeyState &state) {
 		else if (_vm->_MSPart == 2)
 			_vm->showHelpScreen2();
 		break;
-	case Common::KEYCODE_F2:
+	case kActionInstr:
 		// show game manual
 		if (!_guiEnabled)
 			return;
 		_vm->showTextReader("doc");
 		break;
-	case Common::KEYCODE_F3:
+	case kActionInfo:
 		// show game info
 		if (!_guiEnabled)
 			return;
 		_vm->showTextReader("inf");
 		break;
-	case Common::KEYCODE_F4:
+	case kActionSpeed:
 		if (!_guiEnabled)
 			return;
 		_vm->setTextSpeed();
 		break;
-	case Common::KEYCODE_F5:
+	case kActionPause:
 		_vm->openMainMenuDialog();
 		break;
-	case Common::KEYCODE_x:
-		if (state.flags & Common::KBD_ALT) {
-			if (_vm->quitGameDialog())
-				_vm->quitGame();
-		}
+	case kActionQuit:
+		if (_vm->quitGameDialog())
+			_vm->quitGame();
 		break;
 	default:
 		break;
 	}
 	if (_vm->_improved && _guiEnabled) {
-		switch (state.keycode) {
-		case Common::KEYCODE_1:
+		switch (action) {
+		case kActionGo:
 			resetInputState();
 			_inputVerb = ACTION_WALK;
 			break;
-		case Common::KEYCODE_2:
+		case kActionLook:
 			resetInputState();
 			_inputVerb = ACTION_LOOK;
 			break;
-		case Common::KEYCODE_3:
+		case kActionTake:
 			resetInputState();
 			_inputVerb = ACTION_TAKE;
 			break;
-		case Common::KEYCODE_4:
+		case kActionOpen:
 			resetInputState();
 			_inputVerb = ACTION_OPEN;
 			break;
-		case Common::KEYCODE_5:
+		case kActionClose:
 			resetInputState();
 			_inputVerb = ACTION_CLOSE;
 			break;
-		case Common::KEYCODE_6:
+		case kActionPush:
 			resetInputState();
 			_inputVerb = ACTION_PRESS;
 			break;
-		case Common::KEYCODE_7:
+		case kActionPull:
 			resetInputState();
 			_inputVerb = ACTION_PULL;
 			break;
-		case Common::KEYCODE_8:
+		case kActionUse:
 			resetInputState();
 			_inputVerb = ACTION_USE;
 			break;
-		case Common::KEYCODE_9:
+		case kActionTalk:
 			resetInputState();
 			_inputVerb = ACTION_TALK;
 			break;
-		case Common::KEYCODE_0:
+		case kActionGive:
 			resetInputState();
 			_inputVerb = ACTION_GIVE;
 			break;
@@ -345,6 +344,7 @@ void GameManager::resetInputState() {
 	_mouseClicked = false;
 	_keyPressed = false;
 	_key.reset();
+	_action = kActionNone;
 	_mouseClickType = Common::EVENT_MOUSEMOVE;
 
 	processInput();
@@ -812,6 +812,10 @@ void GameManager::wait(int ticks, bool checkInput, bool waitForSpeech) {
 }
 
 bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode, bool waitForSpeech) {
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->disableAllGameKeymaps();
+	keymapper->getKeymap("cutscene")->setEnabled(true);
+	
 	Common::TextToSpeechManager *ttsMan = nullptr;
 	if (waitForSpeech && ConfMan.getBool("tts_enabled"))
 		ttsMan = g_system->getTextToSpeechManager();
@@ -823,17 +827,31 @@ bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode, bool waitForS
 		updateEvents();
 		g_system->updateScreen();
 		if (_keyPressed) {
-			keycode = _key.keycode;
+			if (_action == kActionSkip) {
+				keycode = Common::KEYCODE_ESCAPE;
+			} else {
+				keycode = _key.keycode;
+			}
+			_action = kActionNone;
 			_key.reset();
 			if (ttsMan)
 				ttsMan->stop();
+			keymapper->getKeymap("cutscene")->setEnabled(false);
+			keymapper->getKeymap("supernova-default")->setEnabled(true);
+			keymapper->getKeymap("improved-mode")->setEnabled(true);
 			return true;
 		} else if (_mouseClicked) {
 			if (ttsMan)
 				ttsMan->stop();
+			keymapper->getKeymap("cutscene")->setEnabled(false);
+			keymapper->getKeymap("supernova-default")->setEnabled(true);
+			keymapper->getKeymap("improved-mode")->setEnabled(true);
 			return true;
 		}
 	} while ((_time < end || (ttsMan && ttsMan->isSpeaking()))  && !_vm->shouldQuit());
+	keymapper->getKeymap("cutscene")->setEnabled(false);
+	keymapper->getKeymap("supernova-default")->setEnabled(true);
+	keymapper->getKeymap("improved-mode")->setEnabled(true);
 	return false;
 }
 
@@ -894,6 +912,10 @@ void GameManager::animationOn() {
 }
 
 void GameManager::edit(Common::String &input, int x, int y, uint length) {
+	// turn off keymapper to allow full text input
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->disableAllGameKeymaps();
+	g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
 	bool isEditing = true;
 	uint cursorIndex = input.size();
 	// NOTE: Pixels for char needed = kFontWidth + 2px left and right side bearing
@@ -969,6 +991,10 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
 			break;
 		}
 	}
+	// turn on default keymapper
+	keymapper->getKeymap("supernova-default")->setEnabled(true);
+	keymapper->getKeymap("improved-mode")->setEnabled(true);
+	g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
 	_guiEnabled = true;
 }
 
diff --git a/engines/supernova/game-manager.h b/engines/supernova/game-manager.h
index d029664b7ad..42ef8473299 100644
--- a/engines/supernova/game-manager.h
+++ b/engines/supernova/game-manager.h
@@ -105,7 +105,7 @@ public:
 	virtual ~GameManager();
 
 	virtual void updateEvents();
-	void processInput(Common::KeyState &state);
+	void processInput(Common::CustomEventType action);
 	void processInput();
 	virtual void executeRoom();
 	virtual bool serialize(Common::WriteStream *out);
@@ -116,6 +116,7 @@ public:
 	SupernovaEngine *_vm;
 	Sound *_sound;
 	Common::KeyState _key;
+	Common::CustomEventType _action;
 	Common::EventType _mouseClickType;
 	bool _mouseClicked;
 	bool _keyPressed;
diff --git a/engines/supernova/metaengine.cpp b/engines/supernova/metaengine.cpp
index 0ea5ea3b4a6..b7f5730a6b3 100644
--- a/engines/supernova/metaengine.cpp
+++ b/engines/supernova/metaengine.cpp
@@ -30,6 +30,10 @@
 #include "supernova/supernova.h"
 #include "supernova/detection.h"
 
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/keymapper/standard-actions.h"
+
 static const ADExtraGuiOptionsMap optionsList[] = {
 	{
 		GAMEOPTION_IMPROVED,
@@ -88,6 +92,8 @@ public:
 		else
 			return Common::String::format("%s.%03d", prefix, saveGameIdx);
 	}
+
+	Common::KeymapArray initKeymaps(const char *target) const override;
 };
 
 bool SupernovaMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -201,6 +207,217 @@ SaveStateDescriptor SupernovaMetaEngine::querySaveMetaInfos(const char *target,
 	return SaveStateDescriptor();
 }
 
+Common::KeymapArray SupernovaMetaEngine::initKeymaps(const char *target) const {
+	
+	using namespace Common;
+	using namespace Supernova;
+
+	Common::String gameId = ConfMan.get("gameid", target);
+
+	Keymap *engineKeymap = new Keymap(Keymap::kKeymapTypeGame, "supernova-default", _("Default keymappings"));
+	Keymap *menuKeymap = new Keymap(Keymap::kKeymapTypeGame, "menu", _("Menu keymappings"));
+	Keymap *cutsceneKeymap = new Keymap(Keymap::kKeymapTypeGame, "cutscene", _("Cutscene keymappings"));
+	Keymap *improvedKeymap = new Keymap(Keymap::kKeymapTypeGame, "improved-mode", _("Improved mode keymappings"));
+	Keymap *textReaderKeymap = new Keymap(Keymap::kKeymapTypeGame, "text-reader", _("Text reader keymappings"));
+	Keymap *computerKeymap = new Keymap(Keymap::kKeymapTypeGame, "computer", _("Computer keymappings"));
+
+	Common::Action *act;
+	
+	act = new Common::Action(kStandardActionLeftClick, _("Interact"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action(kStandardActionRightClick, _("Perform Default Action"));
+	act->setRightClickEvent();
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("JOY_B");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("HELP", _("Help"));
+	act->setCustomEngineActionEvent(kActionHelp);
+	act->addDefaultInputMapping("F1");
+	act->addDefaultInputMapping("JOY_LEFT");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("INSTRUCTIONS", _("Instructions"));
+	act->setCustomEngineActionEvent(kActionInstr);
+	act->addDefaultInputMapping("F2");
+	act->addDefaultInputMapping("JOY_RIGHT");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("INFORMATION", _("Information"));
+	act->setCustomEngineActionEvent(kActionInfo);
+	act->addDefaultInputMapping("F3");
+	act->addDefaultInputMapping("JOY_UP");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("TEXTSPEED", _("Text speed"));
+	act->setCustomEngineActionEvent(kActionSpeed);
+	act->addDefaultInputMapping("F4");
+	act->addDefaultInputMapping("JOY_DOWN");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("PAUSE", _("Pause"));
+	act->setCustomEngineActionEvent(kActionPause);
+	act->addDefaultInputMapping("F5");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("QUIT", _("Quit"));
+	act->setCustomEngineActionEvent(kActionQuit);
+	act->addDefaultInputMapping("A+x");
+	act->addDefaultInputMapping("JOY_Y");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("UP", _("Up"));
+	act->setCustomEngineActionEvent(kActionUp);
+	act->addDefaultInputMapping("UP");
+	act->addDefaultInputMapping("JOY_UP");
+	textReaderKeymap->addAction(act);
+
+	act = new Common::Action("DOWN", _("Down"));
+	act->setCustomEngineActionEvent(kActionDown);
+	act->addDefaultInputMapping("DOWN");
+	act->addDefaultInputMapping("JOY_DOWN");
+	textReaderKeymap->addAction(act);
+
+	act = new Common::Action("PGUP", _("Page up"));
+	act->setCustomEngineActionEvent(kActionPgUp);
+	act->addDefaultInputMapping("PAGEUP");
+	act->addDefaultInputMapping("JOY_RIGHT_SHOULDER");
+	textReaderKeymap->addAction(act);
+
+	act = new Common::Action("PGDOWN", _("Page down"));
+	act->setCustomEngineActionEvent(kActionPgDown);
+	act->addDefaultInputMapping("PAGEDOWN");
+	act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+	textReaderKeymap->addAction(act);
+
+	act = new Common::Action("EXIT", _("Exit"));
+	act->setCustomEngineActionEvent(kActionExit);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_B");
+	textReaderKeymap->addAction(act);
+
+	act = new Common::Action("SELECT", _("Select"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	menuKeymap->addAction(act);
+
+	act = new Common::Action("SKIP", _("Skip cutscene"));
+	act->setCustomEngineActionEvent(kActionSkip);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_B");
+	cutsceneKeymap->addAction(act);
+
+	act = new Common::Action("SKPL", _("Skip line"));
+	act->setCustomEngineActionEvent(kActionSkipLine);
+	act->addDefaultInputMapping("SPACE");
+	act->addDefaultInputMapping("JOY_A");
+	cutsceneKeymap->addAction(act);
+
+	act = new Common::Action("GO", _("Go"));
+	act->setCustomEngineActionEvent(kActionGo);
+	act->addDefaultInputMapping("1");
+	improvedKeymap->addAction(act);
+
+	act = new Common::Action("LOOK", _("Look"));
+	act->setCustomEngineActionEvent(kActionLook);
+	act->addDefaultInputMapping("2");
+	improvedKeymap->addAction(act);
+
+	act = new Common::Action("TAKE", _("Take"));
+	act->setCustomEngineActionEvent(kActionTake);
+	act->addDefaultInputMapping("3");
+	improvedKeymap->addAction(act);
+
+	act = new Common::Action("OPEN", _("Open"));
+	act->setCustomEngineActionEvent(kActionOpen);
+	act->addDefaultInputMapping("4");
+	improvedKeymap->addAction(act);
+
+	act = new Common::Action("CLOSE", _("Close"));
+	act->setCustomEngineActionEvent(kActionClose);
+	act->addDefaultInputMapping("5");
+	improvedKeymap->addAction(act);
+
+	act = new Common::Action("PUSH", _("Push"));
+	act->setCustomEngineActionEvent(kActionPush);
+	act->addDefaultInputMapping("6");
+	improvedKeymap->addAction(act);
+
+	act = new Common::Action("PULL", _("Pull"));
+	act->setCustomEngineActionEvent(kActionPull);
+	act->addDefaultInputMapping("7");
+	improvedKeymap->addAction(act);
+
+	act = new Common::Action("USE", _("Use"));
+	act->setCustomEngineActionEvent(kActionUse);
+	act->addDefaultInputMapping("8");
+	improvedKeymap->addAction(act);
+
+	act = new Common::Action("TALK", _("Talk"));
+	act->setCustomEngineActionEvent(kActionTalk);
+	act->addDefaultInputMapping("9");
+	improvedKeymap->addAction(act);
+
+	act = new Common::Action("GIVE", _("Give"));
+	act->setCustomEngineActionEvent(kActionGive);
+	act->addDefaultInputMapping("0");
+	improvedKeymap->addAction(act);
+
+	if (gameId == "msn1") {
+
+		act = new Common::Action("EXIT", _("Exit"));
+		act->setCustomEngineActionEvent(kActionExit);
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_B");
+		computerKeymap->addAction(act);
+		
+		act = new Common::Action("OFFICE", _("Office manager"));
+		act->setCustomEngineActionEvent(kActionOfficeManager);
+		act->addDefaultInputMapping("1");
+		act->addDefaultInputMapping("JOY_LEFT");
+		computerKeymap->addAction(act);
+
+		act = new Common::Action("PHONE", _("Phone"));
+		act->setCustomEngineActionEvent(kActionPhone);
+		act->addDefaultInputMapping("2");
+		act->addDefaultInputMapping("JOY_UP");
+		computerKeymap->addAction(act);
+
+		act = new Common::Action("PROTEXT", _("ProText"));
+		act->setCustomEngineActionEvent(kActionProText);
+		act->addDefaultInputMapping("3");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		computerKeymap->addAction(act);
+
+		act = new Common::Action("CALCULATA", _("Calculata"));
+		act->setCustomEngineActionEvent(kActionCalculata);
+		act->addDefaultInputMapping("4");
+		act->addDefaultInputMapping("JOY_DOWN");
+		computerKeymap->addAction(act);
+
+	}
+
+	Common::KeymapArray keymaps(6);
+	keymaps[0] = engineKeymap;
+	keymaps[1] = menuKeymap;
+	keymaps[2] = cutsceneKeymap;
+	keymaps[3] = improvedKeymap;
+	keymaps[4] = textReaderKeymap;
+	keymaps[5] = computerKeymap;
+
+	menuKeymap->setEnabled(false);
+	cutsceneKeymap->setEnabled(false);
+	textReaderKeymap->setEnabled(false);
+	computerKeymap->setEnabled(false);
+	
+	return keymaps;
+}
+
 #if PLUGIN_ENABLED_DYNAMIC(SUPERNOVA)
 	REGISTER_PLUGIN_DYNAMIC(SUPERNOVA, PLUGIN_TYPE_ENGINE, SupernovaMetaEngine);
 #else
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 3c2967d259a..53f24f2da8f 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -49,6 +49,8 @@
 #include "supernova/supernova2/state.h"
 #include "supernova/game-manager.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Supernova {
 
 ObjectType operator|(ObjectType a, ObjectType b) {
@@ -349,6 +351,11 @@ void SupernovaEngine::setColor63(byte value) {
 }
 
 void SupernovaEngine::setTextSpeed() {
+	// turn off keymapper so that we can select speed using Keys 1-5
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->disableAllGameKeymaps();
+	keymapper->getKeymap("menu")->setEnabled(true);
+
 	const Common::String &textSpeedString = getGameString(kStringTextSpeed);
 	int stringWidth = Screen::textWidth(textSpeedString);
 	int textX = (kScreenWidth - stringWidth) / 2;
@@ -359,11 +366,6 @@ void SupernovaEngine::setTextSpeed() {
 	int boxWidth = stringWidth > 110 ? stringWidth : 110;
 	int boxHeight = 27;
 
-	// Disable improved mode temporarilly so that Key 1-5 are received below
-	// instead of being mapped to action selection.
-	bool hasImprovedMode = _improved;
-	_improved = false;
-
 	_gm->animationOff();
 	_gm->saveTime();
 	saveScreen(boxX, boxY, boxWidth, boxHeight);
@@ -406,7 +408,9 @@ void SupernovaEngine::setTextSpeed() {
 	_gm->loadTime();
 	_gm->animationOn();
 
-	_improved = hasImprovedMode;
+	keymapper->getKeymap("menu")->setEnabled(false);
+	keymapper->getKeymap("supernova-default")->setEnabled(true);
+	keymapper->getKeymap("improved-mode")->setEnabled(true);
 }
 
 void SupernovaEngine::showHelpScreen1() {
@@ -553,6 +557,10 @@ Common::Error SupernovaEngine::showTextReader(const char *extension) {
 	}
 	paletteFadeIn();
 
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->disableAllGameKeymaps();
+	keymapper->getKeymap("text-reader")->setEnabled(true);
+
 	const int linesPerPage = 19;
 	int lineNumber = 0;
 	bool exitReader = false;
@@ -569,21 +577,21 @@ Common::Error SupernovaEngine::showTextReader(const char *extension) {
 			_screen->renderText(line, 6, y, kColorWhite99);
 		}
 		_gm->getInput(true);
-		switch (_gm->_key.keycode) {
-		case Common::KEYCODE_ESCAPE:
+		switch (_gm->_action) {
+		case kActionExit:
 			exitReader = true;
 			break;
-		case Common::KEYCODE_UP:
+		case kActionUp:
 			lineNumber = lineNumber > 0 ? lineNumber - 1 : 0;
 			break;
-		case Common::KEYCODE_DOWN:
+		case kActionDown:
 			lineNumber = lineNumber < linesInFile - (linesPerPage + 1) ? lineNumber + 1
 			                                                           : linesInFile - linesPerPage;
 			break;
-		case Common::KEYCODE_PAGEUP:
+		case kActionPgUp:
 			lineNumber = lineNumber > linesPerPage ? lineNumber - linesPerPage : 0;
 			break;
-		case Common::KEYCODE_PAGEDOWN:
+		case kActionPgDown:
 			lineNumber = lineNumber < linesInFile - (linesPerPage * 2) ? lineNumber + linesPerPage
 			                                                           : linesInFile - linesPerPage;
 			break;
@@ -596,11 +604,19 @@ Common::Error SupernovaEngine::showTextReader(const char *extension) {
 	_gm->loadTime();
 	_gm->animationOn();
 
+	keymapper->getKeymap("text-reader")->setEnabled(false);
+	keymapper->getKeymap("supernova-default")->setEnabled(true);
+	keymapper->getKeymap("improved-mode")->setEnabled(true);
+
 	return Common::kNoError;
 }
 
 bool SupernovaEngine::quitGameDialog() {
 	bool quit = false;
+	
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->disableAllGameKeymaps();
+	keymapper->getKeymap("menu")->setEnabled(true);
 
 	GuiElement guiQuitBox;
 	guiQuitBox.setColor(kColorRed, kColorWhite99, kColorRed, kColorWhite99);
@@ -654,6 +670,10 @@ bool SupernovaEngine::quitGameDialog() {
 	restoreScreen();
 	_gm->animationOn();
 
+	keymapper->getKeymap("menu")->setEnabled(false);
+	keymapper->getKeymap("supernova-default")->setEnabled(true);
+	keymapper->getKeymap("improved-mode")->setEnabled(true);
+
 	return quit;
 }
 
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 40014661e06..6d6a6942c81 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -138,6 +138,37 @@ public:
 	void stopSound();
 };
 
+enum SUPERNOVAAction {
+	kActionNone,
+	kActionPause,
+	kActionQuit,
+	kActionSkip,
+	kActionSkipLine,
+	kActionHelp,
+	kActionInstr,
+	kActionInfo,
+	kActionSpeed,
+	kActionGo,
+	kActionLook,
+	kActionTake,
+	kActionOpen,
+	kActionClose,
+	kActionPush,
+	kActionPull,
+	kActionUse,
+	kActionTalk,
+	kActionGive,
+	kActionUp,
+	kActionDown,
+	kActionPgUp,
+	kActionPgDown,
+	kActionExit,
+	kActionOfficeManager,
+	kActionPhone,
+	kActionProText,
+	kActionCalculata,
+};
+
 }
 
 #endif
diff --git a/engines/supernova/supernova1/state.cpp b/engines/supernova/supernova1/state.cpp
index 8f398f32097..afa51a263c8 100644
--- a/engines/supernova/supernova1/state.cpp
+++ b/engines/supernova/supernova1/state.cpp
@@ -29,6 +29,8 @@
 #include "supernova/supernova1/state.h"
 #include "supernova/supernova1/stringid.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Supernova {
 
 bool GameManager1::serialize(Common::WriteStream *out) {
@@ -374,9 +376,14 @@ void GameManager1::updateEvents() {
 	Common::Event event;
 	while (g_system->getEventManager()->pollEvent(event)) {
 		switch (event.type) {
+		case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+			_keyPressed = true;
+			_action = event.customType;
+			processInput(event.customType);
+			break;
 		case Common::EVENT_KEYDOWN:
 			_keyPressed = true;
-			processInput(event.kbd);
+			_key = event.kbd;
 			break;
 		case Common::EVENT_LBUTTONUP:
 			// fallthrough
@@ -446,11 +453,14 @@ void GameManager1::telomat(int nr) {
 	_vm->renderText(kStringTelomat10, 100, 103, kColorGreen);
 	_vm->renderText(kStringTelomat11, 100, 120, kColorDarkGreen);
 	Common::String input;
+	Common::Keymapper *keymapper =  g_system->getEventManager()->getKeymapper();
+	keymapper->disableAllGameKeymaps();
+	keymapper->getKeymap("computer")->setEnabled(true);
 	do {
 		getInput();
 
-		switch (_key.keycode) {
-		case Common::KEYCODE_2: {
+		switch (_action) {
+		case kActionPhone: {
 			_vm->renderBox(0, 0, 320, 200, kColorDarkBlue);
 			_vm->renderText(kStringTelomat12, 50, 80, kColorGreen);
 			_vm->renderText(kStringTelomat13, 50, 91, kColorGreen);
@@ -464,6 +474,9 @@ void GameManager1::telomat(int nr) {
 				_vm->paletteBrightness();
 				_guiEnabled = true;
 				drawMapExits();
+				keymapper->getKeymap("computer")->setEnabled(false);
+				keymapper->getKeymap("supernova-default")->setEnabled(true);
+				keymapper->getKeymap("improved-mode")->setEnabled(true);
 				return;
 			}
 
@@ -481,6 +494,9 @@ void GameManager1::telomat(int nr) {
 				_vm->paletteBrightness();
 				_guiEnabled = true;
 				drawMapExits();
+				keymapper->getKeymap("computer")->setEnabled(false);
+				keymapper->getKeymap("supernova-default")->setEnabled(true);
+				keymapper->getKeymap("improved-mode")->setEnabled(true);
 				return;
 			}
 
@@ -492,6 +508,9 @@ void GameManager1::telomat(int nr) {
 				_vm->paletteBrightness();
 				_guiEnabled = true;
 				drawMapExits();
+				keymapper->getKeymap("computer")->setEnabled(false);
+				keymapper->getKeymap("supernova-default")->setEnabled(true);
+				keymapper->getKeymap("improved-mode")->setEnabled(true);
 				return;
 			}
 
@@ -541,11 +560,14 @@ void GameManager1::telomat(int nr) {
 			}
 			_guiEnabled = true;
 			drawMapExits();
+			keymapper->getKeymap("computer")->setEnabled(false);
+			keymapper->getKeymap("supernova-default")->setEnabled(true);
+			keymapper->getKeymap("improved-mode")->setEnabled(true);
 			return;
 			}
-		case Common::KEYCODE_1:
-		case Common::KEYCODE_3:
-		case Common::KEYCODE_4:
+		case kActionOfficeManager:
+		case kActionProText:
+		case kActionCalculata:
 			_vm->renderBox(0, 0, 320, 200, kColorDarkBlue);
 			_vm->renderText(kStringTelomat21, 100, 90, kColorGreen);
 			input = "";
@@ -558,12 +580,15 @@ void GameManager1::telomat(int nr) {
 				wait(10);
 			}
 			// fallthrough
-		case Common::KEYCODE_ESCAPE:
+		case kActionExit:
 			_vm->renderBox(0, 0, 320, 200, kColorBlack);
 			_vm->renderRoom(*_currentRoom);
 			_vm->paletteBrightness();
 			_guiEnabled = true;
 			drawMapExits();
+			keymapper->getKeymap("computer")->setEnabled(false);
+			keymapper->getKeymap("supernova-default")->setEnabled(true);
+			keymapper->getKeymap("improved-mode")->setEnabled(true);
 			return;
 		default:
 			break;
diff --git a/engines/supernova/supernova2/state.cpp b/engines/supernova/supernova2/state.cpp
index 673bebf5e20..4ebf054376b 100644
--- a/engines/supernova/supernova2/state.cpp
+++ b/engines/supernova/supernova2/state.cpp
@@ -387,9 +387,14 @@ void GameManager2::updateEvents() {
 	Common::Event event;
 	while (g_system->getEventManager()->pollEvent(event)) {
 		switch (event.type) {
+		case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+			_keyPressed = true;
+			_action = event.customType;
+			processInput(event.customType);
+			break;
 		case Common::EVENT_KEYDOWN:
 			_keyPressed = true;
-			processInput(event.kbd);
+			_key = event.kbd;
 			break;
 		case Common::EVENT_LBUTTONUP:
 			// fallthrough




More information about the Scummvm-git-logs mailing list