1 /*
2 Copyright (C) 2009-2021 Parallel Realities
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13 See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
18 */
19
20 #include "../headers.h"
21
22 #include "../system/error.h"
23 #include "../system/pak.h"
24 #include "graphics.h"
25 #include "sprites.h"
26
27 static Sprite sprite[MAX_SPRITES];
28
29 static int loadSprite(char *);
30
31 static int spriteID = 0;
32
loadSpritesFromFile(char * name,int * index)33 void loadSpritesFromFile(char *name, int *index)
34 {
35 char *line, *savePtr;
36 unsigned char *buffer;
37 int i;
38
39 savePtr = NULL;
40
41 buffer = loadFileFromPak(name);
42
43 i = 0;
44
45 line = strtok_r((char *)buffer, "\n", &savePtr);
46
47 while (line != NULL)
48 {
49 if (line[0] == '#' || line[0] == '\n')
50 {
51 line = strtok_r(NULL, "\n", &savePtr);
52
53 continue;
54 }
55
56 if (spriteID == MAX_SPRITES)
57 {
58 showErrorAndExit("Ran out of space for Sprites");
59 }
60
61 if (line[strlen(line) - 1] == '\n')
62 {
63 line[strlen(line) - 1] = '\0';
64 }
65
66 if (line[strlen(line) - 1] == '\r')
67 {
68 line[strlen(line) - 1] = '\0';
69 }
70
71 index[i] = loadSprite(line);
72
73 i++;
74
75 line = strtok_r(NULL, "\n", &savePtr);
76 }
77
78 free(buffer);
79 }
80
loadSprite(char * name)81 static int loadSprite(char *name)
82 {
83 int i, x, y, w, h, read, alpha;
84 char filename[MAX_FILE_LENGTH];
85 SDL_Surface *image;
86
87 read = sscanf(name, "%s %d %d %d %d %d\n", filename, &x, &y, &w, &h, &alpha);
88
89 for (i=0;i<spriteID;i++)
90 {
91 if (strcmpignorecase(filename, sprite[i].name) == 0)
92 {
93 return i;
94 }
95 }
96
97 image = loadImageAsSurface(filename);
98
99 sprite[spriteID].image = convertSurfaceToTexture(image, FALSE);
100
101 STRNCPY(sprite[spriteID].name, filename, MAX_FILE_LENGTH);
102
103 sprite[spriteID].w = sprite[spriteID].image->w;
104 sprite[spriteID].h = sprite[spriteID].image->h;
105
106 if (read == 5)
107 {
108 sprite[spriteID].box.x = x;
109 sprite[spriteID].box.y = y;
110 sprite[spriteID].box.w = w;
111 sprite[spriteID].box.h = h;
112 }
113
114 else
115 {
116 sprite[spriteID].box.x = 0;
117 sprite[spriteID].box.y = 0;
118 sprite[spriteID].box.w = sprite[spriteID].image->w;
119 sprite[spriteID].box.h = sprite[spriteID].image->h;
120 }
121
122 i = spriteID;
123
124 spriteID++;
125
126 sprite[spriteID].image = convertImageToWhite(image, TRUE);
127
128 STRNCPY(sprite[spriteID].name, filename, MAX_FILE_LENGTH);
129
130 sprite[spriteID].w = sprite[spriteID].image->w;
131 sprite[spriteID].h = sprite[spriteID].image->h;
132
133 if (read == 5)
134 {
135 sprite[spriteID].box.x = x;
136 sprite[spriteID].box.y = y;
137 sprite[spriteID].box.w = w;
138 sprite[spriteID].box.h = h;
139 }
140
141 else
142 {
143 sprite[spriteID].box.x = 0;
144 sprite[spriteID].box.y = 0;
145 sprite[spriteID].box.w = sprite[spriteID].image->w;
146 sprite[spriteID].box.h = sprite[spriteID].image->h;
147 }
148
149 spriteID++;
150
151 return i;
152 }
153
createSpriteFromSurface(char * name,SDL_Surface * image)154 int createSpriteFromSurface(char *name, SDL_Surface *image)
155 {
156 int i;
157
158 STRNCPY(sprite[spriteID].name, name, MAX_FILE_LENGTH);
159
160 sprite[spriteID].image = convertSurfaceToTexture(image, TRUE);
161
162 sprite[spriteID].w = sprite[spriteID].image->w;
163 sprite[spriteID].h = sprite[spriteID].image->h;
164
165 sprite[spriteID].box.x = 0;
166 sprite[spriteID].box.y = 0;
167 sprite[spriteID].box.w = sprite[spriteID].image->w;
168 sprite[spriteID].box.h = sprite[spriteID].image->h;
169
170 i = spriteID;
171
172 spriteID++;
173
174 return i;
175 }
176
getSpriteIndexByName(char * name)177 int getSpriteIndexByName(char *name)
178 {
179 int i;
180
181 for (i=0;i<spriteID;i++)
182 {
183 if (strcmpignorecase(name, sprite[i].name) == 0)
184 {
185 return i;
186 }
187 }
188
189 return -1;
190 }
191
freeSprites()192 void freeSprites()
193 {
194 int i;
195
196 for (i=0;i<MAX_SPRITES;i++)
197 {
198 if (sprite[i].image != NULL)
199 {
200 destroyTexture(sprite[i].image);
201
202 sprite[i].image = NULL;
203 }
204
205 sprite[i].name[0] = '\0';
206 }
207
208 spriteID = 0;
209 }
210
getSprite(int index)211 Sprite *getSprite(int index)
212 {
213 return &sprite[index];
214 }
215