#include <stdio.h>
#include "sdljump.h"
#include "sprite.h"
#include "tools.h"
extern SDL_Surface * screen;
extern L_gblOptions gblOps;
L_spriteDataRot* loadSpriteDataRot(char* filename, int sides)
{
FILE *tfile;
L_spriteDataRot* sprite = NULL;
char fname[MAX_CHAR];
int i;
if ((tfile = fopen(filename,"r"))==NULL) {
return NULL;
}
if ((sprite = malloc(sizeof(L_spriteDataRot)))==NULL) {
return NULL;
}
sprite->nFrames = getValue_int(tfile,"frames");
sprite->sides = sides;
sprite->pic=NULL;
sprite->time=NULL;
sprite->pic = (JPB_surfaceRot**)calloc((sprite->nFrames * sprite->sides), sizeof(JPB_surfaceRot*));
sprite->time = malloc(sprite->nFrames * sizeof(float));
for (i=0; i < sprite->nFrames; i++)
{
getValue_str(tfile,"pic",fname,TRUE);
sprite->pic[i+ (RIGHT*sprite->nFrames)] = JPB_LoadImgRot (fname, 1, 1, 0);
if (sides > 1)
sprite->pic[i+ (LEFT*sprite->nFrames)] = JPB_LoadImgRot (fname, 1, 1, 1);
sprite->time[i] = getValue_float(tfile,"time");
}
fclose(tfile);
return sprite;
}
L_spriteData* loadSpriteData(char* filename, int sides)
{
FILE *tfile;
L_spriteData* sprite = NULL;
char fname[MAX_CHAR];
int i;
printf("\n - Loading sprite file (%s)..",filename);
if ((tfile = fopen(filename,"r"))==NULL) {
return NULL;
}
if ((sprite = malloc(sizeof(L_spriteData)))==NULL) {
return NULL;
}
sprite->nFrames = getValue_int(tfile,"frames");
sprite->sides = sides;
sprite->pic = malloc(sprite->nFrames * sprite->sides * sizeof(JPB_surface*));
sprite->time = malloc(sprite->nFrames * sizeof(float));
for (i=0; i < sprite->nFrames; i++) {
getValue_str(tfile,"pic",fname,TRUE);
sprite->pic[i+RIGHT*sprite->nFrames] = JPB_LoadImg(fname, 0, 1, 0);
if (sprite->sides > 1)
sprite->pic[i+LEFT*sprite->nFrames] = JPB_LoadImg (fname, 0, 1, 1);
sprite->time[i] = getValue_float(tfile,"time");
}
fclose(tfile);
return sprite;
}
int animateSprite(L_spriteCtl *sprite, float dt)
{
sprite->elpTime += dt;
if (sprite->elpTime >= sprite->sdata->time[sprite->frame]) {
sprite->elpTime -= sprite->sdata->time[sprite->frame];
sprite->frame += 1;
if (sprite->frame >= sprite->sdata->nFrames) {
sprite->frame = 0;
return TRUE;
}
}
return FALSE;
}
int animateSpriteRot(L_spriteCtlRot *sprite, float dt)
{
sprite->elpTime += dt;
if (sprite->elpTime >= sprite->sdata->time[sprite->frame]) {
sprite->elpTime -= sprite->sdata->time[sprite->frame];
sprite->frame += 1;
if (sprite->frame >= sprite->sdata->nFrames) {
sprite->frame = 0;
return TRUE;
}
}
return FALSE;
}
void printSprite(L_spriteCtl *sprite, SDL_Rect *src_r, SDL_Rect *dest_r, int side)
{
JPB_PrintSurface(
sprite->sdata->pic[sprite->frame + sprite->sdata->nFrames * side],
src_r, dest_r);
}
void printSpriteRot(L_spriteCtlRot *sprite, SDL_Rect *src_r, SDL_Rect *dest_r, int side, float angle)
{
JPB_PrintSurfaceRot(
sprite->sdata->pic[sprite->frame + sprite->sdata->nFrames * side],
src_r, dest_r, angle);
}
void freeSpriteData(L_spriteData *sprite)
{
int i,j;
for (i = 0; i < sprite->sides; i++) {
for (j = 0; j < sprite->nFrames; j++) {
JPB_FreeSurface(sprite->pic[j + sprite->nFrames*i]);
}
}
free(sprite->pic);
free(sprite->time);
free(sprite);
}
void freeSpriteDataRot(L_spriteDataRot *sprite)
{
int i,j;
for (i = 0; i < sprite->sides; i++) {
for (j = 0; j < sprite->nFrames; j++) {
JPB_FreeSurfaceRot(sprite->pic[j + sprite->nFrames*i]);
}
}
free(sprite->pic);
free(sprite->time);
free(sprite);
}
JPB_surfaceRot* getFrameRot(L_spriteCtlRot *sprite, int side)
{
return sprite->sdata->pic[sprite->frame + sprite->sdata->nFrames * side];
}
void initializeSpriteCtlRot(L_spriteCtlRot *sprite, L_spriteDataRot *data)
{
sprite->elpTime = 0;
sprite->frame = 0;
sprite->sdata = data;
}