aboutsummaryrefslogtreecommitdiff
path: root/engines/lab/processroom.cpp
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2015-12-24 19:27:00 +0100
committerWillem Jan Palenstijn2015-12-24 20:28:57 +0100
commit0d97d1af820a55ab62ce259113f9ba1305f76c9f (patch)
treeb093fd6ff7b30c87cd573fec50e74f3c2c4be7fa /engines/lab/processroom.cpp
parent1a1525a15501072da93ec0a7c1ef356886bd13a8 (diff)
downloadscummvm-rg350-0d97d1af820a55ab62ce259113f9ba1305f76c9f.tar.gz
scummvm-rg350-0d97d1af820a55ab62ce259113f9ba1305f76c9f.tar.bz2
scummvm-rg350-0d97d1af820a55ab62ce259113f9ba1305f76c9f.zip
LAB: Avoid manual memory management of CloseData
Diffstat (limited to 'engines/lab/processroom.cpp')
-rw-r--r--engines/lab/processroom.cpp74
1 files changed, 39 insertions, 35 deletions
diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index daf4f3ba84..ec07adde0a 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -69,39 +69,37 @@ ViewData *LabEngine::getViewData(uint16 roomNum, uint16 direction) {
}
CloseData *LabEngine::getObject(Common::Point pos, CloseDataPtr closePtr) {
- CloseDataPtr wrkClosePtr;
+ Common::List<CloseData> *list;
if (!closePtr)
- wrkClosePtr = getViewData(_roomNum, _direction)->_closeUps;
+ list = &(getViewData(_roomNum, _direction)->_closeUps);
else
- wrkClosePtr = closePtr->_subCloseUps;
+ list = &(closePtr->_subCloseUps);
- Common::Rect objRect;
- while (wrkClosePtr) {
+ Common::List<CloseData>::iterator wrkClosePtr;
+ for (wrkClosePtr = list->begin(); wrkClosePtr != list->end(); ++wrkClosePtr) {
+ Common::Rect objRect;
objRect = _utils->rectScale(wrkClosePtr->_x1, wrkClosePtr->_y1, wrkClosePtr->_x2, wrkClosePtr->_y2);
if (objRect.contains(pos))
- return wrkClosePtr;
-
- wrkClosePtr = wrkClosePtr->_nextCloseUp;
+ return &(*wrkClosePtr);
}
return nullptr;
}
-CloseDataPtr LabEngine::findClosePtrMatch(CloseDataPtr closePtr, CloseDataPtr closePtrList) {
- CloseDataPtr resClosePtr;
+CloseDataPtr LabEngine::findClosePtrMatch(CloseDataPtr closePtr, Common::List<CloseData> &list) {
+ Common::List<CloseData>::iterator i;
- while (closePtrList) {
- if ((closePtr->_x1 == closePtrList->_x1) && (closePtr->_x2 == closePtrList->_x2) &&
- (closePtr->_y1 == closePtrList->_y1) && (closePtr->_y2 == closePtrList->_y2) &&
- (closePtr->_depth == closePtrList->_depth))
- return closePtrList;
+ for (i = list.begin(); i != list.end(); ++i) {
+ if ((closePtr->_x1 == i->_x1) && (closePtr->_x2 == i->_x2) &&
+ (closePtr->_y1 == i->_y1) && (closePtr->_y2 == i->_y2) &&
+ (closePtr->_depth == i->_depth))
+ return &(*i);
- resClosePtr = findClosePtrMatch(closePtr, closePtrList->_subCloseUps);
+ CloseDataPtr resClosePtr;
+ resClosePtr = findClosePtrMatch(closePtr, i->_subCloseUps);
if (resClosePtr)
return resClosePtr;
- else
- closePtrList = closePtrList->_nextCloseUp;
}
return nullptr;
@@ -174,50 +172,56 @@ uint16 LabEngine::processArrow(uint16 curDirection, uint16 arrow) {
return curDirection;
}
-void LabEngine::setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, bool useAbsoluteCoords) {
- CloseDataPtr closePtr;
+void LabEngine::setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, bool useAbsoluteCoords, bool next) {
+
+ Common::List<CloseData> *list;
if (!*closePtrList)
- closePtr = getViewData(_roomNum, _direction)->_closeUps;
+ list = &(getViewData(_roomNum, _direction)->_closeUps);
else
- closePtr = (*closePtrList)->_subCloseUps;
+ list = &((*closePtrList)->_subCloseUps);
- Common::Rect target;
- while (closePtr) {
+ Common::List<CloseData>::iterator closePtr;
+ for (closePtr = list->begin(); closePtr != list->end(); ++closePtr) {
+ Common::Rect target;
if (!useAbsoluteCoords)
target = Common::Rect(closePtr->_x1, closePtr->_y1, closePtr->_x2, closePtr->_y2);
else
target = _utils->rectScale(closePtr->_x1, closePtr->_y1, closePtr->_x2, closePtr->_y2);
if (target.contains(pos) && !closePtr->_graphicName.empty()) {
- *closePtrList = closePtr;
+
+ if (next) {
+ // cycle to the next one
+ ++closePtr;
+ if (closePtr == list->end())
+ closePtr = list->begin();
+ }
+ *closePtrList = &(*closePtr);
+
return;
}
-
- closePtr = closePtr->_nextCloseUp;
}
}
bool LabEngine::takeItem(Common::Point pos, CloseDataPtr *closePtrList) {
- CloseDataPtr closePtr;
-
+ Common::List<CloseData> *list;
if (!*closePtrList) {
- closePtr = getViewData(_roomNum, _direction)->_closeUps;
+ list = &(getViewData(_roomNum, _direction)->_closeUps);
} else if ((*closePtrList)->_closeUpType < 0) {
_conditions->inclElement(abs((*closePtrList)->_closeUpType));
return true;
} else
- closePtr = (*closePtrList)->_subCloseUps;
+ list = &((*closePtrList)->_subCloseUps);
- Common::Rect objRect;
- while (closePtr) {
+ Common::List<CloseData>::iterator closePtr;
+ for (closePtr = list->begin(); closePtr != list->end(); ++closePtr) {
+ Common::Rect objRect;
objRect = _utils->rectScale(closePtr->_x1, closePtr->_y1, closePtr->_x2, closePtr->_y2);
if (objRect.contains(pos) && (closePtr->_closeUpType < 0)) {
_conditions->inclElement(abs(closePtr->_closeUpType));
return true;
}
-
- closePtr = closePtr->_nextCloseUp;
}
return false;