[Scummvm-git-logs] scummvm master -> bfd9e8bf29a8d47e835e84a05856398742c6ebad
sev-
noreply at scummvm.org
Sat Aug 23 21:28:38 UTC 2025
This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
6aca9d0ac9 DIRECTOR: Remove D3 32-bit image filesize bodge
fd92b5f1d8 DIRECTOR: Zero out channel timing fields when setting the cast member
89f9a11beb DIRECTOR: LINGO: Add TransitionCastMember support for b_puppetTransition
bfd9e8bf29 DIRECTOR: LINGO: Don't run actorList stepFrame hooks in transitions
Commit: 6aca9d0ac9e48996bd7677a596d1d0987c57d672
https://github.com/scummvm/scummvm/commit/6aca9d0ac9e48996bd7677a596d1d0987c57d672
Author: Scott Percival (code at moral.net.au)
Date: 2025-08-23T23:28:34+02:00
Commit Message:
DIRECTOR: Remove D3 32-bit image filesize bodge
It is unclear if this was to work around an issue with a previous
version of the image decoder; the L-Zone examples cited appear
to be working fine.
Fixes rendering of 32-bit images in the cheese age of Mylk.
Changed paths:
engines/director/images.cpp
diff --git a/engines/director/images.cpp b/engines/director/images.cpp
index 804d02ed2b2..beebc03bf97 100644
--- a/engines/director/images.cpp
+++ b/engines/director/images.cpp
@@ -193,11 +193,6 @@ bool BITDDecoder::loadStream(Common::SeekableReadStream &stream) {
skipCompression = stream.size() >= bytesNeed;
} else if (_version < kFileVer400) {
bytesNeed = _surface->w * _surface->h * _bitsPerPixel / 8;
- // for D3, looks like it will round up the _surface->w to align 2
- // not sure whether D2 will have the same logic.
- // check lzone-mac data/r-c/tank.a-1 and lzone-mac data/r-a/station-b.01.
- if (_surface->w & 1)
- bytesNeed += _surface->h * _bitsPerPixel / 8;
skipCompression = stream.size() == bytesNeed;
}
}
Commit: fd92b5f1d80776afc3f26ff86f7a11188824c6c0
https://github.com/scummvm/scummvm/commit/fd92b5f1d80776afc3f26ff86f7a11188824c6c0
Author: Scott Percival (code at moral.net.au)
Date: 2025-08-23T23:28:34+02:00
Commit Message:
DIRECTOR: Zero out channel timing fields when setting the cast member
Fixes video playback in Gothos.
Changed paths:
engines/director/channel.cpp
diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 4c4f6f3fd0b..7dd15e0268e 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -391,6 +391,7 @@ void Channel::setCast(CastMemberID memberID) {
if (_sprite->_cast)
_sprite->_cast->releaseWidget();
+ bool hasChanged = _sprite->_castId != memberID;
// Replace the cast member in the sprite.
// Only change the dimensions if the "stretch" flag is set,
// indicating that the sprite has already been warped away from cast
@@ -398,6 +399,24 @@ void Channel::setCast(CastMemberID memberID) {
// dimensions of the sprite, -then- change the cast ID, and expect
// those custom dimensions to stick around.
_sprite->setCast(memberID, !_sprite->_stretch);
+
+ // Duplicate of the special cases in setClean.
+ // Maybe it makes sense to force setClean to use setCast instead?
+ if (hasChanged && _sprite->_cast) {
+ if (_sprite->_cast->_type == kCastDigitalVideo) {
+ DigitalVideoCastMember *dv = (DigitalVideoCastMember *)_sprite->_cast;
+ if (dv->loadVideoFromCast()) {
+ _movieTime = 0;
+ dv->setChannel(this);
+ dv->startVideo();
+ }
+ } else if (_sprite->_cast->_type == kCastFilmLoop ||
+ _sprite->_cast->_type == kCastMovie) {
+ // brand new film loop, reset the frame counter.
+ _filmLoopFrame = 1;
+ }
+ }
+
replaceWidget();
// Based on Director in a Nutshell, page 15
Commit: 89f9a11bebe1cd96c692b3cc2734f9f167e8df2d
https://github.com/scummvm/scummvm/commit/89f9a11bebe1cd96c692b3cc2734f9f167e8df2d
Author: Scott Percival (code at moral.net.au)
Date: 2025-08-23T23:28:34+02:00
Commit Message:
DIRECTOR: LINGO: Add TransitionCastMember support for b_puppetTransition
Fixes most scene transitions in Gothos.
Changed paths:
engines/director/castmember/transition.cpp
engines/director/lingo/lingo-builtins.cpp
diff --git a/engines/director/castmember/transition.cpp b/engines/director/castmember/transition.cpp
index 63965eb01dc..38d18e92092 100644
--- a/engines/director/castmember/transition.cpp
+++ b/engines/director/castmember/transition.cpp
@@ -19,7 +19,6 @@
*
*/
-#include "common/memstream.h"
#include "director/director.h"
#include "director/cast.h"
#include "director/movie.h"
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 959a1218b7b..125978144ba 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -43,6 +43,7 @@
#include "director/castmember/bitmap.h"
#include "director/castmember/palette.h"
#include "director/castmember/text.h"
+#include "director/castmember/transition.h"
#include "director/lingo/lingo-builtins.h"
#include "director/lingo/lingo-code.h"
#include "director/lingo/lingo-codegen.h"
@@ -2988,6 +2989,8 @@ void LB::b_puppetTransition(int nargs) {
Window *stage = g_director->getCurrentWindow();
uint16 duration = 250, area = 1, chunkSize = 1, type = 0;
+ TransitionCastMember *tcast = nullptr;
+
switch (nargs) {
case 4:
area = g_lingo->pop().asInt();
@@ -3000,7 +3003,21 @@ void LB::b_puppetTransition(int nargs) {
duration = g_lingo->pop().asInt() * 250;
// fall through
case 1:
- type = ((TransitionType)(g_lingo->pop().asInt()));
+ {
+ Datum d = g_lingo->pop();
+ if (d.type == CASTREF) {
+ CastMemberID castId = d.asMemberID();
+ CastMember *cast = stage->getCurrentMovie()->getCastMember(castId);
+ if (cast->_type == kCastTransition) {
+ tcast = (TransitionCastMember *)cast;
+ } else {
+ warning("b_puppetTransition: expected transition cast member");
+ return;
+ }
+ } else {
+ type = ((TransitionType)(d.asInt()));
+ }
+ }
break;
default:
ARGNUMCHECK(1);
@@ -3010,11 +3027,17 @@ void LB::b_puppetTransition(int nargs) {
if (stage->_puppetTransition) {
warning("b_puppetTransition: Transition already queued");
- return;
+ delete stage->_puppetTransition;
+ stage->_puppetTransition = nullptr;
+ }
+ if (tcast) {
+ stage->_puppetTransition = new TransParams(tcast->_durationMillis, tcast->_area, tcast->_chunkSize, tcast->_transType);
+ } else {
+ stage->_puppetTransition = new TransParams(duration, area, chunkSize, ((TransitionType)type));
}
- debugC(3, kDebugImages, "b_puppetTransition(): type: %d, duration: %d, chunkSize: %d, area: %d", type, duration, chunkSize, area);
+ debugC(3, kDebugImages, "b_puppetTransition(): type: %d, duration: %d, chunkSize: %d, area: %d",
+ stage->_puppetTransition->type, stage->_puppetTransition->duration, stage->_puppetTransition->chunkSize, stage->_puppetTransition->area);
- stage->_puppetTransition = new TransParams(duration, area, chunkSize, ((TransitionType)type));
}
void LB::b_ramNeeded(int nargs) {
Commit: bfd9e8bf29a8d47e835e84a05856398742c6ebad
https://github.com/scummvm/scummvm/commit/bfd9e8bf29a8d47e835e84a05856398742c6ebad
Author: Scott Percival (code at moral.net.au)
Date: 2025-08-23T23:28:34+02:00
Commit Message:
DIRECTOR: LINGO: Don't run actorList stepFrame hooks in transitions
Fixes flying intro sequence in Gothos.
Changed paths:
engines/director/lingo/lingo.cpp
engines/director/lingo/lingo.h
engines/director/transitions.cpp
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 292080dd1f0..a6984f7b2a7 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1593,7 +1593,7 @@ void Lingo::executeImmediateScripts(Frame *frame) {
}
}
-void Lingo::executePerFrameHook(int frame, int subframe) {
+void Lingo::executePerFrameHook(int frame, int subframe, bool stepFrame) {
// Execute perFrameHook and actorList stepFrame, if any is available
// Starting D4, stepFrame of each objects in actorList is executed
// however the support for legacy mAtFrame is still there. (in future versions)
@@ -1609,18 +1609,16 @@ void Lingo::executePerFrameHook(int frame, int subframe) {
}
}
- if (_vm->getVersion() >= 400) {
- if (_actorList.u.farr->arr.size() > 0 && _vm->getVersion() >= 400) {
- for (uint i = 0; i < _actorList.u.farr->arr.size(); i++) {
- Datum actor = _actorList.u.farr->arr[i];
- Symbol method = actor.u.obj->getMethod("stepFrame");
- if (method.type != VOIDSYM) {
- debugC(1, kDebugLingoExec, "Executing perFrameHook : <%s>, frame %d, subframe %d", actor.asString(true).c_str(), frame, subframe);
- if (method.nargs == 1)
- push(actor);
- LC::call(method, method.nargs, false);
- execute();
- }
+ if (stepFrame && _actorList.u.farr->arr.size() > 0 && _vm->getVersion() >= 400) {
+ for (uint i = 0; i < _actorList.u.farr->arr.size(); i++) {
+ Datum actor = _actorList.u.farr->arr[i];
+ Symbol method = actor.u.obj->getMethod("stepFrame");
+ if (method.type != VOIDSYM) {
+ debugC(1, kDebugLingoExec, "Executing perFrameHook : <%s>, frame %d, subframe %d", actor.asString(true).c_str(), frame, subframe);
+ if (method.nargs == 1)
+ push(actor);
+ LC::call(method, method.nargs, false);
+ execute();
}
}
}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index e8126861000..387f6bb4308 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -573,7 +573,7 @@ public:
public:
void executeImmediateScripts(Frame *frame);
- void executePerFrameHook(int frame, int subframe);
+ void executePerFrameHook(int frame, int subframe, bool stepFrame = true);
// lingo-utils.cpp
private:
diff --git a/engines/director/transitions.cpp b/engines/director/transitions.cpp
index db3948fbe49..7fac342853c 100644
--- a/engines/director/transitions.cpp
+++ b/engines/director/transitions.cpp
@@ -587,7 +587,7 @@ void Window::playTransition(uint frame, RenderMode mode, uint16 transDuration, u
debugC(6, kDebugImages, "Window::playTransition(): delaying for %d", diff);
g_director->delayMillis(diff);
- g_lingo->executePerFrameHook(t.frame, i);
+ g_lingo->executePerFrameHook(t.frame, i, false);
}
debugC(2, kDebugImages, "Window::playTransition(): Transition %d finished in %d ms", t.type, g_system->getMillis() - transStartTime);
@@ -781,7 +781,7 @@ void Window::dissolveTrans(TransParams &t, Common::Rect &clipRect, Graphics::Man
}
stepTransition(t, i);
- g_lingo->executePerFrameHook(t.frame, i + 1);
+ g_lingo->executePerFrameHook(t.frame, i + 1, false);
if (_vm->processEvents(true)) {
exitTransition(t, nextFrame, clipRect);
@@ -906,7 +906,7 @@ void Window::dissolvePatternsTrans(TransParams &t, Common::Rect &clipRect, Graph
stepTransition(t, i);
- g_lingo->executePerFrameHook(t.frame, i + 1);
+ g_lingo->executePerFrameHook(t.frame, i + 1, false);
if (_vm->processEvents(true)) {
exitTransition(t, nextFrame, clipRect);
@@ -1085,7 +1085,7 @@ void Window::transMultiPass(TransParams &t, Common::Rect &clipRect, Graphics::Ma
stepTransition(t, i);
rects.clear();
- g_lingo->executePerFrameHook(t.frame, i);
+ g_lingo->executePerFrameHook(t.frame, i, false);
uint32 endTime = g_system->getMillis();
int diff = MAX(0, (int)t.stepDuration - (int)(endTime - startTime));
@@ -1157,7 +1157,7 @@ void Window::transZoom(TransParams &t, Common::Rect &clipRect, Graphics::Managed
debugC(6, kDebugImages, "Window::transZoom(): delaying for %d", diff);
g_director->delayMillis(diff);
- g_lingo->executePerFrameHook(t.frame, i);
+ g_lingo->executePerFrameHook(t.frame, i, false);
}
render(true, _composeSurface);
More information about the Scummvm-git-logs
mailing list