Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
rpn.qc
Go to the documentation of this file.
1#include "rpn.qh"
2
4
5
6// ========================================
7// RPN command code, written by divVerent
8// Last updated: December 28th, 2011
9// ========================================
10
11string rpn_pop()
12{
13 if(rpn_sp > 0) {
14 --rpn_sp;
15 return rpn_stack[rpn_sp];
16 } else {
17 LOG_INFO("rpn: stack underflow");
18 rpn_error = true;
19 return "";
20 }
21}
22void rpn_push(string s)
23{
24 if(rpn_sp < MAX_RPN_STACK) {
25 rpn_stack[rpn_sp] = s;
26 ++rpn_sp;
27 } else {
28 LOG_INFO("rpn: stack overflow");
29 rpn_error = true;
30 }
31}
32string rpn_get()
33{
34 if(rpn_sp > 0) {
35 return rpn_stack[rpn_sp - 1];
36 } else {
37 LOG_INFO("rpn: empty stack");
38 rpn_error = true;
39 return "";
40 }
41}
42void rpn_set(string s)
43{
44 if(rpn_sp > 0) {
45 rpn_stack[rpn_sp - 1] = s;
46 } else {
47 LOG_INFO("rpn: empty stack");
48 rpn_error = true;
49 }
50}
51
52float rpn_getf() { return stof(rpn_get()); }
53float rpn_popf() { return stof(rpn_pop()); }
54void rpn_pushf(float f) { return rpn_push(sprintf("%.9g", f)); }
55void rpn_setf(float f) { return rpn_set(sprintf("%.9g", f)); }
56
57SHUTDOWN(_rpndb)
58{
59 if(rpn_db)
61}
62
63void GenericCommand_rpn(int request, int argc, string command)
64{
65 switch(request)
66 {
68 {
69 float i, j, f, f2, f3, rpnpos;
70 //vector rgb;
71 string s, s2, rpncmd;
72
73 if(!rpn_db)
74 {
75 rpn_db = db_create();
76 db_put(rpn_db, "stack.pointer", "0");
77 db_put(rpn_db, "stack.pos", "-1");
78 }
79
80 if(argc >= 2)
81 {
82 rpn_sp = 0;
83 rpn_error = false;
84 for(rpnpos = 1; rpnpos < argc; ++rpnpos)
85 {
86 rpncmd = argv(rpnpos);
87 f = strlen(rpncmd);
88 if(rpncmd == "") {
89 } else if(stof(substring(rpncmd, 0, 1)) > 0) {
90 rpn_push(rpncmd);
91 } else if(substring(rpncmd, 0, 1) == "0") {
92 rpn_push(rpncmd);
93 } else if(f >= 2 && substring(rpncmd, 0, 1) == "+") {
94 rpn_push(rpncmd);
95 } else if(f >= 2 && substring(rpncmd, 0, 1) == "-") {
96 rpn_push(rpncmd);
97 } else if(f >= 2 && substring(rpncmd, 0, 1) == "/") {
98 rpn_push(substring(rpncmd, 1, strlen(rpncmd) - 1));
99 } else if(rpncmd == "clear") {
100 rpn_sp = 0;
101 } else if(rpncmd == "def" || rpncmd == "=") {
102 s = rpn_pop();
103 s2 = rpn_pop();
104
105 if(s2 != "")
106 {
107 #ifdef MENUQC
108 registercvar(s2, "", 0);
109 #else
110 registercvar(s2, "");
111 #endif
112 if(!rpn_error) // don't change cvars if a stack error had happened!
113 cvar_set(s2, s);
114 }
115 else
116 {
117 LOG_INFO("rpn: empty cvar name for 'def'");
118 rpn_error = true;
119 }
120 } else if(rpncmd == "defs" || rpncmd == "@") {
121 s = "";
122 i = rpn_popf();
123 j = (i == 0);
124 while(rpn_sp > 1 && (j || i > 0))
125 {
126 s = strcat("/", rpn_pop(), " ", s);
127 --i;
128 }
129 s2 = rpn_pop();
130 if(s2 != "")
131 {
132 #ifdef MENUQC
133 registercvar(s2, "", 0);
134 #else
135 registercvar(s2, "");
136 #endif
137 if(!rpn_error) // don't change cvars if a stack error had happened!
138 cvar_set(s2, s);
139 }
140 else
141 {
142 LOG_INFO("rpn: empty cvar name for 'defs'");
143 rpn_error = true;
144 }
145 } else if(rpncmd == "load") {
146 s = rpn_get();
147 if (s != "") {
149 } else {
150 LOG_INFO("rpn: empty cvar name for 'load'");
151 rpn_error = true;
152 }
153 } else if(rpncmd == "exch") {
154 s = rpn_pop();
155 s2 = rpn_get();
156 rpn_set(s);
157 rpn_push(s2);
158 } else if(rpncmd == "dup") {
159 rpn_push(rpn_get());
160 } else if(rpncmd == "pop") {
161 rpn_pop();
162 } else if(rpncmd == "add" || rpncmd == "+") {
163 f = rpn_popf();
164 rpn_setf(rpn_getf() + f);
165 } else if(rpncmd == "sub" || rpncmd == "-") {
166 f = rpn_popf();
167 rpn_setf(rpn_getf() - f);
168 } else if(rpncmd == "mul" || rpncmd == "*") {
169 f = rpn_popf();
170 rpn_setf(rpn_getf() * f);
171 } else if(rpncmd == "div" || rpncmd == "/") {
172 f = rpn_popf();
173 rpn_setf(rpn_getf() / f);
174 } else if(rpncmd == "mod" || rpncmd == "%") {
175 f = rpn_popf();
176 f2 = rpn_getf();
177 rpn_setf(f2 - f * floor(f2 / f));
178 } else if(rpncmd == "pow" || rpncmd == "**") {
179 f = rpn_popf();
180 rpn_setf(rpn_getf() ** f);
181 } else if(rpncmd == "bitand" || rpncmd == "&") {
182 f = rpn_popf();
183 rpn_setf(rpn_getf() & f);
184 } else if(rpncmd == "bitor" || rpncmd == "|") {
185 f = rpn_popf();
186 rpn_setf(rpn_getf() | f);
187 } else if(rpncmd == "bitxor" || rpncmd == "^") {
188 f = rpn_popf();
189 rpn_setf(rpn_getf() ^ f);
190 } else if(rpncmd == "and" || rpncmd == "&&") {
191 f = rpn_popf();
192 rpn_setf(rpn_getf() && f);
193 } else if(rpncmd == "or" || rpncmd == "||") {
194 f = rpn_popf();
195 rpn_setf(rpn_getf() || f);
196 } else if(rpncmd == "xor" || rpncmd == "^^") {
197 f = rpn_popf();
198 rpn_setf(!rpn_getf() != !f);
199 } else if(rpncmd == "bitnot") {
200 rpn_setf(~rpn_getf());
201 } else if(rpncmd == "not") {
202 rpn_setf(!rpn_getf());
203 } else if(rpncmd == "abs") {
205 } else if(rpncmd == "sgn") {
206 f = rpn_getf();
207 if(f < 0)
208 rpn_set("-1");
209 else if(f > 0)
210 rpn_set("1");
211 else
212 rpn_set("0");
213 } else if(rpncmd == "neg" || rpncmd == "~") {
214 rpn_setf(-rpn_getf());
215 } else if(rpncmd == "floor" || rpncmd == "f") {
217 } else if(rpncmd == "ceil" || rpncmd == "c") {
219 } else if(rpncmd == "exp") {
221 } else if(rpncmd == "log") {
223 } else if(rpncmd == "sin") {
225 } else if(rpncmd == "cos") {
227 } else if(rpncmd == "max") {
228 f = rpn_popf();
229 f2 = rpn_getf();
230 rpn_setf(max(f2, f));
231 } else if(rpncmd == "min") {
232 f = rpn_popf();
233 f2 = rpn_getf();
234 rpn_setf(min(f2, f));
235 } else if(rpncmd == "bound") {
236 f = rpn_popf();
237 f2 = rpn_popf();
238 f3 = rpn_getf();
239 rpn_setf(bound(f3, f2, f));
240 } else if(rpncmd == "when") {
241 f = rpn_popf();
242 s = rpn_pop();
243 s2 = rpn_get();
244 if(f)
245 rpn_set(s2);
246 else
247 rpn_set(s);
248 } else if(rpncmd == ">" || rpncmd == "gt") {
249 f = rpn_popf();
250 rpn_setf(rpn_getf() > f);
251 } else if(rpncmd == "<" || rpncmd == "lt") {
252 f = rpn_popf();
253 rpn_setf(rpn_getf() < f);
254 } else if(rpncmd == "==" || rpncmd == "eq") {
255 f = rpn_popf();
256 rpn_setf(rpn_getf() == f);
257 } else if(rpncmd == ">=" || rpncmd == "ge") {
258 f = rpn_popf();
259 rpn_setf(rpn_getf() >= f);
260 } else if(rpncmd == "<=" || rpncmd == "le") {
261 f = rpn_popf();
262 rpn_setf(rpn_getf() <= f);
263 } else if(rpncmd == "!=" || rpncmd == "ne") {
264 f = rpn_popf();
265 rpn_setf(rpn_getf() != f);
266 } else if(rpncmd == "rand") {
267 rpn_setf(ceil(random() * rpn_getf()) - 1);
268 } else if(rpncmd == "crc16") {
269 rpn_setf(crc16(false, rpn_get()));
270 } else if(rpncmd == "put") {
271 s2 = rpn_pop();
272 if (!rpn_error)
273 {
274 s = rpn_pop();
275 if (!rpn_error)
276 db_put(rpn_db, s, s2);
277 }
278 } else if(rpncmd == "get") {
279 s = rpn_pop();
280 if (!rpn_error)
282 } else if(rpncmd == "dbpush") {
283 s = rpn_pop();
284 if(!rpn_error)
285 {
286 i = stof(db_get(rpn_db, "stack.pointer"));
287 db_put(rpn_db, "stack.pointer", ftos(i+1));
288 db_put(rpn_db, strcat("stack.", ftos(i)), s);
289 if(!i)
290 db_put(rpn_db, "stack.pos", "0");
291 }
292 } else if(rpncmd == "dbpop") {
293 i = stof(db_get(rpn_db, "stack.pointer"));
294 if(i)
295 {
296 s = ftos(i-1);
297 db_put(rpn_db, "stack.pointer", s);
298 rpn_push(db_get(rpn_db, strcat("stack.", s)));
299 j = stof(db_get(rpn_db, "stack.pos"));
300 if(j >= i)
301 db_put(rpn_db, "stack.pos", ftos(i-2));
302 } else {
303 rpn_error = 1;
304 LOG_INFO("rpn: database underflow");
305 }
306 } else if(rpncmd == "dbget") {
307
308 i = stof(db_get(rpn_db, "stack.pointer"));
309 if(i)
310 {
311 rpn_push(db_get(rpn_db, strcat("stack.", ftos(i-1))));
312 } else {
313 rpn_error = 1;
314 LOG_INFO("rpn: database empty");
315 }
316 } else if(rpncmd == "dblen") {
317 rpn_push(db_get(rpn_db, "stack.pointer"));
318 } else if(rpncmd == "dbclr") {
320 rpn_db = db_create();
321 db_put(rpn_db, "stack.pointer", "0");
322 db_put(rpn_db, "stack.pos", "-1");
323 } else if(rpncmd == "dbsave") {
324 s = rpn_pop();
325 if(!rpn_error)
326 db_save(rpn_db, s);
327 } else if(rpncmd == "dbload") {
328 s = rpn_pop();
329 if(!rpn_error)
330 {
332 rpn_db = db_load(s);
333 }
334 } else if(rpncmd == "dbins") {
335 s = rpn_pop();
336 if(!rpn_error)
337 //if(rpn_sp > 0)
338 {
339 j = stof(db_get(rpn_db, "stack.pointer"));
340 i = stof(db_get(rpn_db, "stack.pos"));
341
342 if(i < 0)
343 {
344 i = 0;
345 db_put(rpn_db, "stack.pos", "0");
346 }
347
348 db_put(rpn_db, "stack.pointer", ftos(j+1));
349 for(--j; j >= i; --j)
350 {
351 db_put(rpn_db, strcat("stack.", ftos(j+1)),
352 db_get(rpn_db, (strcat("stack.", ftos(j))))
353 );
354 }
355 db_put(rpn_db, strcat("stack.", ftos(i)), s);
356 }
357 } else if(rpncmd == "dbext") {
358 j = stof(db_get(rpn_db, "stack.pointer"));
359 i = stof(db_get(rpn_db, "stack.pos"));
360 if(!j)
361 {
362 rpn_error = true;
363 LOG_INFO("rpn: empty database");
364 } else {
365 --j;
366 rpn_push(db_get(rpn_db, strcat("stack.", ftos(i))));
367 db_put(rpn_db, "stack.pointer", ftos(j));
368 if(i == j)
369 {
370 db_put(rpn_db, "stack.pos", ftos(j-1));
371 } else {
372 while(i < j)
373 {
374 db_put(rpn_db, strcat("stack.", ftos(i)),
375 db_get(rpn_db, (strcat("stack.", ftos(i+1))))
376 );
377 ++i;
378 }
379 }
380 }
381 } else if(rpncmd == "dbread") {
382 s = db_get(rpn_db, "stack.pos");
383 if(stof(s) >= 0)
384 {
385 rpn_push(db_get(rpn_db, strcat("stack.", s)));
386 } else {
387 rpn_error = 1;
388 LOG_INFO("rpn: empty database");
389 }
390 } else if(rpncmd == "dbat") {
391 rpn_push(db_get(rpn_db, "stack.pos"));
392 } else if(rpncmd == "dbmov") {
393 j = stof(db_get(rpn_db, "stack.pointer"));
394 i = stof(db_get(rpn_db, "stack.pos"));
395 i += rpn_popf();
396 if(!rpn_error)
397 {
398 if(i < 0 || i >= j)
399 {
400 LOG_INFO("rpn: database cursor out of bounds");
401 rpn_error = true;
402 }
403 if(!rpn_error)
404 {
405 db_put(rpn_db, "stack.pos", ftos(i));
406 }
407 }
408 } else if(rpncmd == "dbgoto") {
409 s = rpn_pop();
410 j = stof(db_get(rpn_db, "stack.pointer"));
411 if(!j)
412 {
413 rpn_error = true;
414 LOG_INFO("rpn: empty database, cannot move cursor");
415 }
416 if(!rpn_error)
417 {
418 if(s == "end")
419 i = stof(db_get(rpn_db, "stack.pointer"))-1;
420 else if(s == "beg")
421 i = 0;
422 else
423 i = stof(s);
424
425 j = stof(db_get(rpn_db, "stack.pointer"));
426 if(i < 0 || i >= j)
427 {
428 LOG_INFO("rpn: database cursor destination out of bounds");
429 rpn_error = true;
430 }
431 if(!rpn_error)
432 {
433 db_put(rpn_db, "stack.pos", ftos(i));
434 }
435 }
436 } else if(rpncmd == "union") {
437 // s s2 union
438 s2 = rpn_pop();
439 s = rpn_get();
440 f = tokenize_console(s);
441 f2 = tokenize_console(strcat(s, " ", s2));
442 // tokens 0..(f-1) represent s
443 // tokens f..f2 represent s2
444 // UNION: add all tokens to s that are in s2 but not in s
445 s = "";
446 for(i = 0; i < f; ++i)
447 s = strcat(s, " ", argv(i));
448 for(i = f; i < f2; ++i) {
449 for(j = 0; j < f; ++j)
450 if(argv(i) == argv(j))
451 goto skip_union;
452 s = strcat(s, " ", argv(i));
453LABEL(skip_union)
454 }
455 if(substring(s, 0, 1) == " ")
456 s = substring(s, 1, 99999);
457 rpn_set(s);
458 tokenize_console(command);
459 } else if(rpncmd == "intersection") {
460 // s s2 intersection
461 s2 = rpn_pop();
462 s = rpn_get();
463 f = tokenize_console(s);
464 f2 = tokenize_console(strcat(s, " ", s2));
465 // tokens 0..(f-1) represent s
466 // tokens f..f2 represent s2
467 // INTERSECTION: keep only the tokens from s that are also in s2
468 s = "";
469 for(i = 0; i < f; ++i) {
470 for(j = f; j < f2; ++j)
471 if(argv(i) == argv(j))
472 {
473 s = strcat(s, " ", argv(i));
474 break;
475 }
476 }
477 if(substring(s, 0, 1) == " ")
478 s = substring(s, 1, 99999);
479 rpn_set(s);
480 tokenize_console(command);
481 } else if(rpncmd == "difference") {
482 // s s2 difference
483 s2 = rpn_pop();
484 s = rpn_get();
485 f = tokenize_console(s);
486 f2 = tokenize_console(strcat(s, " ", s2));
487 // tokens 0..(f-1) represent s
488 // tokens f..f2 represent s2
489 // DIFFERENCE: keep only the tokens from s that are not in s2
490 s = "";
491 for(i = 0; i < f; ++i) {
492 for(j = f; j < f2; ++j)
493 if(argv(i) == argv(j))
494 goto skip_difference;
495 s = strcat(s, " ", argv(i));
496LABEL(skip_difference)
497 }
498 if(substring(s, 0, 1) == " ")
499 s = substring(s, 1, 99999);
500 rpn_set(s);
501 tokenize_console(command);
502 } else if(rpncmd == "shuffle") {
503 // s shuffle
504 s = rpn_get();
505 f = tokenize_console(s);
506
507 for(i = 0; i < f - 1; ++i) {
508 // move a random item from i..f-1 to position i
509 s = "";
510 f2 = floor(random() * (f - i) + i);
511 for(j = 0; j < i; ++j)
512 s = strcat(s, " ", argv(j));
513 s = strcat(s, " ", argv(f2));
514 for(j = i; j < f; ++j)
515 if(j != f2)
516 s = strcat(s, " ", argv(j));
517 f = tokenize_console(s);
518 }
519
520 if(substring(s, 0, 1) == " ")
521 s = substring(s, 1, 99999);
522 rpn_set(s);
523 tokenize_console(command);
524 } else if(rpncmd == "fexists_assert") {
525 s = rpn_pop();
526 if(!rpn_error)
527 {
528 if (!fexists(s))
529 {
530 LOG_INFO("rpn: ERROR: ", s, " does not exist!");
531 rpn_error = true;
532 }
533 }
534 } else if(rpncmd == "fexists") {
535 s = rpn_get();
536 if(!rpn_error)
537 {
538 if (fexists(s))
539 rpn_setf(1);
540 else
541 rpn_setf(0);
542 }
543 } else if(rpncmd == "localtime") {
544 rpn_set(strftime(true, rpn_get()));
545 } else if(rpncmd == "gmtime") {
546 rpn_set(strftime(false, rpn_get()));
547 } else if(rpncmd == "time") {
549 } else if(rpncmd == "digest") {
550 s = rpn_pop();
551 rpn_set(digest_hex(s, rpn_get()));
552 } else if(rpncmd == "sprintf1s") {
553 s = rpn_pop();
554 rpn_set(sprintf(s, rpn_get()));
555 } else if(rpncmd == "eval") {
556 s = rpn_pop();
557 command = strcat(s, substring(command, argv_end_index(rpnpos), -1));
558 argc = tokenize_console(command);
559 rpnpos = -1;
560 } else {
561 rpn_push(cvar_string(rpncmd));
562 }
563 if(rpn_error)
564 break;
565 }
566 while(rpn_sp > 0)
567 {
568 s = rpn_pop();
569 LOG_INFO("rpn: still on stack: ", s);
570 }
571 }
572
573 return;
574 }
575
576 default:
578 {
579 LOG_HELP("Usage:^3 ", GetProgramCommandPrefix(), " rpn <expression>");
580 LOG_HELP(" ^2Operations:");
581 LOG_HELP(" x pop -----------------------------> : removes the top");
582 LOG_HELP(" x dup -----------------------------> x x : duplicates the top");
583 LOG_HELP(" x x exch --------------------------> x x : swap the top two");
584 LOG_HELP(" /cvarname load --------------------> x : loads a cvar");
585 LOG_HELP(" /cvarname x def -------------------> : writes to a cvar");
586 LOG_HELP(" f f add|sub|mul|div|mod|pow -------> f : adds/... two numbers");
587 LOG_HELP(" f f and|or|xor|bitand|bitor|bitxor > f : logical and bitwise operations");
588 LOG_HELP(" f f eq|ne|gt|ge|lt|le|max|min -----> f : compares two numbers");
589 LOG_HELP(" f neg|abs|sgn|rand|floor|ceil------> f : negates/... a number");
590 LOG_HELP(" f not|bitnot ----------------------> f : logical and bitwise negation");
591 LOG_HELP(" f exp|log|sin|cos -----------------> f : exponential function & Co.");
592 LOG_HELP(" f f f bound -----------------------> f : bounds the middle number");
593 LOG_HELP(" f1 f2 b when ----------------------> f : f1 if b, f2 otherwise");
594 LOG_HELP(" s s union|intersection|difference -> s : set operations");
595 LOG_HELP(" s shuffle -------------------------> s : randomly arrange elements");
596 LOG_HELP(" /key /value put -------------------> : set a database key");
597 LOG_HELP(" /key get --------------------------> x : get a database value");
598 LOG_HELP(" x dbpush --------------------------> : pushes the top onto the database");
599 LOG_HELP(" dbpop|dbget -----------------------> x : removes/reads DB's top");
600 LOG_HELP(" dblen|dbat ------------------------> f : gets the DB's size/cursor pos");
601 LOG_HELP(" dbclr -----------------------------> : clear the DB");
602 LOG_HELP(" x dbsave|dbload--------------------> : save/load the DB to/from a file");
603 LOG_HELP(" x dbins ---------------------------> : moves the top into the DB");
604 LOG_HELP(" dbext|dbread ----------------------> x : extract/get from the DB's cursor");
605 LOG_HELP(" f dbmov|dbgoto --------------------> : move or set the DB's cursor");
606 LOG_HELP(" x localtime -----------------------> x : formats the current local time");
607 LOG_HELP(" x gmtime --------------------------> x : formats the current UTC time");
608 LOG_HELP(" time ------------------------------> f : seconds since VM start");
609 LOG_HELP(" x /MD4 digest ---------------------> x : MD4 digest");
610 LOG_HELP(" x /SHA256 digest ------------------> x : SHA256 digest");
611 LOG_HELP(" x /formatstring sprintf1s ---------> x : sprintf with 1 string (pad, cut)");
612 LOG_HELP(" x fexists -------------------------> f : checks if a file exists");
613 LOG_HELP(" x eval ----------------------------> : does something eval");
614 LOG_HELP("");
615 LOG_HELP(" ^2Notes:");
616 LOG_HELP(" f: float");
617 LOG_HELP(" x: string defined like this: /abc or \"/abc def\"");
618 LOG_HELP(" s: string defined like x and containing a set of space-separated strings");
619 LOG_HELP(" Unknown tokens insert their cvar value.");
620 return;
621 }
622 }
623}
const int CMD_REQUEST_COMMAND
Definition command.qh:3
const int CMD_REQUEST_USAGE
Definition command.qh:4
#define LABEL(id)
Definition compiler.qh:34
float time
float log(float f)
#define argv_end_index
#define strlen
#define tokenize_console
ERASEABLE bool fexists(string f)
Definition file.qh:4
#define GetProgramCommandPrefix()
Definition generic.qh:25
#define LOG_HELP(...)
Definition log.qh:83
#define LOG_INFO(...)
Definition log.qh:62
ERASEABLE void db_close(int db)
Definition map.qh:86
ERASEABLE int db_load(string filename)
Definition map.qh:35
ERASEABLE int db_create()
Definition map.qh:25
ERASEABLE void db_save(int db, string filename)
Definition map.qh:8
ERASEABLE string db_get(int db, string key)
Definition map.qh:93
ERASEABLE void db_put(int db, string key, string value)
Definition map.qh:103
float exp(float e)
Definition mathlib.qc:70
float registercvar(string name, string value, float flags)
void cvar_set(string name, string value)
float ceil(float f)
float stof(string val,...)
float bound(float min, float value, float max)
string substring(string s, float start, float length)
float cos(float f)
float random(void)
const string cvar_string(string name)
float sin(float f)
float min(float f,...)
string ftos(float f)
float fabs(float f)
float floor(float f)
string argv(float n)
float max(float f,...)
spree_inf s1 s2 s3loc s2 spree_inf s1 s2 s3loc s2 spree_inf s1 s2 s3loc s2 s1 s2loc s1 s2loc s1 s2loc s1 s2loc s1 s2loc s1 s2loc s1 s2 f1points f2
Definition all.inc:369
spree_inf s1 s2 s3loc s2 spree_inf s1 s2 s3loc s2 spree_inf s1 s2 s3loc s2 s1 s2loc s1 s2loc s1 s2loc s1 s2loc s1 s2loc s1 s2loc s1 s2 f1points s1 s2
Definition all.inc:474
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
void GenericCommand_rpn(int request, int argc, string command)
Definition rpn.qc:63
float rpn_popf()
Definition rpn.qc:53
void rpn_set(string s)
Definition rpn.qc:42
string rpn_get()
Definition rpn.qc:32
void rpn_setf(float f)
Definition rpn.qc:55
void rpn_pushf(float f)
Definition rpn.qc:54
void rpn_push(string s)
Definition rpn.qc:22
string rpn_pop()
Definition rpn.qc:11
float rpn_getf()
Definition rpn.qc:52
int rpn_sp
Definition rpn.qh:11
int rpn_error
Definition rpn.qh:10
int rpn_db
Definition rpn.qh:9
string rpn_stack[MAX_RPN_STACK]
Definition rpn.qh:12
const int MAX_RPN_STACK
Definition rpn.qh:8
#define SHUTDOWN(func)
before shutdown
Definition static.qh:50