diff options
author | Travis Howell | 2005-10-14 02:13:33 +0000 |
---|---|---|
committer | Travis Howell | 2005-10-14 02:13:33 +0000 |
commit | 7af9ece552c7bafb32d61305c2b8c7dce133ec03 (patch) | |
tree | a03892d3b1e6dae1f9371f79976145a190ad7ea2 | |
parent | a3d0fcea54866b29749bcb67f60e8c28bb207116 (diff) | |
download | scummvm-rg350-7af9ece552c7bafb32d61305c2b8c7dce133ec03.tar.gz scummvm-rg350-7af9ece552c7bafb32d61305c2b8c7dce133ec03.tar.bz2 scummvm-rg350-7af9ece552c7bafb32d61305c2b8c7dce133ec03.zip |
HE games store and restore locked FlObjects between rooms.
Fixes input issue in thinker1.
svn-id: r19072
-rw-r--r-- | scumm/object.cpp | 38 | ||||
-rw-r--r-- | scumm/resource.cpp | 4 | ||||
-rw-r--r-- | scumm/room.cpp | 3 | ||||
-rw-r--r-- | scumm/scumm.cpp | 2 | ||||
-rw-r--r-- | scumm/scumm.h | 4 |
5 files changed, 48 insertions, 3 deletions
diff --git a/scumm/object.cpp b/scumm/object.cpp index ee15d6adab..5190890f0a 100644 --- a/scumm/object.cpp +++ b/scumm/object.cpp @@ -507,7 +507,8 @@ void ScummEngine::clearRoomObjects() { _objs[i].obj_nr = 0; } } else { - // FIXME: Locking/FlObjects stuff? + storeFlObject(-1); + for (i = 0; i < _numLocalObjects; i++) { if (_objs[i].obj_nr < 1) // Optimise codepath continue; @@ -521,12 +522,41 @@ void ScummEngine::clearRoomObjects() { res.nukeResource(rtFlObject, _objs[i].fl_object_index); _objs[i].obj_nr = 0; _objs[i].fl_object_index = 0; + } else if (_heversion >= 70) { + storeFlObject(i); + _objs[i].obj_nr = 0; + _objs[i].fl_object_index = 0; } } } } } +void ScummEngine::storeFlObject(int slot) { + if (slot == -1) { + _numStoredFlObjects = 0; + } else { + memcpy(&_storedFlObjects[_numStoredFlObjects], &_objs[slot], sizeof(_objs[slot])); + _numStoredFlObjects++; + if (_numStoredFlObjects > 100) + error("Too many flobjects saved on room transition."); + } +} + +void ScummEngine::restoreFlObjects() { + if (!_numStoredFlObjects) + return; + + int i, slot; + + for (i = 0; i < _numStoredFlObjects; i++) { + slot = findLocalObjectSlot(); + memcpy(&_objs[slot], &_storedFlObjects[i], sizeof(_objs[slot])); + } + + _numStoredFlObjects = 0; +} + void ScummEngine::loadRoomObjects() { int i, j; ObjectData *od; @@ -1675,6 +1705,12 @@ void ScummEngine::loadFlObject(uint object, uint room) { if (whereIsObject(object) != WIO_NOT_FOUND) return; + int i; + for (i = 0; i < _numStoredFlObjects; i++) { + if (_storedFlObjects[i].obj_nr == object) + return; + } + // Locate the object in the room resource findObjectInRoom(&foir, foImageHeader | foCodeHeader, object, room); diff --git a/scumm/resource.cpp b/scumm/resource.cpp index 9a47405355..6e256a62dd 100644 --- a/scumm/resource.cpp +++ b/scumm/resource.cpp @@ -1251,8 +1251,10 @@ void ScummEngine::allocateArrays() { _roomVars = (int32 *)calloc(_numRoomVariables, sizeof(int32)); _scummVars = (int32 *)calloc(_numVariables, sizeof(int32)); _bitVars = (byte *)calloc(_numBitVariables >> 3, 1); - if (_heversion >= 60) + if (_heversion >= 60) { _arraySlot = (byte *)calloc(_numArray, 1); + _storedFlObjects = (ObjectData *)calloc(100, sizeof(ObjectData)); + } allocResTypeData(rtCostume, (_features & GF_NEW_COSTUMES) ? MKID('AKOS') : MKID('COST'), _numCostumes, "costume", 1); diff --git a/scumm/room.cpp b/scumm/room.cpp index 0e5fc4971c..fece6c4fd7 100644 --- a/scumm/room.cpp +++ b/scumm/room.cpp @@ -127,6 +127,7 @@ void ScummEngine::startScene(int room, Actor *a, int objectNr) { if (_currentRoom == 0) { _ENCD_offs = _EXCD_offs = 0; _numObjectsInRoom = 0; + restoreFlObjects(); return; } @@ -136,7 +137,7 @@ void ScummEngine::startScene(int room, Actor *a, int objectNr) { initBGBuffers(_roomHeight); loadRoomObjects(); - + restoreFlObjects(); if (VAR_ROOM_WIDTH != 0xFF && VAR_ROOM_HEIGHT != 0xFF) { VAR(VAR_ROOM_WIDTH) = _roomWidth; diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp index 6355463a75..ffe7b40188 100644 --- a/scumm/scumm.cpp +++ b/scumm/scumm.cpp @@ -946,6 +946,7 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS _musicEngine = NULL; _verbs = NULL; _objs = NULL; + _storedFlObjects = NULL; _debugFlags = 0; _sound = NULL; memset(&vm, 0, sizeof(vm)); @@ -970,6 +971,7 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS _numRoomVariables = 0; _numLocalObjects = 0; _numGlobalObjects = 0; + _numStoredFlObjects = 0; _numArray = 0; _numVerbs = 0; _numFlObject = 0; diff --git a/scumm/scumm.h b/scumm/scumm.h index fb3f0f0c89..6a8ca85ab8 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -376,6 +376,7 @@ public: VerbSlot *_verbs; ObjectData *_objs; + ObjectData *_storedFlObjects; ScummDebugger *_debugger; // Core variables @@ -512,6 +513,7 @@ protected: int _numNewNames, _numGlobalScripts; int _numRoomVariables; int _numPalettes, _numSprites, _numTalkies, _numUnk; + int _numStoredFlObjects; int _HEHeapSize; public: int _numLocalScripts, _numImages, _numRooms, _numScripts, _numSounds; // Used by HE games @@ -732,6 +734,8 @@ protected: virtual void loadRoomSubBlocks(); virtual void initRoomSubBlocks(); void clearRoomObjects(); + void storeFlObject(int slot); + void restoreFlObjects(); virtual void loadRoomObjects(); virtual void readArrayFromIndexFile(); |