Skip to content

Commit

Permalink
SCI: actor file format, add debug code kPortrait
Browse files Browse the repository at this point in the history
  • Loading branch information
Martin Kiewitz committed Dec 24, 2014
1 parent fa2d8d9 commit 381b759
Showing 1 changed file with 44 additions and 7 deletions.
51 changes: 44 additions & 7 deletions engines/sci/graphics/portrait.cpp
Expand Up @@ -57,13 +57,39 @@ void Portrait::init() {
// 4 bytes paletteSize (base 1)
// -> 17 bytes
// paletteSize bytes paletteData
// 14 bytes bitmap header
// -> 4 bytes unknown
// -> 2 bytes height
// -> 2 bytes width
// -> 6 bytes unknown
// height * width bitmap data
// another animation count times bitmap header and data
//
// bitmap-data follows, total of [animation count]
// 14 bytes bitmap header
// -> 4 bytes unknown
// -> 2 bytes height
// -> 2 bytes width
// -> 6 bytes unknown
// height * width bitmap data
//
// 4 bytes offset table size (may be larger than the actual known entries?!)
// 14 bytes all zeroes (dummy entry?!)
//
// 14 bytes for each entry
// -> 2 bytes displace X
// -> 2 bytes displace Y
// -> 2 bytes height (again)
// -> 2 bytes width (again)
// -> 6 bytes unknown (normally 01 00 00 00 00 00 for delta bitmaps, 00 00 00 00 00 00 for first bitmap)
// random data may be used as filler
//
// 4 bytes lip sync id table size (is [lip sync id count] * 4, should be 0x2E0 for all actors)
// 4 bytes per lip sync id
// -> 1 byte length of ID
// -> 3 bytes actual ID
//
// 4 bytes lip sync id data table size (seems to be the same for all actors, always 0x220 in size)
// 1 byte animation number or 0xFF as terminator
// 1 byte delay, if last byte was not terminator
// one array for every lip sync id
//
// 4 bytes appended, seem to be random
// 9E11120E for alex
// 9E9E9E9E for vizier
int32 fileSize = 0;
Common::SeekableReadStream *file =
SearchMan.createReadStreamForMember("actors/" + _resourceName + ".bin");
Expand Down Expand Up @@ -202,6 +228,7 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint
if (raveResource->size < 4000) {
memcpy(debugPrint, raveResource->data, raveResource->size);
debugPrint[raveResource->size] = 0; // set terminating NUL
debug("kPortrait: using actor %s", _resourceName.c_str());
debug("kPortrait (noun %d, verb %d, cond %d, seq %d)", noun, verb, cond, seq);
debug("kPortrait: %s", debugPrint);
}
Expand Down Expand Up @@ -273,6 +300,10 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint
raveLipSyncData = NULL;
}

#ifdef DEBUG_PORTRAIT
debug("kPortrait: %d: %x", raveTicks, raveID);
#endif

timerPosition += raveTicks;

// Wait till syncTime passed, then show specific animation bitmap
Expand All @@ -294,6 +325,9 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint
// Tick = 0xFF is the terminator for the data
timerPositionWithin = timerPosition;
raveLipSyncTicks = *raveLipSyncData++;
#ifdef DEBUG_PORTRAIT
debug("kPortrait: waiting %d", raveLipSyncTicks);
#endif
while ( (raveLipSyncData < _lipSyncDataOffsetTableEnd) && (raveLipSyncTicks != 0xFF) ) {
timerPositionWithin += raveLipSyncTicks;

Expand All @@ -308,6 +342,9 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint
} while ((curPosition != -1) && (curPosition < timerPositionWithin) && (!userAbort));

raveLipSyncBitmapNr = *raveLipSyncData++;
#ifdef DEBUG_PORTRAIT
debug("kPortrait: showing bitmap %d", raveLipSyncBitmapNr);
#endif

// bitmap nr within sync data is base 1, we need base 0
raveLipSyncBitmapNr--;
Expand Down

0 comments on commit 381b759

Please sign in to comment.