X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.c;h=46277b95ad0dccae43801e9992d668be4fe2de28;hb=fa26d82a378cebf6b519c566c3f33739ebba7823;hp=38250738b5d1ccbed5c5b61a958effaf4cdeaecf;hpb=6504e94ad5344b188eae829e8136b804437e70bf;p=rocksndiamonds.git diff --git a/src/main.c b/src/main.c index 38250738..46277b95 100644 --- a/src/main.c +++ b/src/main.c @@ -1,75 +1,40 @@ /*********************************************************** -* Rocks'n'Diamonds -- McDuffin Strikes Back! * +* Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* (c) 1995-98 Artsoft Entertainment * -* Holger Schemel * -* Oststrasse 11a * -* 33604 Bielefeld * -* phone: ++49 +521 290471 * -* email: aeglos@valinor.owl.de * +* (c) 1995-2002 Artsoft Entertainment * +* Holger Schemel * +* Detmolder Strasse 189 * +* 33604 Bielefeld * +* Germany * +* e-mail: info@artsoft.org * *----------------------------------------------------------* -* main.c * +* main.c * ***********************************************************/ +#include "libgame/libgame.h" + #include "main.h" #include "init.h" #include "game.h" #include "events.h" -#include "sound.h" -#include "joystick.h" -#include "misc.h" - -#ifdef MSDOS -#include -#endif -Display *display; -Visual *visual; -int screen; -DrawWindow window = None; -GC gc, clip_gc[NUM_BITMAPS], tile_clip_gc; -Bitmap pix[NUM_BITMAPS]; -Bitmap pix_masked[NUM_BITMAPS], tile_masked[NUM_TILES]; -Pixmap clipmask[NUM_BITMAPS], tile_clipmask[NUM_TILES]; - -#ifdef USE_XPM_LIBRARY -XpmAttributes xpm_att[NUM_PICTURES]; +GC tile_clip_gc; +#if 0 +Bitmap *pix[NUM_BITMAPS]; #endif - -DrawBuffer drawto, drawto_field, backbuffer, fieldbuffer; -Colormap cmap; - -int sound_pipe[2]; -int sound_device; -char *sound_device_name = SOUND_DEVICE; -int joystick_device = 0; -char *joystick_device_name[MAX_PLAYERS] = -{ - DEV_JOYSTICK_0, - DEV_JOYSTICK_1, - DEV_JOYSTICK_2, - DEV_JOYSTICK_3 -}; - -char *program_name = NULL; +Bitmap *bitmap_db_field, *bitmap_db_door; +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 button_status = MB_NOT_PRESSED; -boolean motion_status = FALSE; + int key_joystick_mapping = 0; -int global_joystick_status = JOYSTICK_STATUS; -int joystick_status = JOYSTICK_STATUS; -int sound_status = SOUND_STATUS; -boolean sound_loops_allowed = FALSE; -boolean fullscreen_available = FULLSCREEN_STATUS; -boolean fullscreen_enabled = FALSE; boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE]; int redraw_x1 = 0, redraw_y1 = 0; -int redraw_mask; -int redraw_tiles; short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; @@ -80,20 +45,21 @@ 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]; +short GfxAction[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]; +short ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; unsigned long Elementeigenschaften1[MAX_ELEMENTS]; unsigned long Elementeigenschaften2[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 BorderElement = EL_BETON; +int BorderElement = EL_STEELWALL; int GameFrameDelay = GAME_FRAME_DELAY; int FfwdFrameDelay = FFWD_FRAME_DELAY; int BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1; @@ -101,875 +67,635 @@ int SBX_Left, SBX_Right; int SBY_Upper, SBY_Lower; int ZX,ZY, ExitX,ExitY; int AllPlayersGone; -int FrameCounter, TimeFrames, TimePlayed, TimeLeft; + +int TimeFrames, TimePlayed, TimeLeft; boolean network_player_action_received = FALSE; -struct LevelDirInfo *leveldir_first = NULL, *leveldir_current = NULL; struct LevelInfo level; struct PlayerInfo stored_player[MAX_PLAYERS], *local_player = NULL; struct HiScore highscore[MAX_SCORE_ENTRIES]; -struct SoundInfo Sound[NUM_SOUNDS]; struct TapeInfo tape; -struct OptionInfo options; struct SetupInfo setup; struct GameInfo game; struct GlobalInfo global; -/* data needed for playing sounds */ +/* filenames of sound effects */ char *sound_name[NUM_SOUNDS] = { - "alchemy", - "amoebe", - "antigrav", - "autsch", - "blurb", - "bong", - "buing", - "chase", - "czardasz", - "deng", - "fuel", - "gong", - "halloffame", - "holz", - "hui", - "kabumm", - "kink", - "klapper", - "kling", - "klopf", - "klumpf", - "knack", - "knurk", - "krach", - "lachen", - "laser", - "miep", - "network", - "njam", - "oeffnen", - "pling", - "pong", - "pusch", - "quiek", - "quirk", - "rhythmloop", - "roaaar", - "roehr", - "rumms", - "schlopp", - "schlurf", - "schrff", - "schwirr", - "sirr", - "slurp", - "sproing", - "twilight", - "tyger", - "voyager", - "warnton", - "whoosh", - "zisch", - "base", - "infotron", - "zonkdown", - "zonkpush", - "bug", - "boom", - "booom", - "exit", - "empty", - "gate" + "amoebe.wav", + "antigrav.wav", + "autsch.wav", + "blurb.wav", + "bong.wav", + "buing.wav", + "deng.wav", + "fuel.wav", + "gong.wav", + "halloffame.wav", + "holz.wav", + "hui.wav", + "kabumm.wav", + "kink.wav", + "klapper.wav", + "kling.wav", + "klopf.wav", + "klumpf.wav", + "knack.wav", + "knurk.wav", + "krach.wav", + "lachen.wav", + "laser.wav", + "miep.wav", + "njam.wav", + "oeffnen.wav", + "pling.wav", + "pong.wav", + "pusch.wav", + "quiek.wav", + "quirk.wav", + "rhythmloop.wav", + "roaaar.wav", + "roehr.wav", + "rumms.wav", + "schlopp.wav", + "schlurf.wav", + "schrff.wav", + "schwirr.wav", + "sirr.wav", + "slurp.wav", + "sproing.wav", + "warnton.wav", + "whoosh.wav", + "zisch.wav", + "base.wav", + "infotron.wav", + "zonkdown.wav", + "zonkpush.wav", + "bug.wav", + "boom.wav", + "booom.wav", + "exit.wav", + "empty.wav", + "gate.wav" }; -/* background music */ -int background_loop[] = +/* this is used to reduce memory usage of the different animation types */ +int graphics_action_mapping[] = { - SND_ALCHEMY, - SND_CHASE, - SND_NETWORK, - SND_CZARDASZ, - SND_TYGER, - SND_VOYAGER, - SND_TWILIGHT + 0, /* GFX_ACTION_DEFAULT (0) */ + 0, /* GFX_ACTION_WAITING (1) */ + + 1, /* GFX_ACTION_FALLING (2) */ + 2, /* GFX_ACTION_MOVING (3) */ + 3, /* GFX_ACTION_DIGGING (4) */ + 4, /* GFX_ACTION_SNAPPING (5) */ + 5, /* GFX_ACTION_COLLECTING (6) */ + 6, /* GFX_ACTION_PUSHING (7) */ + + 7, /* GFX_ACTION_PASSING (8) */ + 7, /* GFX_ACTION_IMPACT (9) */ + 7, /* GFX_ACTION_CRACKING (10) */ + 7, /* GFX_ACTION_BREAKING (11) */ + 7, /* GFX_ACTION_ACTIVATING (12) */ + 7, /* GFX_ACTION_OPENING (13) */ + 7, /* GFX_ACTION_CLOSING (14) */ + 7, /* GFX_ACTION_EATING (15) */ + 7, /* GFX_ACTION_ATTACKING (16) */ + 7, /* GFX_ACTION_GROWING (17) */ + 7, /* GFX_ACTION_SHRINKING (18) */ + 7 /* GFX_ACTION_OTHER (19) */ }; -int num_bg_loops = sizeof(background_loop)/sizeof(int); -char *element_info[] = +struct FileInfo *image_files; +struct FileInfo *sound_files; + +struct ElementInfo element_info[MAX_ELEMENTS] = { - "empty space", /* 0 */ - "sand", - "normal wall", - "round wall", - "rock", - "key", - "emerald", - "closed exit", - "player", - "bug", - "spaceship", /* 10 */ - "yam yam", - "robot", - "steel wall", - "diamond", - "dead amoeba", - "empty quicksand", - "quicksand with rock", - "amoeba drop", - "bomb", - "magic wall", /* 20 */ - "speed ball", - "acid pool", - "dropping amoeba", - "normal amoeba", - "nut with emerald", - "life wall", - "biomaze", - "burning dynamite", - "unknown", - "magic wheel", /* 30 */ - "running wire", - "red key", - "yellow key", - "green key", - "blue key", - "red door", - "yellow door", - "green door", - "blue door", - "gray door (opened by red key)", /* 40 */ - "gray door (opened by yellow key)", - "gray door (opened by green key)", - "gray door (opened by blue key)", - "dynamite", - "pac man", - "invisible normal wall", - "light bulb (dark)", - "ligh bulb (glowing)", - "wall with emerald", - "wall with diamond", /* 50 */ - "amoeba with content", - "amoeba (BD style)", - "time orb (full)", - "time orb (empty)", - "growing wall", - "diamond (BD style)", - "yellow emerald", - "wall with BD style diamond", - "wall with yellow emerald", - "dark yam yam", /* 60 */ - "magic wall (BD style)", - "invisible steel wall", - "-", - "increases number of bombs", - "increases explosion size", - "increases power of explosion", - "sokoban object", - "sokoban empty field", - "sokoban field with object", - "butterfly (starts moving right)", /* 70 */ - "butterfly (starts moving up)", - "butterfly (starts moving left)", - "butterfly (starts moving down)", - "firefly (starts moving right)", - "firefly (starts moving up)", - "firefly (starts moving left)", - "firefly (starts moving down)", - "butterfly", - "firefly", - "yellow player", /* 80 */ - "red player", - "green player", - "blue player", - "bug (starts moving right)", - "bug (starts moving up)", - "bug (starts moving left)", - "bug (starts moving down)", - "spaceship (starts moving right)", - "spaceship (starts moving up)", - "spaceship (starts moving left)", /* 90 */ - "spaceship (starts moving down)", - "pac man (starts moving right)", - "pac man (starts moving up)", - "pac man (starts moving left)", - "pac man (starts moving down)", - "red emerald", - "violet emerald", - "wall with red emerald", - "wall with violet emerald", - "unknown", /* 100 */ - "unknown", - "unknown", - "unknown", - "unknown", - "normal wall (BD style)", - "rock (BD style)", - "open exit", - "unknown", - "amoeba", - "mole", /* 110 */ - "penguin", - "satellite", - "arrow left", - "arrow right", - "arrow up", - "arrow down", - "pig", - "fire breathing dragon", - "unknown", - "letter ' '", /* 120 */ - "letter '!'", - "letter '\"'", - "letter '#'", - "letter '$'", - "letter '%'", - "letter '&'", - "letter '''", - "letter '('", - "letter ')'", - "letter '*'", /* 130 */ - "letter '+'", - "letter ','", - "letter '-'", - "letter '.'", - "letter '/'", - "letter '0'", - "letter '1'", - "letter '2'", - "letter '3'", - "letter '4'", /* 140 */ - "letter '5'", - "letter '6'", - "letter '7'", - "letter '8'", - "letter '9'", - "letter ':'", - "letter ';'", - "letter '<'", - "letter '='", - "letter '>'", /* 150 */ - "letter '?'", - "letter '@'", - "letter 'A'", - "letter 'B'", - "letter 'C'", - "letter 'D'", - "letter 'E'", - "letter 'F'", - "letter 'G'", - "letter 'H'", /* 160 */ - "letter 'I'", - "letter 'J'", - "letter 'K'", - "letter 'L'", - "letter 'M'", - "letter 'N'", - "letter 'O'", - "letter 'P'", - "letter 'Q'", - "letter 'R'", /* 170 */ - "letter 'S'", - "letter 'T'", - "letter 'U'", - "letter 'V'", - "letter 'W'", - "letter 'X'", - "letter 'Y'", - "letter 'Z'", - "letter 'Ä'", - "letter 'Ö'", /* 180 */ - "letter 'Ü'", - "letter '^'", - "letter ''", - "letter ''", - "letter ''", - "letter ''", - "letter ''", - "letter ''", - "letter ''", - "letter ''", /* 190 */ - "letter ''", - "letter ''", - "letter ''", - "letter ''", - "letter ''", - "letter ''", - "letter ''", - "letter ''", - "letter ''", - "growing wall (horizontal)", /* 200 */ - "growing wall (vertical)", - "growing wall (all directions)", - "unused", - "unused", - "unused", - "unused", - "unused", - "unused", - "unused", - "empty space", /* 210 */ - "zonk", - "base", - "murphy", - "infotron", - "chip (single)", - "hardware", - "exit", - "orange disk", - "port (leading right)", - "port (leading down)", /* 220 */ - "port (leading left)", - "port (leading up)", - "port (leading right)", - "port (leading down)", - "port (leading left)", - "port (leading up)", - "snik snak", - "yellow disk", - "terminal", - "red disk", /* 230 */ - "port (vertical)", - "port (horizontal)", - "port (all directions)", - "electron", - "buggy base", - "chip (left half)", - "chip (right half)", - "hardware", - "hardware", - "hardware", /* 240 */ - "hardware", - "hardware", - "hardware", - "hardware", - "hardware", - "hardware", - "hardware", - "chip (upper half)", - "chip (lower half)", - "unknown", /* 250 */ - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", + { "empty_space", "empty space" }, /* 0 */ + { "sand", "sand" }, + { "wall", "normal wall" }, + { "wall", "round wall" }, + { "rock", "rock" }, + { "key", "key" }, + { "emerald", "emerald" }, + { "exit", "closed exit" }, + { "player", "player" }, + { "bug", "bug" }, + { "spaceship", "spaceship" }, /* 10 */ + { "yamyam", "yam yam" }, + { "robot", "robot" }, + { "wall", "steel wall" }, + { "diamond", "diamond" }, + { "amoeba", "dead amoeba" }, + { "quicksand", "empty quicksand" }, + { "quicksand", "quicksand with rock" }, + { "amoeba", "amoeba drop" }, + { "bomb", "bomb" }, + { "magic_wall", "magic wall" }, /* 20 */ + { "speed_pill", "speed pill" }, + { "acid", "acid" }, + { "amoeba", "dropping amoeba" }, + { "amoeba", "normal amoeba" }, + { "nut", "nut with emerald" }, + { "gameoflife", "Conway's wall of life" }, + { "biomaze", "biomaze" }, + { "dynamite", "burning dynamite" }, + { "wall", "wall" }, + { "robot_wheel", "magic wheel" }, /* 30 */ + { "robot_wheel", "magic wheel (running)" }, + { "key", "red key" }, + { "key", "yellow key" }, + { "key", "green key" }, + { "key", "blue key" }, + { "gate", "red door" }, + { "gate", "yellow door" }, + { "gate", "green door" }, + { "gate", "blue door" }, + { "gate", "gray door (opened by red key)" }, /* 40 */ + { "gate", "gray door (opened by yellow key)"}, + { "gate", "gray door (opened by green key)"}, + { "gate", "gray door (opened by blue key)"}, + { "dynamite", "dynamite" }, + { "pacman", "pac man" }, + { "wall", "invisible normal wall" }, + { "lamp", "lamp (off)" }, + { "lamp", "lamp (on)" }, + { "wall", "wall with emerald" }, + { "wall", "wall with diamond" }, /* 50 */ + { "amoeba", "amoeba with content" }, + { "bd_amoeba", "amoeba (BD style)" }, + { "time_orb_full", "time orb (full)" }, + { "time_orb_empty", "time orb (empty)" }, + { "wall", "growing wall" }, + { "bd_diamond", "diamond (BD style)" }, + { "emerald", "yellow emerald" }, + { "wall", "wall with BD style diamond" }, + { "wall", "wall with yellow emerald" }, + { "dark_yamyam", "dark yam yam" }, /* 60 */ + { "bd_magic_wall", "magic wall (BD style)" }, + { "wall", "invisible steel wall" }, + + { NULL, "(not used)" }, + + { "dynabomb_nr", "increases number of bombs" }, + { "dynabomb_sz", "increases explosion size" }, + { "dynabomb_xl", "increases power of explosion" }, + { "sokoban_object", "sokoban object" }, + { "sokoban_field", "sokoban empty field" }, + { "sokoban_field", "sokoban field with object" }, + { "bd_butterfly", "butterfly (starts moving right)"}, /* 70 */ + { "bd_butterfly", "butterfly (starts moving up)" }, + { "bd_butterfly", "butterfly (starts moving left)"}, + { "bd_butterfly", "butterfly (starts moving down)"}, + { "bd_firefly", "firefly (starts moving right)" }, + { "bd_firefly", "firefly (starts moving up)" }, + { "bd_firefly", "firefly (starts moving left)" }, + { "bd_firefly", "firefly (starts moving down)" }, + { "bd_butterfly", "butterfly" }, + { "bd_firefly", "firefly" }, + { "player", "yellow player" }, /* 80 */ + { "player", "red player" }, + { "player", "green player" }, + { "player", "blue player" }, + { "bug", "bug (starts moving right)" }, + { "bug", "bug (starts moving up)" }, + { "bug", "bug (starts moving left)" }, + { "bug", "bug (starts moving down)" }, + { "spaceship", "spaceship (starts moving right)"}, + { "spaceship", "spaceship (starts moving up)" }, + { "spaceship", "spaceship (starts moving left)"}, /* 90 */ + { "spaceship", "spaceship (starts moving down)"}, + { "pacman", "pac man (starts moving right)" }, + { "pacman", "pac man (starts moving up)" }, + { "pacman", "pac man (starts moving left)" }, + { "pacman", "pac man (starts moving down)" }, + { "emerald", "red emerald" }, + { "emerald", "purple emerald" }, + { "wall", "wall with red emerald" }, + { "wall", "wall with purple emerald" }, + { "wall", "acid pool (top left)" }, /* 100 */ + { "wall", "acid pool (top right)" }, + { "wall", "acid pool (bottom left)" }, + { "wall", "acid pool (bottom)" }, + { "wall", "acid pool (bottom right)" }, + { "wall", "normal wall (BD style)" }, + { "bd_rock", "rock (BD style)" }, + { "exit", "open exit" }, + { NULL, "black orb bomb" }, + { "amoeba", "amoeba" }, + { "mole", "mole" }, /* 110 */ + { "penguin", "penguin" }, + { "satellite", "satellite" }, + { NULL, "arrow left" }, + { NULL, "arrow right" }, + { NULL, "arrow up" }, + { NULL, "arrow down" }, + { "pig", "pig" }, + { "dragon", "fire breathing dragon" }, + { "key", "red key (EM style)" }, + { NULL, "letter ' '" }, /* 120 */ + { NULL, "letter '!'" }, + { NULL, "letter '\"'" }, + { NULL, "letter '#'" }, + { NULL, "letter '$'" }, + { NULL, "letter '%'" }, + { NULL, "letter '&'" }, + { NULL, "letter '''" }, + { NULL, "letter '('" }, + { NULL, "letter ')'" }, + { NULL, "letter '*'" }, /* 130 */ + { NULL, "letter '+'" }, + { NULL, "letter ','" }, + { NULL, "letter '-'" }, + { NULL, "letter '.'" }, + { NULL, "letter '/'" }, + { NULL, "letter '0'" }, + { NULL, "letter '1'" }, + { NULL, "letter '2'" }, + { NULL, "letter '3'" }, + { NULL, "letter '4'" }, /* 140 */ + { NULL, "letter '5'" }, + { NULL, "letter '6'" }, + { NULL, "letter '7'" }, + { NULL, "letter '8'" }, + { NULL, "letter '9'" }, + { NULL, "letter ':'" }, + { NULL, "letter ';'" }, + { NULL, "letter '<'" }, + { NULL, "letter '='" }, + { NULL, "letter '>'" }, /* 150 */ + { NULL, "letter '?'" }, + { NULL, "letter '@'" }, + { NULL, "letter 'A'" }, + { NULL, "letter 'B'" }, + { NULL, "letter 'C'" }, + { NULL, "letter 'D'" }, + { NULL, "letter 'E'" }, + { NULL, "letter 'F'" }, + { NULL, "letter 'G'" }, + { NULL, "letter 'H'" }, /* 160 */ + { NULL, "letter 'I'" }, + { NULL, "letter 'J'" }, + { NULL, "letter 'K'" }, + { NULL, "letter 'L'" }, + { NULL, "letter 'M'" }, + { NULL, "letter 'N'" }, + { NULL, "letter 'O'" }, + { NULL, "letter 'P'" }, + { NULL, "letter 'Q'" }, + { NULL, "letter 'R'" }, /* 170 */ + { NULL, "letter 'S'" }, + { NULL, "letter 'T'" }, + { NULL, "letter 'U'" }, + { NULL, "letter 'V'" }, + { NULL, "letter 'W'" }, + { NULL, "letter 'X'" }, + { NULL, "letter 'Y'" }, + { NULL, "letter 'Z'" }, + { NULL, "letter 'Ä'" }, + { NULL, "letter 'Ö'" }, /* 180 */ + { NULL, "letter 'Ü'" }, + { NULL, "letter '^'" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, /* 190 */ + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { NULL, "letter ''" }, + { "wall", "growing wall (horizontal)" }, /* 200 */ + { "wall", "growing wall (vertical)" }, + { "wall", "growing wall (all directions)" }, + { "gate", "red door (EM style)" }, + { "gate", "yellow door (EM style)" }, + { "gate", "green door (EM style)" }, + { "gate", "blue door (EM style)" }, + { "key", "yellow key (EM style)" }, + { "key", "green key (EM style)" }, + { "key", "blue key (EM style)" }, + { "empty_space", "empty space" }, /* 210 */ + { "sp_zonk", "zonk" }, + { "sp_base", "base" }, + { "player", "murphy" }, + { "sp_infotron", "infotron" }, + { "wall", "chip (single)" }, + { "wall", "hardware" }, + { "sp_exit", "exit" }, + { "sp_disk_orange", "orange disk" }, + { "sp_port", "port (leading right)" }, + { "sp_port", "port (leading down)" }, /* 220 */ + { "sp_port", "port (leading left)" }, + { "sp_port", "port (leading up)" }, + { "sp_port", "port (leading right)" }, + { "sp_port", "port (leading down)" }, + { "sp_port", "port (leading left)" }, + { "sp_port", "port (leading up)" }, + { "sp_sniksnak", "snik snak" }, + { "sp_disk_yellow", "yellow disk" }, + { "sp_terminal", "terminal" }, + { "sp_disk_red", "red disk" }, /* 230 */ + { "sp_port", "port (vertical)" }, + { "sp_port", "port (horizontal)" }, + { "sp_port", "port (all directions)" }, + { "sp_electron", "electron" }, + { "sp_buggy_base", "buggy base" }, + { "wall", "chip (left half)" }, + { "wall", "chip (right half)" }, + { "wall", "hardware" }, + { "wall", "hardware" }, + { "wall", "hardware" }, /* 240 */ + { "wall", "hardware" }, + { "wall", "hardware" }, + { "wall", "hardware" }, + { "wall", "hardware" }, + { "wall", "hardware" }, + { "wall", "hardware" }, + { "wall", "hardware" }, + { "wall", "chip (upper half)" }, + { "wall", "chip (lower half)" }, + { "gate", "gray door (EM style, red key)" }, /* 250 */ + { "gate", "gray door (EM style, yellow key)"}, + { "gate", "gray door (EM style, green key)"}, + { "gate", "gray door (EM style, blue key)"}, + + { NULL, "(not used)" }, + { NULL, "(not used)" }, /* 256 */ - "pearl", /* (256) */ - "crystal", - "wall with pearl", - "wall with crystal", - "white door", /* 260 */ - "gray door (opened by white key)", - "white key", - "shield (passive)", - "extra time", - "switch gate (open)", - "switch gate (closed)", - "switch for switch gate", - "switch for switch gate", - "-", - "-", /* 270 */ - "red conveyor belt (left)", - "red conveyor belt (middle)", - "red conveyor belt (right)", - "switch for red conveyor belt (left)", - "switch for red conveyor belt (middle)", - "switch for red conveyor belt (right)", - "yellow conveyor belt (left)", - "yellow conveyor belt (middle)", - "yellow conveyor belt (right)", - "switch for yellow conveyor belt (left)", /* 280 */ - "switch for yellow conveyor belt (middle)", - "switch for yellow conveyor belt (right)", - "green conveyor belt (left)", - "green conveyor belt (middle)", - "green conveyor belt (right)", - "switch for green conveyor belt (left)", - "switch for green conveyor belt (middle)", - "switch for green conveyor belt (right)", - "blue conveyor belt (left)", - "blue conveyor belt (middle)", /* 290 */ - "blue conveyor belt (right)", - "switch for blue conveyor belt (left)", - "switch for blue conveyor belt (middle)", - "switch for blue conveyor belt (right)", - "land mine", - "mail envelope", - "light switch (off)", - "light switch (on)", - "sign (exclamation)", - "sign (radio activity)", /* 300 */ - "sign (stop)", - "sign (wheel chair)", - "sign (parking)", - "sign (one way)", - "sign (heart)", - "sign (triangle)", - "sign (round)", - "sign (exit)", - "sign (yin yang)", - "sign (other)", /* 310 */ - "mole (starts moving left)", - "mole (starts moving right)", - "mole (starts moving up)", - "mole (starts moving down)", - "steel wall (slanted)", - "invisible sand", - "dx unknown 15", - "dx unknown 42", - "-", - "-", /* 320 */ - "shield (active, kills enemies)", - "time gate (open)", - "time gate (closed)", - "switch for time gate", - "switch for time gate", - "balloon", - "send balloon to the left", - "send balloon to the right", - "send balloon up", - "send balloon down", /* 330 */ - "send balloon in any direction", - "steel wall", - "steel wall", - "steel wall", - "steel wall", - "normal wall", - "normal wall", - "normal wall", - "normal wall", - "normal wall", /* 340 */ - "normal wall", - "normal wall", - "normal wall", - "tube (all directions)", - "tube (vertical)", - "tube (horizontal)", - "tube (vertical & left)", - "tube (vertical & right)", - "tube (horizontal & up)", - "tube (horizontal & down)", /* 350 */ - "tube (left & up)", - "tube (left & down)", - "tube (right & up)", - "tube (right & down)", - "spring", - "trap", - "stable bomb (DX style)", - "-" + { "pearl", "pearl" }, /* (256) */ + { "crystal", "crystal" }, + { "wall", "wall with pearl" }, + { "wall", "wall with crystal" }, + { "gate", "white door" }, /* 260 */ + { "gate", "gray door (opened by white key)"}, + { "key", "white key" }, + { "shield_normal", "shield (normal)" }, + { "extra_time", "extra time" }, + { "switchgate", "switch gate (open)" }, + { "switchgate", "switch gate (closed)" }, + { "switchgate_switch", "switch for switch gate" }, + { "switchgate_switch", "switch for switch gate" }, + { NULL, "-" }, + { NULL, "-" }, /* 270 */ + { "conveyor_belt", "red conveyor belt (left)" }, + { "conveyor_belt", "red conveyor belt (middle)" }, + { "conveyor_belt", "red conveyor belt (right)" }, + { "conveyor_belt_switch", "switch for red conveyor belt (left)"}, + { "conveyor_belt_switch", "switch for red conveyor belt (middle)"}, + { "conveyor_belt_switch", "switch for red conveyor belt (right)"}, + { "conveyor_belt", "yellow conveyor belt (left)" }, + { "conveyor_belt", "yellow conveyor belt (middle)" }, + { "conveyor_belt", "yellow conveyor belt (right)" }, + { "conveyor_belt_switch", "switch for yellow conveyor belt (left)"}, + { "conveyor_belt_switch", "switch for yellow conveyor belt (middle)"}, + { "conveyor_belt_switch", "switch for yellow conveyor belt (right)"}, + { "conveyor_belt", "green conveyor belt (left)" }, + { "conveyor_belt", "green conveyor belt (middle)" }, + { "conveyor_belt", "green conveyor belt (right)" }, + { "conveyor_belt_switch", "switch for green conveyor belt (left)"}, + { "conveyor_belt_switch", "switch for green conveyor belt (middle)"}, + { "conveyor_belt_switch", "switch for green conveyor belt (right)"}, + { "conveyor_belt", "blue conveyor belt (left)" }, + { "conveyor_belt", "blue conveyor belt (middle)" }, + { "conveyor_belt", "blue conveyor belt (right)" }, + { "conveyor_belt_switch", "switch for blue conveyor belt (left)"}, + { "conveyor_belt_switch", "switch for blue conveyor belt (middle)"}, + { "conveyor_belt_switch", "switch for blue conveyor belt (right)"}, + { "sand", "land mine" }, + { "envelope", "mail envelope" }, + { "light_switch", "light switch (off)" }, + { "light_switch", "light switch (on)" }, + { "wall", "sign (exclamation)" }, + { "wall", "sign (radio activity)" }, /* 300 */ + { "wall", "sign (stop)" }, + { "wall", "sign (wheel chair)" }, + { "wall", "sign (parking)" }, + { "wall", "sign (one way)" }, + { "wall", "sign (heart)" }, + { "wall", "sign (triangle)" }, + { "wall", "sign (round)" }, + { "wall", "sign (exit)" }, + { "wall", "sign (yin yang)" }, + { "wall", "sign (other)" }, /* 310 */ + { "mole", "mole (starts moving left)" }, + { "mole", "mole (starts moving right)" }, + { "mole", "mole (starts moving up)" }, + { "mole", "mole (starts moving down)" }, + { "wall", "steel wall (slanted)" }, + { "sand", "invisible sand" }, + + { NULL, "dx unknown element 15" }, + { NULL, "dx unknown element 42" }, + + { NULL, "(not used)" }, + { NULL, "(not used)" }, /* 320 */ + + { "shield_deadly", "shield (deadly, kills enemies)"}, + { "timegate", "time gate (open)" }, + { "timegate", "time gate (closed)" }, + { "timegate_switch", "switch for time gate" }, + { "timegate_switch", "switch for time gate" }, + { "balloon", "balloon" }, + { "balloon_switch", "send balloon to the left" }, + { "balloon_switch", "send balloon to the right" }, + { "balloon_switch", "send balloon up" }, + { "balloon_switch", "send balloon down" }, /* 330 */ + { "balloon_switch", "send balloon in any direction" }, + { "wall", "steel wall" }, + { "wall", "steel wall" }, + { "wall", "steel wall" }, + { "wall", "steel wall" }, + { "wall", "normal wall" }, + { "wall", "normal wall" }, + { "wall", "normal wall" }, + { "wall", "normal wall" }, + { "wall", "normal wall" }, /* 340 */ + { "wall", "normal wall" }, + { "wall", "normal wall" }, + { "wall", "normal wall" }, + { "tube", "tube (all directions)" }, + { "tube", "tube (vertical)" }, + { "tube", "tube (horizontal)" }, + { "tube", "tube (vertical & left)" }, + { "tube", "tube (vertical & right)" }, + { "tube", "tube (horizontal & up)" }, + { "tube", "tube (horizontal & down)" }, /* 350 */ + { "tube", "tube (left & up)" }, + { "tube", "tube (left & down)" }, + { "tube", "tube (right & up)" }, + { "tube", "tube (right & down)" }, + { "spring", "spring" }, + { "trap", "trap" }, + { "dx_bomb", "stable bomb (DX style)" }, + { NULL, "-" }, + { NULL, "-" }, + { "custom", "custom element 0" }, + { "custom", "custom element 1" }, + { "custom", "custom element 2" }, + { "custom", "custom element 3" }, + { "custom", "custom element 4" }, + { "custom", "custom element 5" }, + { "custom", "custom element 6" }, + { "custom", "custom element 7" }, + { "custom", "custom element 8" }, + { "custom", "custom element 9" }, + { "custom", "custom element 10" }, + { "custom", "custom element 11" }, + { "custom", "custom element 12" }, + { "custom", "custom element 13" }, + { "custom", "custom element 14" }, + { "custom", "custom element 15" }, + { "custom", "custom element 16" }, + { "custom", "custom element 17" }, + { "custom", "custom element 18" }, + { "custom", "custom element 19" }, + { "custom", "custom element 20" }, + { "custom", "custom element 21" }, + { "custom", "custom element 22" }, + { "custom", "custom element 23" }, + { "custom", "custom element 24" }, + { "custom", "custom element 25" }, + { "custom", "custom element 26" }, + { "custom", "custom element 27" }, + { "custom", "custom element 28" }, + { "custom", "custom element 29" }, + { "custom", "custom element 30" }, + { "custom", "custom element 31" }, + { "custom", "custom element 32" }, + { "custom", "custom element 33" }, + { "custom", "custom element 34" }, + { "custom", "custom element 35" }, + { "custom", "custom element 36" }, + { "custom", "custom element 37" }, + { "custom", "custom element 38" }, + { "custom", "custom element 39" }, + { "custom", "custom element 40" }, + { "custom", "custom element 41" }, + { "custom", "custom element 42" }, + { "custom", "custom element 43" }, + { "custom", "custom element 44" }, + { "custom", "custom element 45" }, + { "custom", "custom element 46" }, + { "custom", "custom element 47" }, + { "custom", "custom element 48" }, + { "custom", "custom element 49" }, + { "custom", "custom element 50" }, + { "custom", "custom element 51" }, + { "custom", "custom element 52" }, + { "custom", "custom element 53" }, + { "custom", "custom element 54" }, + { "custom", "custom element 55" }, + { "custom", "custom element 56" }, + { "custom", "custom element 57" }, + { "custom", "custom element 58" }, + { "custom", "custom element 59" }, + { "custom", "custom element 60" }, + { "custom", "custom element 61" }, + { "custom", "custom element 62" }, + { "custom", "custom element 63" }, + { "custom", "custom element 64" }, + { "custom", "custom element 65" }, + { "custom", "custom element 66" }, + { "custom", "custom element 67" }, + { "custom", "custom element 68" }, + { "custom", "custom element 69" }, + { "custom", "custom element 70" }, + { "custom", "custom element 71" }, + { "custom", "custom element 72" }, + { "custom", "custom element 73" }, + { "custom", "custom element 74" }, + { "custom", "custom element 75" }, + { "custom", "custom element 76" }, + { "custom", "custom element 77" }, + { "custom", "custom element 78" }, + { "custom", "custom element 79" }, + { "custom", "custom element 80" }, + { "custom", "custom element 81" }, + { "custom", "custom element 82" }, + { "custom", "custom element 83" }, + { "custom", "custom element 84" }, + { "custom", "custom element 85" }, + { "custom", "custom element 86" }, + { "custom", "custom element 87" }, + { "custom", "custom element 88" }, + { "custom", "custom element 89" }, + { "custom", "custom element 90" }, + { "custom", "custom element 91" }, + { "custom", "custom element 92" }, + { "custom", "custom element 93" }, + { "custom", "custom element 94" }, + { "custom", "custom element 95" }, + { "custom", "custom element 96" }, + { "custom", "custom element 97" }, + { "custom", "custom element 98" }, + { "custom", "custom element 99" }, + { "custom", "custom element 100" }, + { "custom", "custom element 101" }, + { "custom", "custom element 102" }, + { "custom", "custom element 103" }, + { "custom", "custom element 104" }, + { "custom", "custom element 105" }, + { "custom", "custom element 106" }, + { "custom", "custom element 107" }, + { "custom", "custom element 108" }, + { "custom", "custom element 109" }, + { "custom", "custom element 110" }, + { "custom", "custom element 111" }, + { "custom", "custom element 112" }, + { "custom", "custom element 113" }, + { "custom", "custom element 114" }, + { "custom", "custom element 115" }, + { "custom", "custom element 116" }, + { "custom", "custom element 117" }, + { "custom", "custom element 118" }, + { "custom", "custom element 119" }, + { "custom", "custom element 120" }, + { "custom", "custom element 121" }, + { "custom", "custom element 122" }, + { "custom", "custom element 123" }, + { "custom", "custom element 124" }, + { "custom", "custom element 125" }, + { "custom", "custom element 126" }, + { "custom", "custom element 127" }, + + { NULL, "-" } /* "-------------------------------", */ }; -int num_element_info = sizeof(element_info)/sizeof(char *); - - - -/* +-----------------------------------------------------------------------+ */ -/* | SDL TEST STUFF | */ -/* +-----------------------------------------------------------------------+ */ - -#ifdef USE_SDL_JOYSTICK - -SDL_Surface *sdl_screen, *sdl_image_tmp, *sdl_image, *sdl_image_masked; -SDL_Surface *sdl_image2_tmp, *sdl_image2, *sdl_image2_masked; - -void TEST_SDL_BLIT_RECT(int x, int y) -{ - SDL_Rect rect_src, rect_dst; - - SDLCopyArea(pix_masked[PIX_HEROES], window, - 8 * TILEX, 8 * TILEY, TILEX, TILEY, x, y); - return; - - rect_src.x = 8 * TILEX; - rect_src.y = 8 * TILEY; - rect_src.w = TILEX; - rect_src.h = TILEY; - - rect_dst.x = x; - rect_dst.y = y; - rect_dst.w = TILEX; - rect_dst.h = TILEY; - - SDL_BlitSurface(sdl_image2_masked, &rect_src, sdl_screen, &rect_dst); - SDL_UpdateRect(sdl_screen, x, y, TILEX, TILEY); -} - -void TEST_SDL_INIT_DISPLAY() -{ - SDL_Rect rect_src, rect_dst; - - if (SDL_Init(SDL_INIT_VIDEO) < 0) - { - fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError()); - exit(1); - } - - /* automatically cleanup SDL stuff after exit() */ - atexit(SDL_Quit); - - if ((sdl_screen = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, 16, SDL_HWSURFACE)) - == NULL) - { - fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError()); - exit(1); - } - - SDL_WM_SetCaption(WINDOW_TITLE_STRING, WINDOW_TITLE_STRING); - - if ((sdl_image_tmp = IMG_Load("graphics/RocksScreen.pcx")) == NULL) - { - fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError()); - exit(1); - } - - sdl_image = SDL_DisplayFormat(sdl_image_tmp); - - SDL_SetColorKey(sdl_image_tmp, SDL_SRCCOLORKEY, - SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00)); - sdl_image_masked = SDL_DisplayFormat(sdl_image_tmp); - - SDL_FreeSurface(sdl_image_tmp); - - if ((sdl_image2_tmp = IMG_Load("graphics/RocksHeroes.pcx")) == NULL) - { - fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError()); - exit(1); - } - - sdl_image2 = SDL_DisplayFormat(sdl_image2_tmp); - SDL_FreeSurface(sdl_image2_tmp); - - sdl_image2_masked = SDL_DisplayFormat(sdl_image2); - SDL_SetColorKey(sdl_image2_masked, SDL_SRCCOLORKEY, - SDL_MapRGB(sdl_image2_masked->format, 0x00, 0x00, 0x00)); - rect_src.x = 0; - rect_src.y = 0; - rect_src.w = sdl_image->w; - rect_src.h = sdl_image->h; - - rect_dst.x = 0; - rect_dst.y = 0; - rect_dst.w = sdl_image->w; - rect_dst.h = sdl_image->h; - - SDL_BlitSurface(sdl_image, &rect_src, sdl_screen, &rect_dst); - - /* - SDL_UpdateRect(sdl_screen, 0, 0, WIN_XSIZE, WIN_YSIZE); - */ - /* - SDL_UpdateRect(sdl_screen, 0, 0, 0, 0); - */ - SDL_Flip(sdl_screen); - - /* - SDL_Delay(5000); - */ -} - -void TEST_SDL_EVENT_LOOP() -{ - int quit_loop = 0; - - SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); - - /* - while (!quit_loop && SDL_WaitEvent(&event) >=0) - */ - - while (!quit_loop) - { - SDL_Event event; - - if (SDL_PollEvent(&event)) - { - /* hier werden die Ereignisse behandelt */ - switch(event.type) - { - case SDL_QUIT: - { - quit_loop = 1; - break; - } - - case SDL_MOUSEBUTTONDOWN: - { - int x = event.button.x; - int y = event.button.y; - - SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE); - - TEST_SDL_BLIT_RECT(x, y); - - printf("SDL_MOUSEBUTTONDOWN(%d, %d)\n", x, y); - break; - } - - case SDL_MOUSEBUTTONUP: - { - int x = event.button.x; - int y = event.button.y; - - SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); - - printf("SDL_MOUSEBUTTONUP(%d, %d)\n", x, y); - break; - } - - case SDL_MOUSEMOTION: - { - int x = event.motion.x; - int y = event.motion.y; - - TEST_SDL_BLIT_RECT(x, y); - - printf("SDL_MOUSEMOTION(%d, %d)\n", x, y); - break; - } - - default: - break; - } - } - - if (!SDL_PollEvent(NULL)) /* delay only if no pending events */ - { - printf("waiting...\n"); - Delay(100); - } - } - - SDL_FreeSurface(sdl_image); - SDL_Quit(); -} - -#define SCREEN_WIDTH 640 -#define SCREEN_HEIGHT 480 - -void WatchJoysticks() -{ - SDL_Surface *screen; - const char *name; - int i, done; - SDL_Event event; - int x, y, draw; - SDL_Rect axis_area[2]; - int joystick_nr = 0; - SDL_Joystick *joystick = Get_SDL_Joystick(joystick_nr); - - /* Set a video mode to display joystick axis position */ - screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, 0); - if ( screen == NULL ) { - fprintf(stderr, "Couldn't set video mode: %s\n",SDL_GetError()); - return; - } - - /* Print info about the joysticks we are watching */ - for (i=0; i<2; i++) - { - joystick = Get_SDL_Joystick(i); - - name = SDL_JoystickName(i); - printf("Watching joystick %d: (%s)\n", i, - name ? name : "Unknown Joystick"); - printf("Joystick has %d axes, %d hats, %d balls, and %d buttons\n", - SDL_JoystickNumAxes(joystick), - SDL_JoystickNumHats(joystick), - SDL_JoystickNumBalls(joystick), - SDL_JoystickNumButtons(joystick)); - } - - /* Initialize drawing rectangles */ - memset(axis_area, 0, (sizeof axis_area)); - draw = 0; - - /* Loop, getting joystick events! */ - done = 0; - while ( ! done ) { - while ( SDL_PollEvent(&event) ) { - switch (event.type) { - case SDL_JOYAXISMOTION: - joystick_nr = event.jaxis.which; - printf("Joystick %d axis %d value: %d\n", - event.jaxis.which, - event.jaxis.axis, - event.jaxis.value); - break; - case SDL_JOYHATMOTION: - joystick_nr = event.jaxis.which; - printf("Joystick %d hat %d value:", - event.jhat.which, - event.jhat.hat); - if ( event.jhat.value == SDL_HAT_CENTERED ) - printf(" centered"); - if ( event.jhat.value & SDL_HAT_UP ) - printf(" up"); - if ( event.jhat.value & SDL_HAT_RIGHT ) - printf(" right"); - if ( event.jhat.value & SDL_HAT_DOWN ) - printf(" down"); - if ( event.jhat.value & SDL_HAT_LEFT ) - printf(" left"); - printf("\n"); - break; - case SDL_JOYBALLMOTION: - joystick_nr = event.jaxis.which; - printf("Joystick %d ball %d delta: (%d,%d)\n", - event.jball.which, - event.jball.ball, - event.jball.xrel, - event.jball.yrel); - break; - case SDL_JOYBUTTONDOWN: - joystick_nr = event.jaxis.which; - printf("Joystick %d button %d down\n", - event.jbutton.which, - event.jbutton.button); - break; - case SDL_JOYBUTTONUP: - joystick_nr = event.jaxis.which; - printf("Joystick %d button %d up\n", - event.jbutton.which, - event.jbutton.button); - break; - case SDL_KEYDOWN: - if ( event.key.keysym.sym != SDLK_ESCAPE ) { - break; - } - /* Fall through to signal quit */ - case SDL_QUIT: - done = 1; - break; - default: - break; - } - } - - joystick = Get_SDL_Joystick(joystick_nr); - - /* Update visual joystick state */ - for ( i=0; i (SCREEN_WIDTH-16) ) { - x = SCREEN_WIDTH-16; - } - y = (((int)SDL_JoystickGetAxis(joystick, 1))+32768); - y *= SCREEN_HEIGHT; - y /= 65535; - if ( y < 0 ) { - y = 0; - } else - if ( y > (SCREEN_HEIGHT-16) ) { - y = SCREEN_HEIGHT-16; - } - axis_area[draw].x = (Sint16)x; - axis_area[draw].y = (Sint16)y; - axis_area[draw].w = 16; - axis_area[draw].h = 16; - SDL_FillRect(screen, &axis_area[draw], 0xFFFF); - - SDL_UpdateRects(screen, 2, axis_area); - } -} - -void TEST_SDL_JOYSTICK() -{ - const char *name; - int i; - - /* Initialize SDL (Note: video is required to start event loop) */ - if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0 ) - { - fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); - exit(1); - } - - /* Print information about the joysticks */ - printf("There are %d joysticks attached\n", SDL_NumJoysticks()); - for ( i=0; i