void flib_ipcbase_accept(flib_ipcbase *ipc) { if(!log_badargs_if(ipc==NULL) && !ipc->sock && ipc->acceptor) { ipc->sock = flib_socket_accept(ipc->acceptor, true); if(ipc->sock) { flib_log_d("IPC connection accepted."); flib_acceptor_close(ipc->acceptor); ipc->acceptor = NULL; } } }
void flib_teamlist_clear(flib_teamlist *list) { if(!log_badargs_if(list==NULL)) { for(int i=0; i<list->teamCount; i++) { flib_team_destroy(list->teams[i]); } free(list->teams); list->teams = NULL; list->teamCount = 0; } }
int flib_weaponsetlist_delete(flib_weaponsetlist *list, int pos) { if(!log_badargs_if(list==NULL)) { flib_weaponset *elem = list->weaponsets[pos]; if(!deleteWeaponset(&list->weaponsets, &list->weaponsetCount, pos)) { flib_weaponset_destroy(elem); return 0; } } return -1; }
IpcState flib_ipcbase_state(flib_ipcbase *ipc) { if(log_badargs_if(ipc==NULL)) { return IPC_NOT_CONNECTED; } else if(ipc->sock) { return IPC_CONNECTED; } else if(ipc->acceptor) { return IPC_LISTENING; } else { return IPC_NOT_CONNECTED; } }
flib_ini *flib_ini_load(const char *filename) { flib_ini *result = NULL; if(!log_badargs_if(filename==NULL)) { flib_ini *tmpIni = flib_calloc(1, sizeof(flib_ini)); if(tmpIni) { tmpIni->inidict = iniparser_load(filename); if(tmpIni->inidict) { result = tmpIni; tmpIni = NULL; } } flib_ini_destroy(tmpIni); } return result; }
flib_weaponset *flib_weaponset_create(const char *name) { flib_weaponset *result = NULL; if(!log_badargs_if(name==NULL)) { flib_weaponset *newSet = flib_calloc(1, sizeof(flib_weaponset)); if(newSet) { newSet->name = flib_strdupnull(name); if(newSet->name) { setField(newSet->loadout, "", 0, false); setField(newSet->crateprob, "", 0, false); setField(newSet->crateammo, "", 0, false); setField(newSet->delay, "", 0, false); result = newSet; newSet = NULL; } } flib_weaponset_destroy(newSet); } return result; }
flib_weaponsetlist *flib_weaponsetlist_from_ini(const char *filename) { flib_weaponsetlist *result = NULL; if(!log_badargs_if(filename==NULL)) { flib_ini *ini = flib_ini_load(filename); if(!ini) { flib_log_e("Missing file %s.", filename); } else if(flib_ini_enter_section(ini, "General")) { flib_log_e("Missing section \"General\" in file %s.", filename); } else { flib_weaponsetlist *tmpList = flib_weaponsetlist_create(); if(tmpList && !fillWeaponsetsFromIni(tmpList, ini)) { result = tmpList; tmpList = NULL; } flib_weaponsetlist_destroy(tmpList); } flib_ini_destroy(ini); } return result; }
flib_scheme *flib_scheme_create(const char *schemeName) { flib_scheme *result = flib_calloc(1, sizeof(flib_scheme)); if(log_badargs_if(schemeName==NULL) || result==NULL) { return NULL; } result->name = flib_strdupnull(schemeName); result->mods = flib_calloc(flib_meta.modCount, sizeof(*result->mods)); result->settings = flib_calloc(flib_meta.settingCount, sizeof(*result->settings)); if(!result->mods || !result->settings || !result->name) { flib_scheme_destroy(result); return NULL; } for(int i=0; i<flib_meta.settingCount; i++) { result->settings[i] = flib_meta.settings[i].def; } return result; }
int flib_ipc_append_style(flib_vector *vec, const char *style) { int result = -1; char *copy = flib_strdupnull(style); if(!log_badargs_if(vec==NULL) && copy) { if(!strcmp("Normal", copy)) { // "Normal" means no gametype script // TODO if an empty script called "Normal" is added to the scripts directory this can be removed result = 0; } else { size_t len = strlen(copy); for(size_t i=0; i<len; i++) { if(copy[i] == ' ') { copy[i] = '_'; } } result = flib_ipc_append_message(vec, "escript %s%s.lua", MULTIPLAYER_SCRIPT_PATH, copy); } } free(copy); return result; }
int flib_ini_get_sectioncount(flib_ini *ini) { if(!log_badargs_if(ini==NULL)) { return iniparser_getnsec(ini->inidict); } return INI_ERROR_OTHER; }
flib_team *flib_team_from_ini(const char *filename) { if(log_badargs_if(filename==NULL)) { return NULL; } flib_team *result = flib_calloc(1, sizeof(flib_team)); flib_ini *ini = NULL; if(!result) { return from_ini_handleError(result, ini); } ini = flib_ini_load(filename); if(!ini) { flib_log_e("Error loading team file %s", filename); return from_ini_handleError(result, ini); } if(flib_ini_enter_section(ini, "team")) { flib_log_e("Missing section \"Team\" in team file %s", filename); return from_ini_handleError(result, ini); } bool error = false; error |= flib_ini_get_str(ini, &result->name, "name"); error |= flib_ini_get_str(ini, &result->grave, "grave"); error |= flib_ini_get_str(ini, &result->fort, "fort"); error |= flib_ini_get_str(ini, &result->voicepack, "voicepack"); error |= flib_ini_get_str(ini, &result->flag, "flag"); error |= flib_ini_get_int(ini, &result->rounds, "rounds"); error |= flib_ini_get_int(ini, &result->wins, "wins"); error |= flib_ini_get_int(ini, &result->campaignProgress, "campaignprogress"); int difficulty = 0; error |= flib_ini_get_int(ini, &difficulty, "difficulty"); if(error) { flib_log_e("Missing or malformed entry in section \"Team\" in file %s", filename); return from_ini_handleError(result, ini); } for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) { char sectionName[32]; if(snprintf(sectionName, sizeof(sectionName), "hedgehog%i", i) <= 0) { return from_ini_handleError(result, ini); } if(flib_ini_enter_section(ini, sectionName)) { flib_log_e("Missing section \"%s\" in team file %s", sectionName, filename); return from_ini_handleError(result, ini); } flib_hog *hog = &result->hogs[i]; error |= flib_ini_get_str(ini, &hog->name, "name"); error |= flib_ini_get_str(ini, &hog->hat, "hat"); error |= flib_ini_get_int(ini, &hog->rounds, "rounds"); error |= flib_ini_get_int(ini, &hog->kills, "kills"); error |= flib_ini_get_int(ini, &hog->deaths, "deaths"); error |= flib_ini_get_int(ini, &hog->suicides, "suicides"); result->hogs[i].difficulty = difficulty; result->hogs[i].initialHealth = TEAM_DEFAULT_HEALTH; if(error) { flib_log_e("Missing or malformed entry in section \"%s\" in file %s", sectionName, filename); return from_ini_handleError(result, ini); } } if(!flib_ini_enter_section(ini, "binds")) { result->bindingCount = flib_ini_get_keycount(ini); if(result->bindingCount<0) { flib_log_e("Error reading bindings from file %s", filename); result->bindingCount = 0; } result->bindings = flib_calloc(result->bindingCount, sizeof(flib_binding)); if(!result->bindings) { return from_ini_handleError(result, ini); } for(int i=0; i<result->bindingCount; i++) { char *keyname = flib_ini_get_keyname(ini, i); if(!keyname) { error = true; } else { result->bindings[i].action = flib_urldecode(keyname); error |= !result->bindings[i].action; error |= flib_ini_get_str(ini, &result->bindings[i].binding, keyname); } free(keyname); } } if(error) { flib_log_e("Error reading team file %s", filename); return from_ini_handleError(result, ini); } flib_ini_destroy(ini); return result; }
uint16_t flib_ipcbase_port(flib_ipcbase *ipc) { if(log_badargs_if(ipc==NULL)) { return 0; } return ipc->port; }