aboutsummaryrefslogtreecommitdiff
path: root/engines/mads
diff options
context:
space:
mode:
authorPaul Gilbert2014-03-01 20:19:02 -0500
committerPaul Gilbert2014-03-01 20:19:02 -0500
commit7f8b2025c0f4e8ee3378b4c7317f31bf31e889ec (patch)
treed12bb3d90b6e42dc297b8a5f3ce20cf401166757 /engines/mads
parent7880ae0b18c3e2a25ed1c4a2bc42e22066d1ff3e (diff)
downloadscummvm-rg350-7f8b2025c0f4e8ee3378b4c7317f31bf31e889ec.tar.gz
scummvm-rg350-7f8b2025c0f4e8ee3378b4c7317f31bf31e889ec.tar.bz2
scummvm-rg350-7f8b2025c0f4e8ee3378b4c7317f31bf31e889ec.zip
MADS: Basic scne info loading is now working
Diffstat (limited to 'engines/mads')
-rw-r--r--engines/mads/assets.cpp9
-rw-r--r--engines/mads/assets.h3
-rw-r--r--engines/mads/game_data.cpp2
-rw-r--r--engines/mads/scene_data.cpp103
-rw-r--r--engines/mads/scene_data.h10
5 files changed, 90 insertions, 37 deletions
diff --git a/engines/mads/assets.cpp b/engines/mads/assets.cpp
index 4c075d054e..f7188e9551 100644
--- a/engines/mads/assets.cpp
+++ b/engines/mads/assets.cpp
@@ -49,8 +49,6 @@ SpriteAsset::SpriteAsset(MADSEngine *vm, const Common::String &resourceName, int
spriteStream->readUint16LE();
}
_frameCount = spriteStream->readUint16LE();
- // we skip the rest of the data
- delete spriteStream;
// Get the palette data
spriteStream = sprites.getItemStream(2);
@@ -64,7 +62,6 @@ SpriteAsset::SpriteAsset(MADSEngine *vm, const Common::String &resourceName, int
delete[] palData;
delete spriteStream;
- spriteStream = sprites.getItemStream(1);
Common::SeekableReadStream *spriteDataStream = sprites.getItemStream(3);
SpriteAssetFrame frame;
@@ -87,9 +84,13 @@ SpriteAsset::SpriteAsset(MADSEngine *vm, const Common::String &resourceName, int
_frames.push_back(frame);
}
- delete spriteStream;
delete spriteDataStream;
file.close();
}
+void SpriteAsset::drawScaled(int frameNumber, MSurface &depthSurface, MSurface &destSurface,
+ int scale, int depth, const Common::Point &pos) {
+ warning("TODO: SpriteAsset::drawScaled");
+}
+
} // End of namespace MADS
diff --git a/engines/mads/assets.h b/engines/mads/assets.h
index c64209eab2..5964036789 100644
--- a/engines/mads/assets.h
+++ b/engines/mads/assets.h
@@ -62,6 +62,9 @@ public:
MSprite *getFrame(int frameIndex);
byte *getPalette() { return _palette; }
int getColorCount() { return _colorCount; }
+
+ void drawScaled(int frameNumber, MSurface &depthSurface, MSurface &destSurface,
+ int scale, int depth, const Common::Point &pos);
};
} // End of namespace MADS
diff --git a/engines/mads/game_data.cpp b/engines/mads/game_data.cpp
index df4a902c25..e39b85c9ae 100644
--- a/engines/mads/game_data.cpp
+++ b/engines/mads/game_data.cpp
@@ -53,7 +53,7 @@ void InventoryObject::load(Common::SeekableReadStream &f) {
for (int i = 0; i < 3; ++i) {
_vocabList[i]._actionFlags1 = f.readByte();
_vocabList[i]._actionFlags2 = f.readByte();
- _vocabList[i]._vocabId = f.readByte();
+ _vocabList[i]._vocabId = f.readUint16LE();
}
f.skip(4); // field12
diff --git a/engines/mads/scene_data.cpp b/engines/mads/scene_data.cpp
index e0c25d89fb..8fe03f2056 100644
--- a/engines/mads/scene_data.cpp
+++ b/engines/mads/scene_data.cpp
@@ -193,6 +193,18 @@ void ARTHeader::load(Common::SeekableReadStream *f) {
/*------------------------------------------------------------------------*/
+void SceneInfo::SpriteInfo::load(Common::SeekableReadStream *f) {
+ f->skip(3);
+ _spriteSetIndex = f->readByte();
+ f->skip(2);
+ _position.x = f->readSint16LE();
+ _position.y = f->readSint16LE();
+ _depth = f->readByte();
+ _scale = f->readByte();
+}
+
+/*------------------------------------------------------------------------*/
+
SceneInfo *SceneInfo::load(MADSEngine *vm, int sceneId, int v1, const Common::String &resName,
int v3, MSurface &depthSurface, MSurface &bgSurface) {
return new SceneInfo(vm, sceneId, v1, resName, v3, depthSurface, bgSurface);
@@ -200,13 +212,9 @@ SceneInfo *SceneInfo::load(MADSEngine *vm, int sceneId, int v1, const Common::St
SceneInfo::SceneInfo(MADSEngine *vm, int sceneId, int v1, const Common::String &resName,
int flags, MSurface &depthSurface, MSurface &bgSurface) {
- bool flag = true;
+ _vm = vm;
bool sceneFlag = sceneId >= 0;
- bool ssFlag = false, wsFlag = false;
- Common::Array<SpriteAsset *> spriteSets;
- Common::Array<int> xpList;
-
// Figure out the resource to use
Common::String resourceName;
if (sceneFlag) {
@@ -216,54 +224,70 @@ SceneInfo::SceneInfo(MADSEngine *vm, int sceneId, int v1, const Common::String &
}
// Open the scene info resource for access
- File infoFile(resName);
+ File infoFile(resourceName);
+ MadsPack infoPack(&infoFile);
// Read in basic data
- _sceneId = infoFile.readUint16LE();
- _artFileNum = infoFile.readUint16LE();
- _depthStyle = infoFile.readUint16LE();
- _width = infoFile.readUint16LE();
- _height = infoFile.readUint16LE();
- infoFile.skip(24);
- _nodeCount = infoFile.readUint16LE();
- _yBandsEnd = infoFile.readUint16LE();
- _yBandsStart = infoFile.readUint16LE();
- _maxScale = infoFile.readUint16LE();
- _minScale = infoFile.readUint16LE();
+ Common::SeekableReadStream *infoStream = infoPack.getItemStream(0);
+ _sceneId = infoStream->readUint16LE();
+ _artFileNum = infoStream->readUint16LE();
+ _depthStyle = infoStream->readUint16LE();
+ _width = infoStream->readUint16LE();
+ _height = infoStream->readUint16LE();
+ infoStream->skip(24);
+ _nodeCount = infoStream->readUint16LE();
+ _yBandsEnd = infoStream->readUint16LE();
+ _yBandsStart = infoStream->readUint16LE();
+ _maxScale = infoStream->readUint16LE();
+ _minScale = infoStream->readUint16LE();
for (int i = 0; i < 15; ++i)
- _depthList[i] = infoFile.readUint16LE();
- _field4A = infoFile.readUint16LE();
+ _depthList[i] = infoStream->readUint16LE();
+ _field4A = infoStream->readUint16LE();
// Load the set of objects that are associated with the scene
for (int i = 0; i < 20; ++i) {
InventoryObject obj;
- obj.load(infoFile);
+ obj.load(*infoStream);
_objects.push_back(obj);
}
- int setCount = infoFile.readUint16LE();
- int field40E = infoFile.readUint16LE();
+ int spriteSetsCount = infoStream->readUint16LE();
+ int spriteInfoCount = infoStream->readUint16LE();
- for (int i = 0; i < 20; ++i) {
+ // Load in sprite sets
+ Common::StringArray setNames;
+ for (int i = 0; i < 10; ++i) {
char name[64];
- infoFile.read(name, 64);
- _setNames.push_back(Common::String(name));
+ infoStream->read(name, 64);
+
+ if (i < spriteSetsCount)
+ setNames.push_back(Common::String(name));
}
+ // Load in sprite draw information
+ Common::Array<SpriteInfo> spriteInfo;
+ for (int i = 0; i < 50; ++i) {
+ SpriteInfo info;
+ info.load(infoStream);
+
+ if (i < spriteInfoCount)
+ spriteInfo.push_back(info);
+ }
+
+ delete infoStream;
infoFile.close();
+
int width = _width;
int height = _height;
if (!bgSurface.getPixels()) {
bgSurface.setSize(width, height);
- ssFlag = true;
}
if (_depthStyle == 2)
width >>= 2;
if (!depthSurface.getPixels()) {
depthSurface.setSize(width, height);
- wsFlag = true;
}
// Load the depth surface with the scene codes
@@ -271,7 +295,7 @@ SceneInfo::SceneInfo(MADSEngine *vm, int sceneId, int v1, const Common::String &
// Get the ART resource
if (sceneFlag) {
- resourceName = Resources::formatName(RESPREFIX_RM, sceneId, ".ART");
+ resourceName = Resources::formatName(RESPREFIX_RM, _artFileNum, ".ART");
} else {
resourceName = "*" + Resources::formatResource(resName, resName);
}
@@ -283,6 +307,7 @@ SceneInfo::SceneInfo(MADSEngine *vm, int sceneId, int v1, const Common::String &
ARTHeader artHeader;
artHeader.load(stream);
+ delete stream;
artFile.close();
// Copy out the palette data
@@ -310,12 +335,15 @@ SceneInfo::SceneInfo(MADSEngine *vm, int sceneId, int v1, const Common::String &
assert(_width == bgSurface.w && _height == bgSurface.h);
stream->read(bgSurface.getPixels(), bgSurface.w * bgSurface.h);
+ Common::Array<SpriteAsset *> spriteSets;
+ Common::Array<int> xpList;
+
if (flags & 1) {
- for (uint i = 0; i < _setNames.size(); ++i) {
+ for (uint i = 0; i < setNames.size(); ++i) {
Common::String setResName;
if (sceneFlag || resName.hasPrefix("*"))
setResName += "*";
- setResName += _setNames[i];
+ setResName += setNames[i];
SpriteAsset *sprites = new SpriteAsset(_vm, setResName, flags);
spriteSets.push_back(sprites);
@@ -323,9 +351,22 @@ SceneInfo::SceneInfo(MADSEngine *vm, int sceneId, int v1, const Common::String &
}
}
+ warning("TODO: sub_201E4(xpList, namesCount, &pal data2");
+
+ for (uint i = 0; i < spriteInfo.size(); ++i) {
+ SpriteInfo &si = spriteInfo[i];
+ SpriteAsset *asset = spriteSets[si._spriteSetIndex];
+ assert(asset && _depthStyle != 2);
+ asset->drawScaled(asset->getCount(), depthSurface, bgSurface,
+ si._scale, si._depth, si._position);
+ }
- warning("TODO");
+ // Free the sprite sets
+ for (int i = (int)spriteSets.size() - 1; i >= 0; --i) {
+ warning("TODO: sub_201C8 SPRITE_SET.field_6");
+ delete spriteSets[i];
+ }
}
void SceneInfo::loadCodes(MSurface &depthSurface) {
diff --git a/engines/mads/scene_data.h b/engines/mads/scene_data.h
index 74a1ff8e68..bcdd50a9d0 100644
--- a/engines/mads/scene_data.h
+++ b/engines/mads/scene_data.h
@@ -263,6 +263,15 @@ struct ARTHeader {
* Handles general data for a given scene
*/
class SceneInfo {
+ class SpriteInfo {
+ public:
+ int _spriteSetIndex;
+ Common::Point _position;
+ int _depth;
+ int _scale;
+
+ void load(Common::SeekableReadStream *f);
+ };
private:
MADSEngine *_vm;
@@ -290,7 +299,6 @@ public:
int _field4C;
Common::Array<InventoryObject> _objects;
- Common::StringArray _setNames;
Common::Array<RGB4> _palette;
public:
/**