aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/cruise/actor.cpp36
-rw-r--r--engines/cruise/actor.h11
-rw-r--r--engines/cruise/cell.cpp257
-rw-r--r--engines/cruise/cell.h32
-rw-r--r--engines/cruise/cruise_main.cpp25
-rw-r--r--engines/cruise/dataLoader.cpp9
-rw-r--r--engines/cruise/decompiler.cpp2
-rw-r--r--engines/cruise/detection.cpp2
-rw-r--r--engines/cruise/function.cpp153
-rw-r--r--engines/cruise/mainDraw.cpp209
-rw-r--r--engines/cruise/object.cpp169
-rw-r--r--engines/cruise/object.h6
-rw-r--r--engines/cruise/overlay.cpp18
-rw-r--r--engines/cruise/overlay.h17
-rw-r--r--engines/cruise/saveload.cpp4
-rw-r--r--engines/cruise/script.cpp4
-rw-r--r--engines/cruise/script.h10
-rw-r--r--engines/cruise/various.cpp115
-rw-r--r--engines/cruise/various.h9
19 files changed, 469 insertions, 619 deletions
diff --git a/engines/cruise/actor.cpp b/engines/cruise/actor.cpp
index 505817282f..3d8e856d49 100644
--- a/engines/cruise/actor.cpp
+++ b/engines/cruise/actor.cpp
@@ -774,11 +774,7 @@ void processAnimation(void) {
getMultipleObjectParam(currentActor->overlayNumber,
currentActor->idx, &params);
- if (((animationStart && !currentActor->flag)
- || (!animationStart
- && currentActor->x_dest != -1
- && currentActor->y_dest != -1))
- && (currentActor->type == 0)) {
+ if (((animationStart && !currentActor->flag) || (!animationStart && currentActor->x_dest != -1 && currentActor->y_dest != -1)) && (currentActor->type == 0)) {
// mouse animation
if (!animationStart) {
var34 = currentActor->x_dest;
@@ -790,11 +786,7 @@ void processAnimation(void) {
currentActor->flag = 1;
}
- currentActor->pathId =
- computePathfinding(returnVar2, params.X,
- params.Y, var34, var35,
- currentActor->stepX, currentActor->stepY,
- currentActor->pathId);
+ currentActor->pathId = computePathfinding(returnVar2, params.X, params.Y, var34, var35, currentActor->stepX, currentActor->stepY, currentActor->pathId);
if (currentActor->pathId == -1) {
if ((currentActor->endDirection != -1)
@@ -1136,31 +1128,19 @@ void processAnimation(void) {
}
case ANIM_PHASE_END:
{
- int newA =
- raoul_end[currentActor->
- startDirection][0];
-
- set_anim(currentActor->
- overlayNumber,
- currentActor->idx,
- currentActor->start,
- currentActor->x,
- currentActor->y, newA,
- currentActor->poly);
+ int newA = raoul_end[currentActor->startDirection][0];
+
+ set_anim(currentActor->overlayNumber, currentActor->idx, currentActor->start, currentActor->x, currentActor->y, newA, currentActor->poly);
currentActor->pathId = -2;
- currentActor->phase =
- ANIM_PHASE_WAIT;
+ currentActor->phase = ANIM_PHASE_WAIT;
currentActor->flag = 0;
- currentActor->endDirection =
- -1;
+ currentActor->endDirection = -1;
break;
}
default:
{
- printf
- ("Unimplemented currentActor->phase=%d in processAnimation()\n",
- currentActor->phase);
+ printf("Unimplemented currentActor->phase=%d in processAnimation()\n", currentActor->phase);
// exit(1);
}
}
diff --git a/engines/cruise/actor.h b/engines/cruise/actor.h
index 7b8a5752dd..8df405f32e 100644
--- a/engines/cruise/actor.h
+++ b/engines/cruise/actor.h
@@ -64,10 +64,13 @@ struct actorStruct {
typedef struct actorStruct actorStruct;
-int16 mainProc13(int overlayIdx, int param1, actorStruct * pStartEntry,
- int param2);
-actorStruct *findActor(int overlayIdx, int param1, actorStruct * pStartEntry,
- int param2);
+extern int raoul_move[][13];
+extern int raoul_end[][13];
+extern int raoul_stat[][13];
+extern int raoul_invstat[][13];
+
+int16 mainProc13(int overlayIdx, int param1, actorStruct * pStartEntry, int param2);
+actorStruct *findActor(int overlayIdx, int param1, actorStruct * pStartEntry, int param2);
void processAnimation(void);
void getPixel(int x, int y);
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
diff --git a/engines/cruise/cell.h b/engines/cruise/cell.h
index 305df76561..2664d3421f 100644
--- a/engines/cruise/cell.h
+++ b/engines/cruise/cell.h
@@ -38,26 +38,26 @@ struct cellStruct {
int16 idx;
int16 type;
int16 overlay;
- int16 field_A;
+ int16 x;
int16 field_C;
int16 spriteIdx;
int16 color;
int16 backgroundPlane;
int16 freeze;
- int16 field_16;
- int16 field_18;
- int16 field_1A;
+ int16 parent;
+ int16 parentOverlay;
+ int16 parentType;
int16 followObjectOverlayIdx;
int16 followObjectIdx;
- int16 field_20;
- int16 field_22;
- int16 nextAnimDelay;
+ int16 animStart;
+ int16 animEnd;
+ int16 animWait;
int16 animStep;
- int16 field_28;
- int16 field_2A;
- int16 field_2C;
- int16 currentAnimDelay;
- int16 field_30;
+ int16 animChange;
+ int16 animType;
+ int16 animSignal;
+ int16 animCounter;
+ int16 animLoop;
gfxEntryStruct *gfxPtr;
};
@@ -65,9 +65,11 @@ extern cellStruct cellHead;
void resetPtr(cellStruct * ptr);
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);
+void createTextObject(int overlayIdx, int oldVar8, cellStruct * pObject, int scriptNumber, int scriptOverlayNumber, int backgroundPlane, int16 color, int oldVar2, int oldVar4, int oldVar6);
+void removeCell(cellStruct *objPtr, int ovlNumber, int objectIdx, int objType, int backgroundPlane );
+void freezeCell(cellStruct * pObject, int overlayIdx, int objIdx, int objType, int backgroundPlane, int oldFreeze, int newFreeze );
+void sortCells(int16 param1, int16 param2, cellStruct *objPtr);
} // End of namespace Cruise
diff --git a/engines/cruise/cruise_main.cpp b/engines/cruise/cruise_main.cpp
index 9784963315..f24e1f1cd7 100644
--- a/engines/cruise/cruise_main.cpp
+++ b/engines/cruise/cruise_main.cpp
@@ -480,8 +480,8 @@ int initAllData(void) {
initBigVar3();
- resetPtr2(&scriptHandle2);
- resetPtr2(&scriptHandle1);
+ resetPtr2(&procHead);
+ resetPtr2(&relHead);
resetPtr(&cellHead);
@@ -579,9 +579,8 @@ int initAllData(void) {
if (bootOverlayNumber) {
positionInStack = 0;
- attacheNewScriptToTail(bootOverlayNumber, &scriptHandle2, 0,
- 20, 0, 0, scriptType_20);
- scriptFunc2(bootOverlayNumber, &scriptHandle2, 1, 0);
+ attacheNewScriptToTail(bootOverlayNumber, &procHead, 0, 20, 0, 0, scriptType_PROC);
+ scriptFunc2(bootOverlayNumber, &procHead, 1, 0);
}
strcpyuint8(systemStrings.bootScriptName, "AUTO00");
@@ -878,7 +877,7 @@ int buildInventorySub1(int overlayIdx, int objIdx) {
getObjectDataFromOverlay(overlayIdx, objIdx);
if (pObjectData) {
- return pObjectData->var1;
+ return pObjectData->type;
} else {
return -11;
}
@@ -1029,7 +1028,7 @@ int callInventoryObject(int param0, int param1, int x, int y) {
var_34->stringNameOffset) {
if (pObject) {
if (pObject->
- var1 !=
+ type !=
3) {
char var_214[80];
char var_1C4[80];
@@ -1163,7 +1162,7 @@ int callInventoryObject(int param0, int param1, int x, int y) {
if (strlen(var_214)) {
attacheNewScriptToTail
(var_1E,
- &scriptHandle1,
+ &relHead,
var_34->
field_2,
30,
@@ -1171,7 +1170,7 @@ int callInventoryObject(int param0, int param1, int x, int y) {
scriptNumber,
currentScriptPtr->
overlayNumber,
- scriptType_30);
+ scriptType_REL);
} else {
if (var_22->specialString1) {
ptr = getObjectName(var_34->varNameOffset, var_22->specialString1);
@@ -1531,11 +1530,11 @@ void mainLoop(void) {
enableUser = 0;
}
- manageScripts(&scriptHandle1);
- manageScripts(&scriptHandle2);
+ manageScripts(&relHead);
+ manageScripts(&procHead);
- removeFinishedScripts(&scriptHandle1);
- removeFinishedScripts(&scriptHandle2);
+ removeFinishedScripts(&relHead);
+ removeFinishedScripts(&procHead);
processAnimation();
diff --git a/engines/cruise/dataLoader.cpp b/engines/cruise/dataLoader.cpp
index 774262aef0..285279b437 100644
--- a/engines/cruise/dataLoader.cpp
+++ b/engines/cruise/dataLoader.cpp
@@ -185,8 +185,7 @@ int updateResFileEntry(int height, int width, int entryNumber, int resType) {
return (-2);
filesDatabase[entryNumber].widthInColumn = width;
- filesDatabase[entryNumber].subData.ptr2 =
- filesDatabase[entryNumber].subData.ptr + size;
+ filesDatabase[entryNumber].subData.ptr2 = filesDatabase[entryNumber].subData.ptr + size;
filesDatabase[entryNumber].width = width / 8;
filesDatabase[entryNumber].resType = resType;
filesDatabase[entryNumber].height = height;
@@ -225,16 +224,14 @@ int createResFileEntry(int width, int height, int resType) {
width = (width * 8) / 5;
}
- filesDatabase[entryNumber].subData.ptr =
- (uint8 *) mallocAndZero(size + div);
+ filesDatabase[entryNumber].subData.ptr = (uint8 *) mallocAndZero(size + div);
if (filesDatabase[entryNumber].subData.ptr) {
return (-2);
}
filesDatabase[entryNumber].widthInColumn = width;
- filesDatabase[entryNumber].subData.ptr2 =
- filesDatabase[entryNumber].subData.ptr + size;
+ filesDatabase[entryNumber].subData.ptr2 = filesDatabase[entryNumber].subData.ptr + size;
filesDatabase[entryNumber].width = width / 8;
filesDatabase[entryNumber].resType = resType;
filesDatabase[entryNumber].height = height;
diff --git a/engines/cruise/decompiler.cpp b/engines/cruise/decompiler.cpp
index a2a554aedf..f902fe4673 100644
--- a/engines/cruise/decompiler.cpp
+++ b/engines/cruise/decompiler.cpp
@@ -837,7 +837,7 @@ int decompFunction(void) {
}
case 0x8:
{
- sprintf(tempbuffer, "_removeObjectFromList(%s,%s,%s)",
+ sprintf(tempbuffer, "_removeCell(%s,%s,%s)",
popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
diff --git a/engines/cruise/detection.cpp b/engines/cruise/detection.cpp
index d40f98f067..d875cc4943 100644
--- a/engines/cruise/detection.cpp
+++ b/engines/cruise/detection.cpp
@@ -75,7 +75,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
{
{
"cruise",
- "",
+ "256 colors",
AD_ENTRY1("D1", "a90d2b9ead6b4d812cd14268672cf178"),
Common::EN_ANY,
Common::kPlatformPC,
diff --git a/engines/cruise/function.cpp b/engines/cruise/function.cpp
index 5a996479a3..559cecd189 100644
--- a/engines/cruise/function.cpp
+++ b/engines/cruise/function.cpp
@@ -30,19 +30,6 @@ namespace Cruise {
opcodeFunction opcodeTablePtr[256];
-struct actorTableStruct {
- int data[13];
-};
-
-typedef struct actorTableStruct actorTableStruct;
-
-actorTableStruct actorTable1[] = {
- { { 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
- { { 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
- { { 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
- { {-38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
-};
-
int16 Op_LoadOverlay(void) {
uint8 *originalScriptName;
uint8 scriptName[38];
@@ -116,9 +103,9 @@ int16 Op_startScript(void) {
}
ptr =
- attacheNewScriptToTail(ovlIdx, &scriptHandle2, scriptIdx,
+ attacheNewScriptToTail(ovlIdx, &procHead, scriptIdx,
currentScriptPtr->type, currentScriptPtr->scriptNumber,
- currentScriptPtr->overlayNumber, scriptType_Minus20);
+ currentScriptPtr->overlayNumber, scriptType_MinusPROC);
if (!ptr)
return (0);
@@ -156,9 +143,7 @@ int16 Op_AddProc(void) {
if (!overlay)
return (0);
- attacheNewScriptToTail(overlay, &scriptHandle2, pop2,
- currentScriptPtr->type, currentScriptPtr->scriptNumber,
- currentScriptPtr->overlayNumber, scriptType_20);
+ attacheNewScriptToTail(overlay, &procHead, pop2, currentScriptPtr->type, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_PROC);
if (pop1 > 0) {
printf("Unsupported art send in op6!\n");
@@ -287,8 +272,7 @@ int16 Op_RemoveMessage(void) {
overlay = currentScriptPtr->overlayNumber;
}
- removeObjectFromList(overlay, idx, &cellHead,
- currentActiveBackgroundPlane, 5);
+ removeCell(&cellHead, overlay, idx, 5, currentActiveBackgroundPlane);
return (0);
}
@@ -349,7 +333,7 @@ int16 Op_RemoveProc(void) {
overlay = currentScriptPtr->overlayNumber;
}
- removeScript(overlay, idx, &scriptHandle2);
+ removeScript(overlay, idx, &procHead);
return (0);
}
@@ -423,10 +407,10 @@ int16 Op_changeCutSceneState(void) {
int16 Op_62(void) {
if (currentScriptPtr->var1A == 20) {
changeScriptParamInList(currentScriptPtr->var18,
- currentScriptPtr->var16, &scriptHandle2, 9997, -1);
+ currentScriptPtr->var16, &procHead, 9997, -1);
} else if (currentScriptPtr->var1A == 30) {
changeScriptParamInList(currentScriptPtr->var18,
- currentScriptPtr->var16, &scriptHandle1, 9997, -1);
+ currentScriptPtr->var16, &relHead, 9997, -1);
}
return 0;
@@ -541,7 +525,7 @@ int16 Op_InitializeState(void) {
if (!ovlIdx)
ovlIdx = currentScriptPtr->overlayNumber;
- Op_InitializeStateSub(ovlIdx, objIdx, param1);
+ objInit(ovlIdx, objIdx, param1);
return (0);
}
@@ -613,38 +597,34 @@ int16 Op_GetMouseClick3(void) {
}
int16 Op_AddCell(void) {
- int16 param1 = popVar();
- int16 param2 = popVar();
+ int16 objType = popVar();
+ int16 objIdx = popVar();
int16 overlayIdx = popVar();
if (!overlayIdx)
overlayIdx = currentScriptPtr->overlayNumber;
- addCell(overlayIdx, param2, &cellHead, currentScriptPtr->type,
- currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber,
- currentActiveBackgroundPlane, param1);
+ addCell(&cellHead, overlayIdx, objIdx, objType, currentActiveBackgroundPlane, currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, currentScriptPtr->type);
return 0;
}
-int16 Op_2F(void) {
- int16 param1 = popVar();
- int16 param2 = popVar();
+int16 Op_AddBackgroundIncrust(void) {
+ int16 objType = popVar();
+ int16 objIdx = popVar();
int16 overlayIdx = popVar();
if (!overlayIdx)
overlayIdx = currentScriptPtr->overlayNumber;
- addBackgroundIncrust(overlayIdx, param2, &backgroundIncrustHead,
- currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber,
- currentActiveBackgroundPlane, param1);
+ addBackgroundIncrust(overlayIdx, objIdx, &backgroundIncrustHead, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, currentActiveBackgroundPlane, objType);
return 0;
}
int16 Op_RemoveCell(void) {
- var1 = popVar();
+ int objType = popVar();
int objectIdx = popVar();
int ovlNumber = popVar();
@@ -652,8 +632,7 @@ int16 Op_RemoveCell(void) {
ovlNumber = currentScriptPtr->overlayNumber;
}
- removeObjectFromList(ovlNumber, objectIdx, &cellHead,
- currentActiveBackgroundPlane, var1);
+ removeCell(&cellHead, ovlNumber, objectIdx, objType, currentActiveBackgroundPlane);
return 0;
}
@@ -669,10 +648,10 @@ int16 Op_SetFontFileIndex(void) {
int16 Op_63(void) {
if (currentScriptPtr->var1A == 0x14) {
changeScriptParamInList(currentScriptPtr->var18,
- currentScriptPtr->var16, &scriptHandle2, 0, -1);
+ currentScriptPtr->var16, &procHead, 0, -1);
} else if (currentScriptPtr->var1A == 0x1E) {
changeScriptParamInList(currentScriptPtr->var18,
- currentScriptPtr->var16, &scriptHandle1, 0, -1);
+ currentScriptPtr->var16, &relHead, 0, -1);
}
return 0;
@@ -770,47 +749,39 @@ int16 Op_AutoCell(void) {
if (!overlay)
overlay = currentScriptPtr->overlayNumber;
- pObject =
- addCell(overlay, obj, &cellHead, currentScriptPtr->type,
- currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber,
- currentActiveBackgroundPlane, 4);
+ pObject = addCell(&cellHead, overlay, obj, 4, currentActiveBackgroundPlane, currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, currentScriptPtr->type);
if (!pObject)
return 0;
- pObject->field_2C = signal;
- pObject->field_30 = loop;
- pObject->nextAnimDelay = wait;
+ pObject->animSignal = signal;
+ pObject->animLoop = loop;
+ pObject->animWait = wait;
pObject->animStep = animStep;
- pObject->field_22 = end;
- pObject->field_20 = start;
- pObject->field_2A = type;
- pObject->field_28 = change;
+ pObject->animEnd = end;
+ pObject->animStart = start;
+ pObject->animType = type;
+ pObject->animChange = change;
if (type) {
- if (currentScriptPtr->type == 20) {
- changeScriptParamInList(currentScriptPtr->
- overlayNumber, currentScriptPtr->scriptNumber,
- &scriptHandle2, 9996, -1);
- } else if (currentScriptPtr->type == 30) {
- changeScriptParamInList(currentScriptPtr->
- overlayNumber, currentScriptPtr->scriptNumber,
- &scriptHandle1, 9996, -1);
+ if (currentScriptPtr->type == scriptType_PROC) {
+ changeScriptParamInList(currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, &procHead, 9996, -1);
+ } else if (currentScriptPtr->type == scriptType_REL) {
+ changeScriptParamInList(currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, &relHead, 9996, -1);
}
}
if (change == 5) {
- Op_InitializeStateSub(pObject->overlay, pObject->idx, start);
+ objInit(pObject->overlay, pObject->idx, start);
} else {
- setObjectPosition(pObject->overlay, pObject->idx,
- pObject->field_28, start);
+ setObjectPosition(pObject->overlay, pObject->idx, pObject->animChange, start);
}
if (wait < 0) {
objectParamsQuery params;
getMultipleObjectParam(overlay, obj, &params);
- pObject->currentAnimDelay = params.var6 - 1;
+ pObject->animCounter = params.var6 - 1;
}
return 0;
@@ -927,7 +898,7 @@ void removeBackgroundIncrust(int overlay, int idx,
}
}
-int16 Op_removeBackgroundIncrust(void) {
+int16 Op_RemoveBackgroundIncrust(void) {
int idx = popVar();
int overlay = popVar();
@@ -1178,11 +1149,11 @@ int16 Op_AddAnimation(void) {
si->stepX = stepX;
si->stepY = stepY;
- int newFrame = ABS(actorTable1[direction].data[0]) - 1;
+ int newFrame = ABS(raoul_end[direction][0]) - 1;
int zoom = computeZoom(params.Y);
- if (actorTable1[direction].data[0] < 0) {
+ if (raoul_end[direction][0] < 0) {
zoom = -zoom;
}
@@ -1332,47 +1303,19 @@ int16 Op_6C(void) {
return temp;
}
-void configureAllObjects(int overlayIdx, cellStruct * pObject, int _var4,
- int _var0, int _var1, int _var2, int _var3) {
- while (pObject) {
- if ((pObject->overlay == overlayIdx) || (overlayIdx == -1)) {
- if ((pObject->idx == _var4) || (_var4 == -1)) {
- if ((pObject->type == _var3) || (_var3 == -1)) {
- if ((pObject->backgroundPlane == _var2) || (_var2 == -1)) {
- if ((pObject->freeze == _var1) || (_var1 == -1)) {
- pObject->freeze = _var0;
- }
- }
- }
- }
- }
-
- pObject = pObject->next;
- }
-}
-
int16 Op_FreezeCell(void) {
- /*
- * int var0;
- * int var1;
- * int var2;
- * int var3;
- * int var4;
- * int var5;
- */
-
- var0 = popVar();
- var1 = popVar();
- var2 = popVar();
- var3 = popVar();
- var4 = popVar();
- var5 = popVar();
+ int newFreezz = popVar();
+ int oldFreeze = popVar();
+ int backgroundPlante = popVar();
+ int objType = popVar();
+ int objIdx = popVar();
+ int overlayIdx = popVar();
- if (!var5) {
- var5 = currentScriptPtr->overlayNumber;
+ if (!overlayIdx) {
+ overlayIdx = currentScriptPtr->overlayNumber;
}
- configureAllObjects(var5, &cellHead, var4, var0, var1, var2, var3);
+ freezeCell(&cellHead, overlayIdx, objIdx, objType, backgroundPlante, oldFreeze, newFreezz);
return 0;
}
@@ -1509,8 +1452,8 @@ void setupOpcodeTable(void) {
opcodeTablePtr[0x2B] = Op_2B;
opcodeTablePtr[0x2C] = Op_2C;
opcodeTablePtr[0x2E] = Op_releaseOverlay;
- opcodeTablePtr[0x2F] = Op_2F;
- opcodeTablePtr[0x30] = Op_removeBackgroundIncrust;
+ opcodeTablePtr[0x2F] = Op_AddBackgroundIncrust;
+ opcodeTablePtr[0x30] = Op_RemoveBackgroundIncrust;
opcodeTablePtr[0x32] = Op_freeBackgroundInscrustList;
opcodeTablePtr[0x37] = Op_37;
opcodeTablePtr[0x38] = Op_removeBackground;
diff --git a/engines/cruise/mainDraw.cpp b/engines/cruise/mainDraw.cpp
index 241905e56d..c1a52814df 100644
--- a/engines/cruise/mainDraw.cpp
+++ b/engines/cruise/mainDraw.cpp
@@ -29,43 +29,55 @@ namespace Cruise {
int currentTransparent;
-struct drawVar1Struct {
- struct drawVar1Struct *next;
- short int field_2;
- short int field_4;
- short int field_6;
- short int field_8;
- cellStruct *field_A;
+struct autoCellStruct {
+ struct autoCellStruct *next;
+ short int ovlIdx;
+ short int objIdx;
+ short int type;
+ short int newValue;
+ cellStruct *pCell;
};
-typedef struct drawVar1Struct drawVar1Struct;
+typedef struct autoCellStruct autoCellStruct;
-drawVar1Struct drawVar1;
+autoCellStruct autoCellHead;
-void mainDraw6(void) {
- drawVar1Struct *pCurrent = drawVar1.next;
+void addAutoCell(int overlayIdx, int idx, int type, int newVal, cellStruct *pObject) {
+ autoCellStruct *pNewEntry;
+
+ pNewEntry = new autoCellStruct;
+
+ pNewEntry->next = autoCellHead.next;
+ autoCellHead.next = pNewEntry;
+
+ pNewEntry->ovlIdx = overlayIdx;
+ pNewEntry->objIdx = idx;
+ pNewEntry->type = type;
+ pNewEntry->newValue = newVal;
+ pNewEntry->pCell = pObject;
+}
+
+void freeAutoCell(void) {
+ autoCellStruct *pCurrent = autoCellHead.next;
while (pCurrent) {
- drawVar1Struct *next = pCurrent->next;
+ autoCellStruct *next = pCurrent->next;
- if (pCurrent->field_6 == 5) {
- Op_InitializeStateSub(pCurrent->field_2,
- pCurrent->field_4, pCurrent->field_8);
+ if (pCurrent->type == 5) {
+ objInit(pCurrent->ovlIdx, pCurrent->objIdx, pCurrent->newValue);
} else {
- setObjectPosition(pCurrent->field_2, pCurrent->field_4,
- pCurrent->field_6, pCurrent->field_8);
+ setObjectPosition(pCurrent->ovlIdx, pCurrent->objIdx, pCurrent->type, pCurrent->newValue);
}
- if (pCurrent->field_A->nextAnimDelay < 0) {
+ if (pCurrent->pCell->animWait < 0) {
objectParamsQuery params;
- getMultipleObjectParam(pCurrent->field_2,
- pCurrent->field_4, &params);
+ getMultipleObjectParam(pCurrent->ovlIdx, pCurrent->objIdx, &params);
- pCurrent->field_A->currentAnimDelay = params.var6 - 1;
+ pCurrent->pCell->animCounter = params.var6 - 1;
}
- free(pCurrent);
+ delete pCurrent;
pCurrent = next;
}
@@ -683,22 +695,6 @@ void mainDrawSub4(int objX1, int var_6, cellStruct *currentObjPtr,
}
}
-void mainDraw5(int overlayIdx, int idx, int field_28, cellStruct *pObject,
- int newVal) {
- drawVar1Struct *pNewEntry;
-
- pNewEntry = (drawVar1Struct *) malloc(sizeof(drawVar1Struct));
-
- pNewEntry->next = drawVar1.next;
- drawVar1.next = pNewEntry;
-
- pNewEntry->field_2 = overlayIdx;
- pNewEntry->field_4 = idx;
- pNewEntry->field_6 = field_28;
- pNewEntry->field_8 = newVal;
- pNewEntry->field_A = pObject;
-}
-
#ifdef _DEBUG
void drawCtp(void) {
int i;
@@ -875,7 +871,7 @@ void mainDraw(int16 param) {
(char *)gfxModuleData.pPage10);
}
- drawVar1.next = NULL;
+ autoCellHead.next = NULL;
currentObjPtr = cellHead.next;
@@ -926,8 +922,7 @@ void mainDraw(int16 param) {
objZ2 += objZ1;
}
- if ((params.var5 >= 0) && (objZ2 >= 0)
- && filesDatabase[objZ2].subData.ptr) {
+ if ((params.var5 >= 0) && (objZ2 >= 0) && filesDatabase[objZ2].subData.ptr) {
if (filesDatabase[objZ2].subData.resourceType == 8) // Poly
{
mainDrawPolygons(objZ2, currentObjPtr, objX2, params.scale, objY2, (char *)gfxModuleData.pPage10, (char *)filesDatabase[objZ2].subData.ptr); // poly
@@ -935,88 +930,44 @@ void mainDraw(int16 param) {
{
} else if (filesDatabase[objZ2].resType == 1) //(num plan == 1)
{
- } else if (filesDatabase[objZ2].subData.
- resourceType == 4) {
+ } else if (filesDatabase[objZ2].subData.resourceType == 4) {
objX1 = filesDatabase[objZ2].width; // width
spriteHeight = filesDatabase[objZ2].height; // height
if (filesDatabase[objZ2].subData.ptr) {
- currentTransparent =
- filesDatabase[objZ2].
- subData.transparency;
-
- mainDrawSub4(objX1,
- spriteHeight,
- currentObjPtr,
- (char *)
- filesDatabase[objZ2].
- subData.ptr, objY2, objX2,
- (char *)gfxModuleData.
- pPage10,
- (char *)
- filesDatabase[objZ2].
- subData.ptr);
+ currentTransparent = filesDatabase[objZ2].subData.transparency;
+
+ mainDrawSub4(objX1, spriteHeight, currentObjPtr, (char *)filesDatabase[objZ2].subData.ptr, objY2, objX2,(char *)gfxModuleData.pPage10,(char *)filesDatabase[objZ2].subData.ptr);
}
}
}
if ((currentObjPtr->animStep != 0) && (param == 0)) {
- if (currentObjPtr->currentAnimDelay <= 0) {
+ if (currentObjPtr->animCounter <= 0) {
int newVal;
bool change = true;
- newVal =
- getValueFromObjectQuerry(&params,
- currentObjPtr->field_28) +
- currentObjPtr->animStep;
+ newVal = getValueFromObjectQuerry(&params, currentObjPtr->animChange) + currentObjPtr->animStep;
if (currentObjPtr->animStep > 0) {
- if (newVal >
- currentObjPtr->field_22) {
- if (currentObjPtr->
- field_30) {
- newVal =
- currentObjPtr->
- field_20;
- currentObjPtr->
- field_30--;
+ if (newVal > currentObjPtr->animEnd) {
+ if (currentObjPtr->animLoop) {
+ newVal = currentObjPtr->animStart;
+ currentObjPtr->animLoop--;
} else {
int16 data2;
- data2 =
- currentObjPtr->
- field_20;
+ data2 = currentObjPtr->animStart;
change = false;
- currentObjPtr->
- animStep =
- 0;
+ currentObjPtr->animStep = 0;
- if (currentObjPtr->field_2A) // should we resume the script ?
+ if (currentObjPtr->animType) // should we resume the script ?
{
- if (currentObjPtr->field_1A == 20) {
- changeScriptParamInList
- (currentObjPtr->
- field_18,
- currentObjPtr->
- field_16,
- &scriptHandle2,
- 0,
- -1);
- } else
- if
- (currentObjPtr->
- field_1A
- ==
- 30)
- {
- changeScriptParamInList
- (currentObjPtr->
- field_18,
- currentObjPtr->
- field_16,
- &scriptHandle1,
- 0,
- -1);
+ if (currentObjPtr->parentType == 20) {
+ changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &procHead, 0, -1);
+ }
+ else if(currentObjPtr->parentType == 30) {
+ changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &relHead, 0, -1);
}
}
newVal = data2;
@@ -1029,50 +980,25 @@ void mainDraw(int16 param) {
* } */
}
- if (currentObjPtr->nextAnimDelay >= 0) {
- currentObjPtr->
- currentAnimDelay =
- currentObjPtr->
- nextAnimDelay;
+ if (currentObjPtr->animWait >= 0) {
+ currentObjPtr->animCounter = currentObjPtr->animWait;
}
- if ((currentObjPtr->field_2C >= 0)
- && (currentObjPtr->field_2C ==
- newVal)
- && (currentObjPtr->field_2A !=
- 0)) {
- if (currentObjPtr->field_1A ==
- 20) {
- changeScriptParamInList
- (currentObjPtr->
- field_18,
- currentObjPtr->
- field_16,
- &scriptHandle2, 0,
- -1);
- } else if (currentObjPtr->
- field_1A == 30) {
- changeScriptParamInList
- (currentObjPtr->
- field_18,
- currentObjPtr->
- field_16,
- &scriptHandle1, 0,
- -1);
+ if ((currentObjPtr->animSignal >= 0) && (currentObjPtr->animSignal == newVal) && (currentObjPtr->animType != 0)) {
+ if (currentObjPtr->parentType == 20) {
+ changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &procHead, 0, -1);
+ } else if (currentObjPtr->parentType == 30) {
+ changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &relHead, 0, -1);
}
- currentObjPtr->field_2A = 0;
+ currentObjPtr->animType = 0;
}
if (change) {
- mainDraw5(currentObjPtr->
- overlay,
- currentObjPtr->idx,
- currentObjPtr->field_28,
- currentObjPtr, newVal);
+ addAutoCell(currentObjPtr->overlay, currentObjPtr->idx, currentObjPtr->animChange, newVal, currentObjPtr);
}
} else {
- currentObjPtr->currentAnimDelay--;
+ currentObjPtr->animCounter--;
}
}
}
@@ -1082,7 +1008,7 @@ void mainDraw(int16 param) {
//----------------------------------------------------------------------------------------------------------------//
- mainDraw6();
+ freeAutoCell();
var20 = 0;
//-------------------------------------------------- DRAW OBJECTS TYPE 5 (MSG)-----------------------------------------//
@@ -1091,10 +1017,7 @@ void mainDraw(int16 param) {
while (currentObjPtr) {
if (currentObjPtr->type == 5 && currentObjPtr->freeze == 0) {
- mainSprite(currentObjPtr->field_A,
- currentObjPtr->field_C, currentObjPtr->gfxPtr,
- gfxModuleData.pPage10, currentObjPtr->color,
- currentObjPtr->spriteIdx);
+ mainSprite(currentObjPtr->x, currentObjPtr->field_C, currentObjPtr->gfxPtr, gfxModuleData.pPage10, currentObjPtr->color, currentObjPtr->spriteIdx);
var20 = 1;
}
currentObjPtr = currentObjPtr->next;
diff --git a/engines/cruise/object.cpp b/engines/cruise/object.cpp
index e4500d9683..2014ab1e4d 100644
--- a/engines/cruise/object.cpp
+++ b/engines/cruise/object.cpp
@@ -73,14 +73,14 @@ int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx,
ovlData = overlayTable[overlayIdx].ovlData;
- switch (ptr->var1) {
+ switch (ptr->type) {
case 0:
{
ptr2 = &ovlData->objData2SourceTable[ptr->var5];
- var_14 = globalVars[*(int16 *) (&overlayTable[overlayIdx].field_14 + ptr->var6)];
+ var_14 = globalVars[*(int16 *) (&overlayTable[overlayIdx].state + ptr->stateTableIdx)];
- var_A = ptr2->var5;
+ var_A = ptr2->state;
break;
}
@@ -88,25 +88,25 @@ int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx,
{
ptr2 = &ovlData->objData2WorkTable[ptr->var4];
- var_A = var_14 = ptr2->var5;
+ var_A = var_14 = ptr2->state;
size = var_A + ptr->var5;
if (ptr->var5 + var_14 <= ovlData->size8) {
- var_A = ovlData->objData2SourceTable[ptr->var5 + var_14].var5;
+ var_A = ovlData->objData2SourceTable[ptr->var5 + var_14].state;
}
break;
}
default:
{
- printf("unsupported case %d in getMultipleObjectParam\n", ptr->var1);
+ printf("unsupported case %d in getMultipleObjectParam\n", ptr->type);
exit(1);
}
}
returnParam->X = ptr2->X;
returnParam->Y = ptr2->Y;
- returnParam->baseFileIdx = ptr2->baseFileIdx;
- returnParam->fileIdx = ptr2->var3;
+ returnParam->baseFileIdx = ptr2->Z;
+ returnParam->fileIdx = ptr2->frame;
returnParam->scale = ptr2->scale;
returnParam->var5 = var_14;
returnParam->var6 = var_A;
@@ -115,11 +115,11 @@ int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx,
return 0;
}
-void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {
+void setObjectPosition(int16 ovlIdx, int16 objIdx, int16 param3, int16 param4) {
objDataStruct *ptr;
objectParams *ptr2;
- ptr = getObjectDataFromOverlay(param1, objIdx);
+ ptr = getObjectDataFromOverlay(ovlIdx, objIdx);
if (!ptr) {
return;
@@ -127,10 +127,10 @@ void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {
}
//overlayTable[param1].ovlData
- switch (ptr->var1) {
+ switch (ptr->type) {
case 1:
{
- ptr2 = &overlayTable[param1].ovlData->objData2WorkTable[ptr->var4];
+ ptr2 = &overlayTable[ovlIdx].ovlData->objData2WorkTable[ptr->var4];
switch (param3) {
case 0: // x
@@ -143,14 +143,15 @@ void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {
ptr2->Y = param4;
break;
}
- case 2: // base file
+ case 2: // z
{
- ptr2->baseFileIdx = param4;
+ ptr2->Z = param4;
+ sortCells(ovlIdx, objIdx, &cellHead);
break;
}
case 3:
{
- ptr2->var3 = param4;
+ ptr2->frame = param4;
break;
}
case 4: // scale
@@ -160,7 +161,7 @@ void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {
}
case 5: // box colision
{
- ptr2->var5 = param4;
+ ptr2->state = param4;
break;
}
default:
@@ -178,94 +179,7 @@ void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {
}
}
-void Op_InitializeStateSub1(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;
- }
-}
-
-int16 Op_InitializeStateSub(int ovlIdx, int objIdx, int param2) {
+int16 objInit(int ovlIdx, int objIdx, int newState) {
objDataStruct *ptr;
// uint16 param;
ovlDataStruct *ovlData;
@@ -277,39 +191,38 @@ int16 Op_InitializeStateSub(int ovlIdx, int objIdx, int param2) {
ovlData = overlayTable[ovlIdx].ovlData;
- switch (ptr->var1) {
- case 0:
+ switch (ptr->type) {
+ case THEME:
+ case MULTIPLE:
{
- globalVars[overlayTable[ovlIdx].field_14 + ptr->var6] =
- param2;
- Op_InitializeStateSub1(ovlIdx, param2, &cellHead);
+ globalVars[overlayTable[ovlIdx].state + ptr->stateTableIdx] = newState;
+ sortCells(ovlIdx, objIdx, &cellHead);
break;
}
- case 1:
+ case UNIQUE:
+ break;
+ case VARIABLE:
{
objectParams *destEntry;
objectParams *sourceEntry;
- if (ptr->var5 + param2 > ovlData->size8) {
+ if (ptr->var5 + newState > ovlData->size8) {
return 0;
}
destEntry = &ovlData->objData2WorkTable[ptr->var4];
- sourceEntry =
- &ovlData->objData2SourceTable[ptr->var5 + param2];
+ sourceEntry = &ovlData->objData2SourceTable[ptr->var5 + newState];
memcpy(destEntry, sourceEntry, sizeof(objectParams));
- destEntry->var5 = param2;
+ destEntry->state = newState;
- Op_InitializeStateSub1(ovlIdx, param2, &cellHead);
+ sortCells(ovlIdx, objIdx, &cellHead);
break;
}
default:
{
- printf
- ("Unsupported param = %d in Op_InitializeStateSub\n",
- ptr->var1);
+ printf("Unsupported param = %d in objInit\n", ptr->type);
// exit(1);
}
}
@@ -317,8 +230,7 @@ int16 Op_InitializeStateSub(int ovlIdx, int objIdx, int param2) {
return 0;
}
-int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,
- int16 *returnParam) {
+int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3, int16 *returnParam) {
int var_A = 0;
//char* ptr3 = NULL;
objDataStruct *ptr;
@@ -332,11 +244,11 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,
ovlData = overlayTable[overlayIdx].ovlData;
- switch (ptr->var1) {
+ switch (ptr->type) {
case 0:
case 3:
{
- var_A = globalVars[ptr->var6];
+ var_A = globalVars[ptr->stateTableIdx];
ptr2 = &ovlData->objData2SourceTable[ptr->var5];
break;
@@ -345,13 +257,12 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,
{
ptr2 = &ovlData->objData2WorkTable[ptr->var4];
- var_A = ptr2->var5;
+ var_A = ptr2->state;
break;
}
default:
{
- printf("Unsupported case %d in getSingleObjectParam\n",
- ptr->var1);
+ printf("Unsupported case %d in getSingleObjectParam\n",ptr->type);
exit(1);
}
}
@@ -369,12 +280,12 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,
}
case 2:
{
- *returnParam = ptr2->baseFileIdx;
+ *returnParam = ptr2->Z;
break;
}
case 3:
{
- *returnParam = ptr2->var3;
+ *returnParam = ptr2->frame;
break;
}
case 4:
@@ -389,9 +300,7 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,
}
default:
{
- printf
- ("Unsupported case %d in getSingleObjectParam case 1\n",
- param3);
+ printf("Unsupported case %d in getSingleObjectParam case 1\n", param3);
exit(1);
}
}
diff --git a/engines/cruise/object.h b/engines/cruise/object.h
index 24b8461851..e946d22c66 100644
--- a/engines/cruise/object.h
+++ b/engines/cruise/object.h
@@ -53,10 +53,8 @@ struct objectParamsQuery {
typedef struct objectParamsQuery objectParamsQuery;
objDataStruct *getObjectDataFromOverlay(int ovlIdx, int objIdx);
-int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,
- int16 * returnParam);
-int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx,
- objectParamsQuery * returnParam);
+int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3, int16 * returnParam);
+int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx, objectParamsQuery * returnParam);
} // End of namespace Cruise
diff --git a/engines/cruise/overlay.cpp b/engines/cruise/overlay.cpp
index c221d07a0b..af52f25e16 100644
--- a/engines/cruise/overlay.cpp
+++ b/engines/cruise/overlay.cpp
@@ -420,9 +420,9 @@ int loadOverlay(uint8 *scriptName) {
scriptPtr += 2;
flipShort(&ovlData->objDataTable[i].var0);
- ovlData->objDataTable[i].var1 = *(int16 *) scriptPtr;
+ ovlData->objDataTable[i].type = *(int16 *) scriptPtr;
scriptPtr += 2;
- flipShort(&ovlData->objDataTable[i].var1);
+ flipShort(&ovlData->objDataTable[i].type);
ovlData->objDataTable[i].var2 = *(int16 *) scriptPtr;
scriptPtr += 2;
@@ -440,16 +440,16 @@ int loadOverlay(uint8 *scriptName) {
scriptPtr += 2;
flipShort(&ovlData->objDataTable[i].var5);
- ovlData->objDataTable[i].var6 = *(int16 *) scriptPtr;
+ ovlData->objDataTable[i].stateTableIdx = *(int16 *) scriptPtr;
scriptPtr += 2;
- flipShort(&ovlData->objDataTable[i].var6);
+ flipShort(&ovlData->objDataTable[i].stateTableIdx);
}
if (scriptNotLoadedBefore) {
//int var1;
//int var2;
- overlayTable[scriptIdx].field_14 = (char)setup1;
+ overlayTable[scriptIdx].state = (char)setup1;
var1 = loadScriptSub1(scriptIdx, 3);
var2 = loadScriptSub1(scriptIdx, 0);
@@ -733,11 +733,11 @@ int releaseOverlay(const char *name) {
overlayTable[overlayIdx].var16 = NULL;
} */
- removeScript(overlayIdx, -1, &scriptHandle2);
- removeScript(overlayIdx, -1, &scriptHandle2);
+ removeScript(overlayIdx, -1, &procHead);
+ removeScript(overlayIdx, -1, &procHead);
- removeScript(overlayIdx, -1, &scriptHandle1);
- removeScript(overlayIdx, -1, &scriptHandle1);
+ removeScript(overlayIdx, -1, &relHead);
+ removeScript(overlayIdx, -1, &relHead);
printf("releaseOverlay: finish !\n");
diff --git a/engines/cruise/overlay.h b/engines/cruise/overlay.h
index d09f79fcd4..1f61087892 100644
--- a/engines/cruise/overlay.h
+++ b/engines/cruise/overlay.h
@@ -106,14 +106,19 @@ struct importDataStruct {
typedef struct importDataStruct importDataStruct;
+#define MULTIPLE 0
+#define VARIABLE 1
+#define UNIQUE 2
+#define THEME 3
+
struct objDataStruct {
int16 var0;
- int16 var1;
+ int16 type;
int16 var2;
int16 var3;
int16 var4;
int16 var5;
- int16 var6;
+ int16 stateTableIdx;
};
typedef struct objDataStruct objDataStruct;
@@ -121,10 +126,10 @@ typedef struct objDataStruct objDataStruct;
struct objectParams {
int16 X;
int16 Y;
- int16 baseFileIdx;
- int16 var3;
+ int16 Z;
+ int16 frame;
int16 scale;
- int16 var5;
+ int16 state;
};
typedef struct objectParams objectParams;
@@ -169,7 +174,7 @@ struct overlayStruct {
char overlayName[14];
ovlDataStruct *ovlData;
short int alreadyLoaded;
- char field_14;
+ char state;
char field_15;
char field_16;
char field_17;
diff --git a/engines/cruise/saveload.cpp b/engines/cruise/saveload.cpp
index e80835d1c3..21882a096d 100644
--- a/engines/cruise/saveload.cpp
+++ b/engines/cruise/saveload.cpp
@@ -264,8 +264,8 @@ int loadSavegameData(int saveGameIdx) {
fread(mediumVar, 0x880, 1, fileHandle);
loadSavegameDataSub1(fileHandle);
- loadScriptsFromSave(fileHandle, &scriptHandle2);
- loadScriptsFromSave(fileHandle, &scriptHandle1);
+ loadScriptsFromSave(fileHandle, &procHead);
+ loadScriptsFromSave(fileHandle, &relHead);
loadSavegameDataSub2(fileHandle);
loadBackgroundIncrustFromSave(fileHandle);
diff --git a/engines/cruise/script.cpp b/engines/cruise/script.cpp
index fbc3a4decc..9751ce4adb 100644
--- a/engines/cruise/script.cpp
+++ b/engines/cruise/script.cpp
@@ -26,8 +26,8 @@
namespace Cruise {
-scriptInstanceStruct scriptHandle1;
-scriptInstanceStruct scriptHandle2;
+scriptInstanceStruct relHead;
+scriptInstanceStruct procHead;
scriptInstanceStruct *currentScriptPtr;
diff --git a/engines/cruise/script.h b/engines/cruise/script.h
index 574eae49bc..671f8d0221 100644
--- a/engines/cruise/script.h
+++ b/engines/cruise/script.h
@@ -28,10 +28,10 @@
namespace Cruise {
enum scriptTypeEnum {
- scriptType_Minus20 = -20,
+ scriptType_MinusPROC = -20,
scriptType_Minus30 = -30,
- scriptType_20 = 20,
- scriptType_30 = 30
+ scriptType_PROC = 20,
+ scriptType_REL = 30
};
typedef enum scriptTypeEnum scriptTypeEnum;
@@ -55,8 +55,8 @@ struct scriptInstanceStruct {
typedef struct scriptInstanceStruct scriptInstanceStruct;
-extern scriptInstanceStruct scriptHandle1;
-extern scriptInstanceStruct scriptHandle2;
+extern scriptInstanceStruct relHead;
+extern scriptInstanceStruct procHead;
extern scriptInstanceStruct *currentScriptPtr;
void setupFuncArray(void);
diff --git a/engines/cruise/various.cpp b/engines/cruise/various.cpp
index e6a659c5ec..2b3aa6855f 100644
--- a/engines/cruise/various.cpp
+++ b/engines/cruise/various.cpp
@@ -39,68 +39,6 @@ int16 readB16(void *ptr) {
return temp;
}
-void freeObject(cellStruct *objPtr) {
- if (objPtr) {
- /* if(objPtr->next)
- * free(objPtr->next); */
-
- //free(objPtr);
- }
-}
-
-void removeObjectFromList(int ovlNumber, int objectIdx, cellStruct *objPtr,
- int backgroundPlane, int arg) {
- cellStruct *currentObj = objPtr->next;
- cellStruct *previous;
-
- while (currentObj) {
- cellStruct *si;
-
- si = currentObj;
-
- if ((si->overlay == ovlNumber || ovlNumber == -1) &&
- (si->idx == objectIdx || objectIdx == -1) &&
- (si->type == arg || arg == -1) &&
- (si->backgroundPlane == backgroundPlane
- || backgroundPlane == -1)) {
- si->type = -1;
- }
-
- currentObj = si->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;
-
- freeObject(si);
-
- free(si);
-
- currentObj = dx;
- } else {
- currentObj = si->next;
- previous = si;
- }
- }
-}
-
char *getText(int textIndex, int overlayIndex) {
if (!overlayTable[overlayIndex].ovlData) {
return NULL;
@@ -114,57 +52,4 @@ char *getText(int textIndex, int overlayIndex) {
string;
}
-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->field_A = oldVar6;
- pNewElement->field_C = oldVar4;
- pNewElement->spriteIdx = oldVar2;
- pNewElement->color = color;
- pNewElement->freeze = 0;
- pNewElement->field_16 = scriptNumber;
- pNewElement->field_18 = 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);
- }
-}
-
} // End of namespace Cruise
diff --git a/engines/cruise/various.h b/engines/cruise/various.h
index 990a21f0c5..6b1e589b54 100644
--- a/engines/cruise/various.h
+++ b/engines/cruise/various.h
@@ -35,13 +35,8 @@ extern uint16 main15;
int16 readB16(void *ptr);
-void createTextObject(int overlayIdx, int oldVar8, cellStruct * pObject,
- int scriptNumber, int scriptOverlayNumber, int backgroundPlane,
- int16 color, int oldVar2, int oldVar4, int oldVar6);
-void removeObjectFromList(int ovlNumber, int objectIdx, cellStruct * objPtr,
- int backgroundPlane, int arg);
-int16 Op_InitializeStateSub(int ovlIdx, int param1, int param2);
-
+int16 objInit(int ovlIdx, int param1, int param2);
+char *getText(int textIndex, int overlayIndex);
} // End of namespace Cruise
#endif