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