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

246 lines
8.4 KiB

/* $Id: tileset.c,v 1.1 2003/07/15 11:43:09 stpohle Exp $ */
/* load and select tilesets */
#include "bomberclone.h"
extern int UpdateRects_nr;
/* load a random tileset */
void tileset_random () {
_direntry *destart, *de, *desel;
char path[LEN_PATHFILENAME];
int max, sel;
sprintf (path, "%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);
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 ("Random Tileset %s (%d on %d)\n", desel->name, sel, max);
if (desel != NULL)
strncpy (gfx.tileset, desel->name, LEN_TILESETNAME);
gfx.tileset[LEN_TILESETNAME-1] = 0;
}
/* load the tileset or if not present the files from the default folder */
void
tileset_load (char *tilesetname)
{
int i,
r,
g,
b;
char fullname[LEN_PATHFILENAME];
char filename[LEN_FILENAME];
char tileset[LEN_TILESETNAME];
SDL_Surface *tmpimage,
*tmpimage1;
float sfkt;
d_printf ("Loading Tileset: %s\n", tilesetname);
strncpy (tileset, tilesetname, LEN_TILESETNAME);
/* Calculate the Best Size of the Images */
gfx.block.x = gfx.res.x / (bman.fieldsize.x + 1);
gfx.block.y = (gfx.res.y - 80) / (bman.fieldsize.y + 1);
if (gfx.block.x < gfx.block.y)
gfx.block.y = gfx.block.x;
else
gfx.block.x = gfx.block.y;
/* create Table of points */
scale (gfx.postab, gfx.block.x, 256);
sfkt = ((float) gfx.block.x) / ((float) GFX_IMGSIZE);
/* calculating the best offset for the field on the screen */
gfx.offset.x = (gfx.res.x - (gfx.block.x * bman.fieldsize.x)) / 2;
gfx.offset.y = gfx.res.y - (gfx.block.y * bman.fieldsize.y);
/* load the fire */
sprintf (fullname, "%s/tileset/%s/fire.bmp", bman.datapath, tileset);
tmpimage = SDL_LoadBMP (fullname);
if (tmpimage == NULL) {
/* file could not be load, so load teh default tileset */
sprintf (fullname, "%s/tileset/default/fire.bmp", bman.datapath);
tmpimage = SDL_LoadBMP (fullname);
if (tmpimage == NULL) {
printf ("default tileset could not be loaded.\n");
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 */
sprintf (fullname, "%s/tileset/%s/bomb.bmp", bman.datapath, tileset);
tmpimage = SDL_LoadBMP (fullname);
if (tmpimage == NULL) {
/* file could not be load, so load teh default tileset */
sprintf (fullname, "%s/tileset/default/bomb.bmp", bman.datapath);
tmpimage = SDL_LoadBMP (fullname);
if (tmpimage == NULL) {
printf ("default tileset could not be loaded.\n");
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.bmp");
break;
case (PWUP_bad):
sprintf (filename, "powerbad.bmp");
break;
default:
sprintf (filename, "powersp.bmp");
break;
}
sprintf (fullname, "%s/tileset/%s/%s", bman.datapath, tileset, filename);
tmpimage = SDL_LoadBMP (fullname);
if (tmpimage == NULL) {
/* file could not be load, so load teh default tileset */
sprintf (fullname, "%s/tileset/default/%s", bman.datapath, filename);
tmpimage = SDL_LoadBMP (fullname);
if (tmpimage == NULL) {
printf ("default tileset could not be loaded.\n");
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++) {
switch (i) {
case (FT_nothing):
sprintf (filename, "background.bmp");
break;
case (FT_stone):
sprintf (filename, "stone.bmp");
break;
case (FT_block):
sprintf (filename, "block.bmp");
break;
case (FT_death):
sprintf (filename, "pwdeath.bmp");
break;
case (FT_bomb):
sprintf (filename, "pwbomb.bmp");
break;
case (FT_fire):
sprintf (filename, "pwfire.bmp");
break;
case (FT_shoe):
sprintf (filename, "pwshoe.bmp");
break;
case (FT_sp_trigger):
sprintf (filename, "sptrigger.bmp");
break;
case (FT_sp_row):
sprintf (filename, "sprow.bmp");
break;
case (FT_sp_push):
sprintf (filename, "sppush.bmp");
break;
case (FT_sp_kick):
sprintf (filename, "spkick.bmp");
continue; // remove this if you find a kick image
break;
}
if (i != FT_mixed) {
sprintf (fullname, "%s/tileset/%s/%s", bman.datapath, tileset, filename);
tmpimage = SDL_LoadBMP (fullname);
if (tmpimage == NULL) {
sprintf (fullname, "%s/tileset/default/%s", bman.datapath, filename);
tmpimage = SDL_LoadBMP (fullname);
if (tmpimage == NULL) {
printf ("Can't load image: %s\n", SDL_GetError ());
exit (1);
}
}
gfx.field[i].frames = tmpimage->h / GFX_IMGSIZE;
tmpimage1 = scale_image (tmpimage, (tmpimage->w / GFX_IMGSIZE) * gfx.block.x,
gfx.field[i].frames * gfx.block.y);
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);
if (i >= FT_sp_trigger && i < FT_max) {
// create the smal special thing
tmpimage1 = scale_image (tmpimage, 32, 32);
getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, r, g, b));
gfx.smal_special[i - FT_sp_trigger] = SDL_DisplayFormat (tmpimage1);
};
SDL_FreeSurface (tmpimage);
}
}
UpdateRects_nr = 0;
};
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 (i >= FT_sp_trigger && i < FT_max) {
if (gfx.smal_special[i - FT_sp_trigger] != NULL)
SDL_FreeSurface (gfx.smal_special[i - FT_sp_trigger]);
gfx.smal_special[i - FT_sp_trigger] = 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;
};