mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-04 09:56:30 +00:00
DIRECTOR: Implement D4 CASt member parsing stub
This commit is contained in:
parent
25a2333394
commit
3291a9761c
@ -28,66 +28,103 @@
|
||||
|
||||
namespace Director {
|
||||
|
||||
BitmapCast::BitmapCast(Common::SeekableSubReadStreamEndian &stream) {
|
||||
flags = stream.readByte();
|
||||
someFlaggyThing = stream.readUint16();
|
||||
initialRect = Score::readRect(stream);
|
||||
boundingRect = Score::readRect(stream);
|
||||
regY = stream.readUint16();
|
||||
regX = stream.readUint16();
|
||||
unk1 = unk2 = 0;
|
||||
BitmapCast::BitmapCast(Common::ReadStreamEndian &stream, uint16 version) {
|
||||
if (version < 4) {
|
||||
flags = stream.readByte();
|
||||
someFlaggyThing = stream.readUint16();
|
||||
initialRect = Score::readRect(stream);
|
||||
boundingRect = Score::readRect(stream);
|
||||
regY = stream.readUint16();
|
||||
regX = stream.readUint16();
|
||||
unk1 = unk2 = 0;
|
||||
|
||||
if (someFlaggyThing & 0x8000) {
|
||||
unk1 = stream.readUint16();
|
||||
unk2 = stream.readUint16();
|
||||
if (someFlaggyThing & 0x8000) {
|
||||
unk1 = stream.readUint16();
|
||||
unk2 = stream.readUint16();
|
||||
}
|
||||
} else {
|
||||
initialRect = Score::readRect(stream);
|
||||
boundingRect = Score::readRect(stream);
|
||||
regX = 0; // FIXME: HACK
|
||||
regY = 0; // FIXME: HACK
|
||||
}
|
||||
modified = 0;
|
||||
}
|
||||
|
||||
TextCast::TextCast(Common::SeekableSubReadStreamEndian &stream) {
|
||||
flags1 = stream.readByte();
|
||||
borderSize = static_cast<SizeType>(stream.readByte());
|
||||
gutterSize = static_cast<SizeType>(stream.readByte());
|
||||
boxShadow = static_cast<SizeType>(stream.readByte());
|
||||
textType = static_cast<TextType>(stream.readByte());
|
||||
textAlign = static_cast<TextAlignType>(stream.readUint16());
|
||||
palinfo1 = stream.readUint16();
|
||||
palinfo2 = stream.readUint16();
|
||||
palinfo3 = stream.readUint16();
|
||||
TextCast::TextCast(Common::ReadStreamEndian &stream, uint16 version) {
|
||||
if (version < 4) {
|
||||
flags1 = stream.readByte();
|
||||
borderSize = static_cast<SizeType>(stream.readByte());
|
||||
gutterSize = static_cast<SizeType>(stream.readByte());
|
||||
boxShadow = static_cast<SizeType>(stream.readByte());
|
||||
textType = static_cast<TextType>(stream.readByte());
|
||||
textAlign = static_cast<TextAlignType>(stream.readUint16());
|
||||
palinfo1 = stream.readUint16();
|
||||
palinfo2 = stream.readUint16();
|
||||
palinfo3 = stream.readUint16();
|
||||
|
||||
int t = stream.readUint32();
|
||||
assert(t == 0); // So far we saw only 0 here
|
||||
int t = stream.readUint32();
|
||||
assert(t == 0); // So far we saw only 0 here
|
||||
|
||||
initialRect = Score::readRect(stream);
|
||||
textShadow = static_cast<SizeType>(stream.readByte());
|
||||
byte flags = stream.readByte();
|
||||
if (flags & 0x1)
|
||||
textFlags.push_back(kTextFlagEditable);
|
||||
if (flags & 0x2)
|
||||
textFlags.push_back(kTextFlagAutoTab);
|
||||
if (flags & 0x4)
|
||||
textFlags.push_back(kTextFlagDoNotWrap);
|
||||
if (flags & 0xf8)
|
||||
warning("Unproxessed text cast flags: %x", flags & 0xf8);
|
||||
initialRect = Score::readRect(stream);
|
||||
textShadow = static_cast<SizeType>(stream.readByte());
|
||||
byte flags = stream.readByte();
|
||||
if (flags & 0x1)
|
||||
textFlags.push_back(kTextFlagEditable);
|
||||
if (flags & 0x2)
|
||||
textFlags.push_back(kTextFlagAutoTab);
|
||||
if (flags & 0x4)
|
||||
textFlags.push_back(kTextFlagDoNotWrap);
|
||||
if (flags & 0xf8)
|
||||
warning("Unproxessed text cast flags: %x", flags & 0xf8);
|
||||
|
||||
// TODO: FIXME: guesswork
|
||||
fontId = stream.readByte();
|
||||
fontSize = stream.readByte();
|
||||
// TODO: FIXME: guesswork
|
||||
fontId = stream.readByte();
|
||||
fontSize = stream.readByte();
|
||||
} else {
|
||||
initialRect = Score::readRect(stream);
|
||||
//boundingRect = Score::readRect(stream);
|
||||
}
|
||||
|
||||
modified = 0;
|
||||
}
|
||||
|
||||
ShapeCast::ShapeCast(Common::SeekableSubReadStreamEndian &stream) {
|
||||
/*byte flags = */ stream.readByte();
|
||||
/*unk1 = */ stream.readByte();
|
||||
shapeType = static_cast<ShapeType>(stream.readByte());
|
||||
initialRect = Score::readRect(stream);
|
||||
pattern = stream.readUint16BE();
|
||||
fgCol = stream.readByte();
|
||||
bgCol = stream.readByte();
|
||||
fillType = stream.readByte();
|
||||
lineThickness = stream.readByte();
|
||||
lineDirection = stream.readByte();
|
||||
ShapeCast::ShapeCast(Common::ReadStreamEndian &stream, uint16 version) {
|
||||
if (version < 4) {
|
||||
/*byte flags = */ stream.readByte();
|
||||
/*unk1 = */ stream.readByte();
|
||||
shapeType = static_cast<ShapeType>(stream.readByte());
|
||||
initialRect = Score::readRect(stream);
|
||||
pattern = stream.readUint16BE();
|
||||
fgCol = stream.readByte();
|
||||
bgCol = stream.readByte();
|
||||
fillType = stream.readByte();
|
||||
lineThickness = stream.readByte();
|
||||
lineDirection = stream.readByte();
|
||||
} else {
|
||||
initialRect = Score::readRect(stream);
|
||||
//boundingRect = Score::readRect(stream);
|
||||
}
|
||||
modified = 0;
|
||||
}
|
||||
|
||||
ButtonCast::ButtonCast(Common::ReadStreamEndian &stream, uint16 version) : TextCast(stream, version) {
|
||||
if (version < 4) {
|
||||
buttonType = static_cast<ButtonType>(stream.readUint16BE());
|
||||
} else {
|
||||
initialRect = Score::readRect(stream);
|
||||
//boundingRect = Score::readRect(stream);
|
||||
}
|
||||
modified = 0;
|
||||
}
|
||||
|
||||
ScriptCast::ScriptCast(Common::ReadStreamEndian &stream, uint16 version) {
|
||||
if (version < 4) {
|
||||
error("Unhandled Script cast");
|
||||
} else {
|
||||
initialRect = Score::readRect(stream);
|
||||
//boundingRect = Score::readRect(stream);
|
||||
}
|
||||
modified = 0;
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,7 @@ struct Cast {
|
||||
};
|
||||
|
||||
struct BitmapCast : Cast {
|
||||
BitmapCast(Common::SeekableSubReadStreamEndian &stream);
|
||||
BitmapCast(Common::ReadStreamEndian &stream, uint16 version = 2);
|
||||
|
||||
Common::Rect boundingRect;
|
||||
uint16 regX;
|
||||
@ -67,7 +67,7 @@ enum ShapeType {
|
||||
};
|
||||
|
||||
struct ShapeCast : Cast {
|
||||
ShapeCast(Common::SeekableSubReadStreamEndian &stream);
|
||||
ShapeCast(Common::ReadStreamEndian &stream, uint16 version = 2);
|
||||
|
||||
ShapeType shapeType;
|
||||
uint16 pattern;
|
||||
@ -106,7 +106,7 @@ enum SizeType {
|
||||
};
|
||||
|
||||
struct TextCast : Cast {
|
||||
TextCast(Common::SeekableSubReadStreamEndian &stream);
|
||||
TextCast(Common::ReadStreamEndian &stream, uint16 version = 2);
|
||||
|
||||
SizeType borderSize;
|
||||
SizeType gutterSize;
|
||||
@ -129,13 +129,17 @@ enum ButtonType {
|
||||
};
|
||||
|
||||
struct ButtonCast : TextCast {
|
||||
ButtonCast(Common::SeekableSubReadStreamEndian &stream) : TextCast(stream) {
|
||||
buttonType = static_cast<ButtonType>(stream.readUint16BE());
|
||||
}
|
||||
ButtonCast(Common::ReadStreamEndian &stream, uint16 version = 2);
|
||||
|
||||
ButtonType buttonType;
|
||||
};
|
||||
|
||||
struct ScriptCast : Cast {
|
||||
ScriptCast(Common::ReadStreamEndian &stream, uint16 version = 2);
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct CastInfo {
|
||||
Common::String script;
|
||||
Common::String name;
|
||||
|
@ -212,7 +212,7 @@ void DirectorEngine::loadSharedCastsFrom(Common::String filename) {
|
||||
castScore->loadConfig(*shardcst->getResource(MKTAG('V','W','C','F'), 1024));
|
||||
|
||||
if (getVersion() < 4)
|
||||
castScore->loadCastDataD2(*shardcst->getResource(MKTAG('V','W','C','R'), 1024));
|
||||
castScore->loadCastDataVWCR(*shardcst->getResource(MKTAG('V','W','C','R'), 1024));
|
||||
|
||||
Common::Array<uint16> cast = shardcst->getResourceIDList(MKTAG('C','A','S','t'));
|
||||
if (cast.size() > 0) {
|
||||
|
@ -193,7 +193,7 @@ void Score::loadArchive() {
|
||||
|
||||
if (_vm->getVersion() < 4) {
|
||||
assert(_movieArchive->hasResource(MKTAG('V','W','C','R'), 1024));
|
||||
loadCastDataD2(*_movieArchive->getResource(MKTAG('V','W','C','R'), 1024));
|
||||
loadCastDataVWCR(*_movieArchive->getResource(MKTAG('V','W','C','R'), 1024));
|
||||
}
|
||||
|
||||
if (_movieArchive->hasResource(MKTAG('V','W','A','C'), 1024)) {
|
||||
@ -348,8 +348,8 @@ void Score::readVersion(uint32 rid) {
|
||||
debug("Version: %d.%d", _versionMajor, _versionMinor);
|
||||
}
|
||||
|
||||
void Score::loadCastDataD2(Common::SeekableSubReadStreamEndian &stream) {
|
||||
debugC(1, kDebugLoading, "Score::loadCastData(). start: %d, end: %d", _castArrayStart, _castArrayEnd);
|
||||
void Score::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
|
||||
debugC(1, kDebugLoading, "Score::loadCastDataVWCR(). start: %d, end: %d", _castArrayStart, _castArrayEnd);
|
||||
|
||||
for (uint16 id = _castArrayStart; id <= _castArrayEnd; id++) {
|
||||
byte size = stream.readByte();
|
||||
@ -376,7 +376,7 @@ void Score::loadCastDataD2(Common::SeekableSubReadStreamEndian &stream) {
|
||||
_casts[id]->type = kCastButton;
|
||||
break;
|
||||
default:
|
||||
warning("Unhandled cast type: %d", castType);
|
||||
warning("Score::loadCastDataVWCR(): Unhandled cast type: %d", castType);
|
||||
stream.skip(size - 1);
|
||||
break;
|
||||
}
|
||||
@ -393,17 +393,17 @@ void Score::loadCastDataD2(Common::SeekableSubReadStreamEndian &stream) {
|
||||
}
|
||||
}
|
||||
|
||||
void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 castId) {
|
||||
void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id) {
|
||||
// d4+ variant
|
||||
if (stream.size() == 0)
|
||||
return;
|
||||
|
||||
if (stream.size() < 26) {
|
||||
warning("CAST data id %d is too small", castId);
|
||||
warning("CAST data id %d is too small", id);
|
||||
return;
|
||||
}
|
||||
|
||||
debugC(3, kDebugLoading, "CASt: id: %d", castId);
|
||||
debugC(3, kDebugLoading, "CASt: id: %d", id);
|
||||
|
||||
if (debugChannelSet(5, kDebugLoading))
|
||||
stream.hexdump(stream.size());
|
||||
@ -428,43 +428,52 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 cas
|
||||
blob[0] = blob[1] = blob[2] = 0;
|
||||
}
|
||||
|
||||
debugC(3, kDebugLoading, "CASt: id: %d type: %x size1: %d size2: %d (%x) size3: %d", castId, castType, size1, size2, size2, size3);
|
||||
debugC(3, kDebugLoading, "CASt: id: %d type: %x size1: %d size2: %d (%x) size3: %d", id, castType, size1, size2, size2, size3);
|
||||
|
||||
byte *data = (byte *)malloc(size1 + 16);
|
||||
stream.read(data, size1 + 16);
|
||||
|
||||
Common::MemoryReadStreamEndian castStream(data, size1 + 16, stream.isBE());
|
||||
|
||||
#if 0
|
||||
switch (castType) {
|
||||
case kCastBitmap:
|
||||
_casts[id] = new BitmapCast(stream);
|
||||
warning("CASt: Bitmap");
|
||||
Common::hexdump(data, size1 + 16);
|
||||
_casts[id] = new BitmapCast(castStream, _vm->getVersion());
|
||||
_casts[id]->type = kCastBitmap;
|
||||
break;
|
||||
case kCastText:
|
||||
_casts[id] = new TextCast(stream);
|
||||
warning("CASt: Text");
|
||||
Common::hexdump(data, size1 + 16);
|
||||
_casts[id] = new TextCast(castStream, _vm->getVersion());
|
||||
_casts[id]->type = kCastText;
|
||||
break;
|
||||
case kCastShape:
|
||||
_casts[id] = new ShapeCast(stream);
|
||||
warning("CASt: Shape");
|
||||
Common::hexdump(data, size1 + 16);
|
||||
|
||||
_casts[id] = new ShapeCast(castStream, _vm->getVersion());
|
||||
_casts[id]->type = kCastShape;
|
||||
break;
|
||||
case kCastButton:
|
||||
_casts[id] = new ButtonCast(stream);
|
||||
warning("CASt: Button");
|
||||
Common::hexdump(data, size1 + 16);
|
||||
|
||||
_casts[id] = new ButtonCast(castStream, _vm->getVersion());
|
||||
_casts[id]->type = kCastButton;
|
||||
break;
|
||||
case kCastScript:
|
||||
warning("CASt: Script");
|
||||
Common::hexdump(data, size1 + 16);
|
||||
|
||||
_casts[id] = new ScriptCast(castStream, _vm->getVersion());
|
||||
_casts[id]->type = kCastScript;
|
||||
break;
|
||||
default:
|
||||
warning("Unhandled cast type: %d", castType);
|
||||
stream.skip(size - 1);
|
||||
warning("Score::loadCastData(): Unhandled cast type: %d", castType);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
Score::readRect(stream);
|
||||
Score::readRect(stream);
|
||||
|
||||
//member.initialRect = readRect(data)
|
||||
//member.boundingRect = readRect(data)
|
||||
//member.regX = 0 // FIXME: HACK
|
||||
//member.regY = 0 // FIXME: HACK
|
||||
|
||||
byte *data = (byte *)malloc(size1);
|
||||
stream.read(data, size1);
|
||||
free(data);
|
||||
|
||||
if (size2) {
|
||||
@ -488,7 +497,7 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 cas
|
||||
ci->fileName = castStrings[3];
|
||||
ci->type = castStrings[4];
|
||||
|
||||
_castsInfo[castId] = ci;
|
||||
_castsInfo[id] = ci;
|
||||
}
|
||||
|
||||
if (size3)
|
||||
@ -794,7 +803,10 @@ Common::Array<Common::String> Score::loadStrings(Common::SeekableSubReadStreamEn
|
||||
Common::String entryString;
|
||||
|
||||
for (uint j = entries[i]; j < entries[i + 1]; j++)
|
||||
entryString += data[j];
|
||||
if (data[j] == '\r')
|
||||
entryString += '\n';
|
||||
else
|
||||
entryString += data[j];
|
||||
|
||||
strings.push_back(entryString);
|
||||
}
|
||||
@ -830,7 +842,7 @@ void Score::loadFontMap(Common::SeekableSubReadStreamEndian &stream) {
|
||||
}
|
||||
}
|
||||
|
||||
Common::Rect Score::readRect(Common::SeekableSubReadStreamEndian &stream) {
|
||||
Common::Rect Score::readRect(Common::ReadStreamEndian &stream) {
|
||||
Common::Rect *rect = new Common::Rect();
|
||||
rect->top = stream.readUint16();
|
||||
rect->left = stream.readUint16();
|
||||
|
@ -55,7 +55,7 @@ public:
|
||||
Score(DirectorEngine *vm, Archive *);
|
||||
~Score();
|
||||
|
||||
static Common::Rect readRect(Common::SeekableSubReadStreamEndian &stream);
|
||||
static Common::Rect readRect(Common::ReadStreamEndian &stream);
|
||||
static int compareLabels(const void *a, const void *b);
|
||||
void loadArchive();
|
||||
void setStartToLabel(Common::String label);
|
||||
@ -66,7 +66,7 @@ public:
|
||||
void processEvents();
|
||||
Archive *getArchive() const { return _movieArchive; };
|
||||
void loadConfig(Common::SeekableSubReadStreamEndian &stream);
|
||||
void loadCastDataD2(Common::SeekableSubReadStreamEndian &stream);
|
||||
void loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream);
|
||||
void loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id);
|
||||
void setCurrentFrame(uint16 frameId) { _currentFrame = frameId; }
|
||||
int getCurrentFrame() { return _currentFrame; }
|
||||
|
Loading…
x
Reference in New Issue
Block a user