fixed bug in single button handling causing broken tapes (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
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   /* initial number of players in this level */
49   lev.home_initial = 0;
50
51   for (i = 0; i < MAX_PLAYERS; i++)
52   {
53     ply[i].exists = 0;
54     ply[i].alive_initial = FALSE;
55   }
56 }
57
58
59 /* load cave
60  * 
61  * completely initializes the level structure, ready for a game
62  */
63
64 #define MAX_EM_LEVEL_SIZE               16384
65
66 boolean LoadNativeLevel_EM(char *filename, boolean level_info_only)
67 {
68   unsigned char raw_leveldata[MAX_EM_LEVEL_SIZE];
69   int raw_leveldata_length;
70   int file_version;
71   File *file;
72
73   /* always start with reliable default values */
74   setLevelInfoToDefaults_EM();
75
76   if (!(file = openFile(filename, MODE_READ)))
77   {
78     if (!level_info_only)
79       Error(ERR_WARN, "cannot open level '%s' -- using empty level", filename);
80
81     return FALSE;
82   }
83
84   raw_leveldata_length = readFile(file, raw_leveldata, 1, MAX_EM_LEVEL_SIZE);
85
86   closeFile(file);
87
88   if (raw_leveldata_length <= 0)
89   {
90     Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename);
91
92     return FALSE;
93   }
94
95   file_version = cleanup_em_level(raw_leveldata, raw_leveldata_length,filename);
96
97   if (file_version == FILE_VERSION_EM_UNKNOWN)
98   {
99     Error(ERR_WARN, "unknown EM level '%s' -- using empty level", filename);
100
101     return FALSE;
102   }
103
104   convert_em_level(raw_leveldata, file_version);
105   prepare_em_level();
106
107   return TRUE;
108 }