rnd-20131217-1-src
[rocksndiamonds.git] / src / game_em / cave.c
1 /* 2000-08-10T16:43:50Z
2  *
3  * cave data structures
4  */
5
6 #include "main_em.h"
7
8
9 struct LevelInfo_EM native_em_level;
10
11 void setLevelInfoToDefaults_EM(void)
12 {
13   int i;
14
15   native_em_level.file_version = FILE_VERSION_EM_ACTUAL;
16
17   native_em_level.lev = &lev;
18   for (i = 0; i < MAX_PLAYERS; i++)
19     native_em_level.ply[i] = &ply[i];
20
21   lev.width = 64;
22   lev.height = 32;
23
24   for (i = 0; i < MAX_PLAYERS; i++)
25   {
26     ply[i].x_initial = 0;
27     ply[i].y_initial = 0;
28   }
29
30   lev.lenses_cnt_initial = 0;
31   lev.magnify_cnt_initial = 0;
32
33   lev.wheel_cnt_initial = 0;
34   lev.wheel_x_initial = 1;
35   lev.wheel_y_initial = 1;
36
37   lev.wind_time = 9999;
38   lev.wind_cnt_initial = 0;
39
40   lev.wonderwall_state_initial = 0;
41   lev.wonderwall_time_initial = 0;
42
43   lev.num_ball_arrays = 8;
44
45   for (i = 0; i < TILE_MAX; i++)
46     lev.android_array[i] = Xblank;
47
48 #if 1
49   /* initial number of players in this level */
50   lev.home_initial = 0;
51
52   for (i = 0; i < MAX_PLAYERS; i++)
53   {
54     ply[i].exists = 0;
55     ply[i].alive_initial = FALSE;
56   }
57 #else
58   /* initial number of players in this level */
59   lev.home_initial = (setup.team_mode ? 2 : 1);
60
61   for (i = 0; i < MAX_PLAYERS; i++)
62   {
63     ply[i].exists = 0;
64     ply[i].alive_initial = (lev.home_initial > i ? TRUE : FALSE);
65   }
66 #endif
67 }
68
69
70 /* load cave
71  * 
72  * completely initializes the level structure, ready for a game
73  */
74
75 #define MAX_EM_LEVEL_SIZE               16384
76
77 #if 1
78
79 boolean LoadNativeLevel_EM(char *filename, boolean level_info_only)
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 = openFile(filename, MODE_READ)))
90   {
91     if (!level_info_only)
92       Error(ERR_WARN, "cannot open level '%s' -- using empty level", filename);
93
94     return FALSE;
95   }
96
97   raw_leveldata_length = readFile(file, raw_leveldata, 1, MAX_EM_LEVEL_SIZE);
98
99   closeFile(file);
100
101   if (raw_leveldata_length <= 0)
102   {
103     Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename);
104
105     return FALSE;
106   }
107
108   file_version = cleanup_em_level(raw_leveldata, raw_leveldata_length,filename);
109
110   if (file_version == FILE_VERSION_EM_UNKNOWN)
111   {
112     Error(ERR_WARN, "unknown EM level '%s' -- using empty level", filename);
113
114     return FALSE;
115   }
116
117   convert_em_level(raw_leveldata, file_version);
118   prepare_em_level();
119
120   return TRUE;
121 }
122
123 #else
124
125 boolean LoadNativeLevel_EM(char *filename, boolean level_info_only)
126 {
127   unsigned char raw_leveldata[MAX_EM_LEVEL_SIZE];
128   int raw_leveldata_length;
129   int file_version;
130   FILE *file;
131
132   /* always start with reliable default values */
133   setLevelInfoToDefaults_EM();
134
135   if (!(file = fopen(filename, MODE_READ)))
136   {
137     if (!level_info_only)
138       Error(ERR_WARN, "cannot open level '%s' -- using empty level", filename);
139
140     return FALSE;
141   }
142
143   raw_leveldata_length = fread(raw_leveldata, 1, MAX_EM_LEVEL_SIZE, file);
144
145   fclose(file);
146
147   if (raw_leveldata_length <= 0)
148   {
149     Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename);
150
151     return FALSE;
152   }
153
154   file_version = cleanup_em_level(raw_leveldata, raw_leveldata_length,filename);
155
156   if (file_version == FILE_VERSION_EM_UNKNOWN)
157   {
158     Error(ERR_WARN, "unknown EM level '%s' -- using empty level", filename);
159
160     return FALSE;
161   }
162
163   convert_em_level(raw_leveldata, file_version);
164   prepare_em_level();
165
166   return TRUE;
167 }
168
169 #endif