rnd-20060319-2-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 boolean LoadNativeLevel_EM(char *filename)
78 {
79   unsigned char raw_leveldata[MAX_EM_LEVEL_SIZE];
80   int raw_leveldata_length;
81   int file_version;
82   FILE *file;
83
84   /* always start with reliable default values */
85   setLevelInfoToDefaults_EM();
86
87   if (!(file = fopen(filename, MODE_READ)))
88   {
89     Error(ERR_WARN, "cannot open level '%s' -- using empty level", filename);
90
91     return FALSE;
92   }
93
94   raw_leveldata_length = fread(raw_leveldata, 1, MAX_EM_LEVEL_SIZE, file);
95
96   fclose(file);
97
98   if (raw_leveldata_length <= 0)
99   {
100     Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename);
101
102     return FALSE;
103   }
104
105   if (!(file_version = cleanup_em_level(raw_leveldata, raw_leveldata_length)))
106   {
107     Error(ERR_WARN, "unknown EM level '%s' -- using empty level", filename);
108
109     return FALSE;
110   }
111
112   convert_em_level(raw_leveldata, file_version);
113   prepare_em_level();
114
115   return TRUE;
116 }