PsyOps

BaseGame.cs

Dec 1st, 2015
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 18.75 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using BattleCore;
  7. using BattleCore.Events;
  8. using BattleCorePsyOps;
  9.  
  10. namespace BaseDuel
  11. {
  12.     public class BaseGame
  13.     {
  14.         public BaseGame(string BotName, Configuration cfg)
  15.         {
  16.             m_LoadedBase = new Base();
  17.             m_GameState = GameState.Deactivated;
  18.             m_BaseManager = new BaseManager(cfg);
  19.             m_Spec = new SpecManager(BotName, cfg);
  20.         }
  21.  
  22.         private ShortChat msg = new ShortChat();    // Simple class for cfg chat msgs
  23.         private Random ran = new Random();          // Used for random stuffs
  24.         private BaseManager m_BaseManager;          // Controls how we load bases
  25.         private Base m_LoadedBase;                  // Base currently being used
  26.         private List<string> m_WaitList;            // Players waitting to get in
  27.         private BaseTeam m_AlphaTeam, m_BravoTeam;  // Teams
  28.         private SpecManager m_Spec;                 // Controls where bot specs
  29.         private GameState m_GameState;              // Status of game
  30.  
  31.         private DateTime m_MatchStartTimestamp;     // Timer for STARTING game
  32.         private double m_MatchStartTime = 10;       // Seconds
  33.  
  34.         private DateTime m_MatchEndTimestamp;
  35.         private double m_MatchEndTime = 8;
  36.  
  37.         private double m_TeamOutLimit = 7500;       // Seconds
  38.  
  39.         private DateTime m_MatchTotalTimeStamp;     // Keep time for match
  40.         private int m_MatchCount = 0;               // How many matches have been played in session
  41.         private int m_MatchMinimum = 6;             // Minimum amount of of matches won to win session
  42.         private int m_MatchWinBy = 2;               // How many matches you have to "Win by"
  43.         private bool m_SafeWin = true;
  44.         private bool m_WarpOutOnMatchEnd = true;
  45.         private bool m_StatKeeper = false;
  46.  
  47.         private byte m_TeamSortMode = 1;
  48.  
  49.         //----------------------------------------------------------------------//
  50.         //                         Chat Commands                                //
  51.         //----------------------------------------------------------------------//
  52.         public Queue<EventArgs> GameSettings(string PlayerName)
  53.         {
  54.             Queue<EventArgs> q = new Queue<EventArgs>();
  55.             q.Enqueue(msg.pm(PlayerName, "+--------------------------------------------------------------------+"));
  56.             q.Enqueue(msg.pm(PlayerName, "|  Base Duel Game Settings                  Status:  "+m_GameState.ToString().PadLeft(14)+"  |"));
  57.             q.Enqueue(msg.pm(PlayerName, "| -Setting-".PadRight(25) + "-Value-".PadLeft(5).PadRight(10) + "-Help Command-".PadRight(34) + "|"));
  58.             q.Enqueue(msg.pm(PlayerName, "+--------------------------------------------------------------------+"));
  59.             q.Enqueue(msg.pm(PlayerName, "| Match Start Time".PadRight(25) + (m_MatchStartTime.ToString() +".s").PadLeft(5).PadRight(10) + "More Info: !help matchstarttime".PadRight(34) + "|"));
  60.             q.Enqueue(msg.pm(PlayerName, "| Base Selection Mode".PadRight(25) + m_BaseManager.BaseMode.ToString().PadLeft(5).PadRight(10) + "More Info: !help basesort".PadRight(34) + "|"));
  61.             q.Enqueue(msg.pm(PlayerName, "| Team Sort Mode".PadRight(25) + m_TeamSortMode.ToString().PadLeft(5).PadRight(10) + "More Info: !help teamsort".PadRight(34) + "|"));
  62.             q.Enqueue(msg.pm(PlayerName, "| Minimum Match Count".PadRight(25) + m_MatchMinimum.ToString().PadLeft(5).PadRight(10) + "More Info: !help matchminimum".PadRight(34) + "|"));
  63.             q.Enqueue(msg.pm(PlayerName, "| Match Win By".PadRight(25) + m_MatchWinBy.ToString().PadLeft(5).PadRight(10) + "More Info: !help matchwinby".PadRight(34) + "|"));
  64.             q.Enqueue(msg.pm(PlayerName, "| Safe Win".PadRight(25) + m_SafeWin.ToString().PadLeft(5).PadRight(10) + "More Info: !help safewin".PadRight(34) + "|"));
  65.             q.Enqueue(msg.pm(PlayerName, "| AllWarp at Match End".PadRight(25) + m_WarpOutOnMatchEnd.ToString().PadLeft(5).PadRight(10) + "More Info: !help matchendaw".PadRight(34) + "|"));
  66.             q.Enqueue(msg.pm(PlayerName, "| Stats Recorded".PadRight(25) + m_StatKeeper.ToString().PadLeft(5).PadRight(10) + "More Info: !help statkeeper".PadRight(34) + "|"));
  67.             q.Enqueue(msg.pm(PlayerName, "+--------------------------------------------------------------------+"));
  68.             return q;
  69.         }
  70.         public EventArgs UnloadGame(string PlayerName)
  71.         {
  72.             m_GameState = GameState.Deactivated;
  73.             return msg.arena("[ Base Duel ] - Game Unloaded.");
  74.         }
  75.         public EventArgs LoadGame(string PlayerName)
  76.         {
  77.             if (m_GameState != GameState.Deactivated)
  78.                 return msg.pm(PlayerName, "[ Base Duel ] Game has already been activated.");
  79.  
  80.             m_LoadedBase = m_BaseManager.LoadedBase;
  81.             m_WaitList = new List<string>();
  82.             m_AlphaTeam = new BaseTeam("Alpha Team", 887);
  83.             m_BravoTeam = new BaseTeam("Bravo Team", 889);
  84.             m_GameState = GameState.On;
  85.             return msg.arena("[ Base Duel ] - Game Loaded.");
  86.         }
  87.         public Queue<EventArgs> Shuffle(ChatEvent c)
  88.         {
  89.             Queue<EventArgs> q = new Queue<EventArgs>();
  90.  
  91.             if (m_GameState != GameState.Deactivated)
  92.             {
  93.                 q.Enqueue(msg.pm(c.PlayerName, "Base Duel has not been loaded."));
  94.                 return q;
  95.             }
  96.  
  97.             return q;
  98.         }
  99.         //----------------------------------------------------------------------//
  100.         //                         Timer Functions                              //
  101.         //----------------------------------------------------------------------//
  102.         public Queue<EventArgs> MainGameTimer()
  103.         {
  104.             Queue<EventArgs> q = new Queue<EventArgs>();
  105.  
  106.             EventArgs e = m_Spec.UpdateSpecPosition;        // Update bot position
  107.             if (e != null) q.Enqueue(e);
  108.  
  109.             switch (m_GameState)
  110.             {
  111.                 case GameState.Deactivated:
  112.                     return q;
  113.                 case GameState.On:
  114.                 break;
  115.                 case GameState.MatchStarting:
  116.                     MatchStartTimer(q);
  117.                 break;
  118.                 case GameState.MatchOn:
  119.                     CheckForTeamOut(q);
  120.                 break;
  121.                 case GameState.MatchEnding:
  122.                     MatchEndTimer(q);
  123.                 break;
  124.             }
  125.             return q;
  126.         }
  127.         private void MatchStartTimer(Queue<EventArgs> q)
  128.         {
  129.             if ((DateTime.Now - m_MatchStartTimestamp).TotalSeconds < m_MatchStartTime) return;
  130.  
  131.             if (m_MatchCount > 0 || m_WaitList.Count > 1)
  132.                 StartMatch(q);
  133.             else
  134.             {
  135.                 m_GameState = GameState.On;
  136.                 q.Enqueue(msg.arena("Game start cancelled, not enough players."));
  137.             }
  138.         }
  139.         private void MatchEndTimer(Queue<EventArgs> q)
  140.         {
  141.             if ((DateTime.Now - m_MatchEndTimestamp).TotalSeconds > m_MatchEndTime)
  142.             {
  143.                 if (m_AlphaTeam.TeamInBase && m_BravoTeam.TeamInBase)
  144.                 {
  145.                     q.Enqueue(msg.arena("Game End False Positive- Game ending timer reset."));
  146.                     m_GameState = GameState.MatchOn;
  147.                     m_MatchEndTimestamp = DateTime.Now;
  148.                 }
  149.                 else
  150.                 {
  151.                     if (!m_AlphaTeam.TeamInBase && !m_BravoTeam.TeamInBase)
  152.                         EndMatch(null,q);
  153.                     else if (!m_AlphaTeam.TeamInBase)
  154.                         EndMatch(m_BravoTeam, q);
  155.                     else if (!m_BravoTeam.TeamInBase)
  156.                         EndMatch(m_AlphaTeam, q);
  157.                 }
  158.             }
  159.         }
  160.         //----------------------------------------------------------------------//
  161.         //                         Incoming Events                              //
  162.         //----------------------------------------------------------------------//
  163.         public Queue<EventArgs> UpdatePosition(PlayerPositionEvent pos)
  164.         {
  165.             if (m_GameState == GameState.Deactivated) return null;  //Only continue if module game is activated
  166.             Queue<EventArgs> q = new Queue<EventArgs>();
  167.  
  168.             switch (m_GameState)
  169.             {
  170.                 case GameState.On:
  171.                     break;
  172.                 case GameState.MatchStarting:
  173.                     break;
  174.                 case GameState.MatchOn:
  175.                     BaseTeam t;                                     // Grab player info
  176.                     BasePlayer p;
  177.                     GetPlayerInfo(pos.PlayerName, out p, out t);
  178.                     if (p != null)
  179.                     {
  180.                         TeamTimestampUpdates(q, pos, p, t);
  181.                         CheckForSafeWin(q, pos, p, t);
  182.                     }
  183.                     break;
  184.                 case GameState.MatchEnding:
  185.                     break;
  186.             }
  187.             return q;
  188.         }
  189.         public Queue<EventArgs> AddToWaitList(string PlayerName)
  190.         {
  191.             if (m_GameState == GameState.Deactivated || m_WaitList.Contains(PlayerName)) return null;
  192.             Queue<EventArgs> q = new Queue<EventArgs>();
  193.            
  194.             m_WaitList.Add(PlayerName);
  195.             q.Enqueue(msg.pm(PlayerName, "You have been added to Base Duel Wait list. blah txt."));
  196.  
  197.             switch (m_GameState)
  198.             {
  199.                 case GameState.On:
  200.                     if (m_TeamSortMode == 1 && m_WaitList.Count > 1)
  201.                     {
  202.                         m_GameState = GameState.MatchStarting;
  203.                         m_MatchStartTimestamp = DateTime.Now;
  204.                     }
  205.                     break;
  206.                 case GameState.MatchStarting:
  207.                     break;
  208.                 case GameState.MatchOn:
  209.                     break;
  210.                 case GameState.MatchEnding:
  211.                     break;
  212.             }
  213.             return q;
  214.         }
  215.  
  216.         public Queue<EventArgs> RemoveFromWaitList(string PlayerName)
  217.         {
  218.             if (m_GameState == GameState.Deactivated) return null;
  219.             m_WaitList.Remove(PlayerName);
  220.             return null;
  221.         }
  222.         //----------------------------------------------------------------------//
  223.         //                         Game Functions                               //
  224.         //----------------------------------------------------------------------//
  225.         private void StartMatch(Queue<EventArgs> q)
  226.         {
  227.             if (m_MatchCount == 0) PreGameSort(q);
  228.  
  229.             m_AlphaTeam.PlayerInBase();
  230.             m_BravoTeam.PlayerInBase();
  231.  
  232.             SendPlayersToStart(q);
  233.             m_GameState = GameState.MatchOn;
  234.             m_MatchTotalTimeStamp = DateTime.Now;
  235.         }
  236.         private void EndMatch( BaseTeam Winner, Queue<EventArgs> q)
  237.         {
  238.             if (Winner == null)
  239.             {
  240.                 // No winners
  241.                 q.Enqueue(msg.arena("No winners - Rematch code here."));
  242.             }
  243.             else
  244.                 Winner.Score++;
  245.  
  246.             q.Enqueue(msg.arena("Alpha Team [ " + m_AlphaTeam.Score + " ]      Bravo Team [ " + m_BravoTeam.Score + " ] "));
  247.  
  248.             if (m_WarpOutOnMatchEnd) SendTeamPM(q, "*prize #7");
  249.  
  250.             if ((m_MatchCount + 1) >= m_MatchMinimum && Math.Abs(m_AlphaTeam.Score - m_BravoTeam.Score) >= m_MatchWinBy)
  251.             {
  252.                 q.Enqueue(msg.arena("Game Win. - End Code Here. Winner [ "+ (m_AlphaTeam.Score > m_BravoTeam.Score ? m_AlphaTeam.TeamName: m_BravoTeam.TeamName) +" ]"));
  253.                 m_GameState = GameState.Paused;
  254.                 return;
  255.             }
  256.             // Check for end of game here - if not continue
  257.             m_MatchCount++;
  258.  
  259.             m_BaseManager.LoadNextBase();
  260.             m_LoadedBase = m_BaseManager.LoadedBase;
  261.  
  262.             q.Enqueue(msg.arena("Game will begin in (" + m_MatchStartTime + ")seconds. Please select the ship you wish to fly in, now."));
  263.             m_MatchStartTimestamp = DateTime.Now;
  264.             m_GameState = GameState.MatchStarting;
  265.         }
  266.         private void PreGameSort(Queue<EventArgs> q)
  267.         {
  268.             switch (m_TeamSortMode)
  269.             {
  270.                 case 1:
  271.                         m_AlphaTeam = new BaseTeam("Alpha Team", 887);  // Reset teams
  272.                         m_BravoTeam = new BaseTeam("Bravo Team", 889);  // -----------
  273.                         m_AlphaTeam.Score = 0;
  274.                         m_BravoTeam.Score = 0;
  275.                         m_Spec.SetSpecMode(false);
  276.                         List<string> player2sort = new List<string>();
  277.                         player2sort = new List<string>(m_WaitList.ToArray());
  278.                         string manOut = m_WaitList[m_WaitList.Count - 1];
  279.                         m_WaitList = new List<string>();
  280.                         m_Spec.ResetSpecList();
  281.                         bool alternate = false;
  282.  
  283.                         if (player2sort.Count % 2 != 0)                 // Odd number - one man out
  284.                         {
  285.                             player2sort.Remove(manOut);                 // Take out last man
  286.                             m_WaitList.Add(manOut);                     // Add him back to Wait list
  287.                         }
  288.  
  289.                         for (int j = 0; j < 10; j += 1)                 // Shuffle all players in our sort list
  290.                         for (int i = 0; i < player2sort.Count; i += 1)  // Shuffling 10 times to make it more random ?!?!
  291.                         {
  292.                             string temp = player2sort[i];
  293.                             int r = ran.Next(i, player2sort.Count);
  294.                             player2sort[i] = player2sort[r];
  295.                             player2sort[r] = temp;
  296.                         }
  297.                         for (int i = 0; i < player2sort.Count; i += 1)  // Split them up into 2 teams
  298.                         {
  299.                             alternate = !alternate;
  300.  
  301.                             m_Spec.addToSpecList(player2sort[i]);
  302.  
  303.                             if (alternate)
  304.                                 m_AlphaTeam.AddPlayer(new BasePlayer(player2sort[i]));
  305.                             else
  306.                                 m_BravoTeam.AddPlayer(new BasePlayer(player2sort[i]));
  307.                         }
  308.                     break;
  309.             }
  310.         }
  311.         private void TeamTimestampUpdates(Queue<EventArgs> q, PlayerPositionEvent pos, BasePlayer p, BaseTeam t)
  312.         {
  313.             if (m_BaseManager.LoadedBase.PlayerInBase(pos.MapPositionX, pos.MapPositionY))
  314.             {
  315.                 if (t.TeamName == m_AlphaTeam.TeamName)
  316.                     m_AlphaTeam.PlayerInBase();
  317.                 else
  318.                     m_BravoTeam.PlayerInBase();
  319.             }
  320.         }
  321.         private void CheckForSafeWin(Queue<EventArgs> q, PlayerPositionEvent pos, BasePlayer p, BaseTeam t)
  322.         {
  323.             if (m_SafeWin && pos.ShipState.IsSafe)
  324.             {
  325.                 if (t.TeamName == m_AlphaTeam.TeamName)
  326.                 {
  327.                     if (m_BaseManager.LoadedBase.PlayerInBravoBase(pos.MapPositionX, pos.MapPositionY))
  328.                     {
  329.                         EndMatch(m_AlphaTeam, q);
  330.                     }
  331.                 }
  332.                 else if (m_BaseManager.LoadedBase.PlayerInAlphaBase(pos.MapPositionX, pos.MapPositionY))
  333.                 {
  334.                     EndMatch(m_BravoTeam, q);
  335.                 }
  336.             }
  337.         }
  338.         private void CheckForTeamOut(Queue<EventArgs> q)
  339.         {
  340.             m_AlphaTeam.UpdateTeamAlive(m_TeamOutLimit);         // Update each team to see if they are still in
  341.             m_BravoTeam.UpdateTeamAlive(m_TeamOutLimit);         // -
  342.  
  343.             // Team was detected as being out - starting end of match
  344.             if (!m_AlphaTeam.TeamInBase || !m_BravoTeam.TeamInBase)
  345.             {
  346.                 q.Enqueue(msg.arena("Team Out detected. activating teamout timer now."));
  347.                 m_GameState = GameState.MatchEnding;
  348.                 m_MatchEndTimestamp = DateTime.Now;
  349.             }
  350.         }
  351.         //----------------------------------------------------------------------//
  352.         //                            Misc                                      //
  353.         //----------------------------------------------------------------------//
  354.         private void SendTeamPM(Queue<EventArgs> q, string message)
  355.         {
  356.             for (int i = 0; i < m_AlphaTeam.TeamMembers.Count; i += 1)
  357.                 q.Enqueue(msg.pm(m_AlphaTeam.TeamMembers[i].PlayerName, message));
  358.             for (int i = 0; i < m_BravoTeam.TeamMembers.Count; i += 1)
  359.                 q.Enqueue(msg.pm(m_BravoTeam.TeamMembers[i].PlayerName, message));
  360.         }
  361.         private void SendPlayersToStart(Queue<EventArgs> q)
  362.         {
  363.             for (int i = 0; i < m_AlphaTeam.TeamMembers.Count; i += 1)
  364.             {
  365.                 q.Enqueue(msg.pm(m_AlphaTeam.TeamMembers[i].PlayerName, "*setfreq " + m_AlphaTeam.Frequency));
  366.                 q.Enqueue(msg.pm(m_AlphaTeam.TeamMembers[i].PlayerName, "*warpto " + m_LoadedBase.AlphaStartX + " " + m_LoadedBase.AlphaStartY));
  367.             }
  368.             for (int i = 0; i < m_BravoTeam.TeamMembers.Count; i += 1)
  369.             {
  370.                 q.Enqueue(msg.pm(m_BravoTeam.TeamMembers[i].PlayerName, "*setfreq " + m_BravoTeam.Frequency));
  371.                 q.Enqueue(msg.pm(m_BravoTeam.TeamMembers[i].PlayerName, "*warpto " + m_LoadedBase.BravoStartX + " " + m_LoadedBase.BravoStartY));
  372.             }
  373.             q.Enqueue(msg.teamPM(m_AlphaTeam.TeamMembers[0].PlayerName, "Good Luck Alpha Team.   Match[ "+(m_MatchCount + 1)+" ]  Base[ "+m_LoadedBase.BaseName+" ]"));
  374.             q.Enqueue(msg.teamPM(m_BravoTeam.TeamMembers[0].PlayerName, "Good Luck Bravo Team.   Match[ " + (m_MatchCount + 1) + " ]  Base[ " + m_LoadedBase.BaseName + " ]"));
  375.             q.Enqueue(msg.pub("*shipreset"));
  376.         }
  377.         private void GetPlayerInfo(string PlayerName, out BasePlayer player, out BaseTeam team)
  378.         {
  379.             for (int i = 0; i < m_AlphaTeam.TeamMembers.Count; i += 1)
  380.             {
  381.                 if (m_AlphaTeam.TeamMembers[i].PlayerName == PlayerName)
  382.                 {
  383.                     team =  m_AlphaTeam;
  384.                     player = m_AlphaTeam.TeamMembers[i];
  385.                     return;
  386.                 }
  387.                 if (m_BravoTeam.TeamMembers[i].PlayerName == PlayerName)
  388.                 {
  389.                     team = m_BravoTeam;
  390.                     player = m_BravoTeam.TeamMembers[i];
  391.                     return;
  392.                 }
  393.             }
  394.             player = null;
  395.             team = null;
  396.         }
  397.  
  398.     }
  399. }
Advertisement
Add Comment
Please, Sign In to add comment