File: EnemySelector2.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 (296 lines) | stat: -rwxr-xr-x 11,707 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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
// 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 java.util.Map;

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

import hughai.*;
import hughai.basictypes.*;
import hughai.mapping.*;
import hughai.packcoordinators.*;
import hughai.unitdata.*;
import hughai.utils.*;

// legacy comment, not sure it's really accurate ;-) :
// this class should ideally work out appropriate enemies to attack,
// based on profile we define for it
// since different units have a different preference for
// attacking (air vs ground vs speed etc), we need a different object for each
public class EnemySelector2
{
   public double maxenemyspeed;
   public boolean WaterOk;
   public boolean BadTerrainOk;

   CSAI csai;
   OOAICallback aicallback;
   LogFile logfile;
   EnemyTracker enemyTracker;
   UnitDefHelp unitdefhelp;
   Maps maps;

   int startarea = 0;
   UnitDef typicalunitdef;

   public EnemySelector2( PlayerObjects playerObjects, double maxenemyspeed, UnitDef typicalunitdef)
   {
      csai = playerObjects.getCSAI();
      aicallback = csai.aicallback;
      logfile = playerObjects.getLogFile();
      enemyTracker = playerObjects.getEnemyTracker();
      unitdefhelp = playerObjects.getUnitDefHelp();
      maps = playerObjects.getMaps();

      // csai.EnemyEntersLOSEvent += new CSAI.EnemyEntersLOSHandler( EnemyEntersLOS );

      //		enemycontroller = EnemyController.GetInstance();
      //		unitdefhelp = new UnitDefHelp(aicallback);

      this.maxenemyspeed = maxenemyspeed;
//      this.WaterOk = WaterOk;
//      this.BadTerrainOk = BadTerrainOk;

      this.typicalunitdef = typicalunitdef;

      csai.RegisterVoiceCommand( "fakeenemy", new VoiceFakeEnemy() );
      csai.RegisterVoiceCommand( "cancelfakeenemy", new VoiceCancelFakeEnemy() );
      //    startarea = MovementMaps.GetInstance().GetArea(typicalunitdef, startpos);
   }

   public void InitStartPos(TerrainPos startpos)
   {
      startarea = maps.getMovementMaps().GetArea(typicalunitdef, startpos);
   }

   class VoiceFakeEnemy implements VoiceCommandHandler {
      @Override
      public void commandReceived( String command, String[] splitargs, int teamnumber ) {
         fakeEnemyPos = new TerrainPos( Integer.parseInt( splitargs[2] ), 0,
               Integer.parseInt( splitargs[3] ) );
         fakeEnemy = true;
      }
   }

   class VoiceCancelFakeEnemy implements VoiceCommandHandler {
      @Override
      public void commandReceived( String command, String[] splitargs, int teamnumber ) {
         fakeEnemy = false;
      }
   }

   boolean fakeEnemy = false;
   TerrainPos fakeEnemyPos;

   // just get nearest known slow enemy
   // otherwise any enemy
   // no priority for buildings
   public TerrainPos ChooseAttackPoint( TerrainPos ourpos)
   {
      if( fakeEnemy ) {
         return fakeEnemyPos;
      }
      Unit bestunit = null;
      boolean gotknownunit = false;
      UnitDef defforbestid = null;
      TerrainPos posforbestid = null;
      double BestSquaredDistance = 100000000000d;
      for( Unit enemyunit : enemyTracker.EnemyUnits ) {
         UnitDef enemyunitdef = enemyTracker.EnemyUnitDefByUnit.get( enemyunit );
         TerrainPos enemypos = enemyTracker.getPos( enemyunit );
         if (enemypos != null)
         {
            if (maps.getMovementMaps().GetArea(typicalunitdef, enemypos) == startarea)
            {
               if (enemypos.GetSquaredDistance(new TerrainPos() ) > 1)
               {
                  double thissquareddistance = enemypos.GetSquaredDistance( ourpos );
                  if (enemyunitdef != null)
                  {
                     if (enemyunitdef.getSpeed() < maxenemyspeed) // if we already have building we dont care
                     {
                        if (thissquareddistance < BestSquaredDistance)
                        {
                           //    logfile.WriteLine( "best known so far" );
                           bestunit = enemyunit;
                           gotknownunit = true;
                           posforbestid = enemypos;
                           defforbestid = enemyunitdef;
                           BestSquaredDistance = thissquareddistance;
                        }
                     }
                  }
                  else
                  {
                     if (!gotknownunit) // if we haven't found a known unit,
                                        // go for an unknown unit
                     {
                        if (thissquareddistance < BestSquaredDistance)
                        {
                           //    logfile.WriteLine( "best unknown so far" );
                           bestunit = enemyunit;
                           posforbestid = enemypos;
                           defforbestid = enemyunitdef;
                           BestSquaredDistance = thissquareddistance;
                        }
                     }
                  }
               }
            }
         }
      }
      for( Unit enemyunit : enemyTracker.EnemyUnits ) {
         //  logfile.WriteLine( "EnemySelector: checking static... " );
         UnitDef unitdef = enemyTracker.EnemyUnitDefByUnit.get( enemyunit );
         TerrainPos enemypos = enemyTracker.getPos( enemyunit );
         if (enemypos != null)
         {
            double thissquareddistance = enemypos.GetSquaredDistance( ourpos );
            //  logfile.WriteLine( "EnemySelector: Potential enemy at " + enemypos.toString() + " squareddistance: " + thissquareddistance );
            if (thissquareddistance < BestSquaredDistance)
            {
               //   logfile.WriteLine( "EnemySelector: best distance so far" );
               bestunit = enemyunit;
               //gotbuilding = true;
               gotknownunit = true;
               posforbestid = enemypos;
               //defforbestid = unitdef;
            }
         }
      }
      if( posforbestid != null ) {
         logfile.WriteLine( "EnemySelector.chooseattackpoint. best enemy: " +
           bestunit.getUnitId() + " " + posforbestid );
      }
      return posforbestid;
   }

   // this is going to have to interact with all sorts of stuff in the future
   // for now keep it simple
   // for now we look for nearby buildings, then nearby enemy units with low speed, then anything
   public TerrainPos OldChooseAttackPoint(TerrainPos ourpos)
   {
      boolean gotbuilding = false;
      boolean gotknownunit = false;
      double BestSquaredDistance = 100000000000d;

      Unit bestunit = null;
      UnitDef defforbestid = null;
      TerrainPos posforbestid = null;
      //   logfile.WriteLine( "EnemySelector: checking mobile... " );
      for( Unit enemyunit : enemyTracker.EnemyUnits ) {
         UnitDef unitdef = enemyTracker.EnemyUnitDefByUnit.get( enemyunit );
         TerrainPos enemypos = enemyTracker.getPos( enemyunit );
         // logfile.WriteLine( "Found building " + 
         if (maps.getMovementMaps().GetArea(typicalunitdef, enemypos) 
               == startarea)
         {
            if (enemypos.GetSquaredDistance( new TerrainPos() ) > 1)
            {
               double thissquareddistance = ourpos.GetSquaredDistance( enemypos);
               //   logfile.WriteLine( "EnemySelector: Potential enemy at " + enemypos.toString() + " squareddistance: " + thissquareddistance );
               if (unitdef != null)
               {
                  //   logfile.WriteLine( "unitdef not null " + unitdef.getHumanName() + " ismobile: " + unitdefhelp.IsMobile( unitdef ).toString() );
                  //   logfile.WriteLine( "gotbuilding = " + gotbuilding.toString() );
                  if (gotbuilding)
                  {
                     if (!unitdefhelp.IsMobile(unitdef))
                     {
                        if (thissquareddistance < BestSquaredDistance)
                        {
                           //  logfile.WriteLine( "best building so far" );
                           bestunit = enemyunit;
                           gotbuilding = true;
                           gotknownunit = true;
                           posforbestid = enemypos;
                           defforbestid = unitdef;
                           BestSquaredDistance = thissquareddistance;
                        }
                     }
                  }
                  else
                  {
                     if (unitdef.getSpeed() < maxenemyspeed) // if we already have building we dont care
                     {
                        if (thissquareddistance < BestSquaredDistance)
                        {
                           //    logfile.WriteLine( "best known so far" );
                           bestunit = enemyunit;
                           gotknownunit = true;
                           posforbestid = enemypos;
                           defforbestid = unitdef;
                           BestSquaredDistance = thissquareddistance;
                        }
                     }
                  }
               }
               else // if unitdef unknown
               {
                  //  logfile.WriteLine( "gotknownunit = " + gotknownunit.toString() );
                  if (!gotknownunit) // otherwise just ignore unknown units
                  {
                     if (thissquareddistance < BestSquaredDistance)
                     {
                        //    logfile.WriteLine( "best unknown so far" );
                        bestunit = enemyunit;
                        posforbestid = enemypos;
                        defforbestid = unitdef;
                        BestSquaredDistance = thissquareddistance;
                     }
                  }
               }
            }
         }
      }

      for( Unit enemyunit : enemyTracker.EnemyUnits ) {
         UnitDef unitdef = enemyTracker.EnemyUnitDefByUnit.get( enemyunit );
         TerrainPos enemypos = enemyTracker.getPos( enemyunit );
         double thissquareddistance = ourpos.GetSquaredDistance(enemypos);
         //  logfile.WriteLine( "EnemySelector: Potential enemy at " + enemypos.toString() + " squareddistance: " + thissquareddistance );
         if (thissquareddistance < BestSquaredDistance)
         {
            //   logfile.WriteLine( "EnemySelector: best distance so far" );
            bestunit = enemyunit;
            gotbuilding = true;
            gotknownunit = true;
            posforbestid = enemypos;
            //defforbestid = unitdef;
         }
      }

      //if( enemycontroller.EnemyStaticPosByDeployedId.Contains( bestid ) )
      // {
      //     enemycontroller.EnemyStaticPosByDeployedId.remove( bestid );
      // }

      return posforbestid;
   }
}