+int RegisterCvars_Save_fd;
+ERASEABLE
+void RegisterCvars_Save(string name, string def, string desc, bool archive, string file)
+{
+ if (!archive) return;
+ fputs(RegisterCvars_Save_fd, sprintf("seta %s \"%s\"\n", name, def));
+}
+
+STATIC_INIT_LATE(Cvars)
+{
+ RegisterCvars(RegisterCvars_Set);
+ RegisterCvars_Save_fd = fopen(sprintf("default%s.cfg", PROGNAME), FILE_WRITE);
+ if (RegisterCvars_Save_fd >= 0)
+ {
+ RegisterCvars(RegisterCvars_Save);
+ fclose(RegisterCvars_Save_fd);
+ }
+}
+
+const noref bool default_bool = false;
+const noref int default_int = 0;
+const noref float default_float = 0;
+const noref string default_string = "";
+const noref vector default_vector = '0 0 0';
+
+#define repr_cvar_bool(x) ((x) ? "1" : "0")
+#define repr_cvar_int(x) (ftos(x))
+#define repr_cvar_float(x) (ftos(x))
+#define repr_cvar_string(x) (x)
+#define repr_cvar_vector(x) (sprintf("%v", x))
+
+//pseudo prototypes:
+// void AUTOCVAR(<cvar_name>, <qc_var_type>, default_cvar_value, string desc)
+// void AUTOCVAR_SAVE(<cvar_name>, <qc_var_type>, default_cvar_value, string desc)
+// where default_cvar_value has type <qc_var_type>
+// e.g.: AUTOCVAR(mycvar, float, 2.5, "cvar description")
+
+#define __AUTOCVAR(file, archive, var, type, desc, default) \
+ ACCUMULATE void RegisterCvars(void(string, string, string, bool, string) f) \
+ { \
+ f( #var, repr_cvar_##type(default), desc, archive, file); \
+ } \
+ type autocvar_##var = default