aboutsummaryrefslogtreecommitdiff
path: root/engines/cine/object.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/cine/object.cpp')
-rw-r--r--engines/cine/object.cpp160
1 files changed, 68 insertions, 92 deletions
diff --git a/engines/cine/object.cpp b/engines/cine/object.cpp
index bba1c094f1..36f7b17a69 100644
--- a/engines/cine/object.cpp
+++ b/engines/cine/object.cpp
@@ -36,27 +36,7 @@
namespace Cine {
objectStruct objectTable[NUM_MAX_OBJECT];
-ScriptVars globalVars(NUM_MAX_VAR);
-overlayHeadElement overlayHead;
-
-void unloadAllMasks(void) {
- overlayHeadElement *current = overlayHead.next;
-
- while (current) {
- overlayHeadElement *next = current->next;
-
- delete current;
-
- current = next;
- }
-
- resetMessageHead();
-}
-
-void resetMessageHead(void) {
- overlayHead.next = NULL;
- overlayHead.previous = NULL;
-}
+Common::List<overlay> overlayList;
void loadObject(char *pObjectName) {
uint16 numEntry;
@@ -100,92 +80,88 @@ void loadObject(char *pObjectName) {
free(dataPtr);
}
-int8 removeOverlayElement(uint16 objIdx, uint16 param) {
- overlayHeadElement *currentHeadPtr = &overlayHead;
- overlayHeadElement *tempHead = currentHeadPtr;
- overlayHeadElement *tempPtr2;
-
- currentHeadPtr = tempHead->next;
-
- while (currentHeadPtr && (currentHeadPtr->objIdx != objIdx || currentHeadPtr->type != param)) {
- tempHead = currentHeadPtr;
- currentHeadPtr = tempHead->next;
- }
-
- if (!currentHeadPtr || currentHeadPtr->objIdx != objIdx || currentHeadPtr->type != param) {
- return -1;
- }
-
- tempHead->next = tempPtr2 = currentHeadPtr->next;
+/*! \brief Remove overlay sprite from the list
+ * \param objIdx Remove overlay associated with this object
+ * \param param Remove overlay of this type
+ */
+int removeOverlay(uint16 objIdx, uint16 param) {
+ Common::List<overlay>::iterator it;
- if (!tempPtr2) {
- tempPtr2 = &overlayHead;
+ for (it = overlayList.begin(); it != overlayList.end(); ++it) {
+ if (it->objIdx == objIdx && it->type == param) {
+ overlayList.erase(it);
+ return 1;
+ }
}
- tempPtr2->previous = currentHeadPtr->previous;
-
- delete currentHeadPtr;
-
return 0;
}
-int16 freeOverlay(uint16 objIdx, uint16 param) {
- overlayHeadElement *currentHeadPtr = overlayHead.next;
- overlayHeadElement *previousPtr = &overlayHead;
- overlayHeadElement *tempPtr2;
-
- while (currentHeadPtr && ((currentHeadPtr->objIdx != objIdx) || (currentHeadPtr->type != param))) {
- previousPtr = currentHeadPtr;
- currentHeadPtr = previousPtr->next;
- }
-
- if (!currentHeadPtr || !((currentHeadPtr->objIdx == objIdx) && (currentHeadPtr->type == param))) {
- return -1;
- }
-
- previousPtr->next = tempPtr2 = currentHeadPtr->next;
+/*! \brief Add new overlay sprite to the list
+ * \param objIdx Associate the overlay with this object
+ * \param param Type of new overlay
+ * \todo Why are x, y, width and color left uninitialized?
+ */
+void addOverlay(uint16 objIdx, uint16 param) {
+ Common::List<overlay>::iterator it;
+ overlay tmp;
- if (!tempPtr2) {
- tempPtr2 = &overlayHead;
+ for (it = overlayList.begin(); it != overlayList.end(); ++it) {
+ if (objectTable[it->objIdx].mask >= objectTable[objIdx].mask) {
+ break;
+ }
}
- tempPtr2->previous = currentHeadPtr->previous;
+ tmp.objIdx = objIdx;
+ tmp.type = param;
- delete currentHeadPtr;
- return 0;
+ overlayList.insert(it, tmp);
}
-void loadOverlayElement(uint16 objIdx, uint16 param) {
- overlayHeadElement *currentHeadPtr = &overlayHead;
- overlayHeadElement *pNewElement;
-
- uint16 si = objectTable[objIdx].mask;
-
- overlayHeadElement *tempHead = currentHeadPtr;
-
- currentHeadPtr = tempHead->next;
-
- while (currentHeadPtr && (objectTable[currentHeadPtr->objIdx].mask < si)) {
- tempHead = currentHeadPtr;
- currentHeadPtr = tempHead->next;
+/*! \brief Add new background mask overlay
+ * \param objIdx Associate the overlay with this object
+ * \param param source background index
+ */
+void addGfxElementA0(int16 objIdx, int16 param) {
+ Common::List<overlay>::iterator it;
+ overlay tmp;
+
+ for (it = overlayList.begin(); it != overlayList.end(); ++it) {
+ // wtf?!
+ if (objectTable[it->objIdx].mask == objectTable[objIdx].mask &&
+ (it->type == 2 || it->type == 3)) {
+ break;
+ }
}
- pNewElement = new overlayHeadElement;
+ if (it != overlayList.end() && it->objIdx == objIdx && it->type == 20 && it->x == param) {
+ return;
+ }
- assert(pNewElement);
+ tmp.objIdx = objIdx;
+ tmp.type = 20;
+ tmp.x = param;
+ tmp.y = 0;
+ tmp.width = 0;
+ tmp.color = 0;
- pNewElement->next = tempHead->next;
- tempHead->next = pNewElement;
+ overlayList.insert(it, tmp);
+}
- pNewElement->objIdx = objIdx;
- pNewElement->type = param;
+/*! \brief Remove background mask overlay
+ * \param objIdx Remove overlay associated with this object
+ * \param param Remove overlay using this background
+ * \todo Check that it works
+ */
+void removeGfxElementA0(int16 objIdx, int16 param) {
+ Common::List<overlay>::iterator it;
- if (!currentHeadPtr) {
- currentHeadPtr = &overlayHead;
+ for (it = overlayList.begin(); it != overlayList.end(); ++it) {
+ if (it->objIdx == objIdx && it->type == 20 && it->x == param) {
+ overlayList.erase(it);
+ return;
+ }
}
-
- pNewElement->previous = currentHeadPtr->previous;
- currentHeadPtr->previous = pNewElement;
}
void setupObject(byte objIdx, uint16 param1, uint16 param2, uint16 param3, uint16 param4) {
@@ -194,8 +170,8 @@ void setupObject(byte objIdx, uint16 param1, uint16 param2, uint16 param3, uint1
objectTable[objIdx].mask = param3;
objectTable[objIdx].frame = param4;
- if (!removeOverlayElement(objIdx, 0)) {
- loadOverlayElement(objIdx, 0);
+ if (removeOverlay(objIdx, 0)) {
+ addOverlay(objIdx, 0);
}
}
@@ -223,8 +199,8 @@ void modifyObjectParam(byte objIdx, byte paramIdx, int16 newValue) {
case 2:
objectTable[objIdx].mask = newValue;
- if (!removeOverlayElement(objIdx, 0)) {
- loadOverlayElement(objIdx, 0);
+ if (removeOverlay(objIdx, 0)) {
+ addOverlay(objIdx, 0);
}
break;
case 3: