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