project_files/frontlib/model/team.c
changeset 7271 5608ac657362
parent 7230 240620f46dd7
child 7275 15f722e0b96f
equal deleted inserted replaced
7269:5b0aeef8ba2a 7271:5608ac657362
     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 }