/********************************************************************/
/*                                                                  */
/*            L   I  QQ  U U I DD    W   W  A  RR    555            */
/*            L   I Q  Q U U I D D   W   W A A R R   5              */
/*            L   I Q  Q U U I D D   W W W AAA RR    55             */
/*            L   I Q Q  U U I D D   WW WW A A R R     5            */
/*            LLL I  Q Q  U  I DD    W   W A A R R   55             */
/*                                                                  */
/*                             b                                    */
/*                             bb  y y                              */
/*                             b b yyy                              */
/*                             bb    y                              */
/*                                 yy                               */
/*                                                                  */
/*                     U U       FFF  O   O  TTT                    */
/*                     U U       F   O O O O  T                     */
/*                     U U TIRET FF  O O O O  T                     */
/*                     U U       F   O O O O  T                     */
/*                      U        F    O   O   T                     */
/*                                                                  */
/********************************************************************/

/*****************************************************************************/
/* Liquid War is a multiplayer wargame                                       */
/* Copyright (C) 1998-2005 Christian Mauduit                                 */
/*                                                                           */
/* This program is free software; you can redistribute it and/or modify      */
/* it under the terms of the GNU General Public License as published by      */
/* the Free Software Foundation; either version 2 of the License, or         */
/* (at your option) any later version.                                       */
/*                                                                           */
/* This program is distributed in the hope that it will be useful,           */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
/* GNU General Public License for more details.                              */
/*                                                                           */
/* You should have received a copy of the GNU General Public License         */
/* along with this program; if not, write to the Free Software               */
/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
/*                                                                           */
/* Liquid War homepage : http://www.ufoot.org/liquidwar                      */
/* Contact author      : ufoot@ufoot.org                                     */
/*****************************************************************************/

/********************************************************************/
/* nom           : play.c                                           */
/* contenu       : fonction play du menu principal                  */
/* date de modif : 3 mai 98                                         */
/********************************************************************/

/*==================================================================*/
/* includes                                                         */
/*==================================================================*/

#include <string.h>
#include <allegro.h>

#include "back.h"
#include "config.h"
#include "decal.h"
#include "dialog.h"
#include "error.h"
#include "game.h"
#include "gfxmode.h"
#include "palette.h"
#include "maptex.h"
#include "play.h"
#include "score.h"
#include "sound.h"
#include "sock2gen.h"
#include "keyexch.h"
#include "music.h"
#include "lang.h"
#include "mouse.h"
#include "log.h"
#include "network.h"
#include "random.h"

/*==================================================================*/
/* variables globales                                               */
/*==================================================================*/

/*==================================================================*/
/* fonctions                                                        */
/*==================================================================*/

/*------------------------------------------------------------------*/
/*
 * this function is basically what is launched when one presses
 * the play button. in fact it performs initializations and sanity
 * checks and then launches the game function located in game.c
 */
int
play_sequence (void)
{
  int result;

  lw_config_set_current_rules_to_default ();

  result = play_sequence_ex ();

  return result;
}

/*------------------------------------------------------------------*/
/*
 * Internal version of play_sequence, used for network games
 */
int
play_sequence_ex (void)
{
  char *message;
  int result, retour = 0;
  DIALOG d[2];
  DIALOG_PLAYER *dp;
  int flip_enabled = 0;

  memset (d, 0, sizeof (d));

  d[1].proc = 0;

  /*
   * we clear the screen by blitting the Liquid War 5 logo
   */
  display_back_image ();
  /*
   * we display a "Get ready!" message so that the user does not worry
   * about what's going on
   */
  main_message (d, lw_lang_string (LW_LANG_STRING_PLAY_GETREADY));
  /*
   * we call update dialog artificially so that the "Get ready"
   * message is actually blitted on the screen
   */
  dp = my_init_dialog (d, 0);
  my_update_dialog (dp);
  shutdown_dialog (dp);

  /*
   * we set up the 256 color palette so that it corresponds to
   * the textures the user has chosen
   */
  lw_maptex_set_fg_palette (CONFIG_LEVEL_MAP, CONFIG_LEVEL_FG,
			    LW_NETWORK_ON, LW_RANDOM_ON,
			    CONFIG_USE_DEFAULT_TEXTURE);
  lw_maptex_set_bg_palette (CONFIG_LEVEL_MAP, CONFIG_LEVEL_BG,
			    LW_NETWORK_ON, LW_RANDOM_ON,
			    CONFIG_USE_DEFAULT_TEXTURE);
  /*
   * we calculate how many teams are playing
   */
  calc_playing_teams ();
  /*
   * we set up the Allegro palette and LW's palette parameters so that
   * an optimized number of colors is used for each team's fighters
   */
  set_playing_teams_palette ();

  /*
   * if there's only one team selected we stop right away and quit
   */
  if (PLAYING_TEAMS < 2)
    {
      free_game_memory ();
      error_not_enough_teams ();
    }
  else
    {
      /*
       * we launch init_game from the game module, this function may fail
       * and if it does it returns a string containing the error message
       */
      if (!(message = init_game ()))
	{
	  /*
	   * we set up the sound of waves a little louder so that the player
	   * understands he's playing *now*
	   */
	  WATER_VOLUME = CONFIG_WATER_VOLUME_GAME;
	  /*
	   * fade out cause we're going to switch video modes
	   */
	  my_fade_out ();

	  /*
	   * we change the resolution, but only if the game resolution is
	   * actually different from the menu resolution
	   */
	  if (need_to_change_mode (CONFIG_GFX_GAME,
				   CONFIG_GFX_MENU, CONFIG_PAGE_FLIP))
	    result = set_resolution (CONFIG_GFX_GAME,
				     CONFIG_PAGE_FLIP,
				     CONFIG_FULLSCREEN, &flip_enabled);

	  lw_mouse_hide ();

	  /*
	   * the blank round function initializes the double-buffer system
	   * and the main display target, it might fail because of lacking memory
	   */
	  if (!blank_round ())
	    {
	      /*
	       * fiat lux
	       */
	      my_fade_in ();

	      /*
	       * start playing some music
	       */
	      start_music ();

	      /*
	       * OK, here we go, let's enter the main game loop
	       */
	      game ();

	      /*
	       * stop the music
	       */
	      stop_music ();
	    }

	  /*
	   * let's be clean 8-)
	   */
	  free_game_memory ();

	  /*
	   * we close the network socket abruptly
	   */
	  lw_sock_close (&LW_KEYEXCH_SOCK);

	  /*
	   * we turn the volume down
	   */
	  WATER_VOLUME = CONFIG_WATER_VOLUME_MENU;

	  /*
	   * fade out before video mode switching
	   */
	  my_fade_out ();
	  /*
	   * again, we change the video mode only if it is really required
	   */
	  if (need_to_change_mode (CONFIG_GFX_GAME,
				   CONFIG_GFX_MENU,
				   CONFIG_PAGE_FLIP && flip_enabled))
	    result =
	      set_resolution (CONFIG_GFX_MENU, 0, CONFIG_FULLSCREEN, NULL);

	  lw_mouse_show ();

	  /*
	   * displays the 3 tubes with the score
	   */
	  retour = display_scores ();
	}
      else
	{
	  /*
	   * the main reason why init_game should fail is a lack of big data
	   * this can be cured by selecting a smaller level or increasing the
	   * amount of data reserved at startup (command line parameter)
	   */
	  free_game_memory ();

	  /*
	   * we close the network socket abruptly
	   */
	  lw_sock_close (&LW_KEYEXCH_SOCK);

	  error_not_enough_big_data ();
	}
    }

  return retour;
}
