/* FREEZE TAG */
#include "conf.h"
#include "sysdep.h"

#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "db.h"
#include "spells.h"
#include "constants.h"
#include "dg_scripts.h"

void do_message_world(char *argument, int type);

extern int freeze_game_running;
extern int freeze_game_timer;
extern int freeze_game_blue;
extern int freeze_game_red;
extern int freeze_game_iblue;
extern int freeze_game_ired;

extern struct descriptor_data *descriptor_list;

void endgame()
{
  struct descriptor_data *d;

  sprintf(buf, "&MThe freeze tag match has ended! %d/%d red, %d/%d blue", 
          freeze_game_red, freeze_game_ired, freeze_game_blue, freeze_game_iblue);
  do_message_world(buf, MSG_FREEZE);
  if (freeze_game_iblue - freeze_game_blue == freeze_game_ired - freeze_game_red) {
    sprintf(buf, "&yThere has been a tie in the freeze tag match!");
    do_message_world(buf, MSG_FREEZE);
  }
  else if (freeze_game_iblue - freeze_game_blue < freeze_game_ired - freeze_game_red) {
    sprintf(buf, "&bThe Blue Team has won the match!");
    do_message_world(buf, MSG_FREEZE);
  }
  else {
    sprintf(buf, "&rThe Red Team has won the match!");
    do_message_world(buf, MSG_FREEZE);
  }

  freeze_game_red = 0;
  freeze_game_ired = 0;
  freeze_game_blue = 0;
  freeze_game_iblue = 0;
  freeze_game_running = 0;

  for (d = descriptor_list; d; d = d->next)
    if (STATE(d) == CON_PLAYING)
       if (GET_FREEZE_TEAM(d->character)) {
         GET_FREEZE_TEAM(d->character) = TEAM_NONE; 
         GET_POS(d->character) = POS_STANDING; 
       }
}

void checkgame()
{
  if (freeze_game_red == 0 || freeze_game_blue == 0)
     endgame();
}


ACMD(do_endgame)
{
  if (!freeze_game_running) { 
     send_to_char("There is no freeze tag match running!\r\n", ch);
     return;
  }
  send_to_char("You terminate the existing game!\r\n", ch);
  endgame();

}

ACMD(do_startgame)
{
  struct descriptor_data *d;

  if (freeze_game_running) { 
     send_to_char("A freeze tag match has already started!\r\n", ch);
     return;
  }
  for (d = descriptor_list; d; d = d->next) {
    if (STATE(d) == CON_PLAYING) {
       if (GET_FREEZE_TEAM(d->character) == TEAM_RED) freeze_game_red++;
       else if (GET_FREEZE_TEAM(d->character) == TEAM_BLUE) freeze_game_blue++;
    }
  }
  if (!freeze_game_blue || !freeze_game_red) {
     send_to_char("Do the teams even exist?\r\n", ch);
     freeze_game_red = 0;
     freeze_game_blue = 0;
     return;
  }
  freeze_game_iblue = freeze_game_blue;
  freeze_game_ired  = freeze_game_red;
  freeze_game_timer = 10;	// These games will last a max of 10 ticks
  freeze_game_running = 1;
  sprintf(buf, "&MA freeze tag match has started, %d blue, %d red, for %d tics!&n",
          freeze_game_blue, freeze_game_red, freeze_game_timer);
  do_message_world(buf, MSG_FREEZE);

}


ACMD(do_addteam)
{
  char name[MAX_STRING_LENGTH], team[MAX_STRING_LENGTH];
  struct char_data *vict = NULL;

  two_arguments(argument, name, team);

  if (!name || !team) {
     send_to_char("Usage: addteam name team\r\n", ch);
     return;
  }
  if ( !(vict = get_player_vis(ch, name, FIND_CHAR_WORLD)) ) {
     send_to_char("They don't seem to be around here.\r\n", ch);
     return;
  }
  if ( IS_NPC(vict) ) {
     send_to_char("No monsters, only players.\r\n", ch);
     return;
  }
  if ( is_abbrev(team, "red") ) {
    send_to_char("They are now on the red team.\r\n", ch);
    send_to_char("You are now on the red team.\r\n", vict);
    GET_FREEZE_TEAM(vict) = TEAM_RED;
  }
  else if ( is_abbrev(team, "blue") ) {
    send_to_char("They are now on the blue team.\r\n", ch);
    send_to_char("You are now on the blue team.\r\n", vict);
    GET_FREEZE_TEAM(vict) = TEAM_BLUE;
  }
  else {
     send_to_char("Red or blue teams only.\r\n", ch);
     return;
  }
}

ACMD(do_tag)
{
  struct char_data *vict = NULL;
  
  one_argument(argument, buf);

  if (!freeze_game_running) {
     send_to_char("There isn't a freeze tag match running!\r\n", ch);
     return;
  }

  if (!buf) {
     send_to_char("You need to tag someone here!\r\n", ch);
     return;
  }
  if (!(vict = get_char_room_vis(ch, buf))) {
     send_to_char("They don't seem to be around here.\r\n", ch);
     return;
  }
  if (ch == vict) {
     send_to_char("Ha ha ha ha...\r\n", ch);
     return;
  }
  if ( IS_NPC(vict) ) {
     send_to_char("You can only tag other players!\r\n", ch);
     return;
  }
  if (!GET_FREEZE_TEAM(ch)) {
     send_to_char("You aren't even playing freeze tag!\r\n", ch);
     return;
  }
  if (!GET_FREEZE_TEAM(vict)) {
     send_to_char("They aren't even playing freeze tag!\r\n", ch);
     return;
  }
  if (GET_FREEZE_TEAM(vict) == GET_FREEZE_TEAM(ch) && GET_POS(vict) == POS_FROZEN) {
     send_to_char("You tag your fellow team mate and restore them!\r\n", ch);
     GET_POS(vict) = POS_STANDING;
     if (GET_FREEZE_TEAM(vict) == TEAM_BLUE) freeze_game_blue++;
     else if (GET_FREEZE_TEAM(vict) == TEAM_RED) freeze_game_red++;
  }
  else if (GET_FREEZE_TEAM(vict) != GET_FREEZE_TEAM(ch)  && GET_POS(vict) != POS_FROZEN) {
     send_to_char("You tag your enemy, they are frozen!\r\n", ch);
     GET_POS(vict) = POS_FROZEN;
     if (GET_FREEZE_TEAM(vict) == TEAM_BLUE) freeze_game_blue--;
     else if (GET_FREEZE_TEAM(vict) == TEAM_RED) freeze_game_red--;
     sprintf(buf, "&M%s has tagged %s!", GET_NAME(ch), GET_NAME(vict));
     do_message_world(buf, MSG_FREEZE);
  }
  else
     send_to_char("That won't accomplish anything at all!\r\n", ch);
  checkgame();
}

ACMD(do_tsay)
{
  struct descriptor_data *d;

  skip_spaces(&argument);
  delete_doubledollar(argument);

  if (!freeze_game_running) {
     send_to_char("There isn't a freeze tag match running!\r\n", ch);
     return;
  }
  if (!GET_FREEZE_TEAM(ch)) {
     send_to_char("You aren't even playing freeze tag!\r\n", ch);
     return;
  }

  if (!*argument) {
    sprintf(buf, "&m#&M-- Freeze Tag --&m#&n\r\n"
                "&m|&nBlue Initial: &b%-2d&m|&n\r\n"
                "&m|&nBlue Current: &B%-2d&m|&n\r\n"
                "&m|&nRed Initial : &r%-2d&m|&n\r\n"
                "&m|&nRed Current : &R%-2d&m|&n\r\n"
                "&m#&M----------------&m#&n\r\n", 
                freeze_game_iblue, freeze_game_blue, freeze_game_ired,
                freeze_game_red);
    send_to_char(buf, ch);
  }
  else {
    if (GET_FREEZE_TEAM(ch) == TEAM_RED) sprintf(buf2, "&r[RED] %s:&n ", GET_NAME(ch));
    if (GET_FREEZE_TEAM(ch) == TEAM_BLUE) sprintf(buf2, "&b[BLUE] %s:&n ", GET_NAME(ch));
    sprintf(buf, "%s", argument);
    strcat(buf2, buf);

    for (d = descriptor_list; d; d = d->next) {
       if (STATE(d) == CON_PLAYING)
         if (GET_FREEZE_TEAM(d->character)) {
           GET_FREEZE_TEAM(d->character) = GET_FREEZE_TEAM(ch); 
           act(buf2, FALSE, ch, 0, d->character, TO_VICT | TO_SLEEP);
         }
    }
  }
}
