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

sev- noreply at scummvm.org
Sat May 25 14:25:23 UTC 2024


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

Summary:
ac9a37955c DIRECTOR: Update detection tables for digby
c83699ba50 DIRECTOR: Add detection entry for nikolaitrains
41cea48a9e DIRECTOR: Reset sprite contents when loading frames from start
ff7cdff562 DIRECTOR: Ensure channel sprite information is up to date


Commit: ac9a37955cf065d922eb9135940abca6f15df163
    https://github.com/scummvm/scummvm/commit/ac9a37955cf065d922eb9135940abca6f15df163
Author: Scott Percival (code at moral.net.au)
Date: 2024-05-25T16:25:18+02:00

Commit Message:
DIRECTOR: Update detection tables for digby

Changed paths:
    engines/director/detection_tables.h


diff --git a/engines/director/detection_tables.h b/engines/director/detection_tables.h
index 42204dba67b..300bf5e03b7 100644
--- a/engines/director/detection_tables.h
+++ b/engines/director/detection_tables.h
@@ -2451,8 +2451,8 @@ static const DirectorGameDescription gameDescriptions[] = {
 
 	MACGAME1_l("delphinokioku", "", "DELPHOI", "957b631d36a03be6c4671981a0b81681", 309951, Common::JA_JPN, 310),
 
-	MACGAME1("digby", "", "Start Digby's Adventures!", "7f443f2e63fd497a9ad85b10dc880a91", 383758, 313),
-	WINGAME1("digby", "", "DIGBY.EXE", "65d06b5fef155a2473434571aff5bc29", 370972, 310),
+	MACGAME1("digby", "", "Start Digby's Adventures!", "tr:394cff701f7eb8d7025c460d8750c2bc", 383502, 313),
+	WINGAME1("digby", "", "IADLDATA/DIGBY.EXE", "t:b62409eab5a466748e5817a22c030460", 370972, 310),
 
 	// Original filename is 恐竜サファリアドベンチャー デモ
 	// Full version isn't Director


Commit: c83699ba50a2c52981ec07c9a13c0abc9d68d6fc
    https://github.com/scummvm/scummvm/commit/c83699ba50a2c52981ec07c9a13c0abc9d68d6fc
Author: Scott Percival (code at moral.net.au)
Date: 2024-05-25T16:25:18+02:00

Commit Message:
DIRECTOR: Add detection entry for nikolaitrains

Changed paths:
    engines/director/detection_tables.h


diff --git a/engines/director/detection_tables.h b/engines/director/detection_tables.h
index 300bf5e03b7..1ddf3a677f5 100644
--- a/engines/director/detection_tables.h
+++ b/engines/director/detection_tables.h
@@ -345,6 +345,7 @@ static const PlainGameDescriptor directorGames[] = {
 	{ "nikolaispace",		"Nikolai in Outer Space" },
 	{ "nikolaispaceedu",	"Nikolai Space Education" },
 	{ "nikolaitoys",		"NN'nN Toy Makers" },
+	{ "nikolaitrains",		"Nikolai's Trains" },
 	{ "nikolaitreats",		"Nikolai's Treats" },
 	{ "nile",				"Nile: Passage to Egypt" },
 	{ "nine",				"9: The Last Resort" },
@@ -5017,6 +5018,17 @@ static const DirectorGameDescription gameDescriptions[] = {
 
 	WINDEMO1("newslinks", "Demo", "NEWS.EXE", "22900fa6922d71b1f880aa3cc0bbad1a", 16526563, 404),
 
+	// Published by GTE Interactive
+	MACGAME1("nightlight", "",	   "Night Light",  "r:0c7bbb4b24823e5ab871cb4c1d6f3710", 484028, 404),
+	WINGAME1("nightlight", "",	   "NIGHTMPC.EXE", "t:b09110b0631277f73bca40c3fdeb752f", 8081957, 404),
+	WINGAME1("nightlight", "Test", "MPC_TEST.EXE", "t:3063f5c6c2fe13eb7d6aac42724e6150", 8087955, 404),
+
+	MACDEMO1("nightsky", "Sampler", "Night Sky Interactive Sampler", "cbce20666bfe47a9533331c6be1e6039", 285269, 400),
+	WINDEMO1("nightsky", "Sampler", "NIGHTSKY.EXE", "68f1fe67a5881fd47b08e905401d174c", 4300149, 404),
+
+	// Original filename is Visual日本地理DEMO
+	MACDEMO1_l("nihonchiri", "Demo", "Visual Nihon Chiri DEMO", "8b138db44d4421cc7294a9dc792ccf1b", 306940, Common::JA_JPN, 402),
+
 	// Published by Corel CD Home. Later released as Nikolai's Knights.
 	// Original Mac filename is In the Time of the Knightsâ„¢
 	MACGAME2("nikolaiknights", "Corel", "xn--In the Time of the Knights-jf8p", "da0da5d543b237051975ad70bec129f4", 488222,
@@ -5029,16 +5041,8 @@ static const DirectorGameDescription gameDescriptions[] = {
 	MACGAME1("nikolaitoys", "", "NNNN/xn--NNnN Toy Makers-5w9hs4m", "2c7d0c0d55cbe3f622c7d68cedb671e0", 486770, 404),
 	WINGAME1("nikolaitoys", "", "NNNN/NNN_TOYS.EXE", "22147e4c6311f670f72d43f8b793169e", 3206640, 404),
 
-	// Published by GTE Interactive
-	MACGAME1("nightlight", "",	   "Night Light",  "r:0c7bbb4b24823e5ab871cb4c1d6f3710", 484028, 404),
-	WINGAME1("nightlight", "",	   "NIGHTMPC.EXE", "t:b09110b0631277f73bca40c3fdeb752f", 8081957, 404),
-	WINGAME1("nightlight", "Test", "MPC_TEST.EXE", "t:3063f5c6c2fe13eb7d6aac42724e6150", 8087955, 404),
-
-	MACDEMO1("nightsky", "Sampler", "Night Sky Interactive Sampler", "cbce20666bfe47a9533331c6be1e6039", 285269, 400),
-	WINDEMO1("nightsky", "Sampler", "NIGHTSKY.EXE", "68f1fe67a5881fd47b08e905401d174c", 4300149, 404),
-
-	// Original filename is Visual日本地理DEMO
-	MACDEMO1_l("nihonchiri", "Demo", "Visual Nihon Chiri DEMO", "8b138db44d4421cc7294a9dc792ccf1b", 306940, Common::JA_JPN, 402),
+	MACGAME1("nikolaitrains", "", "N_TRAINS/xn--Nikolais Trains-bx9hn4m", "tr:fb7bd24f704008c1aabe178f12d6b82d", 295270, 403),
+	WINGAME1("nikolaitrains", "", "N_TRAINS/N_TRAINS.EXE", "t:dd5e437851b7527c0f45a8a21ccd741a", 4598516, 404),
 
 	MACGAME1("nile", "", "Nile Passage to Egypt", "9765ad17bce6a2b40dd7f48377e82436", 512734, 404),
 	WINGAME2("nile", "", "NILE.EXE",	 "9b00cbba14f0a2e0445784ebacf62c78", 2846777,


Commit: 41cea48a9e3f277ab445bc40f14620907ff174f7
    https://github.com/scummvm/scummvm/commit/41cea48a9e3f277ab445bc40f14620907ff174f7
Author: Scott Percival (code at moral.net.au)
Date: 2024-05-25T16:25:18+02:00

Commit Message:
DIRECTOR: Reset sprite contents when loading frames from start

Fixes _blendAmount state leak in w_tonnel of Eastern Mind (activate the
magatama dragon, then look at the creature embedded in the wall).

Changed paths:
    engines/director/frame.cpp
    engines/director/score.cpp
    engines/director/sprite.cpp
    engines/director/sprite.h


diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp
index 749f49010cb..51a9003e6d9 100644
--- a/engines/director/frame.cpp
+++ b/engines/director/frame.cpp
@@ -267,7 +267,7 @@ void Frame::readSpriteD2(Common::MemoryReadStreamEndian &stream, uint16 offset,
 
 	uint16 fieldPosition = offset - spriteStart;
 
-	debugC(3, kDebugLoading, "Frame::readSpriteD2(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
+	debugC(5, kDebugLoading, "Frame::readSpriteD2(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
 	if (debugChannelSet(8, kDebugLoading)) {
 		stream.hexdump(size);
 	}
@@ -575,7 +575,7 @@ void Frame::readSpriteD4(Common::MemoryReadStreamEndian &stream, uint16 offset,
 
 	uint16 fieldPosition = offset - spriteStart;
 
-	debugC(3, kDebugLoading, "Frame::readSpriteD4(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
+	debugC(5, kDebugLoading, "Frame::readSpriteD4(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
 	if (debugChannelSet(8, kDebugLoading)) {
 		stream.hexdump(size);
 	}
@@ -877,7 +877,7 @@ void Frame::readSpriteD5(Common::MemoryReadStreamEndian &stream, uint16 offset,
 
 	uint16 fieldPosition = offset - spriteStart;
 
-	debugC(3, kDebugLoading, "Frame::readSpriteD5(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
+	debugC(5, kDebugLoading, "Frame::readSpriteD5(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
 	if (debugChannelSet(8, kDebugLoading)) {
 		stream.hexdump(size);
 	}
@@ -1075,7 +1075,7 @@ void Frame::readSpriteD6(Common::MemoryReadStreamEndian &stream, uint16 offset,
 
 	uint16 fieldPosition = offset - spriteStart;
 
-	debugC(3, kDebugLoading, "Frame::readSpriteD6(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
+	debugC(5, kDebugLoading, "Frame::readSpriteD6(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
 	if (debugChannelSet(8, kDebugLoading)) {
 		stream.hexdump(size);
 	}
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index a74744e78ce..7d44d519ca5 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1632,6 +1632,10 @@ bool Score::loadFrame(int frameNum, bool loadCast) {
 
 		// Reset position to start
 		_framesStream->seek(_firstFramePosition);
+
+		// Reset sprite contents
+		for (auto &it : _currentFrame->_sprites)
+			it->reset();
 	}
 
 	debugC(7, kDebugLoading, "****** Source frame %d to Destination frame %d, current offset %ld", sourceFrame, targetFrame, _framesStream->pos());
diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index e4eef5e1bd3..1a10df5d676 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -36,6 +36,13 @@ Sprite::Sprite(Frame *frame) {
 	_score = _frame ? _frame->getScore() : nullptr;
 	_movie = _score ? _score->getMovie() : nullptr;
 
+	_matte = nullptr;
+	_puppet = false;
+	_autoPuppet = kAPNone; // Based on Director in a Nutshell, page 15
+	reset();
+}
+
+void Sprite::reset() {
 	_scriptId = CastMemberID(0, 0);
 	_colorcode = 0;
 	_blendAmount = 0;
@@ -50,6 +57,8 @@ Sprite::Sprite(Frame *frame) {
 	_ink = kInkTypeCopy;
 	_trails = false;
 
+	if (_matte)
+		delete _matte;
 	_matte = nullptr;
 	_cast = nullptr;
 
@@ -58,8 +67,6 @@ Sprite::Sprite(Frame *frame) {
 	_height = 0;
 	_moveable = false;
 	_editable = false;
-	_puppet = false;
-	_autoPuppet = kAPNone; // Based on Director in a Nutshell, page 15
 	_immediate = false;
 	_backColor = g_director->_wm->_colorWhite;
 	_foreColor = g_director->_wm->_colorWhite;
diff --git a/engines/director/sprite.h b/engines/director/sprite.h
index ba3b1710fd8..1b44615747f 100644
--- a/engines/director/sprite.h
+++ b/engines/director/sprite.h
@@ -63,6 +63,8 @@ public:
 	Frame *getFrame() const { return _frame; }
 	Score *getScore() const { return _score; }
 
+	void reset();
+
 	void updateEditable();
 
 	bool respondsToMouse();


Commit: ff7cdff562e8de2760aa1dcf502fd2dc49c146ba
    https://github.com/scummvm/scummvm/commit/ff7cdff562e8de2760aa1dcf502fd2dc49c146ba
Author: Scott Percival (code at moral.net.au)
Date: 2024-05-25T16:25:18+02:00

Commit Message:
DIRECTOR: Ensure channel sprite information is up to date

Previously there was a gap between loading a new frame, and copying the
sprite information from that new frame back to the channels (if
required). Scripts could run in this gap, and in this case they would
be operating on the old sprite information instead of the new.

Score::renderFrame has been renamed to Score::updateFrame; the method
doesn't actually render anything, it reconciles the difference
between the frame data and the channel data, updates the channel data,
and produces a list of dirty rects.

Fixes the menu screen of Majestic: Alien Encounter.
Fixes director-tests/D4-unit/T_SPRT02 and T_SPRT03

Changed paths:
    engines/director/lingo/lingo-the.cpp
    engines/director/score.cpp
    engines/director/score.h
    engines/director/transitions.cpp


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index aba6e883705..8af10295156 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1160,7 +1160,7 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 		g_director->getCurrentWindow()->setStageColor(g_director->transformColor(d.asInt()));
 
 		// Redraw the stage
-		score->renderSprites(kRenderForceUpdate);
+		score->updateSprites(kRenderForceUpdate);
 		g_director->getCurrentWindow()->render();
 		break;
 	case kTheSwitchColorDepth:
@@ -1493,8 +1493,8 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
 					((DigitalVideoCastMember *)castMember)->setChannel(channel);
 					((DigitalVideoCastMember *)castMember)->startVideo();
 					// b_updateStage needs to have _videoPlayback set to render video
-					// in the regular case Score::renderSprites sets it.
-					// However Score::renderSprites is not in the current code path.
+					// in the regular case Score::updateSprites sets it.
+					// However Score::updateSprites is not in the current code path.
 					movie->_videoPlayback = true;
 				}
 			}
@@ -1655,7 +1655,7 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
 		break;
 	case kTheRect:
 		if (d.type == RECT || (d.type == ARRAY && d.u.farr->arr.size() >= 4)) {
-			score->renderSprites(kRenderForceUpdate);
+			score->updateSprites(kRenderForceUpdate);
 			channel->setBbox(
 				d.u.farr->arr[0].u.i, d.u.farr->arr[1].u.i,
 				d.u.farr->arr[2].u.i, d.u.farr->arr[3].u.i
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 7d44d519ca5..5d0ee32ee98 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -444,6 +444,9 @@ void Score::updateCurrentFrame() {
 
 		// this copies in the frame data and updates _curFrameNumber
 		loadFrame(nextFrameNumberToLoad, true);
+
+		// finally, update the channels and buffer any dirty rectangles
+		updateSprites();
 	}
 	return;
 }
@@ -677,12 +680,12 @@ void Score::renderFrame(uint16 frameId, RenderMode mode) {
 		_window->render();
 		_skipTransition = false;
 	} else if (g_director->_playbackPaused) {
-		renderSprites(mode);
+		updateSprites(mode);
 		_window->render();
 	} else if (!renderTransition(frameId, mode)) {
 		bool skip = renderPrePaletteCycle(mode);
 		setLastPalette();
-		renderSprites(mode);
+		updateSprites(mode);
 		_window->render();
 		if (!skip)
 			renderPaletteCycle(mode);
@@ -726,11 +729,11 @@ bool Score::renderTransition(uint16 frameId, RenderMode mode) {
 	return false;
 }
 
-void Score::renderSprites(RenderMode mode) {
+void Score::updateSprites(RenderMode mode) {
 	if (_window->_newMovieStarted)
 		mode = kRenderForceUpdate;
 
-	debugC(5, kDebugImages, "Score::renderSprites(): starting render cycle, mode %d", mode);
+	debugC(5, kDebugImages, "Score::updateSprites(): starting render cycle, mode %d", mode);
 
 	_movie->_videoPlayback = false;
 
@@ -773,14 +776,14 @@ void Score::renderSprites(RenderMode mode) {
 			if (currentSprite) {
 				Common::Rect bbox = channel->getBbox();
 				debugC(5, kDebugImages,
-					"Score::renderSprites(): CH: %-3d castId: %s invalid: %d [ink: %d, puppet: %d, moveable: %d, trails: %d, visible: %d] [bbox: %d,%d,%d,%d] [type: %d fg: %d bg: %d] [script: %s]",
+					"Score::updateSprites(): CH: %-3d castId: %s invalid: %d [ink: %d, puppet: %d, moveable: %d, trails: %d, visible: %d] [bbox: %d,%d,%d,%d] [type: %d fg: %d bg: %d] [script: %s]",
 					i, currentSprite->_castId.asString().c_str(), invalidCastMember,
 					currentSprite->_ink, currentSprite->_puppet, currentSprite->_moveable,
 					currentSprite->_trails, channel->_visible,
 					PRINT_RECT(bbox), currentSprite->_spriteType, currentSprite->_foreColor, currentSprite->_backColor,
 					currentSprite->_scriptId.asString().c_str());
 			} else {
-				debugC(5, kDebugImages, "Score::renderSprites(): CH: %-3d: No sprite", i);
+				debugC(5, kDebugImages, "Score::updateSprites(): CH: %-3d: No sprite", i);
 			}
 		} else {
 			channel->setClean(nextSprite, true);
diff --git a/engines/director/score.h b/engines/director/score.h
index 465eaa36ae4..4530310ef6b 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -119,7 +119,7 @@ public:
 
 	bool renderTransition(uint16 frameId, RenderMode mode);
 	void renderFrame(uint16 frameId, RenderMode mode = kRenderModeNormal);
-	void renderSprites(RenderMode mode = kRenderModeNormal);
+	void updateSprites(RenderMode mode = kRenderModeNormal);
 	bool renderPrePaletteCycle(RenderMode mode = kRenderModeNormal);
 	void setLastPalette();
 	bool isPaletteColorCycling();
diff --git a/engines/director/transitions.cpp b/engines/director/transitions.cpp
index 261bed17832..bf0c8cc1894 100644
--- a/engines/director/transitions.cpp
+++ b/engines/director/transitions.cpp
@@ -196,7 +196,7 @@ void Window::playTransition(uint frame, RenderMode mode, uint16 transDuration, u
 	Score *score = g_director->getCurrentMovie()->getScore();
 	if (t.area) {
 		// Changed area transition
-		score->renderSprites(mode);
+		score->updateSprites(mode);
 
 		if (_dirtyRects.size() == 0)
 			return;
@@ -222,7 +222,7 @@ void Window::playTransition(uint frame, RenderMode mode, uint16 transDuration, u
 		render(false, &nextFrame);
 	} else {
 		// Full stage transition
-		score->renderSprites(mode);
+		score->updateSprites(mode);
 		render(true, &nextFrame);
 
 		clipRect = _innerDims;




More information about the Scummvm-git-logs mailing list