1 /***********************************************************
2 * Mirror Magic -- McDuffin's Revenge *
3 *----------------------------------------------------------*
4 * (c) 1994-2001 Artsoft Entertainment *
5 * Holger Schemel *
6 * Detmolder Strasse 189 *
7 * 33604 Bielefeld *
8 * Germany *
9 * e-mail: info@artsoft.org *
10 *----------------------------------------------------------*
11 * main.c *
12 ***********************************************************/
13
14 #include "libgame/libgame.h"
15
16 #include "main.h"
17 #include "init.h"
18 #include "game.h"
19 #include "events.h"
20
21 GC tile_clip_gc, line_gc[2];
22 Bitmap *pix[NUM_BITMAPS];
23 Pixmap tile_clipmask[NUM_TILES];
24 DrawBuffer *fieldbuffer;
25 DrawBuffer *drawto_field;
26
27 int game_status = MAINMENU;
28 boolean level_editor_test_game = FALSE;
29 boolean network_playing = FALSE;
30
31 int key_joystick_mapping = 0;
32
33 boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
34 int redraw_x1 = 0, redraw_y1 = 0;
35
36 short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
37 short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
38 short Hit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
39 short Box[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
40 short Angle[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
41
42 short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
43 short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
44 short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
45 short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
46 short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
47 short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
48 short Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
49 boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
50 short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
51 short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
52 short AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
53 unsigned long Elementeigenschaften[MAX_ELEMENTS];
54
55 int level_nr;
56 int lev_fieldx,lev_fieldy, scroll_x,scroll_y;
57
58 int FX = SX, FY = SY, ScrollStepSize;
59 int ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0;
60 int ScreenGfxPos = 0;
61 int GameFrameDelay = GAME_FRAME_DELAY;
62 int FfwdFrameDelay = FFWD_FRAME_DELAY;
63 int BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1;
64 int SBX_Left, SBX_Right;
65 int SBY_Upper, SBY_Lower;
66 int ZX,ZY, ExitX,ExitY;
67 int AllPlayersGone;
68 int TimeFrames, TimePlayed, TimeLeft;
69
70 #if 0
71 boolean network_player_action_received = FALSE;
72 #endif
73
74 struct LevelInfo level;
75 #if 0
76 struct PlayerInfo stored_player[MAX_PLAYERS], *local_player = NULL;
77 #endif
78 struct HiScore highscore[MAX_SCORE_ENTRIES];
79 struct SetupInfo setup;
80 struct GameInfo game;
81 struct LaserInfo laser;
82 struct EditorInfo editor;
83 struct GlobalInfo global;
84
85 short LX,LY, XS,YS, ELX,ELY;
86 short CT,Ct;
87
88 Pixel pen_fg, pen_bg, pen_ray, pen_magicolor[2];
89 int color_status;
90
91 struct XY Step[16] =
92 {
93 { 1, 0 },
94 { 2, -1 },
95 { 1, -1 },
96 { 1, -2 },
97 { 0, -1 },
98 { -1, -2 },
99 { -1, -1 },
100 { -2, -1 },
101 { -1, 0 },
102 { -2, 1 },
103 { -1, 1 },
104 { -1, 2 },
105 { 0, 1 },
106 { 1, 2 },
107 { 1, 1 },
108 { 2, 1 }
109 };
110
111 /* "Sign" has the following structure:
112
113 each 4-bit-value represents the values d*8 + c*4 + b*2 + a*1
114 at the pixel positions
115
116 a b 1 2
117 c d 4 8
118
119 so the value "0xA" (=> (d=1)*8 + (c=0)*4 + (b=1)*2 + (a=0)*1)
120 would result in the pixel pattern
121
122 0 1 _ x
123 0 1 or _ x
124
125 x x x x x x x x x x
126 x _ x x _ _ x x _ x
127 6 2
128 x x 5 4 3 x x
129 x x 7 1 x x
130
131 x _ _ x
132 x _ 8 0 _ x
133
134 x x 9 15 x x
135 x x 11 12 13 x x
136 10 14
137 x _ x x _ _ x x _ x
138 x x x x x x x x x x
139
140 */
141
142 short Sign[16] =
143 {
144 0xA,0xF,0xB,0xF,
145 0x3,0xF,0x7,0xF,
146 0x5,0xF,0xD,0xF,
147 0xC,0xF,0xE,0xF
148 };
149
150
151 /* data needed for playing sounds */
152 char *sound_name[NUM_SOUNDS] =
153 {
154 "amoebe.wav",
155 "antigrav.wav",
156 "autsch.wav",
157 "bong.wav",
158 "fuel.wav",
159 "halloffame.wav",
160 "holz.wav",
161 "hui.wav",
162 "kabumm.wav",
163 "kink.wav",
164 "kling.wav",
165 "laser.wav",
166 "oeffnen.wav",
167 "quiek.wav",
168 "rhythmloop.wav",
169 "roaaar.wav",
170 "sirr.wav",
171 "slurp.wav",
172 "warnton.wav",
173 "whoosh.wav"
174 };
175
176 /* background music */
177 int background_loop[] =
178 {
179 #if 0
180 SND_TYGER,
181 SND_VOYAGER,
182 #endif
183 };
184 int num_bg_loops = sizeof(background_loop)/sizeof(int);
185
186 char *element_info[] =
187 {
188 "empty space", /* 0 */
189 "mirror (0�)",
190 "mirror (11.25�)",
191 "mirror (22.5�)",
192 "mirror (33.75�)",
193 "mirror (45�)",
194 "mirror (56.25�)",
195 "mirror (67.5�)",
196 "mirror (78.75�)",
197 "mirror (90�)",
198 "mirror (101.25�)", /* 10 */
199 "mirror (112.5�)",
200 "mirror (123.75�)",
201 "mirror (135�)",
202 "mirror (146.25�)",
203 "mirror (157.5�)",
204 "mirror (168.75�)",
205 "fixed steel polarisator (0�)",
206 "fixed steel polarisator (90�)",
207 "fixed steel polarisator (45�)",
208 "fixed steel polarisator (135�)", /* 20 */
209 "Gregor McDuffin (looking right)",
210 "Gregor McDuffin (looking up)",
211 "Gregor McDuffin (looking left)",
212 "Gregor McDuffin (looking down)",
213 "closed exit",
214 "opening exit",
215 "opening exit",
216 "open exit",
217 "magic kettle",
218 "bomb", /* 30 */
219 "prism",
220 "steel wall",
221 "steel wall",
222 "steel wall",
223 "steel wall",
224 "steel wall",
225 "steel wall",
226 "steel wall",
227 "steel wall",
228 "steel wall", /* 40 */
229 "steel wall",
230 "steel wall",
231 "steel wall",
232 "steel wall",
233 "steel wall",
234 "steel wall",
235 "steel wall",
236 "wooden wall",
237 "wooden wall",
238 "wooden wall", /* 50 */
239 "wooden wall",
240 "wooden wall",
241 "wooden wall",
242 "wooden wall",
243 "wooden wall",
244 "wooden wall",
245 "wooden wall",
246 "wooden wall",
247 "wooden wall",
248 "wooden wall", /* 60 */
249 "wooden wall",
250 "wooden wall",
251 "wooden wall",
252 "ice wall",
253 "ice wall",
254 "ice wall",
255 "ice wall",
256 "ice wall",
257 "ice wall",
258 "ice wall", /* 70 */
259 "ice wall",
260 "ice wall",
261 "ice wall",
262 "ice wall",
263 "ice wall",
264 "ice wall",
265 "ice wall",
266 "ice wall",
267 "ice wall",
268 "amoeba wall", /* 80 */
269 "amoeba wall",
270 "amoeba wall",
271 "amoeba wall",
272 "amoeba wall",
273 "amoeba wall",
274 "amoeba wall",
275 "amoeba wall",
276 "amoeba wall",
277 "amoeba wall",
278 "amoeba wall", /* 90 */
279 "amoeba wall",
280 "amoeba wall",
281 "amoeba wall",
282 "amoeba wall",
283 "amoeba wall",
284 "wooden block",
285 "gray ball",
286 "beamer (0�)",
287 "beamer (22.5�)",
288 "beamer (45�)", /* 100 */
289 "beamer (67.5�)",
290 "beamer (90�)",
291 "beamer (112.5�)",
292 "beamer (135�)",
293 "beamer (157.5�)",
294 "beamer (180�)",
295 "beamer (202.5�)",
296 "beamer (225�)",
297 "beamer (247.5�)",
298 "beamer (270�)", /* 110 */
299 "beamer (292.5�)",
300 "beamer (315�)",
301 "beamer (337.5�)",
302 "fuse",
303 "pac man (starts moving right)",
304 "pac man (starts moving up)",
305 "pac man (starts moving left)",
306 "pac man (starts moving down)",
307 "polarisator (0�)",
308 "polarisator (11.25�)", /* 120 */
309 "polarisator (22.5�)",
310 "polarisator (33.75�)",
311 "polarisator (45�)",
312 "polarisator (56.25�)",
313 "polarisator (67.5�)",
314 "polarisator (78.75�)",
315 "polarisator (90�)",
316 "polarisator (101.25�)",
317 "polarisator (112.5�)",
318 "polarisator (123.75�)", /* 130 */
319 "polarisator (135�)",
320 "polarisator (146.25�)",
321 "polarisator (157.5�)",
322 "polarisator (168.75�)",
323 "two-way polarisator (0�)",
324 "two-way polarisator (22.5�)",
325 "two-way polarisator (45�)",
326 "two-way polarisator (67.5�)",
327 "fixed mirror (0�)",
328 "fixed mirror (45�)", /* 140 */
329 "fixed mirror (90�)",
330 "fixed mirror (135�)",
331 "reflecting stone lock",
332 "key",
333 "light bulb (dark)",
334 "ligh bulb (glowing)",
335 "bonus ball",
336 "reflecting stone block",
337 "wooden lock",
338 "extra energy ball (full)", /* 150 */
339 "fixed wooden polarisator (0�)",
340 "fixed wooden polarisator (90�)",
341 "fixed wooden polarisator (45�)",
342 "fixed wooden polarisator (135�)",
343 "extra energy ball (empty)",
344 "unused",
345 "unused",
346 "unused",
347 "unused",
348 "letter ' '", /* 160 */
349 "letter '!'",
350 "letter '\"'",
351 "letter '#'",
352 "letter '$'",
353 "letter '%'",
354 "letter '&'",
355 "letter '''",
356 "letter '('",
357 "letter ')'",
358 "letter '*'", /* 170 */
359 "letter '+'",
360 "letter ','",
361 "letter '-'",
362 "letter '.'",
363 "letter '/'",
364 "letter '0'",
365 "letter '1'",
366 "letter '2'",
367 "letter '3'",
368 "letter '4'", /* 180 */
369 "letter '5'",
370 "letter '6'",
371 "letter '7'",
372 "letter '8'",
373 "letter '9'",
374 "letter ':'",
375 "letter ';'",
376 "letter '<'",
377 "letter '='",
378 "letter '>'", /* 190 */
379 "letter '?'",
380 "letter '@'",
381 "letter 'A'",
382 "letter 'B'",
383 "letter 'C'",
384 "letter 'D'",
385 "letter 'E'",
386 "letter 'F'",
387 "letter 'G'",
388 "letter 'H'", /* 200 */
389 "letter 'I'",
390 "letter 'J'",
391 "letter 'K'",
392 "letter 'L'",
393 "letter 'M'",
394 "letter 'N'",
395 "letter 'O'",
396 "letter 'P'",
397 "letter 'Q'",
398 "letter 'R'", /* 210 */
399 "letter 'S'",
400 "letter 'T'",
401 "letter 'U'",
402 "letter 'V'",
403 "letter 'W'",
404 "letter 'X'",
405 "letter 'Y'",
406 "letter 'Z'",
407 "letter '�'",
408 "letter '�'", /* 220 */
409 "letter '�'",
410 "letter '^'",
411 "letter ''",
412 "letter ''",
413 "letter ''",
414 "letter ''",
415 "letter ''",
416 "letter ''",
417 "letter ''",
418 "letter ''", /* 230 */
419 "letter ''",
420 "letter ''",
421 "letter ''",
422 "letter ''",
423 "letter ''",
424 "letter ''",
425 "letter ''",
426 "letter ''",
427 "letter ''",
428 "mirror (0�)", /* 240 */
429 "mirror (11.25�)",
430 "mirror (22.5�)",
431 "mirror (33.75�)",
432 "mirror (45�)",
433 "mirror (56.25�)",
434 "mirror (67.5�)",
435 "mirror (78.75�)",
436 "mirror (90�)",
437 "mirror (101.25�)",
438 "mirror (112.5�)", /* 250 */
439 "mirror (123.75�)",
440 "mirror (135�)",
441 "mirror (146.25�)",
442 "mirror (157.5�)",
443 "mirror (168.75�)",
444 "fixed wooden polarisator (0�)",
445 "fixed wooden polarisator (22.5�)",
446 "fixed wooden polarisator (45�)",
447 "fixed wooden polarisator (67.5�)",
448 "fixed wooden polarisator (90�)", /* 260 */
449 "fixed wooden polarisator (112.5�)",
450 "fixed wooden polarisator (135�)",
451 "fixed wooden polarisator (157.5�)",
452 "fixed steel polarisator (0�)",
453 "fixed steel polarisator (22.5�)",
454 "fixed steel polarisator (45�)",
455 "fixed steel polarisator (67.5�)",
456 "fixed steel polarisator (90�)",
457 "fixed steel polarisator (112.5�)",
458 "fixed steel polarisator (135�)", /* 270 */
459 "fixed steel polarisator (157.5�)",
460 "deflektor style wooden wall",
461 "deflektor style wooden wall",
462 "deflektor style wooden wall",
463 "deflektor style wooden wall",
464 "deflektor style wooden wall",
465 "deflektor style wooden wall",
466 "deflektor style wooden wall",
467 "deflektor style wooden wall",
468 "deflektor style wooden wall", /* 280 */
469 "deflektor style wooden wall",
470 "deflektor style wooden wall",
471 "deflektor style wooden wall",
472 "deflektor style wooden wall",
473 "deflektor style wooden wall",
474 "deflektor style wooden wall",
475 "deflektor style wooden wall",
476 "deflektor style steel wall",
477 "deflektor style steel wall",
478 "deflektor style steel wall", /* 290 */
479 "deflektor style steel wall",
480 "deflektor style steel wall",
481 "deflektor style steel wall",
482 "deflektor style steel wall",
483 "deflektor style steel wall",
484 "deflektor style steel wall",
485 "deflektor style steel wall",
486 "deflektor style steel wall",
487 "deflektor style steel wall",
488 "deflektor style steel wall", /* 300 */
489 "deflektor style steel wall",
490 "deflektor style steel wall",
491 "deflektor style steel wall",
492 "empty space",
493 "cell",
494 "mine",
495 "refractor",
496 "laser cannon (shooting right)",
497 "laser cannon (shooting up)",
498 "laser cannon (shooting left)", /* 310 */
499 "laser cannon (shooting down)",
500 "laser receiver (directed right)",
501 "laser receiver (directed up)",
502 "laser receiver (directed left)",
503 "laser receiver (directed down)",
504 "fibre optic (1a)",
505 "fibre optic (1b)",
506 "fibre optic (2a)",
507 "fibre optic (2b)",
508 "fibre optic (3a)", /* 320 */
509 "fibre optic (3b)",
510 "fibre optic (4a)",
511 "fibre optic (4b)",
512 "rotating mirror (0�)",
513 "rotating mirror (11.25�)",
514 "rotating mirror (22.5�)",
515 "rotating mirror (33.75�)",
516 "rotating mirror (45�)",
517 "rotating mirror (56.25�)",
518 "rotating mirror (67.5�)", /* 330 */
519 "rotating mirror (78.75�)",
520 "rotating mirror (90�)",
521 "rotating mirror (101.25�)",
522 "rotating mirror (112.5�)",
523 "rotating mirror (123.75�)",
524 "rotating mirror (135�)",
525 "rotating mirror (146.25�)",
526 "rotating mirror (157.5�)",
527 "rotating mirror (168.75�)",
528 "rotating wooden polarisator (0�)", /* 340 */
529 "rotating wooden polarisator (22.5�)",
530 "rotating wooden polarisator (45�)",
531 "rotating wooden polarisator (67.5�)",
532 "rotating wooden polarisator (90�)",
533 "rotating wooden polarisator (112.5�)",
534 "rotating wooden polarisator (135�)",
535 "rotating wooden polarisator (157.5�)",
536 "rotating steel polarisator (0�)",
537 "rotating steel polarisator (22.5�)",
538 "rotating steel polarisator (45�)", /* 350 */
539 "rotating steel polarisator (67.5�)",
540 "rotating steel polarisator (90�)",
541 "rotating steel polarisator (112.5�)",
542 "rotating steel polarisator (135�)",
543 "rotating steel polarisator (157.5�)",
544 "red beamer (0�)",
545 "red beamer (22.5�)",
546 "red beamer (45�)",
547 "red beamer (67.5�)",
548 "red beamer (90�)", /* 360 */
549 "red beamer (112.5�)",
550 "red beamer (135�)",
551 "red beamer (157.5�)",
552 "red beamer (180�)",
553 "red beamer (202.5�)",
554 "red beamer (225�)",
555 "red beamer (247.5�)",
556 "red beamer (270�)",
557 "red beamer (292.5�)",
558 "red beamer (315�)", /* 370 */
559 "red beamer (337.5�)",
560 "yellow beamer (0�)",
561 "yellow beamer (22.5�)",
562 "yellow beamer (45�)",
563 "yellow beamer (67.5�)",
564 "yellow beamer (90�)",
565 "yellow beamer (112.5�)",
566 "yellow beamer (135�)",
567 "yellow beamer (157.5�)",
568 "yellow beamer (180�)", /* 380 */
569 "yellow beamer (202.5�)",
570 "yellow beamer (225�)",
571 "yellow beamer (247.5�)",
572 "yellow beamer (270�)",
573 "yellow beamer (292.5�)",
574 "yellow beamer (315�)",
575 "yellow beamer (337.5�)",
576 "green beamer (0�)",
577 "green beamer (22.5�)",
578 "green beamer (45�)", /* 390 */
579 "green beamer (67.5�)",
580 "green beamer (90�)",
581 "green beamer (112.5�)",
582 "green beamer (135�)",
583 "green beamer (157.5�)",
584 "green beamer (180�)",
585 "green beamer (202.5�)",
586 "green beamer (225�)",
587 "green beamer (247.5�)",
588 "green beamer (270�)", /* 400 */
589 "green beamer (292.5�)",
590 "green beamer (315�)",
591 "green beamer (337.5�)",
592 "blue beamer (0�)",
593 "blue beamer (22.5�)",
594 "blue beamer (45�)",
595 "blue beamer (67.5�)",
596 "blue beamer (90�)",
597 "blue beamer (112.5�)",
598 "blue beamer (135�)", /* 410 */
599 "blue beamer (157.5�)",
600 "blue beamer (180�)",
601 "blue beamer (202.5�)",
602 "blue beamer (225�)",
603 "blue beamer (247.5�)",
604 "blue beamer (270�)",
605 "blue beamer (292.5�)",
606 "blue beamer (315�)",
607 "blue beamer (337.5�)",
608 "unknown", /* 420 */
609
610 /*
611 "-------------------------------",
612 */
613 };
614 int num_element_info = sizeof(element_info)/sizeof(char *);
615
616
617 /* ========================================================================= */
618 /* main() */
619 /* ========================================================================= */
620
main(int argc,char * argv[])621 int main(int argc, char *argv[])
622 {
623 InitCommandName(argv[0]);
624 InitExitFunction(CloseAllAndExit);
625 InitPlatformDependantStuff();
626
627 GetOptions(argv);
628 OpenAll();
629
630 EventLoop();
631 CloseAllAndExit(0);
632 exit(0); /* to keep compilers happy */
633 }
634