added using separate level structures (initial and runtime) for EM engine
[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   native_em_level.cav = &cav;
17
18   game_em.lev = &lev;
19   for (i = 0; i < MAX_PLAYERS; i++)
20     game_em.ply[i] = &ply[i];
21
22   cav.width = 64;
23   cav.height = 32;
24
25   for (i = 0; i < MAX_PLAYERS; i++)
26   {
27     cav.player_x[i] = -1;
28     cav.player_y[i] = -1;
29   }
30
31   cav.lenses_cnt_initial = 0;
32   cav.magnify_cnt_initial = 0;
33
34   cav.wheel_cnt_initial = 0;
35   cav.wheel_x_initial = 1;
36   cav.wheel_y_initial = 1;
37
38   cav.wind_time = 9999;
39   cav.wind_cnt_initial = 0;
40
41   cav.wonderwall_state_initial = 0;
42   cav.wonderwall_time_initial = 0;
43
44   cav.num_ball_arrays = 8;
45
46   for (i = 0; i < TILE_MAX; i++)
47     cav.android_array[i] = Xblank;
48
49   /* initial number of players in this level */
50   cav.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 }
58
59
60 /* load cave
61  * 
62  * completely initializes the level structure, ready for a game
63  */
64
65 #define MAX_EM_LEVEL_SIZE               16384
66
67 boolean LoadNativeLevel_EM(char *filename, boolean level_info_only)
68 {
69   unsigned char raw_leveldata[MAX_EM_LEVEL_SIZE];
70   int raw_leveldata_length;
71   int file_version;
72   File *file;
73
74   /* always start with reliable default values */
75   setLevelInfoToDefaults_EM();
76
77   if (!(file = openFile(filename, MODE_READ)))
78   {
79     if (!level_info_only)
80       Error(ERR_WARN, "cannot open level '%s' -- using empty level", filename);
81
82     return FALSE;
83   }
84
85   raw_leveldata_length = readFile(file, raw_leveldata, 1, MAX_EM_LEVEL_SIZE);
86
87   closeFile(file);
88
89   if (raw_leveldata_length <= 0)
90   {
91     Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename);
92
93     return FALSE;
94   }
95
96   file_version = cleanup_em_level(raw_leveldata, raw_leveldata_length,filename);
97
98   if (file_version == FILE_VERSION_EM_UNKNOWN)
99   {
100     Error(ERR_WARN, "unknown EM level '%s' -- using empty level", filename);
101
102     return FALSE;
103   }
104
105   convert_em_level(raw_leveldata, file_version);
106   prepare_em_level();
107
108   return TRUE;
109 }