aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2015-12-24 17:51:04 +0100
committerWillem Jan Palenstijn2015-12-24 20:28:57 +0100
commit1a1525a15501072da93ec0a7c1ef356886bd13a8 (patch)
tree10dcfc98f83b25aea7f202ecb901c7f81aca886a
parentcd3ebf687c0e783147723095056d72684eddd347 (diff)
downloadscummvm-rg350-1a1525a15501072da93ec0a7c1ef356886bd13a8.tar.gz
scummvm-rg350-1a1525a15501072da93ec0a7c1ef356886bd13a8.tar.bz2
scummvm-rg350-1a1525a15501072da93ec0a7c1ef356886bd13a8.zip
LAB: Avoid manual memory management of ViewData
-rw-r--r--engines/lab/processroom.cpp14
-rw-r--r--engines/lab/processroom.h3
-rw-r--r--engines/lab/resource.cpp49
-rw-r--r--engines/lab/resource.h4
4 files changed, 26 insertions, 44 deletions
diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index e49d2acd02..daf4f3ba84 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -56,16 +56,16 @@ ViewData *LabEngine::getViewData(uint16 roomNum, uint16 direction) {
if (_rooms[roomNum]._roomMsg.empty())
_resource->readViews(roomNum);
- ViewData *view = _rooms[roomNum]._view[direction];
+ Common::List<ViewData> &views = _rooms[roomNum]._view[direction];
- do {
- if (checkConditions(view->_condition))
- break;
+ Common::List<ViewData>::iterator view;
- view = view->_nextCondition;
- } while (true);
+ for (view = views.begin(); view != views.end(); ++view) {
+ if (checkConditions(view->_condition))
+ return &(*view);
+ }
- return view;
+ error("No view with matching condition found");
}
CloseData *LabEngine::getObject(Common::Point pos, CloseDataPtr closePtr) {
diff --git a/engines/lab/processroom.h b/engines/lab/processroom.h
index 0cfe98f9df..88dd544f7b 100644
--- a/engines/lab/processroom.h
+++ b/engines/lab/processroom.h
@@ -150,7 +150,6 @@ struct CloseData {
struct ViewData {
Common::Array<int16> _condition;
Common::String _graphicName;
- ViewData *_nextCondition;
CloseDataPtr _closeUps;
};
@@ -173,7 +172,7 @@ struct Rule {
struct RoomData {
uint16 _doors[4];
byte _transitionType;
- ViewData *_view[4];
+ Common::List<ViewData> _view[4];
RuleList _rules;
Common::String _roomMsg;
};
diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp
index bd86cd3f4d..5de2df802d 100644
--- a/engines/lab/resource.cpp
+++ b/engines/lab/resource.cpp
@@ -108,11 +108,6 @@ void Resource::readRoomData(const Common::String fileName) {
curRoom->_doors[kDirectionEast] = dataFile->readUint16LE();
curRoom->_doors[kDirectionWest] = dataFile->readUint16LE();
curRoom->_transitionType = dataFile->readByte();
-
- curRoom->_view[kDirectionNorth] = nullptr;
- curRoom->_view[kDirectionSouth] = nullptr;
- curRoom->_view[kDirectionEast] = nullptr;
- curRoom->_view[kDirectionWest] = nullptr;
}
delete dataFile;
@@ -142,10 +137,10 @@ void Resource::readViews(uint16 roomNum) {
RoomData *curRoom = &_vm->_rooms[roomNum];
curRoom->_roomMsg = readString(dataFile);
- curRoom->_view[kDirectionNorth] = readView(dataFile);
- curRoom->_view[kDirectionSouth] = readView(dataFile);
- curRoom->_view[kDirectionEast] = readView(dataFile);
- curRoom->_view[kDirectionWest] = readView(dataFile);
+ readView(dataFile, curRoom->_view[kDirectionNorth]);
+ readView(dataFile, curRoom->_view[kDirectionSouth]);
+ readView(dataFile, curRoom->_view[kDirectionEast]);
+ readView(dataFile, curRoom->_view[kDirectionWest]);
readRule(dataFile, curRoom->_rules);
_vm->updateMusicAndEvents();
@@ -326,34 +321,22 @@ void Resource::freeCloseUps(CloseData *closeUps) {
}
}
-ViewData *Resource::readView(Common::File *file) {
- ViewData *view = nullptr;
- ViewData *prev = nullptr;
- ViewData *head = nullptr;
-
+void Resource::readView(Common::File *file, Common::List<ViewData> &list) {
+ list.clear();
while (file->readByte() == 1) {
- view = new ViewData();
- if (!head)
- head = view;
- if (prev)
- prev->_nextCondition = view;
- view->_condition = readConditions(file);
- view->_graphicName = readString(file);
- view->_closeUps = readCloseUps(0, file);
- view->_nextCondition = nullptr;
- prev = view;
- }
+ list.push_back(ViewData());
+ ViewData &view = list.back();
- return head;
+ view._condition = readConditions(file);
+ view._graphicName = readString(file);
+ view._closeUps = readCloseUps(0, file);
+ }
}
-void Resource::freeView(ViewData *view) {
- while (view) {
- ViewData *nextView = view->_nextCondition;
- freeCloseUps(view->_closeUps);
- delete view;
- view = nextView;
- }
+void Resource::freeView(Common::List<ViewData> &view) {
+ Common::List<ViewData>::iterator i;
+ for (i = view.begin(); i != view.end(); ++i)
+ freeCloseUps(i->_closeUps);
}
} // End of namespace Lab
diff --git a/engines/lab/resource.h b/engines/lab/resource.h
index d3ed3633df..39672d1e32 100644
--- a/engines/lab/resource.h
+++ b/engines/lab/resource.h
@@ -115,8 +115,8 @@ private:
void freeAction(Action *action);
CloseData *readCloseUps(uint16 depth, Common::File *file);
void freeCloseUps(CloseData *closeUps);
- ViewData *readView(Common::File *file);
- void freeView(ViewData *view);
+ void readView(Common::File *file, Common::List<ViewData> &view);
+ void freeView(Common::List<ViewData> &view);
void readStaticText();
Common::String translateFileName(const Common::String filename);