Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-1-2-2013-Decompilation
Path: blob/main/RSDKv4/Animation.cpp
817 views
1
#include "RetroEngine.hpp"
2
3
AnimationFile animationFileList[ANIFILE_COUNT];
4
int animationFileCount = 0;
5
6
SpriteFrame scriptFrames[SPRITEFRAME_COUNT];
7
int scriptFrameCount = 0;
8
9
SpriteFrame animFrames[SPRITEFRAME_COUNT];
10
int animFrameCount = 0;
11
SpriteAnimation animationList[ANIMATION_COUNT];
12
int animationCount = 0;
13
Hitbox hitboxList[HITBOX_COUNT];
14
int hitboxCount = 0;
15
16
void LoadAnimationFile(char *filePath)
17
{
18
FileInfo info;
19
if (LoadFile(filePath, &info)) {
20
byte fileBuffer = 0;
21
char strBuf[0x21];
22
byte sheetIDs[0x18];
23
sheetIDs[0] = 0;
24
25
byte sheetCount = 0;
26
FileRead(&sheetCount, 1);
27
28
for (int s = 0; s < sheetCount; ++s) {
29
FileRead(&fileBuffer, 1);
30
if (fileBuffer) {
31
int i = 0;
32
for (; i < fileBuffer; ++i) FileRead(&strBuf[i], 1);
33
strBuf[i] = 0;
34
GetFileInfo(&info);
35
CloseFile();
36
sheetIDs[s] = AddGraphicsFile(strBuf);
37
SetFileInfo(&info);
38
}
39
}
40
41
byte animCount = 0;
42
FileRead(&animCount, 1);
43
AnimationFile *animFile = &animationFileList[animationFileCount];
44
animFile->animCount = animCount;
45
animFile->aniListOffset = animationCount;
46
47
for (int a = 0; a < animCount; ++a) {
48
SpriteAnimation *anim = &animationList[animationCount++];
49
anim->frameListOffset = animFrameCount;
50
FileRead(&fileBuffer, 1);
51
FileRead(anim->name, fileBuffer);
52
anim->name[fileBuffer] = 0;
53
FileRead(&anim->frameCount, 1);
54
FileRead(&anim->speed, 1);
55
FileRead(&anim->loopPoint, 1);
56
FileRead(&anim->rotationStyle, 1);
57
58
for (int j = 0; j < anim->frameCount; ++j) {
59
SpriteFrame *frame = &animFrames[animFrameCount++];
60
FileRead(&frame->sheetID, 1);
61
frame->sheetID = sheetIDs[frame->sheetID];
62
FileRead(&frame->hitboxID, 1);
63
FileRead(&fileBuffer, 1);
64
frame->sprX = fileBuffer;
65
FileRead(&fileBuffer, 1);
66
frame->sprY = fileBuffer;
67
FileRead(&fileBuffer, 1);
68
frame->width = fileBuffer;
69
FileRead(&fileBuffer, 1);
70
frame->height = fileBuffer;
71
72
sbyte buffer = 0;
73
FileRead(&buffer, 1);
74
frame->pivotX = buffer;
75
FileRead(&buffer, 1);
76
frame->pivotY = buffer;
77
}
78
79
// 90 Degree (Extra rotation Frames) rotation
80
if (anim->rotationStyle == ROTSTYLE_STATICFRAMES)
81
anim->frameCount >>= 1;
82
}
83
84
animFile->hitboxListOffset = hitboxCount;
85
FileRead(&fileBuffer, 1);
86
for (int i = 0; i < fileBuffer; ++i) {
87
Hitbox *hitbox = &hitboxList[hitboxCount++];
88
for (int d = 0; d < HITBOX_DIR_COUNT; ++d) {
89
FileRead(&hitbox->left[d], 1);
90
FileRead(&hitbox->top[d], 1);
91
FileRead(&hitbox->right[d], 1);
92
FileRead(&hitbox->bottom[d], 1);
93
}
94
}
95
96
CloseFile();
97
}
98
}
99
void ClearAnimationData()
100
{
101
for (int f = 0; f < SPRITEFRAME_COUNT; ++f) MEM_ZERO(scriptFrames[f]);
102
for (int f = 0; f < SPRITEFRAME_COUNT; ++f) MEM_ZERO(animFrames[f]);
103
for (int h = 0; h < HITBOX_COUNT; ++h) MEM_ZERO(hitboxList[h]);
104
for (int a = 0; a < ANIMATION_COUNT; ++a) MEM_ZERO(animationList[a]);
105
for (int a = 0; a < ANIFILE_COUNT; ++a) MEM_ZERO(animationFileList[a]);
106
107
scriptFrameCount = 0;
108
animFrameCount = 0;
109
animationCount = 0;
110
animationFileCount = 0;
111
hitboxCount = 0;
112
}
113
114
AnimationFile *AddAnimationFile(char *filePath)
115
{
116
char path[0x80];
117
StrCopy(path, "Data/Animations/");
118
StrAdd(path, filePath);
119
120
for (int a = 0; a < ANIFILE_COUNT; ++a) {
121
if (StrLength(animationFileList[a].fileName) <= 0) {
122
StrCopy(animationFileList[a].fileName, filePath);
123
LoadAnimationFile(path);
124
++animationFileCount;
125
return &animationFileList[a];
126
}
127
if (StrComp(animationFileList[a].fileName, filePath))
128
return &animationFileList[a];
129
}
130
return NULL;
131
}
132
133
void ProcessObjectAnimation(void *objScr, void *ent)
134
{
135
ObjectScript *objectScript = (ObjectScript *)objScr;
136
Entity *entity = (Entity *)ent;
137
SpriteAnimation *sprAnim = &animationList[objectScript->animFile->aniListOffset + entity->animation];
138
139
if (entity->animationSpeed <= 0) {
140
entity->animationTimer += sprAnim->speed;
141
}
142
else {
143
if (entity->animationSpeed > 0xF0)
144
entity->animationSpeed = 0xF0;
145
entity->animationTimer += entity->animationSpeed;
146
}
147
148
if (entity->animation != entity->prevAnimation) {
149
entity->prevAnimation = entity->animation;
150
entity->frame = 0;
151
entity->animationTimer = 0;
152
entity->animationSpeed = 0;
153
}
154
155
if (entity->animationTimer >= 0xF0) {
156
entity->animationTimer -= 0xF0;
157
++entity->frame;
158
}
159
160
if (entity->frame >= sprAnim->frameCount)
161
entity->frame = sprAnim->loopPoint;
162
}
163