]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/gamec/bots.c
i hope buttons can now be triggered by touch. i have no way to test that though...
[divverent/nexuiz.git] / data / qcsrc / server / gamec / bots.c
1 float BOT_TYPE_AUTOURRE = 0;
2 float BOT_TYPE_AUTOMAUVE = 1;
3 float BOT_TYPE_URREBOT = 2;
4 float BOT_TYPE_MAUVEBOT = 3;
5 .float bot_type;
6 float bot_number;
7
8 /*
9 MauveBot v1.0 for Nexuiz
10 */
11
12 float intermission_running;
13
14 .float skill_level;
15
16 .float ai_time;
17 .float threat;
18 .entity dodgeent;
19
20 float THREAT_UNFLAGGED = 0;
21 float THREAT_IGNORE = -1;
22
23 float DODGE_DIST = 500;
24 float SEARCH_DIST = 1000;
25
26 .float search_time;
27
28 float mauvebots;
29
30 entity(float bottype) add_MauveBot;
31 void() remove_MauveBot;
32
33 /*
34 UrreBot 1.5 for Nexuiz
35 */
36
37 entity navnode_chain, urrebot_chain;
38 float navnodes, loadstep;
39 .entity list, link0, link1, link2, link3, link4, link5, link6, link7, link8, link9;
40 .entity link10, link11, link12, link13, link14, link15, link16, link17, link18, link19;
41 .float sflags;
42 .float lflags0, lflags1, lflags2, lflags3, lflags4, lflags5, lflags6, lflags7, lflags8, lflags9;
43 .float lflags10, lflags11, lflags12, lflags13, lflags14, lflags15, lflags16, lflags17, lflags18, lflags19;
44 .vector pointl;
45 .float costl;
46 .float lmark;
47 float search_distance;
48 float minisearch_distance;
49 float stratsearch_distance;
50 .entity goalcurrent;
51 .entity goallist;
52 .float strat_me;
53 .float(entity c_item) evalfunc;
54
55 vector nullvector;
56 .vector movepoint;
57 .float camptime;
58 .vector campcheck;
59
60 //.vector aimpoint;
61 .float aimtime;
62 .float aimfire;
63 //.float aimblocked; // LordHavoc: prevents firing at a stale aimpoint
64 .float enemytimeout;
65 //.float evaltime;
66 .float lead;
67
68 float skill;
69
70 float S_TELEPORT = 1;
71 float S_DOOR = 2;
72 float S_TOUCH = 4;
73
74 float LF_NOLINK = 1;
75 float LF_NOWALK = 2;
76 float LF_BAD = 4;
77 float LF_BIGDROP = 8;
78 float LF_REMOTE = 16;
79
80 .entity optp_chain;
81
82 .entity plane_chain;
83
84 float urrebots, urrebots_strategytime, urrebots_combattime, urrebots_navopt;
85
86 entity strategytoken;
87 float strategytime;
88 .float combattime;
89
90 entity(vector org, vector minss, vector maxss) FindCurrentNavNode;
91 void(float distance) UrreBotPath;
92 void() UrreBotSetup;
93 void() UrreBotThink;
94 void() LoadNavNodes;
95 void() LinkNavNodes;
96 void() ItemEvals;
97 void() OptimiseNavigation;
98 entity(float bottype) UrreBotAdd;
99 void() UrreBotRemove;
100 vector(vector point, entity current_space, entity goal_space) ClampPointToSpace;
101
102 float(vector m1, vector m2, vector m3, vector m4) boxesoverlap = {return m2_x >= m3_x && m1_x <= m4_x && m2_y >= m3_y && m1_y <= m4_y && m2_z >= m3_z && m1_z <= m4_z;};
103 float(vector smins, vector smaxs, vector bmins, vector bmaxs) boxenclosed = {return smins_x >= bmins_x && smaxs_x <= bmaxs_x && smins_y >= bmins_y && smaxs_y <= bmaxs_y && smins_z >= bmins_z && smaxs_z <= bmaxs_z;};
104
105 entity newmis;
106 void() SUB_Remove;
107 float JoinBestTeam(entity pl, float only_return_best);
108 float sv_maxspeed;
109
110 void() AutoBotRemove =
111 {
112         local entity ent, t;
113
114         ent = findchain(classname, "player");
115         while (ent)
116         {
117                 if (clienttype(ent) == CLIENTTYPE_BOT)
118                 {
119                         if (ent.bot_type != BOT_TYPE_URREBOT && ent.bot_type != BOT_TYPE_MAUVEBOT)
120                         {
121                                 if (self.list)
122                                 {
123                                         if (urrebot_chain == self)
124                                                 urrebot_chain = self.list;
125                                         else
126                                         {
127                                                 t = find(world, classname, "player");
128                                                 while(t)
129                                                 {
130                                                         if (t.list == ent)
131                                                                 t.list = ent.list;
132                                                         t = find(t, classname, "player");
133                                                 }
134                                         }
135                                 }
136                                 if (bot_number > 0)
137                                         bot_number -= 1;
138                                 self = ent;
139                                 ClientDisconnect();
140                                 dropclient(ent);
141                         }
142                 }
143                 ent = ent.chain;
144         }
145 };
146
147 void() Bots_Shared =
148 {
149         local entity bot;
150         local float f;
151
152         if (time >= 3)
153         {
154                 // UrreBots
155                 urrebots_strategytime = cvar("urrebots_strategytime");
156                 urrebots_combattime = cvar("urrebots_combattime");
157                 stratsearch_distance = cvar("urrebots_stratsearch_dist");
158                 minisearch_distance = cvar("urrebots_minisearch_dist");
159                 if (cvar("urrebots") || cvar("bot_number"))
160                 {
161                         if (loadstep == 0)
162                         {
163                                 LoadNavNodes();
164                                 loadstep = 1;
165                                 return;
166                         }
167                         else if (loadstep == 1)
168                         {
169                                 LinkNavNodes();
170                                 loadstep = 2;
171                                 return;
172                         }
173                         else if (loadstep == 2)
174                         {
175                                 if (navnodes)
176                                 if (urrebots_navopt)
177                                         OptimiseNavigation();
178                                 loadstep = 3;
179                                 return;
180                         }
181                         else if (loadstep == 3)
182                         {
183                                 if (navnodes)
184                                         ItemEvals();
185                                 loadstep = 4;
186                                 return;
187                         }
188                 }
189                 f = cvar("urrebots");
190                 if (urrebots < f && loadstep == 4)
191                 {
192                         bot = UrreBotAdd(BOT_TYPE_URREBOT);
193                         bot.bot_type = BOT_TYPE_URREBOT;
194                         urrebots += 1;
195                 }
196                 if (urrebots > f)
197                         UrreBotRemove();
198
199                 // MauveBots
200                 f = cvar("mauvebots");
201                 if (f > mauvebots)
202                 {
203                         bot = add_MauveBot(BOT_TYPE_MAUVEBOT);
204                         bot.bot_type = BOT_TYPE_MAUVEBOT;
205                         mauvebots += 1;
206                 }
207                 else if (f < mauvebots)
208                         remove_MauveBot();
209
210                 // AutoBots
211                 f = cvar("bot_number");
212                 if (f > bot_number)
213                 {
214                         bot = world;
215                         if (navnodes && loadstep == 4)
216                         {
217                                 bot = UrreBotAdd(BOT_TYPE_AUTOURRE);
218                                 if (bot)
219                                 {
220                                         bot.bot_type = BOT_TYPE_AUTOURRE;
221                                         bot_number += 1;
222                                 }
223                         }
224                         else
225                         {
226                                 bot = add_MauveBot(BOT_TYPE_AUTOMAUVE);
227                                 if (bot)
228                                 {
229                                         bot.bot_type = BOT_TYPE_AUTOMAUVE;
230                                         bot_number += 1;
231                                 }
232                         }
233                 }
234                 else if (f < bot_number)
235                         AutoBotRemove();
236         }
237         else
238         {
239                 AutoBotRemove();
240                 remove_MauveBot();
241                 UrreBotRemove();
242         }
243 };