diff options
author | johndoe123 | 2014-04-14 13:48:24 +0200 |
---|---|---|
committer | Eugene Sandulenko | 2018-07-20 06:43:33 +0000 |
commit | 097d130e7dd5de95050e800419f4d07aabb7562b (patch) | |
tree | 5eb111d454b9e14c7140ac0a8935894600b3dafa | |
parent | e131362590a768240454cc2b27f4548ba481ebfb (diff) | |
download | scummvm-rg350-097d130e7dd5de95050e800419f4d07aabb7562b.tar.gz scummvm-rg350-097d130e7dd5de95050e800419f4d07aabb7562b.tar.bz2 scummvm-rg350-097d130e7dd5de95050e800419f4d07aabb7562b.zip |
ILLUSIONS: Implement RegionLayer and related code
-rw-r--r-- | engines/illusions/actor.cpp | 27 | ||||
-rw-r--r-- | engines/illusions/actor.h | 6 | ||||
-rw-r--r-- | engines/illusions/backgroundresource.cpp | 90 | ||||
-rw-r--r-- | engines/illusions/backgroundresource.h | 24 | ||||
-rw-r--r-- | engines/illusions/scriptopcodes_duckman.cpp | 3 | ||||
-rw-r--r-- | engines/illusions/sequenceopcodes.cpp | 2 |
6 files changed, 134 insertions, 18 deletions
diff --git a/engines/illusions/actor.cpp b/engines/illusions/actor.cpp index 83fd748496..030097bba9 100644 --- a/engines/illusions/actor.cpp +++ b/engines/illusions/actor.cpp @@ -71,11 +71,13 @@ Actor::Actor(IllusionsEngine *vm) _frames = 0; _scaleLayer = 0; _priorityLayer = 0; + _regionLayer = 0; _position.x = 0; _position.y = 0; _position2.x = 0; _position2.y = 0; _facing = 64; + _regionIndex = 0; _fontId = 0; _actorIndex = 0; _parentObjectId = 0; @@ -1069,7 +1071,7 @@ void Controls::placeActor(uint32 actorTypeId, Common::Point placePt, uint32 sequ } if (actorType->_regionLayerIndex) { - // TODO actor->_regionLayer = bgRes->getPriorityLayer(actorType->_regionLayerIndex - 1); + actor->_regionLayer = bgRes->getRegionLayer(actorType->_regionLayerIndex - 1); actor->_flags |= 0x20; } @@ -1355,7 +1357,28 @@ void Controls::actorControlRoutine(Control *control, uint32 deltaTime) { } if (actor->_flags & 0x20) { - // TODO Update transition sequence (seems to be unused in BBDOU?) + // Update transition sequence + int regionIndex = actor->_regionLayer->getRegionIndex(actor->_position); + if (actor->_regionIndex != regionIndex) { + if (regionIndex) { + uint32 savedSequenceId = actor->_sequenceId; + byte *savedSeqCodeIp = actor->_seqCodeIp; + int savedSeqCodeValue1 = actor->_seqCodeValue1; + int savedSeqCodeValue3 = actor->_seqCodeValue3; + uint32 regionSequenceId = actor->_regionLayer->getRegionSequenceId(regionIndex); + debug("Running transition sequence %08X", regionSequenceId); + Sequence *sequence = _vm->_dict->findSequence(regionSequenceId); + actor->_sequenceId = regionSequenceId; + actor->_seqCodeIp = sequence->_sequenceCode; + actor->_seqCodeValue3 = 0; + control->sequenceActor(); + actor->_sequenceId = savedSequenceId; + actor->_seqCodeIp = savedSeqCodeIp; + actor->_seqCodeValue3 = savedSeqCodeValue3; + actor->_seqCodeValue1 = savedSeqCodeValue1; + } + actor->_regionIndex = regionIndex; + } } } diff --git a/engines/illusions/actor.h b/engines/illusions/actor.h index cce5a41e9f..e71eebcdb1 100644 --- a/engines/illusions/actor.h +++ b/engines/illusions/actor.h @@ -101,6 +101,7 @@ public: ScaleLayer *_scaleLayer; PriorityLayer *_priorityLayer; + RegionLayer *_regionLayer; uint _seqStackCount; int16 _seqStack[5]; @@ -108,6 +109,7 @@ public: Common::Point _position; Common::Point _position2; uint _facing; + int _regionIndex; uint32 _fontId; int16 _actorIndex; @@ -129,10 +131,10 @@ public: ActorControlRoutine *_controlRoutine; - byte *_seqCodeIp; uint32 _sequenceId; - int _seqCodeValue1; int _seqCodeValue2; + byte *_seqCodeIp; + int _seqCodeValue1; int _seqCodeValue3; int _pathCtrX, _pathCtrY; diff --git a/engines/illusions/backgroundresource.cpp b/engines/illusions/backgroundresource.cpp index 301694370d..f76000513a 100644 --- a/engines/illusions/backgroundresource.cpp +++ b/engines/illusions/backgroundresource.cpp @@ -23,7 +23,9 @@ #include "illusions/illusions.h" #include "illusions/backgroundresource.h" #include "illusions/actor.h" +#include "illusions/actorresource.h" #include "illusions/camera.h" +#include "illusions/dictionary.h" #include "illusions/screen.h" #include "common/str.h" @@ -44,11 +46,15 @@ void BackgroundResourceLoader::load(Resource *resource) { backgroundItem->_tag = resource->_tag; backgroundItem->initSurface(); - // TODO Insert background objects + // Insert background objects for (uint i = 0; i < backgroundResource->_backgroundObjectsCount; ++i) _vm->_controls->placeBackgroundObject(&backgroundResource->_backgroundObjects[i]); - // TODO Insert IDs from item48s + // Insert region sequences + for (uint i = 0; i < backgroundResource->_regionSequencesCount; ++i) { + Sequence *sequence = &backgroundResource->_regionSequences[i]; + _vm->_dict->addSequence(sequence->_sequenceId, sequence); + } // TODO camera_fadeClear(); int index = backgroundItem->_bgRes->findMasterBgIndex(); @@ -66,7 +72,10 @@ void BackgroundResourceLoader::unload(Resource *resource) { // TODO Move to BackgroundItems BackgroundItem *backgroundItem = _vm->_backgroundItems->findBackgroundByResource((BackgroundResource*)resource->_refId); backgroundItem->freeSurface(); - // TODO Remove IDs from item48s + for (uint i = 0; i < backgroundItem->_bgRes->_regionSequencesCount; ++i) { + Sequence *sequence = &backgroundItem->_bgRes->_regionSequences[i]; + _vm->_dict->removeSequence(sequence->_sequenceId); + } delete backgroundItem->_bgRes; _vm->_backgroundItems->freeBackgroundItem(backgroundItem); _vm->setDefaultTextCoords(); @@ -154,6 +163,39 @@ int ScaleLayer::getScale(Common::Point pos) { return _values[pos.y]; } +// RegionLayer + +void RegionLayer::load(byte *dataStart, Common::SeekableReadStream &stream) { + _unk = stream.readUint32LE(); + uint32 regionSequenceIdsOffs = stream.readUint32LE(); + _width = stream.readUint16LE(); + _height = stream.readUint16LE(); + uint32 mapOffs = stream.readUint32LE(); + uint32 valuesOffs = stream.readUint32LE(); + _regionSequenceIds = dataStart + regionSequenceIdsOffs; + _map = dataStart + mapOffs; + _values = dataStart + valuesOffs; + _mapWidth = READ_LE_UINT16(_map + 0); + _mapHeight = READ_LE_UINT16(_map + 2); + _map += 8; + + debug("RegionLayer::load() %d; regionSequenceIdsOffs: %08X; _width: %d; _height: %d; mapOffs: %08X; valuesOffs: %08X", + _unk, regionSequenceIdsOffs, _width, _height, mapOffs, valuesOffs); +} + +int RegionLayer::getRegionIndex(Common::Point pos) { + pos.x = CLIP<int16>(pos.x, 0, _width - 1); + pos.y = CLIP<int16>(pos.y, 0, _height - 1); + const int16 tx = pos.x / 32, sx = pos.x % 32; + const int16 ty = pos.y / 8, sy = pos.y % 8; + uint16 mapIndex = READ_LE_UINT16(_map + 2 * (tx + ty * _mapWidth)) - 1; + return _values[mapIndex * 32 * 8 + sx + sy * 32]; +} + +uint32 RegionLayer::getRegionSequenceId(int regionIndex) { + return READ_LE_UINT32(_regionSequenceIds + 4 * regionIndex); +} + // Palette void Palette::load(byte *dataStart, Common::SeekableReadStream &stream) { @@ -227,6 +269,28 @@ void BackgroundResource::load(byte *data, uint32 dataSize) { _priorityLayers[i].load(data, stream); } + // Load region layers + stream.seek(0x16); + _regionLayersCount = stream.readUint16LE(); + _regionLayers = new RegionLayer[_regionLayersCount]; + stream.seek(0x38); + uint32 regionLayersOffs = stream.readUint32LE(); + debug("_regionLayersCount: %d", _regionLayersCount); + for (uint i = 0; i < _regionLayersCount; ++i) { + stream.seek(regionLayersOffs + i * 20); + _regionLayers[i].load(data, stream); + } + + // Load region sequences + stream.seek(0x1E); + _regionSequencesCount = stream.readUint16LE(); + _regionSequences = new Sequence[_regionSequencesCount]; + stream.seek(0x48); + uint32 regionSequencesOffs = stream.readUint32LE(); + stream.seek(regionSequencesOffs); + for (uint i = 0; i < _regionSequencesCount; ++i) + _regionSequences[i].load(data, stream); + // Load background objects stream.seek(0x1C); _backgroundObjectsCount = stream.readUint16LE(); @@ -276,6 +340,10 @@ ScaleLayer *BackgroundResource::getScaleLayer(uint index) { return &_scaleLayers[index]; } +RegionLayer *BackgroundResource::getRegionLayer(uint index) { + return &_regionLayers[index]; +} + bool BackgroundResource::findNamedPoint(uint32 namedPointId, Common::Point &pt) { return _namedPoints.findNamedPoint(namedPointId, pt); } @@ -374,10 +442,10 @@ void BackgroundItem::pause() { // TODO ++_pauseCtr; if (_pauseCtr <= 1) { - /* TODO - for (uint i = 0; i < _bgRes->_item48sCount; ++i) - krndictRemoveID(_bgRes->_item48s[i].id); - */ + for (uint i = 0; i < _bgRes->_regionSequencesCount; ++i) { + Sequence *sequence = &_bgRes->_regionSequences[i]; + _vm->_dict->removeSequence(sequence->_sequenceId); + } _vm->setDefaultTextCoords(); _vm->_camera->getActiveState(_savedCameraState); _savedPalette = new byte[1024]; @@ -390,10 +458,10 @@ void BackgroundItem::unpause() { // TODO --_pauseCtr; if (_pauseCtr <= 0) { - /* TODO - for (uint i = 0; i < _bgRes->_item48sCount; ++i) - krndictAddID(_bgRes->_item48s[i].id, _bgRes->_item48s[i]); - */ + for (uint i = 0; i < _bgRes->_regionSequencesCount; ++i) { + Sequence *sequence = &_bgRes->_regionSequences[i]; + _vm->_dict->addSequence(sequence->_sequenceId, sequence); + } initSurface(); _vm->_screen->setPalette(_savedPalette, 1, 256); delete[] _savedPalette; diff --git a/engines/illusions/backgroundresource.h b/engines/illusions/backgroundresource.h index ca6a372660..3a7e1ebcef 100644 --- a/engines/illusions/backgroundresource.h +++ b/engines/illusions/backgroundresource.h @@ -39,6 +39,7 @@ namespace Illusions { class IllusionsEngine; +struct Sequence; class BackgroundResourceLoader : public BaseResourceLoader { public: @@ -89,6 +90,20 @@ protected: byte *_values; }; +class RegionLayer { +public: + void load(byte *dataStart, Common::SeekableReadStream &stream); + int getRegionIndex(Common::Point pos); + uint32 getRegionSequenceId(int regionIndex); +protected: + uint32 _unk; + byte *_regionSequenceIds; + int16 _width, _height; + int16 _mapWidth, _mapHeight; + byte *_map, *_values; +}; + + #if 0 BgResource_PathWalkRects struc ; (sizeof=0x8) count dd ? @@ -124,6 +139,7 @@ public: int findMasterBgIndex(); PriorityLayer *getPriorityLayer(uint index); ScaleLayer *getScaleLayer(uint index); + RegionLayer *getRegionLayer(uint index); bool findNamedPoint(uint32 namedPointId, Common::Point &pt); public: @@ -137,7 +153,13 @@ public: uint _scaleLayersCount; ScaleLayer *_scaleLayers; - + + uint _regionLayersCount; + RegionLayer *_regionLayers; + + uint _regionSequencesCount; + Sequence *_regionSequences; + uint _backgroundObjectsCount; BackgroundObject *_backgroundObjects; diff --git a/engines/illusions/scriptopcodes_duckman.cpp b/engines/illusions/scriptopcodes_duckman.cpp index 31da6924c0..0312172c5f 100644 --- a/engines/illusions/scriptopcodes_duckman.cpp +++ b/engines/illusions/scriptopcodes_duckman.cpp @@ -242,7 +242,7 @@ void ScriptOpcodes_Duckman::opEnterScene18(ScriptThread *scriptThread, OpCall &o _vm->enterScene(sceneId, 0); } -static uint dsceneId = 0, dthreadId = 0; +//static uint dsceneId = 0, dthreadId = 0; //static uint dsceneId = 0x00010008, dthreadId = 0x00020029;//Beginning in Jac //static uint dsceneId = 0x00010012, dthreadId = 0x0002009D;//Paramount //static uint dsceneId = 0x00010039, dthreadId = 0x00020089;//Map @@ -252,6 +252,7 @@ static uint dsceneId = 0, dthreadId = 0; //static uint dsceneId = 0x0001002D, dthreadId = 0x00020141; //static uint dsceneId = 0x0001004B, dthreadId = 0x0002029B; //static uint dsceneId = 0x00010021, dthreadId = 0x00020113; +static uint dsceneId = 0x0001000A, dthreadId = 0x00020043; void ScriptOpcodes_Duckman::opChangeScene(ScriptThread *scriptThread, OpCall &opCall) { ARG_SKIP(2); diff --git a/engines/illusions/sequenceopcodes.cpp b/engines/illusions/sequenceopcodes.cpp index 7266f8b19f..868a565170 100644 --- a/engines/illusions/sequenceopcodes.cpp +++ b/engines/illusions/sequenceopcodes.cpp @@ -332,7 +332,7 @@ void SequenceOpcodes::opSetRegionLayer(Control *control, OpCall &opCall) { ARG_INT16(regionLayerIndex); BackgroundResource *bgRes = _vm->_backgroundItems->getActiveBgResource(); control->_actor->_flags |= 0x20; -//TODO control->_actor->_regionLayer = bgRes->getRegionLayer(regionLayerIndex - 1); + control->_actor->_regionLayer = bgRes->getRegionLayer(regionLayerIndex - 1); } void SequenceOpcodes::opPlaySound(Control *control, OpCall &opCall) { |