nuclear@8: #include nuclear@7: #include nuclear@7: #include "game_var.h" nuclear@7: nuclear@7: static std::map gvars; nuclear@7: nuclear@7: GameVariable::GameVariable() nuclear@7: { nuclear@7: num_val = 0.0f; nuclear@7: bool_val = false; nuclear@7: } nuclear@7: nuclear@7: std::string GameVariable::to_str() const nuclear@7: { nuclear@7: char buf[128]; nuclear@7: nuclear@7: switch(type) { nuclear@7: case GameVariable::STR: nuclear@7: return val; nuclear@7: case GameVariable::BOOL: nuclear@7: return bool_val ? "true" : "false"; nuclear@7: case GameVariable::NUMBER: nuclear@7: sprintf(buf, "%g", num_val); nuclear@7: return buf; nuclear@7: } nuclear@7: return ""; nuclear@7: } nuclear@7: nuclear@7: void set_gvar(const GameVariable &var) nuclear@7: { nuclear@7: gvars[var.name] = var; nuclear@7: } nuclear@7: nuclear@7: void set_gvar_str(const char *name, const char *val) nuclear@7: { nuclear@7: GameVariable v; nuclear@7: v.name = name; nuclear@7: v.val = val; nuclear@7: v.type = GameVariable::STR; nuclear@7: set_gvar(v); nuclear@7: } nuclear@7: nuclear@7: void set_gvar_num(const char *name, float val) nuclear@7: { nuclear@7: GameVariable v; nuclear@7: v.name = name; nuclear@7: v.num_val = val; nuclear@7: v.type = GameVariable::NUMBER; nuclear@7: set_gvar(v); nuclear@7: } nuclear@7: nuclear@7: void set_gvar_bool(const char *name, bool val) nuclear@7: { nuclear@7: GameVariable v; nuclear@7: v.name = name; nuclear@7: v.bool_val = val; nuclear@7: v.type = GameVariable::BOOL; nuclear@7: set_gvar(v); nuclear@7: } nuclear@7: nuclear@7: static char *strip_whitespace(char *s) nuclear@7: { nuclear@7: while(*s && isspace(*s)) ++s; nuclear@7: if(*s == 0) return s; nuclear@7: nuclear@7: char *endp = s + strlen(s) - 1; nuclear@7: while(endp > s && isspace(*endp)) { nuclear@7: *endp-- = 0; nuclear@7: } nuclear@7: return s; nuclear@7: } nuclear@7: nuclear@7: static int strccmp(const char *a, const char *b) nuclear@7: { nuclear@7: while(*a && *b) { nuclear@7: int diff = tolower(*a) - tolower(*b); nuclear@7: if(diff != 0) return diff; nuclear@7: ++a; nuclear@7: ++b; nuclear@7: } nuclear@7: if(*a == 0 && *b == 0) return 0; nuclear@7: return *a == 0 ? -1 : 1; nuclear@7: } nuclear@7: nuclear@7: void set_gvar_parse(const char *name, const char *val) nuclear@7: { nuclear@7: char *endp, *valstr = (char*)alloca(strlen(val) + 1); nuclear@7: strcpy(valstr, val); nuclear@7: valstr = strip_whitespace(valstr); nuclear@7: nuclear@7: float fval = strtod(valstr, &endp); nuclear@7: if(endp != valstr && *endp == 0) { nuclear@7: set_gvar_num(name, fval); nuclear@7: return; nuclear@7: } nuclear@7: nuclear@7: if(strccmp(valstr, "true") == 0 || strccmp(valstr, "yes") == 0) { nuclear@7: set_gvar_bool(name, true); nuclear@7: return; nuclear@7: } nuclear@7: if(strccmp(valstr, "false") == 0 || strccmp(valstr, "no") == 0) { nuclear@7: set_gvar_bool(name, false); nuclear@7: return; nuclear@7: } nuclear@7: return set_gvar_str(name, val); nuclear@7: } nuclear@7: nuclear@7: GameVariable &get_gvar(const char *name) nuclear@7: { nuclear@7: return gvars[name]; nuclear@7: } nuclear@7: nuclear@7: const char *get_gvar_str(const char *name) nuclear@7: { nuclear@7: return gvars[name].val.c_str(); nuclear@7: } nuclear@7: nuclear@7: float get_gvar_num(const char *name) nuclear@7: { nuclear@7: return gvars[name].num_val; nuclear@7: } nuclear@7: nuclear@7: bool get_gvar_bool(const char *name) nuclear@7: { nuclear@7: return gvars[name].bool_val; nuclear@7: } nuclear@7: nuclear@7: bool have_gvar(const char *name) nuclear@7: { nuclear@7: return gvars.find(std::string(name)) != gvars.end(); nuclear@7: } nuclear@7: nuclear@7: std::list get_gvar_list() nuclear@7: { nuclear@7: std::list res; nuclear@7: nuclear@7: std::map::const_iterator it = gvars.begin(); nuclear@7: while(it != gvars.end()) { nuclear@7: res.push_back((it++)->first); nuclear@7: } nuclear@7: return res; nuclear@8: }