X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.c;h=b5682e81a579904abb88cb0ddbcabff0f8141682;hb=e5a0a3097d6a6c3afea01b3deeee9b206982ec1d;hp=990a7b7155309394d72ca70cb3f2edfff51109e1;hpb=15064a21ef26f67d41de4930badd03838978c9d7;p=rocksndiamonds.git diff --git a/src/main.c b/src/main.c index 990a7b71..b5682e81 100644 --- a/src/main.c +++ b/src/main.c @@ -19,14 +19,7 @@ #include "events.h" #include "config.h" -#if 0 -GC tile_clip_gc; -Bitmap *pix[NUM_BITMAPS]; -#endif Bitmap *bitmap_db_field, *bitmap_db_door; -#if 0 -Pixmap tile_clipmask[NUM_TILES]; -#endif DrawBuffer *fieldbuffer; DrawBuffer *drawto_field; @@ -34,6 +27,11 @@ int game_status = -1; boolean level_editor_test_game = FALSE; boolean network_playing = FALSE; +#if defined(TARGET_SDL) +boolean network_server = FALSE; +SDL_Thread *server_thread; +#endif + int key_joystick_mapping = 0; boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE]; @@ -45,21 +43,24 @@ short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short ChangeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short ChangePage[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +short CustomValue[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 Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; boolean Pushed[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; -unsigned long Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; -unsigned long ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +short ChangeCount[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +short ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short WasJustMoving[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short WasJustFalling[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +short CheckCollision[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short AmoebaCnt[MAX_NUM_AMOEBA]; short AmoebaCnt2[MAX_NUM_AMOEBA]; -short ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +short ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +short ExplodeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; int RunnerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; int PlayerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; @@ -76,7 +77,7 @@ int scroll_x, scroll_y; int FX = SX, FY = SY; int ScrollStepSize; -int ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0; +int ScreenMovDir = MV_NONE, ScreenMovPos = 0; int ScreenGfxPos = 0; int BorderElement = EL_STEELWALL; int GameFrameDelay = GAME_FRAME_DELAY; @@ -89,7 +90,7 @@ int ZX, ZY; int ExitX, ExitY; int AllPlayersGone; -int TimeFrames, TimePlayed, TimeLeft; +int TimeFrames, TimePlayed, TimeLeft, TapeTime; boolean network_player_action_received = FALSE; @@ -115,7 +116,10 @@ SetupFileHash *helptext_info = NULL; /* element definitions */ /* ------------------------------------------------------------------------- */ -struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] = +struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1]; + +/* this contains predefined structure elements to initialize "element_info" */ +struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] = { /* keyword to start parser: "ELEMENT_INFO_START" <-- do not change! */ @@ -657,7 +661,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] = { "black_orb", "black_orb", - "bomb" + "black orb bomb" }, { "amoeba_to_diamond", @@ -740,7 +744,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] = "letter '$'" }, { - "char_procent", + "char_percent", "char", "letter '%'" }, @@ -1752,27 +1756,27 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] = { "balloon_switch_left", "balloon_switch", - "send balloon to the left" + "wind switch (left)" }, { "balloon_switch_right", "balloon_switch", - "send balloon to the right" + "wind switch (right)" }, { "balloon_switch_up", "balloon_switch", - "send balloon up" + "wind switch (up)" }, { "balloon_switch_down", "balloon_switch", - "send balloon down" + "wind switch (down)" }, { "balloon_switch_any", "balloon_switch", - "send balloon in any direction" + "wind switch (any direction)" }, { "emc_steelwall_1", @@ -3394,6 +3398,251 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] = "group", "group element 32" }, + { + "unknown", + "unknown", + "unknown element" + }, + { + "trigger_element", + "trigger", + "element triggering change" + }, + { + "trigger_player", + "trigger", + "player triggering change" + }, + { + "sp_gravity_on_port_right", + "sp_port", + "gravity on port (leading right)" + }, + { + "sp_gravity_on_port_down", + "sp_port", + "gravity on port (leading down)" + }, + { + "sp_gravity_on_port_left", + "sp_port", + "gravity on port (leading left)" + }, + { + "sp_gravity_on_port_up", + "sp_port", + "gravity on port (leading up)" + }, + { + "sp_gravity_off_port_right", + "sp_port", + "gravity off port (leading right)" + }, + { + "sp_gravity_off_port_down", + "sp_port", + "gravity off port (leading down)" + }, + { + "sp_gravity_off_port_left", + "sp_port", + "gravity off port (leading left)" + }, + { + "sp_gravity_off_port_up", + "sp_port", + "gravity off port (leading up)" + }, + { + "balloon_switch_none", + "balloon_switch", + "wind switch (off)" + }, + { + "emc_gate_5", + "gate", + "door 5 (EMC style)", + }, + { + "emc_gate_6", + "gate", + "door 6 (EMC style)", + }, + { + "emc_gate_7", + "gate", + "door 7 (EMC style)", + }, + { + "emc_gate_8", + "gate", + "door 8 (EMC style)", + }, + { + "emc_gate_5_gray", + "gate", + "gray door (EMC style, key 5)", + }, + { + "emc_gate_6_gray", + "gate", + "gray door (EMC style, key 6)", + }, + { + "emc_gate_7_gray", + "gate", + "gray door (EMC style, key 7)", + }, + { + "emc_gate_8_gray", + "gate", + "gray door (EMC style, key 8)", + }, + { + "emc_key_5", + "key", + "key 5 (EMC style)", + }, + { + "emc_key_6", + "key", + "key 6 (EMC style)", + }, + { + "emc_key_7", + "key", + "key 7 (EMC style)", + }, + { + "emc_key_8", + "key", + "key 8 (EMC style)", + }, + { + "emc_android", + "emc_android", + "android", + }, + { + "emc_grass", + "emc_grass", + "grass", + }, + { + "emc_magic_ball", + "emc_magic_ball", + "magic ball", + }, + { + "emc_magic_ball.active", + "emc_magic_ball", + "magic ball (activated)", + }, + { + "emc_magic_ball_switch", + "emc_magic_ball_switch", + "magic ball switch (off)", + }, + { + "emc_magic_ball_switch.active", + "emc_magic_ball_switch", + "magic ball switch (on)", + }, + { + "emc_spring_bumper", + "emc_spring_bumper", + "spring bumper", + }, + { + "emc_plant", + "emc_plant", + "plant", + }, + { + "emc_lenses", + "emc_lenses", + "lenses", + }, + { + "emc_magnifier", + "emc_magnifier", + "magnifier", + }, + { + "emc_wall_9", + "wall", + "normal wall" + }, + { + "emc_wall_10", + "wall", + "normal wall" + }, + { + "emc_wall_11", + "wall", + "normal wall" + }, + { + "emc_wall_12", + "wall", + "normal wall" + }, + { + "emc_wall_13", + "wall", + "normal wall" + }, + { + "emc_wall_14", + "wall", + "normal wall" + }, + { + "emc_wall_15", + "wall", + "normal wall" + }, + { + "emc_wall_16", + "wall", + "normal wall" + }, + { + "emc_wall_slippery_1", + "wall", + "slippery wall" + }, + { + "emc_wall_slippery_2", + "wall", + "slippery wall" + }, + { + "emc_wall_slippery_3", + "wall", + "slippery wall" + }, + { + "emc_wall_slippery_4", + "wall", + "slippery wall" + }, + { + "emc_fake_grass", + "fake_grass", + "fake grass" + }, + { + "emc_fake_acid", + "fake_acid", + "fake acid" + }, + { + "emc_dripper", + "dripper", + "dripper" + }, /* ----------------------------------------------------------------------- */ /* "real" (and therefore drawable) runtime elements */ @@ -3625,6 +3874,82 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] = "-" }, + { + "emc_fake_grass.active", + "fake_grass", + "-" + }, + { + "gate_1_gray.active", + "gate", + "" + }, + { + "gate_2_gray.active", + "gate", + "" + }, + { + "gate_3_gray.active", + "gate", + "" + }, + { + "gate_4_gray.active", + "gate", + "" + }, + { + "em_gate_1_gray.active", + "gate", + "" + }, + { + "em_gate_2_gray.active", + "gate", + "" + }, + { + "em_gate_3_gray.active", + "gate", + "" + }, + { + "em_gate_4_gray.active", + "gate", + "" + }, + { + "emc_gate_5_gray.active", + "gate", + "", + }, + { + "emc_gate_6_gray.active", + "gate", + "", + }, + { + "emc_gate_7_gray.active", + "gate", + "", + }, + { + "emc_gate_8_gray.active", + "gate", + "", + }, + { + "emc_dripper.active", + "dripper", + "dripper" + }, + { + "emc_spring_bumper.active", + "emc_spring_bumper", + "spring bumper", + }, + /* ----------------------------------------------------------------------- */ /* "unreal" (and therefore not drawable) runtime elements */ /* ----------------------------------------------------------------------- */ @@ -3684,6 +4009,26 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] = "-", "-" }, + { + "player_is_exploding_1", + "-", + "-" + }, + { + "player_is_exploding_2", + "-", + "-" + }, + { + "player_is_exploding_3", + "-", + "-" + }, + { + "player_is_exploding_4", + "-", + "-" + }, { "quicksand.filling", "quicksand", @@ -3699,6 +4044,21 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] = "-", "-" }, + { + "element.snapping", + "-", + "-" + }, + { + "diagonal.shrinking", + "-", + "-" + }, + { + "diagonal.growing", + "-", + "-" + }, /* ----------------------------------------------------------------------- */ /* dummy elements (never used as game elements, only used as graphics) */ @@ -3830,15 +4190,165 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] = "-" }, { - "internal/editor", + "internal_clipboard_custom", "internal", - "-" + "empty custom element" }, { - "internal/dummy", + "internal_clipboard_change", + "internal", + "empty change page" + }, + { + "internal_clipboard_group", + "internal", + "empty group element" + }, + { + "internal_dummy", "internal", "-" }, + { + "internal_cascade_bd", + "internal", + "show Boulder Dash elements" + }, + { + "internal_cascade_bd.active", + "internal", + "hide Boulder Dash elements" + }, + { + "internal_cascade_em", + "internal", + "show Emerald Mine elements" + }, + { + "internal_cascade_em.active", + "internal", + "hide Emerald Mine elements" + }, + { + "internal_cascade_emc", + "internal", + "show Emerald Mine Club elements" + }, + { + "internal_cascade_emc.active", + "internal", + "hide Emerald Mine Club elements" + }, + { + "internal_cascade_rnd", + "internal", + "show Rocks'n'Diamonds elements" + }, + { + "internal_cascade_rnd.active", + "internal", + "hide Rocks'n'Diamonds elements" + }, + { + "internal_cascade_sb", + "internal", + "show Sokoban elements" + }, + { + "internal_cascade_sb.active", + "internal", + "hide Sokoban elements" + }, + { + "internal_cascade_sp", + "internal", + "show Supaplex elements" + }, + { + "internal_cascade_sp.active", + "internal", + "hide Supaplex elements" + }, + { + "internal_cascade_dc", + "internal", + "show Diamond Caves II elements" + }, + { + "internal_cascade_dc.active", + "internal", + "hide Diamond Caves II elements" + }, + { + "internal_cascade_dx", + "internal", + "show DX Boulderdash elements" + }, + { + "internal_cascade_dx.active", + "internal", + "hide DX Boulderdash elements" + }, + { + "internal_cascade_chars", + "internal", + "show text elements" + }, + { + "internal_cascade_chars.active", + "internal", + "hide text elements" + }, + { + "internal_cascade_ce", + "internal", + "show custom elements" + }, + { + "internal_cascade_ce.active", + "internal", + "hide custom elements" + }, + { + "internal_cascade_ge", + "internal", + "show group elements" + }, + { + "internal_cascade_ge.active", + "internal", + "hide group elements" + }, + { + "internal_cascade_user", + "internal", + "show user defined elements" + }, + { + "internal_cascade_user.active", + "internal", + "hide user defined elements" + }, + { + "internal_cascade_generic", + "internal", + "show elements" + }, + { + "internal_cascade_generic.active", + "internal", + "hide elements" + }, + { + "internal_cascade_dynamic", + "internal", + "show elements used in this level" + }, + { + "internal_cascade_dynamic.active", + "internal", + "hide elements used in this level" + }, /* keyword to stop parser: "ELEMENT_INFO_END" <-- do not change! */ @@ -3903,6 +4413,43 @@ struct ElementActionInfo element_action_info[NUM_ACTIONS + 1 + 1] = { ".turning_from_right", ACTION_TURNING_FROM_RIGHT, FALSE }, { ".turning_from_up", ACTION_TURNING_FROM_UP, FALSE }, { ".turning_from_down", ACTION_TURNING_FROM_DOWN, FALSE }, + { ".smashed_by_rock", ACTION_SMASHED_BY_ROCK, FALSE }, + { ".smashed_by_spring", ACTION_SMASHED_BY_SPRING, FALSE }, + { ".slurped_by_spring", ACTION_SLURPED_BY_SPRING, FALSE }, + { ".twinkling", ACTION_TWINKLING, FALSE }, + { ".splashing", ACTION_SPLASHING, FALSE }, + { ".page[1]", ACTION_PAGE_1, FALSE }, + { ".page[2]", ACTION_PAGE_2, FALSE }, + { ".page[3]", ACTION_PAGE_3, FALSE }, + { ".page[4]", ACTION_PAGE_4, FALSE }, + { ".page[5]", ACTION_PAGE_5, FALSE }, + { ".page[6]", ACTION_PAGE_6, FALSE }, + { ".page[7]", ACTION_PAGE_7, FALSE }, + { ".page[8]", ACTION_PAGE_8, FALSE }, + { ".page[9]", ACTION_PAGE_9, FALSE }, + { ".page[10]", ACTION_PAGE_10, FALSE }, + { ".page[11]", ACTION_PAGE_11, FALSE }, + { ".page[12]", ACTION_PAGE_12, FALSE }, + { ".page[13]", ACTION_PAGE_13, FALSE }, + { ".page[14]", ACTION_PAGE_14, FALSE }, + { ".page[15]", ACTION_PAGE_15, FALSE }, + { ".page[16]", ACTION_PAGE_16, FALSE }, + { ".page[17]", ACTION_PAGE_17, FALSE }, + { ".page[18]", ACTION_PAGE_18, FALSE }, + { ".page[19]", ACTION_PAGE_19, FALSE }, + { ".page[20]", ACTION_PAGE_20, FALSE }, + { ".page[21]", ACTION_PAGE_21, FALSE }, + { ".page[22]", ACTION_PAGE_22, FALSE }, + { ".page[23]", ACTION_PAGE_23, FALSE }, + { ".page[24]", ACTION_PAGE_24, FALSE }, + { ".page[25]", ACTION_PAGE_25, FALSE }, + { ".page[26]", ACTION_PAGE_26, FALSE }, + { ".page[27]", ACTION_PAGE_27, FALSE }, + { ".page[28]", ACTION_PAGE_28, FALSE }, + { ".page[29]", ACTION_PAGE_29, FALSE }, + { ".page[30]", ACTION_PAGE_30, FALSE }, + { ".page[31]", ACTION_PAGE_31, FALSE }, + { ".page[32]", ACTION_PAGE_32, FALSE }, { ".other", ACTION_OTHER, FALSE }, /* empty suffix always matches -- check as last entry in InitSoundInfo() */ @@ -3911,12 +4458,16 @@ struct ElementActionInfo element_action_info[NUM_ACTIONS + 1 + 1] = { NULL, 0, 0 } }; -struct ElementDirectionInfo element_direction_info[NUM_DIRECTIONS + 1] = +struct ElementDirectionInfo element_direction_info[NUM_DIRECTIONS_FULL + 1] = { { ".left", MV_BIT_LEFT }, { ".right", MV_BIT_RIGHT }, { ".up", MV_BIT_UP }, { ".down", MV_BIT_DOWN }, + { ".upleft", MV_BIT_UP }, + { ".upright", MV_BIT_RIGHT }, + { ".downleft", MV_BIT_LEFT }, + { ".downright", MV_BIT_DOWN }, { NULL, 0 } }; @@ -3945,8 +4496,8 @@ struct TokenIntPtrInfo image_config_vars[] = { { "global.num_toons", &global.num_toons }, - { "menu.draw_xoffset", &menu.draw_xoffset_default }, - { "menu.draw_yoffset", &menu.draw_yoffset_default }, + { "menu.draw_xoffset", &menu.draw_xoffset[GFX_SPECIAL_ARG_DEFAULT]}, + { "menu.draw_yoffset", &menu.draw_yoffset[GFX_SPECIAL_ARG_DEFAULT]}, { "menu.draw_xoffset.MAIN", &menu.draw_xoffset[GFX_SPECIAL_ARG_MAIN] }, { "menu.draw_yoffset.MAIN", &menu.draw_yoffset[GFX_SPECIAL_ARG_MAIN] }, { "menu.draw_xoffset.LEVELS", &menu.draw_xoffset[GFX_SPECIAL_ARG_LEVELS] }, @@ -3962,14 +4513,18 @@ struct TokenIntPtrInfo image_config_vars[] = { "menu.scrollbar_xoffset", &menu.scrollbar_xoffset }, - { "menu.list_size", &menu.list_size_default }, + { "menu.list_size", &menu.list_size[GFX_SPECIAL_ARG_DEFAULT] }, { "menu.list_size.LEVELS", &menu.list_size[GFX_SPECIAL_ARG_LEVELS] }, { "menu.list_size.SCORES", &menu.list_size[GFX_SPECIAL_ARG_SCORES] }, { "menu.list_size.INFO", &menu.list_size[GFX_SPECIAL_ARG_INFO] }, + { "door_1.width", &door_1.width }, + { "door_1.height", &door_1.height }, { "door_1.step_offset", &door_1.step_offset }, { "door_1.step_delay", &door_1.step_delay }, { "door_1.anim_mode", &door_1.anim_mode }, + { "door_2.width", &door_2.width }, + { "door_2.height", &door_2.height }, { "door_2.step_offset", &door_2.step_offset }, { "door_2.step_delay", &door_2.step_delay }, { "door_2.anim_mode", &door_2.anim_mode }, @@ -4059,7 +4614,7 @@ static void print_usage() " --serveronly only start network server\n" " -v, --verbose verbose mode\n" " --debug display debugging information\n" - " -e, --execute COMMAND execute batch COMMAND:\n" + " -e, --execute COMMAND execute batch COMMAND\n" "\n" "Valid commands for '--execute' option:\n" " \"print graphicsinfo.conf\" print default graphics config\n" @@ -4070,7 +4625,8 @@ static void print_usage() " \"print helptext.conf\" print default helptext config\n" " \"dump level FILE\" dump level data from FILE\n" " \"dump tape FILE\" dump tape data from FILE\n" - " \"autoplay LEVELDIR\" play level tapes for LEVELDIR\n" + " \"autoplay LEVELDIR [NR ...]\" play level tapes for LEVELDIR\n" + " \"convert LEVELDIR [NR]\" convert levels in LEVELDIR\n" "\n", program.command_basename); }