diff options
author | Filippos Karapetis | 2017-01-08 20:09:51 +0200 |
---|---|---|
committer | Filippos Karapetis | 2017-01-08 20:24:39 +0200 |
commit | f3ea11f402102f88750e98dd5b55779695ff832f (patch) | |
tree | 3dc1c3dfa9b0ae1a3b04166db5952fcdf84861e3 /engines | |
parent | b20df6b41758f64cddf0fe8ca17b287c7f4a1bf3 (diff) | |
download | scummvm-rg350-f3ea11f402102f88750e98dd5b55779695ff832f.tar.gz scummvm-rg350-f3ea11f402102f88750e98dd5b55779695ff832f.tar.bz2 scummvm-rg350-f3ea11f402102f88750e98dd5b55779695ff832f.zip |
CHEWY: Initial implementation of scene sprites, props and hotspots
Diffstat (limited to 'engines')
-rw-r--r-- | engines/chewy/events.cpp | 3 | ||||
-rw-r--r-- | engines/chewy/scene.cpp | 150 | ||||
-rw-r--r-- | engines/chewy/scene.h | 6 |
3 files changed, 159 insertions, 0 deletions
diff --git a/engines/chewy/events.cpp b/engines/chewy/events.cpp index 6675fea392..55a7b62bff 100644 --- a/engines/chewy/events.cpp +++ b/engines/chewy/events.cpp @@ -28,6 +28,7 @@ #include "chewy/cursor.h" #include "chewy/events.h" #include "chewy/graphics.h" +#include "chewy/scene.h" namespace Chewy { @@ -56,6 +57,8 @@ void Events::processEvents() { } } else if (_event.type == Common::EVENT_RBUTTONUP) { _vm->_cursor->nextCursor(); + } else if (_event.type == Common::EVENT_MOUSEMOVE) { + _vm->_scene->updateMouse(_event.mouse); } } } diff --git a/engines/chewy/scene.cpp b/engines/chewy/scene.cpp index 03e4332f85..c6c12fc3ff 100644 --- a/engines/chewy/scene.cpp +++ b/engines/chewy/scene.cpp @@ -35,10 +35,53 @@ namespace Chewy { +#define MAX_DETAILS 32 +#define MAX_HOTSPOTS 50 + +// Animated details - scene animations +struct AnimatedDetails { + uint16 x; + uint16 y; + // 66 bytes animated details - TODO +}; + +// Static details - scene sprites and props +struct StaticDetails { + int16 x; + int16 y; + int16 spriteNum; + uint16 z; + byte hide; + // 1 byte dummy +}; + +struct SceneInfo { + uint16 staticDetailsCount; + uint16 animatedDetailsCount; + uint32 spritePtr; + AnimatedDetails animatedDetails[MAX_DETAILS]; + StaticDetails staticDetails[MAX_DETAILS]; + Common::Rect hotspot[MAX_HOTSPOTS]; + uint16 hotspotDescRes[MAX_HOTSPOTS]; + Common::String hotspotDesc[MAX_HOTSPOTS]; + byte roomNum; + byte picNum; + byte autoMoveCount; + byte loadTaf; + Common::String tafName; // 14 bytes + byte zoomFactor; + // 1 byte dummy + // 6 * 20 = 120 bytes automove coordinates - TODO + // MAX_DETAILS * 3 * 2 = 192 bytes voc - TODO + // MAX_DETAILS * 3 = 96 bytes samples - TODO +}; + Scene::Scene(ChewyEngine *vm) : _vm(vm) { + _sceneInfo = new SceneInfo(); } Scene::~Scene() { + delete _sceneInfo; } void Scene::change(uint scene) { @@ -46,14 +89,121 @@ void Scene::change(uint scene) { _vm->_cursor->setCursor(0); _vm->_cursor->showCursor(); + loadSceneInfo(); draw(); } void Scene::draw() { + // Background _vm->_graphics->drawImage("episode1.tgp", _curScene); + + // Static details + for (uint16 i = 0; i < MAX_HOTSPOTS; i++) { + StaticDetails s = _sceneInfo->staticDetails[i]; + if (s.spriteNum >= 0 && s.x >= 0 && s.y >= 0 && !s.hide) + _vm->_graphics->drawSprite(Common::String::format("det%d.taf", _curScene), s.spriteNum, s.x, s.y); + } + + // TODO: These are all hardcoded for now _vm->_graphics->drawSprite("det1.taf", 0, 200, 100); _vm->_graphics->loadFont("6x8.tff"); _vm->_graphics->drawText("This is a test", 200, 80); } +void Scene::updateMouse(Common::Point coords) { + // Animated details + // TODO: handle these + + // Static details + for (uint16 i = 0; i < MAX_HOTSPOTS; i++) { + if (_sceneInfo->hotspot[i].contains(coords)) { + // TODO: Draw hotspot description on screen + debug("Coords %d, %d: '%s'", coords.x, coords.y, _sceneInfo->hotspotDesc[i].c_str()); + break; + } + } +} + +void Scene::loadSceneInfo() { + const uint32 sceneInfoSize = 3784; + const uint32 headerRDI = MKTAG('R', 'D', 'I', '\0'); + const char *sceneIndexFileName = "test.rdi"; + Common::File indexFile; + if (!Common::File::exists(sceneIndexFileName)) + error("File %s not found", sceneIndexFileName); + Text *text = new Text(); + + indexFile.open(sceneIndexFileName); + + uint32 header = indexFile.readUint32BE(); + if (header != headerRDI) + error("Invalid resource - %s", sceneIndexFileName); + + indexFile.seek(sceneInfoSize * _curScene, SEEK_CUR); + + // TODO: These can be set to larger numbers than MAX_DETAILS + _sceneInfo->staticDetailsCount = indexFile.readUint16LE(); + _sceneInfo->animatedDetailsCount = indexFile.readUint16LE(); + indexFile.skip(6); + + // Animated details + for (int i = 0; i < MAX_DETAILS; i++) { + _sceneInfo->animatedDetails[i].x = indexFile.readUint16LE(); + _sceneInfo->animatedDetails[i].y = indexFile.readUint16LE(); + indexFile.skip(66); // animated details info - TODO: read these + } + + // Static details + for (int i = 0; i < MAX_DETAILS; i++) { + _sceneInfo->staticDetails[i].x = indexFile.readSint16LE(); + _sceneInfo->staticDetails[i].y = indexFile.readSint16LE(); + _sceneInfo->staticDetails[i].spriteNum = indexFile.readSint16LE(); + _sceneInfo->staticDetails[i].z = indexFile.readUint16LE(); + _sceneInfo->staticDetails[i].hide = indexFile.readByte(); + indexFile.readByte(); // padding + } + + // Hotspots + for (int i = 0; i < MAX_HOTSPOTS; i++) { + _sceneInfo->hotspot[i].left = indexFile.readUint16LE(); + _sceneInfo->hotspot[i].top = indexFile.readUint16LE(); + _sceneInfo->hotspot[i].right = indexFile.readUint16LE(); + _sceneInfo->hotspot[i].bottom = indexFile.readUint16LE(); + if (!_sceneInfo->hotspot[i].isValidRect()) + warning("Hotspot %d has an invalid rect", i); + } + + // Hotspot descriptions + for (int i = 0; i < MAX_HOTSPOTS; i++) { + _sceneInfo->hotspotDescRes[i] = indexFile.readUint16LE(); + + if (_sceneInfo->hotspotDescRes[i] < kATSTextMax) { + // TODO: Hotspot description IDs are off... investigate why + _sceneInfo->hotspotDesc[i] = text->getText(_curScene + kADSTextMax, _sceneInfo->hotspotDescRes[i])->text; + } else { + // TODO: Handle these types of hotspot descriptions + warning("Hotspot %d has an invalid description resource (%d)", i, _sceneInfo->hotspotDescRes[i]); + _sceneInfo->hotspotDesc[i] = Common::String::format("Hotspot %d", _sceneInfo->hotspotDescRes[i]); + } + } + + _sceneInfo->roomNum = indexFile.readByte(); + _sceneInfo->picNum = indexFile.readByte(); + _sceneInfo->autoMoveCount = indexFile.readByte(); + _sceneInfo->loadTaf = indexFile.readByte(); + + for (int i = 0; i < 14; i++) + _sceneInfo->tafName += indexFile.readByte(); + + _sceneInfo->zoomFactor = indexFile.readByte(); + indexFile.readByte(); // padding + + // 6 * 20 = 120 bytes automove coordinates - TODO: read these + // MAX_DETAILS * 3 * 2 = 192 bytes voc - TODO: read these + // MAX_DETAILS * 3 = 96 bytes samples - TODO: read these + + delete text; + indexFile.close(); +} + } // End of namespace Chewy diff --git a/engines/chewy/scene.h b/engines/chewy/scene.h index 37601d057b..24692c8486 100644 --- a/engines/chewy/scene.h +++ b/engines/chewy/scene.h @@ -27,6 +27,8 @@ namespace Chewy { +struct SceneInfo; + class Scene { public: Scene(ChewyEngine *vm); @@ -34,10 +36,14 @@ public: void change(uint scene); void draw(); + void updateMouse(Common::Point coords); private: + void loadSceneInfo(); + ChewyEngine *_vm; uint _curScene; + SceneInfo *_sceneInfo; }; } // End of namespace Chewy |