aboutsummaryrefslogtreecommitdiff
path: root/engines/cruise/cell.cpp
diff options
context:
space:
mode:
authorVincent Hamm2007-04-28 22:31:55 +0000
committerVincent Hamm2007-04-28 22:31:55 +0000
commitfe8d2a8e7f899858784464550423f0deb5470f6c (patch)
tree7483ffa768fa6271cf9263253673588815315b74 /engines/cruise/cell.cpp
parent339c39f8b7dcc2d245ba936f332592490f0bac3d (diff)
downloadscummvm-rg350-fe8d2a8e7f899858784464550423f0deb5470f6c.tar.gz
scummvm-rg350-fe8d2a8e7f899858784464550423f0deb5470f6c.tar.bz2
scummvm-rg350-fe8d2a8e7f899858784464550423f0deb5470f6c.zip
More cleanup
Few bug fix svn-id: r26666
Diffstat (limited to 'engines/cruise/cell.cpp')
-rw-r--r--engines/cruise/cell.cpp257
1 files changed, 234 insertions, 23 deletions
diff --git a/engines/cruise/cell.cpp b/engines/cruise/cell.cpp
index c2a4f66d38..ff0570f194 100644
--- a/engines/cruise/cell.cpp
+++ b/engines/cruise/cell.cpp
@@ -32,6 +32,15 @@ void resetPtr(cellStruct *ptr) {
ptr->prev = NULL;
}
+void freeMessageList(cellStruct *objPtr) {
+/* if (objPtr) {
+ if(objPtr->next)
+ free(objPtr->next);
+
+ free(objPtr);
+ } */
+}
+
void loadSavegameDataSub2(FILE *f) {
unsigned short int n_chunks;
int i;
@@ -60,9 +69,7 @@ void loadSavegameDataSub2(FILE *f) {
}
}
-cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,
- int16 scriptType, int16 scriptNumber, int16 scriptOverlay, int16 param3,
- int16 param4) {
+cellStruct *addCell(cellStruct *pHead, int16 overlayIdx, int16 objIdx, int16 type, int16 backgroundPlane, int16 scriptOverlay, int16 scriptNumber, int16 scriptType) {
int16 var;
cellStruct *newElement;
@@ -70,7 +77,7 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,
cellStruct *currentHead2;
cellStruct *currentHead3;
- if (getSingleObjectParam(overlayIdx, param2, 2, &var) < 0) {
+ if (getSingleObjectParam(overlayIdx, objIdx, 2, &var) < 0) {
return 0;
}
@@ -85,8 +92,7 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,
if (currentHead2->type != 5) {
int16 lvar2;
- getSingleObjectParam(currentHead2->overlay,
- currentHead2->idx, 2, &lvar2);
+ getSingleObjectParam(currentHead2->overlay, currentHead2->idx, 2, &lvar2);
if (lvar2 > var)
break;
@@ -98,9 +104,9 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,
if (currentHead2) {
if ((currentHead2->overlay == overlayIdx) &&
- (currentHead2->backgroundPlane == param3) &&
- (currentHead2->idx == param2) &&
- (currentHead2->type == param4))
+ (currentHead2->backgroundPlane == backgroundPlane) &&
+ (currentHead2->idx == objIdx) &&
+ (currentHead2->type == type))
return NULL;
}
@@ -115,25 +121,26 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,
newElement->next = currentHead3->next;
currentHead3->next = newElement;
- newElement->idx = param2;
- newElement->type = param4;
- newElement->backgroundPlane = param3;
+ newElement->idx = objIdx;
+ newElement->type = type;
+ newElement->backgroundPlane = backgroundPlane;
newElement->overlay = overlayIdx;
newElement->freeze = 0;
- newElement->field_16 = scriptNumber;
- newElement->field_18 = scriptOverlay;
+ newElement->parent = scriptNumber;
+ newElement->parentOverlay = scriptOverlay;
newElement->gfxPtr = NULL;
- newElement->followObjectIdx = param2;
+ newElement->followObjectIdx = objIdx;
newElement->followObjectOverlayIdx = overlayIdx;
- newElement->field_1A = scriptType;
- newElement->field_20 = 0;
- newElement->field_22 = 0;
- newElement->nextAnimDelay = 0;
- newElement->field_2C = 0;
- newElement->currentAnimDelay = 0;
- newElement->field_2A = 0;
+ newElement->parentType = scriptType;
+
+ newElement->animStart = 0;
+ newElement->animEnd = 0;
+ newElement->animWait = 0;
+ newElement->animSignal = 0;
+ newElement->animCounter = 0;
+ newElement->animType = 0;
newElement->animStep = 0;
- newElement->field_30 = 0;
+ newElement->animLoop = 0;
if (currentHead) {
newElement->prev = currentHead->prev;
@@ -146,4 +153,208 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,
return newElement;
}
+void createTextObject(int overlayIdx, int oldVar8, cellStruct *pObject, int scriptNumber, int scriptOverlayNumber, int backgroundPlane, int16 color, int oldVar2, int oldVar4, int oldVar6) {
+
+ char *ax;
+ cellStruct *savePObject = pObject;
+ cellStruct *cx;
+
+ cellStruct *pNewElement;
+ cellStruct *si = pObject->next;
+ cellStruct *var_2;
+
+ while (si) {
+ pObject = si;
+ si = si->next;
+ }
+
+ var_2 = si;
+
+ pNewElement = (cellStruct *) malloc(sizeof(cellStruct));
+
+ pNewElement->next = pObject->next;
+ pObject->next = pNewElement;
+
+ pNewElement->idx = oldVar8;
+ pNewElement->type = 5;
+ pNewElement->backgroundPlane = backgroundPlane;
+ pNewElement->overlay = overlayIdx;
+ pNewElement->x = oldVar6;
+ pNewElement->field_C = oldVar4;
+ pNewElement->spriteIdx = oldVar2;
+ pNewElement->color = color;
+ pNewElement->freeze = 0;
+ pNewElement->parent = scriptNumber;
+ pNewElement->parentOverlay = scriptOverlayNumber;
+ pNewElement->gfxPtr = NULL;
+
+ if (var_2) {
+ cx = var_2;
+ } else {
+ cx = savePObject;
+ }
+
+ pNewElement->prev = cx->prev;
+ cx->prev = pNewElement;
+
+ ax = getText(oldVar8, overlayIdx);
+
+ if (ax) {
+ pNewElement->gfxPtr = renderText(oldVar2, (uint8 *) ax);
+ }
+}
+
+void removeCell(cellStruct *objPtr, int ovlNumber, int objectIdx, int objType, int backgroundPlane ) {
+ cellStruct *currentObj = objPtr->next;
+ cellStruct *previous;
+
+ while (currentObj) {
+ if (((currentObj->overlay == ovlNumber) || (ovlNumber == -1)) &&
+ ((currentObj->idx == objectIdx) || (objectIdx == -1)) &&
+ ((currentObj->type == objType) || (objType == -1)) &&
+ ((currentObj->backgroundPlane == backgroundPlane) || (backgroundPlane == -1))) {
+ currentObj->type = -1;
+ }
+
+ currentObj = currentObj->next;
+ }
+
+ previous = objPtr;
+ currentObj = objPtr->next;
+
+ while (currentObj) {
+ cellStruct *si;
+
+ si = currentObj;
+
+ if (si->type == -1) {
+ cellStruct *dx;
+ previous->next = si->next;
+
+ dx = si->next;
+
+ if (!si->next) {
+ dx = objPtr;
+ }
+
+ dx->prev = si->prev;
+
+ // TODO: complelty wrong
+ //freeMessageList(si);
+
+ free(si);
+
+ currentObj = dx;
+ } else {
+ currentObj = si->next;
+ previous = si;
+ }
+ }
+}
+
+void freezeCell(cellStruct * pObject, int overlayIdx, int objIdx, int objType, int backgroundPlane, int oldFreeze, int newFreeze ) {
+ while (pObject) {
+ if ((pObject->overlay == overlayIdx) || (overlayIdx == -1)) {
+ if ((pObject->idx == objIdx) || (objIdx == -1)) {
+ if ((pObject->type == objType) || (objType == -1)) {
+ if ((pObject->backgroundPlane == backgroundPlane) || (backgroundPlane == -1)) {
+ if ((pObject->freeze == oldFreeze) || (oldFreeze == -1)) {
+ pObject->freeze = newFreeze;
+ }
+ }
+ }
+ }
+ }
+
+ pObject = pObject->next;
+ }
+}
+
+void sortCells(int16 param1, int16 param2, cellStruct *objPtr) {
+ int16 var;
+ cellStruct *var8_;
+ cellStruct *var40;
+ cellStruct *var3E;
+ cellStruct *currentObjPtrPrevious;
+ cellStruct *currentObjPtr2;
+ cellStruct *match;
+
+ getSingleObjectParam(param1, param2, 2, &var);
+
+ currentObjPtrPrevious = objPtr;
+ currentObjPtr2 = objPtr->next;
+
+ match = NULL;
+ var40 = NULL;
+ var3E = NULL;
+ var8_ = objPtr;
+
+ while (currentObjPtr2) {
+ if ((currentObjPtr2->overlay == param1) && (currentObjPtr2->idx == param2)) {// found
+ currentObjPtrPrevious->next = currentObjPtr2->next;
+
+ if (currentObjPtr2->next) {
+ currentObjPtr2->next->prev =
+ currentObjPtr2->prev;
+ } else {
+ objPtr->prev = currentObjPtr2->prev;
+ }
+
+ if (var40) {
+ var40->prev = currentObjPtr2;
+ } else {
+ var3E = currentObjPtr2;
+ }
+
+ currentObjPtr2->prev = NULL;
+
+ currentObjPtr2->next = var40;
+
+ var40 = currentObjPtr2;
+
+ if (match == NULL) {
+ match = currentObjPtr2;
+ }
+ } else {
+ if (currentObjPtr2->type == 5) {
+ var2 = 32000;
+ } else {
+ int16 varC;
+
+ getSingleObjectParam(currentObjPtr2->overlay,
+ currentObjPtr2->idx, 2, &varC);
+
+ var2 = varC;
+ }
+
+ if (var > var2) {
+ var8_ = currentObjPtr2;
+ }
+
+ currentObjPtrPrevious = currentObjPtrPrevious->next;
+ }
+
+ currentObjPtr2 = currentObjPtr2->next;
+ }
+
+ if (match) {
+ cellStruct *temp;
+
+ temp = var8_->next;
+
+ var8_->next = var40;
+ match->next = temp;
+
+ if (objPtr != var8_) {
+ var40->prev = var8_;
+ }
+
+ if (!temp) {
+ temp = match;
+ }
+
+ temp->prev = match;
+ }
+}
+
} // End of namespace Cruise