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