[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