Advertisement
GauHelldragon

SE - Refinery Timer

Mar 17th, 2016
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.59 KB | None | 0 0
  1. const double WORLD_REFINE_BONUS = 5;
  2.  
  3.  
  4. class ore
  5. {
  6.     public string oreName;
  7.     public int count;
  8.     public double speed;
  9.    
  10.     public ore(string name,double s)
  11.     {
  12.         this.oreName = name;
  13.         this.speed = s;
  14.         this.count = 0;
  15.     }
  16. }  
  17.  
  18. class oreList
  19. {
  20.     public List<ore> myOres;
  21.    
  22.     public oreList() {
  23.         myOres = new List<ore>();
  24.         myOres.Add(new ore("Stone",0.1));
  25.         myOres.Add(new ore("Iron",0.05));
  26.         myOres.Add(new ore("Silicon",0.6));
  27.         myOres.Add(new ore("Nickel",2.0));
  28.         myOres.Add(new ore("Cobalt",4.0));
  29.         myOres.Add(new ore("Silver",1.0));
  30.         myOres.Add(new ore("Gold",0.4));
  31.         myOres.Add(new ore("Magnesium",1.0));
  32.         myOres.Add(new ore("Uranium",4));
  33.         myOres.Add(new ore("Platinum",4));
  34.  
  35.     }
  36.     public int getTotalTime(double speedMulti=1.3) {
  37.         int totalTime = 0;
  38.         for ( int i = 0; i < myOres.Count; i++ ) {
  39.             //totalTime += (int)( myOres[i].count * myOres[i].speed / speedMulti );
  40.             totalTime += getOreTime(myOres[i],speedMulti);
  41.         }
  42.         //return (int) (totalTime / WORLD_REFINE_BONUS);
  43.         return totalTime;
  44.     }
  45.     public int getOreTime(ore myOre, double speedMulti=1.3) {
  46.         return (int) ((  myOre.count * myOre.speed / speedMulti ) / WORLD_REFINE_BONUS );
  47.        
  48.     }
  49.    
  50.     public ore getOre(string name) {
  51.         for ( int i = 0; i < myOres.Count ; i++ ) {
  52.             ore myOre = myOres[i];
  53.             if ( myOre.oreName == name ) { return myOre; }
  54.         }
  55.         return null;
  56.     }
  57.     public void addCount(string name,int count) {
  58.         ore myOre = getOre(name);
  59.         if ( myOre != null ) { addCount(myOre,count); }
  60.     }
  61.     public void addCount(ore p,int count) {
  62.         p.count += count;
  63.  
  64.     }
  65.    
  66.     public void addRefinery(IMyTerminalBlock refinery) {
  67.         VRage.Game.ModAPI.Ingame.IMyInventory inventory;
  68.         inventory = refinery.GetInventory(0);
  69.        
  70.         List<VRage.Game.ModAPI.Ingame.IMyInventoryItem> items = new List<VRage.Game.ModAPI.Ingame.IMyInventoryItem>();
  71.         items = inventory.GetItems();
  72.         for ( int i = 0; i < items.Count; i++ ) {
  73.             VRage.Game.ModAPI.Ingame.IMyInventoryItem item = items[i];
  74.             addCount(item.Content.SubtypeName, (int)item.Amount);
  75.             //total += (double)item.Amount;
  76.         }
  77.    
  78.     }
  79.    
  80. }
  81.  
  82. string timeString(int secs) {
  83.     TimeSpan t = TimeSpan.FromSeconds( secs );
  84.     string time = string.Format("{0:D2}h:{1:D2}m:{2:D2}s",
  85.                     t.Hours,
  86.                     t.Minutes,
  87.                     t.Seconds);
  88.     return time;
  89. }
  90.  
  91. double GetAverageRefinerySpeed(List<IMyTerminalBlock> refineries) {
  92.     if ( refineries == null || refineries.Count == 0 )
  93.         return 1.3;
  94.    
  95.     double totalRefineSpeed = 0.0;
  96.     System.Text.RegularExpressions.Regex speedRegex = new System.Text.RegularExpressions.Regex( "Productivity:  (\\d+\\.?\\d*)%" , System.Text.RegularExpressions.RegexOptions.Singleline);
  97.  
  98.     for ( int i = 0; i < refineries.Count; i++ )
  99.     {
  100.         double speed = 100.0;
  101.         System.Text.RegularExpressions.Match match = speedRegex.Match( refineries[i].DetailedInfo);
  102.         if (match.Success)
  103.             double.TryParse(match.Groups[1].Value, out speed);
  104.         totalRefineSpeed += speed;
  105.     }
  106.    
  107.     double aveSpeed = ( totalRefineSpeed / refineries.Count ) / 100.0;
  108.     aveSpeed += 0.3; //Refinery base speed
  109.    
  110.     return aveSpeed;
  111.    
  112.    
  113. }
  114.  
  115.  
  116. void Main(string argument)
  117. {
  118.     IMyTextPanel tPanel = GridTerminalSystem.GetBlockWithName("Refine-Panel") as IMyTextPanel;
  119.     if ( tPanel == null )
  120.     {
  121.         Echo("No Text Panel found.");
  122.         return;
  123.     }
  124.    
  125.    
  126.     List<IMyTerminalBlock> refineries = new List<IMyTerminalBlock>();
  127.     GridTerminalSystem.GetBlocksOfType<IMyRefinery>(refineries);
  128.    
  129.     if ( refineries == null || refineries.Count < 1 )
  130.     {
  131.         Echo("No refineries found.");
  132.         return;
  133.     }
  134.    
  135.     oreList ores = new oreList();
  136.    
  137.     double aveRefineSpeed = GetAverageRefinerySpeed(refineries);
  138.  
  139.     for ( int i = 0; i < refineries.Count; i++ )
  140.     {
  141.         ores.addRefinery(refineries[i]);
  142.     }
  143.     Echo("Added " + refineries.Count + " refineries\n");
  144.    
  145.     //ore ironOre = ores.getOre("Iron");
  146.    
  147.     int totalSeconds = ores.getTotalTime(aveRefineSpeed);
  148.     Echo("Total refinery time = " + totalSeconds + "\n");
  149.    
  150.     totalSeconds /= refineries.Count;
  151.  
  152.                    
  153.                    
  154.     string time = timeString(totalSeconds);            
  155.     tPanel.WritePublicText("Refinery Completion Countdown\n");
  156.     tPanel.WritePublicText("Total Time Left:  " + time,true);
  157.     tPanel.WritePublicText("\n\n",true);
  158.     for ( int i = 0; i < ores.myOres.Count; i++ )
  159.     {
  160.         ore myOre = ores.myOres[i];
  161.         if ( myOre.count > 0 ) {
  162.             int oTime = ores.getOreTime(myOre,aveRefineSpeed);
  163.             oTime /= refineries.Count;
  164.             string timeS = timeString(oTime);
  165.             tPanel.WritePublicText(String.Format("{0,-15} {1,15}\n",myOre.oreName,timeS),true);
  166.            
  167.         }
  168.     }
  169.    
  170.    
  171.     tPanel.GetActionWithName("IncreaseFontSize").Apply(tPanel);
  172.     tPanel.GetActionWithName("DecreaseFontSize").Apply(tPanel);
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement