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