//------------------------------------------------------------------------------
//
// chatMenuHud.cs
//
//------------------------------------------------------------------------------

if ( isFile( "prefs/customVoiceBinds.cs" ) )
   $defaultVoiceBinds = false;
else
   $defaultVoiceBinds = true;

// Load in all of the installed chat items:
exec( "scripts/cannedChatItems.cs" );


//------------------------------------------------------------------------------
// Chat menu loading function:
new SimSet( ChatMenuList );   // Store all of the chat menu maps here so that we can delete them later:
function activateChatMenu( %filename )
{
   if ( isFile( %filename ) || isFile( %filename @ ".dso" ) )
   {
      // Clear the old chat menu:
      ChatMenuList.clear();

      // Create the root of the new menu:
      $RootChatMenu = new ActionMap();
      ChatMenuList.add( $RootChatMenu );
      $CurrentChatMenu = $RootChatMenu;
      $CurrentChatMenu.optionCount = 0;
      $CurrentChatMenu.bindCmd(keyboard, escape, "cancelChatMenu();", "");

      // Build the new chat menu:
      exec( %filename );
   }
   else
      error( "Chat menu file \"" @ %filename @ "\" not found!" );
}

//------------------------------------------------------------------------------
// Chat menu building functions:
function startChatMenu(%heading)
{
   %key = firstWord(%heading);
   %text = restWords(%heading);
   %menu = new ActionMap();
   ChatMenuList.add( %menu );
   %cm = $CurrentChatMenu;
   %cm.bindCmd(keyboard, %key, "setChatMenu(\"" @ %text @ "\", " @ %menu @ ");", "");
   %cm.option[%cm.optionCount] = %key @ ": " @ %text;
   %cm.command[%cm.optionCount] = %menu;  // Save this off here for later...
   %cm.isMenu[%cm.optionCount] = 1;
   %cm.optionCount++;
   %menu.parent = %cm;
   %menu.bindCmd(keyboard, escape, "cancelChatMenu();", "");
   %menu.optionCount = 0;
   $CurrentChatMenu = %menu;
}

function endChatMenu()
{
   $CurrentChatMenu = $CurrentChatMenu.parent;
}

function addChat(%keyDesc, %command)
{
   %key = firstWord(%keyDesc);
   %text = restWords(%keyDesc);
   %cm = $CurrentChatMenu;
   %cm.bindCmd(keyboard, %key, "issueChatCmd(" @ %cm @ "," @ %cm.optionCount @ ");", "");
   %cm.option[%cm.optionCount] = %key @ ": " @ %text;
   %cm.command[%cm.optionCount] = %command;
   %cm.isMenu[%cm.optionCount] = 0;
   %cm.optionCount++;
}


//------------------------------------------------------------------------------
// Chat menu hud functions:
$ChatMenuHudLineCount = 0;
function activateChatMenuHud( %make )
{
   if(%make && !TaskHudDlg.isVisible())
      showChatMenuHud();
}

function showChatMenuHud()
{
   Canvas.pushDialog(ChatMenuHudDlg);
   ChatMenuHudDlg.setVisible(true);
   setChatMenu(Root, $RootChatMenu);
}

function cancelChatMenu()
{
   $CurrentChatMenu.pop();
   $CurrentChatMenu = $RootChatMenu;
   Canvas.popDialog(ChatMenuHudDlg);
   ChatMenuHudDlg.setVisible(false);
}

function setChatMenu( %name, %menu )
{
   for ( %i = 0; %i < $ChatMenuHudLineCount; %i++ )
      chatMenuHud.remove( $ChatMenuHudText[%i] );

   $ChatMenuHudLineCount = %menu.optionCount + 1;
   chatMenuHud.extent = "170" SPC ( $ChatMenuHudLineCount * 15 ) + 8;

   // First add the menu title line:
   $ChatMenuHudText[0] = new GuiTextCtrl()
   {
      profile = "GuiHudVoiceMenuProfile";
      horizSizing = "right";
      vertSizing = "bottom";
      position = "5 3";
      extent = "165 20";
      minExtent = "8 8";
      visible = "1";
      setFirstResponder = "0";
      modal = "1";
      helpTag = "0";
      text = "\c2" @ %name @ " Menu:";
   };
   chatMenuHud.add( $ChatMenuHudText[0] );

   // Now add all of the menu options:
   for ( %option = 0; %option < %menu.optionCount; %option++ )
   {
      %yOffset = ( %option * 15 ) + 18;

      if ( %menu.isMenu[%option] == 1 )
      {
         $ChatMenuHudText[%option + 1] = new GuiTextCtrl()
         {
            profile = "GuiHudVoiceMenuProfile";
            horizSizing = "right";
            vertSizing = "bottom";
            position = "5 " @ %yOffset;
            extent = "165 20";
            minExtent = "8 8";
            visible = "1";
            setFirstResponder = "0";
            modal = "1";
            helpTag = "0";
            text = "  " @ %menu.option[%option];
         };
      }
      else
      {
         $ChatMenuHudText[%option + 1] = new GuiTextCtrl()
         {
            profile = "GuiHudVoiceCommandProfile";
            horizSizing = "right";
            vertSizing = "bottom";
            position = "5 " @ %yOffset;
            extent = "165 20";
            minExtent = "8 8";
            visible = "1";
            setFirstResponder = "0";
            modal = "1";
            helpTag = "0";
            text = "  " @ %menu.option[%option];
         };
      }

      chatMenuHud.add( $ChatMenuHudText[%option + 1] );
   }

   //bind "anykey" to closing the chat menu, so if you press an invalid entry, you don't accidently
   //open the commander map or something...
   %menu.bindCmd(keyboard, "anykey", "cancelChatMenu();", "");

   // Pop the old menu map and push the new menu's map:
   $CurrentChatMenu.pop();
   $CurrentChatMenu = %menu;
   %menu.push();
}

function issueChatCmd( %menu, %index )
{
   processChatItemCallbacks( %menu.command[%index] );
   commandToServer( 'CannedChat', %menu.command[%index], false );
   cancelChatMenu();
}


//------------------------------------------------------------------------------
// Canned chat handler:
function serverCmdCannedChat( %client, %command, %fromAI )
{
   %cmdCode = getWord( %command, 0 );
   %cmdId = getSubStr( %cmdCode, 1, strlen( %command ) - 1 );
   %cmdString = getWord( %command, 1 );
   if ( %cmdString $= "" )
      %cmdString = getTaggedString( %cmdCode );

   if ( !isObject( $ChatTable[%cmdId] ) )
   {
      error( %cmdString @ " is not a recognized canned chat command." );
      return;
   }

   %chatItem = $ChatTable[%cmdId];
   
   //if there is text
   if (%chatItem.text !$= "" || !%chatItem.play3D)
   {
      %message = %chatItem.text @ "~w" @ %chatItem.audioFile;

      if ( %chatItem.teamOnly )
         cannedChatMessageTeam( %client, %client.team, '\c3%1: %2', %client.name, %message, %chatItem.defaultKeys );
      else
         cannedChatMessageAll( %client, '\c4%1: %2', %client.name, %message, %chatItem.defaultKeys );
   }

   //if no text, see if the audio is to be played in 3D...
   else if ( %chatItem.play3D && %client.player )
      playTargetAudio(%client.target, addTaggedString(%chatItem.audioFile), AudioClosest3d, true);

   if ( %chatItem.animation !$= "" )
      PlayAnim(%client, %chatItem.animation); // z0dd - ZOD, 8/15/02. Remove client direct requests to start animations. Was: serverCmdPlayAnim

   // Let the AI respond to the canned chat messages (from humans only)
   if (!%fromAI)
      CreateVoiceServerTask(%client, %cmdCode);
}

if ( $defaultVoiceBinds )
   activateChatMenu( "scripts/voiceBinds.cs" );
else
   activateChatMenu( "prefs/customVoiceBinds.cs" );

