[Scummvm-git-logs] scummvm master -> ab17f10a6fd0209d80d42fb8d9d150e9c2220887
scemino
noreply at scummvm.org
Sun Mar 17 12:10:39 UTC 2024
This automated email contains information about 20 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
f49a0223e9 TWP: Fix pizza flyer code not visible
4f05d340a4 TWP: Fix callbacks in savegames
0a7bc21952 TWP: Fix Ransome should have his makeup
58f029f52c TWP: Fix breakhere
4704f6a75e TWP: cutsceneOverride should not be callable several times
1686f90201 TWP: Fix inventoryScroll can assert
5e107bb2d5 TWP: Fix motors still updated when disabled
3c505d3ae9 TWP: Fix dialog when object "speaks"
98097f72c6 TWP: Fix sound still occupying slot when stopped
fefb90dc6f TWP: Fix temporary objects still visible
dc8552bb05 TWP: Walkspeed is too slow
48a5f1eb52 TWP: Improve savegame speed
2a25921de0 TWP: Fix head is disappearing sometimes
7ca277f356 TWP: Fix wrong DLC detection + add dialog
2ad9635b43 TWP: Fix wrong anim when talking
6446cd8597 TWP: Allow default verb with walkto
ff1445f77c TWP: Revert painful lockMouse
eca34b2ca2 TWP: Remove statics in TwpEngine
8f8a833eb6 TWP: Fix some dialog without speech
ab17f10a6f BACKENDS: Try to fix imgui compilation errors
Commit: f49a0223e9160a536dfb79ee17a6ecd93241fd52
https://github.com/scummvm/scummvm/commit/f49a0223e9160a536dfb79ee17a6ecd93241fd52
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:31+01:00
Commit Message:
TWP: Fix pizza flyer code not visible
Changed paths:
engines/twp/dialog.cpp
engines/twp/font.cpp
engines/twp/font.h
engines/twp/motor.cpp
engines/twp/scenegraph.cpp
diff --git a/engines/twp/dialog.cpp b/engines/twp/dialog.cpp
index a730c8c3bbf..b3203f49907 100644
--- a/engines/twp/dialog.cpp
+++ b/engines/twp/dialog.cpp
@@ -245,7 +245,7 @@ void Dialog::update(float dt) {
for (size_t i = 0; i < MAXDIALOGSLOTS; i++) {
DialogSlot *slot = &_slots[i];
if (slot->_isValid) {
- Rectf rect = Rectf::fromPosAndSize(slot->getPos() - Math::Vector2d(0.f, slot->_text.getBounds().getY()), slot->_text.getBounds());
+ Rectf rect = Rectf::fromPosAndSize(slot->getPos() - Math::Vector2d(0.f, -slot->_text.getBounds().getY()/2.f), slot->_text.getBounds());
bool over = slot && rect.contains(_mousePos);
if (rect.r.w > (SCREEN_WIDTH - SLOTMARGIN)) {
if (over) {
diff --git a/engines/twp/font.cpp b/engines/twp/font.cpp
index 790d759fcf6..17d764be306 100644
--- a/engines/twp/font.cpp
+++ b/engines/twp/font.cpp
@@ -300,7 +300,7 @@ void Text::update() {
// create quads for all characters
float maxW = 0.f;
float lineHeight = _font->getLineHeight();
- float y = -lineHeight;
+ float y = 0.f;
for (size_t i = 0; i < lines.size(); i++) {
Line &line = lines[i];
CodePoint prevChar = 0;
@@ -362,7 +362,18 @@ void Text::update() {
}
void Text::draw(Gfx &gfx, Math::Matrix4 trsf) {
- if (_font && _txt.size() > 0) {
+ switch(_vAlign) {
+ case tvTop:
+ trsf.translate(Math::Vector3d(0.f, 0.f, 0.f));
+ break;
+ case tvCenter:
+ trsf.translate(Math::Vector3d(0.f, _bnds.getY()/2.f, 0.f));
+ break;
+ case tvBottom:
+ trsf.translate(Math::Vector3d(0.f, _bnds.getY(), 0.f));
+ break;
+ }
+ if (_font && !_txt.empty()) {
update();
gfx.drawPrimitives(GL_TRIANGLES, _vertices.begin(), _vertices.size(), trsf, _texture);
}
diff --git a/engines/twp/font.h b/engines/twp/font.h
index 71a3a82eee2..4c1bea90326 100644
--- a/engines/twp/font.h
+++ b/engines/twp/font.h
@@ -150,31 +150,31 @@ public:
_txt = text;
_dirty = true;
}
- Common::String getText() { return _txt; }
+ Common::String getText() const { return _txt; }
void setColor(Color c) {
_col = c;
_dirty = true;
}
- Color getColor() { return _col; }
+ Color getColor() const { return _col; }
void setMaxWidth(float maxW) {
_maxW = maxW;
_dirty = true;
}
- float getMaxWidth() { return _maxW; }
+ float getMaxWidth() const { return _maxW; }
void setHAlign(TextHAlignment align) {
_hAlign = align;
_dirty = true;
}
- TextHAlignment getHAlign() { return _hAlign; }
+ TextHAlignment getHAlign() const { return _hAlign; }
void setVAlign(TextVAlignment align) {
_vAlign = align;
_dirty = true;
}
- TextVAlignment getVAlign() { return _vAlign; }
+ TextVAlignment getVAlign() const { return _vAlign; }
void setFont(const Common::String &fontName);
Common::SharedPtr<Font> getFont() { return _font; }
diff --git a/engines/twp/motor.cpp b/engines/twp/motor.cpp
index 4eac93b1b60..f8d02682a3d 100644
--- a/engines/twp/motor.cpp
+++ b/engines/twp/motor.cpp
@@ -461,19 +461,19 @@ void Talking::say(const Common::String &text) {
}
if (ConfMan.getBool("subtitles")) {
- Text text2("sayline", txt, thCenter, tvCenter, SCREEN_WIDTH * 3.f / 4.f, _color);
+ Text text2("sayline", txt, thCenter, tvTop, SCREEN_WIDTH * 3.f / 4.f, _color);
_obj->_sayNode = Common::SharedPtr<TextNode>(new TextNode());
_obj->_sayNode->setText(text2);
_obj->_sayNode->setColor(_color);
_node = _obj->_sayNode;
- Math::Vector2d pos = g_twp->roomToScreen(_obj->_node->getAbsPos() + Math::Vector2d(_obj->_talkOffset.getX(), _obj->_talkOffset.getY()));
+ Math::Vector2d pos = g_twp->roomToScreen(_obj->_node->getAbsPos() + _obj->_talkOffset);
// clamp position to keep it on screen
pos.setX(CLIP(pos.getX(), 10.f + text2.getBounds().getX() / 2.f, SCREEN_WIDTH - text2.getBounds().getX() / 2.f));
pos.setY(CLIP(pos.getY(), 10.f + text2.getBounds().getY(), SCREEN_HEIGHT - text2.getBounds().getY()));
_obj->_sayNode->setPos(pos);
- _obj->_sayNode->setAnchorNorm(Math::Vector2d(0.5f, 0.5f));
+ _obj->_sayNode->setAnchorNorm(Math::Vector2d(0.5f, 0.0f));
g_twp->_screenScene->addChild(_obj->_sayNode.get());
}
diff --git a/engines/twp/scenegraph.cpp b/engines/twp/scenegraph.cpp
index 172acfb20a0..4e99abf9561 100644
--- a/engines/twp/scenegraph.cpp
+++ b/engines/twp/scenegraph.cpp
@@ -451,7 +451,7 @@ TextNode::~TextNode() {}
void TextNode::setText(Text text) {
_text = text;
- setSize(text.getBounds());
+ updateBounds();
}
void TextNode::updateBounds() {
@@ -755,13 +755,13 @@ void SentenceNode::drawCore(Math::Matrix4 trsf) {
float x, y;
if (ConfMan.getBool("hudSentence")) {
x = (SCREEN_WIDTH - text.getBounds().getX()) / 2.f;
- y = 208.f;
+ y = 152.f;
} else {
x = MAX(_pos.getX() - text.getBounds().getX() / 2.f, MARGIN);
x = MIN(x, SCREEN_WIDTH - text.getBounds().getX() - MARGIN);
- y = _pos.getY() + 2.f * 38.f;
- if (y >= SCREEN_HEIGHT)
- y = _pos.getY() - 38.f;
+ y = _pos.getY() + 16.f;
+ if (y >= (SCREEN_HEIGHT - 32.f))
+ y = _pos.getY() - 92.f;
}
Math::Matrix4 t;
t.translate(Math::Vector3d(x, y, 0.f));
Commit: 4f05d340a470982b9146171b135029ab0c0691bf
https://github.com/scummvm/scummvm/commit/4f05d340a470982b9146171b135029ab0c0691bf
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:31+01:00
Commit Message:
TWP: Fix callbacks in savegames
Changed paths:
engines/twp/savegame.cpp
diff --git a/engines/twp/savegame.cpp b/engines/twp/savegame.cpp
index 32e4bbb2493..2c243b63144 100644
--- a/engines/twp/savegame.cpp
+++ b/engines/twp/savegame.cpp
@@ -510,9 +510,9 @@ void SaveGameManager::loadCallbacks(const Common::JSONObject &json) {
const Common::JSONArray &jCallbacks = json["callbacks"]->asArray();
for (size_t i = 0; i < jCallbacks.size(); i++) {
const Common::JSONObject &jCallBackHash = jCallbacks[i]->asObject();
- int id = jCallBackHash["guid"]->asIntegerNumber();
- float time = ((float)jCallBackHash["time"]->asIntegerNumber()) / 1000.f;
- Common::String name = jCallBackHash["function"]->asString();
+ const int id = jCallBackHash["guid"]->asIntegerNumber();
+ const float time = jCallBackHash["time"]->isIntegerNumber() ? (float)jCallBackHash["time"]->asIntegerNumber() : 0.f;
+ const Common::String name = jCallBackHash["function"]->asString();
Common::Array<HSQOBJECT> args;
if (jCallBackHash.contains("param")) {
HSQOBJECT arg;
@@ -742,7 +742,7 @@ static Common::JSONValue *createJCallback(const Callback &callback) {
Common::JSONObject result;
result["function"] = new Common::JSONValue(callback.getName());
result["guid"] = new Common::JSONValue((long long int)callback.getId());
- result["time"] = new Common::JSONValue(MAX(0.0, (double)(callback.getDuration() - callback.getElapsed())));
+ result["time"] = new Common::JSONValue((long long int)MAX(0.f, (callback.getDuration() - callback.getElapsed())));
Common::JSONArray jArgs;
const Common::Array<HSQOBJECT> &args = callback.getArgs();
for (size_t i = 0; i < args.size(); i++) {
Commit: 0a7bc2195217ba5a11bcf4cb899b939f9119e45f
https://github.com/scummvm/scummvm/commit/0a7bc2195217ba5a11bcf4cb899b939f9119e45f
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:31+01:00
Commit Message:
TWP: Fix Ransome should have his makeup
Changed paths:
engines/twp/actorlib.cpp
engines/twp/object.cpp
engines/twp/savegame.cpp
diff --git a/engines/twp/actorlib.cpp b/engines/twp/actorlib.cpp
index 1fee934f276..367c9e1dd07 100644
--- a/engines/twp/actorlib.cpp
+++ b/engines/twp/actorlib.cpp
@@ -372,6 +372,11 @@ static SQInteger actorShowHideLayer(HSQUIRRELVM v, bool visible) {
if (SQ_FAILED(sqget(v, 3, layer)))
return sq_throwerror(v, "failed to get layer");
actor->showLayer(layer, visible);
+ if(!visible) {
+ for (int i = 1; i <= 6; i++) {
+ actor->showLayer(Common::String::format("%s%d", layer.c_str(), i), false);
+ }
+ }
return 0;
}
diff --git a/engines/twp/object.cpp b/engines/twp/object.cpp
index 0b5d3426dac..6abd23c02e1 100644
--- a/engines/twp/object.cpp
+++ b/engines/twp/object.cpp
@@ -510,16 +510,18 @@ void Object::stopWalking() {
}
void Object::setAnimationNames(const Common::String &head, const Common::String &stand, const Common::String &walk, const Common::String &reach) {
- if (head.size() > 0)
- setHeadIndex(0);
- _animNames[HEAD_ANIMNAME] = head;
- showLayer(_animNames[HEAD_ANIMNAME], true);
- setHeadIndex(1);
- if (stand.size() > 0)
+ if (!head.empty()) {
+ for (int i = 1; i <= 6; i++) {
+ showLayer(Common::String::format("%s%d", getAnimName(HEAD_ANIMNAME).c_str(), i), true);
+ }
+ _animNames[HEAD_ANIMNAME] = head;
+ setHeadIndex(1);
+ }
+ if (!stand.empty())
_animNames[STAND_ANIMNAME] = stand;
- if (walk.size() > 0)
+ if (!walk.empty())
_animNames[WALK_ANIMNAME] = walk;
- if (reach.size() > 0)
+ if (!reach.empty())
_animNames[REACH_ANIMNAME] = reach;
if (isWalking())
play(getAnimName(WALK_ANIMNAME), true);
diff --git a/engines/twp/savegame.cpp b/engines/twp/savegame.cpp
index 2c243b63144..3efd4a9de92 100644
--- a/engines/twp/savegame.cpp
+++ b/engines/twp/savegame.cpp
@@ -273,9 +273,6 @@ static void loadActor(Common::SharedPtr<Object> actor, const Common::JSONObject
}
}
}
-
- if (sqrawexists(actor->_table, "postLoad"))
- sqcall(actor->_table, "postLoad");
}
static void loadObject(Common::SharedPtr<Object> obj, const Common::JSONObject &json) {
@@ -424,6 +421,12 @@ bool SaveGameManager::loadGame(const SaveGame &savegame) {
HSQUIRRELVM v = g_twp->getVm();
sqsetf(sqrootTbl(v), "SAVEBUILD", static_cast<int>(json["savebuild"]->asIntegerNumber()));
+ for(auto a : g_twp->_actors) {
+ if (sqrawexists(a->_table, "postLoad")) {
+ sqcall(a->_table, "postLoad");
+ }
+ }
+
sqcall("postLoad");
return true;
@@ -694,14 +697,46 @@ Common::String toString(const Math::Vector2d &pos) {
return Common::String::format("{%d,%d}", (int)pos.getX(), (int)pos.getY());
}
+// static Common::String getCustomAnim(Common::SharedPtr<Object> actor, const Common::String &name) {
+// return actor->_animNames.contains(name) ? actor->_animNames[name] : name;
+// }
+
+// static Common::JSONValue *getCustomAnims(Common::SharedPtr<Object> actor) {
+// Common::JSONArray jAnims;
+// // add head anims
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, HEAD_ANIMNAME)));
+// for (int i = 1; i < 7; i++) {
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%d", HEAD_ANIMNAME, i))));
+// }
+// // add stand anims
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%s", STAND_ANIMNAME, "_front"))));
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%s", STAND_ANIMNAME, "_back"))));
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%s", STAND_ANIMNAME, "_left"))));
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%s", STAND_ANIMNAME, "_right"))));
+// // add walk anims
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%s", WALK_ANIMNAME, "_front"))));
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%s", WALK_ANIMNAME, "_back"))));
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%s", WALK_ANIMNAME, "_right"))));
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%s", WALK_ANIMNAME, "_right"))));
+// // add reach anims
+// const char *dirs[] = {"_front", "_back", "_right", "_right"};
+// for (int i = 0; i < ARRAYSIZE(dirs); i++) {
+// const char *dir = dirs[i];
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%s%s", REACH_ANIMNAME, "_low", dir))));
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%s%s", REACH_ANIMNAME, "_med", dir))));
+// jAnims.push_back(new Common::JSONValue(getCustomAnim(actor, Common::String::format("%s%s%s", REACH_ANIMNAME, "_high", dir))));
+// }
+// return new Common::JSONValue(jAnims);
+// }
+
static Common::JSONValue *createJActor(Common::SharedPtr<Object> actor) {
Common::JSONValue *jActorValue = tojson(actor->_table, false);
Common::JSONObject jActor(jActorValue->asObject());
int color = actor->_node->getComputedColor().toInt();
if (color != Color().toInt())
jActor["_color"] = new Common::JSONValue((long long int)color);
- // if (actor->hasCustomAnim())
- // jActor["_animations"] = actor->getCustomAnims();
+ // if (!actor->_animNames.empty())
+ // jActor["_animations"] = getCustomAnims(actor);
jActor["_costume"] = new Common::JSONValue(removeFileExt(actor->_costumeName));
jActor["_dir"] = new Common::JSONValue((long long int)actor->_facing);
jActor["_lockFacing"] = new Common::JSONValue((long long int)actor->_facingLockValue);
Commit: 58f029f52c6e2a51d6988b2c40c88b8f7e4f8220
https://github.com/scummvm/scummvm/commit/58f029f52c6e2a51d6988b2c40c88b8f7e4f8220
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:31+01:00
Commit Message:
TWP: Fix breakhere
Changed paths:
engines/twp/thread.cpp
diff --git a/engines/twp/thread.cpp b/engines/twp/thread.cpp
index d9763810b46..f3cc3dff609 100644
--- a/engines/twp/thread.cpp
+++ b/engines/twp/thread.cpp
@@ -105,9 +105,11 @@ bool Thread::update(float elapsed) {
resume();
}
} else if (_numFrames > 0) {
- _numFrames -= 1;
- _numFrames = 0;
- resume();
+ _numFrames--;
+ if (_numFrames <= 0) {
+ _numFrames = 0;
+ resume();
+ }
}
return isDead();
}
@@ -211,9 +213,11 @@ bool Cutscene::update(float elapsed) {
resume();
}
} else if (_numFrames > 0) {
- _numFrames -= 1;
- _numFrames = 0;
- resume();
+ _numFrames--;
+ if (_numFrames <= 0) {
+ _numFrames = 0;
+ resume();
+ }
}
switch (_state) {
Commit: 4704f6a75e03fcff75318c068cd38f0303621e48
https://github.com/scummvm/scummvm/commit/4704f6a75e03fcff75318c068cd38f0303621e48
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:31+01:00
Commit Message:
TWP: cutsceneOverride should not be callable several times
Changed paths:
engines/twp/debugtools.cpp
engines/twp/syslib.cpp
engines/twp/thread.cpp
engines/twp/thread.h
diff --git a/engines/twp/debugtools.cpp b/engines/twp/debugtools.cpp
index 2a035551153..ed265b2469e 100644
--- a/engines/twp/debugtools.cpp
+++ b/engines/twp/debugtools.cpp
@@ -82,7 +82,6 @@ static void drawThreads() {
if (g_twp->_cutscene) {
Common::SharedPtr<ThreadBase> thread(g_twp->_cutscene);
SQStackInfos infos;
- sq_stackinfos(thread->getThread(), 0, &infos);
ImGui::TableNextRow();
ImGui::TableNextColumn();
@@ -92,11 +91,16 @@ static void drawThreads() {
ImGui::TableNextColumn();
ImGui::Text("%-6s", "cutscene");
ImGui::TableNextColumn();
- ImGui::Text("%-9s", infos.funcname);
- ImGui::TableNextColumn();
- ImGui::Text("%-9s", infos.source);
- ImGui::TableNextColumn();
- ImGui::Text("%5lld", infos.line);
+ if (SQ_SUCCEEDED(sq_stackinfos(thread->getThread(), 0, &infos))) {
+ ImGui::Text("%-9s", infos.funcname);
+ ImGui::TableNextColumn();
+ ImGui::Text("%-9s", infos.source);
+ ImGui::TableNextColumn();
+ ImGui::Text("%5lld", infos.line);
+ } else {
+ ImGui::TableNextColumn();
+ ImGui::TableNextColumn();
+ }
}
for (const auto &thread : threads) {
@@ -111,11 +115,16 @@ static void drawThreads() {
ImGui::TableNextColumn();
ImGui::Text("%-6s", thread->isGlobal() ? "global" : "local");
ImGui::TableNextColumn();
- ImGui::Text("%-9s", infos.funcname);
- ImGui::TableNextColumn();
- ImGui::Text("%-9s", infos.source);
- ImGui::TableNextColumn();
- ImGui::Text("%5lld", infos.line);
+ if (SQ_SUCCEEDED(sq_stackinfos(thread->getThread(), 0, &infos))) {
+ ImGui::Text("%-9s", infos.funcname);
+ ImGui::TableNextColumn();
+ ImGui::Text("%-9s", infos.source);
+ ImGui::TableNextColumn();
+ ImGui::Text("%5lld", infos.line);
+ } else {
+ ImGui::TableNextColumn();
+ ImGui::TableNextColumn();
+ }
}
ImGui::EndTable();
}
diff --git a/engines/twp/syslib.cpp b/engines/twp/syslib.cpp
index 3ef19768546..6656806ef0b 100644
--- a/engines/twp/syslib.cpp
+++ b/engines/twp/syslib.cpp
@@ -378,7 +378,7 @@ struct ActorTalking {
explicit ActorTalking(Common::SharedPtr<Object> obj) : _obj(obj) {}
bool operator()() {
- return _obj->getTalking() && _obj->getTalking()->isEnabled();
+ return _obj->getTalking() && _obj->getTalking()->isEnabled() && _obj->_room == g_twp->_room;
}
private:
diff --git a/engines/twp/thread.cpp b/engines/twp/thread.cpp
index f3cc3dff609..7b2bc9ce965 100644
--- a/engines/twp/thread.cpp
+++ b/engines/twp/thread.cpp
@@ -275,4 +275,10 @@ bool Cutscene::isStopped() {
return sq_getvmstate(getThread()) == 0;
}
+void Cutscene::cutsceneOverride() {
+ if (_state == csCheckEnd) {
+ _state = csOverride;
+ }
+}
+
} // namespace Twp
diff --git a/engines/twp/thread.h b/engines/twp/thread.h
index 6d20cc2ff6b..ee544e18436 100644
--- a/engines/twp/thread.h
+++ b/engines/twp/thread.h
@@ -114,7 +114,7 @@ public:
void stop() override final;
bool hasOverride() const;
- inline void cutsceneOverride() { _state = csOverride; }
+ void cutsceneOverride();
bool isStopped();
void setInputState(InputStateFlag state) { _inputState = state; }
Commit: 1686f90201d1a9e53eaa31960e46034136012239
https://github.com/scummvm/scummvm/commit/1686f90201d1a9e53eaa31960e46034136012239
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:31+01:00
Commit Message:
TWP: Fix inventoryScroll can assert
Changed paths:
engines/twp/object.cpp
diff --git a/engines/twp/object.cpp b/engines/twp/object.cpp
index 6abd23c02e1..50ef56808a4 100644
--- a/engines/twp/object.cpp
+++ b/engines/twp/object.cpp
@@ -809,14 +809,13 @@ void Object::jiggle(float amount) {
}
void Object::inventoryScrollUp() {
- _inventoryOffset -= 1;
- if (_inventoryOffset < 0)
- _inventoryOffset = CLIP(_inventoryOffset, 0, ((int)_inventory.size() - 5) / 4);
+ if(_inventoryOffset == 0) return;
+ _inventoryOffset--;
}
void Object::inventoryScrollDown() {
_inventoryOffset++;
- _inventoryOffset = CLIP(_inventoryOffset, 0, ((int)_inventory.size() - 5) / 4);
+ _inventoryOffset = CLIP(_inventoryOffset, 0, MAX(0, ((int)_inventory.size() - 5) / 4));
}
void TalkingState::say(const Common::StringArray &texts, Common::SharedPtr<Object> obj) {
Commit: 5e107bb2d5e01c9d70714b58fdef4e14c999d995
https://github.com/scummvm/scummvm/commit/5e107bb2d5e01c9d70714b58fdef4e14c999d995
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Fix motors still updated when disabled
Changed paths:
engines/twp/dialog.cpp
engines/twp/enginedialogtarget.cpp
engines/twp/motor.cpp
engines/twp/motor.h
engines/twp/object.cpp
diff --git a/engines/twp/dialog.cpp b/engines/twp/dialog.cpp
index b3203f49907..7cd0146bf9e 100644
--- a/engines/twp/dialog.cpp
+++ b/engines/twp/dialog.cpp
@@ -33,7 +33,7 @@ public:
SerialMotors(const std::initializer_list<Common::SharedPtr<Motor> > &motors) : _motors(motors) {}
explicit SerialMotors(const Common::Array<Common::SharedPtr<Motor> > &motors) : _motors(motors) {}
- void update(float elapsed) override {
+ void onUpdate(float elapsed) override {
if (!_motors.empty()) {
_motors[0]->update(elapsed);
if (!_motors[0]->isEnabled()) {
@@ -56,7 +56,7 @@ public:
: _dlg(dlg), _line(line), _name(name) {
}
- void update(float elapsed) override {
+ void onUpdate(float elapsed) override {
_dlg->selectLabel(_line, _name);
disable();
}
diff --git a/engines/twp/enginedialogtarget.cpp b/engines/twp/enginedialogtarget.cpp
index 0666abda964..22a4fde46dd 100644
--- a/engines/twp/enginedialogtarget.cpp
+++ b/engines/twp/enginedialogtarget.cpp
@@ -31,7 +31,7 @@ class Pause : public Motor {
public:
explicit Pause(float time) : _time(time) {}
- void update(float elapsed) override {
+ void onUpdate(float elapsed) override {
_time -= elapsed;
if (_time <= 0)
disable();
@@ -45,7 +45,7 @@ class WaitWhile : public Motor {
public:
WaitWhile(EngineDialogTarget *target, const Common::String &cond) : _target(target), _cond(cond) {}
- void update(float elapsed) override {
+ void onUpdate(float elapsed) override {
if (!_target->execCond(_cond))
disable();
}
diff --git a/engines/twp/motor.cpp b/engines/twp/motor.cpp
index f8d02682a3d..d2205ec1f7a 100644
--- a/engines/twp/motor.cpp
+++ b/engines/twp/motor.cpp
@@ -31,6 +31,11 @@
namespace Twp {
+void Motor::update(float elapsed) {
+ if(!isEnabled()) return;
+ onUpdate(elapsed);
+}
+
OffsetTo::~OffsetTo() = default;
OffsetTo::OffsetTo(float duration, Common::SharedPtr<Object> obj, const Math::Vector2d &pos, InterpolationMethod im)
@@ -38,7 +43,7 @@ OffsetTo::OffsetTo(float duration, Common::SharedPtr<Object> obj, const Math::Ve
_tween(obj->_node->getOffset(), pos, duration, im) {
}
-void OffsetTo::update(float elapsed) {
+void OffsetTo::onUpdate(float elapsed) {
_tween.update(elapsed);
_obj->_node->setOffset(_tween.current());
if (!_tween.running())
@@ -52,7 +57,7 @@ MoveTo::MoveTo(float duration, Common::SharedPtr<Object> obj, const Math::Vector
_tween(obj->_node->getPos(), pos, duration, im) {
}
-void MoveTo::update(float elapsed) {
+void MoveTo::onUpdate(float elapsed) {
_tween.update(elapsed);
_obj->_node->setPos(_tween.current());
if (!_tween.running())
@@ -66,7 +71,7 @@ AlphaTo::AlphaTo(float duration, Common::SharedPtr<Object> obj, float to, Interp
_tween(obj->_node->getAlpha(), to, duration, im) {
}
-void AlphaTo::update(float elapsed) {
+void AlphaTo::onUpdate(float elapsed) {
_tween.update(elapsed);
float alpha = _tween.current();
_obj->_node->setAlpha(alpha);
@@ -81,7 +86,7 @@ RotateTo::RotateTo(float duration, Node *node, float to, InterpolationMethod im)
_tween(node->getRotation(), to, duration, im) {
}
-void RotateTo::update(float elapsed) {
+void RotateTo::onUpdate(float elapsed) {
_tween.update(elapsed);
_node->setRotation(_tween.current());
if (!_tween.running())
@@ -95,7 +100,7 @@ RoomRotateTo::RoomRotateTo(Common::SharedPtr<Room> room, float to)
_tween(room->_rotation, to, 0.200f, intToInterpolationMethod(0)) {
}
-void RoomRotateTo::update(float elapsed) {
+void RoomRotateTo::onUpdate(float elapsed) {
_tween.update(elapsed);
_room->_rotation = _tween.current();
if (!_tween.running())
@@ -109,7 +114,7 @@ ScaleTo::ScaleTo(float duration, Node *node, float to, InterpolationMethod im)
_tween(node->getScale().getX(), to, duration, im) {
}
-void ScaleTo::update(float elapsed) {
+void ScaleTo::onUpdate(float elapsed) {
_tween.update(elapsed);
float x = _tween.current();
_node->setScale(Math::Vector2d(x, x));
@@ -124,7 +129,7 @@ Shake::Shake(Node *node, float amount)
_amount(amount) {
}
-void Shake::update(float elapsed) {
+void Shake::onUpdate(float elapsed) {
_shakeTime += 40.f * elapsed;
_elapsed += elapsed;
_node->setShakeOffset(Math::Vector2d(_amount * cos(_shakeTime + 0.3f), _amount * sin(_shakeTime)));
@@ -138,7 +143,7 @@ OverlayTo::OverlayTo(float duration, Common::SharedPtr<Room> room, Color to)
OverlayTo::~OverlayTo() = default;
-void OverlayTo::update(float elapsed) {
+void OverlayTo::onUpdate(float elapsed) {
_tween.update(elapsed);
_room->setOverlay(_tween.current());
if (!_tween.running())
@@ -156,7 +161,7 @@ void ReachAnim::playReachAnim() {
_actor->play(anim);
}
-void ReachAnim::update(float elapsed) {
+void ReachAnim::onUpdate(float elapsed) {
switch (_state) {
case 0:
playReachAnim();
@@ -247,7 +252,7 @@ void WalkTo::actorArrived() {
}
}
-void WalkTo::update(float elapsed) {
+void WalkTo::onUpdate(float elapsed) {
if (!_enabled)
return;
if (_state == kWalking && !_path.empty()) {
@@ -336,7 +341,7 @@ static int letterToIndex(char c) {
}
}
-void Talking::update(float elapsed) {
+void Talking::onUpdate(float elapsed) {
if (!isEnabled())
return;
@@ -527,7 +532,7 @@ Jiggle::Jiggle(Node *node, float amount) : _amount(amount), _node(node) {
Jiggle::~Jiggle() = default;
-void Jiggle::update(float elapsed) {
+void Jiggle::onUpdate(float elapsed) {
_jiggleTime += 20.f * elapsed;
_node->setRotationOffset(_amount * sin(_jiggleTime));
}
diff --git a/engines/twp/motor.h b/engines/twp/motor.h
index 12e363e9c69..7d553a49946 100644
--- a/engines/twp/motor.h
+++ b/engines/twp/motor.h
@@ -85,7 +85,10 @@ public:
_enabled = false;
}
virtual bool isEnabled() const { return _enabled; }
- virtual void update(float elapsed) = 0;
+ void update(float elapsed);
+
+protected:
+ virtual void onUpdate(float elapsed) = 0;
protected:
bool _enabled = true;
@@ -98,7 +101,7 @@ public:
OffsetTo(float duration, Common::SharedPtr<Object> obj, const Math::Vector2d &pos, InterpolationMethod im);
private:
- virtual void update(float elasped) override;
+ virtual void onUpdate(float elasped) override;
private:
Common::SharedPtr<Object> _obj;
@@ -111,7 +114,7 @@ public:
MoveTo(float duration, Common::SharedPtr<Object> obj, const Math::Vector2d &pos, InterpolationMethod im);
private:
- virtual void update(float elasped) override;
+ virtual void onUpdate(float elasped) override;
private:
Common::SharedPtr<Object> _obj;
@@ -124,7 +127,7 @@ public:
AlphaTo(float duration, Common::SharedPtr<Object> obj, float to, InterpolationMethod im);
private:
- virtual void update(float elasped) override;
+ virtual void onUpdate(float elasped) override;
private:
Common::SharedPtr<Object> _obj;
@@ -138,7 +141,7 @@ public:
RotateTo(float duration, Node *obj, float to, InterpolationMethod im);
private:
- virtual void update(float elasped) override;
+ virtual void onUpdate(float elasped) override;
private:
Node *_node = nullptr;
@@ -151,7 +154,7 @@ public:
RoomRotateTo(Common::SharedPtr<Room> room, float to);
private:
- virtual void update(float elasped) override;
+ virtual void onUpdate(float elasped) override;
private:
Common::SharedPtr<Room> _room;
@@ -164,7 +167,7 @@ public:
ScaleTo(float duration, Node *node, float to, InterpolationMethod im);
private:
- virtual void update(float elasped) override;
+ virtual void onUpdate(float elasped) override;
private:
Node *_node = nullptr;
@@ -177,7 +180,7 @@ public:
Shake(Node *node, float amount);
private:
- virtual void update(float elasped) override;
+ virtual void onUpdate(float elasped) override;
private:
Node *_node = nullptr;
@@ -191,7 +194,7 @@ public:
virtual ~OverlayTo();
OverlayTo(float duration, Common::SharedPtr<Room> room, Color to);
- virtual void update(float elapsed) override;
+ virtual void onUpdate(float elapsed) override;
private:
Common::SharedPtr<Room> _room;
@@ -204,7 +207,7 @@ public:
virtual ~ReachAnim();
ReachAnim(Common::SharedPtr<Object> actor, Common::SharedPtr<Object> obj);
- virtual void update(float elasped) override;
+ virtual void onUpdate(float elasped) override;
private:
void playReachAnim();
@@ -231,7 +234,7 @@ public:
private:
void actorArrived();
- void update(float elapsed) override;
+ void onUpdate(float elapsed) override;
private:
Common::SharedPtr<Object> _obj;
@@ -250,7 +253,7 @@ public:
void append(const Common::StringArray &texts);
- virtual void update(float elapsed) override;
+ virtual void onUpdate(float elapsed) override;
virtual void disable() override;
private:
@@ -276,7 +279,7 @@ public:
virtual ~Jiggle();
private:
- virtual void update(float elapsed) override;
+ virtual void onUpdate(float elapsed) override;
private:
Node *_node = nullptr;
diff --git a/engines/twp/object.cpp b/engines/twp/object.cpp
index 50ef56808a4..3d93cca71b4 100644
--- a/engines/twp/object.cpp
+++ b/engines/twp/object.cpp
@@ -53,7 +53,7 @@ public:
_duration = g_twp->getRandom(min, max);
}
- virtual void update(float elapsed) override {
+ virtual void onUpdate(float elapsed) override {
if (_state == BlinkState::Closed) {
// wait to blink
_elapsed += elapsed;
Commit: 3c505d3ae9a6d515542b52cd56bb4019e679ccb3
https://github.com/scummvm/scummvm/commit/3c505d3ae9a6d515542b52cd56bb4019e679ccb3
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Fix dialog when object "speaks"
Changed paths:
engines/twp/enginedialogtarget.cpp
diff --git a/engines/twp/enginedialogtarget.cpp b/engines/twp/enginedialogtarget.cpp
index 22a4fde46dd..1258b9635d4 100644
--- a/engines/twp/enginedialogtarget.cpp
+++ b/engines/twp/enginedialogtarget.cpp
@@ -59,7 +59,7 @@ static Common::SharedPtr<Object> actor(const Common::String &name) {
HSQOBJECT obj;
sq_resetobject(&obj);
sqgetf(name, obj);
- return sqactor(obj);
+ return sqobj(obj);
}
static Common::SharedPtr<Object> actorOrCurrent(const Common::String &name) {
Commit: 98097f72c6a8d4fc948d37ff3273400c2361ece7
https://github.com/scummvm/scummvm/commit/98097f72c6a8d4fc948d37ff3273400c2361ece7
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Fix sound still occupying slot when stopped
Changed paths:
engines/twp/audio.cpp
diff --git a/engines/twp/audio.cpp b/engines/twp/audio.cpp
index 3ced868cae3..aa3f129677c 100644
--- a/engines/twp/audio.cpp
+++ b/engines/twp/audio.cpp
@@ -80,7 +80,7 @@ bool AudioSystem::playing(int id) const {
}
// sound definition ID ?
for (const auto &_slot : _slots) {
- if (_slot.busy && _slot.sndDef->getId() == id) {
+ if (_slot.busy && ((_slot.id == id) || (_slot.sndDef->getId() == id))) {
return g_twp->_mixer->isSoundHandleActive(_slot.handle);
}
}
@@ -102,8 +102,8 @@ void AudioSystem::fadeOut(int id, float fadeTime) {
stop(id);
} else {
for (int i = 0; i < NUM_AUDIO_SLOTS; i++) {
- if (_slots[i].busy && _slots[i].id == id) {
- _slots[i].fadeOutTimeMs = fadeTime;
+ if (_slots[i].busy && ((_slots[i].id == id) || (_slots[i].sndDef->getId() == id))) {
+ _slots[i].fadeOutTimeMs = fadeTime * 1000.f;
}
}
}
@@ -114,17 +114,19 @@ void AudioSystem::stop(int id) {
if (id >= 1 && id <= NUM_AUDIO_SLOTS) {
if (!_slots[id].busy)
return;
- id = g_twp->_mixer->getSoundID(_slots[id].handle);
+ _slots[id].loopTimes = 0;
+ _slots[id].busy = false;
+ g_twp->_mixer->stopHandle(_slots[id].handle);
+ return;
}
- // sound definition ID ?
- for (auto &_slot : _slots) {
- if (_slot.busy && _slot.sndDef->getId() == id) {
- _slot.loopTimes = 0;
- g_twp->_mixer->stopHandle(_slot.handle);
+ // sound ID or sound definition ID ?
+ for (auto &slot : _slots) {
+ if (slot.busy && ((slot.id == id) || (slot.sndDef->getId() == id))) {
+ slot.loopTimes = 0;
+ slot.busy = false;
+ g_twp->_mixer->stopHandle(slot.handle);
}
}
- // sound ID ?
- g_twp->_mixer->stopID(id);
}
void AudioSystem::setMasterVolume(float vol) {
@@ -155,6 +157,7 @@ void AudioSystem::updateVolume(AudioSlot *slot) {
}
if (progress > 1.0f) {
slot->loopTimes = 0;
+ slot->busy = false;
g_twp->_mixer->stopHandle(slot->handle);
return;
}
Commit: fefb90dc6f7a80ead5d7fa568a9901727f8a9761
https://github.com/scummvm/scummvm/commit/fefb90dc6f7a80ead5d7fa568a9901727f8a9761
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Fix temporary objects still visible
Changed paths:
engines/twp/twp.cpp
diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp
index f48e1dc112a..10e4bee0866 100644
--- a/engines/twp/twp.cpp
+++ b/engines/twp/twp.cpp
@@ -1355,6 +1355,7 @@ void TwpEngine::exitRoom(Common::SharedPtr<Room> nextRoom) {
for (auto it = layer->_objects.begin(); it != layer->_objects.end();) {
Common::SharedPtr<Object> obj(*it);
if (obj->_temporary) {
+ obj->_node->remove();
it = layer->_objects.erase(it);
continue;
} else if (g_twp->_resManager->isActor(obj->getId()) && _actor != obj) {
Commit: dc8552bb050233f5d268c5041059706be724b4ff
https://github.com/scummvm/scummvm/commit/dc8552bb050233f5d268c5041059706be724b4ff
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Walkspeed is too slow
Changed paths:
engines/twp/motor.cpp
diff --git a/engines/twp/motor.cpp b/engines/twp/motor.cpp
index d2205ec1f7a..6d104728524 100644
--- a/engines/twp/motor.cpp
+++ b/engines/twp/motor.cpp
@@ -191,7 +191,9 @@ WalkTo::WalkTo(Common::SharedPtr<Object> obj, Math::Vector2d dest, int facing)
_path = {obj->_node->getAbsPos(), dest};
}
- _wsd = sqrt(obj->_walkSpeed.getX() * obj->_walkSpeed.getX() + obj->_walkSpeed.getY() * obj->_walkSpeed.getY());
+ // don't know yet why walkspeed is so slow, so I cheat
+ Math::Vector2d walkSpeed = obj->_walkSpeed * 2;
+ _wsd = sqrt(walkSpeed.getX() * walkSpeed.getX() + walkSpeed.getY() * walkSpeed.getY());
if (sqrawexists(obj->_table, "preWalking"))
sqcall(obj->_table, "preWalking");
}
Commit: 48a5f1eb523278749598b36da2f96b1d33ebe3db
https://github.com/scummvm/scummvm/commit/48a5f1eb523278749598b36da2f96b1d33ebe3db
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Improve savegame speed
Changed paths:
engines/twp/savegame.cpp
engines/twp/twp.cpp
engines/twp/twp.h
diff --git a/engines/twp/savegame.cpp b/engines/twp/savegame.cpp
index 3efd4a9de92..31ea5b691ee 100644
--- a/engines/twp/savegame.cpp
+++ b/engines/twp/savegame.cpp
@@ -20,6 +20,7 @@
*/
#include "common/btea.h"
+#include "common/debug-channels.h"
#include "common/savefile.h"
#include "twp/callback.h"
#include "twp/detection.h"
@@ -387,10 +388,9 @@ static int32 computeHash(byte *data, size_t n) {
bool SaveGameManager::loadGame(const SaveGame &savegame) {
// dump savegame as json
- // Common::OutSaveFile *saveFile = g_twp->getSaveFileManager()->openForSaving("load.json", false);
- // Common::String s = savegame.jSavegame->stringify(true);
- // saveFile->write(s.c_str(), s.size());
- // saveFile->finalize();
+ if (!(DebugMan.isDebugChannelEnabled(kDebugGame))) {
+ debugC(kDebugGame, "load game: %s", savegame.jSavegame->stringify().c_str());
+ }
const Common::JSONObject &json = savegame.jSavegame->asObject();
long long int version = json["version"]->asIntegerNumber();
@@ -399,8 +399,6 @@ bool SaveGameManager::loadGame(const SaveGame &savegame) {
return false;
}
- debugC(kDebugGame, "load game: %s", savegame.jSavegame->stringify().c_str());
-
sqcall("preLoad");
loadGameScene(json["gameScene"]->asObject());
loadDialog(json["dialog"]->asObject());
@@ -413,7 +411,7 @@ bool SaveGameManager::loadGame(const SaveGame &savegame) {
g_twp->setTotalPlayTime(savegame.gameTime * 1000);
g_twp->_inputState.setState((InputStateFlag)json["inputState"]->asIntegerNumber());
loadObjects(json["objects"]->asObject());
- g_twp->setRoom(room(json["currentRoom"]->asString()));
+ g_twp->setRoom(room(json["currentRoom"]->asString()), true);
setActor(json["selectedActor"]->asString());
if (g_twp->_actor)
g_twp->cameraAt(g_twp->_actor->_node->getPos());
@@ -421,7 +419,7 @@ bool SaveGameManager::loadGame(const SaveGame &savegame) {
HSQUIRRELVM v = g_twp->getVm();
sqsetf(sqrootTbl(v), "SAVEBUILD", static_cast<int>(json["savebuild"]->asIntegerNumber()));
- for(auto a : g_twp->_actors) {
+ for (auto a : g_twp->_actors) {
if (sqrawexists(a->_table, "postLoad")) {
sqcall(a->_table, "postLoad");
}
@@ -941,36 +939,36 @@ static Common::JSONValue *createJObject(HSQOBJECT &table, Common::SharedPtr<Obje
return new Common::JSONValue(json);
}
-static void fillObjects(const Common::String &k, HSQOBJECT &v, void *data) {
- Common::JSONObject *jObj = static_cast<Common::JSONObject *>(data);
- if (g_twp->_resManager->isObject(getId(v))) {
- Common::SharedPtr<Object> obj(sqobj(v));
- if (!obj || (obj->_objType == otNone)) {
- // info fmt"obj: createJObject({k})"
- (*jObj)[k] = createJObject(v, obj);
+static Common::JSONValue* createJObjects() {
+ Common::JSONObject json;
+ // sqgetpairs(sqrootTbl(g_twp->getVm()), fillObjects, &json);
+ for (auto &room : g_twp->_rooms) {
+ for (auto &layer : room->_layers) {
+ for (auto &obj : layer->_objects) {
+ if (obj->_objType != ObjectType::otNone)
+ continue;
+ if (obj->_room && obj->_room->_pseudo)
+ continue;
+ json[obj->_key] = createJObject(obj->_table, obj);
+ }
}
}
-}
-
-static Common::JSONValue *createJObjects() {
- Common::JSONObject json;
- sqgetpairs(sqrootTbl(g_twp->getVm()), fillObjects, &json);
// result.fields.sort(cmpKey)
return new Common::JSONValue(json);
}
-static void fillPseudoObjects(const Common::String &k, HSQOBJECT &v, void *data) {
- Common::JSONObject *jObj = static_cast<Common::JSONObject *>(data);
- if (g_twp->_resManager->isObject(getId(v))) {
- Common::SharedPtr<Object> obj(sqobj(v));
- // info fmt"pseudoObj: createJObject({k})"
- (*jObj)[k] = createJObject(v, obj);
+static Common::JSONValue* createJPseudoObjects(Common::SharedPtr<Room> room) {
+ Common::JSONObject json;
+ for (auto &layer : room->_layers) {
+ for (auto &obj : layer->_objects) {
+ if (obj->_objType != ObjectType::otNone)
+ continue;
+ if (obj->_room && obj->_room->_pseudo)
+ continue;
+ json[obj->_key] = createJObject(obj->_table, obj);
+ }
}
-}
-static Common::JSONValue *createJPseudoObjects(Common::SharedPtr<Room> room) {
- Common::JSONObject json;
- sqgetpairs(room->_table, fillPseudoObjects, &json);
// result.fields.sort(cmpKey)
return new Common::JSONValue(json);
}
@@ -1021,13 +1019,9 @@ void SaveGameManager::saveGame(Common::WriteStream *ws) {
sqcall("preSave");
Common::JSONValue *data = createSaveGame();
- debugC(kDebugGame, "save game: %s", data->stringify().c_str());
-
- // dump savegame as json
- // Common::OutSaveFile *saveFile = g_twp->getSaveFileManager()->openForSaving("save.json", false);
- // Common::String s = data->stringify(true);
- // saveFile->write(s.c_str(), s.size());
- // saveFile->finalize();
+ if (!(DebugMan.isDebugChannelEnabled(kDebugGame))) {
+ debugC(kDebugGame, "save game: %s", data->stringify().c_str());
+ }
const uint32 fullSize = 500000;
Common::Array<byte> buffer(fullSize + 16);
diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp
index 10e4bee0866..828d091c572 100644
--- a/engines/twp/twp.cpp
+++ b/engines/twp/twp.cpp
@@ -1381,8 +1381,8 @@ void TwpEngine::exitRoom(Common::SharedPtr<Room> nextRoom) {
}
}
-void TwpEngine::setRoom(Common::SharedPtr<Room> room) {
- if (room && _room != room)
+void TwpEngine::setRoom(Common::SharedPtr<Room> room, bool force) {
+ if (room && ((_room != room) || force))
enterRoom(room);
}
diff --git a/engines/twp/twp.h b/engines/twp/twp.h
index 500bbf59bef..412b078c7df 100644
--- a/engines/twp/twp.h
+++ b/engines/twp/twp.h
@@ -144,7 +144,7 @@ public:
void actorEnter(Common::SharedPtr<Object> actor);
void actorExit(Common::SharedPtr<Object> actor);
Common::SharedPtr<Room> defineRoom(const Common::String &name, HSQOBJECT table, bool pseudo = false);
- void setRoom(Common::SharedPtr<Room> room);
+ void setRoom(Common::SharedPtr<Room> room, bool force = false);
void enterRoom(Common::SharedPtr<Room> room, Common::SharedPtr<Object> door = nullptr);
void cameraAt(Math::Vector2d at);
Commit: 2a25921de027bf69af376fe74617248ac4aa7ef9
https://github.com/scummvm/scummvm/commit/2a25921de027bf69af376fe74617248ac4aa7ef9
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Fix head is disappearing sometimes
Changed paths:
engines/twp/object.cpp
diff --git a/engines/twp/object.cpp b/engines/twp/object.cpp
index 3d93cca71b4..4df8ea1f00b 100644
--- a/engines/twp/object.cpp
+++ b/engines/twp/object.cpp
@@ -33,9 +33,9 @@
namespace Twp {
static float getVerbDist(VerbId verb) {
- if(verb.id == VERB_TALKTO)
+ if (verb.id == VERB_TALKTO)
return MIN_TALK_DIST;
- if(verb.id == VERB_GIVE)
+ if (verb.id == VERB_GIVE)
return MIN_GIVE_DIST;
return MIN_USE_DIST;
}
@@ -510,18 +510,16 @@ void Object::stopWalking() {
}
void Object::setAnimationNames(const Common::String &head, const Common::String &stand, const Common::String &walk, const Common::String &reach) {
- if (!head.empty()) {
- for (int i = 1; i <= 6; i++) {
- showLayer(Common::String::format("%s%d", getAnimName(HEAD_ANIMNAME).c_str(), i), true);
- }
- _animNames[HEAD_ANIMNAME] = head;
- setHeadIndex(1);
- }
+ if (!head.empty())
+ setHeadIndex(0);
+ _animNames[HEAD_ANIMNAME] = head;
+ showLayer(_animNames[HEAD_ANIMNAME], true);
+ setHeadIndex(1);
if (!stand.empty())
_animNames[STAND_ANIMNAME] = stand;
if (!walk.empty())
_animNames[WALK_ANIMNAME] = walk;
- if (!reach.empty())
+ if (!walk.empty())
_animNames[REACH_ANIMNAME] = reach;
if (isWalking())
play(getAnimName(WALK_ANIMNAME), true);
@@ -809,13 +807,14 @@ void Object::jiggle(float amount) {
}
void Object::inventoryScrollUp() {
- if(_inventoryOffset == 0) return;
+ if (_inventoryOffset == 0)
+ return;
_inventoryOffset--;
}
void Object::inventoryScrollDown() {
_inventoryOffset++;
- _inventoryOffset = CLIP(_inventoryOffset, 0, MAX(0, ((int)_inventory.size() - 5) / 4));
+ _inventoryOffset = CLIP(_inventoryOffset, 0, MAX(0, ((int)_inventory.size() - 5) / 4));
}
void TalkingState::say(const Common::StringArray &texts, Common::SharedPtr<Object> obj) {
Commit: 7ca277f356dbe3fd10a724d741a8ffc559520691
https://github.com/scummvm/scummvm/commit/7ca277f356dbe3fd10a724d741a8ffc559520691
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Fix wrong DLC detection + add dialog
Changed paths:
engines/twp/twp.cpp
diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp
index 828d091c572..0e5fe50ab4c 100644
--- a/engines/twp/twp.cpp
+++ b/engines/twp/twp.cpp
@@ -24,10 +24,12 @@
#include "common/config-manager.h"
#include "common/events.h"
#include "common/savefile.h"
+#include "common/translation.h"
#include "engines/util.h"
#include "graphics/cursorman.h"
#include "graphics/screen.h"
#include "graphics/opengl/system_headers.h"
+#include "gui/message.h"
#include "image/png.h"
#include "twp/twp.h"
@@ -758,8 +760,9 @@ void TwpEngine::updateSettingVars() {
_resManager->resetSaylineFont();
sqcall("setSettingVar", "toilet_paper_over", ConfMan.getBool("toiletPaperOver"));
sqcall("setSettingVar", "annoying_injokes", ConfMan.getBool("annoyingInJokes"));
- if (ConfMan.getBool("ransomeUnbeeped") && _pack->containsDLC()) {
- warning("You selected Ransome *unbeeped* (DLC) but the DLC has not been detected!");
+ if (ConfMan.getBool("ransomeUnbeeped") && !_pack->containsDLC()) {
+ GUI::MessageDialog alert(_("You selected Ransome *unbeeped* (DLC) but the DLC has not been detected!"));
+ Engine::runDialog(alert);
}
sqcall("setSettingVar", "ransome_unbeeped", ConfMan.getBool("ransomeUnbeeped") && _pack->containsDLC());
}
Commit: 2ad9635b43a1d8d207891dbf5f900cf185e7fa9f
https://github.com/scummvm/scummvm/commit/2ad9635b43a1d8d207891dbf5f900cf185e7fa9f
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Fix wrong anim when talking
Changed paths:
engines/twp/motor.cpp
diff --git a/engines/twp/motor.cpp b/engines/twp/motor.cpp
index 6d104728524..482a8c3f1e1 100644
--- a/engines/twp/motor.cpp
+++ b/engines/twp/motor.cpp
@@ -451,7 +451,7 @@ void Talking::say(const Common::String &text) {
if (!txt.empty() && txt[0] == '{') {
uint32 i = txt.find('}');
if (i != Common::String::npos) {
- state = txt.substr(1, txt.size() - 2);
+ state = txt.substr(1, i - 1);
debugC(kDebugGame, "Set state from anim '%s'", state.c_str());
if (state != "notalk") {
_obj->play(state);
Commit: 6446cd8597f5e1fc2d66eccf0b494f7a2df2b1da
https://github.com/scummvm/scummvm/commit/6446cd8597f5e1fc2d66eccf0b494f7a2df2b1da
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Allow default verb with walkto
Changed paths:
engines/twp/twp.cpp
diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp
index 0e5fe50ab4c..2e5b696fc48 100644
--- a/engines/twp/twp.cpp
+++ b/engines/twp/twp.cpp
@@ -388,7 +388,7 @@ struct GetNoun {
}
bool operator()(Common::SharedPtr<Object> obj) {
- if (((_verbId == VERB_TALKTO) || !g_twp->_resManager->isActor(obj->getId())) && (obj->_node->getZSort() <= _zOrder)) {
+ if (((_verbId == VERB_TALKTO) || (_verbId == VERB_WALKTO) || !g_twp->_resManager->isActor(obj->getId())) && (obj->_node->getZSort() <= _zOrder)) {
_noun = obj;
_zOrder = obj->_node->getZSort();
}
Commit: ff1445f77c99d693c01ae3067e517294b3136f66
https://github.com/scummvm/scummvm/commit/ff1445f77c99d693c01ae3067e517294b3136f66
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Revert painful lockMouse
Changed paths:
engines/twp/twp.cpp
engines/twp/twp.h
diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp
index 2e5b696fc48..df969325cf9 100644
--- a/engines/twp/twp.cpp
+++ b/engines/twp/twp.cpp
@@ -822,7 +822,6 @@ Common::Error TwpEngine::run() {
_textDb->parseTsv(entry);
CursorMan.showMouse(false);
- g_system->lockMouse(true);
_vm.reset(new Vm());
HSQUIRRELVM v = _vm->get();
@@ -1773,11 +1772,6 @@ int TwpEngine::runDialog(GUI::Dialog &dialog) {
return result;
}
-void TwpEngine::pauseEngineIntern(bool pause) {
- // Unlock the mouse so that the cursor is usable when the GMM opens
- _system->lockMouse(!debugChannelSet(-1, kDebugConsole) && !pause);
-}
-
ScalingTrigger::ScalingTrigger(Common::SharedPtr<Object> obj, Scaling *scaling) : _obj(obj), _scaling(scaling) {}
} // End of namespace Twp
diff --git a/engines/twp/twp.h b/engines/twp/twp.h
index 412b078c7df..8af4dd439b2 100644
--- a/engines/twp/twp.h
+++ b/engines/twp/twp.h
@@ -182,7 +182,6 @@ private:
ActorSwitcherSlot actorSwitcherSlot(ActorSlot *slot);
Scaling *getScaling(const Common::String &name);
void skipCutscene();
- void pauseEngineIntern(bool pause) override;
private:
unique_ptr<Vm> _vm;
Commit: eca34b2ca2a8b30e6a2ab97e14050b2d199923cc
https://github.com/scummvm/scummvm/commit/eca34b2ca2a8b30e6a2ab97e14050b2d199923cc
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Remove statics in TwpEngine
Changed paths:
engines/twp/twp.cpp
engines/twp/twp.h
diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp
index df969325cf9..78d5263f0e0 100644
--- a/engines/twp/twp.cpp
+++ b/engines/twp/twp.cpp
@@ -840,9 +840,6 @@ Common::Error TwpEngine::run() {
updateSettingVars();
- static int speed = 1;
- static bool control = false;
-
// Simple event handling loop
Common::Event e;
uint time = _system->getMillis();
@@ -922,13 +919,13 @@ Common::Error TwpEngine::run() {
case Common::EVENT_KEYDOWN:
switch (e.kbd.keycode) {
case Common::KEYCODE_LEFT:
- speed = MAX(speed - 1, 1);
+ _speed = MAX(_speed - 1, 1);
break;
case Common::KEYCODE_RIGHT:
- speed = MIN(speed + 1, 8);
+ _speed = MIN(_speed + 1, 8);
break;
case Common::KEYCODE_LCTRL:
- control = true;
+ _control = true;
break;
default:
break;
@@ -937,10 +934,10 @@ Common::Error TwpEngine::run() {
case Common::EVENT_KEYUP:
switch (e.kbd.keycode) {
case Common::KEYCODE_LCTRL:
- control = false;
+ _control = false;
break;
case Common::KEYCODE_w:
- if (control) {
+ if (_control) {
WalkboxMode mode = (WalkboxMode)(((int)_walkboxNode->getMode() + 1) % 3);
debugC(kDebugGame, "set walkbox mode to: %s", (mode == WalkboxMode::Merged ? "merged" : mode == WalkboxMode::All ? "all"
: "none"));
@@ -948,7 +945,7 @@ Common::Error TwpEngine::run() {
}
break;
case Common::KEYCODE_g:
- if (control) {
+ if (_control) {
PathMode mode = (PathMode)(((int)_pathNode->getMode() + 1) % 3);
debugC(kDebugGame, "set path mode to: %s", (mode == PathMode::GraphMode ? "graph" : mode == PathMode::All ? "all"
: "none"));
@@ -1001,7 +998,7 @@ Common::Error TwpEngine::run() {
uint32 newTime = _system->getMillis();
uint32 delta = newTime - time;
time = newTime;
- update(speed * delta / 1000.f);
+ update(_speed * delta / 1000.f);
draw();
_cursor.update();
diff --git a/engines/twp/twp.h b/engines/twp/twp.h
index 8af4dd439b2..0e2381e5b94 100644
--- a/engines/twp/twp.h
+++ b/engines/twp/twp.h
@@ -250,6 +250,8 @@ private:
unique_ptr<Shader> _bwShader;
unique_ptr<Shader> _ghostShader;
unique_ptr<Shader> _sepiaShader;
+ int _speed = 1;
+ bool _control = false;
};
extern TwpEngine *g_twp;
Commit: 8f8a833eb6c6a72d3d21e831d57f6bdf1f981c75
https://github.com/scummvm/scummvm/commit/8f8a833eb6c6a72d3d21e831d57f6bdf1f981c75
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
TWP: Fix some dialog without speech
Changed paths:
engines/twp/motor.cpp
diff --git a/engines/twp/motor.cpp b/engines/twp/motor.cpp
index 482a8c3f1e1..519b454dfe4 100644
--- a/engines/twp/motor.cpp
+++ b/engines/twp/motor.cpp
@@ -403,7 +403,22 @@ void Talking::say(const Common::String &text) {
Common::String txt(text);
if (txt[0] == '$') {
- txt = g_twp->getTextDb().getText(txt);
+ HSQUIRRELVM v = g_twp->getVm();
+ SQInteger top = sq_gettop(v);
+ sq_pushroottable(v);
+ Common::String code(Common::String::format("return %s", text.substr(1, text.size() - 1).c_str()));
+ if (SQ_FAILED(sq_compilebuffer(v, code.c_str(), code.size(), "execCode", SQTrue))) {
+ error("Error executing code %s", code.c_str());
+ } else {
+ sq_push(v, -2);
+ // call
+ if (SQ_FAILED(sq_call(v, 1, SQTrue, SQTrue))) {
+ error("Error calling code %s", code.c_str());
+ } else {
+ sqget(v, -1, txt);
+ sq_settop(v, top);
+ }
+ }
}
if (txt[0] == '@') {
int id = atoi(txt.c_str() + 1);
Commit: ab17f10a6fd0209d80d42fb8d9d150e9c2220887
https://github.com/scummvm/scummvm/commit/ab17f10a6fd0209d80d42fb8d9d150e9c2220887
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-17T13:09:32+01:00
Commit Message:
BACKENDS: Try to fix imgui compilation errors
Changed paths:
backends/module.mk
diff --git a/backends/module.mk b/backends/module.mk
index 00d3461ceb5..8acd0369f40 100644
--- a/backends/module.mk
+++ b/backends/module.mk
@@ -493,10 +493,16 @@ MODULE_OBJS += \
imgui/imgui.o \
imgui/imgui_draw.o \
imgui/imgui_widgets.o \
- imgui/imgui_tables.o \
+ imgui/imgui_tables.o
+endif
+
+ifdef USE_SDL2
+ifdef USE_IMGUI
+MODULE_OBJS += \
imgui/backends/imgui_impl_opengl3_scummvm.o \
imgui/backends/imgui_impl_sdl2_scummvm.o
endif
+endif
# Include common rules
include $(srcdir)/rules.mk
More information about the Scummvm-git-logs
mailing list