diff options
Diffstat (limited to 'engines/mads/scene_data.cpp')
-rw-r--r-- | engines/mads/scene_data.cpp | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/engines/mads/scene_data.cpp b/engines/mads/scene_data.cpp index d0e40d4097..aac70750b8 100644 --- a/engines/mads/scene_data.cpp +++ b/engines/mads/scene_data.cpp @@ -23,6 +23,7 @@ #include "common/scummsys.h" #include "mads/scene_data.h" #include "mads/mads.h" +#include "mads/resources.h" #include "mads/nebular/nebular_scenes.h" namespace MADS { @@ -161,4 +162,176 @@ Hotspot::Hotspot(Common::SeekableReadStream &f) { _verbId = f.readUint16LE(); } +/*------------------------------------------------------------------------*/ + +void ARTHeader::load(Common::SeekableReadStream &f) { + _width = f.readUint16LE(); + _height = f.readUint16LE(); + + _palCount = f.readUint16LE(); + for (int i = 0; i < 256; ++i) { + RGB6 rgb; + rgb.r = f.readByte(); + rgb.g = f.readByte(); + rgb.b = f.readByte(); + f.read(&rgb.unused[0], 3); + + _palette.push_back(rgb); + } + + int palCount = f.readUint16LE(); + for (int i = 0; i < palCount; ++i) { + RGB4 rgb; + rgb.r = f.readByte(); + rgb.g = f.readByte(); + rgb.b = f.readByte(); + rgb.u = f.readByte(); + + _palData.push_back(rgb); + } +} + +/*------------------------------------------------------------------------*/ + +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); +} + +SceneInfo::SceneInfo(MADSEngine *vm, int sceneId, int v1, const Common::String &resName, + int flags, MSurface &depthSurface, MSurface &bgSurface) { + bool flag = true; + bool sceneFlag = sceneId >= 0; + bool ssFlag = false, wsFlag = false; + int handle = 0; + + SpriteAsset *spriteSets[10]; + int xpList[10]; + Common::fill(&spriteSets[0], &spriteSets[10], (SpriteAsset *)nullptr); + Common::fill(&xpList[0], &xpList[10], -1); + + // Figure out the resource to use + Common::String resourceName; + if (sceneFlag) { + resourceName = Resources::formatName(RESPREFIX_RM, sceneId, ".DAT"); + } else { + resourceName = "*" + Resources::formatResource(resName, resName); + } + + // Open the scene info resource for access + File infoFile(resName); + + // 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(); + for (int i = 0; i < 15; ++i) + _depthList[i] = infoFile.readUint16LE(); + _field4A = infoFile.readUint16LE(); + + // Load the set of objects that are associated with the scene + for (int i = 0; i < 20; ++i) { + InventoryObject obj; + obj.load(infoFile); + _objects.push_back(obj); + } + + int setCount = infoFile.readUint16LE(); + int field40E = infoFile.readUint16LE(); + + for (int i = 0; i < 20; ++i) { + char name[64]; + infoFile.read(name, 64); + _setNames.push_back(Common::String(name)); + } + + 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 + loadCodes(depthSurface); + + // Get the ART resource + if (sceneFlag) { + resourceName = Resources::formatName(RESPREFIX_RM, sceneId, ".ART"); + } else { + resourceName = "*" + Resources::formatResource(resName, resName); + } + + // Load in the ART header and palette + File artFile(resourceName); + ARTHeader artHeader; + artHeader.load(artFile); + artFile.close(); + + // Copy out the palette data + for (int i = 0; i < artHeader._palData.size(); ++i) + _palette.push_back(artHeader._palData[i]); +/* + if (!(flags & 1)) { + if (_vm->_game->_scene->_scenePalette) { + //_vm->_game->_scene->_scenePalette->clean(&artHeader._palCount); + //_vm->_game->_scene->_scenePalette->process(&artHeader._palCount) + } + } + */ + warning("TODO"); +} + +void SceneInfo::loadCodes(MSurface &depthSurface) { + File f(Resources::formatName(RESPREFIX_RM, _sceneId, ".DAT")); + + uint16 width = _width; + uint16 height = _height; + byte *walkMap = new byte[f.size()]; + + depthSurface.setSize(width, height); + f.read(walkMap, f.size()); + + byte *ptr = (byte *)depthSurface.getPixels(); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int ofs = x + (y * width); + if ((walkMap[ofs / 8] << (ofs % 8)) & 0x80) + *ptr++ = 1; // walkable + else + *ptr++ = 0; + } + } + + delete[] walkMap; +} + +/*------------------------------------------------------------------------*/ + +void ScenePalette::clean(int *palCount) { + warning("TODO: ScenePalette::clean"); +} + +void ScenePalette::process(int *palCount) { + warning("TODO: ScenePalette::process"); +} + } // End of namespace MADS |