Here is how to extract H3BITMAP.LOD, H3SPRITE.LOD, VIDEO.VID and the other files from the demo without having to execute the h3demo.exe on Linux:
$ md5sum h3demo.exe
$ dd if=h3demo.exe skip=1 of=h3demo.cab ibs=130731
$ h3demo.cab: Microsoft Cabinet archive data, 98134327 bytes, 17 files
$ cabextract -F Disk1/data1.cab h3demo.cab
$ unshield Disk1/data1.cab
In summary, what’s happening here is: h3demo.exe is a “InstallShield self-extracting archive” which contains a cab archive at byte position 130731 until the end of file. So we extract that part of the file and store it in h3demo.cab. That archive contains a single directory called Disk1 with a couple of stuff inside but we are only interested in data1.cab. Despite its name that file is not a cab archive but an InstallShield file, so we use unshield to extract that file as well.
The lod files from the demo are incomplete (not surprising). Here is the log I get when trying to start vcmi with the lod files from the demo:
VCMI 0.99 GITDIR-NOTFOUND (client)
Creating console and configuring logger: 1
The log file will be saved to "/home/josch/.cache/vcmi/VCMI_Client_log.txt"
Data loading: 13
Mod handler: 0
Mod filesystems: 12
Basic initialization: 28
Initialized logging system based on settings successfully.
[log level] ai => not set
[log level] animation => not set
[log level] bonus => not set
[log level] global => trace
[log level] network => not set
Error: campaign movies was not found!
Error: campaign music was not found!
Loading settings: 29
Found 3 render drivers
Check display mode: requested 800 x 600; available up to 1920 x 1080
Created renderer opengl
Initializing screen: 105
Initializing video: 0
Initializing screen and sound handling: 5
Bonus type handler: 1
terminate called after throwing an instance of 'std::runtime_error'
what(): Resource with name DATA/TENTCOLR and type TEXT wasn't found.
And if I add a Data/tentcolr.txt with the content from the full game, the game starts but freezes during the 3DO logo video playing in the very beginning. strace says that it’s stuck at a futex() call waiting:
Seems that vcmi is caught in an endless loop here:
sources.debian.net/src/vcmi/0.99 … .cpp/#L323
Since that function seems to parse CRTRAITS.TXT I uploaded the file from the demo for your convenience. Maybe somebody notices something odd that makes the parser fail.