project_files/frontlib/model/team.c
changeset 7320 e704706008d4
parent 7316 f7b49b2c5d84
child 7470 0db1780ca938
equal deleted inserted replaced
7318:a446eafcddeb 7320:e704706008d4
    27 #include <string.h>
    27 #include <string.h>
    28 #include <stdlib.h>
    28 #include <stdlib.h>
    29 
    29 
    30 static flib_team *from_ini_handleError(flib_team *result, flib_ini *settingfile) {
    30 static flib_team *from_ini_handleError(flib_team *result, flib_ini *settingfile) {
    31 	flib_ini_destroy(settingfile);
    31 	flib_ini_destroy(settingfile);
    32 	flib_team_release(result);
    32 	flib_team_destroy(result);
    33 	return NULL;
    33 	return NULL;
    34 }
    34 }
    35 
    35 
    36 flib_team *flib_team_from_ini(const char *filename) {
    36 flib_team *flib_team_from_ini(const char *filename) {
    37 	if(log_badargs_if(filename==NULL)) {
    37 	if(log_badargs_if(filename==NULL)) {
    38 		return NULL;
    38 		return NULL;
    39 	}
    39 	}
    40 
    40 
    41 	flib_team *result = flib_team_retain(flib_calloc(1, sizeof(flib_team)));
    41 	flib_team *result = flib_calloc(1, sizeof(flib_team));
    42 	flib_ini *ini = NULL;
    42 	flib_ini *ini = NULL;
    43 
    43 
    44 	if(!result) {
    44 	if(!result) {
    45 		return from_ini_handleError(result, ini);
    45 		return from_ini_handleError(result, ini);
    46 	}
    46 	}
   126 		return from_ini_handleError(result, ini);
   126 		return from_ini_handleError(result, ini);
   127 	}
   127 	}
   128 
   128 
   129 	flib_ini_destroy(ini);
   129 	flib_ini_destroy(ini);
   130 	return result;
   130 	return result;
       
   131 }
       
   132 
       
   133 void flib_team_destroy(flib_team *team) {
       
   134 	if(team) {
       
   135 		for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) {
       
   136 			free(team->hogs[i].name);
       
   137 			free(team->hogs[i].hat);
       
   138 			flib_weaponset_release(team->hogs[i].weaponset);
       
   139 		}
       
   140 		free(team->name);
       
   141 		free(team->grave);
       
   142 		free(team->fort);
       
   143 		free(team->voicepack);
       
   144 		free(team->flag);
       
   145 		if(team->bindings) {
       
   146 			for(int i=0; i<team->bindingCount; i++) {
       
   147 				free(team->bindings[i].action);
       
   148 				free(team->bindings[i].binding);
       
   149 			}
       
   150 		}
       
   151 		free(team->bindings);
       
   152 		free(team->ownerName);
       
   153 		free(team);
       
   154 	}
   131 }
   155 }
   132 
   156 
   133 static int writeTeamSection(const flib_team *team, flib_ini *ini) {
   157 static int writeTeamSection(const flib_team *team, flib_ini *ini) {
   134 	if(flib_ini_create_section(ini, "team")) {
   158 	if(flib_ini_create_section(ini, "team")) {
   135 		return -1;
   159 		return -1;
   205 		flib_ini_destroy(ini);
   229 		flib_ini_destroy(ini);
   206 	}
   230 	}
   207 	return result;
   231 	return result;
   208 }
   232 }
   209 
   233 
   210 flib_team *flib_team_retain(flib_team *team) {
       
   211 	if(team) {
       
   212 		flib_retain(&team->_referenceCount, "flib_team");
       
   213 	}
       
   214 	return team;
       
   215 }
       
   216 
       
   217 void flib_team_release(flib_team *team) {
       
   218 	if(team && flib_release(&team->_referenceCount, "flib_team")) {
       
   219 		for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) {
       
   220 			free(team->hogs[i].name);
       
   221 			free(team->hogs[i].hat);
       
   222 			flib_weaponset_release(team->hogs[i].weaponset);
       
   223 		}
       
   224 		free(team->name);
       
   225 		free(team->grave);
       
   226 		free(team->fort);
       
   227 		free(team->voicepack);
       
   228 		free(team->flag);
       
   229 		if(team->bindings) {
       
   230 			for(int i=0; i<team->bindingCount; i++) {
       
   231 				free(team->bindings[i].action);
       
   232 				free(team->bindings[i].binding);
       
   233 			}
       
   234 		}
       
   235 		free(team->bindings);
       
   236 		free(team->ownerName);
       
   237 		free(team);
       
   238 	}
       
   239 }
       
   240 
       
   241 void flib_team_set_weaponset(flib_team *team, flib_weaponset *set) {
   234 void flib_team_set_weaponset(flib_team *team, flib_weaponset *set) {
   242 	if(team) {
   235 	if(team) {
   243 		for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) {
   236 		for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) {
   244 			flib_weaponset_release(team->hogs[i].weaponset);
   237 			flib_weaponset_release(team->hogs[i].weaponset);
   245 			team->hogs[i].weaponset = flib_weaponset_retain(set);
   238 			team->hogs[i].weaponset = flib_weaponset_retain(set);
   264 }
   257 }
   265 
   258 
   266 flib_team *flib_team_copy(const flib_team *team) {
   259 flib_team *flib_team_copy(const flib_team *team) {
   267 	flib_team *result = NULL;
   260 	flib_team *result = NULL;
   268 	if(team) {
   261 	if(team) {
   269 		flib_team *tmpTeam = flib_team_retain(flib_calloc(1, sizeof(flib_team)));
   262 		flib_team *tmpTeam = flib_calloc(1, sizeof(flib_team));
   270 		if(tmpTeam) {
   263 		if(tmpTeam) {
   271 			bool error = false;
   264 			bool error = false;
   272 
   265 
   273 			for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) {
   266 			for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) {
   274 				tmpTeam->hogs[i].name = strdupWithError(team->hogs[i].name, &error);
   267 				tmpTeam->hogs[i].name = strdupWithError(team->hogs[i].name, &error);
   313 			if(!error) {
   306 			if(!error) {
   314 				result = tmpTeam;
   307 				result = tmpTeam;
   315 				tmpTeam = 0;
   308 				tmpTeam = 0;
   316 			}
   309 			}
   317 		}
   310 		}
   318 		flib_team_release(tmpTeam);
   311 		flib_team_destroy(tmpTeam);
   319 	}
   312 	}
   320 	return result;
   313 	return result;
   321 }
   314 }