moved setting android clone data to different function
[rocksndiamonds.git] / src / game_em / convert.c
1 /* 2007-04-04 08:33:37
2  *
3  * convert intermediate cave format to internal cave structure for
4  * use in logic(). initializes entire internal structure.
5  */
6
7 #include "main_em.h"
8
9
10 void prepare_em_level(void)
11 {
12   int i, x, y;
13   int players_left;
14   boolean team_mode;
15
16   /* reset all runtime variables to their initial values */
17
18   game_init_cave_buffers();
19
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;
24
25   /* add linked cave buffer columns for wrap-around movement */
26   for (x = 0; x < lev.left; x++)
27   {
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];
32
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];
37   }
38
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];
42
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];
46
47   lev.time_initial = lev.time_seconds;
48   lev.time = lev.time_initial;
49
50   lev.required = lev.required_initial;
51   lev.score = 0;
52
53   lev.android_move_cnt  = lev.android_move_time;
54   lev.android_clone_cnt = lev.android_clone_time;
55
56   lev.ball_pos = 0;
57   lev.ball_state = lev.ball_state_initial;
58   lev.ball_cnt = lev.ball_time;
59
60   lev.eater_pos = 0;
61   lev.shine_cnt = 0;
62
63   lev.lenses_cnt = lev.lenses_cnt_initial;
64   lev.magnify_cnt = lev.magnify_cnt_initial;
65
66   lev.wheel_cnt = lev.wheel_cnt_initial;
67   lev.wheel_x   = lev.wheel_x_initial;
68   lev.wheel_y   = lev.wheel_y_initial;
69
70   lev.wind_direction = lev.wind_direction_initial;
71   lev.wind_cnt       = lev.wind_cnt_initial;
72
73   lev.wonderwall_state = lev.wonderwall_state_initial;
74   lev.wonderwall_time  = lev.wonderwall_time_initial;
75
76   lev.killed_out_of_time = FALSE;
77
78   if (lev.android_eater)
79   {
80     lev.android_array[Xeater_n]         = Xeater_n;
81     lev.android_array[Yeater_nB]        = Xeater_n;
82
83     lev.android_array[Xeater_e]         = Xeater_e;
84     lev.android_array[Yeater_eB]        = Xeater_e;
85
86     lev.android_array[Xeater_s]         = Xeater_s;
87     lev.android_array[Yeater_sB]        = Xeater_s;
88
89     lev.android_array[Xeater_w]         = Xeater_w;
90     lev.android_array[Yeater_wB]        = Xeater_w;
91   }
92
93   if (lev.android_alien)
94   {
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;
101   }
102
103   if (lev.android_bug)
104   {
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;
110
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;
116
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;
122
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;
128   }
129
130   if (lev.android_tank)
131   {
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;
137
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;
143
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;
149
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;
155   }
156
157   if (lev.android_emerald)
158   {
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;
165   }
166
167   if (lev.android_diamond)
168   {
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;
175   }
176
177   if (lev.android_stone)
178   {
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;
185   }
186
187   if (lev.android_bomb)
188   {
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;
195   }
196
197   if (lev.android_nut)
198   {
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;
205   }
206
207   if (lev.android_spring)
208   {
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;
219   }
220
221   if (lev.android_dynamite)
222   {
223     lev.android_array[Xdynamite]        = Xdynamite;
224   }
225
226   if (lev.android_balloon)
227   {
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;
233   }
234
235   if (lev.android_amoeba)
236   {
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;
247   }
248
249   /* determine number of players in this level */
250   lev.home_initial = 0;
251
252   for (i = 0; i < MAX_PLAYERS; i++)
253   {
254     ply[i].exists = 0;
255     ply[i].alive_initial = FALSE;
256
257     if (ply[i].x_initial != -1 && ply[i].y_initial != -1)
258     {
259       ply[i].exists = 1;
260
261       lev.home_initial++;
262     }
263   }
264
265   team_mode = getTeamMode_EM();
266
267   if (!team_mode)
268     lev.home_initial = 1;
269
270   lev.home = lev.home_initial;
271   players_left = lev.home_initial;
272
273   for (i = 0; i < MAX_PLAYERS; i++)
274   {
275     if (ply[i].exists)
276     {
277       if (players_left)
278       {
279         ply[i].alive_initial = TRUE;
280         players_left--;
281       }
282       else
283       {
284         int x = ply[i].x_initial;
285         int y = ply[i].y_initial;
286
287         native_em_level.cave[x][y] = Xblank;
288
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;
292       }
293     }
294   }
295
296   for (i = 0; i < MAX_PLAYERS; i++)
297   {
298     ply[i].num = i;
299     ply[i].alive = ply[i].alive_initial;
300     ply[i].dynamite = 0;
301     ply[i].dynamite_cnt = 0;
302     ply[i].keys = 0;
303     ply[i].anim = 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;
310   }
311
312   // the following engine variables are initialized to version-specific values
313   // in function InitGameEngine() (src/game.c):
314   //
315   // - game_em.use_single_button (default: TRUE)
316   // - game_em.use_snap_key_bug (default: FALSE)
317
318   game_em.level_solved = FALSE;
319   game_em.game_over = FALSE;
320
321   game_em.any_player_moving = FALSE;
322   game_em.any_player_snapping = FALSE;
323
324   game_em.last_moving_player = 0;       /* default: first player */
325
326   for (i = 0; i < MAX_PLAYERS; i++)
327     game_em.last_player_direction[i] = MV_NONE;
328
329   lev.exit_x = lev.exit_y = -1; /* kludge for playing player exit sound */
330 }