From fab33bf6639d72776b1818131724af6d1a67ce58 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 17 Sep 2006 22:22:50 +0000 Subject: Moved stored flobjects to class ScummEngine_v70he svn-id: r23924 --- engines/scumm/he/intern_he.h | 10 +++++++ engines/scumm/object.cpp | 67 ++++++++++++++++++++++++++++---------------- engines/scumm/resource.cpp | 3 -- engines/scumm/room.cpp | 2 -- engines/scumm/scumm.cpp | 6 ++-- engines/scumm/scumm.h | 9 ++---- 6 files changed, 59 insertions(+), 38 deletions(-) (limited to 'engines/scumm') diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h index 0f87af8477..08e2c5554e 100644 --- a/engines/scumm/he/intern_he.h +++ b/engines/scumm/he/intern_he.h @@ -129,6 +129,9 @@ protected: bool _skipProcessActors; + int _numStoredFlObjects; + ObjectData *_storedFlObjects; + public: ScummEngine_v70he(OSystem *syst, const DetectorResult &dr); ~ScummEngine_v70he(); @@ -153,8 +156,15 @@ protected: virtual void readGlobalObjects(); virtual void readIndexBlock(uint32 blocktype, uint32 itemsize); + virtual void clearRoomObjects(); + virtual void resetRoomObjects(); + virtual int getActorFromPos(int x, int y); + virtual void loadFlObject(uint object, uint room); + void storeFlObject(int slot); + void restoreFlObjects(); + int getStringCharWidth(byte chr); virtual int setupStringArray(int size); void appendSubstring(int dst, int src, int len2, int len); diff --git a/engines/scumm/object.cpp b/engines/scumm/object.cpp index c0eb9c8ef3..177996de90 100644 --- a/engines/scumm/object.cpp +++ b/engines/scumm/object.cpp @@ -489,8 +489,6 @@ void ScummEngine::clearRoomObjects() { _objs[i].obj_nr = 0; } } else { - storeFlObject(-1); - for (i = 0; i < _numLocalObjects; i++) { if (_objs[i].obj_nr < 1) // Optimise codepath continue; @@ -504,31 +502,48 @@ void ScummEngine::clearRoomObjects() { _res->nukeResource(rtFlObject, _objs[i].fl_object_index); _objs[i].obj_nr = 0; _objs[i].fl_object_index = 0; - } else if (_game.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_v70he::resetRoomObjects() { + ScummEngine_v60he::resetRoomObjects(); + restoreFlObjects(); +} + +void ScummEngine_v70he::clearRoomObjects() { + _numStoredFlObjects = 0; + + for (int i = 0; i < _numLocalObjects; i++) { + if (_objs[i].obj_nr < 1) // Optimise codepath + continue; + + if (_objs[i].fl_object_index != 0) { + if (!_res->isLocked(rtFlObject, _objs[i].fl_object_index)) { + _res->nukeResource(rtFlObject, _objs[i].fl_object_index); + } else { + storeFlObject(i); + } + } + _objs[i].fl_object_index = 0; + _objs[i].obj_nr = 0; } + + if (_currentRoom == 0) + restoreFlObjects(); } -void ScummEngine::restoreFlObjects() { - if (!_numStoredFlObjects) - return; +void ScummEngine_v70he::storeFlObject(int slot) { + memcpy(&_storedFlObjects[_numStoredFlObjects], &_objs[slot], sizeof(_objs[slot])); + _numStoredFlObjects++; + if (_numStoredFlObjects > 100) + error("Too many flobjects saved on room transition."); +} + +void ScummEngine_v70he::restoreFlObjects() { int i, slot; for (i = 0; i < _numStoredFlObjects; i++) { @@ -1736,9 +1751,19 @@ int ScummEngine::findFlObjectSlot() { return -1; } +void ScummEngine_v70he::loadFlObject(uint object, uint room) { + // Don't load an already stored object + for (int i = 0; i < _numStoredFlObjects; i++) { + if (_storedFlObjects[i].obj_nr == object) + return; + } + + ScummEngine_v60he::loadFlObject(object, room); +} + void ScummEngine::loadFlObject(uint object, uint room) { FindObjectInRoom foir; - int i, slot, objslot; + int slot, objslot; ObjectData *od; byte *flob; uint32 obcd_size, obim_size, flob_size; @@ -1748,12 +1773,6 @@ void ScummEngine::loadFlObject(uint object, uint room) { if (getObjectIndex(object) != -1) return; - // Don't load an already stored object - 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/engines/scumm/resource.cpp b/engines/scumm/resource.cpp index c6053f8453..dff9c8fd1f 100644 --- a/engines/scumm/resource.cpp +++ b/engines/scumm/resource.cpp @@ -1288,9 +1288,6 @@ void ScummEngine::allocateArrays() { if (_game.heversion >= 60) { _arraySlot = (byte *)calloc(_numArray, 1); } - if (_game.heversion >= 70) { - _storedFlObjects = (ObjectData *)calloc(100, sizeof(ObjectData)); - } _res->allocResTypeData(rtCostume, (_game.features & GF_NEW_COSTUMES) ? MKID_BE('AKOS') : MKID_BE('COST'), _numCostumes, "costume", 1); diff --git a/engines/scumm/room.cpp b/engines/scumm/room.cpp index 82257976d2..ee8671322c 100644 --- a/engines/scumm/room.cpp +++ b/engines/scumm/room.cpp @@ -139,7 +139,6 @@ void ScummEngine::startScene(int room, Actor *a, int objectNr) { if (_currentRoom == 0) { _ENCD_offs = _EXCD_offs = 0; _numObjectsInRoom = 0; - restoreFlObjects(); return; } @@ -149,7 +148,6 @@ void ScummEngine::startScene(int room, Actor *a, int objectNr) { initBGBuffers(_roomHeight); resetRoomObjects(); - restoreFlObjects(); if (VAR_ROOM_WIDTH != 0xFF && VAR_ROOM_HEIGHT != 0xFF) { VAR(VAR_ROOM_WIDTH) = _roomWidth; diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index fd1c6f74e9..ef258efbf4 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -48,6 +48,7 @@ #include "scumm/he/intern_he.h" #include "scumm/he/logic_he.h" #include "scumm/he/sound_he.h" +#include "scumm/object.h" #include "scumm/player_nes.h" #include "scumm/player_v1.h" #include "scumm/player_v2.h" @@ -243,7 +244,6 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr) _musicEngine = NULL; _verbs = NULL; _objs = NULL; - _storedFlObjects = NULL; _debugFlags = 0; _sound = NULL; memset(&vm, 0, sizeof(vm)); @@ -268,7 +268,6 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr) _numRoomVariables = 0; _numLocalObjects = 0; _numGlobalObjects = 0; - _numStoredFlObjects = 0; _numArray = 0; _numVerbs = 0; _numFlObject = 0; @@ -836,6 +835,9 @@ ScummEngine_v70he::ScummEngine_v70he(OSystem *syst, const DetectorResult &dr) _skipProcessActors = 0; + _numStoredFlObjects = 0; + _storedFlObjects = (ObjectData *)calloc(100, sizeof(ObjectData)); + VAR_NUM_SOUND_CHANNELS = 0xFF; VAR_WIZ_TCOLOR = 0xFF; } diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 9d51d504b5..91d9cc3f33 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -432,7 +432,6 @@ public: VerbSlot *_verbs; ObjectData *_objs; - ObjectData *_storedFlObjects; ScummDebugger *_debugger; // Core variables @@ -582,7 +581,6 @@ 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 @@ -800,10 +798,7 @@ protected: virtual void setupRoomSubBlocks(); virtual void resetRoomSubBlocks(); - void storeFlObject(int slot); - void restoreFlObjects(); - - void clearRoomObjects(); + virtual void clearRoomObjects(); virtual void resetRoomObjects(); virtual void resetRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL); @@ -838,7 +833,7 @@ public: protected: void markObjectRectAsDirty(int obj); - void loadFlObject(uint object, uint room); + virtual void loadFlObject(uint object, uint room); void nukeFlObjects(int min, int max); int findFlObjectSlot(); int findLocalObjectSlot(); -- cgit v1.2.3