[Scummvm-git-logs] scummvm master -> 12fa21690555fb504cdd02dd92a905ca4b3e3499
sev-
noreply at scummvm.org
Sat Sep 26 13:03:37 UTC 2026
This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
34c6666d53 DIRECTOR: LINGO: Fix conversion for multiplex CastMemberIDs
2e79fb1102 DIRECTOR: LINGO: Don't immediately reset sprite upon clearing puppet flag
9bf89578c7 DIRECTOR: Force DigitalVideo cast members to use kInkCopy
b74cc8b5f6 VIDEO: Add handlers for getAudioTrackMute and setAudioTrackMute
12fa216905 DIRECTOR: LINGO: Implement trackEnabled and setTrackEnabled as functions
Commit: 34c6666d538bfd77cdde918108d1fdab52b00a83
https://github.com/scummvm/scummvm/commit/34c6666d538bfd77cdde918108d1fdab52b00a83
Author: Scott Percival (code at moral.net.au)
Date: 2026-09-26T15:03:30+02:00
Commit Message:
DIRECTOR: LINGO: Fix conversion for multiplex CastMemberIDs
The cast libary is masked off from the member as a multiple of 0x10000.
So cast library 1 appears twice.
Fixes crashes when hovering over menu buttons in bananasfun.
Changed paths:
engines/director/types.h
diff --git a/engines/director/types.h b/engines/director/types.h
index 1a28d531656..47495cf8fa8 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -442,16 +442,20 @@ struct CastMemberID {
uint hash() const { return ((castLib & 0xffff) << 16) + (member & 0xffff); }
+ // Multiplex IDs are basically member + castLib * 0x10000.
+ // castLib 1 is equivalent to castLib 0; the range repeats twice, and
+ // "the number of (member (65536+1))" returns 1.
CastMemberID fromMultiplex(int multiplexID) {
if (multiplexID < 0)
return CastMemberID(multiplexID, -1);
- return CastMemberID(multiplexID % 0x20000, 1 + (multiplexID >> 17));
+ int lib = multiplexID >> 16;
+ return CastMemberID(multiplexID % 0x10000, lib ? lib : 1);
}
int toMultiplex() {
- if (castLib < 0)
+ if (castLib <= 1)
return member;
- return (member % 0x20000) + ((castLib - 1) << 17);
+ return (member % 0x10000) + (castLib << 16);
}
};
Commit: 2e79fb11028cce5208e49fe529d8c3a1620db221
https://github.com/scummvm/scummvm/commit/2e79fb11028cce5208e49fe529d8c3a1620db221
Author: Scott Percival (code at moral.net.au)
Date: 2026-09-26T15:03:30+02:00
Commit Message:
DIRECTOR: LINGO: Don't immediately reset sprite upon clearing puppet flag
This reset should be handled by the score upon exiting the frame.
Fixes shell minigame in bananasfun, which expects the cast member ID to
still be there immediately after calling puppetSprite(id, FALSE).
Confirmed to still work with Journeyman Project.
Changed paths:
engines/director/lingo/lingo-builtins.cpp
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 908ff385023..2e8b1f92226 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -3299,14 +3299,7 @@ void LB::b_puppetSprite(int nargs) {
int spriteId = sprite.asInt();
Sprite *target = sc->getSpriteById(spriteId);
bool val = (bool)state.asInt();
- bool refresh = (!val) && (target->_puppet);
target->_puppet = val;
- if (refresh) {
- // puppetSprite set to FALSE, copy back sprite data from frame cache
- Channel *chan = sc->getChannelById(spriteId);
- chan->setClean(sc->_currentFrame->_sprites[spriteId]);
- chan->setDirty();
- }
} else {
warning("b_puppetSprite: sprite index out of bounds");
}
Commit: 9bf89578c76073df04c034cb718a6e3702b96e21
https://github.com/scummvm/scummvm/commit/9bf89578c76073df04c034cb718a6e3702b96e21
Author: Scott Percival (code at moral.net.au)
Date: 2026-09-26T15:03:30+02:00
Commit Message:
DIRECTOR: Force DigitalVideo cast members to use kInkCopy
Ink doesn't seem to have any effect on video cast members. If there is
such a case, I'm not aware of it.
Fixes sandwich making minigame in bananasfun, which sets the ink to
NotTrans for seemingly no reason?
Changed paths:
engines/director/channel.cpp
diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 83b86879347..cbb512c10c3 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -140,6 +140,10 @@ DirectorPlotData Channel::getPlotData() {
// Add override flag for 1-bit images
pd.oneBitImage = true;
}
+ // Videos are rendered as an overlay, ink doesn't affect them.
+ if (_sprite->_cast && _sprite->_cast->_type == kCastDigitalVideo) {
+ pd.ink = kInkTypeCopy;
+ }
if (!pd.srf && _sprite->_spriteType != kBitmapSprite) {
// Shapes come colourized from macDrawPixel
Commit: b74cc8b5f6fe1bec80b3109eea1de4038d74ba6f
https://github.com/scummvm/scummvm/commit/b74cc8b5f6fe1bec80b3109eea1de4038d74ba6f
Author: Scott Percival (code at moral.net.au)
Date: 2026-09-26T15:03:30+02:00
Commit Message:
VIDEO: Add handlers for getAudioTrackMute and setAudioTrackMute
Changed paths:
video/video_decoder.cpp
video/video_decoder.h
diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp
index db5bc241a8f..1cca34ae20d 100644
--- a/video/video_decoder.cpp
+++ b/video/video_decoder.cpp
@@ -896,6 +896,31 @@ bool VideoDecoder::setAudioTrack(int index) {
return true;
}
+bool VideoDecoder::getAudioTrackMute(int index) {
+ if (!supportsAudioTrackSwitching())
+ return true;
+
+ AudioTrack *audioTrack = getAudioTrack(index);
+
+ if (!audioTrack)
+ return true;
+
+ return audioTrack->getMute();
+}
+
+bool VideoDecoder::setAudioTrackMute(int index, bool muted) {
+ AudioTrack *audioTrack = getAudioTrack(index);
+ if (!supportsAudioTrackSwitching())
+ return false;
+
+ if (!audioTrack)
+ return false;
+
+ audioTrack->setMute(muted);
+ return true;
+}
+
+
uint VideoDecoder::getAudioTrackCount() const {
uint count = 0;
diff --git a/video/video_decoder.h b/video/video_decoder.h
index da4f89a36ee..00f4591d2f6 100644
--- a/video/video_decoder.h
+++ b/video/video_decoder.h
@@ -498,6 +498,27 @@ public:
*/
bool setAudioTrack(int index);
+ /**
+ * Get the mute status of an audio track.
+ *
+ * Has no effect if the container does not support this.
+ * @see supportsAudioTrackSwitching()
+ *
+ * @param index The index of the track, whose meaning is dependent on the container
+ */
+ bool getAudioTrackMute(int index);
+
+ /**
+ * Mute or unmute an audio track.
+ *
+ * Has no effect if the container does not support this.
+ * @see supportsAudioTrackSwitching()
+ *
+ * @param index The index of the track, whose meaning is dependent on the container
+ * @param muted Whether to mute the track or not.
+ */
+ bool setAudioTrackMute(int index, bool muted);
+
/**
* Get the number of internal audio tracks.
*/
@@ -808,6 +829,11 @@ protected:
*/
uint32 getRunningTime() const;
+ /**
+ * Get the current muted status.
+ */
+ bool getMute() { return _muted; }
+
/**
* Mute the track
*/
Commit: 12fa21690555fb504cdd02dd92a905ca4b3e3499
https://github.com/scummvm/scummvm/commit/12fa21690555fb504cdd02dd92a905ca4b3e3499
Author: Scott Percival (code at moral.net.au)
Date: 2026-09-26T15:03:30+02:00
Commit Message:
DIRECTOR: LINGO: Implement trackEnabled and setTrackEnabled as functions
Fixes crashes at the start of bananasfun.
Changed paths:
engines/director/castmember/digitalvideo.cpp
engines/director/castmember/digitalvideo.h
engines/director/lingo/lingo-builtins.cpp
engines/director/lingo/lingo-builtins.h
engines/director/lingo/lingo-the.cpp
engines/director/lingo/lingo-the.h
diff --git a/engines/director/castmember/digitalvideo.cpp b/engines/director/castmember/digitalvideo.cpp
index a83e675ecfa..06fd031897f 100644
--- a/engines/director/castmember/digitalvideo.cpp
+++ b/engines/director/castmember/digitalvideo.cpp
@@ -699,6 +699,21 @@ void DigitalVideoCastMember::setFrameRate(int rate) {
warning("STUB: DigitalVideoCastMember::setFrameRate(%d)", rate);
}
+bool DigitalVideoCastMember::getTrackEnabled(int track) {
+ if (!_video)
+ return false;
+
+ return !_video->getAudioTrackMute(track);
+}
+
+void DigitalVideoCastMember::setTrackEnabled(int track, bool value) {
+ if (!_video)
+ return;
+
+ _video->setAudioTrackMute(track, !value);
+}
+
+
Common::String DigitalVideoCastMember::formatInfo() {
return Common::String::format(
"initialRect: %dx%d@%d,%d, boundingRect: %dx%d@%d,%d, filename: \"%s\", duration: %d, enableVideo: %d, enableSound: %d, looping: %d, crop: %d, center: %d, showControls: %d",
diff --git a/engines/director/castmember/digitalvideo.h b/engines/director/castmember/digitalvideo.h
index bef8577884c..2a275899c31 100644
--- a/engines/director/castmember/digitalvideo.h
+++ b/engines/director/castmember/digitalvideo.h
@@ -72,6 +72,8 @@ public:
void setMovieTime(int units);
void setMovieRate(double rate);
void setFrameRate(int rate);
+ bool getTrackEnabled(int track);
+ void setTrackEnabled(int track, bool value);
bool hasField(int field) override;
Datum getField(int field) override;
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 2e8b1f92226..9695c0484e2 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -41,6 +41,7 @@
#include "director/window.h"
#include "director/castmember/castmember.h"
#include "director/castmember/bitmap.h"
+#include "director/castmember/digitalvideo.h"
#include "director/castmember/palette.h"
#include "director/castmember/text.h"
#include "director/castmember/transition.h"
@@ -270,6 +271,8 @@ static const BuiltinProto builtins[] = {
{ "trackStartTime", LB::b_trackStartTime,1,1, 500, FBLTIN }, // D5 f
{ "trackStopTime", LB::b_trackStopTime,1, 1, 500, FBLTIN }, // D5 f
{ "trackType", LB::b_trackType, 1, 1, 500, FBLTIN }, // D5 f
+ { "trackEnabled", LB::b_trackEnabled, 2, 2, 500, FBLTIN }, // D5 f
+ { "setTrackEnabled",LB::b_setTrackEnabled, 3, 3, 500, CBLTIN }, // D5 f
// Save session
{ "beginRecording", LB::b_beginRecording,0, 1, 500, CBLTIN }, // D5 c
@@ -4391,6 +4394,47 @@ void LB::b_trackType(int nargs) {
g_lingo->push(result);
}
+void LB::b_trackEnabled(int nargs) {
+ Datum whichTrack = g_lingo->pop();
+ Datum whichSprite = g_lingo->pop();
+ TYPECHECK(whichSprite, SPRITEREF);
+
+ Score *score = g_director->getCurrentMovie()->getScore();
+ Sprite *sprite = score->getSpriteById(whichSprite.u.i);
+ if (!sprite) {
+ g_lingo->push(0);
+ g_lingo->lingoError("b_trackEnabled: invalid sprite reference received");
+ return;
+ }
+ if (!sprite->_cast || (sprite->_cast->_type != kCastDigitalVideo)) {
+ g_lingo->push(0);
+ g_lingo->lingoError("b_trackEnabled: non-digital-video sprite reference received");
+ return;
+ }
+
+ g_lingo->push(((DigitalVideoCastMember *)(sprite->_cast))->getTrackEnabled(whichTrack.asInt()));
+}
+
+void LB::b_setTrackEnabled(int nargs) {
+ Datum trueOrFalse = g_lingo->pop();
+ Datum whichTrack = g_lingo->pop();
+ Datum whichSprite = g_lingo->pop();
+ TYPECHECK(whichSprite, SPRITEREF);
+
+ Score *score = g_director->getCurrentMovie()->getScore();
+ Sprite *sprite = score->getSpriteById(whichSprite.u.i);
+ if (!sprite) {
+ g_lingo->lingoError("b_setTrackEnabled: invalid sprite reference received");
+ return;
+ }
+ if (!sprite->_cast || (sprite->_cast->_type != kCastDigitalVideo)) {
+ g_lingo->lingoError("b_setTrackEnabled: non-digital-video sprite reference received");
+ return;
+ }
+
+ ((DigitalVideoCastMember *)(sprite->_cast))->setTrackEnabled(whichTrack.asInt(), trueOrFalse.asInt());
+}
+
void LB::b_scummvmassert(int nargs) {
Datum line = g_lingo->pop();
Datum d = g_lingo->pop();
diff --git a/engines/director/lingo/lingo-builtins.h b/engines/director/lingo/lingo-builtins.h
index 8ed64049131..d3bc853ff2b 100644
--- a/engines/director/lingo/lingo-builtins.h
+++ b/engines/director/lingo/lingo-builtins.h
@@ -230,6 +230,8 @@ void b_trackCount(int nargs);
void b_trackStartTime(int nargs);
void b_trackStopTime(int nargs);
void b_trackType(int nargs);
+void b_trackEnabled(int nargs);
+void b_setTrackEnabled(int nargs);
void b_isPastCuePoint(int nargs);
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index c5d57d176f3..1ec91626df9 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -291,12 +291,10 @@ const TheEntityField fields[] = {
{ kTheCast, "pausedAtStart",kThePausedAtStart,400 },// D4 p
{ kTheCast, "preLoad", kThePreLoad, 300 },// D3.1 p
{ kTheCast, "scale", kTheScale, 700 },// D7 p
- { kTheSprite, "setTrackEnabled",kTheSetTrackEnabled, 500 },// D5 p
{ kTheCast, "sound", kTheSound, 300 },// D3.1 p // 0-1 off-on
{ kTheSprite, "startTime", kTheStartTime, 300 },// D3.1 p
{ kTheSprite, "stopTime", kTheStopTime, 300 },// D3.1 p
{ kTheCast, "timeScale", kTheTimeScale, 500 },// D5 p
- { kTheSprite, "trackEnabled", kTheTrackEnabled, 500 },// D5 p
{ kTheSprite, "trackNextKeyTime", kTheTrackNextKeyTime, 500 },// D5 p
{ kTheSprite, "trackNextSampleTime", kTheTrackNextSampleTime, 500 },// D5 p
{ kTheSprite, "trackPreviousKeyTime", kTheTrackPreviousKeyTime, 500 },// D5 p
diff --git a/engines/director/lingo/lingo-the.h b/engines/director/lingo/lingo-the.h
index 520730e1498..81028b65a9c 100644
--- a/engines/director/lingo/lingo-the.h
+++ b/engines/director/lingo/lingo-the.h
@@ -283,7 +283,6 @@ enum TheFieldType {
kTheScriptType,
kTheScriptsEnabled,
kTheSelectionField,
- kTheSetTrackEnabled,
kTheShapeType,
kTheShort,
kTheSize,
@@ -304,7 +303,6 @@ enum TheFieldType {
kTheTitle,
kTheTitleVisible,
kTheTop,
- kTheTrackEnabled,
kTheTrackNextKeyTime,
kTheTrackNextSampleTime,
kTheTrackPreviousKeyTime,
More information about the Scummvm-git-logs
mailing list