[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