[Scummvm-git-logs] scummvm master -> 045543e10c3f5211d324d706798be91d649fa671
mduggan
noreply at scummvm.org
Mon Dec 18 06:34:52 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:
045543e10c ULTIMA: NUVIE: Fix alt-code cheats
Commit: 045543e10c3f5211d324d706798be91d649fa671
https://github.com/scummvm/scummvm/commit/045543e10c3f5211d324d706798be91d649fa671
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2023-12-18T17:34:49+11:00
Commit Message:
ULTIMA: NUVIE: Fix alt-code cheats
Alt-codes were no longer working with the default keymap
since commit 12a47d956ee00f62ed235c4009eb57ad0dbda19d
"Add support for ScummVM keymapper"
Codes were handled via hardcoded EVENT_KEYDOWN events, which are now
eaten by the keymapper (at least when using default keybinds).
Remove current alt-code handling and use the keymapper instead.
The code is now evaluated when the alt-code-mode key is released to
match original behavior.
Also always store alt-code as an int to avoid unnecessary
string conversion.
Changed paths:
engines/ultima/nuvie/core/events.cpp
engines/ultima/nuvie/core/events.h
engines/ultima/nuvie/keybinding/key_actions.cpp
engines/ultima/nuvie/keybinding/key_actions.h
engines/ultima/nuvie/keybinding/keys.cpp
engines/ultima/nuvie/keybinding/keys.h
engines/ultima/nuvie/metaengine.cpp
diff --git a/engines/ultima/nuvie/core/events.cpp b/engines/ultima/nuvie/core/events.cpp
index d5e748913c5..b7b57086f68 100644
--- a/engines/ultima/nuvie/core/events.cpp
+++ b/engines/ultima/nuvie/core/events.cpp
@@ -238,74 +238,6 @@ bool Events::handleSDL_KEYDOWN(const Common::Event *event_) {
return true;
}
- byte mods = event_->kbd.flags;
- // alt-code input
- if (mods & Common::KBD_ALT) {
- if (mode == MOVE_MODE)
- switch (event_->kbd.keycode) {
- case Common::KEYCODE_KP0:
- case Common::KEYCODE_0:
- alt_code_str[alt_code_len++] = '0';
- break;
-
- case Common::KEYCODE_KP1:
- case Common::KEYCODE_1:
- alt_code_str[alt_code_len++] = '1';
- break;
-
- case Common::KEYCODE_KP2:
- case Common::KEYCODE_2:
- alt_code_str[alt_code_len++] = '2';
- break;
-
- case Common::KEYCODE_KP3:
- case Common::KEYCODE_3:
- alt_code_str[alt_code_len++] = '3';
- break;
-
- case Common::KEYCODE_KP4:
- case Common::KEYCODE_4:
- alt_code_str[alt_code_len++] = '4';
- break;
-
- case Common::KEYCODE_KP5:
- case Common::KEYCODE_5:
- alt_code_str[alt_code_len++] = '5';
- break;
-
- case Common::KEYCODE_KP6:
- case Common::KEYCODE_6:
- alt_code_str[alt_code_len++] = '6';
- break;
-
- case Common::KEYCODE_KP7:
- case Common::KEYCODE_7:
- alt_code_str[alt_code_len++] = '7';
- break;
-
- case Common::KEYCODE_KP8:
- case Common::KEYCODE_8:
- alt_code_str[alt_code_len++] = '8';
- break;
-
- case Common::KEYCODE_KP9:
- case Common::KEYCODE_9:
- alt_code_str[alt_code_len++] = '9';
- break;
- default:
- keybinder->HandleEvent(event_);
- return true;
- }
- if (alt_code_len != 0) {
- alt_code_str[alt_code_len] = '\0';
- if (alt_code_len == 3) {
- alt_code(alt_code_str);
- clear_alt_code();
- }
- }
- return true;
- }
-
keybinder->HandleEvent(event_);
return true;
@@ -347,9 +279,6 @@ bool Events::handleEvent(const Common::Event *event_) {
case Common::EVENT_MOUSEMOVE:
break;
case Common::EVENT_KEYUP:
- if (event_->kbd.flags & Common::KBD_ALT) {
- clear_alt_code();
- }
break;
case Common::EVENT_KEYDOWN:
@@ -360,10 +289,10 @@ bool Events::handleEvent(const Common::Event *event_) {
return false;
case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+ case Common::EVENT_CUSTOM_ENGINE_ACTION_END:
keybinder->handleScummVMBoundEvent(event_);
break;
- case Common::EVENT_CUSTOM_ENGINE_ACTION_END:
default:
break;
}
@@ -1669,10 +1598,9 @@ void Events::alt_code_input(const char *in) {
}
}
-/* Get an alt-code from `cs' and use it.
+/* Use alt-code in `c'.
*/
-void Events::alt_code(const char *cs) {
- uint16 c = (uint16) strtol(cs, nullptr, 10);
+void Events::alt_code(int c) {
switch (c) {
case 300: // display portrait by number
scroll->display_string("Portrait? ");
@@ -3828,6 +3756,18 @@ bool Events::input_really_needs_directon() const {
return false;
}
+void Events::toggleAltCodeMode(bool enable) {
+ if (!enable && altCodeVal != 0)
+ alt_code(altCodeVal); // leaving alt-code mode: evaluate it
+ // a code was either just handled or we newly entered alt-code mode: reset it
+ clear_alt_code();
+}
+
+void Events::appendAltCode(int code) {
+ altCodeVal *= 10;
+ altCodeVal += code;
+}
+
bool shouldQuit() {
return g_engine->shouldQuit();
}
diff --git a/engines/ultima/nuvie/core/events.h b/engines/ultima/nuvie/core/events.h
index 94c94ac0a8d..0267cdb23e3 100644
--- a/engines/ultima/nuvie/core/events.h
+++ b/engines/ultima/nuvie/core/events.h
@@ -204,8 +204,7 @@ private:
EventInput input; // collected/received input (of any type)
// Std::vector<EventMode> mode_stack; // current mode is at the end of the list
int ts; //timestamp for TimeLeft() method.
- char alt_code_str[4]; // string representation of alt-code input
- uint8 alt_code_len; // how many characters have been input for alt-code
+ int altCodeVal;
uint16 active_alt_code; // alt-code that needs more input
uint8 alt_code_input_num; // alt-code can get multiple inputs
@@ -401,12 +400,13 @@ public:
void walk_to_mouse_cursor(uint32 mx, uint32 my);
void multiuse(uint16 wx, uint16 wy);
- void alt_code(const char *cs);
+ void alt_code(int c);
void alt_code_input(const char *in);
- void clear_alt_code() {
- alt_code_str[0] = '\0';
- alt_code_len = 0;
- }
+ void clear_alt_code() { altCodeVal = 0; }
+
+ void toggleAltCodeMode(bool enable);
+ void appendAltCode(int code);
+
bool alt_code_teleport(const char *location_string);
void alt_code_infostring();
void alt_code_teleport_menu(uint32 selection);
diff --git a/engines/ultima/nuvie/keybinding/key_actions.cpp b/engines/ultima/nuvie/keybinding/key_actions.cpp
index b4ffa43d92c..82f817805fd 100644
--- a/engines/ultima/nuvie/keybinding/key_actions.cpp
+++ b/engines/ultima/nuvie/keybinding/key_actions.cpp
@@ -449,6 +449,17 @@ void ActionCloseGumps(int param) {
EVENT->close_gumps();
}
+void ActionToggleAltCodeMode (int param) {
+ if (EVENT->get_mode() == MOVE_MODE) {
+ EVENT->toggleAltCodeMode(param == kAltCodeModeBegin ? true : false);
+ }
+}
+
+void ActionAppendAltCode(int param) {
+ if (EVENT->get_mode() == MOVE_MODE)
+ EVENT->appendAltCode(param);
+}
+
void ActionUseItem(int param) {
if (EVENT->get_mode() != MOVE_MODE && EVENT->get_mode() != EQUIP_MODE)
return;
diff --git a/engines/ultima/nuvie/keybinding/key_actions.h b/engines/ultima/nuvie/keybinding/key_actions.h
index b6e13f38e3d..aaaa7edaca0 100644
--- a/engines/ultima/nuvie/keybinding/key_actions.h
+++ b/engines/ultima/nuvie/keybinding/key_actions.h
@@ -87,6 +87,8 @@ void ActionShowKeys(int param);
void ActionDecreaseDebug(int param);
void ActionIncreaseDebug(int param);
void ActionCloseGumps(int param);
+void ActionToggleAltCodeMode(int param);
+void ActionAppendAltCode(int param);
void ActionUseItem(int param);
void ActionAssetViewer(int param);
diff --git a/engines/ultima/nuvie/keybinding/keys.cpp b/engines/ultima/nuvie/keybinding/keys.cpp
index 000bf3cac5a..500ee2621f8 100644
--- a/engines/ultima/nuvie/keybinding/keys.cpp
+++ b/engines/ultima/nuvie/keybinding/keys.cpp
@@ -64,6 +64,10 @@ struct Action {
ActionKeyType keyType;
};
+const char *appendAltCodeActionStr = "ALT_CODE";
+const char *toggleAltCodeModeActionStr = "TOGGLE_ALT_CODE_MODE";
+const uint toggleAltCodeModeEventID = Common::hashit(toggleAltCodeModeActionStr); // to identify END (KEYUP) events for alt-code mode toggle action
+
const Action NuvieActions[] = {
{ "WALK_WEST", ActionWalkWest, Action::KeyNormal, true, WEST_KEY },
{ "WALK_EAST", ActionWalkEast, Action::KeyNormal, true, EAST_KEY },
@@ -134,6 +138,8 @@ const Action NuvieActions[] = {
{ "HEAL_PARTY", ActionHealParty, Action::KeyCheat, true, OTHER_KEY },
{ "TELEPORT_TO_CURSOR", ActionTeleportToCursor, Action::KeyCheat, true, OTHER_KEY },
{ "TOGGLE_CHEATS", ActionToggleCheats, Action::KeyNormal, true, OTHER_KEY },
+ { toggleAltCodeModeActionStr, ActionToggleAltCodeMode, Action::KeyNormal, true, OTHER_KEY },
+ { appendAltCodeActionStr, ActionAppendAltCode, Action::KeyNormal, true, OTHER_KEY },
{ "DO_NOTHING", ActionDoNothing, Action::KeyNotShown, true, OTHER_KEY },
};
@@ -402,10 +408,17 @@ bool KeyBinder::HandleEvent(const Common::Event *ev) {
}
bool KeyBinder::handleScummVMBoundEvent(const Common::Event *ev) {
- ParseHashedActionMap::iterator iter = _actionsHashed.find(ev->customType);
- if (iter != _actionsHashed.end()) {
- const ActionType action = iter->_value;
- return DoAction(action);
+
+ if (ev->type == Common::EVENT_CUSTOM_ENGINE_ACTION_START) {
+ ParseHashedActionMap::iterator iter = _actionsHashed.find(ev->customType);
+ if (iter != _actionsHashed.end()) {
+ const ActionType action = iter->_value;
+ return DoAction(action);
+ }
+ } else if (ev->type == Common::EVENT_CUSTOM_ENGINE_ACTION_END && ev->customType == toggleAltCodeModeEventID) {
+ // Evaluate and reset alt code when corresponding key is released
+ ActionToggleAltCodeMode(kAltCodeModeEnd);
+ return true;
}
return false;
}
@@ -692,6 +705,17 @@ void KeyBinder::FillParseMaps() {
_actionsHashed[actionId.hash()] = at;
}
}
+
+ if (!_actions.contains(appendAltCodeActionStr))
+ error("No base definition for alt-code action %s", appendAltCodeActionStr);
+ for (int i = 0; i <= 9; ++i) {
+ Common::String actionId = Common::String::format("%s_%d", appendAltCodeActionStr, i);
+ const Action *action = _actions[appendAltCodeActionStr];
+ ActionType at;
+ at.action = action;
+ at.param = i;
+ _actionsHashed[actionId.hash()] = at;
+ }
}
uint8 KeyBinder::get_axis(uint8 index) const {
diff --git a/engines/ultima/nuvie/keybinding/keys.h b/engines/ultima/nuvie/keybinding/keys.h
index bead46e9d00..f2160606310 100644
--- a/engines/ultima/nuvie/keybinding/keys.h
+++ b/engines/ultima/nuvie/keybinding/keys.h
@@ -36,6 +36,11 @@ enum joy_axes_pairs {
AXES_PAIR1, AXES_PAIR2, AXES_PAIR3, AXES_PAIR4, UNHANDLED_AXES_PAIR
};
+enum altCodeMode {
+ kAltCodeModeBegin = 0,
+ kAltCodeModeEnd = 1
+};
+
struct Action;
struct ActionType {
const Action *action;
diff --git a/engines/ultima/nuvie/metaengine.cpp b/engines/ultima/nuvie/metaengine.cpp
index 90cbba9f158..7f8e2532837 100644
--- a/engines/ultima/nuvie/metaengine.cpp
+++ b/engines/ultima/nuvie/metaengine.cpp
@@ -107,6 +107,17 @@ static const NuvieActionDescription NuvieActionDescriptions[] = {
{ "INCREASE_DEBUG", "Increase debug", "C+i", nullptr },
{ "CLOSE_GUMPS", "Close gumps", "z", nullptr },
//{ "USE_ITEM", "Use item", nullptr, nullptr }, // TODO: this takes an item no parameter
+ { "TOGGLE_ALT_CODE_MODE", "Enter ALT code (hold)", "LALT", nullptr },
+ { "ALT_CODE_0", "ALT Code 0", "A+KP0", "A+0" },
+ { "ALT_CODE_1", "ALT Code 1", "A+KP1", "A+1" },
+ { "ALT_CODE_2", "ALT Code 2", "A+KP2", "A+2" },
+ { "ALT_CODE_3", "ALT Code 3", "A+KP3", "A+3" },
+ { "ALT_CODE_4", "ALT Code 4", "A+KP4", "A+4" },
+ { "ALT_CODE_5", "ALT Code 5", "A+KP5", "A+5" },
+ { "ALT_CODE_6", "ALT Code 6", "A+KP6", "A+6" },
+ { "ALT_CODE_7", "ALT Code 7", "A+KP7", "A+7" },
+ { "ALT_CODE_8", "ALT Code 8", "A+KP8", "A+8" },
+ { "ALT_CODE_9", "ALT Code 9", "A+KP9", "A+9" },
};
static const NuvieActionDescription CheatKeyDescriptions[] = {
More information about the Scummvm-git-logs
mailing list