]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/verbstack.qc
pathlib changed to use with AStar.
[divverent/nexuiz.git] / data / qcsrc / server / verbstack.qc
1 entity verb;\r
2 .entity verbs_idle;\r
3 .entity verbs_attack;\r
4 .entity verbs_move;\r
5 \r
6 .float(float eval) verb_call;\r
7 .entity  verbstack;\r
8 .float verb_static_value;\r
9 \r
10 #define VS_CALL_NO        0\r
11 #define VS_CALL_YES_DOING -1\r
12 #define VS_CALL_YES_DONE  -2\r
13 #define VS_CALL_REMOVE    -3\r
14 \r
15 entity verbstack_push(entity stack, float(float eval) vrb_call, float val_static, float vrb_life)\r
16 {\r
17     entity vrb;\r
18 \r
19     vrb                   = spawn();\r
20     vrb.owner             = self;\r
21     vrb.verbstack         = stack;\r
22     vrb.verb_call         = vrb_call;\r
23     vrb.verb_static_value = val_static;\r
24 \r
25     if(vrb_life)\r
26     {\r
27         vrb.think     = SUB_Remove;\r
28         vrb.nextthink = time + vrb_life;\r
29     }\r
30 \r
31     return vrb;\r
32 }\r
33 \r
34 float verbstack_pop(entity stack)\r
35 {\r
36     entity vrb;\r
37     entity bestverb,oldself;\r
38     float value,bestvalue;\r
39 \r
40     oldself = self;\r
41 \r
42     vrb = findchainentity(verbstack,stack);\r
43     while(vrb)\r
44     {\r
45         verb = vrb;\r
46         self = vrb.owner;\r
47         value = vrb.verb_call(TRUE);\r
48         if(value < 0)\r
49         {\r
50             if(value == VS_CALL_REMOVE)\r
51                 remove(vrb);\r
52         }\r
53         else\r
54         {\r
55             if(value > bestvalue)\r
56             {\r
57                 bestverb = vrb;\r
58                 bestvalue = value;\r
59             }\r
60         }\r
61         vrb = vrb.chain;\r
62     }\r
63 \r
64     if(bestverb)\r
65     {\r
66         verb = bestverb;\r
67         self = verb.owner;\r
68         value = bestverb.verb_call(FALSE);\r
69             if(value == VS_CALL_REMOVE)\r
70                 remove(bestverb);\r
71     }\r
72 \r
73     self = oldself;\r
74 \r
75     return value;\r
76 }\r
77 \r
78 entity verbstack_pull(entity stack)\r
79 {\r
80     entity vrb;\r
81     entity bestverb,oldself;\r
82     float value,bestvalue;\r
83 \r
84     oldself = self;\r
85 \r
86     vrb = findchainentity(verbstack,stack);\r
87     while(vrb)\r
88     {\r
89         self = vrb.owner;\r
90         verb = vrb;\r
91         value = vrb.verb_call(TRUE);\r
92         if(value > 0)\r
93         {\r
94             if(value == VS_CALL_REMOVE)\r
95                 remove(vrb);\r
96         }\r
97         else\r
98         {\r
99             if(value > bestvalue)\r
100             {\r
101                 bestverb = vrb;\r
102                 bestvalue = value;\r
103             }\r
104         }\r
105         vrb =vrb.chain;\r
106     }\r
107 \r
108     self = oldself;\r
109 \r
110     return bestverb;\r
111 }\r