2 // C Implementation: level
7 // Author: Tobias Glaesser <tobi.web@gmx.de>, (C) 2003
9 // Copyright: See COPYING file that comes with this distribution
21 /* Load data for this level: */
23 void loadlevel(st_level* plevel, char *subset, int level)
33 filename = (char *) malloc(sizeof(char) * (strlen(DATA_PREFIX) + 20) + strlen(subset));
34 sprintf(filename, "%s/levels/%s/level%d.dat", DATA_PREFIX, subset, level);
35 fi = fopen(filename, "r");
46 /* Load header info: */
51 strcpy(plevel->name, str);
52 plevel->name[strlen(plevel->name)-1] = '\0';
56 strcpy(plevel->theme, str);
57 plevel->theme[strlen(plevel->theme)-1] = '\0';
61 /* (Time to beat level) */
63 plevel->time_left = atoi(str);
65 /* (Song file for this level) */
66 fgets(str, sizeof(plevel->song_title), fi);
67 strcpy(plevel->song_title, str);
68 plevel->song_title[strlen(plevel->song_title)-1] = '\0';
70 /* (Level background image) */
71 fgets(str, sizeof(plevel->bkgd_image), fi);
72 strcpy(plevel->bkgd_image, str);
73 plevel->bkgd_image[strlen(plevel->bkgd_image)-1] = '\0';
75 /* (Level background color) */
77 plevel->bkgd_red = atoi(str);
79 plevel->bkgd_green= atoi(str);
81 plevel->bkgd_blue = atoi(str);
85 plevel->width = atoi(str);
88 /* Allocate some space for the line-reading! */
90 line = (char *) malloc(sizeof(char) * (plevel->width + 5));
93 fprintf(stderr, "Couldn't allocate space to load level data!");
99 /* Load the level lines: */
101 for (y = 0; y < 15; y++)
103 if(fgets(line, plevel->width + 5, fi) == NULL)
105 fprintf(stderr, "Level %s isn't complete!\n",plevel->name);
110 line[strlen(line) - 1] = '\0';
111 plevel->tiles[y] = strdup(line);
119 /* Save data for level: */
121 void savelevel(st_level* plevel, char * subset, int level)
128 /* Save data file: */
130 filename = (char *) malloc(sizeof(char) * (strlen(DATA_PREFIX) + 20) + strlen(subset));
131 sprintf(filename, "%s/levels/%s/level%d.dat", DATA_PREFIX, subset, level);
132 fi = fopen(filename, "w");
142 fputs(plevel->name, fi);
144 fputs(plevel->theme, fi);
146 sprintf(str, "%d\n", plevel->time_left); /* time */
148 fputs(plevel->song_title, fi); /* song filename */
150 fputs(plevel->bkgd_image, fi); /* background image */
151 sprintf(str, "\n%d\n", plevel->bkgd_red); /* red background color */
153 sprintf(str, "%d\n", plevel->bkgd_green); /* green background color */
155 sprintf(str, "%d\n", plevel->bkgd_blue); /* blue background color */
157 sprintf(str, "%d\n", plevel->width); /* level width */
160 for(y = 0; y < 15; ++y)
162 fputs(plevel->tiles[y], fi);
170 /* Unload data for this level: */
172 void unloadlevel(st_level* plevel)
175 plevel->name[0] = '\0';
176 plevel->theme[0] = '\0';
177 plevel->song_title[0] = '\0';
178 plevel->bkgd_image[0] = '\0';
183 void loadlevelgfx(st_level *plevel)
186 load_level_image(&img_brick[0],plevel->theme,"brick0.png", IGNORE_ALPHA);
187 load_level_image(&img_brick[1],plevel->theme,"brick1.png", IGNORE_ALPHA);
189 load_level_image(&img_solid[0],plevel->theme,"solid0.png", USE_ALPHA);
190 load_level_image(&img_solid[1],plevel->theme,"solid1.png", USE_ALPHA);
191 load_level_image(&img_solid[2],plevel->theme,"solid2.png", USE_ALPHA);
192 load_level_image(&img_solid[3],plevel->theme,"solid3.png", USE_ALPHA);
194 load_level_image(&img_bkgd_tile[0][0],plevel->theme,"bkgd-00.png", USE_ALPHA);
195 load_level_image(&img_bkgd_tile[0][1],plevel->theme,"bkgd-01.png", USE_ALPHA);
196 load_level_image(&img_bkgd_tile[0][2],plevel->theme,"bkgd-02.png", USE_ALPHA);
197 load_level_image(&img_bkgd_tile[0][3],plevel->theme,"bkgd-03.png", USE_ALPHA);
199 load_level_image(&img_bkgd_tile[1][0],plevel->theme,"bkgd-10.png", USE_ALPHA);
200 load_level_image(&img_bkgd_tile[1][1],plevel->theme,"bkgd-11.png", USE_ALPHA);
201 load_level_image(&img_bkgd_tile[1][2],plevel->theme,"bkgd-12.png", USE_ALPHA);
202 load_level_image(&img_bkgd_tile[1][3],plevel->theme,"bkgd-13.png", USE_ALPHA);
204 if(strcmp(plevel->bkgd_image,"") != 0)
207 snprintf(fname, 1024, "%s/background/%s", st_dir, plevel->bkgd_image);
208 if(!faccessible(fname))
209 snprintf(fname, 1024, "%s/images/background/%s", DATA_PREFIX, plevel->bkgd_image);
210 texture_load(&img_bkgd, fname, IGNORE_ALPHA);
215 /* Free graphics data for this level: */
217 void unloadlevelgfx(void)
221 for (i = 0; i < 2; i++)
223 texture_free(&img_brick[i]);
225 for (i = 0; i < 4; i++)
227 texture_free(&img_solid[i]);
228 texture_free(&img_bkgd_tile[0][i]);
229 texture_free(&img_bkgd_tile[1][i]);
231 texture_free(&img_bkgd);
234 /* Load a level-specific graphic... */
236 void load_level_image(texture_type* ptexture, char* theme, char * file, int use_alpha)
240 snprintf(fname, 1024, "%s/themes/%s/%s", st_dir, theme, file);
241 if(!faccessible(fname))
242 snprintf(fname, 1024, "%s/images/themes/%s/%s", DATA_PREFIX, theme, file);
244 texture_load(ptexture, fname, use_alpha);
247 /* Edit a piece of the map! */
249 void level_change(st_level* plevel, float x, float y, unsigned char c)
256 if (yy >= 0 && yy < 15 && xx >= 0 && xx <= plevel->width)
257 plevel->tiles[yy][xx] = c;