|
Britbot
|
00001 #region #Usings 00002 00003 using System; 00004 using System.Collections.Generic; 00005 using System.Linq; 00006 00007 #endregion 00008 00009 namespace Britbot 00010 { 00014 internal static class ConfigHelper 00015 { 00016 #region Static Fields & Consts 00017 00018 private static List<int> _ultimateConfig; 00019 00020 #endregion 00021 00025 public static void ReConfigure() 00026 { 00027 if ((Magic.DoConfiguration)) 00028 _ultimateConfig = GetUltimateGameConfig(); 00029 00030 Logger.Write("Ultimate Config:"); 00031 Logger.Write(string.Join(",", _ultimateConfig), true); 00032 00033 GroupSplitting(_ultimateConfig); 00034 GroupJoining(_ultimateConfig); 00035 00036 Logger.Write("New config Config:"); 00037 Logger.Write(string.Join(",", Commander.Groups.ConvertAll(group => @group.Pirates.Count).ToArray()), true); 00038 } 00039 00043 private static void GroupSplitting(List<int> ultimateConfig) 00044 { 00045 List<Group> newGroups = new List<Group>(); 00046 00047 ultimateConfig.Sort((b, a) => a.CompareTo(b)); 00048 Commander.Groups.Sort((b, a) => a.Pirates.Count.CompareTo(b.Pirates.Count)); 00049 00050 for (int i = 0; i < Math.Min(ultimateConfig.Count, Commander.Groups.Count); i++) 00051 { 00052 if (Commander.Groups[i].Pirates.Count > ultimateConfig[i]) 00053 newGroups.AddRange(Commander.Groups[i].Split(Commander.Groups[i].Pirates.Count - ultimateConfig[i])); 00054 } 00055 00056 00057 Commander.Groups.AddRange(newGroups); 00058 Commander.Groups.RemoveAll(g => g.Pirates.Count == 0); 00059 } 00060 00064 private static void GroupJoining(List<int> ultimateConfig) 00065 { 00066 Group tempGroup = null; 00067 int minDistance = Magic.MaxJoinDistance + 1; //maximun joining distance 00068 00069 //sort configs by size 00070 Commander.Groups.Sort((a, b) => a.Pirates.Count.CompareTo(b.Pirates.Count)); 00071 ultimateConfig.Sort((a, b) => a.CompareTo(b)); 00072 00073 List<int> joinedGroups = new List<int>(); 00074 00075 //go over the config and correct it 00076 for (int i = 0; i < Math.Min(ultimateConfig.Count, Commander.Groups.Count); i++) 00077 { 00078 if (Commander.Groups[i].Pirates.Count < ultimateConfig[i]) 00079 { 00080 //find the best group to join to the current group 00081 foreach (Group g in Commander.Groups.Where(g => g.Pirates.Count == 1 && joinedGroups.Contains(g.Id)) 00082 ) 00083 { 00084 //minimal distance between the two groups 00085 int tempDistance = Commander.Groups[i].MinDistance(g); 00086 00087 //if the current minimun is better than the last minimun and the group do not cintain the same pirates.. 00088 if ((tempDistance < minDistance) && (!Commander.Groups[i].Pirates.Intersect(g.Pirates).Any())) 00089 { 00090 tempGroup = g; 00091 minDistance = tempDistance; 00092 } 00093 } 00094 //join the groups if they are close enough 00095 if (minDistance <= Magic.MaxJoinDistance) 00096 { 00097 if (tempGroup != null) 00098 { 00099 joinedGroups.Add(tempGroup.Id); 00100 Commander.Groups[i].Join(tempGroup, false); 00101 } 00102 } 00103 } 00104 } 00105 00106 //remove all joined group from the commander list 00107 Commander.Groups.RemoveAll(g => joinedGroups.Contains(g.Id)); 00108 00109 Logger.Write("Commander Groups After Reconfiguration:"); 00110 foreach (Group g in Commander.Groups) 00111 { 00112 Logger.Write(g.Pirates.Count.ToString()); 00113 } 00114 } 00115 00120 private static List<int> GetUltimateGameConfig() 00121 { 00122 //Enemy configuration 00123 int[] eConfig = Enemy.Groups.ConvertAll(group => @group.EnemyPirates.Count).ToArray(); 00124 00125 //sort the enemy configuration by size 00126 Array.Sort(eConfig, (a, b) => b.CompareTo(a)); 00127 00128 //prepare return value 00129 List<int> ret = new List<int>(); 00130 00131 //count of all of our pirates 00132 int myPirates = Bot.Game.AllMyPirates().Count; 00133 00134 for (int i = 0; i < eConfig.Length && myPirates > 0; i++) 00135 { 00136 if (((eConfig[i] + 1) < myPirates) && ((eConfig[i] + 1) < Magic.MaxGroupSize)) 00137 { 00138 ret.Add(eConfig[i] + 1); 00139 myPirates -= eConfig[i] + 1; 00140 } 00141 } 00142 00143 while (myPirates > 0) 00144 { 00145 ret.Add(1); 00146 myPirates--; 00147 } 00148 00149 while (ret.Count > Bot.Game.Islands().Count || ret.Count > Magic.MaxGroups) 00150 { 00151 ret[ret.Count - 2] += ret.Last(); 00152 ret.RemoveAt(ret.Count - 1); 00153 } 00154 00155 return ret; 00156 } 00157 } 00158 }
1.7.6.1