mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-22 12:12:16 +00:00
* Disk code cleanup.
* Added ability to load in-game menu graphics. svn-id: r40175
This commit is contained in:
parent
d82f49a9e4
commit
19bd929a5d
@ -109,8 +109,7 @@ class DosDisk_ns : public Disk_ns {
|
||||
|
||||
private:
|
||||
void unpackBackground(Common::ReadStream *stream, byte *screen, byte *mask, byte *path);
|
||||
Cnv* loadExternalCnv(const char *filename);
|
||||
Frames* loadCnv(const char *filename);
|
||||
Cnv* loadCnv(const char *filename);
|
||||
void loadBackground(BackgroundInfo& info, const char *filename);
|
||||
void loadMaskAndPath(BackgroundInfo& info, const char *name);
|
||||
void parseDepths(BackgroundInfo &info, Common::SeekableReadStream &stream);
|
||||
@ -146,7 +145,7 @@ public:
|
||||
class AmigaDisk_ns : public Disk_ns {
|
||||
|
||||
protected:
|
||||
Cnv* makeCnv(Common::SeekableReadStream *stream, bool disposeStream);
|
||||
Cnv* makeCnv(Common::SeekableReadStream *stream);
|
||||
void patchFrame(byte *dst, byte *dlta, uint16 bytesPerPlane, uint16 height);
|
||||
void unpackFrame(byte *dst, byte *src, uint16 planeSize);
|
||||
void unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 bytesPerPlane, uint16 height);
|
||||
@ -208,7 +207,7 @@ class DosDisk_br : public Disk_br {
|
||||
|
||||
protected:
|
||||
Font *createFont(const char *name, Common::ReadStream &stream);
|
||||
Sprites* createSprites(Common::ReadStream &stream);
|
||||
Sprites* createSprites(Common::ReadStream *stream);
|
||||
void loadBitmap(Common::SeekableReadStream &stream, Graphics::Surface &surf, byte *palette);
|
||||
GfxObj* createInventoryObjects(Common::SeekableReadStream &stream);
|
||||
|
||||
@ -250,7 +249,7 @@ public:
|
||||
class AmigaDisk_br : public DosDisk_br {
|
||||
|
||||
protected:
|
||||
Sprites* createSprites(Common::ReadStream &stream);
|
||||
Sprites* createSprites(Common::ReadStream *stream);
|
||||
Font *createFont(const char *name, Common::SeekableReadStream &stream);
|
||||
void loadBackground(BackgroundInfo& info, const char *filename);
|
||||
void adjustForPalette(Graphics::Surface &surf, int transparentColor = -1);
|
||||
|
@ -180,13 +180,11 @@ GfxObj* DosDisk_br::loadTalk(const char *name) {
|
||||
// talk position is set to (0,0), because talks are always displayed at
|
||||
// absolute coordinates, set in the dialogue manager. The original used
|
||||
// to null out coordinates every time they were needed. We do it better!
|
||||
Sprites *spr = createSprites(*stream);
|
||||
Sprites *spr = createSprites(stream);
|
||||
for (int i = 0; i < spr->getNum(); i++) {
|
||||
spr->_sprites[i].x = 0;
|
||||
spr->_sprites[i].y = 0;
|
||||
}
|
||||
|
||||
delete stream;
|
||||
return new GfxObj(0, spr, name);
|
||||
}
|
||||
|
||||
@ -273,33 +271,41 @@ GfxObj* DosDisk_br::loadStatic(const char* name) {
|
||||
return new GfxObj(0, new SurfaceToFrames(surf), name);
|
||||
}
|
||||
|
||||
Sprites* DosDisk_br::createSprites(Common::ReadStream &stream) {
|
||||
Sprites* DosDisk_br::createSprites(Common::ReadStream *stream) {
|
||||
|
||||
uint16 num = stream.readUint16LE();
|
||||
uint16 num = stream->readUint16LE();
|
||||
|
||||
Sprites *sprites = new Sprites(num);
|
||||
|
||||
for (uint i = 0; i < num; i++) {
|
||||
Sprite *spr = &sprites->_sprites[i];
|
||||
spr->size = stream.readUint16LE();
|
||||
spr->x = stream.readUint16LE();
|
||||
spr->y = stream.readUint16LE();
|
||||
spr->w = stream.readUint16LE();
|
||||
spr->h = stream.readUint16LE();
|
||||
spr->size = stream->readUint16LE();
|
||||
spr->x = stream->readUint16LE();
|
||||
spr->y = stream->readUint16LE();
|
||||
spr->w = stream->readUint16LE();
|
||||
spr->h = stream->readUint16LE();
|
||||
|
||||
spr->packedData = (byte*)malloc(spr->size);
|
||||
stream.read(spr->packedData, spr->size);
|
||||
stream->read(spr->packedData, spr->size);
|
||||
}
|
||||
delete stream;
|
||||
|
||||
return sprites;
|
||||
}
|
||||
|
||||
Frames* DosDisk_br::loadFrames(const char* name) {
|
||||
Common::SeekableReadStream *stream = 0;
|
||||
|
||||
debugC(5, kDebugDisk, "DosDisk_br::loadFrames");
|
||||
Common::SeekableReadStream *stream = openFile("ani/" + Common::String(name), ".ani");
|
||||
Frames *frames = createSprites(*stream);
|
||||
delete stream;
|
||||
return frames;
|
||||
|
||||
Common::String path(name);
|
||||
if (path.hasSuffix(".win")) {
|
||||
stream = openFile(path);
|
||||
} else {
|
||||
stream = openFile("ani/" + Common::String(name), ".ani");
|
||||
}
|
||||
|
||||
return createSprites(stream);
|
||||
}
|
||||
|
||||
// Slides in Nippon Safes are basically screen-sized pictures with valid
|
||||
@ -645,32 +651,41 @@ GfxObj* AmigaDisk_br::loadStatic(const char* name) {
|
||||
return new GfxObj(0, new SurfaceToFrames(surf), name);
|
||||
}
|
||||
|
||||
Sprites* AmigaDisk_br::createSprites(Common::ReadStream &stream) {
|
||||
uint16 num = stream.readUint16BE();
|
||||
Sprites* AmigaDisk_br::createSprites(Common::ReadStream *stream) {
|
||||
uint16 num = stream->readUint16BE();
|
||||
|
||||
Sprites *sprites = new Sprites(num);
|
||||
|
||||
for (uint i = 0; i < num; i++) {
|
||||
Sprite *spr = &sprites->_sprites[i];
|
||||
spr->size = stream.readUint16BE();
|
||||
spr->x = stream.readUint16BE();
|
||||
spr->y = stream.readUint16BE();
|
||||
spr->w = stream.readUint16BE();
|
||||
spr->h = stream.readUint16BE() - 1;
|
||||
spr->size = stream->readUint16BE();
|
||||
spr->x = stream->readUint16BE();
|
||||
spr->y = stream->readUint16BE();
|
||||
spr->w = stream->readUint16BE();
|
||||
spr->h = stream->readUint16BE() - 1;
|
||||
|
||||
spr->packedData = (byte*)malloc(spr->size);
|
||||
stream.read(spr->packedData, spr->size);
|
||||
stream->read(spr->packedData, spr->size);
|
||||
}
|
||||
|
||||
delete stream;
|
||||
|
||||
return sprites;
|
||||
}
|
||||
|
||||
Frames* AmigaDisk_br::loadFrames(const char* name) {
|
||||
debugC(1, kDebugDisk, "AmigaDisk_br::loadFrames '%s'", name);
|
||||
Common::SeekableReadStream *stream = openFile("anims/" + Common::String(name), ".ani");
|
||||
Frames *frames = createSprites(*stream);
|
||||
delete stream;
|
||||
return frames;
|
||||
Common::SeekableReadStream *stream = 0;
|
||||
|
||||
debugC(5, kDebugDisk, "AmigaDisk_br::loadFrames");
|
||||
|
||||
Common::String path(name);
|
||||
if (path.hasSuffix(".win")) {
|
||||
stream = openFile(path);
|
||||
} else {
|
||||
stream = openFile("anims/" + Common::String(name), ".ani");
|
||||
}
|
||||
|
||||
return createSprites(stream);
|
||||
}
|
||||
|
||||
GfxObj* AmigaDisk_br::loadTalk(const char *name) {
|
||||
@ -681,13 +696,11 @@ GfxObj* AmigaDisk_br::loadTalk(const char *name) {
|
||||
// talk position is set to (0,0), because talks are always displayed at
|
||||
// absolute coordinates, set in the dialogue manager. The original used
|
||||
// to null out coordinates every time they were needed. We do it better!
|
||||
Sprites *spr = createSprites(*stream);
|
||||
Sprites *spr = createSprites(stream);
|
||||
for (int i = 0; i < spr->getNum(); i++) {
|
||||
spr->_sprites[i].x = 0;
|
||||
spr->_sprites[i].y = 0;
|
||||
}
|
||||
|
||||
delete stream;
|
||||
return new GfxObj(0, spr, name);
|
||||
}
|
||||
|
||||
|
@ -267,47 +267,29 @@ Common::SeekableReadStream *DosDisk_ns::tryOpenFile(const char* name) {
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// loads a cnv from an external file
|
||||
//
|
||||
Cnv* DosDisk_ns::loadExternalCnv(const char *filename) {
|
||||
|
||||
char path[PATH_LEN];
|
||||
|
||||
sprintf(path, "%s.cnv", filename);
|
||||
|
||||
Common::SeekableReadStream *stream = openFile(path);
|
||||
|
||||
uint16 numFrames = stream->readByte();
|
||||
uint16 width = stream->readByte();
|
||||
uint16 height = stream->readByte();
|
||||
uint32 decsize = numFrames * width * height;
|
||||
|
||||
byte *data = new byte[decsize];
|
||||
stream->read(data, decsize);
|
||||
delete stream;
|
||||
|
||||
return new Cnv(numFrames, width, height, data, true);
|
||||
}
|
||||
|
||||
|
||||
Frames* DosDisk_ns::loadCnv(const char *filename) {
|
||||
|
||||
Cnv* DosDisk_ns::loadCnv(const char *filename) {
|
||||
Common::SeekableReadStream *stream = openFile(filename);
|
||||
|
||||
uint16 numFrames = stream->readByte();
|
||||
uint16 width = stream->readByte();
|
||||
uint16 height = stream->readByte();
|
||||
uint32 decsize = numFrames * width * height;
|
||||
int32 decsize = numFrames * width * height;
|
||||
byte *data = new byte[decsize];
|
||||
|
||||
Graphics::PackBitsReadStream decoder(*stream);
|
||||
decoder.read(data, decsize);
|
||||
bool packed = (stream->size() - stream->pos()) != decsize;
|
||||
if (packed) {
|
||||
Graphics::PackBitsReadStream decoder(*stream);
|
||||
decoder.read(data, decsize);
|
||||
} else {
|
||||
stream->read(data, decsize);
|
||||
}
|
||||
|
||||
delete stream;
|
||||
|
||||
return new Cnv(numFrames, width, height, data, true);
|
||||
}
|
||||
|
||||
|
||||
GfxObj* DosDisk_ns::loadTalk(const char *name) {
|
||||
|
||||
const char *ext = strstr(name, ".talk");
|
||||
@ -319,12 +301,12 @@ GfxObj* DosDisk_ns::loadTalk(const char *name) {
|
||||
|
||||
char v20[30];
|
||||
if (_engineFlags & kEngineTransformedDonna) {
|
||||
sprintf(v20, "%stta", name);
|
||||
sprintf(v20, "%stta.cnv", name);
|
||||
} else {
|
||||
sprintf(v20, "%stal", name);
|
||||
sprintf(v20, "%stal.cnv", name);
|
||||
}
|
||||
|
||||
return new GfxObj(0, loadExternalCnv(v20), name);
|
||||
return new GfxObj(0, loadCnv(v20), name);
|
||||
}
|
||||
|
||||
Script* DosDisk_ns::loadLocation(const char *name) {
|
||||
@ -355,26 +337,29 @@ GfxObj* DosDisk_ns::loadHead(const char* name) {
|
||||
char path[PATH_LEN];
|
||||
sprintf(path, "%shead", name);
|
||||
path[8] = '\0';
|
||||
return new GfxObj(0, loadExternalCnv(path));
|
||||
strcat(path, ".cnv");
|
||||
return new GfxObj(0, loadCnv(path));
|
||||
}
|
||||
|
||||
|
||||
Frames* DosDisk_ns::loadPointer(const char *name) {
|
||||
return loadExternalCnv(name);
|
||||
char path[PATH_LEN];
|
||||
sprintf(path, "%s.cnv", name);
|
||||
return loadCnv(path);
|
||||
}
|
||||
|
||||
|
||||
Font* DosDisk_ns::loadFont(const char* name) {
|
||||
char path[PATH_LEN];
|
||||
sprintf(path, "%scnv", name);
|
||||
return createFont(name, loadExternalCnv(path));
|
||||
sprintf(path, "%scnv.cnv", name);
|
||||
return createFont(name, loadCnv(path));
|
||||
}
|
||||
|
||||
|
||||
GfxObj* DosDisk_ns::loadObjects(const char *name, uint8 part) {
|
||||
char path[PATH_LEN];
|
||||
sprintf(path, "%sobj", name);
|
||||
return new GfxObj(0, loadExternalCnv(path), name);
|
||||
sprintf(path, "%sobj.cnv", name);
|
||||
return new GfxObj(0, loadCnv(path), name);
|
||||
}
|
||||
|
||||
|
||||
@ -844,7 +829,7 @@ void AmigaDisk_ns::unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 b
|
||||
}
|
||||
|
||||
|
||||
Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream *stream, bool disposeStream) {
|
||||
Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream *stream) {
|
||||
assert(stream);
|
||||
|
||||
uint16 numFrames = stream->readByte();
|
||||
@ -867,8 +852,7 @@ Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream *stream, bool disposeStrea
|
||||
|
||||
free(buf);
|
||||
|
||||
if (disposeStream)
|
||||
delete stream;
|
||||
delete stream;
|
||||
|
||||
return new Cnv(numFrames, width, height, data, true);
|
||||
}
|
||||
@ -901,13 +885,13 @@ Script* AmigaDisk_ns::loadScript(const char* name) {
|
||||
Frames* AmigaDisk_ns::loadPointer(const char* name) {
|
||||
debugC(1, kDebugDisk, "AmigaDisk_ns::loadPointer");
|
||||
Common::SeekableReadStream *stream = openFile(name);
|
||||
return makeCnv(stream, true);
|
||||
return makeCnv(stream);
|
||||
}
|
||||
|
||||
GfxObj* AmigaDisk_ns::loadStatic(const char* name) {
|
||||
debugC(1, kDebugDisk, "AmigaDisk_ns::loadStatic '%s'", name);
|
||||
Common::SeekableReadStream *s = openFile(name);
|
||||
return new GfxObj(0, makeCnv(s, true), name);
|
||||
return new GfxObj(0, makeCnv(s), name);
|
||||
}
|
||||
|
||||
Common::SeekableReadStream *AmigaDisk_ns::tryOpenFile(const char* name) {
|
||||
@ -1115,7 +1099,7 @@ Frames* AmigaDisk_ns::loadFrames(const char* name) {
|
||||
if (!s)
|
||||
s = openFile(name);
|
||||
|
||||
return makeCnv(s, true);
|
||||
return makeCnv(s);
|
||||
}
|
||||
|
||||
GfxObj* AmigaDisk_ns::loadHead(const char* name) {
|
||||
@ -1123,7 +1107,7 @@ GfxObj* AmigaDisk_ns::loadHead(const char* name) {
|
||||
char path[PATH_LEN];
|
||||
sprintf(path, "%s.head", name);
|
||||
Common::SeekableReadStream *s = openFile(path);
|
||||
return new GfxObj(0, makeCnv(s, true), name);
|
||||
return new GfxObj(0, makeCnv(s), name);
|
||||
}
|
||||
|
||||
|
||||
@ -1137,7 +1121,7 @@ GfxObj* AmigaDisk_ns::loadObjects(const char *name, uint8 part) {
|
||||
sprintf(path, "objs/%s.objs", name);
|
||||
|
||||
Common::SeekableReadStream *s = openFile(path);
|
||||
return new GfxObj(0, makeCnv(s, true), name);
|
||||
return new GfxObj(0, makeCnv(s), name);
|
||||
}
|
||||
|
||||
|
||||
@ -1154,7 +1138,7 @@ GfxObj* AmigaDisk_ns::loadTalk(const char *name) {
|
||||
if (!s) {
|
||||
s = openFile(name);
|
||||
}
|
||||
return new GfxObj(0, makeCnv(s, true), name);
|
||||
return new GfxObj(0, makeCnv(s), name);
|
||||
}
|
||||
|
||||
Table* AmigaDisk_ns::loadTable(const char* name) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user