[Scummvm-git-logs] scummvm master -> f6ec55a697eeb1d8e30247211db18fd9021ec852

sev- noreply at scummvm.org
Thu Sep 11 22:48:54 UTC 2025


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

Summary:
aabc251133 DIRECTOR: DT: Parse and display Sprite Behaviors in Channels window
f6ec55a697 DIRECTOR: DT: Display sprite name in Channels window


Commit: aabc25113317db744f74fb9d9f84955065c51ea8
    https://github.com/scummvm/scummvm/commit/aabc25113317db744f74fb9d9f84955065c51ea8
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-12T00:48:24+02:00

Commit Message:
DIRECTOR: DT: Parse and display Sprite Behaviors in Channels window

Changed paths:
    engines/director/debugger/dt-score.cpp
    engines/director/score.cpp
    engines/director/score.h


diff --git a/engines/director/debugger/dt-score.cpp b/engines/director/debugger/dt-score.cpp
index e3b576bb962..52678ab679a 100644
--- a/engines/director/debugger/dt-score.cpp
+++ b/engines/director/debugger/dt-score.cpp
@@ -19,6 +19,8 @@
  *
  */
 
+#include "common/memstream.h"
+
 #include "backends/imgui/IconsMaterialSymbols.h"
 #include "director/director.h"
 #include "director/debugger/dt-internal.h"
@@ -768,7 +770,11 @@ void showChannels() {
 			ImGui::TableSetupColumn("type", flags);
 			ImGui::TableSetupColumn("fg", flags);
 			ImGui::TableSetupColumn("bg", flags);
-			ImGui::TableSetupColumn("script", flags);
+			if (score->_version >= kFileVer600) {
+				ImGui::TableSetupColumn("behaviors", flags);
+			} else {
+				ImGui::TableSetupColumn("script", flags);
+			}
 			ImGui::TableSetupColumn("colorcode", flags);
 			ImGui::TableSetupColumn("blendAmount", flags);
 			ImGui::TableSetupColumn("unk3", flags);
@@ -861,13 +867,38 @@ void showChannels() {
 					ImGui::ColorButton("backColor", convertColor(sprite._backColor));
 					ImGui::PopID();
 					ImGui::TableNextColumn();
-					// Check early for non integer script ids
-					if (sprite._scriptId.member) {
-						displayScriptRef(sprite._scriptId);
+
+					if (score->_version >= kFileVer600) {
+						// Check early for non integer script ids
+						if (sprite._spriteListIdx) {
+							Common::MemoryReadStreamEndian *stream = score->getSpriteDetailsStream(sprite._spriteListIdx + 1);
+
+							if (stream) {
+								BehaviorElement behavior;
+								while (stream->pos() < stream->size()) {
+									behavior.read(*stream);
+									displayScriptRef(behavior.memberID);
+									ImGui::SameLine();
+									ImGui::Text(",%d", behavior.initOffset);
+								}
+							} else {
+								ImGui::Text(" ");
+							}
+							delete stream;
+						} else {
+							ImGui::PushID(i + 1);
+							ImGui::TextUnformatted("  ");
+							ImGui::PopID();
+						}
 					} else {
-						ImGui::PushID(i + 1);
-						ImGui::TextUnformatted("  ");
-						ImGui::PopID();
+						// Check early for non integer script ids
+						if (sprite._scriptId.member) {
+							displayScriptRef(sprite._scriptId);
+						} else {
+							ImGui::PushID(i + 1);
+							ImGui::TextUnformatted("  ");
+							ImGui::PopID();
+						}
 					}
 					ImGui::TableNextColumn();
 					ImGui::Text("0x%x", sprite._colorcode);
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 06e526dc2fc..2bdccb2fda1 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1770,18 +1770,22 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 		int32 listSize = (int32)_framesStream->readUint32();
 		int32 maxDataLen = (int32)_framesStream->readUint32();
 
-		debugC(1, kDebugLoading, "Score::loadFrames(): numEntries: %d, maxVar: %d, maxDataLen: 0x%x",
+		debugC(1, kDebugLoading, "Score::loadFrames(): Sprite Details: numEntries: %d, maxVar: %d, maxDataLen: 0x%x",
 			numEntries, listSize, maxDataLen);
 
 		// 3 * 4 = 3 int32 from above
 		_indexStart = listStart + 3 * 4;
 		_frameDataOffset = _indexStart + listSize * 4;
 
+		_spriteDetailOffsets.resize(numEntries);
+
 		int prevOff = 0;
 		for (int i = 0; i < numEntries; i++) {
 			uint32 off = _framesStream->readUint32();
+			_spriteDetailOffsets[i] = _frameDataOffset + off;
+
 			if (i > 0) {
-				debugC(2, kDebugLoading, "  Score::loadFrames(): entry %d offset: 0x%x (%d) -> 0x%x, size: %d",
+				debugC(2, kDebugLoading, "  Detail entry %d offset: 0x%x (%d) -> 0x%x, size: %d",
 					i - 1, prevOff, prevOff, _frameDataOffset + prevOff, off - prevOff);
 			}
 			prevOff = off;
@@ -2248,4 +2252,25 @@ uint32 Score::getVWSCResourceSize() {
 	return _firstFramePosition + framesSize;
 }
 
+Common::MemoryReadStreamEndian *Score::getSpriteDetailsStream(int spriteIdx) {
+	Common::MemoryReadStreamEndian *stream = nullptr;
+
+	if (!_framesStream || _spriteDetailOffsets.size() == 0)
+		return nullptr;
+
+	if (spriteIdx >= 0 && spriteIdx < _spriteDetailOffsets.size() - 1) {
+		uint32 size = _spriteDetailOffsets[spriteIdx + 1] - _spriteDetailOffsets[spriteIdx];
+
+		if (!size)
+			return nullptr;
+
+		byte *data = new byte[size];
+		_framesStream->seek(_spriteDetailOffsets[spriteIdx], SEEK_SET);
+		_framesStream->read(data, size);
+		stream = new Common::MemoryReadStreamEndian(data, size, _framesStream->isBE(), DisposeAfterUse::YES);
+	}
+
+	return stream;
+}
+
 } // End of namespace Director
diff --git a/engines/director/score.h b/engines/director/score.h
index 2011278b062..9a7b5bd6287 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -63,7 +63,13 @@ struct Label {
 
 struct BehaviorElement {
 	CastMemberID memberID;
-	int32 initOffset;
+	int32 initOffset = 0;
+
+	void read(Common::ReadStreamEndian &stream) {
+		memberID.member = (int16)stream.readUint16();
+		memberID.castLib = (int16)stream.readUint16();
+		initOffset = (int32)stream.readUint32();
+	}
 };
 
 class Score {
@@ -147,6 +153,8 @@ public:
 	Common::String formatChannelInfo();
 	bool processFrozenPlayScript();
 
+	Common::MemoryReadStreamEndian *getSpriteDetailsStream(int spriteIdx);
+
 private:
 	bool isWaitingForNextFrame();
 	void updateCurrentFrame();
@@ -218,6 +226,8 @@ public:
 	CursorRef _currentCursor;
 	bool _skipTransition;
 
+	Common::Array<uint32> _spriteDetailOffsets;
+
 private:
 	DirectorEngine *_vm;
 	Lingo *_lingo;


Commit: f6ec55a697eeb1d8e30247211db18fd9021ec852
    https://github.com/scummvm/scummvm/commit/f6ec55a697eeb1d8e30247211db18fd9021ec852
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-12T00:48:24+02:00

Commit Message:
DIRECTOR: DT: Display sprite name in Channels window

Changed paths:
    engines/director/debugger/dt-score.cpp


diff --git a/engines/director/debugger/dt-score.cpp b/engines/director/debugger/dt-score.cpp
index 52678ab679a..c48a279b352 100644
--- a/engines/director/debugger/dt-score.cpp
+++ b/engines/director/debugger/dt-score.cpp
@@ -755,7 +755,13 @@ void showChannels() {
 		ImGui::Text("SND: 2  sound2: %d, soundType2: %d", frame._mainChannels.sound2.member, frame._mainChannels.soundType2);
 		ImGui::Text("LSCR:   actionId: %s", frame._mainChannels.actionId.asString().c_str());
 
-		if (ImGui::BeginTable("Channels", 22, ImGuiTableFlags_Borders | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg)) {
+		int columns = 22;
+
+		if (score->_version >= kFileVer600) {
+			columns += 1; // sprite name
+		}
+
+		if (ImGui::BeginTable("Channels", columns, ImGuiTableFlags_Borders | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg)) {
 			ImGuiTableFlags flags = ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_AngledHeader;
 			ImGui::TableSetupColumn("##toggle", flags);
 			ImGui::TableSetupColumn("CH", flags);
@@ -775,6 +781,8 @@ void showChannels() {
 			} else {
 				ImGui::TableSetupColumn("script", flags);
 			}
+			if (score->_version >= kFileVer600)
+				ImGui::TableSetupColumn("name", flags);
 			ImGui::TableSetupColumn("colorcode", flags);
 			ImGui::TableSetupColumn("blendAmount", flags);
 			ImGui::TableSetupColumn("unk3", flags);
@@ -869,7 +877,6 @@ void showChannels() {
 					ImGui::TableNextColumn();
 
 					if (score->_version >= kFileVer600) {
-						// Check early for non integer script ids
 						if (sprite._spriteListIdx) {
 							Common::MemoryReadStreamEndian *stream = score->getSpriteDetailsStream(sprite._spriteListIdx + 1);
 
@@ -900,6 +907,20 @@ void showChannels() {
 							ImGui::PopID();
 						}
 					}
+
+					if (score->_version >= kFileVer600) {
+						ImGui::TableNextColumn();
+						if (sprite._spriteListIdx) {
+							Common::MemoryReadStreamEndian *stream = score->getSpriteDetailsStream(sprite._spriteListIdx + 2);
+							Common::String name;
+							if (stream)
+								name = stream->readPascalString();
+							ImGui::Text("%s", name.c_str());
+						} else {
+							ImGui::Text(" ");
+						}
+					}
+
 					ImGui::TableNextColumn();
 					ImGui::Text("0x%x", sprite._colorcode);
 					ImGui::TableNextColumn();




More information about the Scummvm-git-logs mailing list