]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/verbstack.qc
healthbars for sprites (currently unused)
[divverent/nexuiz.git] / data / qcsrc / server / verbstack.qc
1 /// Some default stacks.\r
2 .entity verbs_idle;\r
3 .entity verbs_attack;\r
4 .entity verbs_move;\r
5 \r
6 /// This global gets set to the verb in question each time the stack manager calls verb_call\r
7 entity verb;\r
8 \r
9 /// Execure this verb\r
10 #define VCM_DO     0\r
11 /// Return the value of this verb. Return VS_CALL_REMOVE to delete it.\r
12 #define VCM_EVAL   1\r
13 /// This verb is beeing removed NOW (not sent when verb_call returns VS_CALL_REMOVE)\r
14 #define VCM_REMOVE 2\r
15 \r
16 /// Verb callback\r
17 .float(float message) verb_call;\r
18 \r
19 /// Points to this verb's stack.\r
20 .entity  verbstack;\r
21 \r
22 /// Static value of this verb\r
23 .float verb_static_value;\r
24 \r
25 /// verb_call returns this when a verb in not doable\r
26 #define VS_CALL_NO        0\r
27 /// verb_call(VCM_DO) returns this when a verb is executing\r
28 #define VS_CALL_YES_DOING -1\r
29 /// verb_call(VCM_DO) returns this when a verb did execure and is done\r
30 #define VS_CALL_YES_DONE  -2\r
31 /// verb_call(VCM_DO) returns this when a verb should be deleted by the stack manager\r
32 #define VS_CALL_REMOVE    -3\r
33 \r
34 /**\r
35     Push a new verb onto the specified stack. Set vrb_life to make it time-limited.\r
36 **/\r
37 entity verbstack_push(entity stack, float(float eval) vrb_call, float val_static, float vrb_life,entity verb_owner)\r
38 {\r
39     entity vrb;\r
40 \r
41     if not(stack)\r
42         return world;\r
43 \r
44     if not(vrb_call)\r
45         return world;\r
46 \r
47     vrb                   = spawn();\r
48     vrb.owner             = verb_owner;\r
49     vrb.verbstack         = stack;\r
50     vrb.verb_call         = vrb_call;\r
51     vrb.verb_static_value = val_static;\r
52 \r
53     if(vrb_life)\r
54     {\r
55         vrb.think     = SUB_Remove;\r
56         vrb.nextthink = time + vrb_life;\r
57     }\r
58 \r
59     return vrb;\r
60 }\r
61 \r
62 /**\r
63     Find the best verb in this stack and execurte it.\r
64     ALso remove any verbs returning VS_CALL_REMOVE on VCM_EVAL or VCM_DO\r
65 **/\r
66 float verbstack_pop(entity stack)\r
67 {\r
68     entity vrb, bestverb, oldself;\r
69     float  value, bestvalue;\r
70 \r
71     oldself = self;\r
72 \r
73     vrb = findchainentity(verbstack,stack);\r
74     while(vrb)\r
75     {\r
76         verb  = vrb;\r
77         vrb   = vrb.chain;\r
78         self  = verb.owner;\r
79         value = verb.verb_call(VCM_EVAL);\r
80 \r
81         if(value < 0)\r
82         {\r
83             if(value == VS_CALL_REMOVE)\r
84                 remove(verb);\r
85         }\r
86         else\r
87         {\r
88             if(value > bestvalue)\r
89             {\r
90                 bestverb  = verb;\r
91                 bestvalue = value;\r
92             }\r
93         }\r
94     }\r
95 \r
96     if(bestverb)\r
97     {\r
98         verb  = bestverb;\r
99         self  = verb.owner;\r
100         value = verb.verb_call(VCM_DO);\r
101 \r
102         if(value == VS_CALL_REMOVE)\r
103             remove(bestverb);\r
104     }\r
105 \r
106     self = oldself;\r
107 \r
108     return value;\r
109 }\r
110 \r
111 float verbstack_popfifo(entity stack)\r
112 {\r
113     entity oldself;\r
114     float ret;\r
115 \r
116     oldself = self;\r
117     verb = findentity(stack,verbstack,stack);\r
118     if not (verb)\r
119         ret = 0;\r
120     else\r
121     {\r
122         self = verb.owner;\r
123         ret = verb.verb_call(VCM_DO);\r
124 \r
125         if(ret == VS_CALL_REMOVE)\r
126             remove(verb);\r
127     }\r
128 \r
129     self = oldself;\r
130     return ret;\r
131 }\r
132 \r
133 /**\r
134     Find the best verb in this stack and return it.\r
135     ALso remove any verbs returning VS_CALL_REMOVE on VCM_EVAL.\r
136 **/\r
137 entity verbstack_pull(entity stack)\r
138 {\r
139     entity vrb;\r
140     entity bestverb, oldself;\r
141     float  value, bestvalue;\r
142 \r
143     oldself = self;\r
144 \r
145     vrb = findchainentity(verbstack,stack);\r
146     while(vrb)\r
147     {\r
148         self = vrb.owner;\r
149 \r
150         verb  = vrb;\r
151         vrb   = vrb.chain;\r
152         value = verb.verb_call(VCM_EVAL);\r
153 \r
154         if(value > 0)\r
155         {\r
156             if(value == VS_CALL_REMOVE)\r
157                 remove(verb);\r
158         }\r
159         else\r
160         {\r
161             if(value > bestvalue)\r
162             {\r
163                 bestverb = verb;\r
164                 bestvalue = value;\r
165             }\r
166         }\r
167     }\r
168 \r
169     self = oldself;\r
170 \r
171     return bestverb;\r
172 }\r
173 \r
174 entity verbstack_pullfifo(entity stack)\r
175 {\r
176     return findentity(stack,verbstack,stack);\r
177 }\r
178 \r
179 /**\r
180     Delete every verb on this stack, signaling them with VCM_REMOVE first.\r
181 **/\r
182 void verbstack_flush(entity stack)\r
183 {\r
184     entity vrb, oldself;\r
185 \r
186     oldself = self;\r
187 \r
188     vrb = findchainentity(verbstack,stack);\r
189     while(vrb)\r
190     {\r
191         self = vrb.owner;\r
192 \r
193         verb = vrb;\r
194         vrb  = vrb.chain;\r
195         verb.verb_call(VCM_REMOVE);\r
196         remove(verb);\r
197     }\r
198 \r
199     self = oldself;\r
200 }\r