1 /* $Id: tileset.c,v 1.16 2004-09-26 02:28:07 stpohle Exp $ */
2 /* load and select tilesets */
3
4 #include "bomberclone.h"
5
6 extern int UpdateRects_nr;
7
8 const char *ft_filenames[] = {
9 "background",
10 "stone",
11 "block",
12 "tunnel" ,
13 "pwdeath",
14 "pwfire",
15 "pwbomb",
16 "pwshoe",
17 NULL,
18 "sptrigger",
19 "sprow",
20 "sppush",
21 "spmoved",
22 "spliquid",
23 "spkick"
24 };
25
26
27 /* load a random tileset */
28 void
tileset_random()29 tileset_random ()
30 {
31 _direntry *destart,
32 *de,
33 *desel;
34 char path[LEN_PATHFILENAME];
35 int max,
36 sel;
37
38 sprintf (path, "%s/tileset", bman.datapath);
39 desel = destart = s_getdir (path);
40
41 for (max = 0, de = destart; de != NULL; de = de->next)
42 if (de->name[0] != '.' && (de->flags & DF_dir) == DF_dir)
43 max++;
44
45 sel = s_random (max);
46 d_printf ("Random Tileset %d of %d selected\n", sel, max);
47
48 for (max = 0, de = destart; max <= sel && de != NULL; de = de->next)
49 if (de->name[0] != '.' && (de->flags & DF_dir) == DF_dir) {
50 desel = de;
51 max++;
52 }
53 d_printf (" %s\n", desel->name);
54
55 if (desel != NULL)
56 strncpy (map.tileset, desel->name, LEN_TILESETNAME);
57 map.tileset[LEN_TILESETNAME - 1] = 0;
58 }
59
60
61 /* load the tileset or if not present the files from the default folder
62 * if dx or dy is set to -1 test for best tileset resolution */
63 void
tileset_load(char * tilesetname,int dx,int dy)64 tileset_load (char *tilesetname, int dx, int dy)
65 {
66 int i,
67 r,
68 g,
69 b;
70 char fullname[LEN_PATHFILENAME];
71 char filename[LEN_FILENAME];
72 char tileset[LEN_TILESETNAME];
73 SDL_Surface *tmpimage,
74 *tmpimage1;
75 float sfkt;
76
77 d_printf ("Loading Tileset: %s\n", tilesetname);
78 strncpy (tileset, tilesetname, LEN_TILESETNAME);
79
80 /* set the block size to dx and dy, if one of both is -1
81 * Calculate the Best Size of the Images */
82 if (dx <= 0 || dy <= 0) {
83 gfx.block.x = gfx.res.x / (map.size.x + 1);
84 if (GT_MP && gfx.res.y == 480)
85 gfx.block.y = (gfx.res.y - 120) / (map.size.y + 1);
86 else if (GT_MP && gfx.res.y == 600)
87 gfx.block.y = (gfx.res.y - 140) / (map.size.y + 1);
88 else if (GT_MP && gfx.res.y > 600)
89 gfx.block.y = (gfx.res.y - 160) / (map.size.y + 1);
90 else
91 gfx.block.y = (gfx.res.y - 48) / (map.size.y + 1);
92 if (gfx.block.x < gfx.block.y)
93 gfx.block.y = gfx.block.x;
94 else
95 gfx.block.x = gfx.block.y;
96 }
97 else {
98 gfx.block.x = dx;
99 gfx.block.y = dy;
100 }
101
102 /* create Table of points */
103 scale (gfx.postab, gfx.block.x, 256);
104 sfkt = ((float) gfx.block.x) / ((float) GFX_IMGSIZE);
105
106 /* calculating the best offset for the field on the screen */
107 gfx.offset.x = (gfx.res.x - (gfx.block.x * map.size.x)) / 2;
108 gfx.offset.y = gfx.res.y - (gfx.block.y * map.size.y);
109
110 /* load the fire */
111 sprintf (fullname, "%s/tileset/%s/fire.png", bman.datapath, tileset);
112 tmpimage = IMG_Load (fullname);
113 if (tmpimage == NULL) {
114 /* file could not be load, so load teh default tileset */
115 sprintf (fullname, "%s/tileset/default/fire.png", bman.datapath);
116 tmpimage = IMG_Load (fullname);
117 if (tmpimage == NULL) {
118 printf ("default tileset could not be loaded. [%s]\n", fullname);
119 exit (1);
120 }
121 }
122 gfx.fire.frames = tmpimage->h / GFX_IMGSIZE;
123 tmpimage1 =
124 scale_image (tmpimage, (tmpimage->w / GFX_IMGSIZE) * gfx.block.x,
125 gfx.fire.frames * gfx.block.y);
126 getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
127 SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, r, g, b));
128 gfx.fire.image = SDL_DisplayFormat (tmpimage1);
129 SDL_FreeSurface (tmpimage);
130 SDL_FreeSurface (tmpimage1);
131
132 /* load the bomb */
133 sprintf (fullname, "%s/tileset/%s/bomb.png", bman.datapath, tileset);
134 tmpimage = IMG_Load (fullname);
135 if (tmpimage == NULL) {
136 /* file could not be load, so load teh default tileset */
137 sprintf (fullname, "%s/tileset/default/bomb.png", bman.datapath);
138 tmpimage = IMG_Load (fullname);
139 if (tmpimage == NULL) {
140 printf ("default tileset could not be loaded. [%s]\n", fullname);
141 exit (1);
142 }
143 }
144 gfx.bomb.frames = tmpimage->h / GFX_IMGSIZE;
145 tmpimage1 =
146 scale_image (tmpimage, (tmpimage->w / GFX_IMGSIZE) * gfx.block.x,
147 gfx.bomb.frames * gfx.block.y);
148 getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
149 SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, r, g, b));
150 gfx.bomb.image = SDL_DisplayFormat (tmpimage1);
151 SDL_FreeSurface (tmpimage);
152 SDL_FreeSurface (tmpimage1);
153
154 /* load the powerup's image */
155 for (i = 0; i < PWUP_max; i++) {
156 switch (i) {
157 case (PWUP_good):
158 sprintf (filename, "powerup.png");
159 break;
160 case (PWUP_bad):
161 sprintf (filename, "powerbad.png");
162 break;
163 default:
164 sprintf (filename, "powersp.png");
165 break;
166 }
167
168 sprintf (fullname, "%s/tileset/%s/%s", bman.datapath, tileset, filename);
169 tmpimage = IMG_Load (fullname);
170 if (tmpimage == NULL) {
171 /* file could not be load, so load teh default tileset */
172 sprintf (fullname, "%s/tileset/default/%s", bman.datapath, filename);
173 tmpimage = IMG_Load (fullname);
174 if (tmpimage == NULL) {
175 printf ("default tileset could not be loaded. [%s]\n", fullname);
176 exit (1);
177 }
178 }
179 gfx.powerup[i].frames = tmpimage->h / GFX_IMGSIZE;
180 tmpimage1 =
181 scale_image (tmpimage, (tmpimage->w / GFX_IMGSIZE) * gfx.block.x,
182 gfx.powerup[i].frames * gfx.block.y);
183 SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, 255, 0, 255));
184 gfx.powerup[i].image = SDL_DisplayFormat (tmpimage1);
185 SDL_FreeSurface (tmpimage);
186 SDL_FreeSurface (tmpimage1);
187 }
188 /* loading the field images */
189 for (i = 0; i < FT_max; i++) {
190 if (i != FT_mixed) {
191 sprintf (fullname, "%s/tileset/%s/%s.png", bman.datapath, tileset, ft_filenames[i]);
192 gfx.field[i].w = GFX_IMGSIZE;
193 gfx.field[i].h = GFX_IMGSIZE;
194 tmpimage = IMG_Load (fullname);
195 if (tmpimage == NULL) {
196 sprintf (fullname, "%s/tileset/%s/%s96.png", bman.datapath, tileset, ft_filenames[i]);
197 gfx.field[i].h = GFX_IMGBIGSIZE;
198 tmpimage = IMG_Load (fullname);
199 if (tmpimage == NULL) {
200 sprintf (fullname, "%s/tileset/default/%s.png", bman.datapath, ft_filenames[i]);
201 gfx.field[i].h = GFX_IMGSIZE;
202 tmpimage = IMG_Load (fullname);
203 if (tmpimage == NULL) {
204 printf ("Can't load image: %s\n", SDL_GetError ());
205 exit (1);
206 }
207 }
208 }
209 gfx.field[i].frames = tmpimage->h / gfx.field[i].h;
210 gfx.field[i].h =
211 (float) ((float) gfx.field[i].h / (float) GFX_IMGSIZE) * (float) gfx.block.y;
212 gfx.field[i].w =
213 (float) ((float) gfx.field[i].w / (float) GFX_IMGSIZE) * (float) gfx.block.x;
214 tmpimage1 =
215 scale_image (tmpimage, gfx.field[i].w * (tmpimage->w / GFX_IMGSIZE),
216 gfx.field[i].frames * gfx.field[i].h);
217 if (i == FT_nothing || i == FT_block || i == FT_stone)
218 r = g = b = 255;
219 else
220 getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
221 SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, r, g, b));
222 gfx.field[i].image = SDL_DisplayFormat (tmpimage1);
223 SDL_FreeSurface (tmpimage1);
224 SDL_FreeSurface (tmpimage);
225 }
226 }
227 };
228
229
230 void
tileset_free()231 tileset_free ()
232 {
233 int i;
234
235 for (i = 0; i < FT_max; i++) {
236 if (gfx.field[i].image != NULL)
237 SDL_FreeSurface (gfx.field[i].image);
238 gfx.field[i].image = NULL;
239 }
240 if (gfx.bomb.image != NULL)
241 SDL_FreeSurface (gfx.bomb.image);
242 if (gfx.fire.image != NULL)
243 SDL_FreeSurface (gfx.fire.image);
244 for (i = 0; i < PWUP_max; i++)
245 if (gfx.powerup[i].image != NULL)
246 SDL_FreeSurface (gfx.powerup[i].image);
247
248 gfx.bomb.image = NULL;
249 gfx.fire.image = NULL;
250 };
251