aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Howell2005-10-14 02:13:33 +0000
committerTravis Howell2005-10-14 02:13:33 +0000
commit7af9ece552c7bafb32d61305c2b8c7dce133ec03 (patch)
treea03892d3b1e6dae1f9371f79976145a190ad7ea2
parenta3d0fcea54866b29749bcb67f60e8c28bb207116 (diff)
downloadscummvm-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.cpp38
-rw-r--r--scumm/resource.cpp4
-rw-r--r--scumm/room.cpp3
-rw-r--r--scumm/scumm.cpp2
-rw-r--r--scumm/scumm.h4
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();