vrheights

annotate src/game_var.cc @ 7:0eca023ed909

- fixed the hmd-tracking / mouselook interaction - added game variable system
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 01 Oct 2014 01:06:55 +0300
parents
children 3f221bdc9bab
rev   line source
nuclear@7 1 #include <map>
nuclear@7 2 #include "game_var.h"
nuclear@7 3
nuclear@7 4 static std::map<std::string, GameVariable> gvars;
nuclear@7 5
nuclear@7 6 GameVariable::GameVariable()
nuclear@7 7 {
nuclear@7 8 num_val = 0.0f;
nuclear@7 9 bool_val = false;
nuclear@7 10 }
nuclear@7 11
nuclear@7 12 std::string GameVariable::to_str() const
nuclear@7 13 {
nuclear@7 14 char buf[128];
nuclear@7 15
nuclear@7 16 switch(type) {
nuclear@7 17 case GameVariable::STR:
nuclear@7 18 return val;
nuclear@7 19 case GameVariable::BOOL:
nuclear@7 20 return bool_val ? "true" : "false";
nuclear@7 21 case GameVariable::NUMBER:
nuclear@7 22 sprintf(buf, "%g", num_val);
nuclear@7 23 return buf;
nuclear@7 24 }
nuclear@7 25 return "<unknown>";
nuclear@7 26 }
nuclear@7 27
nuclear@7 28 void set_gvar(const GameVariable &var)
nuclear@7 29 {
nuclear@7 30 gvars[var.name] = var;
nuclear@7 31 }
nuclear@7 32
nuclear@7 33 void set_gvar_str(const char *name, const char *val)
nuclear@7 34 {
nuclear@7 35 GameVariable v;
nuclear@7 36 v.name = name;
nuclear@7 37 v.val = val;
nuclear@7 38 v.type = GameVariable::STR;
nuclear@7 39 set_gvar(v);
nuclear@7 40 }
nuclear@7 41
nuclear@7 42 void set_gvar_num(const char *name, float val)
nuclear@7 43 {
nuclear@7 44 GameVariable v;
nuclear@7 45 v.name = name;
nuclear@7 46 v.num_val = val;
nuclear@7 47 v.type = GameVariable::NUMBER;
nuclear@7 48 set_gvar(v);
nuclear@7 49 }
nuclear@7 50
nuclear@7 51 void set_gvar_bool(const char *name, bool val)
nuclear@7 52 {
nuclear@7 53 GameVariable v;
nuclear@7 54 v.name = name;
nuclear@7 55 v.bool_val = val;
nuclear@7 56 v.type = GameVariable::BOOL;
nuclear@7 57 set_gvar(v);
nuclear@7 58 }
nuclear@7 59
nuclear@7 60 static char *strip_whitespace(char *s)
nuclear@7 61 {
nuclear@7 62 while(*s && isspace(*s)) ++s;
nuclear@7 63 if(*s == 0) return s;
nuclear@7 64
nuclear@7 65 char *endp = s + strlen(s) - 1;
nuclear@7 66 while(endp > s && isspace(*endp)) {
nuclear@7 67 *endp-- = 0;
nuclear@7 68 }
nuclear@7 69 return s;
nuclear@7 70 }
nuclear@7 71
nuclear@7 72 static int strccmp(const char *a, const char *b)
nuclear@7 73 {
nuclear@7 74 while(*a && *b) {
nuclear@7 75 int diff = tolower(*a) - tolower(*b);
nuclear@7 76 if(diff != 0) return diff;
nuclear@7 77 ++a;
nuclear@7 78 ++b;
nuclear@7 79 }
nuclear@7 80 if(*a == 0 && *b == 0) return 0;
nuclear@7 81 return *a == 0 ? -1 : 1;
nuclear@7 82 }
nuclear@7 83
nuclear@7 84 void set_gvar_parse(const char *name, const char *val)
nuclear@7 85 {
nuclear@7 86 char *endp, *valstr = (char*)alloca(strlen(val) + 1);
nuclear@7 87 strcpy(valstr, val);
nuclear@7 88 valstr = strip_whitespace(valstr);
nuclear@7 89
nuclear@7 90 float fval = strtod(valstr, &endp);
nuclear@7 91 if(endp != valstr && *endp == 0) {
nuclear@7 92 set_gvar_num(name, fval);
nuclear@7 93 return;
nuclear@7 94 }
nuclear@7 95
nuclear@7 96 if(strccmp(valstr, "true") == 0 || strccmp(valstr, "yes") == 0) {
nuclear@7 97 set_gvar_bool(name, true);
nuclear@7 98 return;
nuclear@7 99 }
nuclear@7 100 if(strccmp(valstr, "false") == 0 || strccmp(valstr, "no") == 0) {
nuclear@7 101 set_gvar_bool(name, false);
nuclear@7 102 return;
nuclear@7 103 }
nuclear@7 104 return set_gvar_str(name, val);
nuclear@7 105 }
nuclear@7 106
nuclear@7 107 GameVariable &get_gvar(const char *name)
nuclear@7 108 {
nuclear@7 109 return gvars[name];
nuclear@7 110 }
nuclear@7 111
nuclear@7 112 const char *get_gvar_str(const char *name)
nuclear@7 113 {
nuclear@7 114 return gvars[name].val.c_str();
nuclear@7 115 }
nuclear@7 116
nuclear@7 117 float get_gvar_num(const char *name)
nuclear@7 118 {
nuclear@7 119 return gvars[name].num_val;
nuclear@7 120 }
nuclear@7 121
nuclear@7 122 bool get_gvar_bool(const char *name)
nuclear@7 123 {
nuclear@7 124 return gvars[name].bool_val;
nuclear@7 125 }
nuclear@7 126
nuclear@7 127 bool have_gvar(const char *name)
nuclear@7 128 {
nuclear@7 129 return gvars.find(std::string(name)) != gvars.end();
nuclear@7 130 }
nuclear@7 131
nuclear@7 132 std::list<std::string> get_gvar_list()
nuclear@7 133 {
nuclear@7 134 std::list<std::string> res;
nuclear@7 135
nuclear@7 136 std::map<std::string, GameVariable>::const_iterator it = gvars.begin();
nuclear@7 137 while(it != gvars.end()) {
nuclear@7 138 res.push_back((it++)->first);
nuclear@7 139 }
nuclear@7 140 return res;
nuclear@7 141 }