/mirrormagic-2.0.2/src/main.c
C | 633 lines | 556 code | 27 blank | 50 comment | 0 complexity | 03905be8109529b373c144f67a4eda3c MD5 | raw file
Possible License(s): GPL-2.0
- /***********************************************************
- * Mirror Magic -- McDuffin's Revenge *
- *----------------------------------------------------------*
- * (c) 1994-2001 Artsoft Entertainment *
- * Holger Schemel *
- * Detmolder Strasse 189 *
- * 33604 Bielefeld *
- * Germany *
- * e-mail: info@artsoft.org *
- *----------------------------------------------------------*
- * main.c *
- ***********************************************************/
- #include "libgame/libgame.h"
- #include "main.h"
- #include "init.h"
- #include "game.h"
- #include "events.h"
- GC tile_clip_gc, line_gc[2];
- Bitmap *pix[NUM_BITMAPS];
- Pixmap tile_clipmask[NUM_TILES];
- DrawBuffer *fieldbuffer;
- DrawBuffer *drawto_field;
- int game_status = MAINMENU;
- boolean level_editor_test_game = FALSE;
- boolean network_playing = FALSE;
- int key_joystick_mapping = 0;
- boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
- int redraw_x1 = 0, redraw_y1 = 0;
- short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short Hit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short Box[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short Angle[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- short AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
- unsigned long Elementeigenschaften[MAX_ELEMENTS];
- int level_nr;
- int lev_fieldx,lev_fieldy, scroll_x,scroll_y;
- int FX = SX, FY = SY, ScrollStepSize;
- int ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0;
- int ScreenGfxPos = 0;
- int GameFrameDelay = GAME_FRAME_DELAY;
- int FfwdFrameDelay = FFWD_FRAME_DELAY;
- int BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1;
- int SBX_Left, SBX_Right;
- int SBY_Upper, SBY_Lower;
- int ZX,ZY, ExitX,ExitY;
- int AllPlayersGone;
- int TimeFrames, TimePlayed, TimeLeft;
- #if 0
- boolean network_player_action_received = FALSE;
- #endif
- struct LevelInfo level;
- #if 0
- struct PlayerInfo stored_player[MAX_PLAYERS], *local_player = NULL;
- #endif
- struct HiScore highscore[MAX_SCORE_ENTRIES];
- struct SetupInfo setup;
- struct GameInfo game;
- struct LaserInfo laser;
- struct EditorInfo editor;
- struct GlobalInfo global;
- short LX,LY, XS,YS, ELX,ELY;
- short CT,Ct;
- Pixel pen_fg, pen_bg, pen_ray, pen_magicolor[2];
- int color_status;
- struct XY Step[16] =
- {
- { 1, 0 },
- { 2, -1 },
- { 1, -1 },
- { 1, -2 },
- { 0, -1 },
- { -1, -2 },
- { -1, -1 },
- { -2, -1 },
- { -1, 0 },
- { -2, 1 },
- { -1, 1 },
- { -1, 2 },
- { 0, 1 },
- { 1, 2 },
- { 1, 1 },
- { 2, 1 }
- };
- /* "Sign" has the following structure:
- each 4-bit-value represents the values d*8 + c*4 + b*2 + a*1
- at the pixel positions
- a b 1 2
- c d 4 8
- so the value "0xA" (=> (d=1)*8 + (c=0)*4 + (b=1)*2 + (a=0)*1)
- would result in the pixel pattern
- 0 1 _ x
- 0 1 or _ x
- x x x x x x x x x x
- x _ x x _ _ x x _ x
- 6 2
- x x 5 4 3 x x
- x x 7 1 x x
- x _ _ x
- x _ 8 0 _ x
- x x 9 15 x x
- x x 11 12 13 x x
- 10 14
- x _ x x _ _ x x _ x
- x x x x x x x x x x
- */
- short Sign[16] =
- {
- 0xA,0xF,0xB,0xF,
- 0x3,0xF,0x7,0xF,
- 0x5,0xF,0xD,0xF,
- 0xC,0xF,0xE,0xF
- };
- /* data needed for playing sounds */
- char *sound_name[NUM_SOUNDS] =
- {
- "amoebe.wav",
- "antigrav.wav",
- "autsch.wav",
- "bong.wav",
- "fuel.wav",
- "halloffame.wav",
- "holz.wav",
- "hui.wav",
- "kabumm.wav",
- "kink.wav",
- "kling.wav",
- "laser.wav",
- "oeffnen.wav",
- "quiek.wav",
- "rhythmloop.wav",
- "roaaar.wav",
- "sirr.wav",
- "slurp.wav",
- "warnton.wav",
- "whoosh.wav"
- };
- /* background music */
- int background_loop[] =
- {
- #if 0
- SND_TYGER,
- SND_VOYAGER,
- #endif
- };
- int num_bg_loops = sizeof(background_loop)/sizeof(int);
- char *element_info[] =
- {
- "empty space", /* 0 */
- "mirror (0°)",
- "mirror (11.25°)",
- "mirror (22.5°)",
- "mirror (33.75°)",
- "mirror (45°)",
- "mirror (56.25°)",
- "mirror (67.5°)",
- "mirror (78.75°)",
- "mirror (90°)",
- "mirror (101.25°)", /* 10 */
- "mirror (112.5°)",
- "mirror (123.75°)",
- "mirror (135°)",
- "mirror (146.25°)",
- "mirror (157.5°)",
- "mirror (168.75°)",
- "fixed steel polarisator (0°)",
- "fixed steel polarisator (90°)",
- "fixed steel polarisator (45°)",
- "fixed steel polarisator (135°)", /* 20 */
- "Gregor McDuffin (looking right)",
- "Gregor McDuffin (looking up)",
- "Gregor McDuffin (looking left)",
- "Gregor McDuffin (looking down)",
- "closed exit",
- "opening exit",
- "opening exit",
- "open exit",
- "magic kettle",
- "bomb", /* 30 */
- "prism",
- "steel wall",
- "steel wall",
- "steel wall",
- "steel wall",
- "steel wall",
- "steel wall",
- "steel wall",
- "steel wall",
- "steel wall", /* 40 */
- "steel wall",
- "steel wall",
- "steel wall",
- "steel wall",
- "steel wall",
- "steel wall",
- "steel wall",
- "wooden wall",
- "wooden wall",
- "wooden wall", /* 50 */
- "wooden wall",
- "wooden wall",
- "wooden wall",
- "wooden wall",
- "wooden wall",
- "wooden wall",
- "wooden wall",
- "wooden wall",
- "wooden wall",
- "wooden wall", /* 60 */
- "wooden wall",
- "wooden wall",
- "wooden wall",
- "ice wall",
- "ice wall",
- "ice wall",
- "ice wall",
- "ice wall",
- "ice wall",
- "ice wall", /* 70 */
- "ice wall",
- "ice wall",
- "ice wall",
- "ice wall",
- "ice wall",
- "ice wall",
- "ice wall",
- "ice wall",
- "ice wall",
- "amoeba wall", /* 80 */
- "amoeba wall",
- "amoeba wall",
- "amoeba wall",
- "amoeba wall",
- "amoeba wall",
- "amoeba wall",
- "amoeba wall",
- "amoeba wall",
- "amoeba wall",
- "amoeba wall", /* 90 */
- "amoeba wall",
- "amoeba wall",
- "amoeba wall",
- "amoeba wall",
- "amoeba wall",
- "wooden block",
- "gray ball",
- "beamer (0°)",
- "beamer (22.5°)",
- "beamer (45°)", /* 100 */
- "beamer (67.5°)",
- "beamer (90°)",
- "beamer (112.5°)",
- "beamer (135°)",
- "beamer (157.5°)",
- "beamer (180°)",
- "beamer (202.5°)",
- "beamer (225°)",
- "beamer (247.5°)",
- "beamer (270°)", /* 110 */
- "beamer (292.5°)",
- "beamer (315°)",
- "beamer (337.5°)",
- "fuse",
- "pac man (starts moving right)",
- "pac man (starts moving up)",
- "pac man (starts moving left)",
- "pac man (starts moving down)",
- "polarisator (0°)",
- "polarisator (11.25°)", /* 120 */
- "polarisator (22.5°)",
- "polarisator (33.75°)",
- "polarisator (45°)",
- "polarisator (56.25°)",
- "polarisator (67.5°)",
- "polarisator (78.75°)",
- "polarisator (90°)",
- "polarisator (101.25°)",
- "polarisator (112.5°)",
- "polarisator (123.75°)", /* 130 */
- "polarisator (135°)",
- "polarisator (146.25°)",
- "polarisator (157.5°)",
- "polarisator (168.75°)",
- "two-way polarisator (0°)",
- "two-way polarisator (22.5°)",
- "two-way polarisator (45°)",
- "two-way polarisator (67.5°)",
- "fixed mirror (0°)",
- "fixed mirror (45°)", /* 140 */
- "fixed mirror (90°)",
- "fixed mirror (135°)",
- "reflecting stone lock",
- "key",
- "light bulb (dark)",
- "ligh bulb (glowing)",
- "bonus ball",
- "reflecting stone block",
- "wooden lock",
- "extra energy ball (full)", /* 150 */
- "fixed wooden polarisator (0°)",
- "fixed wooden polarisator (90°)",
- "fixed wooden polarisator (45°)",
- "fixed wooden polarisator (135°)",
- "extra energy ball (empty)",
- "unused",
- "unused",
- "unused",
- "unused",
- "letter ' '", /* 160 */
- "letter '!'",
- "letter '\"'",
- "letter '#'",
- "letter '$'",
- "letter '%'",
- "letter '&'",
- "letter '''",
- "letter '('",
- "letter ')'",
- "letter '*'", /* 170 */
- "letter '+'",
- "letter ','",
- "letter '-'",
- "letter '.'",
- "letter '/'",
- "letter '0'",
- "letter '1'",
- "letter '2'",
- "letter '3'",
- "letter '4'", /* 180 */
- "letter '5'",
- "letter '6'",
- "letter '7'",
- "letter '8'",
- "letter '9'",
- "letter ':'",
- "letter ';'",
- "letter '<'",
- "letter '='",
- "letter '>'", /* 190 */
- "letter '?'",
- "letter '@'",
- "letter 'A'",
- "letter 'B'",
- "letter 'C'",
- "letter 'D'",
- "letter 'E'",
- "letter 'F'",
- "letter 'G'",
- "letter 'H'", /* 200 */
- "letter 'I'",
- "letter 'J'",
- "letter 'K'",
- "letter 'L'",
- "letter 'M'",
- "letter 'N'",
- "letter 'O'",
- "letter 'P'",
- "letter 'Q'",
- "letter 'R'", /* 210 */
- "letter 'S'",
- "letter 'T'",
- "letter 'U'",
- "letter 'V'",
- "letter 'W'",
- "letter 'X'",
- "letter 'Y'",
- "letter 'Z'",
- "letter 'Ä'",
- "letter 'Ö'", /* 220 */
- "letter 'Ü'",
- "letter '^'",
- "letter ''",
- "letter ''",
- "letter ''",
- "letter ''",
- "letter ''",
- "letter ''",
- "letter ''",
- "letter ''", /* 230 */
- "letter ''",
- "letter ''",
- "letter ''",
- "letter ''",
- "letter ''",
- "letter ''",
- "letter ''",
- "letter ''",
- "letter ''",
- "mirror (0°)", /* 240 */
- "mirror (11.25°)",
- "mirror (22.5°)",
- "mirror (33.75°)",
- "mirror (45°)",
- "mirror (56.25°)",
- "mirror (67.5°)",
- "mirror (78.75°)",
- "mirror (90°)",
- "mirror (101.25°)",
- "mirror (112.5°)", /* 250 */
- "mirror (123.75°)",
- "mirror (135°)",
- "mirror (146.25°)",
- "mirror (157.5°)",
- "mirror (168.75°)",
- "fixed wooden polarisator (0°)",
- "fixed wooden polarisator (22.5°)",
- "fixed wooden polarisator (45°)",
- "fixed wooden polarisator (67.5°)",
- "fixed wooden polarisator (90°)", /* 260 */
- "fixed wooden polarisator (112.5°)",
- "fixed wooden polarisator (135°)",
- "fixed wooden polarisator (157.5°)",
- "fixed steel polarisator (0°)",
- "fixed steel polarisator (22.5°)",
- "fixed steel polarisator (45°)",
- "fixed steel polarisator (67.5°)",
- "fixed steel polarisator (90°)",
- "fixed steel polarisator (112.5°)",
- "fixed steel polarisator (135°)", /* 270 */
- "fixed steel polarisator (157.5°)",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall", /* 280 */
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style wooden wall",
- "deflektor style steel wall",
- "deflektor style steel wall",
- "deflektor style steel wall", /* 290 */
- "deflektor style steel wall",
- "deflektor style steel wall",
- "deflektor style steel wall",
- "deflektor style steel wall",
- "deflektor style steel wall",
- "deflektor style steel wall",
- "deflektor style steel wall",
- "deflektor style steel wall",
- "deflektor style steel wall",
- "deflektor style steel wall", /* 300 */
- "deflektor style steel wall",
- "deflektor style steel wall",
- "deflektor style steel wall",
- "empty space",
- "cell",
- "mine",
- "refractor",
- "laser cannon (shooting right)",
- "laser cannon (shooting up)",
- "laser cannon (shooting left)", /* 310 */
- "laser cannon (shooting down)",
- "laser receiver (directed right)",
- "laser receiver (directed up)",
- "laser receiver (directed left)",
- "laser receiver (directed down)",
- "fibre optic (1a)",
- "fibre optic (1b)",
- "fibre optic (2a)",
- "fibre optic (2b)",
- "fibre optic (3a)", /* 320 */
- "fibre optic (3b)",
- "fibre optic (4a)",
- "fibre optic (4b)",
- "rotating mirror (0°)",
- "rotating mirror (11.25°)",
- "rotating mirror (22.5°)",
- "rotating mirror (33.75°)",
- "rotating mirror (45°)",
- "rotating mirror (56.25°)",
- "rotating mirror (67.5°)", /* 330 */
- "rotating mirror (78.75°)",
- "rotating mirror (90°)",
- "rotating mirror (101.25°)",
- "rotating mirror (112.5°)",
- "rotating mirror (123.75°)",
- "rotating mirror (135°)",
- "rotating mirror (146.25°)",
- "rotating mirror (157.5°)",
- "rotating mirror (168.75°)",
- "rotating wooden polarisator (0°)", /* 340 */
- "rotating wooden polarisator (22.5°)",
- "rotating wooden polarisator (45°)",
- "rotating wooden polarisator (67.5°)",
- "rotating wooden polarisator (90°)",
- "rotating wooden polarisator (112.5°)",
- "rotating wooden polarisator (135°)",
- "rotating wooden polarisator (157.5°)",
- "rotating steel polarisator (0°)",
- "rotating steel polarisator (22.5°)",
- "rotating steel polarisator (45°)", /* 350 */
- "rotating steel polarisator (67.5°)",
- "rotating steel polarisator (90°)",
- "rotating steel polarisator (112.5°)",
- "rotating steel polarisator (135°)",
- "rotating steel polarisator (157.5°)",
- "red beamer (0°)",
- "red beamer (22.5°)",
- "red beamer (45°)",
- "red beamer (67.5°)",
- "red beamer (90°)", /* 360 */
- "red beamer (112.5°)",
- "red beamer (135°)",
- "red beamer (157.5°)",
- "red beamer (180°)",
- "red beamer (202.5°)",
- "red beamer (225°)",
- "red beamer (247.5°)",
- "red beamer (270°)",
- "red beamer (292.5°)",
- "red beamer (315°)", /* 370 */
- "red beamer (337.5°)",
- "yellow beamer (0°)",
- "yellow beamer (22.5°)",
- "yellow beamer (45°)",
- "yellow beamer (67.5°)",
- "yellow beamer (90°)",
- "yellow beamer (112.5°)",
- "yellow beamer (135°)",
- "yellow beamer (157.5°)",
- "yellow beamer (180°)", /* 380 */
- "yellow beamer (202.5°)",
- "yellow beamer (225°)",
- "yellow beamer (247.5°)",
- "yellow beamer (270°)",
- "yellow beamer (292.5°)",
- "yellow beamer (315°)",
- "yellow beamer (337.5°)",
- "green beamer (0°)",
- "green beamer (22.5°)",
- "green beamer (45°)", /* 390 */
- "green beamer (67.5°)",
- "green beamer (90°)",
- "green beamer (112.5°)",
- "green beamer (135°)",
- "green beamer (157.5°)",
- "green beamer (180°)",
- "green beamer (202.5°)",
- "green beamer (225°)",
- "green beamer (247.5°)",
- "green beamer (270°)", /* 400 */
- "green beamer (292.5°)",
- "green beamer (315°)",
- "green beamer (337.5°)",
- "blue beamer (0°)",
- "blue beamer (22.5°)",
- "blue beamer (45°)",
- "blue beamer (67.5°)",
- "blue beamer (90°)",
- "blue beamer (112.5°)",
- "blue beamer (135°)", /* 410 */
- "blue beamer (157.5°)",
- "blue beamer (180°)",
- "blue beamer (202.5°)",
- "blue beamer (225°)",
- "blue beamer (247.5°)",
- "blue beamer (270°)",
- "blue beamer (292.5°)",
- "blue beamer (315°)",
- "blue beamer (337.5°)",
- "unknown", /* 420 */
- /*
- "-------------------------------",
- */
- };
- int num_element_info = sizeof(element_info)/sizeof(char *);
- /* ========================================================================= */
- /* main() */
- /* ========================================================================= */
- int main(int argc, char *argv[])
- {
- InitCommandName(argv[0]);
- InitExitFunction(CloseAllAndExit);
- InitPlatformDependantStuff();
- GetOptions(argv);
- OpenAll();
- EventLoop();
- CloseAllAndExit(0);
- exit(0); /* to keep compilers happy */
- }