1 #include "team.h" |
1 #include "team.h" |
2 |
2 |
3 #include "../util/inihelper.h" |
3 #include "../util/inihelper.h" |
4 #include "../util/util.h" |
4 #include "../util/util.h" |
5 #include "../util/logging.h" |
5 #include "../util/logging.h" |
6 |
6 #include <string.h> |
7 static flib_team *from_ini_handleError(flib_team *result, dictionary *settingfile, char **bindingKeys) { |
7 #include <stdlib.h> |
8 if(settingfile) { |
8 |
9 iniparser_freedict(settingfile); |
9 static flib_team *from_ini_handleError(flib_team *result, flib_ini *settingfile) { |
10 } |
10 flib_ini_destroy(settingfile); |
11 flib_team_destroy(result); |
11 flib_team_destroy(result); |
12 free(bindingKeys); |
|
13 return NULL; |
12 return NULL; |
14 } |
13 } |
15 |
14 |
16 flib_team *flib_team_from_ini(const char *filename) { |
15 flib_team *flib_team_from_ini(const char *filename) { |
17 flib_team *result = flib_calloc(1, sizeof(flib_team)); |
16 flib_team *result = flib_calloc(1, sizeof(flib_team)); |
18 dictionary *settingfile = NULL; |
17 flib_ini *ini = NULL; |
19 char **bindingKeys = NULL; |
|
20 |
18 |
21 if(!filename) { |
19 if(!filename) { |
22 flib_log_e("null parameter in flib_team_from_ini"); |
20 flib_log_e("null parameter in flib_team_from_ini"); |
23 return from_ini_handleError(result, settingfile, bindingKeys); |
21 return from_ini_handleError(result, ini); |
24 } |
22 } |
25 |
23 |
26 if(!result) { |
24 if(!result) { |
27 return from_ini_handleError(result, settingfile, bindingKeys); |
25 return from_ini_handleError(result, ini); |
28 } |
26 } |
29 |
27 |
30 settingfile = iniparser_load(filename); |
28 ini = flib_ini_load(filename); |
31 if(!settingfile) { |
29 if(!ini) { |
32 flib_log_e("Error loading team file %s", filename); |
30 flib_log_e("Error loading team file %s", filename); |
33 return from_ini_handleError(result, settingfile, bindingKeys); |
31 return from_ini_handleError(result, ini); |
34 } |
32 } |
35 |
33 |
|
34 if(flib_ini_enter_section(ini, "team")) { |
|
35 flib_log_e("Missing section \"Team\" in team file %s", filename); |
|
36 return from_ini_handleError(result, ini); |
|
37 } |
36 bool error = false; |
38 bool error = false; |
37 result->name = inihelper_getstringdup(settingfile, &error, "team", "name"); |
39 error |= flib_ini_get_str(ini, &result->name, "name"); |
38 result->grave = inihelper_getstringdup(settingfile, &error, "team", "grave"); |
40 error |= flib_ini_get_str(ini, &result->grave, "grave"); |
39 result->fort = inihelper_getstringdup(settingfile, &error, "team", "fort"); |
41 error |= flib_ini_get_str(ini, &result->fort, "fort"); |
40 result->voicepack = inihelper_getstringdup(settingfile, &error, "team", "voicepack"); |
42 error |= flib_ini_get_str(ini, &result->voicepack, "voicepack"); |
41 result->flag = inihelper_getstringdup(settingfile, &error, "team", "flag"); |
43 error |= flib_ini_get_str(ini, &result->flag, "flag"); |
42 result->rounds = inihelper_getint(settingfile, &error, "team", "rounds"); |
44 error |= flib_ini_get_int(ini, &result->rounds, "rounds"); |
43 result->wins = inihelper_getint(settingfile, &error, "team", "wins"); |
45 error |= flib_ini_get_int(ini, &result->wins, "wins"); |
44 result->campaignProgress = inihelper_getint(settingfile, &error, "team", "campaignprogress"); |
46 error |= flib_ini_get_int(ini, &result->campaignProgress, "campaignprogress"); |
45 int difficulty = inihelper_getint(settingfile, &error, "team", "difficulty"); |
47 |
46 |
48 int difficulty = 0; |
47 char sectionName[10]; |
49 error |= flib_ini_get_int(ini, &difficulty, "difficulty"); |
48 strcpy(sectionName, "hedgehog0"); |
50 |
|
51 if(error) { |
|
52 flib_log_e("Missing or malformed entry in section \"Team\" in file %s", filename); |
|
53 return from_ini_handleError(result, ini); |
|
54 } |
|
55 |
49 for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) { |
56 for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) { |
50 sectionName[8] = '0'+i; |
57 char sectionName[32]; |
51 result->hogs[i].name = inihelper_getstringdup(settingfile, &error, sectionName, "name"); |
58 if(snprintf(sectionName, sizeof(sectionName), "hedgehog%i", i) <= 0) { |
52 result->hogs[i].hat = inihelper_getstringdup(settingfile, &error, sectionName, "hat"); |
59 return from_ini_handleError(result, ini); |
53 result->hogs[i].rounds = inihelper_getint(settingfile, &error, sectionName, "rounds"); |
60 } |
54 result->hogs[i].kills = inihelper_getint(settingfile, &error, sectionName, "kills"); |
61 if(flib_ini_enter_section(ini, sectionName)) { |
55 result->hogs[i].deaths = inihelper_getint(settingfile, &error, sectionName, "deaths"); |
62 flib_log_e("Missing section \"%s\" in team file %s", sectionName, filename); |
56 result->hogs[i].suicides = inihelper_getint(settingfile, &error, sectionName, "suicides"); |
63 return from_ini_handleError(result, ini); |
|
64 } |
|
65 flib_hog *hog = &result->hogs[i]; |
|
66 error |= flib_ini_get_str(ini, &hog->name, "name"); |
|
67 error |= flib_ini_get_str(ini, &hog->hat, "hat"); |
|
68 error |= flib_ini_get_int(ini, &hog->rounds, "rounds"); |
|
69 error |= flib_ini_get_int(ini, &hog->kills, "kills"); |
|
70 error |= flib_ini_get_int(ini, &hog->deaths, "deaths"); |
|
71 error |= flib_ini_get_int(ini, &hog->suicides, "suicides"); |
57 result->hogs[i].difficulty = difficulty; |
72 result->hogs[i].difficulty = difficulty; |
58 result->hogs[i].initialHealth = TEAM_DEFAULT_HEALTH; |
73 result->hogs[i].initialHealth = TEAM_DEFAULT_HEALTH; |
59 } |
74 |
60 |
75 if(error) { |
61 result->bindingCount = iniparser_getsecnkeys(settingfile, "binds"); |
76 flib_log_e("Missing or malformed entry in section \"%s\" in file %s", sectionName, filename); |
62 result->bindings = flib_calloc(result->bindingCount, sizeof(flib_binding)); |
77 return from_ini_handleError(result, ini); |
63 bindingKeys = iniparser_getseckeys(settingfile, "binds"); |
78 } |
64 if(!result->bindings || !bindingKeys) { |
79 } |
65 return from_ini_handleError(result, settingfile, bindingKeys); |
80 |
66 } |
81 if(!flib_ini_enter_section(ini, "binds")) { |
67 |
82 result->bindingCount = flib_ini_get_keycount(ini); |
68 for(int i=0; i<result->bindingCount; i++) { |
83 if(result->bindingCount<0) { |
69 result->bindings[i].binding = flib_strdupnull(iniparser_getstring(settingfile, bindingKeys[i], NULL)); |
84 flib_log_e("Error reading bindings from file %s", filename); |
70 // The key names all start with "binds:", so we skip that. |
85 result->bindingCount = 0; |
71 result->bindings[i].action = inihelper_urldecode(bindingKeys[i]+strlen("binds:")); |
86 } |
72 if(!result->bindings[i].action || !result->bindings[i].binding) { |
87 result->bindings = flib_calloc(result->bindingCount, sizeof(flib_binding)); |
73 error = true; |
88 if(!result->bindings) { |
|
89 return from_ini_handleError(result, ini); |
|
90 } |
|
91 for(int i=0; i<result->bindingCount; i++) { |
|
92 char *keyname = flib_ini_get_keyname(ini, i); |
|
93 if(!keyname) { |
|
94 error = true; |
|
95 } else { |
|
96 result->bindings[i].action = flib_urldecode(keyname); |
|
97 error |= !result->bindings[i].action; |
|
98 error |= flib_ini_get_str(ini, &result->bindings[i].binding, keyname); |
|
99 } |
|
100 free(keyname); |
74 } |
101 } |
75 } |
102 } |
76 |
103 |
77 if(error) { |
104 if(error) { |
78 flib_log_e("Error reading team file %s", filename); |
105 flib_log_e("Error reading team file %s", filename); |
79 return from_ini_handleError(result, settingfile, bindingKeys); |
106 return from_ini_handleError(result, ini); |
80 } |
107 } |
81 |
108 |
82 iniparser_freedict(settingfile); |
109 flib_ini_destroy(ini); |
83 free(bindingKeys); |
110 return result; |
|
111 } |
|
112 |
|
113 static int writeTeamSection(const flib_team *team, flib_ini *ini) { |
|
114 if(flib_ini_create_section(ini, "team")) { |
|
115 return -1; |
|
116 } |
|
117 bool error = false; |
|
118 error |= flib_ini_set_str(ini, "name", team->name); |
|
119 error |= flib_ini_set_str(ini, "grave", team->grave); |
|
120 error |= flib_ini_set_str(ini, "fort", team->fort); |
|
121 error |= flib_ini_set_str(ini, "voicepack", team->voicepack); |
|
122 error |= flib_ini_set_str(ini, "flag", team->flag); |
|
123 error |= flib_ini_set_int(ini, "rounds", team->rounds); |
|
124 error |= flib_ini_set_int(ini, "wins", team->wins); |
|
125 error |= flib_ini_set_int(ini, "campaignprogress", team->campaignProgress); |
|
126 error |= flib_ini_set_int(ini, "difficulty", team->hogs[0].difficulty); |
|
127 return error; |
|
128 } |
|
129 |
|
130 static int writeHogSections(const flib_team *team, flib_ini *ini) { |
|
131 for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) { |
|
132 const flib_hog *hog = &team->hogs[i]; |
|
133 char sectionName[32]; |
|
134 if(snprintf(sectionName, sizeof(sectionName), "hedgehog%i", i) <= 0) { |
|
135 return -1; |
|
136 } |
|
137 if(flib_ini_create_section(ini, sectionName)) { |
|
138 return -1; |
|
139 } |
|
140 bool error = false; |
|
141 error |= flib_ini_set_str(ini, "name", hog->name); |
|
142 error |= flib_ini_set_str(ini, "hat", hog->hat); |
|
143 error |= flib_ini_set_int(ini, "rounds", hog->rounds); |
|
144 error |= flib_ini_set_int(ini, "kills", hog->kills); |
|
145 error |= flib_ini_set_int(ini, "deaths", hog->deaths); |
|
146 error |= flib_ini_set_int(ini, "suicides", hog->suicides); |
|
147 if(error) { |
|
148 return error; |
|
149 } |
|
150 } |
|
151 return 0; |
|
152 } |
|
153 |
|
154 static int writeBindingSection(const flib_team *team, flib_ini *ini) { |
|
155 if(flib_ini_create_section(ini, "binds")) { |
|
156 return -1; |
|
157 } |
|
158 for(int i=0; i<team->bindingCount; i++) { |
|
159 bool error = false; |
|
160 char *action = flib_urlencode(team->bindings[i].action); |
|
161 if(action) { |
|
162 error |= flib_ini_set_str(ini, action, team->bindings[i].binding); |
|
163 free(action); |
|
164 } else { |
|
165 error = true; |
|
166 } |
|
167 if(error) { |
|
168 return error; |
|
169 } |
|
170 } |
|
171 return 0; |
|
172 } |
|
173 |
|
174 int flib_team_to_ini(const char *filename, const flib_team *team) { |
|
175 int result = -1; |
|
176 if(!filename || !team) { |
|
177 flib_log_e("null parameter in flib_team_to_ini"); |
|
178 } else { |
|
179 flib_ini *ini = flib_ini_create(filename); |
|
180 bool error = false; |
|
181 error |= writeTeamSection(team, ini); |
|
182 error |= writeHogSections(team, ini); |
|
183 error |= writeBindingSection(team, ini); |
|
184 if(!error) { |
|
185 result = flib_ini_save(ini, filename); |
|
186 } |
|
187 flib_ini_destroy(ini); |
|
188 } |
84 return result; |
189 return result; |
85 } |
190 } |
86 |
191 |
87 void flib_team_destroy(flib_team *team) { |
192 void flib_team_destroy(flib_team *team) { |
88 if(team) { |
193 if(team) { |