Include and link physfs properly.
[tuxanci.git] / src / client / config.c
blob130fcdffe8b6603ebf95dedccf2e16f162dd8bc1
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <assert.h>
6 #include "main.h"
7 #include "list.h"
8 #include "homeDirector.h"
9 #include "textFile.h"
10 #include "configFile.h"
11 #include "config.h"
13 typedef struct setting_int_struct {
14 int key; /* identification key */
15 char *param; /* parameter of the program */
16 char *var; /* variable in the config file */
17 int type; /* type of the data - string/number */
18 int value_int; /* numeric data */
19 char *value_str; /* textual data */
20 } config_t;
22 #define CONFIG_TYPE_INT 1
23 #define CONFIG_TYPE_STR 2
25 static config_t config_list[] =
27 { .key=CFG_NAME_RIGHT, .var="NAME_PLAYER_RIGHT", .param="--name-right", .type=CONFIG_TYPE_STR, .value_str="name1" },
28 { .key=CFG_NAME_LEFT, .var="NAME_PLAYER_LEFT", .param="--name-left", .type=CONFIG_TYPE_STR, .value_str="name2" },
29 { .key=CFG_COUNT_ROUND, .var="COUNT_ROUND", .param="--count", .type=CONFIG_TYPE_INT, .value_int=15 },
30 { .key=CFG_AI, .var="AI", .param="--ai", .type=CONFIG_TYPE_INT, .value_int=0 },
31 { .key=CFG_MUSIC, .var="MUSIC", .param="--music", .type=CONFIG_TYPE_INT, .value_int=1 },
32 { .key=CFG_SOUND, .var="SOUND", .param="--sound", .type=CONFIG_TYPE_INT, .value_int=1 },
33 { .key=CFG_ARENA, .var="ARENA", .param="--arena", .type=CONFIG_TYPE_STR, .value_str="FAGN" },
35 { .key=CFG_GUN_DUAL_SIMPLE, .var="GUN_DUAL_SIMPLE", .param="--gun-dual-simple", .type=CONFIG_TYPE_INT, .value_int=1 },
36 { .key=CFG_GUN_SCATTER, .var="GUN_SCATTER", .param="--gun-scatter", .type=CONFIG_TYPE_INT, .value_int=1 },
37 { .key=CFG_GUN_TOMMY, .var="GUN_TOMMY", .param="--gun-tommy", .type=CONFIG_TYPE_INT, .value_int=1 },
38 { .key=CFG_GUN_LASSER, .var="GUN_LASSER", .param="--gun-lasser", .type=CONFIG_TYPE_INT, .value_int=1 },
39 { .key=CFG_GUN_MINE, .var="GUN_MINE", .param="--gun-mine", .type=CONFIG_TYPE_INT, .value_int=1 },
40 { .key=CFG_GUN_BOMBBALL, .var="GUN_BOMBBALL", .param="--gun-bombball", .type=CONFIG_TYPE_INT, .value_int=1 },
42 { .key=CFG_BONUS_SPEED, .var="BONUS_SPEED", .param="--bonus-speed", .type=CONFIG_TYPE_INT, .value_int=1 },
43 { .key=CFG_BONUS_SHOT, .var="BONUS_SHOT", .param="--bonus-shot", .type=CONFIG_TYPE_INT, .value_int=1 },
44 { .key=CFG_BONUS_TELEPORT, .var="BONUS_TELEPORT", .param="--bonus-teleport", .type=CONFIG_TYPE_INT, .value_int=1 },
45 { .key=CFG_BONUS_GHOST, .var="BONUS_GHOST", .param="--bonus-ghost", .type=CONFIG_TYPE_INT, .value_int=1 },
46 { .key=CFG_BONUS_4X, .var="BONUS_4X", .param="--bonus-4x", .type=CONFIG_TYPE_INT, .value_int=1 },
47 { .key=CFG_BONUS_HIDDEN, .var="BONUS_HIDDEN", .param="--bonus-hidden", .type=CONFIG_TYPE_INT, .value_int=1 },
49 { .key=CFG_GAME_TYPE, .var="GAME_TYPE", .param="--game-type", .type=CONFIG_TYPE_STR, .value_str="none" },
50 { .key=CFG_NET_IP, .var="NET_IP", .param="--ip", .type=CONFIG_TYPE_STR, .value_str="127.0.0.1" },
51 { .key=CFG_NET_PORT, .var="NET_PORT", .param="--port", .type=CONFIG_TYPE_STR, .value_str="6800" }
54 static textFile_t *config_file;
56 static config_t *find_config(int key)
58 int i;
60 for (i = 0; i < CONFIG_LIST_COUNT; i++) {
61 if (config_list[i].key == key) {
62 return &config_list[i];
66 return NULL;
69 static void check_param()
71 int i;
73 for (i = 0; i < CONFIG_LIST_COUNT; i++) {
74 char *str;
76 str = getParam(config_list[i].param);
78 if (str != NULL) {
79 if (config_list[i].type == CONFIG_TYPE_INT) {
80 config_list[i].value_int = atoi(str);
81 } else {
82 if (config_list[i].value_str != NULL) {
83 free(config_list[i].value_str);
86 config_list[i].value_str = strdup(str);
92 int config_init()
94 config_load();
95 check_param();
97 return 0;
100 void config_load()
102 char path[STR_PATH_SIZE];
103 char val[STR_SIZE];
104 int i;
106 sprintf(path, "%s%stuxanci.conf", home_director_get(), PATH_SEPARATOR);
108 config_file = text_file_load(path);
110 if (config_file == NULL) {
111 error("Unable to load config file [%s]", path);
112 debug("Creating config file [%s]", path);
114 config_file = text_file_new(path);
117 if (config_file == NULL) {
118 error("Unable to create config file [%s]", path);
119 return;
122 for (i = 0; i < CONFIG_LIST_COUNT; i++) {
123 if (config_list[i].type == CONFIG_TYPE_INT) {
124 char str[STR_SIZE];
126 sprintf(str, "%d", config_list[i].value_int);
127 loadValueFromConfigFile(config_file, config_list[i].var, val, STR_SIZE, str);
128 config_list[i].value_int = atoi(val);
129 } else {
130 loadValueFromConfigFile(config_file, config_list[i].var, val, STR_SIZE, config_list[i].value_str);
131 config_list[i].value_str = strdup(val);
136 void config_save()
138 int i;
140 if (config_file == NULL) {
141 return;
144 for (i = 0; i < CONFIG_LIST_COUNT; i++) {
145 if (config_list[i].type == CONFIG_TYPE_INT) {
146 char str[STR_SIZE];
148 sprintf(str, "%d", config_list[i].value_int);
149 setValueInConfigFile(config_file, config_list[i].var, str);
150 } else {
151 setValueInConfigFile(config_file, config_list[i].var, config_list[i].value_str);
155 text_file_save(config_file);
158 int config_get_int_value(int key)
160 config_t *tmp;
162 tmp = find_config(key);
164 assert(tmp != NULL);
165 assert(tmp->type == CONFIG_TYPE_INT);
167 return tmp->value_int;
170 char *config_get_str_value(int key)
172 config_t *tmp;
174 tmp = find_config(key);
176 assert(tmp != NULL);
177 assert(tmp->type == CONFIG_TYPE_STR);
179 return tmp->value_str;
182 void config_set_int_value(int key, int n)
184 config_t *tmp;
186 tmp = find_config(key);
188 assert(tmp != NULL);
189 assert(tmp->type == CONFIG_TYPE_INT);
191 tmp->value_int = n;
194 void config_set_str_value(int key, char *str)
196 config_t *tmp;
198 tmp = find_config(key);
200 assert(tmp != NULL);
201 assert(tmp->type == CONFIG_TYPE_STR);
203 if (tmp->value_str != NULL) {
204 free(tmp->value_str); /* has to be allocated */
207 tmp->value_str = strdup(str);
210 int config_quit()
212 int i;
214 config_save();
216 if (config_file != NULL) {
217 text_file_destroy(config_file);
220 for (i = 0; i < CONFIG_LIST_COUNT; i++) {
221 if (config_list[i].type == CONFIG_TYPE_STR && config_list[i].value_str != NULL) {
222 free(config_list[i].value_str);
226 return 0;