rnd-19981017-1
[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 XPM_INCLUDE_FILE
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[2] = { DEV_JOYSTICK_0, DEV_JOYSTICK_1 };
46 char           *level_directory = LEVEL_PATH;
47 int             width, height;
48
49 char           *program_name = NULL;
50
51 int             game_status = MAINMENU;
52 int             game_emulation = EMU_NONE;
53 boolean         network_playing = FALSE;
54 int             button_status = MB_NOT_PRESSED;
55 boolean         motion_status = FALSE;
56 int             key_joystick_mapping = 0;
57 int             global_joystick_status = JOYSTICK_STATUS;
58 int             joystick_status = JOYSTICK_STATUS;
59 int             sound_status = SOUND_STATUS;
60 boolean         sound_loops_allowed = FALSE;
61
62 boolean         redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
63 int             redraw_x1 = 0, redraw_y1 = 0;
64 int             redraw_mask;
65 int             redraw_tiles;
66
67 short           Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
68 short           Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
69 short           MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
70 short           MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
71 short           MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
72 short           Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
73 short           Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
74 short           StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
75 short           Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
76 boolean         Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
77 short           JustHit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
78 short           AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
79 short           AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
80 unsigned long   Elementeigenschaften[MAX_ELEMENTS];
81
82 int             level_nr, leveldir_nr, num_leveldirs;
83 int             lev_fieldx,lev_fieldy, scroll_x,scroll_y;
84
85 int             FX = SX, FY = SY, ScrollStepSize = TILEX/8;
86 int             ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0;
87 int             ScreenGfxPos = 0;
88 int             GameFrameDelay = GAME_FRAME_DELAY, MoveSpeed = 8;
89 int             BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1;
90 int             ZX,ZY, ExitX,ExitY;
91 int             AllPlayersGone;
92 int             FrameCounter, TimeFrames, TimeLeft;
93 int             MampferNr, SiebAktiv;
94
95 byte            network_player_action[MAX_PLAYERS];
96 boolean         network_player_action_received = FALSE;
97 int             TestPlayer = 0;
98
99 struct LevelDirInfo     leveldir[MAX_LEVDIR_ENTRIES];
100 struct LevelInfo        level;
101 struct PlayerInfo       stored_player[MAX_PLAYERS+1];
102 struct PlayerInfo      *local_player;
103 struct HiScore          highscore[MAX_SCORE_ENTRIES];
104 struct SoundInfo        Sound[NUM_SOUNDS];
105 struct RecordingInfo    tape;
106 struct OptionInfo       options;
107 struct SetupInfo        setup;
108
109 struct JoystickInfo joystick[2] =
110 {
111   { JOYSTICK_XLEFT, JOYSTICK_XRIGHT, JOYSTICK_XMIDDLE,
112     JOYSTICK_YUPPER, JOYSTICK_YLOWER, JOYSTICK_YMIDDLE },
113   { JOYSTICK_XLEFT, JOYSTICK_XRIGHT, JOYSTICK_XMIDDLE,
114     JOYSTICK_YUPPER, JOYSTICK_YLOWER, JOYSTICK_YMIDDLE }
115 };
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 };
173
174 /* background music */
175 int background_loop[] =
176 {
177   SND_ALCHEMY,
178   SND_CHASE,
179   SND_NETWORK,
180   SND_CZARDASZ,
181   SND_TYGER,
182   SND_VOYAGER,
183   SND_TWILIGHT
184 };
185 int num_bg_loops = sizeof(background_loop)/sizeof(int);
186
187 int main(int argc, char *argv[])
188 {
189   program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]);
190
191 #ifdef MSDOS
192   _fmode = O_BINARY;
193 #endif
194
195   GetOptions(argv);
196   OpenAll(argc,argv);
197   EventLoop();
198   CloseAllAndExit(0);
199   exit(0);      /* to keep compilers happy */
200 }