You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bomberclone/src/tileset.c

253 lines
8.6 KiB

/* $Id: tileset.c,v 1.17 2012/01/28 21:53:19 steffen Exp $ */
/* load and select tilesets */
#include "bomberclone.h"
extern int UpdateRects_nr;
const char *ft_filenames[] = {
"background",
"stone",
"block",
"tunnel" ,
"pwdeath",
"pwfire",
"pwbomb",
"pwshoe",
NULL,
"sptrigger",
"sprow",
"sppush",
"spmoved",
"spliquid",
"spkick"
};
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-overflow"
#pragma GCC diagnostic ignored "-Wformat-truncation"
#pragma GCC diagnostic ignored "-Wstringop-overflow"
/* load a random tileset */
void
tileset_random ()
{
_direntry *destart,
*de,
*desel;
char path[LEN_PATHFILENAME];
int max,
sel;
snprintf (path, LEN_PATHFILENAME, "%s/tileset", bman.datapath);
desel = destart = s_getdir (path);
for (max = 0, de = destart; de != NULL; de = de->next)
if (de->name[0] != '.' && (de->flags & DF_dir) == DF_dir)
max++;
sel = s_random (max);
d_printf ("Random Tileset %d of %d selected\n", sel, max);
for (max = 0, de = destart; max <= sel && de != NULL; de = de->next)
if (de->name[0] != '.' && (de->flags & DF_dir) == DF_dir) {
desel = de;
max++;
}
d_printf (" %s\n", desel->name);
if (desel != NULL)
strncpy (map.tileset, desel->name, LEN_TILESETNAME);
map.tileset[LEN_TILESETNAME - 1] = 0;
}
/* load the tileset or if not present the files from the default folder
* if dx or dy is set to -1 test for best tileset resolution */
void
tileset_load (char *tilesetname, int dx, int dy)
{
int i,
r,
g,
b;
char fullname[LEN_PATHFILENAME];
char filename[LEN_FILENAME];
char tileset[LEN_TILESETNAME];
SDL_Surface *tmpimage,
*tmpimage1;
d_printf ("Loading Tileset: %s\n", tilesetname);
strncpy (tileset, tilesetname, LEN_TILESETNAME);
/* set the block size to dx and dy, if one of both is -1
* Calculate the Best Size of the Images */
if (dx <= 0 || dy <= 0) {
gfx.block.x = gfx.res.x / (map.size.x + 1);
if (GT_MP && gfx.res.y == 480)
gfx.block.y = (gfx.res.y - 120) / (map.size.y + 1);
else if (GT_MP && gfx.res.y == 600)
gfx.block.y = (gfx.res.y - 140) / (map.size.y + 1);
else if (GT_MP && gfx.res.y > 600)
gfx.block.y = (gfx.res.y - 160) / (map.size.y + 1);
else
gfx.block.y = (gfx.res.y - 48) / (map.size.y + 1);
if (gfx.block.x < gfx.block.y)
gfx.block.y = gfx.block.x;
else
gfx.block.x = gfx.block.y;
}
else {
gfx.block.x = dx;
gfx.block.y = dy;
}
/* create Table of points */
scale (gfx.postab, gfx.block.x, 256);
/* calculating the best offset for the field on the screen */
gfx.offset.x = (gfx.res.x - (gfx.block.x * map.size.x)) / 2;
gfx.offset.y = gfx.res.y - (gfx.block.y * map.size.y);
/* load the fire */
snprintf (fullname, LEN_PATHFILENAME, "%s/tileset/%s/fire.png", bman.datapath, tileset);
tmpimage = IMG_Load (fullname);
if (tmpimage == NULL) {
/* file could not be load, so load teh default tileset */
snprintf (fullname, LEN_PATHFILENAME, "%s/tileset/default/fire.png", bman.datapath);
tmpimage = IMG_Load (fullname);
if (tmpimage == NULL) {
printf ("default tileset could not be loaded. [%s]\n", fullname);
exit (1);
}
}
gfx.fire.frames = tmpimage->h / GFX_IMGSIZE;
tmpimage1 =
scale_image (tmpimage, (tmpimage->w / GFX_IMGSIZE) * gfx.block.x,
gfx.fire.frames * gfx.block.y);
getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, r, g, b));
gfx.fire.image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage);
SDL_FreeSurface (tmpimage1);
/* load the bomb */
snprintf (fullname, LEN_PATHFILENAME, "%s/tileset/%s/bomb.png", bman.datapath, tileset);
tmpimage = IMG_Load (fullname);
if (tmpimage == NULL) {
/* file could not be load, so load teh default tileset */
sprintf (fullname, "%s/tileset/default/bomb.png", bman.datapath);
tmpimage = IMG_Load (fullname);
if (tmpimage == NULL) {
printf ("default tileset could not be loaded. [%s]\n", fullname);
exit (1);
}
}
gfx.bomb.frames = tmpimage->h / GFX_IMGSIZE;
tmpimage1 =
scale_image (tmpimage, (tmpimage->w / GFX_IMGSIZE) * gfx.block.x,
gfx.bomb.frames * gfx.block.y);
getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, r, g, b));
gfx.bomb.image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage);
SDL_FreeSurface (tmpimage1);
/* load the powerup's image */
for (i = 0; i < PWUP_max; i++) {
switch (i) {
case (PWUP_good):
sprintf (filename, "powerup.png");
break;
case (PWUP_bad):
sprintf (filename, "powerbad.png");
break;
default:
sprintf (filename, "powersp.png");
break;
}
snprintf (fullname, LEN_PATHFILENAME, "%s/tileset/%s/%s", bman.datapath, tileset, filename);
tmpimage = IMG_Load (fullname);
if (tmpimage == NULL) {
/* file could not be load, so load teh default tileset */
snprintf (fullname, LEN_PATHFILENAME, "%s/tileset/default/%s", bman.datapath, filename);
tmpimage = IMG_Load (fullname);
if (tmpimage == NULL) {
printf ("default tileset could not be loaded. [%s]\n", fullname);
exit (1);
}
}
gfx.powerup[i].frames = tmpimage->h / GFX_IMGSIZE;
tmpimage1 =
scale_image (tmpimage, (tmpimage->w / GFX_IMGSIZE) * gfx.block.x,
gfx.powerup[i].frames * gfx.block.y);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, 255, 0, 255));
gfx.powerup[i].image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage);
SDL_FreeSurface (tmpimage1);
}
/* loading the field images */
for (i = 0; i < FT_max; i++) {
if (i != FT_mixed) {
snprintf (fullname, LEN_PATHFILENAME,"%s/tileset/%s/%s.png", bman.datapath, tileset, ft_filenames[i]);
gfx.field[i].w = GFX_IMGSIZE;
gfx.field[i].h = GFX_IMGSIZE;
tmpimage = IMG_Load (fullname);
if (tmpimage == NULL) {
snprintf (fullname, LEN_PATHFILENAME, "%s/tileset/%s/%s96.png", bman.datapath, tileset, ft_filenames[i]);
gfx.field[i].h = GFX_IMGBIGSIZE;
tmpimage = IMG_Load (fullname);
if (tmpimage == NULL) {
snprintf (fullname, LEN_PATHFILENAME, "%s/tileset/default/%s.png", bman.datapath, ft_filenames[i]);
gfx.field[i].h = GFX_IMGSIZE;
tmpimage = IMG_Load (fullname);
if (tmpimage == NULL) {
printf ("Can't load image: %s\n", SDL_GetError ());
exit (1);
}
}
}
gfx.field[i].frames = tmpimage->h / gfx.field[i].h;
gfx.field[i].h =
(float) ((float) gfx.field[i].h / (float) GFX_IMGSIZE) * (float) gfx.block.y;
gfx.field[i].w =
(float) ((float) gfx.field[i].w / (float) GFX_IMGSIZE) * (float) gfx.block.x;
tmpimage1 =
scale_image (tmpimage, gfx.field[i].w * (tmpimage->w / GFX_IMGSIZE),
gfx.field[i].frames * gfx.field[i].h);
if (i == FT_nothing || i == FT_block || i == FT_stone)
r = g = b = 255;
else
getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, r, g, b));
gfx.field[i].image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage1);
SDL_FreeSurface (tmpimage);
}
}
};
void
tileset_free ()
{
int i;
for (i = 0; i < FT_max; i++) {
if (gfx.field[i].image != NULL)
SDL_FreeSurface (gfx.field[i].image);
gfx.field[i].image = NULL;
}
if (gfx.bomb.image != NULL)
SDL_FreeSurface (gfx.bomb.image);
if (gfx.fire.image != NULL)
SDL_FreeSurface (gfx.fire.image);
for (i = 0; i < PWUP_max; i++)
if (gfx.powerup[i].image != NULL)
SDL_FreeSurface (gfx.powerup[i].image);
gfx.bomb.image = NULL;
gfx.fire.image = NULL;
};