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 /* Unload data for this level: */
121 void unloadlevel(st_level* plevel)
124 plevel->name[0] = '\0';
125 plevel->theme[0] = '\0';
126 plevel->song_title[0] = '\0';
127 plevel->bkgd_image[0] = '\0';
132 void loadlevelgfx(st_level *plevel)
135 load_level_image(&img_brick[0],plevel->theme,"brick0.png", IGNORE_ALPHA);
136 load_level_image(&img_brick[1],plevel->theme,"brick1.png", IGNORE_ALPHA);
138 load_level_image(&img_solid[0],plevel->theme,"solid0.png", USE_ALPHA);
139 load_level_image(&img_solid[1],plevel->theme,"solid1.png", USE_ALPHA);
140 load_level_image(&img_solid[2],plevel->theme,"solid2.png", USE_ALPHA);
141 load_level_image(&img_solid[3],plevel->theme,"solid3.png", USE_ALPHA);
143 load_level_image(&img_bkgd_tile[0][0],plevel->theme,"bkgd-00.png", USE_ALPHA);
144 load_level_image(&img_bkgd_tile[0][1],plevel->theme,"bkgd-01.png", USE_ALPHA);
145 load_level_image(&img_bkgd_tile[0][2],plevel->theme,"bkgd-02.png", USE_ALPHA);
146 load_level_image(&img_bkgd_tile[0][3],plevel->theme,"bkgd-03.png", USE_ALPHA);
148 load_level_image(&img_bkgd_tile[1][0],plevel->theme,"bkgd-10.png", USE_ALPHA);
149 load_level_image(&img_bkgd_tile[1][1],plevel->theme,"bkgd-11.png", USE_ALPHA);
150 load_level_image(&img_bkgd_tile[1][2],plevel->theme,"bkgd-12.png", USE_ALPHA);
151 load_level_image(&img_bkgd_tile[1][3],plevel->theme,"bkgd-13.png", USE_ALPHA);
153 if(strcmp(plevel->bkgd_image,"") != 0)
156 snprintf(fname, 1024, "%s/background/%s", st_dir, plevel->bkgd_image);
157 if(!faccessible(fname))
158 snprintf(fname, 1024, "%s/images/background/%s", DATA_PREFIX, plevel->bkgd_image);
159 texture_load(&img_bkgd, fname, IGNORE_ALPHA);
164 /* Free graphics data for this level: */
166 void unloadlevelgfx(void)
170 for (i = 0; i < 2; i++)
172 texture_free(&img_brick[i]);
174 for (i = 0; i < 4; i++)
176 texture_free(&img_solid[i]);
177 texture_free(&img_bkgd_tile[0][i]);
178 texture_free(&img_bkgd_tile[1][i]);
180 texture_free(&img_bkgd);
183 /* Load a level-specific graphic... */
185 void load_level_image(texture_type* ptexture, char* theme, char * file, int use_alpha)
189 snprintf(fname, 1024, "%s/themes/%s/%s", st_dir, theme, file);
190 if(!faccessible(fname))
191 snprintf(fname, 1024, "%s/images/themes/%s/%s", DATA_PREFIX, theme, file);
193 texture_load(ptexture, fname, use_alpha);
196 /* Edit a piece of the map! */
198 void level_change(st_level* plevel, float x, float y, unsigned char c)
205 if (yy >= 0 && yy < 15 && xx >= 0 && xx <= plevel->width)
206 plevel->tiles[yy][xx] = c;