Implement reset animations, cleanups and fix a few sanitizer issues

This commit is contained in:
yaz0r 2025-06-14 02:08:20 -07:00
parent 50727c98a5
commit 0ffbc021e2
14 changed files with 298 additions and 206 deletions

View File

@ -28,6 +28,12 @@ void afficheSprite(int left, int top, int index, char* gfxData)
offset = 320 - width; offset = 320 - width;
// Prevent overflow
if(height + top > 200)
{
height = top - 200;
}
for(i=0;i<height;i++) for(i=0;i<height;i++)
{ {
for(j=0;j<width;j++) for(j=0;j<width;j++)

View File

@ -129,23 +129,23 @@ int InitAnim(int animNum,int animType, int animInfo)
{ {
if(animNum == currentProcessedActorPtr->ANIM) if(animNum == currentProcessedActorPtr->ANIM)
{ {
if(!(currentProcessedActorPtr->_flags & AF_ANIMATED)) if(!(currentProcessedActorPtr->objectType & AF_ANIMATED))
{ {
if(currentProcessedActorPtr->_flags & AF_BOXIFY) if(currentProcessedActorPtr->objectType & AF_BOXIFY)
{ {
removeFromBGIncrust(currentProcessedActorIdx); removeFromBGIncrust(currentProcessedActorIdx);
} }
currentProcessedActorPtr->_flags |= AF_ANIMATED; currentProcessedActorPtr->objectType |= AF_ANIMATED;
SetAnimObjet(currentProcessedActorPtr->FRAME, HQR_Get(listAnim,animNum), HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); SetAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim,animNum), HQR_Get(listBody, currentProcessedActorPtr->bodyNum));
currentProcessedActorPtr->animType = animType; currentProcessedActorPtr->animType = animType;
currentProcessedActorPtr->animInfo = animInfo; currentProcessedActorPtr->animInfo = animInfo;
if(g_gameId > AITD1) if(g_gameId > AITD1)
{ {
currentProcessedActorPtr->FRAME = 0; currentProcessedActorPtr->frame = 0;
} }
return 1; return 1;
@ -164,11 +164,11 @@ int InitAnim(int animNum,int animType, int animInfo)
return(1); return(1);
} }
if(!(currentProcessedActorPtr->_flags & AF_ANIMATED)) if(!(currentProcessedActorPtr->objectType & AF_ANIMATED))
{ {
currentProcessedActorPtr->_flags |= AF_ANIMATED; currentProcessedActorPtr->objectType |= AF_ANIMATED;
if(currentProcessedActorPtr->_flags & AF_BOXIFY) if(currentProcessedActorPtr->objectType & AF_BOXIFY)
{ {
removeFromBGIncrust(currentProcessedActorIdx); removeFromBGIncrust(currentProcessedActorIdx);
} }
@ -180,7 +180,7 @@ int InitAnim(int animNum,int animType, int animInfo)
currentProcessedActorPtr->newAnimInfo = animInfo; currentProcessedActorPtr->newAnimInfo = animInfo;
if(g_gameId > AITD1) if(g_gameId > AITD1)
{ {
currentProcessedActorPtr->FRAME = 0; currentProcessedActorPtr->frame = 0;
} }
return 1; return 1;
} }
@ -215,7 +215,7 @@ int InitAnim(int animNum,int animType, int animInfo)
if(g_gameId != AITD1) if(g_gameId != AITD1)
{ {
currentProcessedActorPtr->FRAME = 0; currentProcessedActorPtr->frame = 0;
} }
return(1); return(1);
@ -293,52 +293,64 @@ void updateAnimation(void)
int newAnim = currentProcessedActorPtr->newAnim; int newAnim = currentProcessedActorPtr->newAnim;
if(newAnim != -1) // next anim ? if (newAnim != -1) // next anim ?
{ {
if(newAnim == -2) // completely stop anim and add actor to background if (newAnim == -2) // completely stop anim and add actor to background
{ {
addActorToBgInscrust(currentProcessedActorIdx); addActorToBgInscrust(currentProcessedActorIdx);
currentProcessedActorPtr->newAnim = -1; currentProcessedActorPtr->newAnim = -1;
currentProcessedActorPtr->newAnimType = 0; currentProcessedActorPtr->newAnimType = 0;
currentProcessedActorPtr->newAnimInfo = -1; currentProcessedActorPtr->newAnimInfo = -1;
currentProcessedActorPtr->END_ANIM = 1; currentProcessedActorPtr->flagEndAnim = 1;
return; return;
} }
else {
if (!(currentProcessedActorPtr->newAnimType & ANIM_RESET)) // Reset
{
if (currentProcessedActorPtr->END_FRAME == 0)
{
currentProcessedActorPtr->worldX += currentProcessedActorPtr->stepX;
currentProcessedActorPtr->roomX += currentProcessedActorPtr->stepX;
if(currentProcessedActorPtr->END_FRAME == 0) currentProcessedActorPtr->worldZ += currentProcessedActorPtr->stepZ;
{ currentProcessedActorPtr->roomZ += currentProcessedActorPtr->stepZ;
currentProcessedActorPtr->worldX += currentProcessedActorPtr->stepX;
currentProcessedActorPtr->roomX += currentProcessedActorPtr->stepX;
currentProcessedActorPtr->worldZ += currentProcessedActorPtr->stepZ; currentProcessedActorPtr->stepX = 0;
currentProcessedActorPtr->roomZ += currentProcessedActorPtr->stepZ; currentProcessedActorPtr->stepZ = 0;
currentProcessedActorPtr->stepX = 0; currentProcessedActorPtr->animNegX = 0;
currentProcessedActorPtr->stepZ = 0; currentProcessedActorPtr->animNegY = 0;
currentProcessedActorPtr->animNegZ = 0;
}
currentProcessedActorPtr->animNegX = 0; // TODO: AITD3 has some extra code here to handle bufferAnimCounter
currentProcessedActorPtr->animNegY = 0;
currentProcessedActorPtr->animNegZ = 0;
}
initBufferAnim(BufferAnim[bufferAnimCounter], HQR_Get(listBody,currentProcessedActorPtr->bodyNum)); StockInterAnim(BufferAnim[bufferAnimCounter], HQR_Get(listBody, currentProcessedActorPtr->bodyNum));
bufferAnimCounter++; bufferAnimCounter++;
if(bufferAnimCounter == NB_BUFFER_ANIM) if (bufferAnimCounter == NB_BUFFER_ANIM)
bufferAnimCounter = 0; bufferAnimCounter = 0;
currentProcessedActorPtr->ANIM = newAnim; }
currentProcessedActorPtr->animType = currentProcessedActorPtr->newAnimType; else {
currentProcessedActorPtr->animInfo = currentProcessedActorPtr->newAnimInfo; ResetStartAnim(HQR_Get(listBody, currentProcessedActorPtr->bodyNum));
currentProcessedActorPtr->newAnim = -1; currentProcessedActorPtr->newAnimType &= ~ANIM_RESET;
currentProcessedActorPtr->newAnimType = 0; }
currentProcessedActorPtr->newAnimInfo = -1; currentProcessedActorPtr->ANIM = newAnim;
currentProcessedActorPtr->END_ANIM = 0; currentProcessedActorPtr->animType = currentProcessedActorPtr->newAnimType;
currentProcessedActorPtr->FRAME = 0; currentProcessedActorPtr->animInfo = currentProcessedActorPtr->newAnimInfo;
currentProcessedActorPtr->numOfFrames = GetNbFramesAnim(HQR_Get(listAnim,newAnim)); currentProcessedActorPtr->newAnim = -1;
} currentProcessedActorPtr->newAnimType = 0;
currentProcessedActorPtr->newAnimInfo = -1;
currentProcessedActorPtr->flagEndAnim = 0;
currentProcessedActorPtr->frame = 0;
currentProcessedActorPtr->numOfFrames = GetNbFramesAnim(HQR_Get(listAnim, newAnim));
}
}
if(currentProcessedActorPtr->ANIM == -1) // no animation if(currentProcessedActorPtr->ANIM == -1) // no animation
{ {
@ -382,7 +394,7 @@ void updateAnimation(void)
oldStepY = currentProcessedActorPtr->stepY; oldStepY = currentProcessedActorPtr->stepY;
oldStepZ = currentProcessedActorPtr->stepZ; oldStepZ = currentProcessedActorPtr->stepZ;
currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->FRAME, HQR_Get(listAnim, currentProcessedActorPtr->ANIM), HQR_Get(listBody, currentProcessedActorPtr->bodyNum)); currentProcessedActorPtr->END_FRAME = SetInterAnimObjet(currentProcessedActorPtr->frame, HQR_Get(listAnim, currentProcessedActorPtr->ANIM), HQR_Get(listBody, currentProcessedActorPtr->bodyNum));
walkStep(animStepX,animStepZ,currentProcessedActorPtr->beta); walkStep(animStepX,animStepZ,currentProcessedActorPtr->beta);
@ -499,7 +511,7 @@ void updateAnimation(void)
ZVStruct* touchedZv = &actorTouchedPtr->zv; ZVStruct* touchedZv = &actorTouchedPtr->zv;
if(actorTouchedPtr->_flags & AF_FOUNDABLE) // takable if(actorTouchedPtr->objectType & AF_FOUNDABLE) // takable
{ {
if(currentProcessedActorPtr->trackMode == 1 /*&& ((gameId == AITD1 && defines.field_1E == 0) || (gameId >= JACK && defines.field_6 == 0))*/) // TODO: check if character isn't dead... if(currentProcessedActorPtr->trackMode == 1 /*&& ((gameId == AITD1 && defines.field_1E == 0) || (gameId >= JACK && defines.field_6 == 0))*/) // TODO: check if character isn't dead...
{ {
@ -508,7 +520,7 @@ void updateAnimation(void)
} }
else else
{ {
if(actorTouchedPtr->_flags & AF_MOVABLE) // can be pushed ? if(actorTouchedPtr->objectType & AF_MOVABLE) // can be pushed ?
{ {
ZVStruct localZv2; ZVStruct localZv2;
@ -568,12 +580,12 @@ void updateAnimation(void)
} }
else // push succeed else // push succeed
{ {
if(actorTouchedPtr->_flags & AF_BOXIFY) if(actorTouchedPtr->objectType & AF_BOXIFY)
{ {
removeFromBGIncrust(collisionIndex); removeFromBGIncrust(collisionIndex);
} }
actorTouchedPtr->_flags |= AF_ANIMATED; actorTouchedPtr->objectType |= AF_ANIMATED;
actorTouchedPtr->worldX += stepX; // apply push to object actorTouchedPtr->worldX += stepX; // apply push to object
actorTouchedPtr->worldZ += stepZ; actorTouchedPtr->worldZ += stepZ;
@ -645,7 +657,7 @@ void updateAnimation(void)
currentProcessedActorPtr->stepY = 0; currentProcessedActorPtr->stepY = 0;
if(currentProcessedActorPtr->_flags & AF_FALLABLE) if(currentProcessedActorPtr->objectType & AF_FALLABLE)
{ {
zvPtr = &currentProcessedActorPtr->zv; zvPtr = &currentProcessedActorPtr->zv;
@ -665,7 +677,7 @@ void updateAnimation(void)
} }
else else
{ {
if((currentProcessedActorPtr->YHandler.numSteps != -1) && (currentProcessedActorPtr->_flags & AF_FALLABLE)) if((currentProcessedActorPtr->YHandler.numSteps != -1) && (currentProcessedActorPtr->objectType & AF_FALLABLE))
{ {
currentProcessedActorPtr->falling = 1; currentProcessedActorPtr->falling = 1;
} }
@ -679,7 +691,7 @@ void updateAnimation(void)
{ {
tObject* actorTouchedPtr = &objectTable[collisionIndex]; tObject* actorTouchedPtr = &objectTable[collisionIndex];
if(actorTouchedPtr->_flags & AF_MOVABLE) if(actorTouchedPtr->objectType & AF_MOVABLE)
{ {
int i; int i;
@ -691,7 +703,7 @@ void updateAnimation(void)
if(i == 3) if(i == 3)
{ {
actorTouchedPtr->_flags &= ~AF_ANIMATED; actorTouchedPtr->objectType &= ~AF_ANIMATED;
addActorToBgInscrust(collisionIndex); addActorToBgInscrust(collisionIndex);
} }
} }
@ -700,12 +712,12 @@ void updateAnimation(void)
if(currentProcessedActorPtr->END_FRAME) // key frame change if(currentProcessedActorPtr->END_FRAME) // key frame change
{ {
currentProcessedActorPtr->FRAME++; currentProcessedActorPtr->frame++;
if(currentProcessedActorPtr->FRAME >= currentProcessedActorPtr->numOfFrames) // end of anim ? if(currentProcessedActorPtr->frame >= currentProcessedActorPtr->numOfFrames) // end of anim ?
{ {
currentProcessedActorPtr->END_ANIM = 1; // end of anim currentProcessedActorPtr->flagEndAnim = 1; // end of anim
currentProcessedActorPtr->FRAME = 0; // restart anim currentProcessedActorPtr->frame = 0; // restart anim
if(!(currentProcessedActorPtr->animType & 1) && (currentProcessedActorPtr->newAnim == -1)) // is another anim waiting ? if(!(currentProcessedActorPtr->animType & 1) && (currentProcessedActorPtr->newAnim == -1)) // is another anim waiting ?
{ {
@ -743,12 +755,12 @@ void updateAnimation(void)
InitRealValue(0,currentProcessedActorPtr->speed,60,&currentProcessedActorPtr->speedChange); InitRealValue(0,currentProcessedActorPtr->speed,60,&currentProcessedActorPtr->speedChange);
} }
currentProcessedActorPtr->END_ANIM = 0; currentProcessedActorPtr->flagEndAnim = 0;
} }
} }
void initBufferAnim(std::vector<s16>& buffer, char* bodyPtr) void StockInterAnim(std::vector<s16>& buffer, char* bodyPtr)
{ {
std::vector<s16>::iterator bufferIt = buffer.begin(); std::vector<s16>::iterator bufferIt = buffer.begin();
@ -806,6 +818,13 @@ void initBufferAnim(std::vector<s16>& buffer, char* bodyPtr)
} }
} }
void ResetStartAnim(char* bodyPtr) {
bodyPtr += 16;
*(u16*)(bodyPtr + 4) = 0; // reset timer
*(s16*)(bodyPtr) = 0;
*(s16*)(bodyPtr + 2) = 0;
}
s16 GetNbFramesAnim(char* animPtr) s16 GetNbFramesAnim(char* animPtr)
{ {
return(*(s16*)animPtr); return(*(s16*)animPtr);

View File

@ -7,7 +7,8 @@ int InitAnim(int animNum,int animType, int animInfo);
int SetAnimObjet(int frame, char* anim, char* body); int SetAnimObjet(int frame, char* anim, char* body);
s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr); s16 SetInterAnimObjet(int frame, char* animPtr, char* bodyPtr);
s16 GetNbFramesAnim(char* animPtr); s16 GetNbFramesAnim(char* animPtr);
void initBufferAnim(std::vector<s16>& animBuffer, char* bodyPtr); void StockInterAnim(std::vector<s16>& animBuffer, char* bodyPtr);
void ResetStartAnim(char* bodyPtr);
void updateAnimation(void); void updateAnimation(void);
void InitCopyBox(char* var0, char* var1); void InitCopyBox(char* var0, char* var1);

View File

@ -29,7 +29,7 @@ void GereFrappe(void)
return; return;
} }
if (currentProcessedActorPtr->FRAME == currentProcessedActorPtr->animActionFRAME) if (currentProcessedActorPtr->frame == currentProcessedActorPtr->animActionFRAME)
{ {
currentProcessedActorPtr->animActionType = FRAPPE_OK; currentProcessedActorPtr->animActionType = FRAPPE_OK;
} }
@ -77,7 +77,7 @@ void GereFrappe(void)
actorPtr2->HIT_BY = currentProcessedActorIdx; actorPtr2->HIT_BY = currentProcessedActorIdx;
actorPtr2->hitForce = currentProcessedActorPtr->hitForce; actorPtr2->hitForce = currentProcessedActorPtr->hitForce;
if(actorPtr2->_flags & AF_ANIMATED) if(actorPtr2->objectType & AF_ANIMATED)
{ {
currentProcessedActorPtr->animActionType = 0; currentProcessedActorPtr->animActionType = 0;
return; return;
@ -90,7 +90,7 @@ void GereFrappe(void)
if(currentProcessedActorPtr->ANIM != currentProcessedActorPtr->animActionANIM) if(currentProcessedActorPtr->ANIM != currentProcessedActorPtr->animActionANIM)
return; return;
if(currentProcessedActorPtr->FRAME != currentProcessedActorPtr->animActionFRAME) if(currentProcessedActorPtr->frame != currentProcessedActorPtr->animActionFRAME)
return; return;
currentProcessedActorPtr->animActionType = 5; currentProcessedActorPtr->animActionType = 5;
@ -174,7 +174,7 @@ void GereFrappe(void)
} }
else else
{ {
if(currentProcessedActorPtr->FRAME == currentProcessedActorPtr->animActionFRAME) if(currentProcessedActorPtr->frame == currentProcessedActorPtr->animActionFRAME)
{ {
currentProcessedActorPtr->animActionType = 7; currentProcessedActorPtr->animActionType = 7;
@ -240,8 +240,8 @@ void GereFrappe(void)
actorPtr->zv.ZVZ1 += z; actorPtr->zv.ZVZ1 += z;
actorPtr->zv.ZVZ2 += z; actorPtr->zv.ZVZ2 += z;
actorPtr->_flags |= AF_ANIMATED; actorPtr->objectType |= AF_ANIMATED;
actorPtr->_flags &= ~AF_BOXIFY; actorPtr->objectType &= ~AF_BOXIFY;
ListWorldObjets[objIdx].x = x; ListWorldObjets[objIdx].x = x;
ListWorldObjets[objIdx].y = y; ListWorldObjets[objIdx].y = y;

View File

@ -270,10 +270,10 @@ void debugger_draw(void)
InputS16("newAnim", &pObject->newAnim); InputS16("newAnim", &pObject->newAnim);
InputS16("newAnimType", &pObject->newAnimType); InputS16("newAnimType", &pObject->newAnimType);
InputS16("newAnimInfo", &pObject->newAnimInfo); InputS16("newAnimInfo", &pObject->newAnimInfo);
InputS16("FRAME", &pObject->FRAME); InputS16("FRAME", &pObject->frame);
InputS16("numOfFrames", &pObject->numOfFrames); InputS16("numOfFrames", &pObject->numOfFrames);
InputS16("END_FRAME", &pObject->END_FRAME); InputS16("END_FRAME", &pObject->END_FRAME);
InputS16("END_ANIM", &pObject->END_ANIM); InputS16("END_ANIM", &pObject->flagEndAnim);
InputS16("trackMode", &pObject->trackMode); InputS16("trackMode", &pObject->trackMode);
InputS16("trackNumber", &pObject->trackNumber); InputS16("trackNumber", &pObject->trackNumber);
InputS16("MARK", &pObject->MARK); InputS16("MARK", &pObject->MARK);

View File

@ -298,12 +298,12 @@ int evalVar(const char* name)
} }
case 0x6: case 0x6:
{ {
return(actorPtr->END_ANIM); return(actorPtr->flagEndAnim);
break; break;
} }
case 0x7: case 0x7:
{ {
return(actorPtr->FRAME); return(actorPtr->frame);
break; break;
} }
case 0x8: case 0x8:
@ -608,7 +608,7 @@ int evalVar2(const char* name)
actorIdx = ListWorldObjets[objectNumber].objIndex; actorIdx = ListWorldObjets[objectNumber].objIndex;
currentLifePtr+=2; currentLifePtr+=2;
actorPtr = &objectTable[actorIdx]; actorPtr = nullptr;
if(actorIdx==-1) if(actorIdx==-1)
{ {
@ -640,6 +640,9 @@ int evalVar2(const char* name)
} }
} }
} }
else {
actorPtr = &objectTable[actorIdx];
}
} }
{ {
@ -724,12 +727,12 @@ int evalVar2(const char* name)
} }
case 0x6: case 0x6:
{ {
return(actorPtr->END_ANIM); return(actorPtr->flagEndAnim);
break; break;
} }
case 0x7: case 0x7:
{ {
return(actorPtr->FRAME); return(actorPtr->frame);
break; break;
} }
case 0x8: case 0x8:

View File

@ -84,14 +84,11 @@ int randRange(int min, int max)
int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alpha, int beta, int gamma, ZVStruct* zvPtr) int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alpha, int beta, int gamma, ZVStruct* zvPtr)
{ {
s16 localSpecialTable[4]; s16 localSpecialTable[4];
tObject* currentActorPtr;
int i;
ZVStruct* actorZvPtr;
memcpy(localSpecialTable, specialTable, 8); memcpy(localSpecialTable, specialTable, 8);
currentActorPtr = objectTable; tObject* currentActorPtr = objectTable.data();
int i;
for (i = 0; i < NUM_MAX_OBJECT; i++) // count the number of active actors for (i = 0; i < NUM_MAX_OBJECT; i++) // count the number of active actors
{ {
if (currentActorPtr->indexInWorld == -1) if (currentActorPtr->indexInWorld == -1)
@ -104,7 +101,7 @@ int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alp
return(-1); return(-1);
} }
currentActorPtr->_flags = AF_SPECIAL; currentActorPtr->objectType = AF_SPECIAL;
currentActorPtr->indexInWorld = -2; currentActorPtr->indexInWorld = -2;
currentActorPtr->life = -1; currentActorPtr->life = -1;
currentActorPtr->lifeMode = 2; currentActorPtr->lifeMode = 2;
@ -129,6 +126,7 @@ int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alp
currentActorPtr->stepY = 0; currentActorPtr->stepY = 0;
currentActorPtr->stepZ = 0; currentActorPtr->stepZ = 0;
ZVStruct* actorZvPtr = nullptr;
if (zvPtr) if (zvPtr)
{ {
actorZvPtr = &currentActorPtr->zv; actorZvPtr = &currentActorPtr->zv;
@ -149,9 +147,9 @@ int InitSpecialObjet(int mode, int X, int Y, int Z, int stage, int room, int alp
actorZvPtr->ZVZ1 -= Z; actorZvPtr->ZVZ1 -= Z;
actorZvPtr->ZVZ2 -= Z; actorZvPtr->ZVZ2 -= Z;
currentActorPtr->FRAME = HQ_Malloc(HQ_Memory, 304); currentActorPtr->frame = HQ_Malloc(HQ_Memory, 304);
flowPtr = HQ_PtrMalloc(HQ_Memory, currentActorPtr->FRAME); flowPtr = HQ_PtrMalloc(HQ_Memory, currentActorPtr->frame);
if (!flowPtr) if (!flowPtr)
{ {
@ -758,7 +756,7 @@ void processLife(int lifeNum, bool callFoundLife)
{ {
currentProcessedActorPtr->bodyNum = lifeTempVar1; currentProcessedActorPtr->bodyNum = lifeTempVar1;
if (currentProcessedActorPtr->_flags & AF_ANIMATED) if (currentProcessedActorPtr->objectType & AF_ANIMATED)
{ {
if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1))
{ {
@ -779,7 +777,7 @@ void processLife(int lifeNum, bool callFoundLife)
} }
else */ else */
{ {
SetInterAnimObjet(currentProcessedActorPtr->FRAME, pAnim, pBody); SetInterAnimObjet(currentProcessedActorPtr->frame, pAnim, pBody);
} }
} }
} }
@ -802,7 +800,7 @@ void processLife(int lifeNum, bool callFoundLife)
currentProcessedActorPtr->bodyNum = param1; currentProcessedActorPtr->bodyNum = param1;
if (currentProcessedActorPtr->_flags & AF_ANIMATED) if (currentProcessedActorPtr->objectType & AF_ANIMATED)
{ {
char* pAnim = HQR_Get(listAnim, currentProcessedActorPtr->ANIM); char* pAnim = HQR_Get(listAnim, currentProcessedActorPtr->ANIM);
char* pBody; char* pBody;
@ -920,9 +918,9 @@ void processLife(int lifeNum, bool callFoundLife)
appendFormated("LM_TYPE "); appendFormated("LM_TYPE ");
lifeTempVar1 = readNextArgument("type") & AF_MASK; lifeTempVar1 = readNextArgument("type") & AF_MASK;
lifeTempVar2 = currentProcessedActorPtr->_flags; lifeTempVar2 = currentProcessedActorPtr->objectType;
currentProcessedActorPtr->_flags = (currentProcessedActorPtr->_flags & ~AF_MASK) + lifeTempVar1; currentProcessedActorPtr->objectType = (currentProcessedActorPtr->objectType & ~AF_MASK) + lifeTempVar1;
if (g_gameId > AITD1) if (g_gameId > AITD1)
{ {
@ -1003,7 +1001,7 @@ void processLife(int lifeNum, bool callFoundLife)
} }
else else
{ {
InitAnim(anim, 4, animFlag); InitAnim(anim, ANIM_ONCE | ANIM_RESET, animFlag);
} }
break; break;
@ -1011,21 +1009,61 @@ void processLife(int lifeNum, bool callFoundLife)
case LM_ANIM_HYBRIDE_ONCE: case LM_ANIM_HYBRIDE_ONCE:
{ {
appendFormated("LM_ANIM_HYBRIDE_ONCE "); appendFormated("LM_ANIM_HYBRIDE_ONCE ");
// TODO
int anim = readNextArgument("Anim");
int body = readNextArgument("Body?");
//printf("LM_ANIM_HYBRIDE_ONCE(anim:%d, body:%d)\n", anim, body); int anim = readNextArgument("Anim");
int body = readNextArgument("Body");
if ((currentProcessedActorPtr->ANIM != anim) || (currentProcessedActorPtr->bodyNum != body)) {
currentProcessedActorPtr->ANIM = anim;
currentProcessedActorPtr->bodyNum = body;
currentProcessedActorPtr->memoTicks = timer;
currentProcessedActorPtr->frame = 0;
if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) {
char* pHybrid = HQR_Get(listHybrides, currentProcessedActorPtr->ANIM);
pHybrid += READ_LE_U32(pHybrid + 8);
pHybrid += READ_LE_U32(pHybrid + currentProcessedActorPtr->bodyNum * 4);
currentProcessedActorPtr->numOfFrames = pHybrid[1];
currentProcessedActorPtr->animInfo = -1;
currentProcessedActorPtr->animType = ANIM_ONCE;
currentProcessedActorPtr->objectType |= AF_OBJ_2D;
}
else {
currentProcessedActorPtr->numOfFrames = 0;
currentProcessedActorPtr->objectType = 0;
}
}
break; break;
} }
case LM_ANIM_HYBRIDE_REPEAT: case LM_ANIM_HYBRIDE_REPEAT:
{ {
appendFormated("LM_ANIM_HYBRIDE_REPEAT "); appendFormated("LM_ANIM_HYBRIDE_REPEAT ");
// TODO
int anim = readNextArgument("Anim");
int body = readNextArgument("Body?");
//printf("LM_ANIM_HYBRIDE_REPEAT(anim:%d, body:%d)\n", anim, body); int anim = readNextArgument("Anim");
int body = readNextArgument("Body");
if ((currentProcessedActorPtr->ANIM != anim) || (currentProcessedActorPtr->bodyNum != body)) {
currentProcessedActorPtr->ANIM = anim;
currentProcessedActorPtr->bodyNum = body;
currentProcessedActorPtr->memoTicks = timer;
currentProcessedActorPtr->frame = 0;
if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) {
char* pHybrid = HQR_Get(listHybrides, currentProcessedActorPtr->ANIM);
pHybrid += READ_LE_U32(pHybrid + 8);
pHybrid += READ_LE_U32(pHybrid + currentProcessedActorPtr->bodyNum * 4);
currentProcessedActorPtr->numOfFrames = pHybrid[1];
currentProcessedActorPtr->animInfo = -1;
currentProcessedActorPtr->animType = ANIM_REPEAT;
currentProcessedActorPtr->objectType |= AF_OBJ_2D;
}
else {
currentProcessedActorPtr->numOfFrames = 0;
currentProcessedActorPtr->objectType = 0;
}
}
break; break;
} }
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
@ -1691,7 +1729,7 @@ void processLife(int lifeNum, bool callFoundLife)
{ {
if (currentProcessedActorPtr->ANIM == lifeTempVar2) if (currentProcessedActorPtr->ANIM == lifeTempVar2)
{ {
if (currentProcessedActorPtr->FRAME == lifeTempVar3) if (currentProcessedActorPtr->frame == lifeTempVar3)
{ {
playSound(lifeTempVar1); playSound(lifeTempVar1);
//setSampleFreq(0); //setSampleFreq(0);

View File

@ -223,7 +223,7 @@ void executeFoundLife(int objIdx)
currentProcessedActorPtr->indexInWorld = objIdx; currentProcessedActorPtr->indexInWorld = objIdx;
currentProcessedActorPtr->life = -1; currentProcessedActorPtr->life = -1;
currentProcessedActorPtr->bodyNum = -1; currentProcessedActorPtr->bodyNum = -1;
currentProcessedActorPtr->_flags = 0; currentProcessedActorPtr->objectType = 0;
currentProcessedActorPtr->trackMode = -1; currentProcessedActorPtr->trackMode = -1;
currentProcessedActorPtr->room = -1; currentProcessedActorPtr->room = -1;
currentProcessedActorPtr->lifeMode = -1; currentProcessedActorPtr->lifeMode = -1;
@ -1163,6 +1163,9 @@ void LoadWorld(void)
listLife = HQR_InitRessource("LISTLIFE", 65000, 100); listLife = HQR_InitRessource("LISTLIFE", 65000, 100);
listTrack = HQR_InitRessource("LISTTRAK", 20000, 100); listTrack = HQR_InitRessource("LISTTRAK", 20000, 100);
if (g_gameId >= JACK) {
listHybrides = HQR_InitRessource("LISTHYB", 20000, 10); // TODO: recheck size for other games
}
// TODO: missing dos memory check here // TODO: missing dos memory check here
@ -1671,7 +1674,7 @@ void DeleteObjet(int index) // remove actor
CVars[getCVarsIdx(FOG_FLAG)] = 0; CVars[getCVarsIdx(FOG_FLAG)] = 0;
} }
HQ_Free_Malloc(HQ_Memory,actorPtr->FRAME); HQ_Free_Malloc(HQ_Memory,actorPtr->frame);
} }
else else
{ {
@ -1684,10 +1687,10 @@ void DeleteObjet(int index) // remove actor
objectPtr->body = actorPtr->bodyNum; objectPtr->body = actorPtr->bodyNum;
objectPtr->anim = actorPtr->ANIM; objectPtr->anim = actorPtr->ANIM;
objectPtr->frame = actorPtr->FRAME; objectPtr->frame = actorPtr->frame;
objectPtr->animType = actorPtr->animType; objectPtr->animType = actorPtr->animType;
objectPtr->animInfo = actorPtr->animInfo; objectPtr->animInfo = actorPtr->animInfo;
objectPtr->flags = actorPtr->_flags & ~AF_BOXIFY; objectPtr->flags = actorPtr->objectType & ~AF_BOXIFY;
objectPtr->flags |= AF_SPECIAL * actorPtr->dynFlags; // ugly hack, need rewrite objectPtr->flags |= AF_SPECIAL * actorPtr->dynFlags; // ugly hack, need rewrite
objectPtr->life = actorPtr->life; objectPtr->life = actorPtr->life;
objectPtr->lifeMode = actorPtr->lifeMode; objectPtr->lifeMode = actorPtr->lifeMode;
@ -2163,7 +2166,7 @@ addObject:
void updateAllActorAndObjects() void updateAllActorAndObjects()
{ {
int i; int i;
tObject *currentActor = objectTable; tObject *currentActor = objectTable.data();
tWorldObject* currentObject; tWorldObject* currentObject;
if(g_gameId > JACK) if(g_gameId > JACK)
@ -2340,30 +2343,24 @@ int checkActorInRoom(int room)
void createActorList() void createActorList()
{ {
int i;
tObject* actorPtr;
numActorInList = 0; numActorInList = 0;
actorPtr = objectTable; for(int i=0;i< objectTable.size();i++)
for(i=0;i<NUM_MAX_OBJECT;i++)
{ {
tObject* actorPtr = &objectTable[i];
if(actorPtr->indexInWorld != -1 && actorPtr->bodyNum != -1) if(actorPtr->indexInWorld != -1 && actorPtr->bodyNum != -1)
{ {
if(checkActorInRoom(actorPtr->room)) if(checkActorInRoom(actorPtr->room))
{ {
sortedActorTable[numActorInList] = i; sortedActorTable[numActorInList] = i;
if(!(actorPtr->_flags & (AF_SPECIAL & AF_ANIMATED))) if(!(actorPtr->objectType & (AF_SPECIAL & AF_ANIMATED)))
{ {
actorPtr->_flags |= AF_BOXIFY; actorPtr->objectType |= AF_BOXIFY;
// FlagRefreshAux2 = 1; // FlagRefreshAux2 = 1;
} }
numActorInList++; numActorInList++;
} }
} }
actorPtr++;
} }
} }
@ -2391,6 +2388,10 @@ void InitView()
} }
cameraBackgroundChanged = true; cameraBackgroundChanged = true;
if (g_gameId >= JACK) {
printf("Load 2d animations");
}
pCamera = cameraDataTable[NumCamera]; pCamera = cameraDataTable[NumCamera];
SetAngleCamera(pCamera->alpha,pCamera->beta,pCamera->gamma); SetAngleCamera(pCamera->alpha,pCamera->beta,pCamera->gamma);
@ -2522,7 +2523,7 @@ void removeFromBGIncrust(int actorIdx)
{ {
tObject* actorPtr = &objectTable[actorIdx]; tObject* actorPtr = &objectTable[actorIdx];
actorPtr->_flags &= ~AF_BOXIFY; actorPtr->objectType &= ~AF_BOXIFY;
// FlagRefreshAux2 = 1; // FlagRefreshAux2 = 1;
@ -2585,7 +2586,7 @@ void deleteObject(int objIdx)
// FlagGenereActiveList = 1; // FlagGenereActiveList = 1;
if(actorPtr->_flags & AF_BOXIFY) if(actorPtr->objectType & AF_BOXIFY)
{ {
removeFromBGIncrust(actorIdx); removeFromBGIncrust(actorIdx);
} }
@ -3294,43 +3295,59 @@ void mainDraw(int flagFlip)
// this is commented out to draw actors incrusted in background // this is commented out to draw actors incrusted in background
//if(actorPtr->_flags & (AF_ANIMATED + AF_DRAWABLE + AF_SPECIAL)) //if(actorPtr->_flags & (AF_ANIMATED + AF_DRAWABLE + AF_SPECIAL))
{ {
actorPtr->_flags &= ~AF_DRAWABLE; actorPtr->objectType &= ~AF_DRAWABLE;
if(actorPtr->_flags & AF_SPECIAL) if(actorPtr->objectType & AF_SPECIAL)
{ {
mainDrawSub2(currentDrawActor); mainDrawSub2(currentDrawActor);
} }
else else
{ {
char* bodyPtr = HQR_Get(listBody,actorPtr->bodyNum); if (actorPtr->objectType & AF_OBJ_2D) {
char* pHybrid = HQR_Get(listHybrides, actorPtr->ANIM);
char* pData = pHybrid + READ_LE_U32(pHybrid + 8);
pData += READ_LE_U32(pData + actorPtr->bodyNum * 4);
if(HQ_Load) char* pAnim = pData + 2;
{ pAnim += 8 * actorPtr->frame;
// initAnimInBody(actorPtr->FRAME, HQR_Get(listAnim, actorPtr->ANIM), bodyPtr); s16 numHybrid = READ_LE_U16(pAnim);
}
AffObjet(actorPtr->worldX + actorPtr->stepX, actorPtr->worldY + actorPtr->stepY, actorPtr->worldZ + actorPtr->stepZ, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, bodyPtr); //AffHyb(numHybrid, 0, 0, pHybrid);
// TODO: bounding volume
}
else
{
char* bodyPtr = HQR_Get(listBody, actorPtr->bodyNum);
if (HQ_Load)
{
// initAnimInBody(actorPtr->FRAME, HQR_Get(listAnim, actorPtr->ANIM), bodyPtr);
}
AffObjet(actorPtr->worldX + actorPtr->stepX, actorPtr->worldY + actorPtr->stepY, actorPtr->worldZ + actorPtr->stepZ, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, bodyPtr);
if(actorPtr->animActionType != 0) if (actorPtr->animActionType != 0)
{ {
if(actorPtr->hotPointID != -1) if (actorPtr->hotPointID != -1)
{ {
getHotPoint(actorPtr->hotPointID, bodyPtr, &actorPtr->hotPoint); getHotPoint(actorPtr->hotPointID, bodyPtr, &actorPtr->hotPoint);
} }
} }
///////////////////////////////////// DEBUG ///////////////////////////////////// DEBUG
#ifdef FITD_DEBUGGER #ifdef FITD_DEBUGGER
// if(debuggerVar_drawModelZv) // if(debuggerVar_drawModelZv)
{ {
if(backgroundMode == backgroundModeEnum_3D) if (backgroundMode == backgroundModeEnum_3D)
{ {
drawZv(actorPtr); drawZv(actorPtr);
} }
} }
#endif #endif
///////////////////////////////////// /////////////////////////////////////
}
} }
if(BBox3D1 < 0) if(BBox3D1 < 0)
@ -3418,8 +3435,8 @@ void walkStep(int angle1, int angle2, int angle3)
void addActorToBgInscrust(int actorIdx) void addActorToBgInscrust(int actorIdx)
{ {
objectTable[actorIdx]._flags |= AF_BOXIFY + AF_DRAWABLE; objectTable[actorIdx].objectType |= AF_BOXIFY + AF_DRAWABLE;
objectTable[actorIdx]._flags &= ~AF_ANIMATED; objectTable[actorIdx].objectType &= ~AF_ANIMATED;
//FlagRefreshAux2 = 1; //FlagRefreshAux2 = 1;
} }
@ -3464,7 +3481,7 @@ void getZvRelativePosition(ZVStruct* zvPtr, int startRoom, int destRoom)
int checkObjectCollisions(int actorIdx, ZVStruct* zvPtr) int checkObjectCollisions(int actorIdx, ZVStruct* zvPtr)
{ {
int currentCollisionSlot = 0; int currentCollisionSlot = 0;
tObject* currentActor = objectTable; tObject* currentActor = objectTable.data();
int actorRoom = objectTable[actorIdx].room; int actorRoom = objectTable[actorIdx].room;
for(int i=0;i<3;i++) for(int i=0;i<3;i++)
@ -4078,6 +4095,12 @@ void checkIfCameraChangeIsRequired(void)
if(NumCamera!=-1) if(NumCamera!=-1)
{ {
if (currentCameraTargetActor == -1)
{
// TODO: Happens at the start of AITD3, likely a bug
return;
}
tObject* actorPtr; tObject* actorPtr;
int zvx1; int zvx1;
int zvx2; int zvx2;
@ -4317,13 +4340,10 @@ int checkLineProjectionWithActors( int actorIdx, int X, int Y, int Z, int beta,
} }
else else
{ {
tObject* currentActorPtr = objectTable; for(int i=0;i<objectTable.size();i++)
int i;
for(i=0;i<NUM_MAX_OBJECT;i++)
{ {
if(currentActorPtr->indexInWorld != -1 && i != actorIdx && !(currentActorPtr->_flags & AF_SPECIAL)) tObject* currentActorPtr = &objectTable[i];
if(currentActorPtr->indexInWorld != -1 && i != actorIdx && !(currentActorPtr->objectType & AF_SPECIAL))
{ {
ZVStruct* zvPtr = &currentActorPtr->zv; ZVStruct* zvPtr = &currentActorPtr->zv;
@ -4352,8 +4372,6 @@ int checkLineProjectionWithActors( int actorIdx, int X, int Y, int Z, int beta,
foundFlag = i; foundFlag = i;
break; break;
} }
currentActorPtr++;
} }
} }
} }

View File

@ -110,7 +110,7 @@ void PlayWorld(int allowSystemMenu, int deltaTime)
} }
} }
currentProcessedActorPtr = objectTable; currentProcessedActorPtr = objectTable.data();
for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++)
{ {
@ -126,12 +126,12 @@ void PlayWorld(int allowSystemMenu, int deltaTime)
currentProcessedActorPtr++; currentProcessedActorPtr++;
} }
currentProcessedActorPtr = objectTable; currentProcessedActorPtr = objectTable.data();
for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++)
{ {
if(currentProcessedActorPtr->indexInWorld >= 0) if(currentProcessedActorPtr->indexInWorld >= 0)
{ {
int flag = currentProcessedActorPtr->_flags; int flag = currentProcessedActorPtr->objectType;
if((flag & AF_ANIMATED) || (g_gameId >= AITD2 && flag & 0x200)) if((flag & AF_ANIMATED) || (g_gameId >= AITD2 && flag & 0x200))
{ {
@ -151,7 +151,7 @@ void PlayWorld(int allowSystemMenu, int deltaTime)
currentProcessedActorPtr++; currentProcessedActorPtr++;
} }
currentProcessedActorPtr = objectTable; currentProcessedActorPtr = objectTable.data();
for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++) for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++)
{ {
if(currentProcessedActorPtr->indexInWorld >= 0) if(currentProcessedActorPtr->indexInWorld >= 0)
@ -212,14 +212,14 @@ void PlayWorld(int allowSystemMenu, int deltaTime)
NumCamera = NewNumCamera; NumCamera = NewNumCamera;
currentProcessedActorPtr = objectTable; for (currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++)
for(currentProcessedActorIdx = 0; currentProcessedActorIdx < NUM_MAX_OBJECT; currentProcessedActorIdx++)
{ {
currentProcessedActorPtr = &objectTable[currentProcessedActorIdx];
if(currentProcessedActorPtr->indexInWorld >= 0) if(currentProcessedActorPtr->indexInWorld >= 0)
{ {
if(currentProcessedActorPtr->life != -1) if(currentProcessedActorPtr->life != -1)
{ {
if(currentProcessedActorPtr->_flags & 0x200) if(currentProcessedActorPtr->objectType & 0x200)
{ {
if(currentProcessedActorPtr->lifeMode&3) if(currentProcessedActorPtr->lifeMode&3)
if(!(currentProcessedActorPtr->lifeMode&4)) if(!(currentProcessedActorPtr->lifeMode&4))

View File

@ -4,7 +4,7 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x
{ {
int i; int i;
int j; int j;
tObject* actorPtr = objectTable; tObject* actorPtr = objectTable.data();
char* bodyPtr; char* bodyPtr;
ZVStruct* zvPtr; ZVStruct* zvPtr;
@ -23,7 +23,7 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x
currentProcessedActorIdx = i; currentProcessedActorIdx = i;
actorPtr->bodyNum = body; actorPtr->bodyNum = body;
actorPtr->_flags = objectType; actorPtr->objectType = objectType;
actorPtr->stage = stage; actorPtr->stage = stage;
actorPtr->room = room; actorPtr->room = room;
actorPtr->worldX = actorPtr->roomX = x; actorPtr->worldX = actorPtr->roomX = x;
@ -44,13 +44,13 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x
actorPtr->dynFlags = 1; actorPtr->dynFlags = 1;
actorPtr->ANIM = anim; actorPtr->ANIM = anim;
actorPtr->FRAME = frame; actorPtr->frame = frame;
actorPtr->animType = animtype; actorPtr->animType = animtype;
actorPtr->animInfo = animInfo; actorPtr->animInfo = animInfo;
actorPtr->END_FRAME = 1; actorPtr->END_FRAME = 1;
actorPtr->END_ANIM = 1; actorPtr->flagEndAnim = 1;
actorPtr->newAnim = -1; actorPtr->newAnim = -1;
actorPtr->newAnimType = 0; actorPtr->newAnimType = 0;
actorPtr->newAnimInfo = -1; actorPtr->newAnimInfo = -1;
@ -105,8 +105,8 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x
SetAnimObjet(frame,animPtr,bodyPtr); SetAnimObjet(frame,animPtr,bodyPtr);
actorPtr->numOfFrames = GetNbFramesAnim(animPtr); actorPtr->numOfFrames = GetNbFramesAnim(animPtr);
actorPtr->END_ANIM = 0; actorPtr->flagEndAnim = 0;
actorPtr->_flags |= AF_ANIMATED; actorPtr->objectType |= AF_ANIMATED;
// computeScreenBox(actorPtr->field_22 + actorPtr->field_5A, actorPtr->field_24 + actorPtr->field_5C, actorPtr->anim + actorPtr->field_5E, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, bodyPtr); // computeScreenBox(actorPtr->field_22 + actorPtr->field_5A, actorPtr->field_24 + actorPtr->field_5C, actorPtr->anim + actorPtr->field_5E, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, bodyPtr);
@ -129,9 +129,9 @@ int copyObjectToActor(int body, int typeZv, int hardZvIdx, s16 objectType, int x
} }
else else
{ {
if(!(actorPtr->_flags & AF_DRAWABLE)) if(!(actorPtr->objectType & AF_DRAWABLE))
{ {
actorPtr->_flags &= ~AF_ANIMATED; // do not animate an object that is invisible actorPtr->objectType &= ~AF_ANIMATED; // do not animate an object that is invisible
} }
} }
} }

View File

@ -284,8 +284,8 @@ int loadSave(int saveNumber)
ASSERT(sizeof(objectTable[i].bodyNum) == 2); ASSERT(sizeof(objectTable[i].bodyNum) == 2);
fread(&objectTable[i].bodyNum,2,1,fHandle); fread(&objectTable[i].bodyNum,2,1,fHandle);
ASSERT(sizeof(objectTable[i]._flags) == 2); ASSERT(sizeof(objectTable[i].objectType) == 2);
fread(&objectTable[i]._flags,2,1,fHandle); fread(&objectTable[i].objectType,2,1,fHandle);
ASSERT(sizeof(objectTable[i].dynFlags) == 2); ASSERT(sizeof(objectTable[i].dynFlags) == 2);
fread(&objectTable[i].dynFlags,2,1,fHandle); fread(&objectTable[i].dynFlags,2,1,fHandle);
@ -389,8 +389,8 @@ int loadSave(int saveNumber)
ASSERT(sizeof(objectTable[i].newAnimInfo) == 2); ASSERT(sizeof(objectTable[i].newAnimInfo) == 2);
fread(&objectTable[i].newAnimInfo,2,1,fHandle); fread(&objectTable[i].newAnimInfo,2,1,fHandle);
ASSERT(sizeof(objectTable[i].FRAME) == 2); ASSERT(sizeof(objectTable[i].frame) == 2);
fread(&objectTable[i].FRAME,2,1,fHandle); fread(&objectTable[i].frame,2,1,fHandle);
ASSERT(sizeof(objectTable[i].numOfFrames) == 2); ASSERT(sizeof(objectTable[i].numOfFrames) == 2);
fread(&objectTable[i].numOfFrames,2,1,fHandle); fread(&objectTable[i].numOfFrames,2,1,fHandle);
@ -398,8 +398,8 @@ int loadSave(int saveNumber)
ASSERT(sizeof(objectTable[i].END_FRAME) == 2); ASSERT(sizeof(objectTable[i].END_FRAME) == 2);
fread(&objectTable[i].END_FRAME,2,1,fHandle); fread(&objectTable[i].END_FRAME,2,1,fHandle);
ASSERT(sizeof(objectTable[i].END_ANIM) == 2); ASSERT(sizeof(objectTable[i].flagEndAnim) == 2);
fread(&objectTable[i].END_ANIM,2,1,fHandle); fread(&objectTable[i].flagEndAnim,2,1,fHandle);
ASSERT(sizeof(objectTable[i].trackMode) == 2); ASSERT(sizeof(objectTable[i].trackMode) == 2);
fread(&objectTable[i].trackMode,2,1,fHandle); fread(&objectTable[i].trackMode,2,1,fHandle);
@ -499,7 +499,7 @@ int loadSave(int saveNumber)
if(objectTable[i].ANIM != -1) if(objectTable[i].ANIM != -1)
{ {
char* animPtr = HQR_Get(listAnim,objectTable[i].ANIM); char* animPtr = HQR_Get(listAnim,objectTable[i].ANIM);
SetAnimObjet(objectTable[i].FRAME,animPtr,bodyPtr); SetAnimObjet(objectTable[i].frame,animPtr,bodyPtr);
} }
} }
} }
@ -562,7 +562,7 @@ int makeSaveFile(int entry)
if (objectTable[i].ANIM == 4) if (objectTable[i].ANIM == 4)
{ {
CVars[getCVarsIdx(FOG_FLAG)] = 0; CVars[getCVarsIdx(FOG_FLAG)] = 0;
HQ_Free_Malloc(HQ_Memory, objectTable[i].FRAME); HQ_Free_Malloc(HQ_Memory, objectTable[i].frame);
} }
} }
} }
@ -778,8 +778,8 @@ int makeSaveFile(int entry)
ASSERT(sizeof(objectTable[i].bodyNum) == 2); ASSERT(sizeof(objectTable[i].bodyNum) == 2);
fwrite(&objectTable[i].bodyNum,2,1,fHandle); fwrite(&objectTable[i].bodyNum,2,1,fHandle);
ASSERT(sizeof(objectTable[i]._flags) == 2); ASSERT(sizeof(objectTable[i].objectType) == 2);
fwrite(&objectTable[i]._flags,2,1,fHandle); fwrite(&objectTable[i].objectType,2,1,fHandle);
ASSERT(sizeof(objectTable[i].dynFlags) == 2); ASSERT(sizeof(objectTable[i].dynFlags) == 2);
fwrite(&objectTable[i].dynFlags,2,1,fHandle); fwrite(&objectTable[i].dynFlags,2,1,fHandle);
@ -879,8 +879,8 @@ int makeSaveFile(int entry)
ASSERT(sizeof(objectTable[i].newAnimInfo) == 2); ASSERT(sizeof(objectTable[i].newAnimInfo) == 2);
fwrite(&objectTable[i].newAnimInfo,2,1,fHandle); fwrite(&objectTable[i].newAnimInfo,2,1,fHandle);
ASSERT(sizeof(objectTable[i].FRAME) == 2); ASSERT(sizeof(objectTable[i].frame) == 2);
fwrite(&objectTable[i].FRAME,2,1,fHandle); fwrite(&objectTable[i].frame,2,1,fHandle);
ASSERT(sizeof(objectTable[i].numOfFrames) == 2); ASSERT(sizeof(objectTable[i].numOfFrames) == 2);
fwrite(&objectTable[i].numOfFrames,2,1,fHandle); fwrite(&objectTable[i].numOfFrames,2,1,fHandle);
@ -888,8 +888,8 @@ int makeSaveFile(int entry)
ASSERT(sizeof(objectTable[i].END_FRAME) == 2); ASSERT(sizeof(objectTable[i].END_FRAME) == 2);
fwrite(&objectTable[i].END_FRAME,2,1,fHandle); fwrite(&objectTable[i].END_FRAME,2,1,fHandle);
ASSERT(sizeof(objectTable[i].END_ANIM) == 2); ASSERT(sizeof(objectTable[i].flagEndAnim) == 2);
fwrite(&objectTable[i].END_ANIM,2,1,fHandle); fwrite(&objectTable[i].flagEndAnim,2,1,fHandle);
ASSERT(sizeof(objectTable[i].trackMode) == 2); ASSERT(sizeof(objectTable[i].trackMode) == 2);
fwrite(&objectTable[i].trackMode,2,1,fHandle); fwrite(&objectTable[i].trackMode,2,1,fHandle);

View File

@ -537,13 +537,13 @@ void processTrack(void)
} }
case TL_DEC_OFF: // background collision off case TL_DEC_OFF: // background collision off
{ {
currentProcessedActorPtr->_flags &= ~AF_TRIGGER; currentProcessedActorPtr->objectType &= ~AF_TRIGGER;
currentProcessedActorPtr->positionInTrack++; currentProcessedActorPtr->positionInTrack++;
break; break;
} }
case TL_DEC_ON: // background collision on case TL_DEC_ON: // background collision on
{ {
currentProcessedActorPtr->_flags |= AF_TRIGGER; currentProcessedActorPtr->objectType |= AF_TRIGGER;
currentProcessedActorPtr->positionInTrack++; currentProcessedActorPtr->positionInTrack++;
break; break;
} }
@ -1013,13 +1013,13 @@ void processTrack2(void)
} }
case 0xA: case 0xA:
{ {
currentProcessedActorPtr->_flags &= 0xFFBF; currentProcessedActorPtr->objectType &= 0xFFBF;
currentProcessedActorPtr->positionInTrack++; currentProcessedActorPtr->positionInTrack++;
break; break;
} }
case 0xB: case 0xB:
{ {
currentProcessedActorPtr->_flags |= 0x40; currentProcessedActorPtr->objectType |= 0x40;
currentProcessedActorPtr->positionInTrack++; currentProcessedActorPtr->positionInTrack++;
break; break;
}/* }/*

View File

@ -78,17 +78,18 @@ char* screenSm3;
char* screenSm4; char* screenSm4;
char* screenSm5; char* screenSm5;
tObject objectTable[NUM_MAX_OBJECT]; std::array<tObject, NUM_MAX_OBJECT> objectTable;
s16 currentWorldTarget; s16 currentWorldTarget;
int fileSize; int fileSize;
hqrEntryStruct* listBody; hqrEntryStruct* listBody = nullptr;
hqrEntryStruct* listAnim; hqrEntryStruct* listAnim = nullptr;
hqrEntryStruct* listLife; hqrEntryStruct* listLife = nullptr;
hqrEntryStruct* listTrack; hqrEntryStruct* listTrack = nullptr;
hqrEntryStruct* listMatrix; hqrEntryStruct* listHybrides = nullptr;
hqrEntryStruct* listMatrix = nullptr;
s16 maxObjects; s16 maxObjects;

View File

@ -115,14 +115,18 @@ enum actorFlags
AF_FOUNDABLE = 0x0080, AF_FOUNDABLE = 0x0080,
AF_FALLABLE = 0x0100, AF_FALLABLE = 0x0100,
AF_MASK = AF_ANIMATED + AF_MOVABLE + AF_TRIGGER + AF_FOUNDABLE + AF_FALLABLE, // >= JACK
AF_OBJ_2D = 0x0200,
AF_WATER = 0x0400,
AF_MASK = AF_ANIMATED + AF_MOVABLE + AF_TRIGGER + AF_FOUNDABLE + AF_FALLABLE + AF_WATER,
}; };
struct tObject // used to read data from file too struct tObject // used to read data from file too
{ {
s16 indexInWorld; s16 indexInWorld;
s16 bodyNum; s16 bodyNum;
u16 _flags; u16 objectType;
s16 dynFlags; s16 dynFlags;
ZVStruct zv; ZVStruct zv;
s16 screenXMin; s16 screenXMin;
@ -150,10 +154,11 @@ struct tObject // used to read data from file too
s16 newAnim; s16 newAnim;
s16 newAnimType; s16 newAnimType;
s16 newAnimInfo; s16 newAnimInfo;
s16 FRAME; s16 frame;
s16 numOfFrames; s16 numOfFrames;
s16 END_FRAME; s16 END_FRAME;
s16 END_ANIM; s16 flagEndAnim;
u32 memoTicks; // for 2d objects
s16 trackMode; s16 trackMode;
s16 trackNumber; s16 trackNumber;
s16 MARK; s16 MARK;
@ -323,7 +328,7 @@ extern char* screenSm3;
extern char* screenSm4; extern char* screenSm4;
extern char* screenSm5; extern char* screenSm5;
extern tObject objectTable[NUM_MAX_OBJECT]; extern std::array<tObject, NUM_MAX_OBJECT> objectTable;
extern s16 currentWorldTarget; extern s16 currentWorldTarget;
@ -333,6 +338,7 @@ extern hqrEntryStruct* listBody;
extern hqrEntryStruct* listAnim; extern hqrEntryStruct* listAnim;
extern hqrEntryStruct* listLife; extern hqrEntryStruct* listLife;
extern hqrEntryStruct* listTrack; extern hqrEntryStruct* listTrack;
extern hqrEntryStruct* listHybrides;
extern hqrEntryStruct* listMatrix; extern hqrEntryStruct* listMatrix;
extern s16 maxObjects; extern s16 maxObjects;