FITD/FitdLib/sprite.cpp

46 lines
1.5 KiB
C++

#include "common.h"
#include "sprite.h"
void sHybrid_Sprite::read(uint8_t* buffer, int bufferSize) {
flags = READ_LE_U16(buffer); buffer+=2;
dx = READ_LE_U8(buffer); buffer++;
dy = READ_LE_U8(buffer); buffer++;
lines.reserve(dy);
for (int i = 0; i < dy; i++) {
auto& line = lines.emplace_back();
int numBlocks = READ_LE_U8(buffer); buffer++;
line.blocks.reserve(numBlocks);
for (int j = 0; j < numBlocks; j++) {
auto& block = line.blocks.emplace_back();
block.unk0 = READ_LE_U8(buffer); buffer++;
block.numWords = READ_LE_U8(buffer); buffer++;
block.numBytes = READ_LE_U8(buffer); buffer++;
int dataSize = block.numWords * 4 + block.numBytes;
block.data.resize(dataSize);
for (int k = 0; k < dataSize; k++) {
block.data[k] = READ_LE_U8(buffer); buffer++;
}
}
line.unk = READ_LE_U8(buffer); buffer++;
}
}
void AffSpr(int spriteNumber, int X, int Y, char* screen, std::vector<sHybrid_Sprite>& sprites) {
sHybrid_Sprite& sprite = sprites[spriteNumber];
Y -= sprite.dy;
for (int y = 0; y < sprite.dy; y++) {
auto& lineData = sprite.lines[y];
char* lineStart = screen + ((y + Y) * 320 + X);
for (int i = 0; i < lineData.blocks.size(); i++) {
auto& block = lineData.blocks[i];
lineStart += block.unk0;
memcpy(lineStart, block.data.data(), block.data.size());
lineStart += block.data.size();
}
}
}