home *** CD-ROM | disk | FTP | other *** search
/ Superpower (Alt) / SUPERPOWER.iso / q / patch / mbq115 / src / bot_roam.qc < prev    next >
Encoding:
Text File  |  1996-09-02  |  6.5 KB  |  290 lines

  1. //Monday, September 02, 1996, 11:54:20 PM
  2.  
  3. /*
  4.  *        BOT_ROAM.QC
  5.  *        ===========
  6.  *        Author: Carson Sutton
  7.  */
  8.  
  9. /*
  10. New fields added to end of defs.qc:
  11. ===================================
  12. .entity    lead;
  13. .float    fl_lead;
  14. .float    lead_dist;
  15. .float    dest_time;
  16.  
  17. Constants added to bot.h:
  18. =========================
  19. float   BOT_LEAD_TIME
  20. float   BOT_LEAD_DIST
  21. float   ROAM_DEVEL
  22.  
  23. Fields defined when bot spawned (bot.qc):
  24. =========================================
  25. newbot.th_walk = bot_runa1;  // Why walk when you can run?
  26. newbot.fl_lead = FALSE;
  27.  
  28. Now running when roaming (botai.qc):
  29. ====================================
  30. void()    bot_runa1    =[    $run1  ,    bot_runa2    ]
  31. {
  32.     if (random() < 0.1)
  33.         sound (self, CHAN_VOICE, "enforcer/idle1.wav", 1, ATTN_IDLE);
  34.     bot_ai_roam(18);
  35. };
  36. void()    bot_runa2    =[    $run2  ,    bot_runa3    ] {bot_ai_roam(14);};
  37. void()    bot_runa3    =[    $run3  ,    bot_runa4    ] {bot_ai_roam(7);};
  38. void()    bot_runa4    =[    $run4  ,    bot_runa5    ] {bot_ai_roam(12);};
  39. void()    bot_runa5    =[    $run5  ,    bot_runa6    ] {bot_ai_roam(14);};
  40. void()    bot_runa6    =[    $run6  ,    bot_runa7    ] {bot_ai_roam(14);};
  41. void()    bot_runa7    =[    $run7  ,    bot_runa8    ] {bot_ai_roam(7);};
  42. void()    bot_runa8   =[    $run8  ,    bot_runa1   ] {bot_ai_roam(11);};
  43.  
  44. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  45. Plus other changes, most documented with:
  46.  
  47. //***********
  48.  
  49. ...
  50.  
  51. //***********
  52. */
  53.  
  54.  
  55.  
  56. float        (entity t)            target_range;
  57. void        ()                bot_lead_destination;
  58. void        ()                bot_lead_think;
  59. void        ()                bot_lead_spawn;
  60. void        (float dist)        bot_ai_roam;
  61.  
  62. float(entity t) target_range =
  63. {
  64.     local vector    v1, v2;
  65.     local float        r;
  66.  
  67.       v1 = self.origin + self.view_ofs;
  68.       v2 = t.origin + t.view_ofs;
  69.  
  70.       r = vlen (v1 - v2);
  71.       return r;
  72. };
  73.  
  74. void() bot_lead_destination = 
  75. {
  76.     local entity leader;
  77.     local float r;
  78.     local vector src;
  79.  
  80.     leader = self;
  81.     self = leader.owner;
  82.  
  83.     if (self.lead_dist <= BOT_LEAD_DIST || leader.dest_time < time)
  84.     {
  85.         if (leader.dest_time < time)
  86.         {
  87.             if(ROAM_DEVEL==TRUE)
  88.                 bprint("Lead time expired, turn around.\n");
  89.             self.v_angle=self.v_angle + '0 180 0';
  90.         }
  91.         else
  92.         {
  93.             r=random();
  94.             if(r>=0.90)
  95.             {
  96.                 if(ROAM_DEVEL==TRUE)
  97.                     bprint("Left, 20 degrees.\n");
  98.                 self.v_angle=self.v_angle + '0 20 0';
  99.             }
  100.             else
  101.             if(r>=0.80)
  102.             {
  103.                 if(ROAM_DEVEL==TRUE)
  104.                     bprint("Left, 60 degrees.\n");
  105.                 self.v_angle=self.v_angle + '0 60 0';
  106.             }
  107.             else
  108.             if(r>=0.70)
  109.             {
  110.                 if(ROAM_DEVEL==TRUE)
  111.                     bprint("Left, 45 degrees.\n");
  112.                 self.v_angle=self.v_angle + '0 45 0';
  113.             }
  114.             else
  115.             if(r>=0.60)
  116.             {
  117.                 if(ROAM_DEVEL==TRUE)
  118.                     bprint("Hard left.\n");
  119.                 self.v_angle=self.v_angle + '0 90 0';
  120.             }
  121.             else
  122.             if(r>=0.45) // Just a little added randomness.
  123.             {
  124.                 if(ROAM_DEVEL==TRUE)
  125.                     bprint("Turn around.\n");
  126.                 self.v_angle=self.v_angle - '0 180 0';
  127.             }
  128.             else
  129.             if(r>=0.30)
  130.             {
  131.                 if(ROAM_DEVEL==TRUE)
  132.                     bprint("Hard right.\n");
  133.                 self.v_angle=self.v_angle - '0 90 0';
  134.             }
  135.             else
  136.             if(r>=0.20)
  137.             {
  138.                 if(ROAM_DEVEL==TRUE)
  139.                     bprint("Right, 45 degrees.\n");
  140.                 self.v_angle=self.v_angle - '0 45 0';
  141.             }
  142.             else
  143.             if(r>=0.10)
  144.             {
  145.                 if(ROAM_DEVEL==TRUE)
  146.                     bprint("Right, 60 degrees.\n");
  147.                 self.v_angle=self.v_angle - '0 60 0';
  148.             }
  149.             else
  150.             if(r>=0.00)
  151.             {
  152.                 if(ROAM_DEVEL==TRUE)
  153.                     bprint("Right, 20 degrees.\n");
  154.                 self.v_angle=self.v_angle - '0 20 0';
  155.             }
  156.         }
  157.         leader.dest_time = time + BOT_LEAD_TIME;
  158.     }
  159.     makevectors(self.v_angle);
  160.     src=self.origin+v_forward*10;
  161.     src_z=self.absmin_z+self.size_z*0.5;
  162.     traceline(src,src+v_forward*1000,FALSE,self);
  163.     setorigin(leader,trace_endpos-v_forward);
  164.     self.lead_dist = target_range(leader);
  165.     if(self.lead_dist<25)
  166.     {
  167.         if(ROAM_DEVEL==TRUE)
  168.             bprint("Dead end. Turn left.\n");
  169.         self.v_angle=self.v_angle + '0 90 0';
  170.         makevectors(self.v_angle);
  171.         src=self.origin+v_forward*10;
  172.         src_z=self.absmin_z+self.size_z*0.5;
  173.         traceline(src,src+v_forward*1000,FALSE,self);
  174.         setorigin(leader,trace_endpos-v_forward);
  175.         self.lead_dist = target_range(leader);
  176.         leader.dest_time = time + BOT_LEAD_TIME;
  177.     }
  178.     if(self.lead_dist<25)
  179.     {
  180.         if(ROAM_DEVEL==TRUE)
  181.             bprint("Dead end. Turn right.\n");
  182.         self.v_angle=self.v_angle - '0 180 0';
  183.         makevectors(self.v_angle);
  184.         src=self.origin+v_forward*10;
  185.         src_z=self.absmin_z+self.size_z*0.5;
  186.         traceline(src,src+v_forward*1000,FALSE,self);
  187.         setorigin(leader,trace_endpos-v_forward);
  188.         self.lead_dist = target_range(leader);
  189.         leader.dest_time = time + BOT_LEAD_TIME;
  190.     }
  191.     if(self.lead_dist<25)
  192.     {
  193.         if(ROAM_DEVEL==TRUE)
  194.             bprint("Dead end. Turn back.\n");
  195.         self.v_angle=self.v_angle - '0 90 0';
  196.         makevectors(self.v_angle);
  197.         src=self.origin+v_forward*10;
  198.         src_z=self.absmin_z+self.size_z*0.5;
  199.         traceline(src,src+v_forward*1000,FALSE,self);
  200.         setorigin(leader,trace_endpos-v_forward);
  201.         self.lead_dist = target_range(leader);
  202.         leader.dest_time = time + BOT_LEAD_TIME;
  203.     }
  204.  
  205.     if(trace_ent.classname!="worldspawn")
  206.     if(trace_ent.classname=="door")
  207.     {
  208.         self.lead_dist = self.lead_dist + 999;  // Bot should be able to
  209.                                     // trigger doors.
  210.     }
  211.     else
  212.     if(ROAM_DEVEL==TRUE)
  213.     {
  214.         bprint("Bot sees: ");
  215.         bprint(trace_ent.classname);
  216.         bprint("\n");
  217.     }
  218.  
  219.     self = leader;
  220.     return;
  221. };
  222.  
  223. void() bot_lead_think = 
  224. {
  225.     local entity follower,oldself;
  226.  
  227.     oldself = self;
  228.     self = self.owner;
  229.     if (BotFindTarget ())
  230.     {
  231.         self.fl_lead = FALSE;
  232.     }
  233.     if (BotFindStuff ())
  234.     {
  235.             self.fl_lead = FALSE;
  236.     }
  237.     self = oldself;
  238.     follower = self.owner;
  239.     if (follower.fl_lead == FALSE)
  240.     {
  241.         if(ROAM_DEVEL==TRUE)
  242.             bprint("Leader removed...\n");
  243.         remove(self);
  244.         return;
  245.     }
  246.  
  247.     bot_lead_destination();
  248.  
  249.     self.nextthink=time+0.1;
  250.     follower.goalentity = follower.movetarget = follower.lead;
  251.     follower.ideal_yaw  = vectoyaw(follower.goalentity.origin - follower.origin);
  252. };
  253.  
  254. void() bot_lead_spawn = 
  255. {
  256.     local entity leader;
  257.  
  258.     leader = spawn();
  259.     leader.classname = "leader";
  260.       setorigin(leader,self.origin);
  261.     if(ROAM_DEVEL==TRUE)
  262.         setmodel(leader,"progs/s_bubble.spr");
  263.     setsize(leader,'0 0 0','0 0 0');
  264.     leader.movetype=MOVETYPE_NONE;
  265.     leader.solid=SOLID_NOT;
  266.     leader.owner=self;
  267.     leader.nextthink=time+0.1;
  268.     leader.think=bot_lead_think;
  269.     leader.dest_time = time + BOT_LEAD_TIME;
  270.     self.fl_lead = TRUE;
  271.     self.lead = leader;
  272.     if(ROAM_DEVEL==TRUE)
  273.         bprint("Leader created...\n");
  274. };
  275.  
  276. //============
  277. // bot_ai_roam
  278. //============
  279. void(float dist) bot_ai_roam =
  280. {
  281. //    local float yaw;
  282.  
  283.       if (self.fl_lead == FALSE)
  284.     {
  285.         bot_lead_spawn();
  286.     }
  287.  
  288.     movetogoal (dist);
  289. };
  290.