#include "loader.h" #include "utils.h" /* MPL_CHECK */ #include int loadSprite(SDL_Renderer *rend, char *giffilepath, int frames, sprite_t *sprite); int loadStyleRes(SDL_Renderer *rend, gameIni_t *gIni, char data_basepath[], gameRess_t *gRess) { int i, res; char filepath[MAX_PATH_LEN+1]; char *stylename=gIni->level.style; for(i=0; i < gIni->style.tiles; i++) { (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/style/%s/%s_%d.gif", data_basepath, stylename, stylename, i); res=loadSprite(rend,filepath,1,&gRess->tiles[i]); if (res != 0) return res; } for(i=0; i < gIni->style.objectCount; i++) { (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/style/%s/%so_%d.gif", data_basepath, stylename, stylename, i); res=loadSprite(rend,filepath,gIni->style.frames[i],&gRess->objects[i]); if (res != 0) return res; /* Some object types needs a mask */ if ( gIni->style.type[i] >= 5 && gIni->style.type[i] <= 8 ) { (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/style/%s/%som_%d.gif", data_basepath, stylename, stylename, i); res=loadSprite(rend,filepath,1,&gRess->objectMasks[i]); if (res != 0) return res; } } return 0; } void unloadStyleRes(gameRess_t *gRess) { int i; for(i=0; itiles[i].t); } for(i=0; iobjects[i].t); SDL_DestroyTexture(gRess->objectMasks[i].t); } } int loadMiscRes(SDL_Renderer *rend, char data_basepath[], gameRess_t *gRess) { int lemmanim_frames[MAX_LEMMANIM_COUNT] = {8,4,8,8,10,16,16,16,14,8,16,16,8,16,32,24,4}; int lemmanim_hasmask[6] = {6,10,11,13,14,15}; int lemmanim_hasimask[3] = {13,14,15}; char filepath[MAX_PATH_LEN+1]; int i,ii,res; for(i=0; ilemmingAnims[i]); if (res != 0) return res; } for(ii=0; ii<6; ii++) { i=lemmanim_hasmask[ii]; (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/mask_%d.gif", data_basepath, i); res=loadSprite(rend,filepath,1,&gRess->lemmingMasks[i]); if (res != 0) return res; } for(ii=0; ii<3; ii++) { i=lemmanim_hasimask[ii]; (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/imask_%d.gif", data_basepath, i); res=loadSprite(rend,filepath,1,&gRess->lemmingIMasks[i]); if (res != 0) return res; } (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/cursor.gif", data_basepath); res=loadSprite(rend,filepath,8,&gRess->cursor); if (res != 0) return res; (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/countdown.gif", data_basepath); res=loadSprite(rend,filepath,6,&gRess->countdown); if (res != 0) return res; (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/lemmfont.gif", data_basepath); res=loadSprite(rend,filepath,94,&gRess->font1); if (res != 0) return res; (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/lemmfont2.gif", data_basepath); res=loadSprite(rend,filepath,94,&gRess->font2); if (res != 0) return res; return 0; } void unloadMiscRes(gameRess_t *gRess) { int i; for(i=0; ilemmingAnims[i].t); SDL_DestroyTexture(gRess->lemmingMasks[i].t); SDL_DestroyTexture(gRess->lemmingIMasks[i].t); } SDL_DestroyTexture(gRess->cursor.t); SDL_DestroyTexture(gRess->countdown.t); SDL_DestroyTexture(gRess->font1.t); SDL_DestroyTexture(gRess->font2.t); } /* frames is for animated sprites and is the number of images. Assumed to be all in a column */ int loadSprite(SDL_Renderer *rend, char *giffilepath, int frames, sprite_t *sprite) { SDL_Surface *surf; SDL_RWops *rwop; //int res; rwop = SDL_RWFromFile(giffilepath,"r"); MPL_CHECK( rwop, {return 1;}, SDL_LOG_PRIORITY_WARN, "loadSprite(rend, \"%s\", frames, sprite) failed : problem opening file", giffilepath ); surf = IMG_LoadGIF_RW(rwop); SDL_RWclose(rwop); MPL_CHECK( surf, {return 2;}, SDL_LOG_PRIORITY_WARN, "loadSprite(rend, \"%s\", frames, sprite) failed : can't decode file", giffilepath ); sprite->t = SDL_CreateTextureFromSurface(rend, surf); MPL_CHECK( sprite->t, {SDL_FreeSurface(surf); return 2;}, SDL_LOG_PRIORITY_WARN, "loadSprite(rend, \"%s\", frames, sprite) failed : can't convert surface to texture", giffilepath ); sprite->size.x=0; sprite->size.y=0; sprite->size.w=surf->w; sprite->size.h=surf->h / frames; sprite->frames = frames; /* Surface no longer useful (everything was copied in the texture) */ SDL_FreeSurface(surf); return 0; }