PsyOps

BaseManager

May 3rd, 2016
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.95 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 Devastation
  11. {
  12.     class BaseManager
  13.     {
  14.  
  15.         private ShortChat msg;                  // Custom chat module
  16.         private Random ran;                     // Random num generator
  17.         private List<Base> my_Bases;            // Main list of bases
  18.         private Base my_Lobby;                  // Safe area saved as a base
  19.         private Base my_LoadedBase;             // Base that is loaded
  20.         private BaseMode my_Mode;               // Way to sort bases
  21.         private BaseSize my_SizeMode;           // Limit bases loaded, by size
  22.         private Queue<int> my_ShuffleModeQ;     // Stores the shuffle
  23.         private int my_ShuffleModeQCount;       // Min amount of bases to keep on Q
  24.         private int my_RoundRobinCount;         // where round robin picks up at
  25.  
  26.         public BaseManager(Byte[] mapData)
  27.         {
  28.             // Load all vars
  29.             my_Lobby = new Base();
  30.             my_Bases = new List<Base>();
  31.             msg = new ShortChat();
  32.             ran = new Random();
  33.             my_Mode = BaseMode.Shuffle;
  34.             my_SizeMode = BaseSize.Off;
  35.             my_ShuffleModeQ = new Queue<int>();
  36.             my_ShuffleModeQCount = 10;
  37.             my_RoundRobinCount = 0;
  38.  
  39.             // Byte array tunrned into arrays i can work with
  40.             MapData my_MapInfo = new MapData(mapData);
  41.  
  42.             // Map scanner. Loads/Configures/Saves Bases
  43.             BaseLoader my_BaseLoader = new BaseLoader(my_MapInfo.TileIDs, my_MapInfo.TileTypes);
  44.             my_BaseLoader.LoadBases(my_Bases,my_Lobby);
  45.  
  46.             // Load next base from default random
  47.             ReShuffleQ(true);
  48.             LoadNextBase();  
  49.         }
  50.         public Base Lobby
  51.         {   get { return my_Lobby; }    }
  52.  
  53.         public List<Base> Bases
  54.         {   get { return my_Bases; }    }
  55.  
  56.         public Base LoadedBase
  57.         {   get { return my_LoadedBase; }   }
  58.  
  59.         // Mode for choosing what base to chose next
  60.         //-------------------------------------------
  61.         // Shuffle  :   Bases get shuffled and put into a queue
  62.         //              once every base has been played they get reshuffled again
  63.         // Random   :   Every base is chosen at random. So it is possible to get the same
  64.         //              base twice
  65.         //RoundRobin:  Play from base 1 to last one and just restart at end
  66.         // Custom   :  Not used yet, but maybe for custom base loading like player chosen/voted on
  67.         public void ChangeBaseMode(BaseMode mode)
  68.         {
  69.             my_Mode = mode;
  70.         }
  71.  
  72.         public void SetBaseSize(BaseSize newSize)
  73.         {
  74.             // Ignore if same size
  75.             if (my_SizeMode == newSize)
  76.                 return;
  77.             // Set new size
  78.             my_SizeMode = newSize;
  79.             // Load next base
  80.             LoadNextBase();
  81.         }
  82.  
  83.         // Load next base- depends on mode
  84.         public void LoadNextBase()
  85.         {
  86.             bool reload = true;
  87.             while (reload)
  88.             {
  89.                 if (my_SizeMode == BaseSize.Off)
  90.                     reload = false;
  91.  
  92.                 string oldName = my_LoadedBase == null ? "~none~" : my_LoadedBase.BaseName;
  93.                 int newBase = 0;
  94.  
  95.                 switch (my_Mode)
  96.                 {
  97.                     case BaseMode.Shuffle:
  98.                         newBase = my_ShuffleModeQ.Dequeue();
  99.                         // keep our q at a minimum of [m_ModeZeroMinCount] - add to shuffle if we fall below
  100.                         if (my_ShuffleModeQ.Count < my_ShuffleModeQCount)
  101.                             ReShuffleQ(false);
  102.                         break;
  103.                     case BaseMode.RoundRobin:
  104.                         my_RoundRobinCount = (my_RoundRobinCount + 1) >= my_Bases.Count ? 0 : my_RoundRobinCount + 1;
  105.                         newBase = my_RoundRobinCount;
  106.                         break;
  107.                     case BaseMode.Random:
  108.                         newBase = ran.Next(0, my_Bases.Count);
  109.                         break;
  110.                 }
  111.  
  112.                 // Assign new mode
  113.                 my_LoadedBase = my_Bases[newBase];
  114.                 // If the base is set to a certain size
  115.                 if (my_SizeMode != BaseSize.Off && my_SizeMode == my_LoadedBase.Size)
  116.                     reload = false;
  117.             }
  118.         }
  119.  
  120.         // Shuffle bases for ShuffleMode - Option to clear old, if not we add to existing old shuffle
  121.         private void ReShuffleQ(bool ClearOld)
  122.         {
  123.             List<int> baseIndexes = new List<int>();
  124.  
  125.             // add all indexes of all bases into temp list
  126.             for (int i = 0; i < my_Bases.Count; i += 1)
  127.                 baseIndexes.Add(i);
  128.  
  129.             // shuffle 10 times to try and get the most random shuffle
  130.             for (int h = 0; h < 10; h += 1)
  131.             {
  132.                 // Shuffles bases by switching the next with a random one that's ahead in the deck
  133.                 // Continues till end
  134.                 for (int i = 0; i < baseIndexes.Count; i += 1)
  135.                 {
  136.                     int temp = baseIndexes[i];
  137.                     int r = ran.Next(i, baseIndexes.Count);
  138.                     baseIndexes[i] = baseIndexes[r];
  139.                     baseIndexes[r] = temp;
  140.                 }
  141.             }
  142.  
  143.             // If we want a raw shuffle we clear old one here
  144.             if (ClearOld) my_ShuffleModeQ = new Queue<int>();
  145.  
  146.             // Dump the new shuffle into our master queue
  147.             for (int i = 0; i < my_Bases.Count; i += 1)
  148.                 my_ShuffleModeQ.Enqueue(baseIndexes[i]);
  149.         }
  150.  
  151.         public Queue<EventArgs> LoadedBaseInfo(string PlayerName, int BaseNumber)
  152.         {
  153.             Queue<EventArgs> reply = new Queue<EventArgs>();
  154.  
  155.             int offset = 38;
  156.  
  157.             reply.Enqueue(msg.pm(PlayerName, "Base Information ----------------------------"));      //BaseNumber
  158.             reply.Enqueue(msg.pm(PlayerName, "Base Name".PadRight(20) + my_Bases[BaseNumber].BaseName.PadLeft(25)));
  159.             reply.Enqueue(msg.pm(PlayerName, "Base Number".PadRight(20) + BaseNumber.ToString().PadLeft(2, '0').PadLeft(25)));
  160.             reply.Enqueue(msg.pm(PlayerName, "Tile Count".PadRight(20) + my_Bases[BaseNumber].TileCount.ToString().PadLeft(25)));
  161.             reply.Enqueue(msg.pm(PlayerName, "Base Size".PadRight(20) + my_Bases[BaseNumber].Size.ToString().PadLeft(25)));
  162.             reply.Enqueue(msg.pm(PlayerName, ("+--------  Dimension   --------+").PadLeft(offset)));
  163.             reply.Enqueue(msg.pm(PlayerName, ("|  x1 [ " + my_Bases[BaseNumber].BaseDimension[0].ToString().PadLeft(4) + " ]    y1 [ " + my_Bases[BaseNumber].BaseDimension[1].ToString().PadLeft(4) + " ]  |").PadLeft(offset)));
  164.             reply.Enqueue(msg.pm(PlayerName, ("|  x2 [ " + my_Bases[BaseNumber].BaseDimension[2].ToString().PadLeft(4) + " ]    y2 [ " + my_Bases[BaseNumber].BaseDimension[3].ToString().PadLeft(4) + " ]  |").PadLeft(offset)));
  165.             reply.Enqueue(msg.pm(PlayerName, ("+--------  Alpha Safe  --------+").PadLeft(offset)));
  166.             reply.Enqueue(msg.pm(PlayerName, ("|  x1 [ " + my_Bases[BaseNumber].AlphaSafe[0].ToString().PadLeft(4) + " ]    y1 [ " + my_Bases[BaseNumber].AlphaSafe[1].ToString().PadLeft(4) + " ]  |").PadLeft(offset)));
  167.             reply.Enqueue(msg.pm(PlayerName, ("|  x2 [ " + my_Bases[BaseNumber].AlphaSafe[2].ToString().PadLeft(4) + " ]    y2 [ " + my_Bases[BaseNumber].AlphaSafe[3].ToString().PadLeft(4) + " ]  |").PadLeft(offset)));
  168.             reply.Enqueue(msg.pm(PlayerName, ("+--Warp Point     -------------+").PadLeft(offset)));
  169.             reply.Enqueue(msg.pm(PlayerName, ("|  x  [ " + my_Bases[BaseNumber].AlphaStartX.ToString().PadLeft(4) + " ]    y  [ " + my_Bases[BaseNumber].AlphaStartY.ToString().PadLeft(4) + " ]  |").PadLeft(offset)));
  170.             reply.Enqueue(msg.pm(PlayerName, ("|--------  Bravo Safe  --------+").PadLeft(offset)));
  171.             reply.Enqueue(msg.pm(PlayerName, ("|  x1 [ " + my_Bases[BaseNumber].BravoSafe[0].ToString().PadLeft(4) + " ]    y1 [ " + my_Bases[BaseNumber].BravoSafe[1].ToString().PadLeft(4) + " ]  |").PadLeft(offset)));
  172.             reply.Enqueue(msg.pm(PlayerName, ("|  x2 [ " + my_Bases[BaseNumber].BravoSafe[2].ToString().PadLeft(4) + " ]    y2 [ " + my_Bases[BaseNumber].BravoSafe[3].ToString().PadLeft(4) + " ]  |").PadLeft(offset)));
  173.             reply.Enqueue(msg.pm(PlayerName, ("+--Warp Point     -------------+").PadLeft(offset)));
  174.             reply.Enqueue(msg.pm(PlayerName, ("|  x  [ " + my_Bases[BaseNumber].BravoStartX.ToString().PadLeft(4) + " ]    y  [ " + my_Bases[BaseNumber].BravoStartY.ToString().PadLeft(4) + " ]  |").PadLeft(offset)));
  175.             reply.Enqueue(msg.pm(PlayerName, ("+------------------------------+").PadLeft(offset)));
  176.  
  177.             return reply;
  178.         }
  179.  
  180.         public Queue<EventArgs> GetBaseManagerSettings(string PlayerName)
  181.         {
  182.             Queue<EventArgs> reply = new Queue<EventArgs>();
  183.  
  184.             reply.Enqueue(msg.pm(PlayerName, "Base Manager Settings -----------------------"));
  185.             reply.Enqueue(msg.pm(PlayerName, ("Loading Mode").PadRight(35) + my_Mode.ToString().PadLeft(10)));
  186.             reply.Enqueue(msg.pm(PlayerName, ("Size Limit").PadRight(35) + my_SizeMode.ToString().PadLeft(10)));
  187.             reply.Enqueue(msg.pm(PlayerName, ("Shuffle Q Min").PadRight(35) + my_ShuffleModeQCount.ToString().PadLeft(10)));
  188.             reply.Enqueue(msg.pm(PlayerName, ("Bases Currently in Shuffle Q").PadRight(35) + my_ShuffleModeQ.Count.ToString().PadLeft(10)));
  189.             reply.Enqueue(msg.pm(PlayerName, ("Next Base in Shuffle Q").PadRight(35) + ("Base [" + my_Bases.IndexOf(my_LoadedBase) + "]").PadLeft(10)));
  190.             reply.Enqueue(msg.pm(PlayerName, ("Round Robin Mode Count").PadRight(35) + my_RoundRobinCount.ToString().PadLeft(10)));
  191.  
  192.             return reply;
  193.         }
  194.     }
  195. }
Advertisement
Add Comment
Please, Sign In to add comment