]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/gamec/urrebot_nn_search.c
As usual I can't test my changes, and seeing as this is a fairly major change, I...
[divverent/nexuiz.git] / data / qcsrc / server / gamec / urrebot_nn_search.c
1 /* --- CheckNavNode ---\r
2 Evaluates travel cost and wether to continue search or not in this direction*/\r
3 \r
4 float(entity from, entity to, float lflag) CheckNavNode =\r
5 {\r
6         local float addcost;\r
7         local vector foundpoint;\r
8         local entity optpoint;\r
9 \r
10         if (!to)\r
11                 return FALSE;\r
12 \r
13         if (!(lflag & LF_NOWALK))\r
14         if (!(lflag & LF_NOLINK))\r
15         {\r
16                 if (from.sflags & S_TELEPORT) // teleporter exception\r
17                         foundpoint = from.origin;\r
18                 else\r
19                 {\r
20                         optpoint = MatchOptPoint(from, from.goallist, to);\r
21                         if (optpoint)\r
22                                 foundpoint = optpoint.origin;\r
23                         else\r
24                         {\r
25                                 bprint("boo hoo!\n");\r
26                                 foundpoint = ClampPointToSpace(from.pointl, from, to);\r
27                         }\r
28                 }\r
29                 addcost = vlen(from.pointl - foundpoint);\r
30                 addcost = addcost + from.costl;\r
31                 if (addcost <= search_distance)\r
32                 if (to.costl > addcost)\r
33                 {\r
34                         to.lmark = TRUE;\r
35                         to.goallist = from;\r
36                         to.costl = addcost;\r
37                         to.pointl = foundpoint;\r
38                 }\r
39         }\r
40         return TRUE;\r
41 };\r
42 \r
43 /* --- MarkRoute ---\r
44 Searches as far as possible, and gives all navnodes a travel cost and shortest\r
45 travel point, which is then used for goal evaluation\r
46 \r
47 Starts by clearing all navnodes, and searches breadth first from the starting navnode*/\r
48 \r
49 void(float sdist) MarkRoute =\r
50 {\r
51         local entity t, start;\r
52         local float searching;\r
53 \r
54         start = FindCurrentNavNode(self.origin, self.mins, self.maxs);\r
55 \r
56         if(!start)\r
57                 return;\r
58 \r
59         search_distance = sdist;\r
60 \r
61         t = navnode_chain;\r
62         while (t)\r
63         {\r
64                 t.goallist = world;\r
65                 t.lmark = FALSE;\r
66                 t.costl = 10000000;\r
67                 t.pointl = '0 0 0';\r
68                 t = t.list;\r
69         }\r
70 \r
71         start.lmark = TRUE;\r
72         start.costl = 0;\r
73         start.pointl = self.origin;\r
74 \r
75         searching = TRUE;\r
76         while(searching)\r
77         {\r
78                 searching = FALSE;\r
79                 t = navnode_chain;\r
80                 while(t)\r
81                 {\r
82                         if(t.lmark)\r
83                         {\r
84                                 searching = TRUE;\r
85                                 t.lmark = FALSE;\r
86                                 if (CheckNavNode(t, t.link0, t.lflags0))\r
87                                 if (CheckNavNode(t, t.link1, t.lflags1))\r
88                                 if (CheckNavNode(t, t.link2, t.lflags2))\r
89                                 if (CheckNavNode(t, t.link3, t.lflags3))\r
90                                 if (CheckNavNode(t, t.link4, t.lflags4))\r
91                                 if (CheckNavNode(t, t.link5, t.lflags5))\r
92                                 if (CheckNavNode(t, t.link6, t.lflags6))\r
93                                 if (CheckNavNode(t, t.link7, t.lflags7))\r
94                                 if (CheckNavNode(t, t.link8, t.lflags8))\r
95                                 if (CheckNavNode(t, t.link9, t.lflags9))\r
96                                 if (CheckNavNode(t, t.link10, t.lflags10))\r
97                                 if (CheckNavNode(t, t.link11, t.lflags11))\r
98                                 if (CheckNavNode(t, t.link12, t.lflags12))\r
99                                 if (CheckNavNode(t, t.link13, t.lflags13))\r
100                                 if (CheckNavNode(t, t.link14, t.lflags14))\r
101                                 if (CheckNavNode(t, t.link15, t.lflags15))\r
102                                 if (CheckNavNode(t, t.link16, t.lflags16))\r
103                                 if (CheckNavNode(t, t.link17, t.lflags17))\r
104                                 if (CheckNavNode(t, t.link18, t.lflags18))\r
105                                 CheckNavNode(t, t.link19, t.lflags19);\r
106                         }\r
107                         t = t.list;\r
108                 }\r
109         }\r
110 };