Opened 4 weeks ago

Closed 8 days ago

#16531 closed defect (fixed)

DIRECTOR: The Dark Eye - Character freezes/interaction fails in chapter Berenice

Reported by: gcp828 Owned by: moralrecordings
Priority: normal Component: Engine: Director
Version: Keywords:
Cc: Game:

Description

I am unable to progress in the chapter "Berenice" when playing as Berenice In the dream sequence where I need to speak to the cousin to trigger the proposal and fainting event, the interaction is broken.

When I click on him, the character freezes and the scene does not advance. I tried backing out to the main menu and reloading the save, but now the interaction hotspot does not appear at all when I hover over him. I seem to be soft-locked from progressing to the next scene. I have tried reloading earlier saves but the issue persists.

Attachments (8)

darkeye-win-213.dky.txt (5.4 KB ) - added by gcp828 4 weeks ago.
Video_2026-02-13_02-19-04.mp4_mpv-screenshot_01-12-10.950.jpg (923.2 KB ) - added by arrowgent 3 weeks ago.
Video_2026-02-13_02-19-04.mp4_mpv-screenshot_01-34-54.733.jpg (839.6 KB ) - added by arrowgent 3 weeks ago.
Video_2026-02-13_02-19-04.mp4_mpv-screenshot_02-24-18.850.jpg (830.0 KB ) - added by arrowgent 3 weeks ago.
report.txt (4.8 KB ) - added by arrowgent 3 weeks ago.
darkeye-win-poe.dky.txt (5.6 KB ) - added by arrowgent 3 weeks ago.
Screenshot 2026-02-16 16.09.04.png (45.3 KB ) - added by antoniou79 3 weeks ago.
Screenshot 2026-02-16 16.10.47.png (38.7 KB ) - added by antoniou79 3 weeks ago.

Change History (25)

by gcp828, 4 weeks ago

Attachment: darkeye-win-213.dky.txt added

by arrowgent, 3 weeks ago

Attachment: report.txt added

comment:1 by arrowgent, 3 weeks ago

ScummVM 2026.1.0 (Feb 1 2026 11:44:34)
Using SDL backend with SDL 2.32.10
Features compiled in: TAINTED Vorbis FLAC MP3 ALSA SEQ sndio TiMidity RGB zLib MPEG2 FluidSynth EAS OpenMPT Theora VPX AAC A/52 FreeType2 FriBiDi JPEG PNG GIF TTS cloud libcurl SDL_net ENet SDL2 TinyGL OpenGL (with shaders)

bdmasp DARKEYE.EXE DARKEYE.INI darkeye.sh DARKEYE_V1.0.EXE dkydata INCOMING.EXE SAVEDDKY scummvm_D4.txt setup
amdr18@Alienware-m18-R1-AMD:~/Games/scummvm_games/dark_eye$ ./darkeye.sh
WARNING: Couldn't initialize text to speech through speech-dispatcher!
User picked target 'darkeye-win' (engine ID 'director', game ID 'darkeye')...
Running The Dark Eye (v1.0/Windows/English)
DARKEYE.EXE: 67ba8428573dba0c8e12e7f02e4ef1bc, 742326 bytes.
DKYDATA/DIRFILES/SHARED.DIR: cbf56f8c65958653e886c3a4a1bea482, 2548860 bytes.
WARNING: SearchSet::add: archive '/home/amdr18/Games/scummvm_games/dark_eye' already present!
Starting v404 Director game

error occurs TWICE. two MOV files failed to play and locked the progression
temporarily renaming the two files and replacing them with "working" mov files managed to progress.

Save Location:

NBNAME BCProposal
NUMCLK 75
VISITD 1
COMPLT 1
PRVVST 1
PRVCMP 1
CURLOC BN,BA,N02,V02

WARNING: Builtin 'preLoadCast' dropping return value: 1903!
WARNING: DigitalVideoCastMember::loadVideo: Unknown file format for video 'The Dark Eye:DKYData:BN:BC\BNBCSELF.mov', skipping!
-- "Sending Nar Block PHMap an mBeginNarBlock message in mode BeginNoReset"
WARNING: b_puppetPalette: Skipping extra features!
-- "Returning to tale BN as BC, into nar block BCProposal"
-- "currentPOV BC"
-- "newPOV BC"
-- "newNarBlockNum 2"
-- "newPOVLastVisitedNarBlockNum 2"
-- "Sending Nar Block BCProposal an mBeginNarBlock message in mode Resume"
WARNING: b_puppetPalette: Skipping extra features!
WARNING: Builtin 'preLoadCast' dropping return value: 1887!

ffprobe shows its fine, it plays fine in MPV

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bnbcself (copy).mov':

Metadata:

creation_time : 1995-08-17T09:30:58.000000Z

Duration: 00:00:07.50, start: 0.000000, bitrate: 1011 kb/s
Stream #0:0[0x1](eng): Video: cinepak (cvid / 0x64697663), rgb24, 232x256, 832 kb/s, 10 fps, 10 tbr, 30 tbn (default)

Metadata:

creation_time : 1995-08-17T09:30:58.000000Z
handler_name : Apple Video Media Handler
vendor_id : appl
encoder : Cinepak

Stream #0:1[0x2](eng): Audio: pcm_u8 (raw / 0x20776172), 22050 Hz, 1 channels, u8, 176 kb/s (default)

Metadata:

creation_time : 1995-08-17T09:30:58.000000Z
handler_name : Apple Sound Media Handler
vendor_id : [0][0][0][0]

WARNING: Builtin 'preLoadCast' dropping return value: 1936!
WARNING: DigitalVideoCastMember::loadVideo: Unknown file format for video 'The Dark Eye:DKYData:BN:BC\BNBCYES.mov', skipping!
-- "Sending Nar Block PHMap an mBeginNarBlock message in mode BeginNoReset"
WARNING: b_puppetPalette: Skipping extra features!
-- "Returning to tale BN as BC, into nar block BCProposal"
-- "currentPOV BC"
-- "newPOV BC"
-- "newNarBlockNum 2"
-- "newPOVLastVisitedNarBlockNum 2"
-- "Sending Nar Block BCProposal an mBeginNarBlock message in mode Resume"
WARNING: b_puppetPalette: Skipping extra features!
WARNING: Builtin 'preLoadCast' dropping return value: 1929!

ffprobe shows an error, movie plays without audio in MPV

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x580ad580f7c0] Format mov,mp4,m4a,3gp,3g2,mj2 detected only with low score of 1, misdetection possible!
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bnbcyes (copy).mov':

Metadata:

creation_time : 1995-08-17T09:44:26.000000Z

Duration: 00:00:15.40, start: 0.000000, bitrate: 877 kb/s
Stream #0:0[0x1](eng): Video: cinepak (cvid / 0x64697663), rgb24, 240x320, 876 kb/s, 10 fps, 10 tbr, 30 tbn (default)

Metadata:

creation_time : 1995-08-17T09:44:26.000000Z
handler_name : Apple Video Media Handler
vendor_id : appl
encoder : Cinepak

i will add further that the EGAEUS story will have the same error if you click on the "TEETH" bust/statue teeth during the TEETH segment.

Save Location:

NBNAME EGTeeth
NUMCLK 49
VISITD 1
COMPLT 1
PRVVST 1
PRVCMP 1
CURLOC BN,BE,N08,V02

WARNING: Builtin 'preLoadCast' dropping return value: 2269!
WARNING: DigitalVideoCastMember::loadVideo: Unknown file format for video 'The Dark Eye:DKYData:BN:BE\BNEGBUST.mov', skipping!
-- "Sending Nar Block PHMap an mBeginNarBlock message in mode BeginNoReset"
WARNING: b_puppetPalette: Skipping extra features!
WARNING: Builtin 'preLoadCast' dropping return value: 2730!

again ffprobe show its fine, it plays fine in MPV

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bnegbust (copy).mov':

Metadata:

creation_time : 1995-08-17T10:17:36.000000Z

Duration: 00:00:09.00, start: 0.000000, bitrate: 398 kb/s
Stream #0:0[0x1](eng): Video: cinepak (cvid / 0x64697663), rgb24, 140x184, 397 kb/s, 10 fps, 10 tbr, 30 tbn (default)

Metadata:

creation_time : 1995-08-17T10:17:36.000000Z
handler_name : Apple Video Media Handler
vendor_id : appl
encoder : Cinepak

NOTE:
to restart the scene you can ESC -> ESC -> QUIT
this saves the game
restart scummvm/dark eye
and then click the EYEball to continue, restarting the scene
every time will cause the lockups until the data/mov are fixed

i will be testing the "new" re-release in 2 days:
https://store.steampowered.com/app/4289030/Edgar_Allan_Poes_Interactive_Horror_1995_Edition/

Last edited 3 weeks ago by arrowgent (previous) (diff)

comment:2 by antoniou79, 3 weeks ago

The relevant mov files "BNBCSELF.MOV" and "BNBCYES.MOV" have a somewhat different format than what the code our Director engine's DigitalVideoCastMember::loadVideo() expects.

In these files, the first four bytes (read as BE) seem to be an "offset" from the start of the file to the segment where the existing code of reading three 4-byte (uint32) values (as BE) would work -- actually I can only tell that the second uint32 value of them is the important one, because it matches the tag "moov").

With a quick and dirty hack, the code can be modified to also check there (in addition to checking the three 4-bytes at the start of the file), and that fixes the issue. But the fix is based on intuition, not proper specs.

For example, I don't know if all files with the "moov" tag should treat the first 4 bytes as an offset or we are indeed supposed to check both cases. Do we a) we read the three 4-byte values for tag matches at the start of the file, or b) we treat the first 4-byte value as an offset, seek to it, and then check the three 4-byte values for tag matches or c) we do both? I also don't know if there's any point reading past the second 4-byte value in the (b) case.

comment:3 by arrowgent, 3 weeks ago

"have a somewhat different format than what the code our Director engine's DigitalVideoCastMember::loadVideo() expects."

it does seem so!

3 files i encountered:
'The Dark Eye:DKYData:BN:BE\BNEGBUST.mov'
'The Dark Eye:DKYData:BN:BC\BNBCSELF.mov'
followed in the same scene by:
'The Dark Eye:DKYData:BN:BC\BNBCYES.mov'

comment:4 by arrowgent, 3 weeks ago

providing Egaeus TEETH segment save file
for testing BNEGBUST.mov

by arrowgent, 3 weeks ago

Attachment: darkeye-win-poe.dky.txt added

comment:5 by antoniou79, 3 weeks ago

BNEGBUST.mov has the same issue as the other two.

My hack-fix works with this and I could see the "teeth" bust animation and then proceed up to the end of the chapter.

---
One weird thing that happened once, was in the story from Bernice's perspective, when she's in the grave, I kept clicking on the lid but it never transitioned to the final cutscene. This only happened once (yesterday); other times I tested (including yesterday) I got the finale of the story. I haven't tried much to reproduce this though.

comment:6 by antoniou79, 3 weeks ago

If it helps at all, here's my quick-and-dirty hack-fix:

diff --git a/engines/director/castmember/digitalvideo.cpp b/engines/director/castmember/digitalvideo.cpp
index 1b439d4eefd..1d322a38c91 100644
--- a/engines/director/castmember/digitalvideo.cpp
+++ b/engines/director/castmember/digitalvideo.cpp
@@ -246,6 +246,15 @@ bool DigitalVideoCastMember::loadVideo(Common::String path) {
 	uint32 magic1 = copiedStream->readUint32BE();
 	uint32 magic2 = copiedStream->readUint32BE();
 	uint32 magic3 = copiedStream->readUint32BE();
+
+	uint32 magic1b = 0;
+	uint32 magic2b = 0;
+	uint32 magic3b = 0;
+	if (magic1 < copiedStream->size() + 12 && copiedStream->seek(magic1)) {
+		magic1b = copiedStream->readUint32BE();
+		magic2b = copiedStream->readUint32BE();
+		magic3b = copiedStream->readUint32BE();
+	}
 	delete copiedStream;
 	bool result = false;
 
@@ -263,7 +272,9 @@ bool DigitalVideoCastMember::loadVideo(Common::String path) {
 			_videoType = kDVQuickTime;
 		}
 
-	} else if (magic2 == MKTAG('m', 'o', 'o', 'v') || magic2 == MKTAG('m', 'd', 'a', 't')) {
+	} else if (magic2 == MKTAG('m', 'o', 'o', 'v')
+		       || magic2b == MKTAG('m', 'o', 'o', 'v')
+		       || magic2 == MKTAG('m', 'd', 'a', 't')) {
 		_video = new Video::QuickTimeDecoder();
 		result = _video->loadFile(location);
 		if (!result) {

comment:7 by arrowgent, 3 weeks ago

"the story from Bernice's perspective, when she's in the grave, I kept clicking on the lid but it never transitioned to the final cutscene"

separate issue, if you could open a new ticket?

i had this happen once.
other times the video plays before the audio

it must be related to how the "scene" plays audio, the video has no audio
../dark_eye/dkydata/bn/bd/bnbcdeth.mov
https://bugs.scummvm.org/ticket/16559

ill note the location and the audio here

Last edited 3 weeks ago by arrowgent (previous) (diff)

comment:8 by arrowgent, 3 weeks ago

reporting an odd circumstance
playing the "new" release on steam that uses scummvm 2026.1

there were NO issues

https://store.steampowered.com/app/4289030/Edgar_Allan_Poes_Interactive_Horror_1995_Edition/

however, i am using Proton 10 on linux to play Windows scummvm
this may be a factor

file comparison:

d58feaa0b3a23198366f7e90c589e25c bnbcself (copy).mov
d58feaa0b3a23198366f7e90c589e25c BNBCSELF.MOV

f736cd9d5255e90d0471890b7aab7711 bnbcyes (copy).mov
f736cd9d5255e90d0471890b7aab7711 BNBCYES.MOV

ffef07daa20e4cc224dc56525cb89d13 bnegbust (copy).mov
ffef07daa20e4cc224dc56525cb89d13 BNEGBUST.MOV

clearly the files are exactly the same, they even have a "corrupted" appearance when playing them in MPV at the start of the frame.

possibly wine/dxvk (not sure if its dxvk or opengl) is able to fix some of the issues or rather ignores the issues

i say this more than the new release's launcher affecting those files (launcher from the developer)

comment:9 by antoniou79, 3 weeks ago

As part of the GPL 3.0 license conformance, they have to publish their modified sources.

They're using the fix I provided above, as is. You can find it in the "Source" folder in the "ScummVM - Source.zip".

I'd be interested to see what other changes they made.

comment:10 by arrowgent, 3 weeks ago

the sources are included in the game folder (included all license agreements)

however, i dont believe they modified the sources?

their launcher simply hooks and "checks" the save game folder for achivements
i believe thats all it does.

here is a steamdb of the files to compare:
https://steamdb.info/depot/4289031/

i can give you an MD5SUM of the scummvm.exe for verification if that is enough

c9fec810074a8d5b92125d27250aca0a scummvm.exe (2026.1 "built Feb 15 2026")
288eb3ad1f4f0121955898ff9f48d6ad scummvmold.exe (2.9.1)

official "scummvm-2026.1.0-win32-x86_64.zip" downloaded from the site
df3d8fe9cbfda773d64d6341402e56fd scummvm.exe "built Jan 25 2026"

now that doesnt mean much, the about section (CTRL+F5, about)
says the only engine available is macromedia director
which means they compiled the source and excluded all other game engines, which totally makes sense to do that.

LASTLY..... i can test replacing scummvm.exe with the offical released version Feb 1st 2026 noted above
and see how that performs
try to deduce if proton/wine + dxvk/opengl is what is helping solve the broken video playback or what

ok, i have confirmed that proton/wine is using OpenGL not dxvk/vulkan (which makes sense, scummvm uses opengl)

and replacing their build with the official build
yes, the issue still occurs at berenice.
the audio plays "he seems miles from here" and then soft locked, video does not play.
you cannot progress

hope your fixes, or otherwise work good

IF YOU would, give me info how to escape to the launcher or open a log when it is locked out?
i can access CTRL+F5, what other buttons can i press to access information inside a running scummvm?

Last edited 3 weeks ago by arrowgent (previous) (diff)

comment:11 by antoniou79, 3 weeks ago

They did. It's in the source file "engines/director/castmember/digitalvideo.cpp" in the zip file I mentioned above. It's the only file in that folder that has a date of 15/02/2026 :)

(There's also a mention in one of the review comments, from a reviewer who got the game for free, and I suspect earlier than release, about a "day one patch").

I bought the game off steam yesterday. I haven't found any other changes to the sources, but I haven't really checked thoroughly.

I think it's good that they included the fix, but like I've written, I don't think this is the ideal approach technically for the engine code. It may work for the specific game's purposes here, but a more elegant and informed fix is required (which is why I haven't opened any PR for the fix to the ScummVM repository).

Also, yes, it's expected that publishers who use ScummVM to launch their games will use a build that only supports that specific engine.

Edit: screenshots of the zip with the modified file, and the opened modified file:


Last edited 3 weeks ago by antoniou79 (previous) (diff)

by antoniou79, 3 weeks ago

by antoniou79, 3 weeks ago

comment:12 by arrowgent, 3 weeks ago

ah yes, when i opened the source.zip it only showed dates of 17 Jan 2026
so i had to go down to the actual folder file location

yep, the digitalvideo.cpp is modified 14 Feb 2026. (depending on your timezone)

Last edited 3 weeks ago by arrowgent (previous) (diff)

comment:13 by antoniou79, 3 weeks ago

So after a diff, I can confirm that as of yet, the ScummVM source code they included in the release contains only this single fix, and no other changes.

Their launcher of course is custom and deals with the achievement unlocking, among probably other things too, but that's outside the ScummVM project.

comment:14 by antoniou79, 2 weeks ago

There's an additional (potential) oddity for this interaction/video with Aegeus when playing from Bernice's perspective.

Looking at a youtube playthrough, it seems that after doing the "caress" gesture on Aegeus, you are given the chance to switch perspectives. This seems to be part of the script that plays this particular video.

But this is missing from my playthrough via ScummVM. I should note, though, that I've started the chapter from Bernice perspective.

If this is not an additional bug, I can think of the following potential explanations:

  • Maybe this interaction is only available if you previously switched from Aegeus to Bernice in the same chapter (the Youtuber did that; they started the chapter from Aegeus perspective, and switched to Bernice when she first comes into his office) - This actually sounds very likely, maybe @arrowgent knows for sure?
  • Maybe the youtube playthrough was made with another version of the game

Timestamped videos from SGF's (blind) playthrough of the game (on Windows 3.1)
Choice to switch to Aegeus during the problematic video (time: around 26:11):
https://youtu.be/fxFFLK0eiHY?si=_HSPuzfXULTpKYwk&t=1571

Earlier interaction, switching from Aegeus to Bernice (time around: 20:38)
https://youtu.be/fxFFLK0eiHY?si=JR2z_ZEXgdoa3uw6&t=1238

Last edited 2 weeks ago by antoniou79 (previous) (diff)

comment:15 by arrowgent, 2 weeks ago

no i was definitely able to eye-switch nightmares at several points in both playthroughs (from berenice to egaeus, and Egaeus to Berenice)

i have played in dosbox win3.1 also, the Egaeus scenes are very "buggy"

i dont tend to click on the EYES to switch scenes, because it delays progress
but that would be something else to test. load up all the eye-switches to make sure they work
the ones i did accidently click, they do work

at this point, these 3 .mov video files have issues.
at worst, simply re-encode the videos to fix them (using the same codecs)
or code some work around which works for all director and/or this one case

at this point ive played through the game atleast 6 times!!!

comment:16 by antoniou79, 2 weeks ago

Good to know that the "soul jumping" (character perspective switching) works.

The videos don't need re-encoding though. The quicktime decoder that ScummVM integrates has no issue playing them. The only thing that didn't work was the quick "early detection" that our Director engine does, looking at the start of the video files and deciding which video decoder it will send them to (if any). This has an easier fix than re-encoding the videos (and preserves the original files, so that's always a plus). But yeah, probably something more elegant and applicable to all video files, than my proposed fix.

Last edited 2 weeks ago by antoniou79 (previous) (diff)

comment:17 by moralrecordings, 8 days ago

Owner: set to moralrecordings
Resolution: fixed
Status: newclosed

Thanks for the report. This should be fixed in the latest master by https://github.com/scummvm/scummvm/commit/b858517d637500c04188cbbaf6320c47d9c4f32d

Note: See TracTickets for help on using tickets.