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