[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