project_files/frontlib/model/team.c
changeset 7227 1c859f572d72
parent 7224 5143861c83bd
child 7230 240620f46dd7
equal deleted inserted replaced
7224:5143861c83bd 7227:1c859f572d72
     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) {