1 /************************************************************************
3 * voxelands - 3d voxel world sandbox game
4 * Copyright (C) Lisa 'darkrose' Milne 2016 <lisa@ltmnet.com>
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>
18 ************************************************************************/
39 typedef struct config_s
{
41 int (*setter
)(char* v
);
44 /* get the value of a config setting */
45 char* config_get(char* name
)
47 nvp_t
*n
= nvp_get(&config
.items
,name
);
52 return ((config_t
*)n
->data
)->default_value
;
57 /* get a config setting as an int value */
58 int config_get_int(char* name
)
60 char* v
= config_get(name
);
62 return strtol(v
,NULL
,10);
67 /* get a config setting as a float value */
68 float config_get_float(char* name
)
70 char* v
= config_get(name
);
72 return strtof(v
,NULL
);
77 /* get a config setting as a boolean value */
78 int config_get_bool(char* name
)
80 char* v
= config_get(name
);
82 if (!strcmp(v
,"true"))
88 if (!strcmp(v
,"enabled"))
90 if (!strcmp(v
,"active"))
92 if (strtol(v
,NULL
,10))
99 /* set the value of a config setting */
100 void config_set(char* name
, char* value
)
103 nvp_t
*n
= nvp_get(&config
.items
,name
);
109 c
= malloc(sizeof(config_t
));
110 c
->default_value
= NULL
;
113 nvp_set(&config
.items
,name
,value
,c
);
123 n
->value
= strdup(value
);
127 if (!n
->value
&& c
->default_value
) {
128 c
->setter(c
->default_value
);
135 /* set a config setting to an int value */
136 void config_set_int(char* name
, int value
)
139 sprintf(str
,"%d",value
);
140 config_set(name
,str
);
143 /* set a config setting to a float value */
144 void config_set_float(char* name
, float value
)
147 sprintf(str
,"%f",value
);
148 config_set(name
,str
);
151 /* set the default value of a config setting */
152 void config_set_default(char* name
, char* value
, int (*setter
)(char* v
))
155 nvp_t
*n
= nvp_get(&config
.items
,name
);
158 if (!value
&& !setter
)
161 c
= malloc(sizeof(config_t
));
163 c
->default_value
= strdup(value
);
165 c
->default_value
= NULL
;
169 nvp_set(&config
.items
,name
,value
,c
);
179 if (c
->default_value
)
180 free(c
->default_value
);
181 c
->default_value
= NULL
;
184 c
->default_value
= strdup(value
);
187 /* set the default of a config setting to an int value */
188 void config_set_default_int(char* name
, int value
, int (*setter
)(char* v
))
191 sprintf(str
,"%d",value
);
192 config_set_default(name
,str
,setter
);
195 /* set the default of a config setting to a float value */
196 void config_set_default_float(char* name
, float value
, int (*setter
)(char* v
))
199 sprintf(str
,"%f",value
);
200 config_set_default(name
,str
,setter
);
203 /* load a config file */
204 void config_load(char* file
)
210 file_t
*f
= file_load("config",file
);
214 while ((s
= file_readline(f
,buff
,2048)) > -1) {
215 if (!s
|| buff
[0] == '#')
218 /* TODO: uncomment when command.c is written
226 /* initialise configuration, load config files and defaults, etc */
227 void config_init(int argc
, char** argv
)
232 /* TODO: this should get adapted and moved to config_default.c
233 * TODO: also call config_default_init()
234 cmd_add_setter(RTG_SETTER_VFUNC,"sys.control",event_set_bind);
235 cmd_add_setter(RTG_SETTER_LITERAL,"wm.width",wm_width_setter);
236 cmd_add_setter(RTG_SETTER_LITERAL,"wm.height",wm_height_setter);
237 cmd_add_setter(RTG_SETTER_LITERAL,"wm.framecap",wm_cap_setter);
238 cmd_add_setter(RTG_SETTER_LITERAL,"wm.fullscreen",wm_fs_setter);
240 cmd_add_setter(RTG_SETTER_LITERAL,"wm.distance",wm_distance_setter);
242 cmd_add_setter(RTG_SETTER_LITERAL,"sound.enabled",sound_setter);
243 cmd_add_setter(RTG_SETTER_LITERAL,"sound.effects.volume",sound_effects_setter);
244 cmd_add_setter(RTG_SETTER_LITERAL,"sound.music.volume",sound_music_setter);
245 cmd_add_setter(RTG_SETTER_LITERAL,"gl.anisotropic",opengl_anisotropic_setter);
246 cmd_add_setter(RTG_SETTER_LITERAL,"gl.bilinear",opengl_bilinear_setter);
247 cmd_add_setter(RTG_SETTER_LITERAL,"gl.trilinear",opengl_trilinear_setter);
248 cmd_add_setter(RTG_SETTER_LITERAL,"gl.mipmaps",opengl_mipmap_setter);
250 cmd_add_setter(RTG_SETTER_LITERAL,"gl.shaders",shader_setter);
251 cmd_add_setter(RTG_SETTER_LITERAL,"gl.backfacecull",opengl_backfacecull_setter);
252 cmd_add_setter(RTG_SETTER_LITERAL,"gl.particles.enabled",opengl_particles_setter);
253 cmd_add_setter(RTG_SETTER_LITERAL,"gl.particles.max",opengl_particles_max_setter);
255 cmd_add_setter(RTG_SETTER_VFUNC,"ui.elements",ui_element_setter);
258 /* add the default config file to the to-exec list */
259 nvp_set(&config
.files
,"default.cfg","true",NULL
);
261 for (i
=1; i
<(argc
-1); i
++) {
262 if (!strcmp(argv
[i
],"exec")) {
264 nvp_set(&config
.files
,argv
[i
],"true",NULL
);
265 }else if (!strcmp(argv
[i
],"ignore")) {
267 nvp_set(&config
.files
,argv
[i
],"false",NULL
);
273 if (n
->value
&& !strcmp(n
->value
,"true"))
274 config_load(n
->name
);
278 for (i
=0; i
<argc
; i
++) {
279 if (!strcmp(argv
[i
],"set") && i
+2 < argc
) {
280 config_set(argv
[i
+1],argv
[i
+2]);
282 }else if (!strcmp(argv
[i
],"unset") && i
+1 < argc
) {
284 config_set(argv
[i
],NULL
);
285 }else if (!strcmp(argv
[i
],"exec")) {
287 }else if (!strcmp(argv
[i
],"ignore")) {
295 /* save the current config */
303 if (n
->value
&& !strcmp(n
->value
,"true"))
308 /* TODO: should probably force saving to somewhere, custom.cfg? */
312 f
= file_create("config",n
->value
);
319 file_writef(f
,"set %s %s\n",n
->name
,n
->value
);