1 /*
2  * GNUjump
3  * =======
4  *
5  * Copyright (C) 2005-2008, Juan Pedro Bolivar Puente
6  *
7  * GNUjump is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * GNUjump is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #include <stdio.h>
22 
23 #include "gnujump.h"
24 #include "sprite.h"
25 #include "tools.h"
26 
27 extern SDL_Surface *screen;
28 extern L_gblOptions gblOps;
29 
30 L_spriteDataRot *
loadSpriteDataRot(char * filename,int sides,char * path)31 loadSpriteDataRot (char *filename, int sides, char *path)
32 {
33   FILE *tfile;
34   L_spriteDataRot *sprite = NULL;
35   char fname[MAX_CHAR];
36   int i;
37 
38   if ((tfile = fopen (filename, "r")) == NULL)
39     {
40       fprintf (stderr, "ERROR: Could not load sprite file: %s", filename);
41       return NULL;
42     }
43   if ((sprite = malloc (sizeof (L_spriteDataRot))) == NULL)
44     {
45       return NULL;
46     }
47   /*checks the number of frames... */
48   sprite->nFrames = getValue_int (tfile, "frames");
49   sprite->sides = sides;
50   sprite->pic = NULL;
51   sprite->time = NULL;
52 
53   /* Allocate memory for the images and the time data. */
54   sprite->pic =
55     (JPB_surfaceRot **) calloc ((sprite->nFrames * sprite->sides),
56 				sizeof (JPB_surfaceRot *));
57   sprite->time = malloc (sprite->nFrames * sizeof (float));
58 
59   for (i = 0; i < sprite->nFrames; i++)
60     {
61       /*and loads the pic and time of each frame... */
62       getValue_str (tfile, "pic", fname, path);
63       sprite->pic[i + (RIGHT * sprite->nFrames)] =
64 	JPB_LoadImgRot (fname, gblOps.useGL, 1, 0, 0);
65 
66       /*Loads the surface of the picture looking to the inverse side. */
67       if (sides > 1)
68 	sprite->pic[i + (LEFT * sprite->nFrames)] =
69 	  JPB_LoadImgRot (fname, gblOps.useGL, 1, 0, 1);
70       sprite->time[i] = getValue_float (tfile, "time");
71     }
72 
73   fclose (tfile);
74   return sprite;
75 }
76 
77 L_spriteData *
loadSpriteData(char * filename,int sides,char * path)78 loadSpriteData (char *filename, int sides, char *path)
79 {
80   FILE *tfile;
81   L_spriteData *sprite = NULL;
82   char fname[MAX_CHAR];
83   int i;
84 
85   if ((tfile = fopen (filename, "r")) == NULL)
86     {
87       fprintf (stderr, "ERROR: Could not load sprite file: %s", filename);
88       return NULL;
89     }
90   if ((sprite = malloc (sizeof (L_spriteData))) == NULL)
91     {
92       return NULL;
93     }
94   /*checks the number of frames... */
95   sprite->nFrames = getValue_int (tfile, "frames");
96   sprite->sides = sides;
97   //Allocate memory for the images and the time data.
98   sprite->pic =
99     malloc (sprite->nFrames * sprite->sides * sizeof (JPB_surface *));
100   sprite->time = malloc (sprite->nFrames * sizeof (float));
101 
102   for (i = 0; i < sprite->nFrames; i++)
103     {
104       /*and loads the pic and time of each frame... */
105       getValue_str (tfile, "pic", fname, path);
106       sprite->pic[i + LEFT * sprite->nFrames] =
107 	JPB_LoadImg (fname, gblOps.useGL, 1, 0, 0);
108 
109       /*Loads the surface of the picture looking to the inverse side. */
110       if (sprite->sides > 1)
111 	sprite->pic[i + RIGHT * sprite->nFrames] =
112 	  JPB_LoadImg (fname, gblOps.useGL, 1, 0, 1);
113 
114       sprite->time[i] = getValue_float (tfile, "time");
115     }
116 
117   fclose (tfile);
118   return sprite;
119 }
120 
121 int
animateSprite(L_spriteCtl * sprite,float dt)122 animateSprite (L_spriteCtl * sprite, float dt)
123 {
124   sprite->elpTime += dt;
125   if (sprite->elpTime >= sprite->sdata->time[sprite->frame])
126     {
127       sprite->elpTime -= sprite->sdata->time[sprite->frame];
128       sprite->frame += 1;
129       if (sprite->frame >= sprite->sdata->nFrames)
130 	{
131 	  sprite->frame = 0;
132 	  return TRUE;
133 	}
134     }
135   return FALSE;
136 }
137 
138 int
animateSpriteRot(L_spriteCtlRot * sprite,float dt)139 animateSpriteRot (L_spriteCtlRot * sprite, float dt)
140 {
141   sprite->elpTime += dt;
142   if (sprite->elpTime >= sprite->sdata->time[sprite->frame])
143     {
144       sprite->elpTime -= sprite->sdata->time[sprite->frame];
145       sprite->frame += 1;
146       if (sprite->frame >= sprite->sdata->nFrames)
147 	{
148 	  sprite->frame = 0;
149 	  return TRUE;
150 	}
151     }
152   return FALSE;
153 }
154 
155 void
printSprite(L_spriteCtl * sprite,SDL_Rect * src_r,SDL_Rect * dest_r,int side)156 printSprite (L_spriteCtl * sprite, SDL_Rect * src_r, SDL_Rect * dest_r,
157 	     int side)
158 {
159   JPB_PrintSurface (sprite->sdata->
160 		    pic[sprite->frame + sprite->sdata->nFrames * side], src_r,
161 		    dest_r);
162 }
163 
164 void
printSpriteRot(L_spriteCtlRot * sprite,SDL_Rect * src_r,SDL_Rect * dest_r,int side,float angle)165 printSpriteRot (L_spriteCtlRot * sprite, SDL_Rect * src_r, SDL_Rect * dest_r,
166 		int side, float angle)
167 {
168   JPB_PrintSurfaceRot (sprite->sdata->
169 		       pic[sprite->frame + sprite->sdata->nFrames * side],
170 		       src_r, dest_r, angle);
171 }
172 
173 
174 void
freeSpriteData(L_spriteData * sprite)175 freeSpriteData (L_spriteData * sprite)
176 {
177   int i, j;
178   for (i = 0; i < sprite->sides; i++)
179     {
180       for (j = 0; j < sprite->nFrames; j++)
181 	{
182 	  JPB_FreeSurface (sprite->pic[j + sprite->nFrames * i]);
183 	}
184     }
185   free (sprite->pic);
186   free (sprite->time);
187   free (sprite);
188 }
189 
190 void
freeSpriteDataRot(L_spriteDataRot * sprite)191 freeSpriteDataRot (L_spriteDataRot * sprite)
192 {
193   int i, j;
194 
195   for (i = 0; i < sprite->sides; i++)
196     {
197       for (j = 0; j < sprite->nFrames; j++)
198 	{
199 	  JPB_FreeSurfaceRot (sprite->pic[j + sprite->nFrames * i]);
200 	}
201     }
202   free (sprite->pic);
203   free (sprite->time);
204   free (sprite);
205 }
206 
207 JPB_surfaceRot *
getFrameRot(L_spriteCtlRot * sprite,int side)208 getFrameRot (L_spriteCtlRot * sprite, int side)
209 {
210   return sprite->sdata->pic[sprite->frame + sprite->sdata->nFrames * side];
211 }
212 
213 void
initializeSpriteCtlRot(L_spriteCtlRot * sprite,L_spriteDataRot * data)214 initializeSpriteCtlRot (L_spriteCtlRot * sprite, L_spriteDataRot * data)
215 {
216   sprite->elpTime = 0;
217   sprite->frame = 0;
218   sprite->sdata = data;
219 }
220 
221 void
initializeSpriteCtl(L_spriteCtl * sprite,L_spriteData * data)222 initializeSpriteCtl (L_spriteCtl * sprite, L_spriteData * data)
223 {
224   sprite->elpTime = 0;
225   sprite->frame = 0;
226   sprite->sdata = data;
227 }
228