/* $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; };