[Scummvm-git-logs] scummvm master -> d5b62b7dddf33594a3d37d4f10f0589a15f5ff94
mduggan
mgithub at guarana.org
Fri Apr 24 09:04:25 UTC 2020
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:
d5b62b7ddd ULTIMA8: New feature - space to jump
Commit: d5b62b7dddf33594a3d37d4f10f0589a15f5ff94
https://github.com/scummvm/scummvm/commit/d5b62b7dddf33594a3d37d4f10f0589a15f5ff94
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-24T18:03:57+09:00
Commit Message:
ULTIMA8: New feature - space to jump
This is super helpful on platforms where a "both button click" is hard or
impossible.
Changed paths:
engines/ultima/ultima8/kernel/mouse.cpp
engines/ultima/ultima8/kernel/mouse.h
engines/ultima/ultima8/meta_engine.cpp
engines/ultima/ultima8/meta_engine.h
engines/ultima/ultima8/misc/debugger.cpp
engines/ultima/ultima8/misc/debugger.h
engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
engines/ultima/ultima8/world/actors/avatar_mover_process.h
diff --git a/engines/ultima/ultima8/kernel/mouse.cpp b/engines/ultima/ultima8/kernel/mouse.cpp
index e54da775ed..d5a8669dba 100644
--- a/engines/ultima/ultima8/kernel/mouse.cpp
+++ b/engines/ultima/ultima8/kernel/mouse.cpp
@@ -78,7 +78,7 @@ bool Mouse::buttonDown(Shared::MouseButton button) {
mbutton.setState(MBS_DOWN);
mbutton.clearState(MBS_HANDLED);
- if (_mouseButton[button].isDoubleClick()) {
+ if (mbutton.isUnhandledDoubleClick()) {
if (_dragging == Mouse::DRAG_NOT) {
Gump *gump = getGump(mbutton._downGump);
if (gump) {
diff --git a/engines/ultima/ultima8/kernel/mouse.h b/engines/ultima/ultima8/kernel/mouse.h
index f32a9fe65b..bab21f4716 100644
--- a/engines/ultima/ultima8/kernel/mouse.h
+++ b/engines/ultima/ultima8/kernel/mouse.h
@@ -60,7 +60,7 @@ struct MButton {
void clearState(MouseButtonState state) {
_state &= ~state;
}
-
+
bool curWithinDblClkTimeout() {
uint32 now = g_system->getMillis();
return now - _curDown <= DOUBLE_CLICK_TIMEOUT;
@@ -71,8 +71,9 @@ struct MButton {
return now - _lastDown <= DOUBLE_CLICK_TIMEOUT;
}
- bool isDoubleClick() {
- return isState(MBS_DOWN) &&
+ //! A convenience function - true if the current state is down, unhandled, and within the double click timeout.
+ bool isUnhandledDoubleClick() {
+ return isState(MBS_DOWN) && !isState(MBS_HANDLED) &&
(_curDown - _lastDown) <= DOUBLE_CLICK_TIMEOUT;
}
diff --git a/engines/ultima/ultima8/meta_engine.cpp b/engines/ultima/ultima8/meta_engine.cpp
index 8d1af6dbb4..059168942c 100644
--- a/engines/ultima/ultima8/meta_engine.cpp
+++ b/engines/ultima/ultima8/meta_engine.cpp
@@ -55,6 +55,7 @@ static const KeybindingRecord KEYS[] = {
{ ACTION_HIGHLIGHT_ITEMS, "HIGHLIGHT_ITEMS", "Show Highlight Items", "GameMapGump::toggleHighlightItems",
"GameMapGump::toggleHighlightItems", "TAB", nullptr },
{ ACTION_TOGGLE_TOUCHING, "TOUCHING", "Show Touching Items", "GUIApp::toggleShowTouchingItems", nullptr, "h", nullptr },
+ { ACTION_JUMP, "JUMP", "Jump (fake both-button-click)", "AvatarMoverProcess::setFakeBothButtonClick", nullptr, "SPACE", nullptr },
{ ACTION_NONE, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }
};
@@ -79,7 +80,7 @@ static const KeybindingRecord DEBUG_KEYS[] = {
{ ACTION_TOGGLE_PAINT, "TOGGLE_PAINT", "Toggle Paint Editor Items", "GUIApp::togglePaintEditorItems", nullptr, "e", nullptr },
{ ACTION_ENGINE_STATS, "STATS", "List engine stats", "GUIApp::engineStats", nullptr, "t", nullptr },
{ ACTION_FRAME_BY_FRAME, "FRAME_BY_FRAME", "Toggle Frame By Frame", "Kernel::toggleFrameByFrame", nullptr, "F12", nullptr },
- { ACTION_ADVANCE_FRAME, "ADVANCE_FRAME", "Advance Frame", "Kernel::advanceFrame", nullptr, "SPACE", nullptr },
+ { ACTION_ADVANCE_FRAME, "ADVANCE_FRAME", "Advance Frame", "Kernel::advanceFrame", nullptr, "f", nullptr },
{ ACTION_TOGGLE_STASIS, "TOGGLE_STASIS", "Toggle Avatar In Stasis", "GUIApp::toggleAvatarInStasis", nullptr, "F10", nullptr },
{ ACTION_SHAPE_VIEWER, "SHAPE_VIEWER", "Show Shape Viewer", "ShapeViewerGump::U8ShapeViewer", nullptr, "F11", nullptr },
diff --git a/engines/ultima/ultima8/meta_engine.h b/engines/ultima/ultima8/meta_engine.h
index abf33bfeb6..d3e6077d60 100644
--- a/engines/ultima/ultima8/meta_engine.h
+++ b/engines/ultima/ultima8/meta_engine.h
@@ -31,7 +31,7 @@ namespace Ultima8 {
enum KeybindingAction {
ACTION_QUICKSAVE, ACTION_SAVE, ACTION_LOAD, ACTION_BEDROLL, ACTION_COMBAT, ACTION_BACKPACK,
ACTION_KEYRING, ACTION_MINIMAP, ACTION_RECALL, ACTION_INVENTORY, ACTION_MENU,
- ACTION_CLOSE_GUMPS, ACTION_HIGHLIGHT_ITEMS, ACTION_TOGGLE_TOUCHING,
+ ACTION_CLOSE_GUMPS, ACTION_HIGHLIGHT_ITEMS, ACTION_TOGGLE_TOUCHING, ACTION_JUMP,
ACTION_CHEAT_MODE, ACTION_CLIPPING, ACTION_DEC_SORT_ORDER, ACTION_INC_SORT_ORDER, ACTION_ASCEND,
ACTION_DESCEND, ACTION_MOVE_UP, ACTION_MOVE_DOWN, ACTION_MOVE_LEFT, ACTION_RIGHT,
diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index df0d35c828..a891d164b3 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -47,6 +47,7 @@
#include "ultima/ultima8/world/get_object.h"
#include "ultima/ultima8/world/item_factory.h"
#include "ultima/ultima8/world/actors/quick_avatar_mover_process.h"
+#include "ultima/ultima8/world/actors/avatar_mover_process.h"
#include "ultima/ultima8/world/actors/main_actor.h"
#include "ultima/ultima8/world/actors/pathfinder.h"
@@ -82,6 +83,7 @@ Debugger::Debugger() : Shared::Debugger() {
registerCmd("Ultima8Engine::togglePaintEditorItems", WRAP_METHOD(Debugger, cmdTogglePaintEditorItems));
registerCmd("Ultima8Engine::toggleShowTouchingItems", WRAP_METHOD(Debugger, cmdToggleShowTouchingItems));
registerCmd("Ultima8Engine::closeItemGumps", WRAP_METHOD(Debugger, cmdCloseItemGumps));
+ registerCmd("AvatarMoverProcess::setFakeBothButtonClick", WRAP_METHOD(Debugger, cmdBothButtonClick));
registerCmd("AudioProcess::listSFX", WRAP_METHOD(Debugger, cmdListSFX));
registerCmd("AudioProcess::playSFX", WRAP_METHOD(Debugger, cmdPlaySFX));
@@ -1098,6 +1100,19 @@ bool Debugger::cmdUseKeyring(int argc, const char **argv) {
return false;
}
+bool Debugger::cmdBothButtonClick(int argc, const char **argv) {
+ if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ debugPrintf("Can't: avatarInStasis\n");
+ return true;
+ }
+ AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+
+ if (proc) {
+ proc->setFakeBothButtonClick();
+ }
+ return false;
+}
+
bool Debugger::cmdToggleCombat(int argc, const char **argv) {
if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
debugPrintf("Can't: avatarInStasis\n");
diff --git a/engines/ultima/ultima8/misc/debugger.h b/engines/ultima/ultima8/misc/debugger.h
index 78fc5997e6..90b5e902be 100644
--- a/engines/ultima/ultima8/misc/debugger.h
+++ b/engines/ultima/ultima8/misc/debugger.h
@@ -149,6 +149,7 @@ private:
bool cmdToggleShowTouchingItems(int argc, const char **argv);
bool cmdCloseItemGumps(int argc, const char **argv);
bool cmdMemberVar(int argc, const char **argv);
+ bool cmdBothButtonClick(int argc, const char **argv);
// Audio Process
bool cmdListSFX(int argc, const char **argv);
diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
index 7c029e95af..842eb0e6a0 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
@@ -43,7 +43,7 @@ DEFINE_RUNTIME_CLASSTYPE_CODE(AvatarMoverProcess, Process)
AvatarMoverProcess::AvatarMoverProcess() : Process(),
_lastFrame(0), _lastAttack(0), _idleTime(0),
- _lastHeadShakeAnim(Animation::lookLeft) {
+ _lastHeadShakeAnim(Animation::lookLeft), _fakeBothButtonClick(false) {
_type = 1; // CONSTANT! (type 1 = persistent)
}
@@ -195,7 +195,7 @@ void AvatarMoverProcess::handleCombatMode() {
return;
}
- if (!_mouseButton[0].isState(MBS_HANDLED) && _mouseButton[0].isDoubleClick()) {
+ if (_mouseButton[0].isUnhandledDoubleClick()) {
_mouseButton[0].setState(MBS_HANDLED);
_mouseButton[0]._lastDown = 0;
@@ -217,7 +217,7 @@ void AvatarMoverProcess::handleCombatMode() {
return;
}
- if (!_mouseButton[1].isState(MBS_HANDLED) && _mouseButton[0].isDoubleClick()) {
+ if (_mouseButton[1].isUnhandledDoubleClick()) {
_mouseButton[1].setState(MBS_HANDLED);
_mouseButton[1]._lastDown = 0;
@@ -266,8 +266,9 @@ void AvatarMoverProcess::handleCombatMode() {
} else if (ABS(direction - mousedir) == 4) {
nextanim = Animation::retreat;
nextdir = direction;
- } else
+ } else {
nextanim = Animation::advance;
+ }
if (mouselength == 2) {
// Take a step before running
@@ -302,7 +303,6 @@ void AvatarMoverProcess::handleNormalMode() {
MainActor *avatar = getMainActor();
Animation::Sequence lastanim = avatar->getLastAnim();
int32 direction = avatar->getDir();
- uint32 now = g_system->getMillis();
bool stasis = guiapp->isAvatarInStasis();
bool combatRun = avatar->hasActorFlags(Actor::ACT_COMBATRUN);
@@ -399,9 +399,10 @@ void AvatarMoverProcess::handleNormalMode() {
if (stasis)
return;
- // both mouse buttons down
- if (!_mouseButton[0].isState(MBS_HANDLED) &&
- !_mouseButton[1].isState(MBS_HANDLED)) {
+ // both mouse buttons down and not yet handled, or neither down and we are faking it.
+ if ((!_mouseButton[0].isState(MBS_HANDLED) && !_mouseButton[1].isState(MBS_HANDLED)) ||
+ (_mouseButton[0].isState(MBS_HANDLED) && _mouseButton[1].isState(MBS_HANDLED) &&
+ _fakeBothButtonClick)) {
// Take action if both were clicked within
// double-click timeout of each other.
// notice these are all unsigned.
@@ -412,11 +413,16 @@ void AvatarMoverProcess::handleNormalMode() {
down = _mouseButton[0]._curDown - down;
}
- if (down < DOUBLE_CLICK_TIMEOUT) {
+ if (_fakeBothButtonClick || down < DOUBLE_CLICK_TIMEOUT) {
_mouseButton[0].setState(MBS_HANDLED);
_mouseButton[1].setState(MBS_HANDLED);
- // We got a left mouse down.
- // Note that this automatically means right was down too.
+ if (_fakeBothButtonClick) {
+ // Also have to fake a release.
+ _mouseButton[1].clearState(MBS_RELHANDLED);
+ }
+ _fakeBothButtonClick = false;
+ // Both buttons pressed within the timeout
+ // (or we're faking it)
if (checkTurn(mousedir, false))
return;
@@ -451,10 +457,12 @@ void AvatarMoverProcess::handleNormalMode() {
}
}
- if ((!_mouseButton[0].isState(MBS_HANDLED) || m0clicked) &&
+ if ((!_mouseButton[0].isState(MBS_HANDLED) || m0clicked || _fakeBothButtonClick) &&
_mouseButton[1].isState(MBS_DOWN)) {
_mouseButton[0].setState(MBS_HANDLED);
- // We got a left mouse down while the (already handled) right was down.
+ _fakeBothButtonClick = false;
+ // We got a left mouse down (or a fake one) while the already
+ // handled right was down.
if (checkTurn(mousedir, false))
return;
@@ -474,7 +482,7 @@ void AvatarMoverProcess::handleNormalMode() {
// CHECKME: check what needs to happen when keeping left pressed
}
- if (!_mouseButton[1].isState(MBS_HANDLED) && _mouseButton[1].isDoubleClick()) {
+ if (_mouseButton[1].isUnhandledDoubleClick()) {
Gump *desktopgump = Ultima8Engine::get_instance()->getDesktopGump();
if (desktopgump->TraceObjId(mx, my) == 1) {
// double right click on avatar = toggle combat mode
diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.h b/engines/ultima/ultima8/world/actors/avatar_mover_process.h
index 5994b186f9..072599c37f 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.h
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.h
@@ -49,6 +49,10 @@ public:
bool loadData(Common::ReadStream *rs, uint32 version);
+ void setFakeBothButtonClick() {
+ _fakeBothButtonClick = true;
+ }
+
private:
void saveData(Common::WriteStream *ws) override;
@@ -71,6 +75,9 @@ private:
uint32 _idleTime;
Animation::Sequence _lastHeadShakeAnim;
+ //! A fake "both button" event has been requested
+ bool _fakeBothButtonClick;
+
MButton _mouseButton[2];
};
More information about the Scummvm-git-logs
mailing list