3 * convert intermediate cave format to internal cave structure for
4 * use in logic(). initializes entire internal structure.
10 void prepare_em_level(void)
16 /* reset all runtime variables to their initial values */
18 game_init_cave_buffers();
20 lev.left = CAVE_BUFFER_XOFFSET;
21 lev.top = CAVE_BUFFER_YOFFSET;
22 lev.right = lev.left + lev.width;
23 lev.bottom = lev.top + lev.height;
25 /* add linked cave buffer columns for wrap-around movement */
26 for (x = 0; x < lev.left; x++)
28 lev.cavecol[x] = lev.cavecol[lev.width + x];
29 lev.nextcol[x] = lev.nextcol[lev.width + x];
30 lev.drawcol[x] = lev.drawcol[lev.width + x];
31 lev.boomcol[x] = lev.boomcol[lev.width + x];
33 lev.cavecol[lev.right + x] = lev.cavecol[lev.left + x];
34 lev.nextcol[lev.right + x] = lev.nextcol[lev.left + x];
35 lev.drawcol[lev.right + x] = lev.drawcol[lev.left + x];
36 lev.boomcol[lev.right + x] = lev.boomcol[lev.left + x];
39 for (x = 0; x < lev.width; x++)
40 for (y = 0; y < lev.height; y++)
41 lev.cave[lev.left + x][lev.top + y] = native_em_level.cave[x][y];
43 for (x = lev.left; x < lev.right; x++)
44 for (y = lev.top; y < lev.bottom; y++)
45 lev.next[x][y] = lev.draw[x][y] = lev.cave[x][y];
47 lev.time_initial = lev.time_seconds;
48 lev.time = lev.time_initial;
50 lev.required = lev.required_initial;
53 lev.android_move_cnt = lev.android_move_time;
54 lev.android_clone_cnt = lev.android_clone_time;
57 lev.ball_state = lev.ball_state_initial;
58 lev.ball_cnt = lev.ball_time;
63 lev.lenses_cnt = lev.lenses_cnt_initial;
64 lev.magnify_cnt = lev.magnify_cnt_initial;
66 lev.wheel_cnt = lev.wheel_cnt_initial;
67 lev.wheel_x = lev.wheel_x_initial;
68 lev.wheel_y = lev.wheel_y_initial;
70 lev.wind_direction = lev.wind_direction_initial;
71 lev.wind_cnt = lev.wind_cnt_initial;
73 lev.wonderwall_state = lev.wonderwall_state_initial;
74 lev.wonderwall_time = lev.wonderwall_time_initial;
76 lev.killed_out_of_time = FALSE;
78 if (lev.android_eater)
80 lev.android_array[Xeater_n] = Xeater_n;
81 lev.android_array[Yeater_nB] = Xeater_n;
83 lev.android_array[Xeater_e] = Xeater_e;
84 lev.android_array[Yeater_eB] = Xeater_e;
86 lev.android_array[Xeater_s] = Xeater_s;
87 lev.android_array[Yeater_sB] = Xeater_s;
89 lev.android_array[Xeater_w] = Xeater_w;
90 lev.android_array[Yeater_wB] = Xeater_w;
93 if (lev.android_alien)
95 lev.android_array[Xalien] = Xalien;
96 lev.android_array[Xalien_pause] = Xalien;
97 lev.android_array[Yalien_nB] = Xalien;
98 lev.android_array[Yalien_eB] = Xalien;
99 lev.android_array[Yalien_sB] = Xalien;
100 lev.android_array[Yalien_wB] = Xalien;
105 lev.android_array[Xbug_1_n] = Xbug_2_n;
106 lev.android_array[Xbug_2_n] = Xbug_2_n;
107 lev.android_array[Ybug_nB] = Xbug_2_n;
108 lev.android_array[Ybug_n_e] = Xbug_2_n;
109 lev.android_array[Ybug_n_w] = Xbug_2_n;
111 lev.android_array[Xbug_1_e] = Xbug_2_e;
112 lev.android_array[Xbug_2_e] = Xbug_2_e;
113 lev.android_array[Ybug_eB] = Xbug_2_e;
114 lev.android_array[Ybug_e_s] = Xbug_2_e;
115 lev.android_array[Ybug_e_n] = Xbug_2_e;
117 lev.android_array[Xbug_1_s] = Xbug_2_s;
118 lev.android_array[Xbug_2_s] = Xbug_2_s;
119 lev.android_array[Ybug_sB] = Xbug_2_s;
120 lev.android_array[Ybug_s_w] = Xbug_2_s;
121 lev.android_array[Ybug_s_e] = Xbug_2_s;
123 lev.android_array[Xbug_1_w] = Xbug_2_w;
124 lev.android_array[Xbug_2_w] = Xbug_2_w;
125 lev.android_array[Ybug_wB] = Xbug_2_w;
126 lev.android_array[Ybug_w_n] = Xbug_2_w;
127 lev.android_array[Ybug_w_s] = Xbug_2_w;
130 if (lev.android_tank)
132 lev.android_array[Xtank_1_n] = Xtank_1_n;
133 lev.android_array[Xtank_2_n] = Xtank_1_n;
134 lev.android_array[Ytank_nB] = Xtank_1_n;
135 lev.android_array[Ytank_n_e] = Xtank_1_n;
136 lev.android_array[Ytank_n_w] = Xtank_1_n;
138 lev.android_array[Xtank_1_e] = Xtank_1_e;
139 lev.android_array[Xtank_2_e] = Xtank_1_e;
140 lev.android_array[Ytank_eB] = Xtank_1_e;
141 lev.android_array[Ytank_e_s] = Xtank_1_e;
142 lev.android_array[Ytank_e_n] = Xtank_1_e;
144 lev.android_array[Xtank_1_s] = Xtank_1_s;
145 lev.android_array[Xtank_2_s] = Xtank_1_s;
146 lev.android_array[Ytank_sB] = Xtank_1_s;
147 lev.android_array[Ytank_s_w] = Xtank_1_s;
148 lev.android_array[Ytank_s_e] = Xtank_1_s;
150 lev.android_array[Xtank_1_w] = Xtank_1_w;
151 lev.android_array[Xtank_2_w] = Xtank_1_w;
152 lev.android_array[Ytank_wB] = Xtank_1_w;
153 lev.android_array[Ytank_w_n] = Xtank_1_w;
154 lev.android_array[Ytank_w_s] = Xtank_1_w;
157 if (lev.android_emerald)
159 lev.android_array[Xemerald] = Xemerald;
160 lev.android_array[Xemerald_pause] = Xemerald;
161 lev.android_array[Xemerald_fall] = Xemerald;
162 lev.android_array[Yemerald_sB] = Xemerald;
163 lev.android_array[Yemerald_eB] = Xemerald;
164 lev.android_array[Yemerald_wB] = Xemerald;
167 if (lev.android_diamond)
169 lev.android_array[Xdiamond] = Xdiamond;
170 lev.android_array[Xdiamond_pause] = Xdiamond;
171 lev.android_array[Xdiamond_fall] = Xdiamond;
172 lev.android_array[Ydiamond_sB] = Xdiamond;
173 lev.android_array[Ydiamond_eB] = Xdiamond;
174 lev.android_array[Ydiamond_wB] = Xdiamond;
177 if (lev.android_stone)
179 lev.android_array[Xstone] = Xstone;
180 lev.android_array[Xstone_pause] = Xstone;
181 lev.android_array[Xstone_fall] = Xstone;
182 lev.android_array[Ystone_sB] = Xstone;
183 lev.android_array[Ystone_eB] = Xstone;
184 lev.android_array[Ystone_wB] = Xstone;
187 if (lev.android_bomb)
189 lev.android_array[Xbomb] = Xbomb;
190 lev.android_array[Xbomb_pause] = Xbomb;
191 lev.android_array[Xbomb_fall] = Xbomb;
192 lev.android_array[Ybomb_sB] = Xbomb;
193 lev.android_array[Ybomb_eB] = Xbomb;
194 lev.android_array[Ybomb_wB] = Xbomb;
199 lev.android_array[Xnut] = Xnut;
200 lev.android_array[Xnut_pause] = Xnut;
201 lev.android_array[Xnut_fall] = Xnut;
202 lev.android_array[Ynut_sB] = Xnut;
203 lev.android_array[Ynut_eB] = Xnut;
204 lev.android_array[Ynut_wB] = Xnut;
207 if (lev.android_spring)
209 lev.android_array[Xspring] = Xspring;
210 lev.android_array[Xspring_pause] = Xspring;
211 lev.android_array[Xspring_fall] = Xspring;
212 lev.android_array[Xspring_e] = Xspring;
213 lev.android_array[Xspring_w] = Xspring;
214 lev.android_array[Yspring_sB] = Xspring;
215 lev.android_array[Yspring_eB] = Xspring;
216 lev.android_array[Yspring_wB] = Xspring;
217 lev.android_array[Yspring_alien_eB] = Xspring;
218 lev.android_array[Yspring_alien_wB] = Xspring;
221 if (lev.android_dynamite)
223 lev.android_array[Xdynamite] = Xdynamite;
226 if (lev.android_balloon)
228 lev.android_array[Xballoon] = Xballoon;
229 lev.android_array[Yballoon_nB] = Xballoon;
230 lev.android_array[Yballoon_eB] = Xballoon;
231 lev.android_array[Yballoon_sB] = Xballoon;
232 lev.android_array[Yballoon_wB] = Xballoon;
235 if (lev.android_amoeba)
237 lev.android_array[Xfake_amoeba] = Xdrip;
238 lev.android_array[Yfake_amoeba] = Xdrip;
239 lev.android_array[Xamoeba_1] = Xdrip;
240 lev.android_array[Xamoeba_2] = Xdrip;
241 lev.android_array[Xamoeba_3] = Xdrip;
242 lev.android_array[Xamoeba_4] = Xdrip;
243 lev.android_array[Xamoeba_5] = Xdrip;
244 lev.android_array[Xamoeba_6] = Xdrip;
245 lev.android_array[Xamoeba_7] = Xdrip;
246 lev.android_array[Xamoeba_8] = Xdrip;
249 /* determine number of players in this level */
250 lev.home_initial = 0;
252 for (i = 0; i < MAX_PLAYERS; i++)
255 ply[i].alive_initial = FALSE;
257 if (ply[i].x_initial != -1 && ply[i].y_initial != -1)
265 team_mode = getTeamMode_EM();
268 lev.home_initial = 1;
270 lev.home = lev.home_initial;
271 players_left = lev.home_initial;
273 for (i = 0; i < MAX_PLAYERS; i++)
279 ply[i].alive_initial = TRUE;
284 int x = ply[i].x_initial;
285 int y = ply[i].y_initial;
287 native_em_level.cave[x][y] = Xblank;
289 lev.cave[lev.left + x][lev.top + y] = Xblank;
290 lev.next[lev.left + x][lev.top + y] = Xblank;
291 lev.draw[lev.left + x][lev.top + y] = Xblank;
296 for (i = 0; i < MAX_PLAYERS; i++)
299 ply[i].alive = ply[i].alive_initial;
301 ply[i].dynamite_cnt = 0;
304 ply[i].oldx = ply[i].x = ply[i].x_initial + lev.left;
305 ply[i].oldy = ply[i].y = ply[i].y_initial + lev.top;
306 ply[i].last_move_dir = MV_NONE;
307 ply[i].joy_n = ply[i].joy_e = ply[i].joy_s = ply[i].joy_w = 0;
308 ply[i].joy_snap = ply[i].joy_drop = 0;
309 ply[i].joy_stick = ply[i].joy_spin = 0;
312 // the following engine variables are initialized to version-specific values
313 // in function InitGameEngine() (src/game.c):
315 // - game_em.use_single_button (default: TRUE)
316 // - game_em.use_snap_key_bug (default: FALSE)
318 game_em.level_solved = FALSE;
319 game_em.game_over = FALSE;
321 game_em.any_player_moving = FALSE;
322 game_em.any_player_snapping = FALSE;
324 game_em.last_moving_player = 0; /* default: first player */
326 for (i = 0; i < MAX_PLAYERS; i++)
327 game_em.last_player_direction[i] = MV_NONE;
329 lev.exit_x = lev.exit_y = -1; /* kludge for playing player exit sound */