rnd-20060207-1-src
[rocksndiamonds.git] / src / game_em / cave.c
1 /* 2000-08-10T16:43:50Z
2  *
3  * cave data structures
4  */
5
6 #include "global.h"
7 #include "tile.h"
8 #include "level.h"
9
10
11 struct LevelInfo_EM native_em_level;
12
13 void setLevelInfoToDefaults_EM(void)
14 {
15   int i;
16
17   native_em_level.file_version = FILE_VERSION_EM_ACTUAL;
18
19   native_em_level.lev = &lev;
20   for (i = 0; i < MAX_PLAYERS; i++)
21     native_em_level.ply[i] = &ply[i];
22
23   lev.width = 64;
24   lev.height = 32;
25
26   for (i = 0; i < MAX_PLAYERS; i++)
27   {
28     ply[i].x_initial = 0;
29     ply[i].y_initial = 0;
30   }
31
32   lev.lenses_cnt_initial = 0;
33   lev.magnify_cnt_initial = 0;
34
35   lev.wheel_cnt_initial = 0;
36   lev.wheel_x_initial = 1;
37   lev.wheel_y_initial = 1;
38
39   lev.wind_time = 9999;
40   lev.wind_cnt_initial = 0;
41
42   lev.wonderwall_state_initial = 0;
43   lev.wonderwall_time_initial = 0;
44
45   lev.num_ball_arrays = 8;
46
47   for (i = 0; i < TILE_MAX; i++)
48     lev.android_array[i] = Xblank;
49
50 #if 1
51   /* initial number of players in this level */
52   lev.home_initial = 0;
53
54   for (i = 0; i < MAX_PLAYERS; i++)
55   {
56     ply[i].exists = 0;
57     ply[i].alive_initial = FALSE;
58   }
59 #else
60   /* initial number of players in this level */
61   lev.home_initial = (setup.team_mode ? 2 : 1);
62
63   for (i = 0; i < MAX_PLAYERS; i++)
64   {
65     ply[i].exists = 0;
66     ply[i].alive_initial = (lev.home_initial > i ? TRUE : FALSE);
67   }
68 #endif
69 }
70
71
72 /* load cave
73  * 
74  * completely initializes the level structure, ready for a game
75  */
76
77 #define MAX_EM_LEVEL_SIZE               16384
78
79 boolean LoadNativeLevel_EM(char *filename)
80 {
81   unsigned char raw_leveldata[MAX_EM_LEVEL_SIZE];
82   int raw_leveldata_length;
83   int file_version;
84   FILE *file;
85
86   /* always start with reliable default values */
87   setLevelInfoToDefaults_EM();
88
89   if (!(file = fopen(filename, MODE_READ)))
90   {
91     Error(ERR_WARN, "cannot open level '%s' -- using empty level", filename);
92
93     return FALSE;
94   }
95
96   raw_leveldata_length = fread(raw_leveldata, 1, MAX_EM_LEVEL_SIZE, file);
97
98   fclose(file);
99
100   if (raw_leveldata_length <= 0)
101   {
102     Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename);
103
104     return FALSE;
105   }
106
107   if (!(file_version = cleanup_em_level(raw_leveldata, raw_leveldata_length)))
108   {
109     Error(ERR_WARN, "unknown EM level '%s' -- using empty level", filename);
110
111     return FALSE;
112   }
113
114   convert_em_level(raw_leveldata, file_version);
115   prepare_em_level();
116
117   return TRUE;
118 }