[Scummvm-git-logs] scummvm master -> 8b64e9a61a4f08ebbeb9a6fceab22a2fbc96834c

scemino noreply at scummvm.org
Sun Apr 28 19:32:39 UTC 2024


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

Summary:
fd3a29faf3 TWP: Add moveCursorTo
0bb1cc2d67 TWP: Use moveCursorTo in dialog choices
8b64e9a61a TWP: Add inventory shake


Commit: fd3a29faf3369844015cfc5d6252ccff9ce5f40c
    https://github.com/scummvm/scummvm/commit/fd3a29faf3369844015cfc5d6252ccff9ce5f40c
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-28T21:32:18+02:00

Commit Message:
TWP: Add moveCursorTo

Changed paths:
    engines/twp/motor.cpp
    engines/twp/motor.h
    engines/twp/syslib.cpp
    engines/twp/twp.cpp
    engines/twp/twp.h


diff --git a/engines/twp/motor.cpp b/engines/twp/motor.cpp
index 977d49e5c73..5dd14b0be36 100644
--- a/engines/twp/motor.cpp
+++ b/engines/twp/motor.cpp
@@ -675,4 +675,16 @@ void Jiggle::onUpdate(float elapsed) {
 	_node->setRotationOffset(_amount * sin(_jiggleTime));
 }
 
+MoveCursorTo::MoveCursorTo(const Math::Vector2d &pos, float time)
+	: _pos(pos),
+	  _tween(g_twp->_cursor.pos, pos, time, intToInterpolationMethod(IK_LINEAR)) {
+}
+
+void MoveCursorTo::onUpdate(float elapsed) {
+	_tween.update(elapsed);
+	g_twp->_cursor.pos = _tween.current();
+	if (!_tween.running())
+		disable();
+}
+
 } // namespace Twp
diff --git a/engines/twp/motor.h b/engines/twp/motor.h
index a305001a9d1..115a5e2be6b 100644
--- a/engines/twp/motor.h
+++ b/engines/twp/motor.h
@@ -319,6 +319,19 @@ private:
 	float _jiggleTime = 0.f;
 };
 
+class MoveCursorTo : public Motor {
+public:
+	MoveCursorTo(const Math::Vector2d &pos, float time);
+	virtual ~MoveCursorTo() {}
+
+private:
+	virtual void onUpdate(float elapsed) override;
+
+private:
+	Tween<Math::Vector2d> _tween;
+	Math::Vector2d _pos;
+};
+
 } // namespace Twp
 
 #endif
diff --git a/engines/twp/syslib.cpp b/engines/twp/syslib.cpp
index 817bda06e2d..4d51797cd07 100644
--- a/engines/twp/syslib.cpp
+++ b/engines/twp/syslib.cpp
@@ -715,8 +715,16 @@ static SQInteger moveCursorTo(HSQUIRRELVM v) {
 	if (SQ_FAILED(sqget(v, 4, t)))
 		return sq_throwerror(v, "Failed to get time");
 
-	g_twp->_cursor.pos = Math::Vector2d(x, y);
-	// TODO: use time
+	Math::Vector2d pos;
+	if (g_twp->_room) {
+		pos = g_twp->roomToScreen(Math::Vector2d(x, y));
+	} else {
+		pos = g_twp->screenToWin(Math::Vector2d(x, y));
+	}
+	pos.setX(CLIP(pos.getX(), 0.f, (float)SCREEN_WIDTH));
+	pos.setY(CLIP(pos.getY(), 0.f, (float)SCREEN_HEIGHT));
+	pos = g_twp->screenToWin(pos);
+	g_twp->_moveCursorTo = Common::ScopedPtr<Motor>(new MoveCursorTo(pos, t));
 	return 0;
 }
 
diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp
index 1cfbb698fc1..65bac44dc85 100644
--- a/engines/twp/twp.cpp
+++ b/engines/twp/twp.cpp
@@ -455,6 +455,8 @@ void TwpEngine::update(float elapsed) {
 	_noOverride->update(elapsed);
 	if (_talking)
 		_talking->update(elapsed);
+	if (_moveCursorTo)
+		_moveCursorTo->update(elapsed);
 
 	// update mouse pos
 	Math::Vector2d scrPos = winToScreen(_cursor.pos);
@@ -569,7 +571,7 @@ void TwpEngine::update(float elapsed) {
 	bool isNotInDialog = _dialog->getState() == DialogState::None;
 	for (auto it = threads.begin(); it != threads.end(); it++) {
 		Common::SharedPtr<Thread> thread(*it);
-		if ((isNotInDialog || !thread->isGlobal()) && thread->update(elapsed)) {
+		if ((isNotInDialog || !thread->isGlobal() || !thread->_pauseable) && thread->update(elapsed)) {
 			threadsToRemove.push_back(thread);
 		}
 	}
diff --git a/engines/twp/twp.h b/engines/twp/twp.h
index 4e73439ad53..a98ee61ed7c 100644
--- a/engines/twp/twp.h
+++ b/engines/twp/twp.h
@@ -267,6 +267,7 @@ public:
 	unique_ptr<HotspotMarkerNode> _hotspotMarker;
 	unique_ptr<FadeShader> _fadeShader;
 	unique_ptr<LightingNode> _lightingNode;
+	unique_ptr<Motor> _moveCursorTo;
 
 private:
 	Gfx _gfx;


Commit: 0bb1cc2d670f3cda9b876a0177c4747b6c369b00
    https://github.com/scummvm/scummvm/commit/0bb1cc2d670f3cda9b876a0177c4747b6c369b00
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-28T21:32:18+02:00

Commit Message:
TWP: Use moveCursorTo in dialog choices

Changed paths:
    engines/twp/twp.cpp


diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp
index 65bac44dc85..bc6c69e962e 100644
--- a/engines/twp/twp.cpp
+++ b/engines/twp/twp.cpp
@@ -980,14 +980,14 @@ Common::Error TwpEngine::run() {
 					break;
 				case Common::KEYCODE_UP:
 					if (_dialog->getState() == WaitingForChoice) {
-						_cursor.pos = screenToWin(_dialog->getPreviousChoicePos(winToScreen(_cursor.pos)));
+						_moveCursorTo.reset(new MoveCursorTo(screenToWin(_dialog->getPreviousChoicePos(winToScreen(_cursor.pos))), 0.1f));
 					} else {
 						_cursor.holdUp = true;
 					}
 					break;
 				case Common::KEYCODE_DOWN:
 					if (_dialog->getState() == WaitingForChoice) {
-						_cursor.pos = screenToWin(_dialog->getNextChoicePos(winToScreen(_cursor.pos)));
+						_moveCursorTo.reset(new MoveCursorTo(screenToWin(_dialog->getNextChoicePos(winToScreen(_cursor.pos))), 0.1f));
 					} else {
 						_cursor.holdDown = true;
 					}


Commit: 8b64e9a61a4f08ebbeb9a6fceab22a2fbc96834c
    https://github.com/scummvm/scummvm/commit/8b64e9a61a4f08ebbeb9a6fceab22a2fbc96834c
Author: scemino (scemino74 at gmail.com)
Date: 2024-04-28T21:32:18+02:00

Commit Message:
TWP: Add inventory shake

Changed paths:
    engines/twp/scenegraph.cpp
    engines/twp/scenegraph.h


diff --git a/engines/twp/scenegraph.cpp b/engines/twp/scenegraph.cpp
index ed11f3a3a7e..1717c9f8f70 100644
--- a/engines/twp/scenegraph.cpp
+++ b/engines/twp/scenegraph.cpp
@@ -43,6 +43,24 @@ namespace Twp {
 #define BACKWIDTH 137.f
 #define BACKHEIGHT 75.f
 
+class ShakeInventory : public Motor {
+public:
+	ShakeInventory(Math::Vector2d &shakeOffset, float amount) : _shakeOffset(shakeOffset), _amount(amount) {}
+
+protected:
+	void onUpdate(float elapsed) override {
+		_shakeTime += 40.f * elapsed;
+		_elapsed += elapsed;
+		_shakeOffset = Math::Vector2d(_amount * cos(_shakeTime + 0.3f), _amount * sin(_shakeTime));
+	}
+
+private:
+	Math::Vector2d &_shakeOffset;
+	const float _amount;
+	float _shakeTime = 0.f;
+	float _elapsed = 0.f;
+};
+
 static float _getFps(float fps, float animFps) {
 	if (fps != 0.f)
 		return fps;
@@ -579,6 +597,10 @@ Inventory::Inventory() : Node("Inventory") {
 	}
 	_arrowUpRect = Common::Rect(SCREEN_WIDTH / 2.f, ARROWHEIGHT + MARGINBOTTOM + BACKOFFSET, SCREEN_WIDTH / 2.f + ARROWWIDTH, ARROWHEIGHT + MARGINBOTTOM + BACKOFFSET + ARROWHEIGHT);
 	_arrowDnRect = Common::Rect(SCREEN_WIDTH / 2.f, MARGINBOTTOM, SCREEN_WIDTH / 2.f + ARROWWIDTH, MARGINBOTTOM + ARROWHEIGHT);
+	for (int i = 0; i < NUMOBJECTS; i++) {
+		_shakeTime[i] = 0.f;
+		_inventoryOver[i] = false;
+	}
 }
 
 Math::Vector2d Inventory::getPos(Common::SharedPtr<Object> inv) const {
@@ -661,6 +683,8 @@ void Inventory::drawItems(const Math::Matrix4 &trsf) {
 			}
 			float s = obj->getScale();
 			Twp::scale(t, Math::Vector2d(s, s));
+			Math::Vector2d shakeOffset = _shakeOffset[i];
+			t.translate(Math::Vector3d(shakeOffset.getX(), shakeOffset.getY(), 0.f));
 			drawSprite(*itemFrame, texture, Color::withAlpha(Color(), getAlpha()), t);
 		}
 	}
@@ -714,9 +738,26 @@ void Inventory::update(float elapsed, Common::SharedPtr<Object> actor, const Col
 			const Common::Rect &item = _itemRects[i];
 			if (item.contains(scrPos.getX(), scrPos.getY())) {
 				size_t index = _actor->_inventoryOffset * NUMOBJECTSBYROW + i;
-				if (index < _actor->_inventory.size())
-					_obj = _actor->_inventory[index];
-				break;
+				if (index < _actor->_inventory.size()) {
+					_obj = _actor->_inventory[i];
+
+					if (!_inventoryOver[i] && (_shakeTime[i] < 0.1f)) {
+						_shakeTime[i] = 0.25f;
+						_shake[i] = Common::ScopedPtr<Motor>(new ShakeInventory(_shakeOffset[i], 0.4f));
+						_inventoryOver[i] = true;
+					}
+				}
+			} else {
+				_inventoryOver[i] = false;
+			}
+
+			// shake choice when cursor is over
+			if ((_shakeTime[i] > 0.0f) && _shake[i]) {
+				_shake[i]->update(elapsed);
+				_shakeTime[i] -= elapsed;
+				if (_shakeTime[i] < 0.f) {
+					_shakeTime[i] = 0.f;
+				}
 			}
 		}
 
diff --git a/engines/twp/scenegraph.h b/engines/twp/scenegraph.h
index 22dae349b20..7202762176f 100644
--- a/engines/twp/scenegraph.h
+++ b/engines/twp/scenegraph.h
@@ -36,6 +36,8 @@
 
 namespace Twp {
 
+class Motor;
+
 // Represents a node in a scene graph.
 class Node {
 public:
@@ -318,6 +320,10 @@ private:
 	bool _down = false;
 	Common::SharedPtr<Object> _obj;
 	Common::Rect _itemRects[NUMOBJECTS];
+	Common::ScopedPtr<Motor> _shake[NUMOBJECTS];
+	bool _inventoryOver[NUMOBJECTS];
+	Math::Vector2d _shakeOffset[NUMOBJECTS];
+	float _shakeTime[NUMOBJECTS];
 	Common::Rect _arrowUpRect;
 	Common::Rect _arrowDnRect;
 	float _jiggleTime = 0.f;




More information about the Scummvm-git-logs mailing list