vrheights
diff 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 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/game_var.cc Wed Oct 01 01:06:55 2014 +0300 1.3 @@ -0,0 +1,141 @@ 1.4 +#include <map> 1.5 +#include "game_var.h" 1.6 + 1.7 +static std::map<std::string, GameVariable> gvars; 1.8 + 1.9 +GameVariable::GameVariable() 1.10 +{ 1.11 + num_val = 0.0f; 1.12 + bool_val = false; 1.13 +} 1.14 + 1.15 +std::string GameVariable::to_str() const 1.16 +{ 1.17 + char buf[128]; 1.18 + 1.19 + switch(type) { 1.20 + case GameVariable::STR: 1.21 + return val; 1.22 + case GameVariable::BOOL: 1.23 + return bool_val ? "true" : "false"; 1.24 + case GameVariable::NUMBER: 1.25 + sprintf(buf, "%g", num_val); 1.26 + return buf; 1.27 + } 1.28 + return "<unknown>"; 1.29 +} 1.30 + 1.31 +void set_gvar(const GameVariable &var) 1.32 +{ 1.33 + gvars[var.name] = var; 1.34 +} 1.35 + 1.36 +void set_gvar_str(const char *name, const char *val) 1.37 +{ 1.38 + GameVariable v; 1.39 + v.name = name; 1.40 + v.val = val; 1.41 + v.type = GameVariable::STR; 1.42 + set_gvar(v); 1.43 +} 1.44 + 1.45 +void set_gvar_num(const char *name, float val) 1.46 +{ 1.47 + GameVariable v; 1.48 + v.name = name; 1.49 + v.num_val = val; 1.50 + v.type = GameVariable::NUMBER; 1.51 + set_gvar(v); 1.52 +} 1.53 + 1.54 +void set_gvar_bool(const char *name, bool val) 1.55 +{ 1.56 + GameVariable v; 1.57 + v.name = name; 1.58 + v.bool_val = val; 1.59 + v.type = GameVariable::BOOL; 1.60 + set_gvar(v); 1.61 +} 1.62 + 1.63 +static char *strip_whitespace(char *s) 1.64 +{ 1.65 + while(*s && isspace(*s)) ++s; 1.66 + if(*s == 0) return s; 1.67 + 1.68 + char *endp = s + strlen(s) - 1; 1.69 + while(endp > s && isspace(*endp)) { 1.70 + *endp-- = 0; 1.71 + } 1.72 + return s; 1.73 +} 1.74 + 1.75 +static int strccmp(const char *a, const char *b) 1.76 +{ 1.77 + while(*a && *b) { 1.78 + int diff = tolower(*a) - tolower(*b); 1.79 + if(diff != 0) return diff; 1.80 + ++a; 1.81 + ++b; 1.82 + } 1.83 + if(*a == 0 && *b == 0) return 0; 1.84 + return *a == 0 ? -1 : 1; 1.85 +} 1.86 + 1.87 +void set_gvar_parse(const char *name, const char *val) 1.88 +{ 1.89 + char *endp, *valstr = (char*)alloca(strlen(val) + 1); 1.90 + strcpy(valstr, val); 1.91 + valstr = strip_whitespace(valstr); 1.92 + 1.93 + float fval = strtod(valstr, &endp); 1.94 + if(endp != valstr && *endp == 0) { 1.95 + set_gvar_num(name, fval); 1.96 + return; 1.97 + } 1.98 + 1.99 + if(strccmp(valstr, "true") == 0 || strccmp(valstr, "yes") == 0) { 1.100 + set_gvar_bool(name, true); 1.101 + return; 1.102 + } 1.103 + if(strccmp(valstr, "false") == 0 || strccmp(valstr, "no") == 0) { 1.104 + set_gvar_bool(name, false); 1.105 + return; 1.106 + } 1.107 + return set_gvar_str(name, val); 1.108 +} 1.109 + 1.110 +GameVariable &get_gvar(const char *name) 1.111 +{ 1.112 + return gvars[name]; 1.113 +} 1.114 + 1.115 +const char *get_gvar_str(const char *name) 1.116 +{ 1.117 + return gvars[name].val.c_str(); 1.118 +} 1.119 + 1.120 +float get_gvar_num(const char *name) 1.121 +{ 1.122 + return gvars[name].num_val; 1.123 +} 1.124 + 1.125 +bool get_gvar_bool(const char *name) 1.126 +{ 1.127 + return gvars[name].bool_val; 1.128 +} 1.129 + 1.130 +bool have_gvar(const char *name) 1.131 +{ 1.132 + return gvars.find(std::string(name)) != gvars.end(); 1.133 +} 1.134 + 1.135 +std::list<std::string> get_gvar_list() 1.136 +{ 1.137 + std::list<std::string> res; 1.138 + 1.139 + std::map<std::string, GameVariable>::const_iterator it = gvars.begin(); 1.140 + while(it != gvars.end()) { 1.141 + res.push_back((it++)->first); 1.142 + } 1.143 + return res; 1.144 +} 1.145 \ No newline at end of file