[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