]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/verbstack.qc
more consistency regarding fuel
[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 teh 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)\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             = self;\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 /**\r
112     Find the best verb in this stack and return it.\r
113     ALso remove any verbs returning VS_CALL_REMOVE on VCM_EVAL.\r
114 **/\r
115 entity verbstack_pull(entity stack)\r
116 {\r
117     entity vrb;\r
118     entity bestverb, oldself;\r
119     float  value, bestvalue;\r
120 \r
121     oldself = self;\r
122 \r
123     vrb = findchainentity(verbstack,stack);\r
124     while(vrb)\r
125     {\r
126         self = vrb.owner;\r
127 \r
128         verb  = vrb;\r
129         vrb   = vrb.chain;\r
130         value = verb.verb_call(VCM_EVAL);\r
131 \r
132         if(value > 0)\r
133         {\r
134             if(value == VS_CALL_REMOVE)\r
135                 remove(verb);\r
136         }\r
137         else\r
138         {\r
139             if(value > bestvalue)\r
140             {\r
141                 bestverb = verb;\r
142                 bestvalue = value;\r
143             }\r
144         }\r
145     }\r
146 \r
147     self = oldself;\r
148 \r
149     return bestverb;\r
150 }\r
151 \r
152 /**\r
153     Delete every verb on this stack, signaling them with VCM_REMOVE first.\r
154 **/\r
155 void verbstack_flush(entity stack)\r
156 {\r
157     entity vrb, oldself;\r
158 \r
159     oldself = self;\r
160 \r
161     vrb = findchainentity(verbstack,stack);\r
162     while(vrb)\r
163     {\r
164         self = vrb.owner;\r
165 \r
166         verb = vrb;\r
167         vrb  = vrb.chain;\r
168         verb.verb_call(VCM_REMOVE);\r
169         remove(verb);\r
170     }\r
171 \r
172     self = oldself;\r
173 }\r