50aa6b6a8ddcb94adb1148ad88f4283a48cd03f9
[supertux.git] / src / level.c
1 //
2 // C Implementation: level
3 //
4 // Description:
5 //
6 //
7 // Author: Tobias Glaesser <tobi.web@gmx.de>, (C) 2003
8 //
9 // Copyright: See COPYING file that comes with this distribution
10 //
11 //
12
13 #include <stdlib.h>
14 #include <stdio.h>
15 #include <string.h>
16 #include "globals.h"
17 #include "setup.h"
18 #include "screen.h"
19 #include "level.h"
20
21 /* Load data for this level: */
22
23 void loadlevel(st_level* plevel, char *subset, int level)
24 {
25   int y;
26   FILE * fi;
27   char str[80];
28   char * filename;
29   char * line;
30
31   /* Load data file: */
32
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");
36   if (fi == NULL)
37     {
38       perror(filename);
39       st_shutdown();
40       free(filename);
41       exit(-1);
42     }
43   free(filename);
44
45
46   /* Load header info: */
47
48
49   /* (Level title) */
50   fgets(str, 20, fi);
51   strcpy(plevel->name, str);
52   plevel->name[strlen(plevel->name)-1] = '\0';
53
54   /* (Level theme) */
55   fgets(str, 20, fi);
56   strcpy(plevel->theme, str);
57   plevel->theme[strlen(plevel->theme)-1] = '\0';
58
59
60
61   /* (Time to beat level) */
62   fgets(str, 10, fi);
63   plevel->time_left = atoi(str);
64
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';
69
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';
74
75   /* (Level background color) */
76   fgets(str, 10, fi);
77   plevel->bkgd_red = atoi(str);
78   fgets(str, 10, fi);
79   plevel->bkgd_green= atoi(str);
80   fgets(str, 10, fi);
81   plevel->bkgd_blue = atoi(str);
82
83   /* (Level width) */
84   fgets(str, 10, fi);
85   plevel->width = atoi(str);
86
87
88   /* Allocate some space for the line-reading! */
89
90   line = (char *) malloc(sizeof(char) * (plevel->width + 5));
91   if (line == NULL)
92     {
93       fprintf(stderr, "Couldn't allocate space to load level data!");
94       fclose(fi);
95       exit(1);
96     }
97
98
99   /* Load the level lines: */
100
101   for (y = 0; y < 15; y++)
102     {
103       if(fgets(line, plevel->width + 5, fi) == NULL)
104         {
105           fprintf(stderr, "Level %s isn't complete!\n",plevel->name);
106           free(line);
107           fclose(fi);
108           exit(1);
109         }
110       line[strlen(line) - 1] = '\0';
111       plevel->tiles[y] = strdup(line);
112     }
113
114   free(line);
115   fclose(fi);
116
117 }
118
119 /* Unload data for this level: */
120
121 void unloadlevel(st_level* plevel)
122 {
123   free(plevel->tiles);
124   plevel->name[0] = '\0';
125   plevel->theme[0] = '\0';
126   plevel->song_title[0] = '\0';
127   plevel->bkgd_image[0] = '\0';
128 }
129
130 /* Load graphics: */
131
132 void loadlevelgfx(st_level *plevel)
133 {
134
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);
137
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);
142
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);
147
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);
152
153   if(strcmp(plevel->bkgd_image,"") != 0)
154     {
155       char fname[1024];
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);
160       printf("%s",fname);
161     }
162 }
163
164 /* Free graphics data for this level: */
165
166 void unloadlevelgfx(void)
167 {
168   int i;
169
170   for (i = 0; i < 2; i++)
171     {
172       texture_free(&img_brick[i]);
173     }
174   for (i = 0; i < 4; i++)
175     {
176       texture_free(&img_solid[i]);
177       texture_free(&img_bkgd_tile[0][i]);
178       texture_free(&img_bkgd_tile[1][i]);
179     }
180   texture_free(&img_bkgd);
181 }
182
183 /* Load a level-specific graphic... */
184
185 void load_level_image(texture_type* ptexture, char* theme, char * file, int use_alpha)
186 {
187   char fname[1024];
188
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);
192
193   texture_load(ptexture, fname, use_alpha);
194 }
195
196 /* Edit a piece of the map! */
197
198 void level_change(st_level* plevel, float x, float y, unsigned char c)
199 {
200   int xx, yy;
201
202   yy = ((int)y / 32);
203   xx = ((int)x / 32);
204
205   if (yy >= 0 && yy < 15 && xx >= 0 && xx <= plevel->width)
206     plevel->tiles[yy][xx] = c;
207 }
208