rnd-19990219-2
[rocksndiamonds.git] / src / main.c
1 /***********************************************************
2 *  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
3 *----------------------------------------------------------*
4 *  (c) 1995-98 Artsoft Entertainment                       *
5 *              Holger Schemel                              *
6 *              Oststrasse 11a                              *
7 *              33604 Bielefeld                             *
8 *              phone: ++49 +521 290471                     *
9 *              email: aeglos@valinor.owl.de                *
10 *----------------------------------------------------------*
11 *  main.c                                                  *
12 ***********************************************************/
13
14 #include "main.h"
15 #include "init.h"
16 #include "game.h"
17 #include "events.h"
18 #include "sound.h"
19 #include "joystick.h"
20 #include "misc.h"
21
22 #ifdef MSDOS
23 #include <fcntl.h>
24 #endif
25
26 Display        *display;
27 Visual         *visual;
28 int             screen;
29 Window          window;
30 GC              gc, clip_gc[NUM_PIXMAPS], tile_clip_gc;
31 Pixmap          pix[NUM_PIXMAPS];
32 Pixmap          clipmask[NUM_PIXMAPS], tile_clipmask[NUM_TILES];
33
34 #ifdef USE_XPM_LIBRARY
35 XpmAttributes   xpm_att[NUM_PICTURES];
36 #endif
37
38 Drawable        drawto, drawto_field, backbuffer, fieldbuffer;
39 Colormap        cmap;
40
41 int             sound_pipe[2];
42 int             sound_device;
43 char           *sound_device_name = SOUND_DEVICE;
44 int             joystick_device = 0;
45 char           *joystick_device_name[MAX_PLAYERS] =
46 {
47   DEV_JOYSTICK_0,
48   DEV_JOYSTICK_1,
49   DEV_JOYSTICK_2,
50   DEV_JOYSTICK_3
51 };
52
53 char           *program_name = NULL;
54
55 int             game_status = MAINMENU;
56 boolean         level_editor_test_game = FALSE;
57 boolean         network_playing = FALSE;
58 int             button_status = MB_NOT_PRESSED;
59 boolean         motion_status = FALSE;
60 int             key_joystick_mapping = 0;
61 int             global_joystick_status = JOYSTICK_STATUS;
62 int             joystick_status = JOYSTICK_STATUS;
63 int             sound_status = SOUND_STATUS;
64 boolean         sound_loops_allowed = FALSE;
65
66 boolean         redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
67 int             redraw_x1 = 0, redraw_y1 = 0;
68 int             redraw_mask;
69 int             redraw_tiles;
70
71 short           Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
72 short           Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
73 short           MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
74 short           MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
75 short           MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
76 short           Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
77 short           Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
78 short           StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
79 short           Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
80 boolean         Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
81 short           JustHit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
82 short           AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
83 short           AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
84 unsigned long   Elementeigenschaften[MAX_ELEMENTS];
85
86 int             level_nr, leveldir_nr, num_leveldirs;
87 int             lev_fieldx,lev_fieldy, scroll_x,scroll_y;
88
89 int             FX = SX, FY = SY, ScrollStepSize;
90 int             ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0;
91 int             ScreenGfxPos = 0;
92 int             BorderElement = EL_BETON;
93 int             GameFrameDelay = GAME_FRAME_DELAY;
94 int             FfwdFrameDelay = FFWD_FRAME_DELAY;
95 int             BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1;
96 int             SBX_Left, SBX_Right;
97 int             SBY_Upper, SBY_Lower;
98 int             ZX,ZY, ExitX,ExitY;
99 int             AllPlayersGone;
100 int             FrameCounter, TimeFrames, TimePlayed, TimeLeft;
101
102 boolean         network_player_action_received = FALSE;
103
104 struct LevelDirInfo     leveldir[MAX_LEVDIR_ENTRIES];
105 struct LevelInfo        level;
106 struct PlayerInfo       stored_player[MAX_PLAYERS], *local_player = NULL;
107 struct HiScore          highscore[MAX_SCORE_ENTRIES];
108 struct SoundInfo        Sound[NUM_SOUNDS];
109 struct TapeInfo         tape;
110 struct OptionInfo       options;
111 struct SetupInfo        setup;
112 struct SetupFileList    *setup_list = NULL;
113 struct SetupFileList    *level_setup_list = NULL;
114 struct GameInfo         game;
115 struct GlobalInfo       global;
116
117 /* data needed for playing sounds */
118 char *sound_name[NUM_SOUNDS] =
119 {
120   "alchemy",
121   "amoebe",
122   "antigrav",
123   "autsch",
124   "blurb",
125   "bong",
126   "buing",
127   "chase",
128   "czardasz",
129   "deng",
130   "fuel",
131   "gong",
132   "halloffame",
133   "holz",
134   "hui",
135   "kabumm",
136   "kink",
137   "klapper",
138   "kling",
139   "klopf",
140   "klumpf",
141   "knack",
142   "knurk",
143   "krach",
144   "lachen",
145   "laser",
146   "miep",
147   "network",
148   "njam",
149   "oeffnen",
150   "pling",
151   "pong",
152   "pusch",
153   "quiek",
154   "quirk",
155   "rhythmloop",
156   "roaaar",
157   "roehr",
158   "rumms",
159   "schlopp",
160   "schlurf",
161   "schrff",
162   "schwirr",
163   "sirr",
164   "slurp",
165   "sproing",
166   "twilight",
167   "tyger",
168   "voyager",
169   "warnton",
170   "whoosh",
171   "zisch",
172   "base",
173   "infotron",
174   "zonkdown",
175   "zonkpush",
176   "bug",
177   "boom",
178   "booom",
179   "exit",
180   "empty"
181 };
182
183 /* background music */
184 int background_loop[] =
185 {
186   SND_ALCHEMY,
187   SND_CHASE,
188   SND_NETWORK,
189   SND_CZARDASZ,
190   SND_TYGER,
191   SND_VOYAGER,
192   SND_TWILIGHT
193 };
194 int num_bg_loops = sizeof(background_loop)/sizeof(int);
195
196 char *element_info[] =
197 {
198   "empty space",
199   "sand",
200   "normal wall",
201   "round wall",
202   "rock",
203   "key",
204   "emerald",
205   "closed exit",
206   "player",
207   "bug",
208   "spaceship",
209   "yam yam",
210   "robot",
211   "steel wall",
212   "diamond",
213   "dead amoeba",
214   "empty quicksand",
215   "quicksand with rock",
216   "amoeba drop",
217   "bomb",
218   "magic wall",
219   "speed ball",
220   "acid pool",
221   "dropping amoeba",
222   "normal amoeba",
223   "nut with emerald",
224   "life wall",
225   "biomaze",
226   "burning dynamite",
227   "unknown",
228   "magic wheel",
229   "running wire",
230   "red key",
231   "yellow key",
232   "green key",
233   "blue key",
234   "red door",
235   "yellow door",
236   "green door",
237   "blue door",
238   "grey door (opened by red key)",
239   "grey door (opened by yellow key)",
240   "grey door (opened by green key)",
241   "grey door (opened by blue key)",
242   "dynamite",
243   "pac man",
244   "invisible normal wall",
245   "light bulb (dark)",
246   "ligh bulb (glowing)",
247   "wall with emerald",
248   "wall with diamond",
249   "amoeba with content",
250   "amoeba (BD style)",
251   "time orb (full)",
252   "time orb (empty)",
253   "growing wall",
254   "diamond (BD style)",
255   "yellow emerald",
256   "wall with BD style diamond",
257   "wall with yellow emerald",
258   "dark yam yam",
259   "magic wall (BD style)",
260   "invisible steel wall",
261   "dynabomb",
262   "increases number of bombs",
263   "increases explosion size",
264   "increases power of explosion",
265   "sokoban object",
266   "sokoban empty field",
267   "sokoban field with object",
268   "butterfly (starts moving right)",
269   "butterfly (starts moving up)",
270   "butterfly (starts moving left)",
271   "butterfly (starts moving down)",
272   "firefly (starts moving right)",
273   "firefly (starts moving up)",
274   "firefly (starts moving left)",
275   "firefly (starts moving down)",
276   "butterfly",
277   "firefly",
278   "yellow player",
279   "red player",
280   "green player",
281   "blue player",
282   "bug (starts moving right)",
283   "bug (starts moving up)",
284   "bug (starts moving left)",
285   "bug (starts moving down)",
286   "spaceship (starts moving right)",
287   "spaceship (starts moving up)",
288   "spaceship (starts moving left)",
289   "spaceship (starts moving down)",
290   "pac man (starts moving right)",
291   "pac man (starts moving up)",
292   "pac man (starts moving left)",
293   "pac man (starts moving down)",
294   "red emerald",
295   "violet emerald",
296   "wall with red emerald",
297   "wall with violet emerald",
298   "unknown",
299   "unknown",
300   "unknown",
301   "unknown",
302   "unknown",
303   "unknown",
304   "unknown",
305   "open exit",
306   "unknown",
307   "amoeba",
308   "mole",
309   "penguin",
310   "satellite",
311   "arrow left",
312   "arrow right",
313   "arrow up",
314   "arrow down",
315   "pig",
316   "fire breathing dragon",
317   "unknown",
318   "letter ' '",
319   "letter '!'",
320   "letter '\"'",
321   "letter '#'",
322   "letter '$'",
323   "letter '%'",
324   "letter '&'",
325   "letter '''",
326   "letter '('",
327   "letter ')'",
328   "letter '*'",
329   "letter '+'",
330   "letter ','",
331   "letter '-'",
332   "letter '.'",
333   "letter '/'",
334   "letter '0'",
335   "letter '1'",
336   "letter '2'",
337   "letter '3'",
338   "letter '4'",
339   "letter '5'",
340   "letter '6'",
341   "letter '7'",
342   "letter '8'",
343   "letter '9'",
344   "letter ':'",
345   "letter ';'",
346   "letter '<'",
347   "letter '='",
348   "letter '>'",
349   "letter '?'",
350   "letter '@'",
351   "letter 'A'",
352   "letter 'B'",
353   "letter 'C'",
354   "letter 'D'",
355   "letter 'E'",
356   "letter 'F'",
357   "letter 'G'",
358   "letter 'H'",
359   "letter 'I'",
360   "letter 'J'",
361   "letter 'K'",
362   "letter 'L'",
363   "letter 'M'",
364   "letter 'N'",
365   "letter 'O'",
366   "letter 'P'",
367   "letter 'Q'",
368   "letter 'R'",
369   "letter 'S'",
370   "letter 'T'",
371   "letter 'U'",
372   "letter 'V'",
373   "letter 'W'",
374   "letter 'X'",
375   "letter 'Y'",
376   "letter 'Z'",
377   "letter 'Ä'",
378   "letter 'Ö'",
379   "letter 'Ü'",
380   "letter '^'",
381   "letter ''",
382   "letter ''",
383   "letter ''",
384   "letter ''",
385   "letter ''",
386   "letter ''",
387   "letter ''",
388   "letter ''",
389   "letter ''",
390   "letter ''",
391   "letter ''",
392   "letter ''",
393   "letter ''",
394   "letter ''",
395   "letter ''",
396   "letter ''",
397   "letter ''",
398   "growing wall (horizontally)",
399   "growing wall (vertically)",
400   "growing wall (all directions)",
401   "unused",
402   "unused",
403   "unused",
404   "unused",
405   "unused",
406   "unused",
407   "unused",
408   "empty space",
409   "zonk",
410   "base",
411   "murphy",
412   "infotron",
413   "chip (single)",
414   "hardware",
415   "exit",
416   "orange disk",
417   "port (leading right)",
418   "port (leading down)",
419   "port (leading left)",
420   "port (leading up)",
421   "port (leading right)",
422   "port (leading down)",
423   "port (leading left)",
424   "port (leading up)",
425   "snik snak",
426   "yellow disk",
427   "terminal",
428   "red disk",
429   "port (vertically)",
430   "port (horizontally)",
431   "port (all directions)",
432   "electron",
433   "buggy base",
434   "chip (left half)",
435   "chip (right half)",
436   "hardware",
437   "hardware",
438   "hardware",
439   "hardware",
440   "hardware",
441   "hardware",
442   "hardware",
443   "hardware",
444   "hardware",
445   "hardware",
446   "chip (upper half)",
447   "chip (lower half)",
448   "unknown",
449   "unknown",
450   "unknown",
451   "unknown",
452   "unknown",
453   "unknown"
454 };
455
456 int main(int argc, char *argv[])
457 {
458   program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]);
459
460 #ifdef MSDOS
461   _fmode = O_BINARY;
462 #endif
463
464   GetOptions(argv);
465   OpenAll(argc,argv);
466   EventLoop();
467   CloseAllAndExit(0);
468   exit(0);      /* to keep compilers happy */
469 }