diff options
author | Vincent Hamm | 2007-04-28 22:31:55 +0000 |
---|---|---|
committer | Vincent Hamm | 2007-04-28 22:31:55 +0000 |
commit | fe8d2a8e7f899858784464550423f0deb5470f6c (patch) | |
tree | 7483ffa768fa6271cf9263253673588815315b74 /engines/cruise/cell.cpp | |
parent | 339c39f8b7dcc2d245ba936f332592490f0bac3d (diff) | |
download | scummvm-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.cpp | 257 |
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 |