More cleanup

Few bug fix

svn-id: r26666
This commit is contained in:
Vincent Hamm 2007-04-28 22:31:55 +00:00
parent 339c39f8b7
commit fe8d2a8e7f
19 changed files with 467 additions and 617 deletions

View file

@ -774,11 +774,7 @@ void processAnimation(void) {
getMultipleObjectParam(currentActor->overlayNumber, getMultipleObjectParam(currentActor->overlayNumber,
currentActor->idx, &params); currentActor->idx, &params);
if (((animationStart && !currentActor->flag) if (((animationStart && !currentActor->flag) || (!animationStart && currentActor->x_dest != -1 && currentActor->y_dest != -1)) && (currentActor->type == 0)) {
|| (!animationStart
&& currentActor->x_dest != -1
&& currentActor->y_dest != -1))
&& (currentActor->type == 0)) {
// mouse animation // mouse animation
if (!animationStart) { if (!animationStart) {
var34 = currentActor->x_dest; var34 = currentActor->x_dest;
@ -790,11 +786,7 @@ void processAnimation(void) {
currentActor->flag = 1; currentActor->flag = 1;
} }
currentActor->pathId = currentActor->pathId = computePathfinding(returnVar2, params.X, params.Y, var34, var35, currentActor->stepX, currentActor->stepY, currentActor->pathId);
computePathfinding(returnVar2, params.X,
params.Y, var34, var35,
currentActor->stepX, currentActor->stepY,
currentActor->pathId);
if (currentActor->pathId == -1) { if (currentActor->pathId == -1) {
if ((currentActor->endDirection != -1) if ((currentActor->endDirection != -1)
@ -1136,31 +1128,19 @@ void processAnimation(void) {
} }
case ANIM_PHASE_END: case ANIM_PHASE_END:
{ {
int newA = int newA = raoul_end[currentActor->startDirection][0];
raoul_end[currentActor->
startDirection][0];
set_anim(currentActor-> set_anim(currentActor->overlayNumber, currentActor->idx, currentActor->start, currentActor->x, currentActor->y, newA, currentActor->poly);
overlayNumber,
currentActor->idx,
currentActor->start,
currentActor->x,
currentActor->y, newA,
currentActor->poly);
currentActor->pathId = -2; currentActor->pathId = -2;
currentActor->phase = currentActor->phase = ANIM_PHASE_WAIT;
ANIM_PHASE_WAIT;
currentActor->flag = 0; currentActor->flag = 0;
currentActor->endDirection = currentActor->endDirection = -1;
-1;
break; break;
} }
default: default:
{ {
printf printf("Unimplemented currentActor->phase=%d in processAnimation()\n", currentActor->phase);
("Unimplemented currentActor->phase=%d in processAnimation()\n",
currentActor->phase);
// exit(1); // exit(1);
} }
} }

View file

@ -64,10 +64,13 @@ struct actorStruct {
typedef struct actorStruct actorStruct; typedef struct actorStruct actorStruct;
int16 mainProc13(int overlayIdx, int param1, actorStruct * pStartEntry, extern int raoul_move[][13];
int param2); extern int raoul_end[][13];
actorStruct *findActor(int overlayIdx, int param1, actorStruct * pStartEntry, extern int raoul_stat[][13];
int param2); 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 processAnimation(void);
void getPixel(int x, int y); void getPixel(int x, int y);

View file

@ -32,6 +32,15 @@ void resetPtr(cellStruct *ptr) {
ptr->prev = NULL; ptr->prev = NULL;
} }
void freeMessageList(cellStruct *objPtr) {
/* if (objPtr) {
if(objPtr->next)
free(objPtr->next);
free(objPtr);
} */
}
void loadSavegameDataSub2(FILE *f) { void loadSavegameDataSub2(FILE *f) {
unsigned short int n_chunks; unsigned short int n_chunks;
int i; int i;
@ -60,9 +69,7 @@ void loadSavegameDataSub2(FILE *f) {
} }
} }
cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead, cellStruct *addCell(cellStruct *pHead, int16 overlayIdx, int16 objIdx, int16 type, int16 backgroundPlane, int16 scriptOverlay, int16 scriptNumber, int16 scriptType) {
int16 scriptType, int16 scriptNumber, int16 scriptOverlay, int16 param3,
int16 param4) {
int16 var; int16 var;
cellStruct *newElement; cellStruct *newElement;
@ -70,7 +77,7 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,
cellStruct *currentHead2; cellStruct *currentHead2;
cellStruct *currentHead3; cellStruct *currentHead3;
if (getSingleObjectParam(overlayIdx, param2, 2, &var) < 0) { if (getSingleObjectParam(overlayIdx, objIdx, 2, &var) < 0) {
return 0; return 0;
} }
@ -85,8 +92,7 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,
if (currentHead2->type != 5) { if (currentHead2->type != 5) {
int16 lvar2; int16 lvar2;
getSingleObjectParam(currentHead2->overlay, getSingleObjectParam(currentHead2->overlay, currentHead2->idx, 2, &lvar2);
currentHead2->idx, 2, &lvar2);
if (lvar2 > var) if (lvar2 > var)
break; break;
@ -98,9 +104,9 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,
if (currentHead2) { if (currentHead2) {
if ((currentHead2->overlay == overlayIdx) && if ((currentHead2->overlay == overlayIdx) &&
(currentHead2->backgroundPlane == param3) && (currentHead2->backgroundPlane == backgroundPlane) &&
(currentHead2->idx == param2) && (currentHead2->idx == objIdx) &&
(currentHead2->type == param4)) (currentHead2->type == type))
return NULL; return NULL;
} }
@ -115,25 +121,26 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,
newElement->next = currentHead3->next; newElement->next = currentHead3->next;
currentHead3->next = newElement; currentHead3->next = newElement;
newElement->idx = param2; newElement->idx = objIdx;
newElement->type = param4; newElement->type = type;
newElement->backgroundPlane = param3; newElement->backgroundPlane = backgroundPlane;
newElement->overlay = overlayIdx; newElement->overlay = overlayIdx;
newElement->freeze = 0; newElement->freeze = 0;
newElement->field_16 = scriptNumber; newElement->parent = scriptNumber;
newElement->field_18 = scriptOverlay; newElement->parentOverlay = scriptOverlay;
newElement->gfxPtr = NULL; newElement->gfxPtr = NULL;
newElement->followObjectIdx = param2; newElement->followObjectIdx = objIdx;
newElement->followObjectOverlayIdx = overlayIdx; newElement->followObjectOverlayIdx = overlayIdx;
newElement->field_1A = scriptType; newElement->parentType = scriptType;
newElement->field_20 = 0;
newElement->field_22 = 0; newElement->animStart = 0;
newElement->nextAnimDelay = 0; newElement->animEnd = 0;
newElement->field_2C = 0; newElement->animWait = 0;
newElement->currentAnimDelay = 0; newElement->animSignal = 0;
newElement->field_2A = 0; newElement->animCounter = 0;
newElement->animType = 0;
newElement->animStep = 0; newElement->animStep = 0;
newElement->field_30 = 0; newElement->animLoop = 0;
if (currentHead) { if (currentHead) {
newElement->prev = currentHead->prev; newElement->prev = currentHead->prev;
@ -146,4 +153,208 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,
return newElement; 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 } // End of namespace Cruise

View file

@ -38,26 +38,26 @@ struct cellStruct {
int16 idx; int16 idx;
int16 type; int16 type;
int16 overlay; int16 overlay;
int16 field_A; int16 x;
int16 field_C; int16 field_C;
int16 spriteIdx; int16 spriteIdx;
int16 color; int16 color;
int16 backgroundPlane; int16 backgroundPlane;
int16 freeze; int16 freeze;
int16 field_16; int16 parent;
int16 field_18; int16 parentOverlay;
int16 field_1A; int16 parentType;
int16 followObjectOverlayIdx; int16 followObjectOverlayIdx;
int16 followObjectIdx; int16 followObjectIdx;
int16 field_20; int16 animStart;
int16 field_22; int16 animEnd;
int16 nextAnimDelay; int16 animWait;
int16 animStep; int16 animStep;
int16 field_28; int16 animChange;
int16 field_2A; int16 animType;
int16 field_2C; int16 animSignal;
int16 currentAnimDelay; int16 animCounter;
int16 field_30; int16 animLoop;
gfxEntryStruct *gfxPtr; gfxEntryStruct *gfxPtr;
}; };
@ -65,9 +65,11 @@ extern cellStruct cellHead;
void resetPtr(cellStruct * ptr); void resetPtr(cellStruct * ptr);
void loadSavegameDataSub2(FILE * f); void loadSavegameDataSub2(FILE * f);
cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct * pHead, cellStruct *addCell(cellStruct *pHead, int16 overlayIdx, int16 objIdx, int16 type, int16 backgroundPlane, int16 scriptOverlay, int16 scriptNumber, int16 scriptType);
int16 scriptType, int16 scriptNumber, int16 scriptOverlay, int16 param3, void createTextObject(int overlayIdx, int oldVar8, cellStruct * pObject, int scriptNumber, int scriptOverlayNumber, int backgroundPlane, int16 color, int oldVar2, int oldVar4, int oldVar6);
int16 param4); 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 } // End of namespace Cruise

View file

@ -480,8 +480,8 @@ int initAllData(void) {
initBigVar3(); initBigVar3();
resetPtr2(&scriptHandle2); resetPtr2(&procHead);
resetPtr2(&scriptHandle1); resetPtr2(&relHead);
resetPtr(&cellHead); resetPtr(&cellHead);
@ -579,9 +579,8 @@ int initAllData(void) {
if (bootOverlayNumber) { if (bootOverlayNumber) {
positionInStack = 0; positionInStack = 0;
attacheNewScriptToTail(bootOverlayNumber, &scriptHandle2, 0, attacheNewScriptToTail(bootOverlayNumber, &procHead, 0, 20, 0, 0, scriptType_PROC);
20, 0, 0, scriptType_20); scriptFunc2(bootOverlayNumber, &procHead, 1, 0);
scriptFunc2(bootOverlayNumber, &scriptHandle2, 1, 0);
} }
strcpyuint8(systemStrings.bootScriptName, "AUTO00"); strcpyuint8(systemStrings.bootScriptName, "AUTO00");
@ -878,7 +877,7 @@ int buildInventorySub1(int overlayIdx, int objIdx) {
getObjectDataFromOverlay(overlayIdx, objIdx); getObjectDataFromOverlay(overlayIdx, objIdx);
if (pObjectData) { if (pObjectData) {
return pObjectData->var1; return pObjectData->type;
} else { } else {
return -11; return -11;
} }
@ -1029,7 +1028,7 @@ int callInventoryObject(int param0, int param1, int x, int y) {
var_34->stringNameOffset) { var_34->stringNameOffset) {
if (pObject) { if (pObject) {
if (pObject-> if (pObject->
var1 != type !=
3) { 3) {
char var_214[80]; char var_214[80];
char var_1C4[80]; char var_1C4[80];
@ -1163,7 +1162,7 @@ int callInventoryObject(int param0, int param1, int x, int y) {
if (strlen(var_214)) { if (strlen(var_214)) {
attacheNewScriptToTail attacheNewScriptToTail
(var_1E, (var_1E,
&scriptHandle1, &relHead,
var_34-> var_34->
field_2, field_2,
30, 30,
@ -1171,7 +1170,7 @@ int callInventoryObject(int param0, int param1, int x, int y) {
scriptNumber, scriptNumber,
currentScriptPtr-> currentScriptPtr->
overlayNumber, overlayNumber,
scriptType_30); scriptType_REL);
} else { } else {
if (var_22->specialString1) { if (var_22->specialString1) {
ptr = getObjectName(var_34->varNameOffset, var_22->specialString1); ptr = getObjectName(var_34->varNameOffset, var_22->specialString1);
@ -1531,11 +1530,11 @@ void mainLoop(void) {
enableUser = 0; enableUser = 0;
} }
manageScripts(&scriptHandle1); manageScripts(&relHead);
manageScripts(&scriptHandle2); manageScripts(&procHead);
removeFinishedScripts(&scriptHandle1); removeFinishedScripts(&relHead);
removeFinishedScripts(&scriptHandle2); removeFinishedScripts(&procHead);
processAnimation(); processAnimation();

View file

@ -185,8 +185,7 @@ int updateResFileEntry(int height, int width, int entryNumber, int resType) {
return (-2); return (-2);
filesDatabase[entryNumber].widthInColumn = width; filesDatabase[entryNumber].widthInColumn = width;
filesDatabase[entryNumber].subData.ptr2 = filesDatabase[entryNumber].subData.ptr2 = filesDatabase[entryNumber].subData.ptr + size;
filesDatabase[entryNumber].subData.ptr + size;
filesDatabase[entryNumber].width = width / 8; filesDatabase[entryNumber].width = width / 8;
filesDatabase[entryNumber].resType = resType; filesDatabase[entryNumber].resType = resType;
filesDatabase[entryNumber].height = height; filesDatabase[entryNumber].height = height;
@ -225,16 +224,14 @@ int createResFileEntry(int width, int height, int resType) {
width = (width * 8) / 5; width = (width * 8) / 5;
} }
filesDatabase[entryNumber].subData.ptr = filesDatabase[entryNumber].subData.ptr = (uint8 *) mallocAndZero(size + div);
(uint8 *) mallocAndZero(size + div);
if (filesDatabase[entryNumber].subData.ptr) { if (filesDatabase[entryNumber].subData.ptr) {
return (-2); return (-2);
} }
filesDatabase[entryNumber].widthInColumn = width; filesDatabase[entryNumber].widthInColumn = width;
filesDatabase[entryNumber].subData.ptr2 = filesDatabase[entryNumber].subData.ptr2 = filesDatabase[entryNumber].subData.ptr + size;
filesDatabase[entryNumber].subData.ptr + size;
filesDatabase[entryNumber].width = width / 8; filesDatabase[entryNumber].width = width / 8;
filesDatabase[entryNumber].resType = resType; filesDatabase[entryNumber].resType = resType;
filesDatabase[entryNumber].height = height; filesDatabase[entryNumber].height = height;

View file

@ -837,7 +837,7 @@ int decompFunction(void) {
} }
case 0x8: case 0x8:
{ {
sprintf(tempbuffer, "_removeObjectFromList(%s,%s,%s)", sprintf(tempbuffer, "_removeCell(%s,%s,%s)",
popDecomp(), popDecomp(), popDecomp()); popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer); pushDecomp(tempbuffer);
break; break;

View file

@ -75,7 +75,7 @@ static const CRUISEGameDescription gameDescriptions[] = {
{ {
{ {
"cruise", "cruise",
"", "256 colors",
AD_ENTRY1("D1", "a90d2b9ead6b4d812cd14268672cf178"), AD_ENTRY1("D1", "a90d2b9ead6b4d812cd14268672cf178"),
Common::EN_ANY, Common::EN_ANY,
Common::kPlatformPC, Common::kPlatformPC,

View file

@ -30,19 +30,6 @@ namespace Cruise {
opcodeFunction opcodeTablePtr[256]; 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) { int16 Op_LoadOverlay(void) {
uint8 *originalScriptName; uint8 *originalScriptName;
uint8 scriptName[38]; uint8 scriptName[38];
@ -116,9 +103,9 @@ int16 Op_startScript(void) {
} }
ptr = ptr =
attacheNewScriptToTail(ovlIdx, &scriptHandle2, scriptIdx, attacheNewScriptToTail(ovlIdx, &procHead, scriptIdx,
currentScriptPtr->type, currentScriptPtr->scriptNumber, currentScriptPtr->type, currentScriptPtr->scriptNumber,
currentScriptPtr->overlayNumber, scriptType_Minus20); currentScriptPtr->overlayNumber, scriptType_MinusPROC);
if (!ptr) if (!ptr)
return (0); return (0);
@ -156,9 +143,7 @@ int16 Op_AddProc(void) {
if (!overlay) if (!overlay)
return (0); return (0);
attacheNewScriptToTail(overlay, &scriptHandle2, pop2, attacheNewScriptToTail(overlay, &procHead, pop2, currentScriptPtr->type, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_PROC);
currentScriptPtr->type, currentScriptPtr->scriptNumber,
currentScriptPtr->overlayNumber, scriptType_20);
if (pop1 > 0) { if (pop1 > 0) {
printf("Unsupported art send in op6!\n"); printf("Unsupported art send in op6!\n");
@ -287,8 +272,7 @@ int16 Op_RemoveMessage(void) {
overlay = currentScriptPtr->overlayNumber; overlay = currentScriptPtr->overlayNumber;
} }
removeObjectFromList(overlay, idx, &cellHead, removeCell(&cellHead, overlay, idx, 5, currentActiveBackgroundPlane);
currentActiveBackgroundPlane, 5);
return (0); return (0);
} }
@ -349,7 +333,7 @@ int16 Op_RemoveProc(void) {
overlay = currentScriptPtr->overlayNumber; overlay = currentScriptPtr->overlayNumber;
} }
removeScript(overlay, idx, &scriptHandle2); removeScript(overlay, idx, &procHead);
return (0); return (0);
} }
@ -423,10 +407,10 @@ int16 Op_changeCutSceneState(void) {
int16 Op_62(void) { int16 Op_62(void) {
if (currentScriptPtr->var1A == 20) { if (currentScriptPtr->var1A == 20) {
changeScriptParamInList(currentScriptPtr->var18, changeScriptParamInList(currentScriptPtr->var18,
currentScriptPtr->var16, &scriptHandle2, 9997, -1); currentScriptPtr->var16, &procHead, 9997, -1);
} else if (currentScriptPtr->var1A == 30) { } else if (currentScriptPtr->var1A == 30) {
changeScriptParamInList(currentScriptPtr->var18, changeScriptParamInList(currentScriptPtr->var18,
currentScriptPtr->var16, &scriptHandle1, 9997, -1); currentScriptPtr->var16, &relHead, 9997, -1);
} }
return 0; return 0;
@ -541,7 +525,7 @@ int16 Op_InitializeState(void) {
if (!ovlIdx) if (!ovlIdx)
ovlIdx = currentScriptPtr->overlayNumber; ovlIdx = currentScriptPtr->overlayNumber;
Op_InitializeStateSub(ovlIdx, objIdx, param1); objInit(ovlIdx, objIdx, param1);
return (0); return (0);
} }
@ -613,38 +597,34 @@ int16 Op_GetMouseClick3(void) {
} }
int16 Op_AddCell(void) { int16 Op_AddCell(void) {
int16 param1 = popVar(); int16 objType = popVar();
int16 param2 = popVar(); int16 objIdx = popVar();
int16 overlayIdx = popVar(); int16 overlayIdx = popVar();
if (!overlayIdx) if (!overlayIdx)
overlayIdx = currentScriptPtr->overlayNumber; overlayIdx = currentScriptPtr->overlayNumber;
addCell(overlayIdx, param2, &cellHead, currentScriptPtr->type, addCell(&cellHead, overlayIdx, objIdx, objType, currentActiveBackgroundPlane, currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, currentScriptPtr->type);
currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber,
currentActiveBackgroundPlane, param1);
return 0; return 0;
} }
int16 Op_2F(void) { int16 Op_AddBackgroundIncrust(void) {
int16 param1 = popVar();
int16 param2 = popVar();
int16 objType = popVar();
int16 objIdx = popVar();
int16 overlayIdx = popVar(); int16 overlayIdx = popVar();
if (!overlayIdx) if (!overlayIdx)
overlayIdx = currentScriptPtr->overlayNumber; overlayIdx = currentScriptPtr->overlayNumber;
addBackgroundIncrust(overlayIdx, param2, &backgroundIncrustHead, addBackgroundIncrust(overlayIdx, objIdx, &backgroundIncrustHead, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, currentActiveBackgroundPlane, objType);
currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber,
currentActiveBackgroundPlane, param1);
return 0; return 0;
} }
int16 Op_RemoveCell(void) { int16 Op_RemoveCell(void) {
var1 = popVar(); int objType = popVar();
int objectIdx = popVar(); int objectIdx = popVar();
int ovlNumber = popVar(); int ovlNumber = popVar();
@ -652,8 +632,7 @@ int16 Op_RemoveCell(void) {
ovlNumber = currentScriptPtr->overlayNumber; ovlNumber = currentScriptPtr->overlayNumber;
} }
removeObjectFromList(ovlNumber, objectIdx, &cellHead, removeCell(&cellHead, ovlNumber, objectIdx, objType, currentActiveBackgroundPlane);
currentActiveBackgroundPlane, var1);
return 0; return 0;
} }
@ -669,10 +648,10 @@ int16 Op_SetFontFileIndex(void) {
int16 Op_63(void) { int16 Op_63(void) {
if (currentScriptPtr->var1A == 0x14) { if (currentScriptPtr->var1A == 0x14) {
changeScriptParamInList(currentScriptPtr->var18, changeScriptParamInList(currentScriptPtr->var18,
currentScriptPtr->var16, &scriptHandle2, 0, -1); currentScriptPtr->var16, &procHead, 0, -1);
} else if (currentScriptPtr->var1A == 0x1E) { } else if (currentScriptPtr->var1A == 0x1E) {
changeScriptParamInList(currentScriptPtr->var18, changeScriptParamInList(currentScriptPtr->var18,
currentScriptPtr->var16, &scriptHandle1, 0, -1); currentScriptPtr->var16, &relHead, 0, -1);
} }
return 0; return 0;
@ -770,47 +749,39 @@ int16 Op_AutoCell(void) {
if (!overlay) if (!overlay)
overlay = currentScriptPtr->overlayNumber; overlay = currentScriptPtr->overlayNumber;
pObject = pObject = addCell(&cellHead, overlay, obj, 4, currentActiveBackgroundPlane, currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, currentScriptPtr->type);
addCell(overlay, obj, &cellHead, currentScriptPtr->type,
currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber,
currentActiveBackgroundPlane, 4);
if (!pObject) if (!pObject)
return 0; return 0;
pObject->field_2C = signal; pObject->animSignal = signal;
pObject->field_30 = loop; pObject->animLoop = loop;
pObject->nextAnimDelay = wait; pObject->animWait = wait;
pObject->animStep = animStep; pObject->animStep = animStep;
pObject->field_22 = end; pObject->animEnd = end;
pObject->field_20 = start; pObject->animStart = start;
pObject->field_2A = type; pObject->animType = type;
pObject->field_28 = change; pObject->animChange = change;
if (type) { if (type) {
if (currentScriptPtr->type == 20) { if (currentScriptPtr->type == scriptType_PROC) {
changeScriptParamInList(currentScriptPtr-> changeScriptParamInList(currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, &procHead, 9996, -1);
overlayNumber, currentScriptPtr->scriptNumber, } else if (currentScriptPtr->type == scriptType_REL) {
&scriptHandle2, 9996, -1); changeScriptParamInList(currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, &relHead, 9996, -1);
} else if (currentScriptPtr->type == 30) {
changeScriptParamInList(currentScriptPtr->
overlayNumber, currentScriptPtr->scriptNumber,
&scriptHandle1, 9996, -1);
} }
} }
if (change == 5) { if (change == 5) {
Op_InitializeStateSub(pObject->overlay, pObject->idx, start); objInit(pObject->overlay, pObject->idx, start);
} else { } else {
setObjectPosition(pObject->overlay, pObject->idx, setObjectPosition(pObject->overlay, pObject->idx, pObject->animChange, start);
pObject->field_28, start);
} }
if (wait < 0) { if (wait < 0) {
objectParamsQuery params; objectParamsQuery params;
getMultipleObjectParam(overlay, obj, &params); getMultipleObjectParam(overlay, obj, &params);
pObject->currentAnimDelay = params.var6 - 1; pObject->animCounter = params.var6 - 1;
} }
return 0; return 0;
@ -927,7 +898,7 @@ void removeBackgroundIncrust(int overlay, int idx,
} }
} }
int16 Op_removeBackgroundIncrust(void) { int16 Op_RemoveBackgroundIncrust(void) {
int idx = popVar(); int idx = popVar();
int overlay = popVar(); int overlay = popVar();
@ -1178,11 +1149,11 @@ int16 Op_AddAnimation(void) {
si->stepX = stepX; si->stepX = stepX;
si->stepY = stepY; si->stepY = stepY;
int newFrame = ABS(actorTable1[direction].data[0]) - 1; int newFrame = ABS(raoul_end[direction][0]) - 1;
int zoom = computeZoom(params.Y); int zoom = computeZoom(params.Y);
if (actorTable1[direction].data[0] < 0) { if (raoul_end[direction][0] < 0) {
zoom = -zoom; zoom = -zoom;
} }
@ -1332,47 +1303,19 @@ int16 Op_6C(void) {
return temp; 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) { int16 Op_FreezeCell(void) {
/* int newFreezz = popVar();
* int var0; int oldFreeze = popVar();
* int var1; int backgroundPlante = popVar();
* int var2; int objType = popVar();
* int var3; int objIdx = popVar();
* int var4; int overlayIdx = popVar();
* int var5;
*/
var0 = popVar(); if (!overlayIdx) {
var1 = popVar(); overlayIdx = currentScriptPtr->overlayNumber;
var2 = popVar();
var3 = popVar();
var4 = popVar();
var5 = popVar();
if (!var5) {
var5 = currentScriptPtr->overlayNumber;
} }
configureAllObjects(var5, &cellHead, var4, var0, var1, var2, var3); freezeCell(&cellHead, overlayIdx, objIdx, objType, backgroundPlante, oldFreeze, newFreezz);
return 0; return 0;
} }
@ -1509,8 +1452,8 @@ void setupOpcodeTable(void) {
opcodeTablePtr[0x2B] = Op_2B; opcodeTablePtr[0x2B] = Op_2B;
opcodeTablePtr[0x2C] = Op_2C; opcodeTablePtr[0x2C] = Op_2C;
opcodeTablePtr[0x2E] = Op_releaseOverlay; opcodeTablePtr[0x2E] = Op_releaseOverlay;
opcodeTablePtr[0x2F] = Op_2F; opcodeTablePtr[0x2F] = Op_AddBackgroundIncrust;
opcodeTablePtr[0x30] = Op_removeBackgroundIncrust; opcodeTablePtr[0x30] = Op_RemoveBackgroundIncrust;
opcodeTablePtr[0x32] = Op_freeBackgroundInscrustList; opcodeTablePtr[0x32] = Op_freeBackgroundInscrustList;
opcodeTablePtr[0x37] = Op_37; opcodeTablePtr[0x37] = Op_37;
opcodeTablePtr[0x38] = Op_removeBackground; opcodeTablePtr[0x38] = Op_removeBackground;

View file

@ -29,43 +29,55 @@ namespace Cruise {
int currentTransparent; int currentTransparent;
struct drawVar1Struct { struct autoCellStruct {
struct drawVar1Struct *next; struct autoCellStruct *next;
short int field_2; short int ovlIdx;
short int field_4; short int objIdx;
short int field_6; short int type;
short int field_8; short int newValue;
cellStruct *field_A; cellStruct *pCell;
}; };
typedef struct drawVar1Struct drawVar1Struct; typedef struct autoCellStruct autoCellStruct;
drawVar1Struct drawVar1; autoCellStruct autoCellHead;
void mainDraw6(void) { void addAutoCell(int overlayIdx, int idx, int type, int newVal, cellStruct *pObject) {
drawVar1Struct *pCurrent = drawVar1.next; 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) { while (pCurrent) {
drawVar1Struct *next = pCurrent->next; autoCellStruct *next = pCurrent->next;
if (pCurrent->field_6 == 5) { if (pCurrent->type == 5) {
Op_InitializeStateSub(pCurrent->field_2, objInit(pCurrent->ovlIdx, pCurrent->objIdx, pCurrent->newValue);
pCurrent->field_4, pCurrent->field_8);
} else { } else {
setObjectPosition(pCurrent->field_2, pCurrent->field_4, setObjectPosition(pCurrent->ovlIdx, pCurrent->objIdx, pCurrent->type, pCurrent->newValue);
pCurrent->field_6, pCurrent->field_8);
} }
if (pCurrent->field_A->nextAnimDelay < 0) { if (pCurrent->pCell->animWait < 0) {
objectParamsQuery params; objectParamsQuery params;
getMultipleObjectParam(pCurrent->field_2, getMultipleObjectParam(pCurrent->ovlIdx, pCurrent->objIdx, &params);
pCurrent->field_4, &params);
pCurrent->field_A->currentAnimDelay = params.var6 - 1; pCurrent->pCell->animCounter = params.var6 - 1;
} }
free(pCurrent); delete pCurrent;
pCurrent = next; 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 #ifdef _DEBUG
void drawCtp(void) { void drawCtp(void) {
int i; int i;
@ -875,7 +871,7 @@ void mainDraw(int16 param) {
(char *)gfxModuleData.pPage10); (char *)gfxModuleData.pPage10);
} }
drawVar1.next = NULL; autoCellHead.next = NULL;
currentObjPtr = cellHead.next; currentObjPtr = cellHead.next;
@ -926,8 +922,7 @@ void mainDraw(int16 param) {
objZ2 += objZ1; objZ2 += objZ1;
} }
if ((params.var5 >= 0) && (objZ2 >= 0) if ((params.var5 >= 0) && (objZ2 >= 0) && filesDatabase[objZ2].subData.ptr) {
&& filesDatabase[objZ2].subData.ptr) {
if (filesDatabase[objZ2].subData.resourceType == 8) // Poly if (filesDatabase[objZ2].subData.resourceType == 8) // Poly
{ {
mainDrawPolygons(objZ2, currentObjPtr, objX2, params.scale, objY2, (char *)gfxModuleData.pPage10, (char *)filesDatabase[objZ2].subData.ptr); // 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].resType == 1) //(num plan == 1)
{ {
} else if (filesDatabase[objZ2].subData. } else if (filesDatabase[objZ2].subData.resourceType == 4) {
resourceType == 4) {
objX1 = filesDatabase[objZ2].width; // width objX1 = filesDatabase[objZ2].width; // width
spriteHeight = filesDatabase[objZ2].height; // height spriteHeight = filesDatabase[objZ2].height; // height
if (filesDatabase[objZ2].subData.ptr) { if (filesDatabase[objZ2].subData.ptr) {
currentTransparent = currentTransparent = filesDatabase[objZ2].subData.transparency;
filesDatabase[objZ2].
subData.transparency;
mainDrawSub4(objX1, mainDrawSub4(objX1, spriteHeight, currentObjPtr, (char *)filesDatabase[objZ2].subData.ptr, objY2, objX2,(char *)gfxModuleData.pPage10,(char *)filesDatabase[objZ2].subData.ptr);
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->animStep != 0) && (param == 0)) {
if (currentObjPtr->currentAnimDelay <= 0) { if (currentObjPtr->animCounter <= 0) {
int newVal; int newVal;
bool change = true; bool change = true;
newVal = newVal = getValueFromObjectQuerry(&params, currentObjPtr->animChange) + currentObjPtr->animStep;
getValueFromObjectQuerry(&params,
currentObjPtr->field_28) +
currentObjPtr->animStep;
if (currentObjPtr->animStep > 0) { if (currentObjPtr->animStep > 0) {
if (newVal > if (newVal > currentObjPtr->animEnd) {
currentObjPtr->field_22) { if (currentObjPtr->animLoop) {
if (currentObjPtr-> newVal = currentObjPtr->animStart;
field_30) { currentObjPtr->animLoop--;
newVal =
currentObjPtr->
field_20;
currentObjPtr->
field_30--;
} else { } else {
int16 data2; int16 data2;
data2 = data2 = currentObjPtr->animStart;
currentObjPtr->
field_20;
change = false; change = false;
currentObjPtr-> currentObjPtr->animStep = 0;
animStep =
0;
if (currentObjPtr->field_2A) // should we resume the script ? if (currentObjPtr->animType) // should we resume the script ?
{ {
if (currentObjPtr->field_1A == 20) { if (currentObjPtr->parentType == 20) {
changeScriptParamInList changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &procHead, 0, -1);
(currentObjPtr-> }
field_18, else if(currentObjPtr->parentType == 30) {
currentObjPtr-> changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &relHead, 0, -1);
field_16,
&scriptHandle2,
0,
-1);
} else
if
(currentObjPtr->
field_1A
==
30)
{
changeScriptParamInList
(currentObjPtr->
field_18,
currentObjPtr->
field_16,
&scriptHandle1,
0,
-1);
} }
} }
newVal = data2; newVal = data2;
@ -1029,50 +980,25 @@ void mainDraw(int16 param) {
* } */ * } */
} }
if (currentObjPtr->nextAnimDelay >= 0) { if (currentObjPtr->animWait >= 0) {
currentObjPtr-> currentObjPtr->animCounter = currentObjPtr->animWait;
currentAnimDelay =
currentObjPtr->
nextAnimDelay;
} }
if ((currentObjPtr->field_2C >= 0) if ((currentObjPtr->animSignal >= 0) && (currentObjPtr->animSignal == newVal) && (currentObjPtr->animType != 0)) {
&& (currentObjPtr->field_2C == if (currentObjPtr->parentType == 20) {
newVal) changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &procHead, 0, -1);
&& (currentObjPtr->field_2A != } else if (currentObjPtr->parentType == 30) {
0)) { changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &relHead, 0, -1);
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);
} }
currentObjPtr->field_2A = 0; currentObjPtr->animType = 0;
} }
if (change) { if (change) {
mainDraw5(currentObjPtr-> addAutoCell(currentObjPtr->overlay, currentObjPtr->idx, currentObjPtr->animChange, newVal, currentObjPtr);
overlay,
currentObjPtr->idx,
currentObjPtr->field_28,
currentObjPtr, newVal);
} }
} else { } else {
currentObjPtr->currentAnimDelay--; currentObjPtr->animCounter--;
} }
} }
} }
@ -1082,7 +1008,7 @@ void mainDraw(int16 param) {
//----------------------------------------------------------------------------------------------------------------// //----------------------------------------------------------------------------------------------------------------//
mainDraw6(); freeAutoCell();
var20 = 0; var20 = 0;
//-------------------------------------------------- DRAW OBJECTS TYPE 5 (MSG)-----------------------------------------// //-------------------------------------------------- DRAW OBJECTS TYPE 5 (MSG)-----------------------------------------//
@ -1091,10 +1017,7 @@ void mainDraw(int16 param) {
while (currentObjPtr) { while (currentObjPtr) {
if (currentObjPtr->type == 5 && currentObjPtr->freeze == 0) { if (currentObjPtr->type == 5 && currentObjPtr->freeze == 0) {
mainSprite(currentObjPtr->field_A, mainSprite(currentObjPtr->x, currentObjPtr->field_C, currentObjPtr->gfxPtr, gfxModuleData.pPage10, currentObjPtr->color, currentObjPtr->spriteIdx);
currentObjPtr->field_C, currentObjPtr->gfxPtr,
gfxModuleData.pPage10, currentObjPtr->color,
currentObjPtr->spriteIdx);
var20 = 1; var20 = 1;
} }
currentObjPtr = currentObjPtr->next; currentObjPtr = currentObjPtr->next;

View file

@ -73,14 +73,14 @@ int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx,
ovlData = overlayTable[overlayIdx].ovlData; ovlData = overlayTable[overlayIdx].ovlData;
switch (ptr->var1) { switch (ptr->type) {
case 0: case 0:
{ {
ptr2 = &ovlData->objData2SourceTable[ptr->var5]; 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; break;
} }
@ -88,25 +88,25 @@ int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx,
{ {
ptr2 = &ovlData->objData2WorkTable[ptr->var4]; ptr2 = &ovlData->objData2WorkTable[ptr->var4];
var_A = var_14 = ptr2->var5; var_A = var_14 = ptr2->state;
size = var_A + ptr->var5; size = var_A + ptr->var5;
if (ptr->var5 + var_14 <= ovlData->size8) { 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; break;
} }
default: default:
{ {
printf("unsupported case %d in getMultipleObjectParam\n", ptr->var1); printf("unsupported case %d in getMultipleObjectParam\n", ptr->type);
exit(1); exit(1);
} }
} }
returnParam->X = ptr2->X; returnParam->X = ptr2->X;
returnParam->Y = ptr2->Y; returnParam->Y = ptr2->Y;
returnParam->baseFileIdx = ptr2->baseFileIdx; returnParam->baseFileIdx = ptr2->Z;
returnParam->fileIdx = ptr2->var3; returnParam->fileIdx = ptr2->frame;
returnParam->scale = ptr2->scale; returnParam->scale = ptr2->scale;
returnParam->var5 = var_14; returnParam->var5 = var_14;
returnParam->var6 = var_A; returnParam->var6 = var_A;
@ -115,11 +115,11 @@ int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx,
return 0; return 0;
} }
void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) { void setObjectPosition(int16 ovlIdx, int16 objIdx, int16 param3, int16 param4) {
objDataStruct *ptr; objDataStruct *ptr;
objectParams *ptr2; objectParams *ptr2;
ptr = getObjectDataFromOverlay(param1, objIdx); ptr = getObjectDataFromOverlay(ovlIdx, objIdx);
if (!ptr) { if (!ptr) {
return; return;
@ -127,10 +127,10 @@ void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {
} }
//overlayTable[param1].ovlData //overlayTable[param1].ovlData
switch (ptr->var1) { switch (ptr->type) {
case 1: case 1:
{ {
ptr2 = &overlayTable[param1].ovlData->objData2WorkTable[ptr->var4]; ptr2 = &overlayTable[ovlIdx].ovlData->objData2WorkTable[ptr->var4];
switch (param3) { switch (param3) {
case 0: // x case 0: // x
@ -143,14 +143,15 @@ void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {
ptr2->Y = param4; ptr2->Y = param4;
break; break;
} }
case 2: // base file case 2: // z
{ {
ptr2->baseFileIdx = param4; ptr2->Z = param4;
sortCells(ovlIdx, objIdx, &cellHead);
break; break;
} }
case 3: case 3:
{ {
ptr2->var3 = param4; ptr2->frame = param4;
break; break;
} }
case 4: // scale case 4: // scale
@ -160,7 +161,7 @@ void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {
} }
case 5: // box colision case 5: // box colision
{ {
ptr2->var5 = param4; ptr2->state = param4;
break; break;
} }
default: 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 objInit(int ovlIdx, int objIdx, int newState) {
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) {
objDataStruct *ptr; objDataStruct *ptr;
// uint16 param; // uint16 param;
ovlDataStruct *ovlData; ovlDataStruct *ovlData;
@ -277,39 +191,38 @@ int16 Op_InitializeStateSub(int ovlIdx, int objIdx, int param2) {
ovlData = overlayTable[ovlIdx].ovlData; ovlData = overlayTable[ovlIdx].ovlData;
switch (ptr->var1) { switch (ptr->type) {
case 0: case THEME:
case MULTIPLE:
{ {
globalVars[overlayTable[ovlIdx].field_14 + ptr->var6] = globalVars[overlayTable[ovlIdx].state + ptr->stateTableIdx] = newState;
param2; sortCells(ovlIdx, objIdx, &cellHead);
Op_InitializeStateSub1(ovlIdx, param2, &cellHead);
break; break;
} }
case 1: case UNIQUE:
break;
case VARIABLE:
{ {
objectParams *destEntry; objectParams *destEntry;
objectParams *sourceEntry; objectParams *sourceEntry;
if (ptr->var5 + param2 > ovlData->size8) { if (ptr->var5 + newState > ovlData->size8) {
return 0; return 0;
} }
destEntry = &ovlData->objData2WorkTable[ptr->var4]; destEntry = &ovlData->objData2WorkTable[ptr->var4];
sourceEntry = sourceEntry = &ovlData->objData2SourceTable[ptr->var5 + newState];
&ovlData->objData2SourceTable[ptr->var5 + param2];
memcpy(destEntry, sourceEntry, sizeof(objectParams)); memcpy(destEntry, sourceEntry, sizeof(objectParams));
destEntry->var5 = param2; destEntry->state = newState;
Op_InitializeStateSub1(ovlIdx, param2, &cellHead); sortCells(ovlIdx, objIdx, &cellHead);
break; break;
} }
default: default:
{ {
printf printf("Unsupported param = %d in objInit\n", ptr->type);
("Unsupported param = %d in Op_InitializeStateSub\n",
ptr->var1);
// exit(1); // exit(1);
} }
} }
@ -317,8 +230,7 @@ int16 Op_InitializeStateSub(int ovlIdx, int objIdx, int param2) {
return 0; return 0;
} }
int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3, int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3, int16 *returnParam) {
int16 *returnParam) {
int var_A = 0; int var_A = 0;
//char* ptr3 = NULL; //char* ptr3 = NULL;
objDataStruct *ptr; objDataStruct *ptr;
@ -332,11 +244,11 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,
ovlData = overlayTable[overlayIdx].ovlData; ovlData = overlayTable[overlayIdx].ovlData;
switch (ptr->var1) { switch (ptr->type) {
case 0: case 0:
case 3: case 3:
{ {
var_A = globalVars[ptr->var6]; var_A = globalVars[ptr->stateTableIdx];
ptr2 = &ovlData->objData2SourceTable[ptr->var5]; ptr2 = &ovlData->objData2SourceTable[ptr->var5];
break; break;
@ -345,13 +257,12 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,
{ {
ptr2 = &ovlData->objData2WorkTable[ptr->var4]; ptr2 = &ovlData->objData2WorkTable[ptr->var4];
var_A = ptr2->var5; var_A = ptr2->state;
break; break;
} }
default: default:
{ {
printf("Unsupported case %d in getSingleObjectParam\n", printf("Unsupported case %d in getSingleObjectParam\n",ptr->type);
ptr->var1);
exit(1); exit(1);
} }
} }
@ -369,12 +280,12 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,
} }
case 2: case 2:
{ {
*returnParam = ptr2->baseFileIdx; *returnParam = ptr2->Z;
break; break;
} }
case 3: case 3:
{ {
*returnParam = ptr2->var3; *returnParam = ptr2->frame;
break; break;
} }
case 4: case 4:
@ -389,9 +300,7 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,
} }
default: default:
{ {
printf printf("Unsupported case %d in getSingleObjectParam case 1\n", param3);
("Unsupported case %d in getSingleObjectParam case 1\n",
param3);
exit(1); exit(1);
} }
} }

View file

@ -53,10 +53,8 @@ struct objectParamsQuery {
typedef struct objectParamsQuery objectParamsQuery; typedef struct objectParamsQuery objectParamsQuery;
objDataStruct *getObjectDataFromOverlay(int ovlIdx, int objIdx); objDataStruct *getObjectDataFromOverlay(int ovlIdx, int objIdx);
int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3, int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3, int16 * returnParam);
int16 * returnParam); int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx, objectParamsQuery * returnParam);
int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx,
objectParamsQuery * returnParam);
} // End of namespace Cruise } // End of namespace Cruise

View file

@ -420,9 +420,9 @@ int loadOverlay(uint8 *scriptName) {
scriptPtr += 2; scriptPtr += 2;
flipShort(&ovlData->objDataTable[i].var0); flipShort(&ovlData->objDataTable[i].var0);
ovlData->objDataTable[i].var1 = *(int16 *) scriptPtr; ovlData->objDataTable[i].type = *(int16 *) scriptPtr;
scriptPtr += 2; scriptPtr += 2;
flipShort(&ovlData->objDataTable[i].var1); flipShort(&ovlData->objDataTable[i].type);
ovlData->objDataTable[i].var2 = *(int16 *) scriptPtr; ovlData->objDataTable[i].var2 = *(int16 *) scriptPtr;
scriptPtr += 2; scriptPtr += 2;
@ -440,16 +440,16 @@ int loadOverlay(uint8 *scriptName) {
scriptPtr += 2; scriptPtr += 2;
flipShort(&ovlData->objDataTable[i].var5); flipShort(&ovlData->objDataTable[i].var5);
ovlData->objDataTable[i].var6 = *(int16 *) scriptPtr; ovlData->objDataTable[i].stateTableIdx = *(int16 *) scriptPtr;
scriptPtr += 2; scriptPtr += 2;
flipShort(&ovlData->objDataTable[i].var6); flipShort(&ovlData->objDataTable[i].stateTableIdx);
} }
if (scriptNotLoadedBefore) { if (scriptNotLoadedBefore) {
//int var1; //int var1;
//int var2; //int var2;
overlayTable[scriptIdx].field_14 = (char)setup1; overlayTable[scriptIdx].state = (char)setup1;
var1 = loadScriptSub1(scriptIdx, 3); var1 = loadScriptSub1(scriptIdx, 3);
var2 = loadScriptSub1(scriptIdx, 0); var2 = loadScriptSub1(scriptIdx, 0);
@ -733,11 +733,11 @@ int releaseOverlay(const char *name) {
overlayTable[overlayIdx].var16 = NULL; overlayTable[overlayIdx].var16 = NULL;
} */ } */
removeScript(overlayIdx, -1, &scriptHandle2); removeScript(overlayIdx, -1, &procHead);
removeScript(overlayIdx, -1, &scriptHandle2); removeScript(overlayIdx, -1, &procHead);
removeScript(overlayIdx, -1, &scriptHandle1); removeScript(overlayIdx, -1, &relHead);
removeScript(overlayIdx, -1, &scriptHandle1); removeScript(overlayIdx, -1, &relHead);
printf("releaseOverlay: finish !\n"); printf("releaseOverlay: finish !\n");

View file

@ -106,14 +106,19 @@ struct importDataStruct {
typedef struct importDataStruct importDataStruct; typedef struct importDataStruct importDataStruct;
#define MULTIPLE 0
#define VARIABLE 1
#define UNIQUE 2
#define THEME 3
struct objDataStruct { struct objDataStruct {
int16 var0; int16 var0;
int16 var1; int16 type;
int16 var2; int16 var2;
int16 var3; int16 var3;
int16 var4; int16 var4;
int16 var5; int16 var5;
int16 var6; int16 stateTableIdx;
}; };
typedef struct objDataStruct objDataStruct; typedef struct objDataStruct objDataStruct;
@ -121,10 +126,10 @@ typedef struct objDataStruct objDataStruct;
struct objectParams { struct objectParams {
int16 X; int16 X;
int16 Y; int16 Y;
int16 baseFileIdx; int16 Z;
int16 var3; int16 frame;
int16 scale; int16 scale;
int16 var5; int16 state;
}; };
typedef struct objectParams objectParams; typedef struct objectParams objectParams;
@ -169,7 +174,7 @@ struct overlayStruct {
char overlayName[14]; char overlayName[14];
ovlDataStruct *ovlData; ovlDataStruct *ovlData;
short int alreadyLoaded; short int alreadyLoaded;
char field_14; char state;
char field_15; char field_15;
char field_16; char field_16;
char field_17; char field_17;

View file

@ -264,8 +264,8 @@ int loadSavegameData(int saveGameIdx) {
fread(mediumVar, 0x880, 1, fileHandle); fread(mediumVar, 0x880, 1, fileHandle);
loadSavegameDataSub1(fileHandle); loadSavegameDataSub1(fileHandle);
loadScriptsFromSave(fileHandle, &scriptHandle2); loadScriptsFromSave(fileHandle, &procHead);
loadScriptsFromSave(fileHandle, &scriptHandle1); loadScriptsFromSave(fileHandle, &relHead);
loadSavegameDataSub2(fileHandle); loadSavegameDataSub2(fileHandle);
loadBackgroundIncrustFromSave(fileHandle); loadBackgroundIncrustFromSave(fileHandle);

View file

@ -26,8 +26,8 @@
namespace Cruise { namespace Cruise {
scriptInstanceStruct scriptHandle1; scriptInstanceStruct relHead;
scriptInstanceStruct scriptHandle2; scriptInstanceStruct procHead;
scriptInstanceStruct *currentScriptPtr; scriptInstanceStruct *currentScriptPtr;

View file

@ -28,10 +28,10 @@
namespace Cruise { namespace Cruise {
enum scriptTypeEnum { enum scriptTypeEnum {
scriptType_Minus20 = -20, scriptType_MinusPROC = -20,
scriptType_Minus30 = -30, scriptType_Minus30 = -30,
scriptType_20 = 20, scriptType_PROC = 20,
scriptType_30 = 30 scriptType_REL = 30
}; };
typedef enum scriptTypeEnum scriptTypeEnum; typedef enum scriptTypeEnum scriptTypeEnum;
@ -55,8 +55,8 @@ struct scriptInstanceStruct {
typedef struct scriptInstanceStruct scriptInstanceStruct; typedef struct scriptInstanceStruct scriptInstanceStruct;
extern scriptInstanceStruct scriptHandle1; extern scriptInstanceStruct relHead;
extern scriptInstanceStruct scriptHandle2; extern scriptInstanceStruct procHead;
extern scriptInstanceStruct *currentScriptPtr; extern scriptInstanceStruct *currentScriptPtr;
void setupFuncArray(void); void setupFuncArray(void);

View file

@ -39,68 +39,6 @@ int16 readB16(void *ptr) {
return temp; 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) { char *getText(int textIndex, int overlayIndex) {
if (!overlayTable[overlayIndex].ovlData) { if (!overlayTable[overlayIndex].ovlData) {
return NULL; return NULL;
@ -114,57 +52,4 @@ char *getText(int textIndex, int overlayIndex) {
string; 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 } // End of namespace Cruise

View file

@ -35,13 +35,8 @@ extern uint16 main15;
int16 readB16(void *ptr); int16 readB16(void *ptr);
void createTextObject(int overlayIdx, int oldVar8, cellStruct * pObject, int16 objInit(int ovlIdx, int param1, int param2);
int scriptNumber, int scriptOverlayNumber, int backgroundPlane, char *getText(int textIndex, int overlayIndex);
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);
} // End of namespace Cruise } // End of namespace Cruise
#endif #endif