Skip to content

Commit 8eea2f4

Browse files
committed
2d animations
1 parent df1271d commit 8eea2f4

16 files changed

Lines changed: 361 additions & 133 deletions

FitdLib/actorList.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,5 +134,5 @@ int sortCompareFunction(const void* param1, const void* param2)
134134

135135
void sortActorList()
136136
{
137-
qsort(sortedActorTable.data(), numActorInList, sizeof(int), sortCompareFunction);
137+
qsort(Index.data(), NbAffObjets, sizeof(int), sortCompareFunction);
138138
}

FitdLib/aitdBox.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "common.h"
22

3-
void afficheSprite(int left, int top, int index, char* gfxData)
3+
void AffSpf(int left, int top, int index, char* gfxData)
44
{
55
char* outPtr;
66
char* inPtr;
@@ -17,13 +17,13 @@ void afficheSprite(int left, int top, int index, char* gfxData)
1717
return;
1818

1919
outPtr = logicalScreen + top*320 + left;
20-
inPtr = gfxData + READ_LE_U16(index * 2 + gfxData); // alignement unsafe
20+
inPtr = gfxData + READ_LE_U16(index * 2 + gfxData);
2121

2222
inPtr +=4;
2323

24-
width = READ_LE_U16(inPtr); // alignement unsafe
24+
width = READ_LE_U16(inPtr);
2525
inPtr+=2;
26-
height = READ_LE_U16(inPtr); // alignement unsafe
26+
height = READ_LE_U16(inPtr);
2727
inPtr+=2;
2828

2929
offset = 320 - width;
@@ -113,7 +113,7 @@ void AffBigCadre(int x, int y, int width, int height)
113113
right = x + halfWidth;
114114
bottom = y + halfHeight;
115115

116-
afficheSprite(currentLeftPosition,currentTopPosition,0,PtrCadre); // draw top left corner
116+
AffSpf(currentLeftPosition,currentTopPosition,0,PtrCadre); // draw top left corner
117117

118118
while(1) // draw top bar
119119
{
@@ -122,10 +122,10 @@ void AffBigCadre(int x, int y, int width, int height)
122122
if(right - 20 <= currentLeftPosition)
123123
break;
124124

125-
afficheSprite(currentLeftPosition,currentTopPosition,4,PtrCadre);
125+
AffSpf(currentLeftPosition,currentTopPosition,4,PtrCadre);
126126
}
127127

128-
afficheSprite(currentLeftPosition,currentTopPosition,1,PtrCadre); // draw top right corner
128+
AffSpf(currentLeftPosition,currentTopPosition,1,PtrCadre); // draw top right corner
129129

130130
currentLeftPosition = left;
131131

@@ -136,22 +136,22 @@ void AffBigCadre(int x, int y, int width, int height)
136136
if(bottom - 20 <= currentTopPosition)
137137
break;
138138

139-
afficheSprite(currentLeftPosition,currentTopPosition,6,PtrCadre);
139+
AffSpf(currentLeftPosition,currentTopPosition,6,PtrCadre);
140140
}
141141

142142
currentLeftPosition = right - 8;
143143
currentTopPosition = top + 20;
144144

145145
while(bottom - 20 > currentTopPosition)
146146
{
147-
afficheSprite(currentLeftPosition,currentTopPosition,7,PtrCadre);
147+
AffSpf(currentLeftPosition,currentTopPosition,7,PtrCadre);
148148

149149
currentTopPosition += 20;
150150
}
151151

152152
currentLeftPosition = left;
153153

154-
afficheSprite(currentLeftPosition,currentTopPosition,2,PtrCadre); // draw bottom left corner
154+
AffSpf(currentLeftPosition,currentTopPosition,2,PtrCadre); // draw bottom left corner
155155

156156
while(1) // draw bottom bar
157157
{
@@ -160,12 +160,12 @@ void AffBigCadre(int x, int y, int width, int height)
160160
if(right-20 <= currentLeftPosition)
161161
break;
162162

163-
afficheSprite(currentLeftPosition,currentTopPosition+12,5,PtrCadre);
163+
AffSpf(currentLeftPosition,currentTopPosition+12,5,PtrCadre);
164164
}
165165

166-
afficheSprite(currentLeftPosition,currentTopPosition,3,PtrCadre); // draw bottom right corner
166+
AffSpf(currentLeftPosition,currentTopPosition,3,PtrCadre); // draw bottom right corner
167167

168-
afficheSprite(x-20,currentTopPosition+12,8,PtrCadre); // draw "in the dark"
168+
AffSpf(x-20,currentTopPosition+12,8,PtrCadre); // draw "in the dark"
169169

170170
WindowX1 = left + 8;
171171
WindowY1 = top + 8;

FitdLib/anim2d.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include "common.h"
2+
#include "anim2d.h"
3+
#include "hybrid.h"
4+
5+
std::array<sAnim2d, 20> TabAnim2d;
6+
int NbAnim2D = 0;
7+
8+
sHybrid* PtrAnim2D = nullptr;
9+
void load2dAnims(int cameraIdx) {
10+
char name[16];
11+
12+
sprintf(name, "ANIM%02d", g_currentFloor);
13+
14+
if (PtrAnim2D)
15+
{
16+
delete PtrAnim2D;
17+
PtrAnim2D = nullptr;
18+
}
19+
20+
unsigned char* rawAnim2D = (unsigned char*)loadPak(name, cameraIdx);
21+
PtrAnim2D = new sHybrid(rawAnim2D, getPakSize(name, cameraIdx));
22+
free(rawAnim2D);
23+
}
24+
25+
void handleAnim2d() {
26+
27+
std::array<int, NUM_MAX_OBJECT> Index2 = Index;
28+
29+
for (int i = 0; i < currentCameraZoneList[NumCamera]->hybrids.size(); i++) {
30+
auto& anim = TabAnim2d[i];
31+
if (timer - anim.time >= anim.pAnim->flag) {
32+
anim.frame++;
33+
if (anim.frame == anim.pAnimation->anims.size()) {
34+
anim.frame = 0;
35+
anim.pAnim = anim.pAnimation->anims.begin();
36+
}
37+
else {
38+
anim.pAnim++;
39+
}
40+
anim.time = timer;
41+
}
42+
43+
int j;
44+
for (j = NbAffObjets + i - 1; j >= 0; j--) {
45+
if (!(Index2[j] & 0x8000)) {
46+
//TODO: test rects
47+
}
48+
}
49+
50+
std::memmove(&Index2[j + 2], &Index2[j + 1], (NbAffObjets + i - j - 1) * sizeof(Index2[0]));
51+
Index2[j + 1] = 0x8000 + i;
52+
}
53+
54+
Index = Index2;
55+
}
56+
57+
void resetAnim2D() {
58+
NbAnim2D = 0;
59+
}
60+
61+
void startAnim2d(int index) {
62+
auto& anim = PtrAnim2D->animations[index];
63+
64+
TabAnim2d[NbAnim2D].pAnimation = &anim;
65+
TabAnim2d[NbAnim2D].pAnim = anim.anims.begin();
66+
TabAnim2d[NbAnim2D].frame = 0;
67+
TabAnim2d[NbAnim2D].time = timer;
68+
NbAnim2D++;
69+
}

FitdLib/anim2d.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#pragma once
2+
3+
#include "hybrid.h"
4+
5+
struct sAnim2d {
6+
uint16_t frame;
7+
uint32_t time;
8+
uint16_t flagEndInterAnim;
9+
std::vector<sHybrid_Anim>::iterator pAnim;
10+
sHybrid_Animation* pAnimation;
11+
int16_t ScreenXMin;
12+
int16_t ScreenYMin;
13+
int16_t ScreenXMax;
14+
int16_t ScreenYMax;
15+
};
16+
17+
extern std::array<sAnim2d, 20> TabAnim2d;
18+
extern int NbAnim2D;
19+
extern sHybrid* PtrAnim2D;
20+
21+
void resetAnim2D();
22+
void load2dAnims(int cameraIdx);
23+
void startAnim2d(int index);
24+
void handleAnim2d();

FitdLib/floor.cpp

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -280,12 +280,10 @@ void LoadEtage(int floorNumber)
280280
pMaskData = backupDataPtr + g_currentFloorCameraData[i].viewedRoomTable[k].offsetToMask;
281281

282282
// for this camera, how many masks zone
283-
pCurrentCameraViewedRoom->numMask = READ_LE_U16(pMaskData);
284-
pMaskData+=2;
283+
int numMasks = READ_LE_U16(pMaskData); pMaskData+=2;
284+
pCurrentCameraViewedRoom->masks.reserve(numMasks);
285285

286-
pCurrentCameraViewedRoom->masks.reserve(pCurrentCameraViewedRoom->numMask);
287-
288-
for(int k=0; k<pCurrentCameraViewedRoom->numMask; k++)
286+
for(int k=0; k< numMasks; k++)
289287
{
290288
cameraMaskStruct* pCurrentCameraMask = &pCurrentCameraViewedRoom->masks.emplace_back();
291289

@@ -310,23 +308,17 @@ void LoadEtage(int floorNumber)
310308

311309
// load camera cover
312310
{
313-
unsigned char* pZoneData;
314-
int numZones;
315-
int j;
316-
317-
pZoneData = backupDataPtr + g_currentFloorCameraData[i].viewedRoomTable[k].offsetToCover;
311+
unsigned char* pZoneData = backupDataPtr + g_currentFloorCameraData[i].viewedRoomTable[k].offsetToCover;
318312
if(pMaskData)
319313
{
320314
assert(pZoneData == pMaskData);
321315
}
322316
//pZoneData = currentCameraData;
323317

324-
pCurrentCameraViewedRoom->numCoverZones = numZones =READ_LE_U16(pZoneData);
325-
pZoneData+=2;
326-
327-
pCurrentCameraViewedRoom->coverZones.resize(numZones);
318+
int numCoverZones = READ_LE_U16(pZoneData); pZoneData += 2;
319+
pCurrentCameraViewedRoom->coverZones.resize(numCoverZones);
328320

329-
for(j=0;j<pCurrentCameraViewedRoom->numCoverZones;j++)
321+
for(int j=0;j< numCoverZones;j++)
330322
{
331323
int pointIdx;
332324
int numPoints;
@@ -349,6 +341,29 @@ void LoadEtage(int floorNumber)
349341
}
350342
}
351343

344+
// load hybrids
345+
if(pCurrentCameraViewedRoom->offsetToHybrids)
346+
{
347+
unsigned char* pHybridData = backupDataPtr + pCurrentCameraViewedRoom->offsetToHybrids;
348+
int numHybrids = READ_LE_U16(pHybridData); pHybridData += 2;
349+
pCurrentCameraViewedRoom->hybrids.reserve(numHybrids);
350+
for (int i = 0; i < numHybrids; i++) {
351+
auto& hybrid = pCurrentCameraViewedRoom->hybrids.emplace_back();
352+
int numRect = READ_LE_U16(pHybridData); pHybridData += 2;
353+
hybrid.rects.reserve(numRect);
354+
for (int j = 0; j < numRect; j++) {
355+
auto& rect = hybrid.rects.emplace_back();
356+
rect.zoneX1 = READ_LE_S16(pHybridData); pHybridData += 2;
357+
rect.zoneZ1 = READ_LE_S16(pHybridData); pHybridData += 2;
358+
rect.zoneX2 = READ_LE_S16(pHybridData); pHybridData += 2;
359+
rect.zoneZ2 = READ_LE_S16(pHybridData); pHybridData += 2;
360+
}
361+
}
362+
if (pCurrentCameraViewedRoom->offsetCamOptims) {
363+
assert(backupDataPtr + pCurrentCameraViewedRoom->offsetCamOptims == pHybridData);
364+
}
365+
}
366+
352367
if(g_gameId == AITD1)
353368
currentCameraData+=0x0C;
354369
else

FitdLib/hybrid.cpp

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ sHybrid::sHybrid(uint8_t* buffer, int size) {
2121
case 0: // Entities
2222
readEntites(buffer + startOffset, blockSize);
2323
break;
24+
case 1: // Sprites
25+
readSprites(buffer + startOffset, blockSize);
26+
break;
2427
case 2: // Animation
2528
readAnimations(buffer + startOffset, blockSize);
2629
break;
@@ -31,6 +34,22 @@ sHybrid::sHybrid(uint8_t* buffer, int size) {
3134
}
3235
}
3336

37+
void sHybrid::readSprites(uint8_t* buffer, int size) {
38+
int count = (READ_LE_U32(buffer) - 2) / 4;
39+
sprites.reserve(count);
40+
for (int i = 0; i < count; i++) {
41+
uint8_t* data = buffer + READ_LE_U32(buffer + i * 4) - 2;
42+
uint32_t spriteSize;
43+
if (i < count - 1) {
44+
spriteSize = (READ_LE_U32(buffer + (i + 1) * 4) - 2) - (READ_LE_U32(buffer + i * 4) - 2);
45+
}
46+
else {
47+
spriteSize = size - (READ_LE_U32(buffer + i * 4) - 2);
48+
}
49+
sprites.emplace_back().read(data, spriteSize);
50+
}
51+
}
52+
3453
void sHybrid::readEntites(uint8_t* buffer, int size) {
3554
int count = READ_LE_U32(buffer) / 4;
3655
entities.reserve(count);
@@ -62,15 +81,15 @@ void sHybrid::readEntites(uint8_t* buffer, int size) {
6281

6382
void sHybrid::readAnimations(uint8_t* buffer, int size) {
6483
int count = READ_LE_U32(buffer) / 4;
65-
anims.reserve(count);
84+
animations.reserve(count);
6685
for (int i = 0; i < count; i++) {
6786
uint8_t* animStart = buffer + READ_LE_U32(buffer + i * 4);
68-
auto& anim = anims.emplace_back();
87+
auto& anim = animations.emplace_back();
6988
anim.flag = READ_LE_U8(animStart); animStart++;
7089
anim.count = READ_LE_U8(animStart); animStart++;
71-
anim.animations.reserve(anim.count);
90+
anim.anims.reserve(anim.count);
7291
for (int j = 0; j < anim.count; j++) {
73-
auto& animation = anim.animations.emplace_back();
92+
auto& animation = anim.anims.emplace_back();
7493
animation.id = READ_LE_U16(animStart); animStart += 2;
7594
animation.flag = READ_LE_U16(animStart); animStart += 2;
7695
animation.deltaX = READ_LE_S16(animStart); animStart += 2;
@@ -84,7 +103,14 @@ void AffHyb(int index, int X, int Y, sHybrid* pHybrid) {
84103
for (int i = 0; i < entity.parts.size(); i++) {
85104
auto& part = entity.parts[i];
86105
switch (part.id) {
87-
case 6:
106+
case 1: // sprite
107+
{
108+
int spriteNumber = part.cout + (((int)part.cin) << 8);
109+
// TODO: dx/dy
110+
AffSpr(spriteNumber, part.XY[0][0] + X, part.XY[0][1] + Y + 1, logicalScreen, pHybrid->sprites);
111+
break;
112+
}
113+
case 6: // line
88114
for (int i = 0; i < part.XY.size()-1; i++) {
89115
osystem_draw3dLine(part.XY[i][0], part.XY[i][1], 0, part.XY[i+1][0], part.XY[i+1][1], 0, part.cin);
90116
}

FitdLib/hybrid.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22

3+
#include "sprite.h"
4+
35
struct sHybrid_EntityPart {
46
uint8_t id;
57
uint8_t nbpt;
@@ -14,27 +16,29 @@ struct sHybrid_Entity {
1416
std::vector<sHybrid_EntityPart> parts;
1517
};
1618

17-
struct sHybrid_Animation {
19+
struct sHybrid_Anim {
1820
uint16_t id;
1921
uint16_t flag;
2022
int16_t deltaX;
2123
int16_t deltaY;
2224
};
2325

24-
struct sHybrid_Anim {
26+
struct sHybrid_Animation {
2527
uint8_t flag;
2628
uint8_t count;
27-
std::vector<sHybrid_Animation> animations;
29+
std::vector<sHybrid_Anim> anims;
2830
};
2931

3032
struct sHybrid {
3133
sHybrid(uint8_t* buffer, int size);
3234

3335
std::vector<sHybrid_Entity> entities;
34-
std::vector<sHybrid_Anim> anims;
36+
std::vector<sHybrid_Sprite> sprites;
37+
std::vector<sHybrid_Animation> animations;
3538

3639
private:
3740
void readEntites(uint8_t* buffer, int size);
41+
void readSprites(uint8_t* buffer, int size);
3842
void readAnimations(uint8_t* buffer, int size);
3943
};
4044

FitdLib/life.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,7 @@ void processLife(int lifeNum, bool callFoundLife)
10061006

10071007
if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) {
10081008
sHybrid* pHybrid = HQR_Get(HQ_Hybrides, currentProcessedActorPtr->ANIM);
1009-
currentProcessedActorPtr->numOfFrames = pHybrid->anims[currentProcessedActorPtr->bodyNum].count;
1009+
currentProcessedActorPtr->numOfFrames = pHybrid->animations[currentProcessedActorPtr->bodyNum].count;
10101010
currentProcessedActorPtr->animInfo = -1;
10111011
currentProcessedActorPtr->animType = ANIM_ONCE;
10121012
currentProcessedActorPtr->objectType |= AF_OBJ_2D;
@@ -1033,7 +1033,7 @@ void processLife(int lifeNum, bool callFoundLife)
10331033

10341034
if ((currentProcessedActorPtr->ANIM != -1) && (currentProcessedActorPtr->bodyNum != -1)) {
10351035
sHybrid* pHybrid = HQR_Get(HQ_Hybrides, currentProcessedActorPtr->ANIM);
1036-
currentProcessedActorPtr->numOfFrames = pHybrid->anims[currentProcessedActorPtr->bodyNum].count;
1036+
currentProcessedActorPtr->numOfFrames = pHybrid->animations[currentProcessedActorPtr->bodyNum].count;
10371037
currentProcessedActorPtr->animInfo = -1;
10381038
currentProcessedActorPtr->animType = ANIM_REPEAT;
10391039
currentProcessedActorPtr->objectType |= AF_OBJ_2D;

0 commit comments

Comments
 (0)