source: golgotha/src/golg/objs/ai_jim.cc @ 80

Last change on this file since 80 was 80, checked in by Sam Hocevar, 11 years ago
  • Adding the Golgotha source code. Not sure what's going to be interesting in there, but since it's all public domain, there's certainly stuff to pick up.
File size: 7.5 KB
Line 
1/********************************************************************** <BR>
2  This file is part of Crack dot Com's free source code release of
3  Golgotha. <a href="http://www.crack.com/golgotha_release"> <BR> for
4  information about compiling & licensing issues visit this URL</a>
5  <PRE> If that doesn't help, contact Jonathan Clark at
6  golgotha_source@usa.net (Subject should have "GOLG" in it)
7***********************************************************************/
8
9#include "team_api.hh"
10#include "player.hh"
11#include "memory/array.hh"
12#include "math/angle.hh"
13#include "math/trig.hh"
14#include "map.hh"
15#include "resources.hh"
16#include "time/profile.hh"
17#include "objs/stank.hh"
18#include "objs/path_object.hh"
19#include "objs/bases.hh"
20#include "g1_rand.hh"
21#include "tick_count.hh"
22#include "saver.hh"
23#include "lisp/lisp.hh"
24
25//(Oli) hack for reloading this AI
26extern w16 ai_jim_dll_ref;
27
28char *unit_name[] = {
29  "stank",            //a
30  "peon_tank",        //b
31  "electric_car",     //c
32  "rocket_tank",      //d
33  "tank_buster",      //e
34  "trike",            //f
35  "engineer",         //g
36  "bomb_truck",       //h
37  "helicopter",       //i
38  "jet",              //j
39  "bomber",           //k
40};
41const int num_unit_types=sizeof(unit_name)/sizeof(char*);
42w16 unit_type[num_unit_types];
43
44char *formation[] =
45{
46  // LAND
47
48  "bcbcbcedddg",                // stock
49  "cccccc",                     // electric brigade
50  "bbcdebbcdegheddd",           // hole puncher
51  "b b b ",                     // gene's checker
52  "bbbbbdd",                    // peon V
53  "ccbbedddddd",                // rockets R us
54  "bbdg",                       // small band
55  "ccdg",                       // yet another small band
56  "ddeg",                       // yet another small band
57  "g",                          // wild shot
58  "bbbbcccceh",                 // ouch!
59  "h",                          // woohoo!
60
61  // AIR
62
63  "iii",                        // heli hell
64  "jikjikjik",                  // airraid
65  "jjiiiikkkkkkkk",             // the sky is falling
66  "kkk",                        // bombsquad
67};
68int num_formations=sizeof(formation)/sizeof(char*);
69
70class ai_jim : public g1_team_api_class
71{
72public:
73  enum
74  {
75    DATA_VERSION=1
76  };
77  enum
78  {
79    BUILD,
80    BUILDWAIT,
81    RESURRECT
82  };
83
84  sw16 mode;
85  w16 time;
86  sw16 form, spot;
87  w8 reload;
88
89  ai_jim(g1_loader_class *f)
90  {
91    reload=0;
92  }
93
94  virtual void init()
95  //{{{
96  {
97    for (int i=0; i<num_unit_types; i++)
98      unit_type[i] = object_type(unit_name[i]);
99
100    mode = BUILD;
101    form = -1;
102    spot = 0;
103  }
104  //}}}
105
106  virtual void load(g1_loader_class *f)
107  //{{{
108  {
109    w16 ver=0,data_size;
110
111    f->get_version(ver,data_size);
112
113    switch (ver)
114    {
115      case DATA_VERSION:
116        f->read_format("22228",
117                       &mode, &time, &form, &spot, &reload);
118        break;
119      default:
120        f->seek(f->tell() + data_size);
121        break;
122    }
123    f->end_version(I4_LF);
124  }
125  //}}}
126
127  virtual void save(g1_saver_class *f)
128  //{{{
129  {
130    f->start_version(DATA_VERSION);
131    f->write_format("22228",
132                    &mode, &time, &form, &spot, &reload);
133    f->end_version();
134  }
135  //}}}
136
137  void find_new_target()
138  //{{{
139  {
140    g1_path_object_class *p;
141
142    for (int tries=0; tries<30; tries++)
143    {
144      int t=0;
145      for (p=g1_path_object_list.first(); p; p=p->next)
146        t++;
147
148      g1_team_type my_team=g1_player_man.get(team())->get_team();
149
150      if (t)
151      {
152        int i=g1_rand(tries)%t;
153        for (p=g1_path_object_list.first(); i--; p=p->next);
154
155        set_current_target(p->global_id);
156
157        int bad_path=0;
158        for (g1_factory_class *f=g1_factory_list.first(); f; f=f->next)
159        {
160          for (p=f->get_start();p;)
161          {
162            if (p->get_bridge_status()==g1_path_object_class::HAS_BRIDGE)
163              bad_path=1;
164
165            p=p->get_recent_link(my_team, 0);           
166          }
167        }
168
169        if (!bad_path)
170          return;
171      }
172    }
173  }
174  //}}}
175
176  virtual void object_added(w32 id)
177  //{{{
178  {
179    // use this to get path_objects
180  }
181  //}}}
182
183  void guide_hero()
184  //{{{
185  {
186    return ;    // no stank for demo
187
188    if (!commander() || commander()->health<=0)
189    {
190      build_unit(unit_type[0]);
191      return;
192    }
193
194    if (ammo0()==0 && ammo1()==0 && ammo2()==0 && !reload)
195    {
196      /*
197        jc fixme : send supertank to home base
198      tx = map()->player_pad_info[player->get_player_num()].bases[0].x;
199      ty = map()->player_pad_info[player->get_player_num()].bases[0].y;
200     
201      commander()->deploy_to(tx,ty);
202      reload = 1;
203      */
204    }
205   
206    if (reload)
207    {
208      if (full0() && full1() && full2())
209        reload=0;
210
211      return;
212    }
213
214    if (!commander()->attack_target.valid())
215    {
216      commander()->find_target();
217      if (!commander()->attack_target.valid() && !commander()->path)
218      {
219        i4_float tx,ty;
220
221        tx = i4_float(g1_rand(1)%(map()->width()-4))  + 2.5;
222        ty = i4_float(g1_rand(2)%(map()->height()-4)) + 2.5;
223
224        deploy_unit(commander()->global_id, tx, ty);
225      }
226    }
227    else
228    {
229      commander()->set_path(0);
230             
231      g1_object_class *mp = commander()->attack_target.get();
232
233      if (mp)
234      {
235        i4_float dx,dy,angle, adiff, dist2;
236
237        i4_3d_point_class pos;
238        commander()->lead_target(pos,0);
239       
240        //this will obviously only be true if me->attack_target.ref != NULL   
241        dx = (pos.x - (commander()->x+commander()->turret->x));
242        dy = (pos.y - (commander()->y+commander()->turret->y));
243        dist2 = dx*dx+dy*dy;
244
245        //aim the turet
246       
247        angle = i4_atan2(dy,dx);
248        i4_normalize_angle(angle);   
249
250        i4_float dangle = (angle - commander()->base_angle);
251        if (dangle>i4_pi())
252          dangle -= 2*i4_pi();
253        else if (dangle<-i4_pi())
254          dangle += 2*i4_pi();
255
256        turn(dangle);
257
258        if (dangle>-0.04 && dangle<0.04)
259          if      (mp->id == g1_supertank_type && in_range1() && fire1()) ;
260          else if (in_range0() && fire0()) ;
261          else if (in_range2() && fire2()) ;
262       
263        if (dist2<9.0)
264          strafe(-0.7);
265        else if (dist2<64.0)
266        {
267          strafe(0.5);
268          accelerate(0.1);
269        }
270        else
271        {
272          strafe(-0.1);
273          accelerate(1);
274        }
275      }
276    }
277  }
278  //}}}
279
280  virtual void think()
281  {
282    if ((g1_rand(0)&7)==0)
283    {
284      li_object *list=li_get_value("enemy_buildable");
285      int t=li_length(list, 0);
286      if (t)
287      {
288        int type=g1_get_object_type(li_symbol::get(li_nth(list, g1_rand(1)%t, 0),0));
289        build_unit(type);
290      }
291    }
292
293    if ((g1_rand(2)&8)==0)
294      find_new_target();
295
296#if 0
297    guide_hero();
298
299    if (form<0)
300    {
301      find_new_target();
302      form = (g1_rand(4))%num_formations;
303      spot = 0;
304    }
305    switch (mode)
306    {
307      case BUILD:
308        if (formation[form][spot]!=' ')
309          build_unit(unit_type[formation[form][spot] - 'a']);
310
311        if (formation[form][++spot]==0)
312          form = -1;
313
314        time=10;
315        mode = BUILDWAIT;
316        break;
317      case BUILDWAIT:
318        if (time>0)
319          time--;
320        else
321          mode = BUILD;
322        break;
323    }
324#endif
325  }
326};
327g1_team_api_definer<ai_jim> ai_jim_def("ai_jim");
328
329//{{{ Emacs Locals
330// Local Variables:
331// folded-file: t
332// End:
333//}}}
Note: See TracBrowser for help on using the repository browser.