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 #include "../util/refcounter.h" |
|
7 |
6 #include <string.h> |
8 #include <string.h> |
7 #include <stdlib.h> |
9 #include <stdlib.h> |
8 |
10 |
9 static flib_team *from_ini_handleError(flib_team *result, flib_ini *settingfile) { |
11 static flib_team *from_ini_handleError(flib_team *result, flib_ini *settingfile) { |
10 flib_ini_destroy(settingfile); |
12 flib_ini_destroy(settingfile); |
11 flib_team_destroy(result); |
13 flib_team_release(result); |
12 return NULL; |
14 return NULL; |
13 } |
15 } |
14 |
16 |
15 flib_team *flib_team_from_ini(const char *filename) { |
17 flib_team *flib_team_from_ini(const char *filename) { |
16 flib_team *result = flib_calloc(1, sizeof(flib_team)); |
18 flib_team *result = flib_team_retain(flib_calloc(1, sizeof(flib_team))); |
17 flib_ini *ini = NULL; |
19 flib_ini *ini = NULL; |
18 |
20 |
19 if(!filename) { |
21 if(!filename) { |
20 flib_log_e("null parameter in flib_team_from_ini"); |
22 flib_log_e("null parameter in flib_team_from_ini"); |
21 return from_ini_handleError(result, ini); |
23 return from_ini_handleError(result, ini); |
187 flib_ini_destroy(ini); |
189 flib_ini_destroy(ini); |
188 } |
190 } |
189 return result; |
191 return result; |
190 } |
192 } |
191 |
193 |
192 void flib_team_destroy(flib_team *team) { |
194 flib_team *flib_team_retain(flib_team *team) { |
193 if(team) { |
195 if(team) { |
|
196 flib_retain(&team->_referenceCount, "flib_team"); |
|
197 } |
|
198 return team; |
|
199 } |
|
200 |
|
201 void flib_team_release(flib_team *team) { |
|
202 if(team && flib_release(&team->_referenceCount, "flib_team")) { |
194 for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) { |
203 for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) { |
195 free(team->hogs[i].name); |
204 free(team->hogs[i].name); |
196 free(team->hogs[i].hat); |
205 free(team->hogs[i].hat); |
197 flib_weaponset_release(team->hogs[i].weaponset); |
206 flib_weaponset_release(team->hogs[i].weaponset); |
198 } |
207 } |
206 free(team->bindings[i].action); |
215 free(team->bindings[i].action); |
207 free(team->bindings[i].binding); |
216 free(team->bindings[i].binding); |
208 } |
217 } |
209 } |
218 } |
210 free(team->bindings); |
219 free(team->bindings); |
211 free(team->hash); |
220 free(team->ownerName); |
212 free(team); |
221 free(team); |
213 } |
222 } |
214 } |
223 } |
215 |
224 |
216 void flib_team_set_weaponset(flib_team *team, flib_weaponset *set) { |
225 void flib_team_set_weaponset(flib_team *team, flib_weaponset *set) { |
219 flib_weaponset_release(team->hogs[i].weaponset); |
228 flib_weaponset_release(team->hogs[i].weaponset); |
220 team->hogs[i].weaponset = flib_weaponset_retain(set); |
229 team->hogs[i].weaponset = flib_weaponset_retain(set); |
221 } |
230 } |
222 } |
231 } |
223 } |
232 } |
|
233 |
|
234 char *strdupWithError(const char *in, bool *error) { |
|
235 char *out = flib_strdupnull(in); |
|
236 if(in && !out) { |
|
237 *error = true; |
|
238 } |
|
239 return out; |
|
240 } |
|
241 |
|
242 flib_team *flib_team_copy(flib_team *team) { |
|
243 flib_team *result = NULL; |
|
244 if(team) { |
|
245 flib_team *tmpTeam = flib_team_retain(flib_calloc(1, sizeof(flib_team))); |
|
246 if(tmpTeam) { |
|
247 bool error = false; |
|
248 |
|
249 for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) { |
|
250 tmpTeam->hogs[i].name = strdupWithError(team->hogs[i].name, &error); |
|
251 tmpTeam->hogs[i].hat = strdupWithError(team->hogs[i].hat, &error); |
|
252 tmpTeam->hogs[i].rounds = team->hogs[i].rounds; |
|
253 tmpTeam->hogs[i].kills = team->hogs[i].kills; |
|
254 tmpTeam->hogs[i].deaths = team->hogs[i].deaths; |
|
255 tmpTeam->hogs[i].suicides = team->hogs[i].suicides; |
|
256 tmpTeam->hogs[i].difficulty = team->hogs[i].difficulty; |
|
257 tmpTeam->hogs[i].initialHealth = team->hogs[i].initialHealth; |
|
258 tmpTeam->hogs[i].weaponset = flib_weaponset_retain(team->hogs[i].weaponset); |
|
259 } |
|
260 |
|
261 tmpTeam->name = strdupWithError(team->name, &error); |
|
262 tmpTeam->grave = strdupWithError(team->grave, &error); |
|
263 tmpTeam->fort = strdupWithError(team->fort, &error); |
|
264 tmpTeam->voicepack = strdupWithError(team->voicepack, &error); |
|
265 tmpTeam->flag = strdupWithError(team->flag, &error); |
|
266 tmpTeam->ownerName = strdupWithError(team->ownerName, &error); |
|
267 |
|
268 tmpTeam->bindingCount = team->bindingCount; |
|
269 if(team->bindings) { |
|
270 tmpTeam->bindings = flib_calloc(team->bindingCount, sizeof(flib_binding)); |
|
271 if(tmpTeam->bindings) { |
|
272 for(int i=0; i<tmpTeam->bindingCount; i++) { |
|
273 tmpTeam->bindings[i].action = strdupWithError(team->bindings[i].action, &error); |
|
274 tmpTeam->bindings[i].binding = strdupWithError(team->bindings[i].binding, &error); |
|
275 } |
|
276 } else { |
|
277 error = true; |
|
278 } |
|
279 } |
|
280 |
|
281 tmpTeam->rounds = team->rounds; |
|
282 tmpTeam->wins = team->wins; |
|
283 tmpTeam->campaignProgress = team->campaignProgress; |
|
284 |
|
285 tmpTeam->color = team->color; |
|
286 tmpTeam->hogsInGame = team->hogsInGame; |
|
287 tmpTeam->remoteDriven = team->remoteDriven; |
|
288 |
|
289 if(!error) { |
|
290 result = tmpTeam; |
|
291 tmpTeam = 0; |
|
292 } |
|
293 } |
|
294 flib_team_release(tmpTeam); |
|
295 } |
|
296 return result; |
|
297 } |