home *** CD-ROM | disk | FTP | other *** search
- //Monday, September 02, 1996, 11:54:20 PM
-
- /*
- * BOT_ROAM.QC
- * ===========
- * Author: Carson Sutton
- */
-
- /*
- New fields added to end of defs.qc:
- ===================================
- .entity lead;
- .float fl_lead;
- .float lead_dist;
- .float dest_time;
-
- Constants added to bot.h:
- =========================
- float BOT_LEAD_TIME
- float BOT_LEAD_DIST
- float ROAM_DEVEL
-
- Fields defined when bot spawned (bot.qc):
- =========================================
- newbot.th_walk = bot_runa1; // Why walk when you can run?
- newbot.fl_lead = FALSE;
-
- Now running when roaming (botai.qc):
- ====================================
- void() bot_runa1 =[ $run1 , bot_runa2 ]
- {
- if (random() < 0.1)
- sound (self, CHAN_VOICE, "enforcer/idle1.wav", 1, ATTN_IDLE);
- bot_ai_roam(18);
- };
- void() bot_runa2 =[ $run2 , bot_runa3 ] {bot_ai_roam(14);};
- void() bot_runa3 =[ $run3 , bot_runa4 ] {bot_ai_roam(7);};
- void() bot_runa4 =[ $run4 , bot_runa5 ] {bot_ai_roam(12);};
- void() bot_runa5 =[ $run5 , bot_runa6 ] {bot_ai_roam(14);};
- void() bot_runa6 =[ $run6 , bot_runa7 ] {bot_ai_roam(14);};
- void() bot_runa7 =[ $run7 , bot_runa8 ] {bot_ai_roam(7);};
- void() bot_runa8 =[ $run8 , bot_runa1 ] {bot_ai_roam(11);};
-
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Plus other changes, most documented with:
-
- //***********
-
- ...
-
- //***********
- */
-
-
-
- float (entity t) target_range;
- void () bot_lead_destination;
- void () bot_lead_think;
- void () bot_lead_spawn;
- void (float dist) bot_ai_roam;
-
- float(entity t) target_range =
- {
- local vector v1, v2;
- local float r;
-
- v1 = self.origin + self.view_ofs;
- v2 = t.origin + t.view_ofs;
-
- r = vlen (v1 - v2);
- return r;
- };
-
- void() bot_lead_destination =
- {
- local entity leader;
- local float r;
- local vector src;
-
- leader = self;
- self = leader.owner;
-
- if (self.lead_dist <= BOT_LEAD_DIST || leader.dest_time < time)
- {
- if (leader.dest_time < time)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Lead time expired, turn around.\n");
- self.v_angle=self.v_angle + '0 180 0';
- }
- else
- {
- r=random();
- if(r>=0.90)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Left, 20 degrees.\n");
- self.v_angle=self.v_angle + '0 20 0';
- }
- else
- if(r>=0.80)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Left, 60 degrees.\n");
- self.v_angle=self.v_angle + '0 60 0';
- }
- else
- if(r>=0.70)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Left, 45 degrees.\n");
- self.v_angle=self.v_angle + '0 45 0';
- }
- else
- if(r>=0.60)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Hard left.\n");
- self.v_angle=self.v_angle + '0 90 0';
- }
- else
- if(r>=0.45) // Just a little added randomness.
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Turn around.\n");
- self.v_angle=self.v_angle - '0 180 0';
- }
- else
- if(r>=0.30)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Hard right.\n");
- self.v_angle=self.v_angle - '0 90 0';
- }
- else
- if(r>=0.20)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Right, 45 degrees.\n");
- self.v_angle=self.v_angle - '0 45 0';
- }
- else
- if(r>=0.10)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Right, 60 degrees.\n");
- self.v_angle=self.v_angle - '0 60 0';
- }
- else
- if(r>=0.00)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Right, 20 degrees.\n");
- self.v_angle=self.v_angle - '0 20 0';
- }
- }
- leader.dest_time = time + BOT_LEAD_TIME;
- }
- makevectors(self.v_angle);
- src=self.origin+v_forward*10;
- src_z=self.absmin_z+self.size_z*0.5;
- traceline(src,src+v_forward*1000,FALSE,self);
- setorigin(leader,trace_endpos-v_forward);
- self.lead_dist = target_range(leader);
- if(self.lead_dist<25)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Dead end. Turn left.\n");
- self.v_angle=self.v_angle + '0 90 0';
- makevectors(self.v_angle);
- src=self.origin+v_forward*10;
- src_z=self.absmin_z+self.size_z*0.5;
- traceline(src,src+v_forward*1000,FALSE,self);
- setorigin(leader,trace_endpos-v_forward);
- self.lead_dist = target_range(leader);
- leader.dest_time = time + BOT_LEAD_TIME;
- }
- if(self.lead_dist<25)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Dead end. Turn right.\n");
- self.v_angle=self.v_angle - '0 180 0';
- makevectors(self.v_angle);
- src=self.origin+v_forward*10;
- src_z=self.absmin_z+self.size_z*0.5;
- traceline(src,src+v_forward*1000,FALSE,self);
- setorigin(leader,trace_endpos-v_forward);
- self.lead_dist = target_range(leader);
- leader.dest_time = time + BOT_LEAD_TIME;
- }
- if(self.lead_dist<25)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Dead end. Turn back.\n");
- self.v_angle=self.v_angle - '0 90 0';
- makevectors(self.v_angle);
- src=self.origin+v_forward*10;
- src_z=self.absmin_z+self.size_z*0.5;
- traceline(src,src+v_forward*1000,FALSE,self);
- setorigin(leader,trace_endpos-v_forward);
- self.lead_dist = target_range(leader);
- leader.dest_time = time + BOT_LEAD_TIME;
- }
-
- if(trace_ent.classname!="worldspawn")
- if(trace_ent.classname=="door")
- {
- self.lead_dist = self.lead_dist + 999; // Bot should be able to
- // trigger doors.
- }
- else
- if(ROAM_DEVEL==TRUE)
- {
- bprint("Bot sees: ");
- bprint(trace_ent.classname);
- bprint("\n");
- }
-
- self = leader;
- return;
- };
-
- void() bot_lead_think =
- {
- local entity follower,oldself;
-
- oldself = self;
- self = self.owner;
- if (BotFindTarget ())
- {
- self.fl_lead = FALSE;
- }
- if (BotFindStuff ())
- {
- self.fl_lead = FALSE;
- }
- self = oldself;
- follower = self.owner;
- if (follower.fl_lead == FALSE)
- {
- if(ROAM_DEVEL==TRUE)
- bprint("Leader removed...\n");
- remove(self);
- return;
- }
-
- bot_lead_destination();
-
- self.nextthink=time+0.1;
- follower.goalentity = follower.movetarget = follower.lead;
- follower.ideal_yaw = vectoyaw(follower.goalentity.origin - follower.origin);
- };
-
- void() bot_lead_spawn =
- {
- local entity leader;
-
- leader = spawn();
- leader.classname = "leader";
- setorigin(leader,self.origin);
- if(ROAM_DEVEL==TRUE)
- setmodel(leader,"progs/s_bubble.spr");
- setsize(leader,'0 0 0','0 0 0');
- leader.movetype=MOVETYPE_NONE;
- leader.solid=SOLID_NOT;
- leader.owner=self;
- leader.nextthink=time+0.1;
- leader.think=bot_lead_think;
- leader.dest_time = time + BOT_LEAD_TIME;
- self.fl_lead = TRUE;
- self.lead = leader;
- if(ROAM_DEVEL==TRUE)
- bprint("Leader created...\n");
- };
-
- //============
- // bot_ai_roam
- //============
- void(float dist) bot_ai_roam =
- {
- // local float yaw;
-
- if (self.fl_lead == FALSE)
- {
- bot_lead_spawn();
- }
-
- movetogoal (dist);
- };
-