fixed bug with handling networking packets if request dialog is active
[rocksndiamonds.git] / src / init.c
index 45f08cd69aac51c75b34b248260252107111dc1f..2167984b663649481289e4d4c0c5f14be1670312 100644 (file)
@@ -88,7 +88,7 @@ static int copy_properties[][5] =
 static int get_graphic_parameter_value(char *, char *, int);
 
 
-void DrawInitAnim()
+static void DrawInitAnim(void)
 {
   struct GraphicInfo *graphic_info_last = graphic_info;
   int graphic = 0;
@@ -136,7 +136,21 @@ void DrawInitAnim()
   FrameCounter++;
 }
 
-void FreeGadgets()
+static void DrawProgramInfo(void)
+{
+  int font1_nr = FC_YELLOW;
+  int font2_nr = FC_RED;
+  int font2_height = getFontHeight(font2_nr);
+  int ypos1 = 20;
+  int ypos2 = 50;
+  int ypos3 = WIN_YSIZE - 20 - font2_height;
+
+  DrawInitText(getProgramInitString(),           ypos1, font1_nr);
+  DrawInitText(setup.internal.program_copyright, ypos2, font2_nr);
+  DrawInitText(setup.internal.program_website,   ypos3, font2_nr);
+}
+
+static void FreeGadgets(void)
 {
   FreeLevelEditorGadgets();
   FreeGameButtons();
@@ -145,7 +159,7 @@ void FreeGadgets()
   FreeScreenGadgets();
 }
 
-void InitGadgets()
+void InitGadgets(void)
 {
   static boolean gadgets_initialized = FALSE;
 
@@ -171,7 +185,7 @@ inline static void InitElementSmallImagesScaledUp(int graphic)
   CreateImageWithSmallImages(graphic, g->scale_up_factor, g->tile_size);
 }
 
-void InitElementSmallImages()
+static void InitElementSmallImages(void)
 {
   print_timestamp_init("InitElementSmallImages");
 
@@ -233,7 +247,7 @@ inline static void InitScaledImagesScaledUp(int graphic)
   ScaleImage(graphic, g->scale_up_factor);
 }
 
-void InitScaledImages()
+static void InitScaledImages(void)
 {
   struct PropertyMapping *property_mapping = getImageListPropertyMapping();
   int num_property_mappings = getImageListPropertyMappingSize();
@@ -248,7 +262,7 @@ void InitScaledImages()
     InitScaledImagesScaledUp(property_mapping[i].artwork_index);
 }
 
-void InitBitmapPointers()
+static void InitBitmapPointers(void)
 {
   int num_images = getImageListSize();
   int i;
@@ -259,7 +273,7 @@ void InitBitmapPointers()
       graphic_info[i].bitmap = graphic_info[i].bitmaps[IMG_BITMAP_STANDARD];
 }
 
-void InitImageTextures()
+void InitImageTextures(void)
 {
   int i, j, k;
 
@@ -333,7 +347,7 @@ static int getFontFromToken(char *token)
   return FONT_INITIAL_1;
 }
 
-void InitFontGraphicInfo()
+static void InitFontGraphicInfo(void)
 {
   static struct FontBitmapInfo *font_bitmap_info = NULL;
   struct PropertyMapping *property_mapping = getImageListPropertyMapping();
@@ -572,7 +586,7 @@ void InitFontGraphicInfo()
               getFontBitmapID, getFontFromToken);
 }
 
-void InitGlobalAnimGraphicInfo()
+static void InitGlobalAnimGraphicInfo(void)
 {
   struct PropertyMapping *property_mapping = getImageListPropertyMapping();
   int num_property_mappings = getImageListPropertyMappingSize();
@@ -644,7 +658,7 @@ void InitGlobalAnimGraphicInfo()
 #endif
 }
 
-void InitGlobalAnimSoundInfo()
+static void InitGlobalAnimSoundInfo(void)
 {
   struct PropertyMapping *property_mapping = getSoundListPropertyMapping();
   int num_property_mappings = getSoundListPropertyMappingSize();
@@ -693,7 +707,7 @@ void InitGlobalAnimSoundInfo()
 #endif
 }
 
-void InitGlobalAnimMusicInfo()
+static void InitGlobalAnimMusicInfo(void)
 {
   struct PropertyMapping *property_mapping = getMusicListPropertyMapping();
   int num_property_mappings = getMusicListPropertyMappingSize();
@@ -742,7 +756,7 @@ void InitGlobalAnimMusicInfo()
 #endif
 }
 
-void InitElementGraphicInfo()
+static void InitElementGraphicInfo(void)
 {
   struct PropertyMapping *property_mapping = getImageListPropertyMapping();
   int num_property_mappings = getImageListPropertyMappingSize();
@@ -1123,7 +1137,7 @@ void InitElementGraphicInfo()
   UPDATE_BUSY_STATE();
 }
 
-void InitElementSpecialGraphicInfo()
+static void InitElementSpecialGraphicInfo(void)
 {
   struct PropertyMapping *property_mapping = getImageListPropertyMapping();
   int num_property_mappings = getImageListPropertyMappingSize();
@@ -1289,6 +1303,8 @@ static void set_graphic_parameters_ext(int graphic, int *parameter,
   g->post_delay_random = 0;
   g->init_event = ANIM_EVENT_DEFAULT;
   g->anim_event = ANIM_EVENT_DEFAULT;
+  g->init_event_action = -1;
+  g->anim_event_action = -1;
   g->draw_masked = FALSE;
   g->draw_order = 0;
   g->fade_mode = FADE_MODE_DEFAULT;
@@ -1511,6 +1527,10 @@ static void set_graphic_parameters_ext(int graphic, int *parameter,
     g->init_event = parameter[GFX_ARG_INIT_EVENT];
   if (parameter[GFX_ARG_ANIM_EVENT] != ARG_UNDEFINED_VALUE)
     g->anim_event = parameter[GFX_ARG_ANIM_EVENT];
+  if (parameter[GFX_ARG_INIT_EVENT_ACTION] != ARG_UNDEFINED_VALUE)
+    g->init_event_action = parameter[GFX_ARG_INIT_EVENT_ACTION];
+  if (parameter[GFX_ARG_ANIM_EVENT_ACTION] != ARG_UNDEFINED_VALUE)
+    g->anim_event_action = parameter[GFX_ARG_ANIM_EVENT_ACTION];
 
   /* used for toon animations and global animations */
   g->step_offset  = parameter[GFX_ARG_STEP_OFFSET];
@@ -1633,7 +1653,7 @@ static void set_cloned_graphic_parameters(int graphic)
   }
 }
 
-static void InitGraphicInfo()
+static void InitGraphicInfo(void)
 {
   int fallback_graphic = IMG_CHAR_EXCLAM;
   int num_images = getImageListSize();
@@ -1813,7 +1833,7 @@ static void InitGraphicInfo()
   }
 }
 
-static void InitGraphicCompatibilityInfo()
+static void InitGraphicCompatibilityInfo(void)
 {
   struct FileInfo *fi_global_door =
     getImageListEntryFromImageID(IMG_GLOBAL_DOOR);
@@ -1855,7 +1875,7 @@ static void InitGraphicCompatibilityInfo()
   InitGraphicCompatibilityInfo_Doors();
 }
 
-static void InitElementSoundInfo()
+static void InitElementSoundInfo(void)
 {
   struct PropertyMapping *property_mapping = getSoundListPropertyMapping();
   int num_property_mappings = getSoundListPropertyMappingSize();
@@ -1959,7 +1979,7 @@ static void InitElementSoundInfo()
          element_info[copy_properties[i][0]].sound[act];
 }
 
-static void InitGameModeSoundInfo()
+static void InitGameModeSoundInfo(void)
 {
   int i;
 
@@ -2008,7 +2028,7 @@ static void set_sound_parameters(int sound, char **parameter_raw)
   sound_info[sound].priority = parameter[SND_ARG_PRIORITY];
 }
 
-static void InitSoundInfo()
+static void InitSoundInfo(void)
 {
   int *sound_effect_properties;
   int num_sounds = getSoundListSize();
@@ -2075,7 +2095,7 @@ static void InitSoundInfo()
   free(sound_effect_properties);
 }
 
-static void InitGameModeMusicInfo()
+static void InitGameModeMusicInfo(void)
 {
   struct PropertyMapping *property_mapping = getMusicListPropertyMapping();
   int num_property_mappings = getMusicListPropertyMappingSize();
@@ -2158,7 +2178,7 @@ static void set_music_parameters(int music, char **parameter_raw)
     music_info[music].loop = parameter[MUS_ARG_MODE_LOOP];
 }
 
-static void InitMusicInfo()
+static void InitMusicInfo(void)
 {
   int num_music = getMusicListSize();
   int i, j;
@@ -2194,7 +2214,7 @@ static void InitMusicInfo()
   }
 }
 
-static void ReinitializeGraphics()
+static void ReinitializeGraphics(void)
 {
   print_timestamp_init("ReinitializeGraphics");
 
@@ -2240,7 +2260,7 @@ static void ReinitializeGraphics()
   print_timestamp_done("ReinitializeGraphics");
 }
 
-static void ReinitializeSounds()
+static void ReinitializeSounds(void)
 {
   InitSoundInfo();             /* sound properties mapping */
   InitElementSoundInfo();      /* element game sound mapping */
@@ -2250,7 +2270,7 @@ static void ReinitializeSounds()
   InitPlayLevelSound();                /* internal game sound settings */
 }
 
-static void ReinitializeMusic()
+static void ReinitializeMusic(void)
 {
   InitMusicInfo();             /* music properties mapping */
   InitGameModeMusicInfo();     /* game mode music mapping */
@@ -2442,7 +2462,7 @@ void ResolveGroupElement(int group_element)
   ResolveGroupElementExt(group_element, 0);
 }
 
-void InitElementPropertiesStatic()
+void InitElementPropertiesStatic(void)
 {
   static boolean clipboard_elements_initialized = FALSE;
 
@@ -3654,12 +3674,8 @@ void InitElementPropertiesStatic()
     EL_INVISIBLE_WALL_ACTIVE,
     EL_SWITCHGATE_SWITCH_UP,
     EL_SWITCHGATE_SWITCH_DOWN,
-    EL_DC_SWITCHGATE_SWITCH_UP,
-    EL_DC_SWITCHGATE_SWITCH_DOWN,
     EL_TIMEGATE_SWITCH,
     EL_TIMEGATE_SWITCH_ACTIVE,
-    EL_DC_TIMEGATE_SWITCH,
-    EL_DC_TIMEGATE_SWITCH_ACTIVE,
     EL_EMC_WALL_1,
     EL_EMC_WALL_2,
     EL_EMC_WALL_3,
@@ -3728,6 +3744,12 @@ void InitElementPropertiesStatic()
     EL_SIGN_FRANKIE,
     EL_STEEL_EXIT_CLOSED,
     EL_STEEL_EXIT_OPEN,
+    EL_STEEL_EXIT_OPENING,
+    EL_STEEL_EXIT_CLOSING,
+    EL_EM_STEEL_EXIT_CLOSED,
+    EL_EM_STEEL_EXIT_OPEN,
+    EL_EM_STEEL_EXIT_OPENING,
+    EL_EM_STEEL_EXIT_CLOSING,
     EL_DC_STEELWALL_1_LEFT,
     EL_DC_STEELWALL_1_RIGHT,
     EL_DC_STEELWALL_1_TOP,
@@ -3780,14 +3802,34 @@ void InitElementPropertiesStatic()
     EL_EM_GATE_2_GRAY_ACTIVE,
     EL_EM_GATE_3_GRAY_ACTIVE,
     EL_EM_GATE_4_GRAY_ACTIVE,
+    EL_EMC_GATE_5,
+    EL_EMC_GATE_6,
+    EL_EMC_GATE_7,
+    EL_EMC_GATE_8,
+    EL_EMC_GATE_5_GRAY,
+    EL_EMC_GATE_6_GRAY,
+    EL_EMC_GATE_7_GRAY,
+    EL_EMC_GATE_8_GRAY,
+    EL_EMC_GATE_5_GRAY_ACTIVE,
+    EL_EMC_GATE_6_GRAY_ACTIVE,
+    EL_EMC_GATE_7_GRAY_ACTIVE,
+    EL_EMC_GATE_8_GRAY_ACTIVE,
+    EL_DC_GATE_WHITE,
+    EL_DC_GATE_WHITE_GRAY,
+    EL_DC_GATE_WHITE_GRAY_ACTIVE,
+    EL_DC_GATE_FAKE_GRAY,
     EL_SWITCHGATE_OPEN,
     EL_SWITCHGATE_OPENING,
     EL_SWITCHGATE_CLOSED,
     EL_SWITCHGATE_CLOSING,
+    EL_DC_SWITCHGATE_SWITCH_UP,
+    EL_DC_SWITCHGATE_SWITCH_DOWN,
     EL_TIMEGATE_OPEN,
     EL_TIMEGATE_OPENING,
     EL_TIMEGATE_CLOSED,
     EL_TIMEGATE_CLOSING,
+    EL_DC_TIMEGATE_SWITCH,
+    EL_DC_TIMEGATE_SWITCH_ACTIVE,
     EL_TUBE_ANY,
     EL_TUBE_VERTICAL,
     EL_TUBE_HORIZONTAL,
@@ -3799,6 +3841,9 @@ void InitElementPropertiesStatic()
     EL_TUBE_LEFT_DOWN,
     EL_TUBE_RIGHT_UP,
     EL_TUBE_RIGHT_DOWN,
+    EL_EXPANDABLE_STEELWALL_HORIZONTAL,
+    EL_EXPANDABLE_STEELWALL_VERTICAL,
+    EL_EXPANDABLE_STEELWALL_ANY,
 
     -1
   };
@@ -4539,8 +4584,8 @@ void InitElementPropertiesEngine(int engine_version)
     if (IS_HISTORIC_SOLID(i) || i == EL_EXPLOSION)
       SET_PROPERTY(i, EP_DRAGONFIRE_PROOF, TRUE);
     else
-      SET_PROPERTY(i, EP_DRAGONFIRE_PROOF, (IS_CUSTOM_ELEMENT(i) &&
-                                           IS_INDESTRUCTIBLE(i)));
+      SET_PROPERTY(i, EP_DRAGONFIRE_PROOF, (IS_INDESTRUCTIBLE(i) &&
+                                           i != EL_ACID));
 
     /* ---------- EXPLOSION_PROOF ------------------------------------------ */
     if (i == EL_FLAMES)
@@ -4694,7 +4739,7 @@ void InitElementPropertiesEngine(int engine_version)
     InitElementGraphicInfo();
 }
 
-void InitElementPropertiesGfxElement()
+void InitElementPropertiesGfxElement(void)
 {
   int i;
 
@@ -4706,7 +4751,7 @@ void InitElementPropertiesGfxElement()
   }
 }
 
-static void InitGlobal()
+static void InitGlobal(void)
 {
   int graphic;
   int i;
@@ -4843,7 +4888,7 @@ static void InitGlobal()
   global.use_envelope_request = FALSE;
 }
 
-void Execute_Command(char *command)
+static void Execute_Command(char *command)
 {
   int i;
 
@@ -5045,9 +5090,12 @@ void Execute_Command(char *command)
   {
     Error(ERR_EXIT_HELP, "unrecognized command '%s'", command);
   }
+
+  /* disable networking if any valid command was recognized */
+  options.network = setup.network_mode = FALSE;
 }
 
-static void InitSetup()
+static void InitSetup(void)
 {
   LoadSetup();                                 /* global setup info */
   LoadSetup_AutoSetup();                       /* global auto setup info */
@@ -5061,13 +5109,14 @@ static void InitSetup()
     global.show_frames_per_second = TRUE;
 }
 
-static void InitGameInfo()
+static void InitGameInfo(void)
 {
   game.restart_level = FALSE;
   game.restart_game_message = NULL;
+  game.request_active = FALSE;
 }
 
-static void InitPlayerInfo()
+static void InitPlayerInfo(void)
 {
   int i;
 
@@ -5075,12 +5124,15 @@ static void InitPlayerInfo()
   local_player = &stored_player[0];
 
   for (i = 0; i < MAX_PLAYERS; i++)
-    stored_player[i].connected = FALSE;
+  {
+    stored_player[i].connected_locally = FALSE;
+    stored_player[i].connected_network = FALSE;
+  }
 
-  local_player->connected = TRUE;
+  local_player->connected_locally = TRUE;
 }
 
-static void InitArtworkInfo()
+static void InitArtworkInfo(void)
 {
   LoadArtworkInfo();
 }
@@ -5106,7 +5158,7 @@ static char *get_level_id_suffix(int id_nr)
   return id_suffix;
 }
 
-static void InitArtworkConfig()
+static void InitArtworkConfig(void)
 {
   static char *image_id_prefix[MAX_NUM_ELEMENTS +
                               NUM_FONTS +
@@ -5226,14 +5278,25 @@ static void InitArtworkConfig()
                level_id_suffix, ignore_music_tokens);
 }
 
-static void InitMixer()
+static void InitMixer(void)
 {
   OpenAudio();
 
   StartMixer();
 }
 
-void InitGfxBuffers()
+static void InitVideoOverlay(void)
+{
+  // if virtual buttons are not loaded from setup file, repeat initializing
+  // virtual buttons grid with default values now that video is initialized
+  if (!setup.touch.grid_initialized)
+    InitSetup();
+
+  InitTileCursorInfo();
+  InitOverlayInfo();
+}
+
+void InitGfxBuffers(void)
 {
   static int win_xsize_last = -1;
   static int win_ysize_last = -1;
@@ -5273,13 +5336,12 @@ void InitGfxBuffers()
   InitGfxBuffers_SP();
 }
 
-void InitGfx()
+static void InitGfx(void)
 {
   struct GraphicInfo *graphic_info_last = graphic_info;
   char *filename_font_initial = NULL;
   char *filename_anim_initial = NULL;
   Bitmap *bitmap_font_initial = NULL;
-  int font_height;
   int i, j;
 
   /* determine settings for initial font (for displaying startup messages) */
@@ -5330,12 +5392,7 @@ void InitGfx()
 
   InitFontGraphicInfo();
 
-  font_height = getFontHeight(FC_RED);
-
-  DrawInitText(getProgramInitString(), 20, FC_YELLOW);
-  DrawInitText(setup.internal.program_copyright, 50, FC_RED);
-  DrawInitText(setup.internal.program_website, WIN_YSIZE - 20 - font_height,
-              FC_RED);
+  DrawProgramInfo();
 
   DrawInitText("Loading graphics", 120, FC_GREEN);
 
@@ -5442,7 +5499,7 @@ void InitGfx()
   init_last = init;
 }
 
-void InitGfxBackground()
+static void InitGfxBackground(void)
 {
   fieldbuffer = bitmap_db_field;
   SetDrawtoField(DRAW_TO_BACKBUFFER);
@@ -5452,7 +5509,7 @@ void InitGfxBackground()
   redraw_mask = REDRAW_ALL;
 }
 
-static void InitLevelInfo()
+static void InitLevelInfo(void)
 {
   LoadLevelInfo();                             /* global level info */
   LoadLevelSetup_LastSeries();                 /* last played series info */
@@ -5466,14 +5523,16 @@ static void InitLevelInfo()
     if (leveldir_current == NULL)
       leveldir_current = getFirstValidTreeInfoEntry(leveldir_first);
   }
+
+  SetLevelSetInfo(leveldir_current->identifier, level_nr);
 }
 
-static void InitLevelArtworkInfo()
+static void InitLevelArtworkInfo(void)
 {
   LoadLevelArtworkInfo();
 }
 
-static void InitImages()
+static void InitImages(void)
 {
   print_timestamp_init("InitImages");
 
@@ -5576,7 +5635,7 @@ static void InitMusic(char *identifier)
   print_timestamp_done("InitMusic");
 }
 
-static void InitArtworkDone()
+static void InitArtworkDone(void)
 {
   if (program.headless)
     return;
@@ -5584,27 +5643,50 @@ static void InitArtworkDone()
   InitGlobalAnimations();
 }
 
-void InitNetworkServer()
+static void InitNetworkSettings(void)
 {
-#if defined(NETWORK_AVALIABLE)
-  int nr_wanted;
-#endif
+  boolean network_enabled = (options.network || setup.network_mode);
+  char *network_server = (options.server_host != NULL ? options.server_host :
+                         setup.network_server_hostname);
+
+  if (strEqual(network_server, STR_NETWORK_AUTO_DETECT))
+    network_server = NULL;
+
+  InitNetworkInfo(network_enabled,
+                 FALSE,
+                 options.serveronly,
+                 network_server,
+                 options.server_port);
+}
 
-  if (!options.network)
+void InitNetworkServer(void)
+{
+  if (!network.enabled || network.connected)
     return;
 
-#if defined(NETWORK_AVALIABLE)
-  nr_wanted = Request("Choose player", REQ_PLAYER | REQ_STAY_CLOSED);
+  LimitScreenUpdates(FALSE);
 
-  if (!ConnectToServer(options.server_host, options.server_port))
-    Error(ERR_EXIT, "cannot connect to network game server");
+  if (game_status == GAME_MODE_LOADING)
+    DrawProgramInfo();
 
-  SendToServer_PlayerName(setup.player_name);
-  SendToServer_ProtocolVersion();
+  if (!ConnectToServer(network.server_host, network.server_port))
+  {
+    network.enabled = FALSE;
 
-  if (nr_wanted)
-    SendToServer_NrWanted(nr_wanted);
-#endif
+    setup.network_mode = FALSE;
+  }
+  else
+  {
+    SendToServer_ProtocolVersion();
+    SendToServer_PlayerName(setup.player_name);
+    SendToServer_NrWanted(setup.network_player_nr + 1);
+
+    network.connected = TRUE;
+  }
+
+  /* short time to recognize result of network initialization */
+  if (game_status == GAME_MODE_LOADING)
+    Delay_WithScreenUpdates(1000);
 }
 
 static boolean CheckArtworkConfigForCustomElements(char *filename)
@@ -5680,7 +5762,7 @@ static boolean CheckArtworkTypeForRedefinedCustomElements(int type)
   return redefined_ce_found;
 }
 
-static void InitOverrideArtwork()
+static void InitOverrideArtwork(void)
 {
   boolean redefined_ce_found = FALSE;
 
@@ -5881,7 +5963,7 @@ void ReloadCustomArtwork(int force_reload)
   LimitScreenUpdates(FALSE);
 }
 
-void KeyboardAutoRepeatOffUnlessAutoplay()
+void KeyboardAutoRepeatOffUnlessAutoplay(void)
 {
   if (global.autoplay_leveldir == NULL)
     KeyboardAutoRepeatOff();
@@ -5956,7 +6038,7 @@ void DisplayExitMessage(char *format, va_list ap)
 /* OpenAll()                                                                 */
 /* ========================================================================= */
 
-void OpenAll()
+void OpenAll(void)
 {
   print_timestamp_init("OpenAll");
 
@@ -5977,10 +6059,12 @@ void OpenAll()
   if (options.execute_command)
     Execute_Command(options.execute_command);
 
-  if (options.serveronly)
+  InitNetworkSettings();
+
+  if (network.serveronly)
   {
 #if defined(PLATFORM_UNIX)
-    NetworkServer(options.server_port, options.serveronly);
+    NetworkServer(network.server_port, TRUE);
 #else
     Error(ERR_WARN, "networking only supported in Unix version");
 #endif
@@ -6009,9 +6093,7 @@ void OpenAll()
   InitVideoDefaults();
   InitVideoDisplay();
   InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen);
-
-  InitTileCursorInfo();
-  InitOverlayInfo();
+  InitVideoOverlay();
 
   print_timestamp_time("[init video stuff]");
 
@@ -6067,6 +6149,8 @@ void OpenAll()
     return;
   }
 
+  InitNetworkServer();
+
   SetGameStatus(GAME_MODE_MAIN);
 
   FadeSetEnterScreen();
@@ -6079,8 +6163,6 @@ void OpenAll()
 
   DrawMainMenu();
 
-  InitNetworkServer();
-
 #if 0
   Error(ERR_DEBUG, "::: SDL_GetBasePath() == '%s'",
        SDL_GetBasePath());