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,
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];
int newA = raoul_end[currentActor->startDirection][0];
set_anim(currentActor->
overlayNumber,
currentActor->idx,
currentActor->start,
currentActor->x,
currentActor->y, newA,
currentActor->poly);
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);
}
}

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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();

View file

@ -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;

View file

@ -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;

View file

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

View file

@ -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;
*/
int newFreezz = popVar();
int oldFreeze = popVar();
int backgroundPlante = popVar();
int objType = popVar();
int objIdx = popVar();
int overlayIdx = popVar();
var0 = popVar();
var1 = popVar();
var2 = popVar();
var3 = popVar();
var4 = popVar();
var5 = 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;

View file

@ -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;
currentTransparent = filesDatabase[objZ2].subData.transparency;
mainDrawSub4(objX1,
spriteHeight,
currentObjPtr,
(char *)
filesDatabase[objZ2].
subData.ptr, objY2, objX2,
(char *)gfxModuleData.
pPage10,
(char *)
filesDatabase[objZ2].
subData.ptr);
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;

View file

@ -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);
}
}

View file

@ -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

View file

@ -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");

View file

@ -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;

View file

@ -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);

View file

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

View file

@ -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);

View file

@ -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

View file

@ -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