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

sev- noreply at scummvm.org
Tue Feb 7 23:11:44 UTC 2023


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

Summary:
f7785f463a SCUMM: Use the keymapper for bike fights in Full Throttle


Commit: f7785f463a53c11b3f61404fc777fd0ecdfcc885
    https://github.com/scummvm/scummvm/commit/f7785f463a53c11b3f61404fc777fd0ecdfcc885
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2023-02-08T00:11:40+01:00

Commit Message:
SCUMM: Use the keymapper for bike fights in Full Throttle

Changed paths:
    engines/scumm/help.cpp
    engines/scumm/input.cpp
    engines/scumm/insane/insane.cpp
    engines/scumm/insane/insane_enemy.cpp
    engines/scumm/insane/insane_scenes.cpp
    engines/scumm/metaengine.cpp
    engines/scumm/metaengine.h
    engines/scumm/script_v6.cpp
    engines/scumm/scumm.cpp
    engines/scumm/scumm.h


diff --git a/engines/scumm/help.cpp b/engines/scumm/help.cpp
index c03f67a81fc..92719550950 100644
--- a/engines/scumm/help.cpp
+++ b/engines/scumm/help.cpp
@@ -232,13 +232,6 @@ void ScummHelp::updateStrings(byte gameId, byte version, Common::Platform platfo
 			ADD_BIND("i", _("Inventory"));
 			ADD_BIND("p", _("Punch"));
 			ADD_BIND("k", _("Kick"));
-			ADD_LINE;
-			ADD_BIND(
-				// I18N: The name of the 'Shift' key on a PC keyboard
-				_("Shift") + U32String(" v"),
-				// I18N: Lets one skip the bike/car fight sequences in Full Throttle
-				_("Win the bike fight cheat")
-			);
 			break;
 		case GID_DIG:
 			ADD_BIND("e", _("Examine"));
diff --git a/engines/scumm/input.cpp b/engines/scumm/input.cpp
index ac99925d29d..90c6fa5f0bb 100644
--- a/engines/scumm/input.cpp
+++ b/engines/scumm/input.cpp
@@ -105,6 +105,23 @@ void ScummEngine_v80he::parseEvent(Common::Event event) {
 
 void ScummEngine::parseEvent(Common::Event event) {
 	switch (event.type) {
+	case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+		if (event.customType >= kScummActionCount) {
+			debugC(DEBUG_GENERAL, "customType >= kScummActionCount (%d)", event.customType);
+		} else {
+			_actionMap[event.customType] = true;
+		}
+		break;
+
+	case Common::EVENT_CUSTOM_ENGINE_ACTION_END:
+		if (event.customType >= kScummActionCount) {
+			debugC(DEBUG_GENERAL, "customType >= kScummActionCount (%d)", event.customType);
+		} else {
+			_actionMap[event.customType] = false;
+		}
+		break;
+
+
 	case Common::EVENT_KEYDOWN:
 		if (event.kbd.keycode >= Common::KEYCODE_0 && event.kbd.keycode <= Common::KEYCODE_9 &&
 			((event.kbd.hasFlags(Common::KBD_ALT) && canSaveGameStateCurrently()) ||
@@ -150,11 +167,9 @@ void ScummEngine::parseEvent(Common::Event event) {
 		// FIXME: We are using ASCII values to index the _keyDownMap here,
 		// yet later one code which checks _keyDownMap will use KEYCODEs
 		// to do so. That is, we are mixing ascii and keycode values here,
-		// which is bad. We probably should be only using keycodes, but at
-		// least INSANE checks for "Shift-V" by looking for the 'V' key
-		// being pressed. It would be easy to solve that by also storing
-		// the modifier flags. However, since getKeyState() is also called
-		// by scripts, we have to be careful with semantic changes.
+		// which is bad. We probably should be only using keycodes, however,
+		// since getKeyState() is called by scripts, we have to be careful with
+		// semantic changes.
 		if (_keyPressed.ascii >= 512)
 			debugC(DEBUG_GENERAL, "_keyPressed > 512 (%d)", _keyPressed.ascii);
 		else
@@ -184,6 +199,8 @@ void ScummEngine::parseEvent(Common::Event event) {
 			// Fixes bug #3173: "FT: CAPSLOCK + V enables cheating for all fights"
 			//
 			// Fingolfin remarks: This wouldn't be a problem if we used keycodes.
+			//
+			// TODO: Is this still needed now that INSANE uses keymapper actions?
 			_keyDownMap[toupper(event.kbd.ascii)] = false;
 		}
 		break;
@@ -424,6 +441,8 @@ void ScummEngine::processInput() {
 			// source (i.e. the OS), I guess there is no harm in doing the same thing in our code,
 			// fetching the correct state for the mouse buttons right from the event manager, only when
 			// the INSANE/SMUSH system is active.
+			//
+			// TODO: Is this still needed now that INSANE uses keymapper actions?
 			if (_game.id == GID_FT && isInsaneActive()) {
 				VAR(VAR_LEFTBTN_HOLD) = (getEventManager()->getButtonState() & 0x1) != 0 ? 1 : 0;
 				VAR(VAR_RIGHTBTN_HOLD) = (getEventManager()->getButtonState() & 0x2) != 0 ? 1 : 0;
diff --git a/engines/scumm/insane/insane.cpp b/engines/scumm/insane/insane.cpp
index 51dff8c6e6c..76ef262c2f4 100644
--- a/engines/scumm/insane/insane.cpp
+++ b/engines/scumm/insane/insane.cpp
@@ -536,6 +536,7 @@ int32 Insane::processMouse() {
 	_enemyState[EN_BEN][0] = _vm->_mouse.x;
 	_enemyState[EN_BEN][1] = _vm->_mouse.y;
 
+	/* TODO: Is this still needed? */
 	buttons = _vm->VAR(_vm->VAR_LEFTBTN_HOLD) ? 1 : 0;
 	buttons |= _vm->VAR(_vm->VAR_RIGHTBTN_HOLD) ? 2 : 0;
 
@@ -547,16 +548,24 @@ int32 Insane::processKeyboard() {
 	int dx = 0, dy = 0;
 	int tmpx, tmpy;
 
-	if (_vm->getKeyState(0x14f) || _vm->getKeyState(0x14b) || _vm->getKeyState(0x147))
+	if (_vm->getActionState(kScummActionInsaneLeft) ||
+	    _vm->getActionState(kScummActionInsaneUpLeft) ||
+	    _vm->getActionState(kScummActionInsaneDownLeft))
 		dx--;
 
-	if (_vm->getKeyState(0x151) || _vm->getKeyState(0x14d) || _vm->getKeyState(0x149))
+	if (_vm->getActionState(kScummActionInsaneRight) ||
+	    _vm->getActionState(kScummActionInsaneUpRight) ||
+	    _vm->getActionState(kScummActionInsaneDownRight))
 		dx++;
 
-	if (_vm->getKeyState(0x147) || _vm->getKeyState(0x148) || _vm->getKeyState(0x149))
+	if (_vm->getActionState(kScummActionInsaneUp) ||
+	    _vm->getActionState(kScummActionInsaneUpLeft) ||
+	    _vm->getActionState(kScummActionInsaneUpRight))
 		dy--;
 
-	if (_vm->getKeyState(0x14f) || _vm->getKeyState(0x150) || _vm->getKeyState(0x151))
+	if (_vm->getActionState(kScummActionInsaneDown) ||
+	    _vm->getActionState(kScummActionInsaneDownLeft) ||
+	    _vm->getActionState(kScummActionInsaneDownRight))
 		dy++;
 
 	if (dx == _keybOldDx)
@@ -592,10 +601,10 @@ int32 Insane::processKeyboard() {
 		_enemyState[EN_BEN][1] += tmpy;
 	}
 
-	if (_vm->getKeyState(Common::KEYCODE_RETURN))
+	if (_vm->getActionState(kScummActionInsaneAttack))
 		retval |= 1;
 
-	if (_vm->getKeyState(Common::KEYCODE_TAB))
+	if (_vm->getActionState(kScummActionInsaneSwitch))
 		retval |= 2;
 
 	return retval;
diff --git a/engines/scumm/insane/insane_enemy.cpp b/engines/scumm/insane/insane_enemy.cpp
index 358dda7cf00..e5079e64b7c 100644
--- a/engines/scumm/insane/insane_enemy.cpp
+++ b/engines/scumm/insane/insane_enemy.cpp
@@ -230,7 +230,7 @@ int32 Insane::enemy0handler(int32 actor1, int32 actor2, int32 probability) {
 		_actor[actor1].cursorX = -160;
 
 	// Shift+V cheat to win the battle
-	if (_vm->getKeyState('V') && !_beenCheated &&
+	if (_vm->getActionState(kScummActionInsaneCheat) && !_beenCheated &&
 		!_actor[0].lost && !_actor[1].lost) {
 		_beenCheated = 1;
 		_actor[1].damage = _actor[1].maxdamage + 10;
@@ -380,7 +380,7 @@ int32 Insane::enemy1handler(int32 actor1, int32 actor2, int32 probability) {
 		_actor[actor1].cursorX = 0;
 
 	// Shift+V cheat to win the battle
-	if (_vm->getKeyState('V') && !_beenCheated &&
+	if (_vm->getActionState(kScummActionInsaneCheat) && !_beenCheated &&
 		!_actor[0].lost && !_actor[1].lost) {
 		_beenCheated = 1;
 		_actor[1].damage = _actor[1].maxdamage + 10;
@@ -532,7 +532,7 @@ int32 Insane::enemy2handler(int32 actor1, int32 actor2, int32 probability) {
 		_actor[actor1].cursorX = -160;
 
 	// Shift+V cheat to win the battle
-	if (_vm->getKeyState('V') && !_beenCheated &&
+	if (_vm->getActionState(kScummActionInsaneCheat) && !_beenCheated &&
 		!_actor[0].lost && !_actor[1].lost) {
 		_beenCheated = 1;
 		_actor[1].damage = _actor[1].maxdamage + 10;
@@ -693,7 +693,7 @@ int32 Insane::enemy3handler(int32 actor1, int32 actor2, int32 probability) {
 		_actor[actor1].cursorX = -160;
 
 	// Shift+V cheat to win the battle
-	if (_vm->getKeyState('V') && !_beenCheated &&
+	if (_vm->getActionState(kScummActionInsaneCheat) && !_beenCheated &&
 		!_actor[0].lost && !_actor[1].lost) {
 		_beenCheated = 1;
 		_actor[1].damage = _actor[1].maxdamage + 10;
@@ -872,7 +872,7 @@ int32 Insane::enemy4handler(int32 actor1, int32 actor2, int32 probability) {
 		_actor[actor1].cursorX = -160;
 
 	// Shift+V cheat to win the battle
-	if (_vm->getKeyState('V') && !_beenCheated &&
+	if (_vm->getActionState(kScummActionInsaneCheat) && !_beenCheated &&
 		!_actor[0].lost && !_actor[1].lost) {
 		_beenCheated = 1;
 		_actor[1].damage = _actor[1].maxdamage + 10;
@@ -1015,7 +1015,7 @@ int32 Insane::enemy5handler(int32 actor1, int32 actor2, int32 probability) {
 	_enHdlVar[EN_VULTF2][0]++;
 
 	// Shift+V cheat to win the battle
-	if (_vm->getKeyState('V') && !_beenCheated &&
+	if (_vm->getActionState(kScummActionInsaneCheat) && !_beenCheated &&
 		!_actor[0].lost && !_actor[1].lost) {
 		_beenCheated = 1;
 		_actor[1].damage = _actor[1].maxdamage + 10;
@@ -1148,7 +1148,7 @@ int32 Insane::enemy6handler(int32 actor1, int32 actor2, int32 probability) {
 	_enHdlVar[EN_VULTM2][0]++;
 
 	// Shift+V cheat to win the battle
-	if (_vm->getKeyState('V') && !_beenCheated &&
+	if (_vm->getActionState(kScummActionInsaneCheat) && !_beenCheated &&
 		!_actor[0].lost && !_actor[1].lost) {
 		_beenCheated = 1;
 		_actor[0].act[2].state = 97;
@@ -1235,7 +1235,7 @@ int32 Insane::enemy7handler(int32 actor1, int32 actor2, int32 probability) {
 	_enHdlVar[EN_CAVEFISH][0] = act1damage;
 
 	// Shift+V cheat to win the battle
-	if (_vm->getKeyState('V') && !_beenCheated &&
+	if (_vm->getActionState(kScummActionInsaneCheat) && !_beenCheated &&
 		!_actor[0].lost && !_actor[1].lost) {
 		_beenCheated = 1;
 		_actor[1].damage = _actor[1].maxdamage + 10;
diff --git a/engines/scumm/insane/insane_scenes.cpp b/engines/scumm/insane/insane_scenes.cpp
index cbe7812e88e..d438004b004 100644
--- a/engines/scumm/insane/insane_scenes.cpp
+++ b/engines/scumm/insane/insane_scenes.cpp
@@ -23,6 +23,9 @@
 
 #include "engines/engine.h"
 
+#include "backends/keymapper/keymap.h"
+#include "backends/keymapper/keymapper.h"
+
 #include "common/config-manager.h"
 
 #include "scumm/scumm_v7.h"
@@ -49,6 +52,7 @@ void Insane::runScene(int arraynum) {
 	_currScenePropSubIdx = 0;
 	_currTrsMsg = 0;
 
+	_vm->_insaneKeymap->setEnabled(true);
 	smush_warpMouse(160, 100, -1);
 	putActors();
 	readState();
@@ -140,6 +144,7 @@ void Insane::runScene(int arraynum) {
 		error("Unknown FT_INSANE mode %d", readArray(0));
 	}
 
+	_vm->_insaneKeymap->setEnabled(false);
 	_player->resetAudioTracks();
 	putActors();
 	_enemy[EN_ROTT3].maxdamage = 120;
diff --git a/engines/scumm/metaengine.cpp b/engines/scumm/metaengine.cpp
index dbb327708ca..b445b912a2f 100644
--- a/engines/scumm/metaengine.cpp
+++ b/engines/scumm/metaengine.cpp
@@ -29,6 +29,10 @@
 
 #include "audio/mididrv.h"
 
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymap.h"
+#include "backends/keymapper/standard-actions.h"
+
 #include "scumm/he/intern_he.h"
 #include "scumm/scumm_v0.h"
 #include "scumm/scumm_v8.h"
@@ -731,6 +735,100 @@ const ExtraGuiOptions ScummMetaEngine::getExtraGuiOptions(const Common::String &
 	return options;
 }
 
+Common::KeymapArray ScummMetaEngine::initKeymaps(const char *target) const {
+	using namespace Common;
+	using namespace Scumm;
+
+	Common::KeymapArray keymaps = MetaEngine::initKeymaps(target);
+	Common::String gameId = ConfMan.get("gameid", target);
+	Action *act;
+
+	if (gameId == "ft") {
+		Keymap *insaneKeymap = new Keymap(Keymap::kKeymapTypeGame, insaneKeymapId, "SCUMM - Bike Fights");
+
+		act = new Action("DOWNLEFT", _("Down Left"));
+		act->setCustomEngineActionEvent(kScummActionInsaneDownLeft);
+		act->addDefaultInputMapping("KP1");
+		act->addDefaultInputMapping("END");
+		insaneKeymap->addAction(act);
+
+		act = new Action(kStandardActionMoveDown, _("Down"));
+		act->setCustomEngineActionEvent(kScummActionInsaneDown);
+		act->addDefaultInputMapping("DOWN");
+		act->addDefaultInputMapping("KP2");
+		act->addDefaultInputMapping("JOY_DOWN");
+		insaneKeymap->addAction(act);
+
+		act = new Action("DOWNRIGHT", _("Down Right"));
+		act->setCustomEngineActionEvent(kScummActionInsaneDownRight);
+		act->addDefaultInputMapping("KP3");
+		act->addDefaultInputMapping("PAGEDOWN");
+		insaneKeymap->addAction(act);
+
+		act = new Action(kStandardActionMoveLeft, _("Left"));
+		act->setCustomEngineActionEvent(kScummActionInsaneLeft);
+		act->addDefaultInputMapping("LEFT");
+		act->addDefaultInputMapping("KP4");
+		act->addDefaultInputMapping("JOY_LEFT");
+		insaneKeymap->addAction(act);
+
+		act = new Action(kStandardActionMoveRight, _("Right"));
+		act->setCustomEngineActionEvent(kScummActionInsaneRight);
+		act->addDefaultInputMapping("RIGHT");
+		act->addDefaultInputMapping("KP6");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		insaneKeymap->addAction(act);
+
+		act = new Action("UPLEFT", _("Up Left"));
+		act->setCustomEngineActionEvent(kScummActionInsaneUpLeft);
+		act->addDefaultInputMapping("KP7");
+		act->addDefaultInputMapping("INSERT");
+		insaneKeymap->addAction(act);
+
+		act = new Action(kStandardActionMoveUp, _("Up"));
+		act->setCustomEngineActionEvent(kScummActionInsaneUp);
+		act->addDefaultInputMapping("UP");
+		act->addDefaultInputMapping("KP8");
+		act->addDefaultInputMapping("JOY_UP");
+		insaneKeymap->addAction(act);
+
+		act = new Action("UPRIGHT", _("Up Right"));
+		act->setCustomEngineActionEvent(kScummActionInsaneUpRight);
+		act->addDefaultInputMapping("KP9");
+		act->addDefaultInputMapping("PAGEUP");
+		insaneKeymap->addAction(act);
+
+		act = new Action("ATTACK", _("Attack"));
+		act->setCustomEngineActionEvent(kScummActionInsaneAttack);
+		act->addDefaultInputMapping("RETURN");
+		act->addDefaultInputMapping("JOY_A");
+		insaneKeymap->addAction(act);
+
+		act = new Action("SWITCH", _("Switch weapon"));
+		act->setCustomEngineActionEvent(kScummActionInsaneSwitch);
+		act->addDefaultInputMapping("TAB");
+		act->addDefaultInputMapping("JOY_B");
+		insaneKeymap->addAction(act);
+
+		// TODO: Use a custom engine action here?
+		act = new Action(kStandardActionSkip, _("Skip cutscene"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_Y");
+		insaneKeymap->addAction(act);
+
+		// I18N: Lets one skip the bike/car fight sequences in Full Throttle
+		act = new Action("CHEAT", _("Win the bike fight cheat"));
+		act->setCustomEngineActionEvent(kScummActionInsaneCheat);
+		act->addDefaultInputMapping("S+v");
+		insaneKeymap->addAction(act);
+
+		keymaps.push_back(insaneKeymap);
+	}
+
+	return keymaps;
+}
+
 #if PLUGIN_ENABLED_DYNAMIC(SCUMM)
 	REGISTER_PLUGIN_DYNAMIC(SCUMM, PLUGIN_TYPE_ENGINE, ScummMetaEngine);
 #else
diff --git a/engines/scumm/metaengine.h b/engines/scumm/metaengine.h
index dd9ef7a482f..3df81be41be 100644
--- a/engines/scumm/metaengine.h
+++ b/engines/scumm/metaengine.h
@@ -38,6 +38,8 @@ class ScummMetaEngine : public MetaEngine {
 
 	const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const override;
 	GUI::OptionsContainerWidget *buildEngineOptionsWidget(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const override;
+
+	Common::KeymapArray initKeymaps(const char *target) const override;
 };
 
 #endif // SCUMM_METAENGINE_H
diff --git a/engines/scumm/script_v6.cpp b/engines/scumm/script_v6.cpp
index 595036136b9..02ecbe52a48 100644
--- a/engines/scumm/script_v6.cpp
+++ b/engines/scumm/script_v6.cpp
@@ -2953,6 +2953,10 @@ int ScummEngine::getKeyState(int key) {
 	}
 }
 
+int ScummEngine::getActionState(ScummAction action) {
+	return (_actionMap[action]) ? 1 : 0;
+}
+
 void ScummEngine_v6::o6_delayFrames() {
 	// WORKAROUND:  At startup, Moonbase Commander will pause for 20 frames before
 	// showing the Infogrames logo.  The purpose of this break is to give time for the
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index e13c4709323..37263c93435 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -27,6 +27,9 @@
 #include "common/system.h"
 #include "common/translation.h"
 
+#include "backends/keymapper/keymap.h"
+#include "backends/keymapper/keymapper.h"
+
 #include "engines/util.h"
 
 #include "gui/message.h"
@@ -102,6 +105,9 @@ struct dbgChannelDesc {
 };
 
 
+const char *const insaneKeymapId = "scumm-insane";
+
+
 ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
 	: Engine(syst),
 	  _game(dr.game),
@@ -1230,6 +1236,11 @@ Common::Error ScummEngine::init() {
 	// Create the debugger now that _numVariables has been set
 	setDebugger(new ScummDebugger(this));
 
+	Common::Keymapper *keymapper = _system->getEventManager()->getKeymapper();
+	_insaneKeymap = keymapper->getKeymap(insaneKeymapId);
+	if (_insaneKeymap)
+		_insaneKeymap->setEnabled(false);
+
 	resetScumm();
 	resetScummVars();
 
@@ -1753,6 +1764,8 @@ void ScummEngine::resetScumm() {
 	// all keys are released
 	for (i = 0; i < 512; i++)
 		_keyDownMap[i] = false;
+	for (i = 0; i < kScummActionCount; i++)
+		_actionMap[i] = false;
 
 	_lastSaveTime = _system->getMillis();
 }
diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index 99c59d62781..7e5d79a9b9d 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -490,6 +490,25 @@ struct InternalGUIControl {
 	bool doubleLinesFlag;
 };
 
+enum ScummAction {
+	kScummActionNone,
+	kScummActionInsaneDownLeft,
+	kScummActionInsaneDown,
+	kScummActionInsaneDownRight,
+	kScummActionInsaneLeft,
+	kScummActionInsaneRight,
+	kScummActionInsaneUpLeft,
+	kScummActionInsaneUp,
+	kScummActionInsaneUpRight,
+	kScummActionInsaneAttack,
+	kScummActionInsaneSwitch,
+	kScummActionInsaneCheat,
+
+	kScummActionCount
+};
+
+extern const char *const insaneKeymapId;
+
 /**
  * Base class for all SCUMM engines.
  */
@@ -529,6 +548,8 @@ public:
 	bool _useOriginalGUI = true;
 	bool _enableAudioOverride = false;
 
+	Common::Keymap *_insaneKeymap;
+
 protected:
 	VirtualMachineState vm;
 
@@ -845,6 +866,7 @@ public:
 protected:
 	Common::KeyState _keyPressed;
 	bool _keyDownMap[512]; // FIXME - 512 is a guess. it's max(kbd.ascii)
+	bool _actionMap[kScummActionCount];
 
 	Common::Point _mouse;
 	Common::Point _virtualMouse;
@@ -897,6 +919,7 @@ protected:
 	}
 
 	int getKeyState(int key);
+	int getActionState(ScummAction action);
 
 public:
 	static Common::String makeSavegameName(const Common::String &target, int slot, bool temporary);




More information about the Scummvm-git-logs mailing list