File: MetalController.java

package info (click to toggle)
spring 106.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 55,316 kB
  • sloc: cpp: 543,954; ansic: 44,800; python: 12,575; java: 12,201; awk: 5,889; sh: 1,796; asm: 1,546; xml: 655; perl: 405; php: 211; objc: 194; makefile: 76; sed: 2
file content (99 lines) | stat: -rwxr-xr-x 3,925 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Copyright Hugh Perkins 2006, 2009
// hughperkins@gmail.com http://manageddreams.com
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
//  more details.
//
// You should have received a copy of the GNU General Public License along
// with this program in the file licence.txt; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-
// 1307 USA
// You can find the licence also on the web at:
// http://www.opensource.org/licenses/gpl-license.php
//
// ======================================================================================
//

package hughai;

import java.util.*;

import com.springrts.ai.*;
import com.springrts.ai.oo.clb.*;

import hughai.basictypes.*;
import hughai.utils.*;


// manages metal
// decides whether we need more extractors etc
public class MetalController
{
	CSAI csai;
	OOAICallback aicallback;
	ResourceManager resourceManager;
	LogFile logfile;

	public MetalController( PlayerObjects playerObjects )
	{
		csai = playerObjects.getCSAI();
		aicallback = csai.aicallback;
		logfile = playerObjects.getLogFile();
		resourceManager = playerObjects.getResourceManager();
	}

	// looks at current power usage, and requirements for unit, and decides if we can build it without stalling
	// assumes nothing else suddenly starting at same time...
	// do something more elegant later
	public boolean CanBuild( UnitDef constructor, UnitDef targetdef )
	{
		Resource metal = resourceManager.metalResource;
		float metalcost = targetdef.getCost(metal);
		float currentmetal = resourceManager.getCurrentMetal();
		float metalincome = aicallback.getEconomy().getIncome(metal);
		float metalusage = aicallback.getEconomy().getUsage(metal);
		
		float constructorbuildspeed = constructor.getBuildSpeed();
		
		// if (csai.DebugOn)
		//  {
		//      aicallback.SendTextMsg("metalcontroller canbuild " + def.humanName + " current metal: " + aicallback.GetMetal() + " cost: " + def.metalCost, 0);
		//  }
		if ( currentmetal > metalcost )
		{
			return true;
		}
		//return aicallback.GetMetal() > def.metalCost;
		//double excessmetalrequired = ( metalcost - currentmetal * 8 / 10 ) / targetdef.getBuildTime();
		float actualbuildtime = targetdef.getBuildTime() / constructorbuildspeed;
        logfile.WriteLine( "constructor build speed: " + constructorbuildspeed +
              " targetbuildtime: " + targetdef.getBuildTime()
                + " actual buildtime: " + actualbuildtime
                + " metalcost " + metalcost
                + " currentmetal " + currentmetal );
        float excessmetalrequired = metalcost - currentmetal;
        float OurIncome = metalincome - metalusage;
		// now, in actualbuildtime seconds, will we have earned excessmetalrequired metal?
		
		float metalearnedwhilstbuilding = actualbuildtime * OurIncome;
		
		// let's have a margin of 20% to be safe
		boolean result = ( metalearnedwhilstbuilding * 0.8 ) > excessmetalrequired;
        logfile.WriteLine( "Metal income: " + metalincome
              + " metal usage: " + metalusage
              + " metalearnedwhilstbuilding: " + metalearnedwhilstbuilding 
              + " result: " + result );
		
//		boolean result = ( excessmetalrequired * 4 ) < OurIncome;
//		logfile.WriteLine( "Current metal: " + currentmetal + " itemmetalcost: " + metalcost + " buildtime: " + targetdef.getBuildTime() + " excessmetalrequired: " + excessmetalrequired + " our income: " + OurIncome + " overall: " + result );
		return result;

	}
}