Path: blob/main/RSDKv4/Animation.cpp
817 views
#include "RetroEngine.hpp"12AnimationFile animationFileList[ANIFILE_COUNT];3int animationFileCount = 0;45SpriteFrame scriptFrames[SPRITEFRAME_COUNT];6int scriptFrameCount = 0;78SpriteFrame animFrames[SPRITEFRAME_COUNT];9int animFrameCount = 0;10SpriteAnimation animationList[ANIMATION_COUNT];11int animationCount = 0;12Hitbox hitboxList[HITBOX_COUNT];13int hitboxCount = 0;1415void LoadAnimationFile(char *filePath)16{17FileInfo info;18if (LoadFile(filePath, &info)) {19byte fileBuffer = 0;20char strBuf[0x21];21byte sheetIDs[0x18];22sheetIDs[0] = 0;2324byte sheetCount = 0;25FileRead(&sheetCount, 1);2627for (int s = 0; s < sheetCount; ++s) {28FileRead(&fileBuffer, 1);29if (fileBuffer) {30int i = 0;31for (; i < fileBuffer; ++i) FileRead(&strBuf[i], 1);32strBuf[i] = 0;33GetFileInfo(&info);34CloseFile();35sheetIDs[s] = AddGraphicsFile(strBuf);36SetFileInfo(&info);37}38}3940byte animCount = 0;41FileRead(&animCount, 1);42AnimationFile *animFile = &animationFileList[animationFileCount];43animFile->animCount = animCount;44animFile->aniListOffset = animationCount;4546for (int a = 0; a < animCount; ++a) {47SpriteAnimation *anim = &animationList[animationCount++];48anim->frameListOffset = animFrameCount;49FileRead(&fileBuffer, 1);50FileRead(anim->name, fileBuffer);51anim->name[fileBuffer] = 0;52FileRead(&anim->frameCount, 1);53FileRead(&anim->speed, 1);54FileRead(&anim->loopPoint, 1);55FileRead(&anim->rotationStyle, 1);5657for (int j = 0; j < anim->frameCount; ++j) {58SpriteFrame *frame = &animFrames[animFrameCount++];59FileRead(&frame->sheetID, 1);60frame->sheetID = sheetIDs[frame->sheetID];61FileRead(&frame->hitboxID, 1);62FileRead(&fileBuffer, 1);63frame->sprX = fileBuffer;64FileRead(&fileBuffer, 1);65frame->sprY = fileBuffer;66FileRead(&fileBuffer, 1);67frame->width = fileBuffer;68FileRead(&fileBuffer, 1);69frame->height = fileBuffer;7071sbyte buffer = 0;72FileRead(&buffer, 1);73frame->pivotX = buffer;74FileRead(&buffer, 1);75frame->pivotY = buffer;76}7778// 90 Degree (Extra rotation Frames) rotation79if (anim->rotationStyle == ROTSTYLE_STATICFRAMES)80anim->frameCount >>= 1;81}8283animFile->hitboxListOffset = hitboxCount;84FileRead(&fileBuffer, 1);85for (int i = 0; i < fileBuffer; ++i) {86Hitbox *hitbox = &hitboxList[hitboxCount++];87for (int d = 0; d < HITBOX_DIR_COUNT; ++d) {88FileRead(&hitbox->left[d], 1);89FileRead(&hitbox->top[d], 1);90FileRead(&hitbox->right[d], 1);91FileRead(&hitbox->bottom[d], 1);92}93}9495CloseFile();96}97}98void ClearAnimationData()99{100for (int f = 0; f < SPRITEFRAME_COUNT; ++f) MEM_ZERO(scriptFrames[f]);101for (int f = 0; f < SPRITEFRAME_COUNT; ++f) MEM_ZERO(animFrames[f]);102for (int h = 0; h < HITBOX_COUNT; ++h) MEM_ZERO(hitboxList[h]);103for (int a = 0; a < ANIMATION_COUNT; ++a) MEM_ZERO(animationList[a]);104for (int a = 0; a < ANIFILE_COUNT; ++a) MEM_ZERO(animationFileList[a]);105106scriptFrameCount = 0;107animFrameCount = 0;108animationCount = 0;109animationFileCount = 0;110hitboxCount = 0;111}112113AnimationFile *AddAnimationFile(char *filePath)114{115char path[0x80];116StrCopy(path, "Data/Animations/");117StrAdd(path, filePath);118119for (int a = 0; a < ANIFILE_COUNT; ++a) {120if (StrLength(animationFileList[a].fileName) <= 0) {121StrCopy(animationFileList[a].fileName, filePath);122LoadAnimationFile(path);123++animationFileCount;124return &animationFileList[a];125}126if (StrComp(animationFileList[a].fileName, filePath))127return &animationFileList[a];128}129return NULL;130}131132void ProcessObjectAnimation(void *objScr, void *ent)133{134ObjectScript *objectScript = (ObjectScript *)objScr;135Entity *entity = (Entity *)ent;136SpriteAnimation *sprAnim = &animationList[objectScript->animFile->aniListOffset + entity->animation];137138if (entity->animationSpeed <= 0) {139entity->animationTimer += sprAnim->speed;140}141else {142if (entity->animationSpeed > 0xF0)143entity->animationSpeed = 0xF0;144entity->animationTimer += entity->animationSpeed;145}146147if (entity->animation != entity->prevAnimation) {148entity->prevAnimation = entity->animation;149entity->frame = 0;150entity->animationTimer = 0;151entity->animationSpeed = 0;152}153154if (entity->animationTimer >= 0xF0) {155entity->animationTimer -= 0xF0;156++entity->frame;157}158159if (entity->frame >= sprAnim->frameCount)160entity->frame = sprAnim->loopPoint;161}162163