--- a/project_files/frontlib/frontlib.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/frontlib.c Tue Jul 10 19:33:57 2012 +0200
@@ -21,7 +21,7 @@
#include "util/logging.h"
#include <SDL_net.h>
-int flib_init(int flags) {
+int flib_init() {
flib_log_d("Initializing frontlib");
if(SDLNet_Init()==-1) {
flib_log_e("Error in SDLNet_Init: %s", SDLNet_GetError());
--- a/project_files/frontlib/frontlib.h Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/frontlib.h Tue Jul 10 19:33:57 2012 +0200
@@ -29,20 +29,13 @@
#include "ipc/gameconn.h"
#include "ipc/mapconn.h"
#include "net/netconn.h"
-
-#define FRONTLIB_SDL_ALREADY_INITIALIZED 1
+#include "util/logging.h"
/**
* Call this function before anything else in this library.
- *
- * If the calling program uses SDL, it needs to call SDL_Init before initializing
- * this library and then pass FRONTLIB_SDL_ALREADY_INITIALIZED as flag to this function.
- *
- * Otherwise, pass 0 to let this library handle SDL_Init an SDL_Quit itself.
- *
* Returns 0 on success, -1 on error.
*/
-int flib_init(int flags);
+int flib_init();
/**
* Free resources associated with the library. Call this function once
--- a/project_files/frontlib/ipc/gameconn.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/ipc/gameconn.c Tue Jul 10 19:33:57 2012 +0200
@@ -54,7 +54,7 @@
void (*onChatCb)(void* context, const char *msg, bool teamchat);
void *onChatCtx;
- void (*onGameRecordedCb)(void *context, const uint8_t *record, int size, bool isSavegame);
+ void (*onGameRecordedCb)(void *context, const uint8_t *record, size_t size, bool isSavegame);
void *onGameRecordedCtx;
void (*onEngineMessageCb)(void *context, const uint8_t *em, size_t size);
@@ -64,22 +64,17 @@
bool destroyRequested;
};
-static void defaultCallback_onConnect(void* context) {}
-static void defaultCallback_onDisconnect(void* context, int reason) {}
static void defaultCallback_onErrorMessage(void* context, const char *msg) {
flib_log_w("Error from engine (no callback set): %s", msg);
}
-static void defaultCallback_onChat(void* context, const char *msg, bool teamchat) {}
-static void defaultCallback_onGameRecorded(void *context, const uint8_t *record, int size, bool isSavegame) {}
-static void defaultCallback_onEngineMessage(void *context, const uint8_t *em, size_t size) {}
static void clearCallbacks(flib_gameconn *conn) {
- conn->onConnectCb = &defaultCallback_onConnect;
- conn->onDisconnectCb = &defaultCallback_onDisconnect;
- conn->onErrorMessageCb = &defaultCallback_onErrorMessage;
- conn->onChatCb = &defaultCallback_onChat;
- conn->onGameRecordedCb = &defaultCallback_onGameRecorded;
- conn->onEngineMessageCb = &defaultCallback_onEngineMessage;
+ flib_gameconn_onConnect(conn, NULL, NULL);
+ flib_gameconn_onDisconnect(conn, NULL, NULL);
+ flib_gameconn_onErrorMessage(conn, NULL, NULL);
+ flib_gameconn_onChat(conn, NULL, NULL);
+ flib_gameconn_onGameRecorded(conn, NULL, NULL);
+ flib_gameconn_onEngineMessage(conn, NULL, NULL);
}
static flib_gameconn *flib_gameconn_create_partial(bool record, const char *playerName, bool netGame) {
@@ -312,7 +307,7 @@
GENERATE_CB_SETTER_AND_DEFAULT(onDisconnect, (void* context, int reason));
GENERATE_CB_SETTER(onErrorMessage, (void* context, const char *msg), defaultCallback_onErrorMessage);
GENERATE_CB_SETTER_AND_DEFAULT(onChat, (void* context, const char *msg, bool teamchat));
-GENERATE_CB_SETTER_AND_DEFAULT(onGameRecorded, (void *context, const uint8_t *record, int size, bool isSavegame));
+GENERATE_CB_SETTER_AND_DEFAULT(onGameRecorded, (void *context, const uint8_t *record, size_t size, bool isSavegame));
GENERATE_CB_SETTER_AND_DEFAULT(onEngineMessage, (void *context, const uint8_t *em, size_t size));
#undef GENERATE_CB_SETTER_AND_DEFAULT
--- a/project_files/frontlib/ipc/gameconn.h Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/ipc/gameconn.h Tue Jul 10 19:33:57 2012 +0200
@@ -81,7 +81,7 @@
* Called when the game ends
* handleGameRecorded(void *context, const uint8_t *record, int size, bool isSavegame)
*/
-void flib_gameconn_onGameRecorded(flib_gameconn *conn, void (*callback)(void *context, const uint8_t *record, int size, bool isSavegame), void* context);
+void flib_gameconn_onGameRecorded(flib_gameconn *conn, void (*callback)(void *context, const uint8_t *record, size_t size, bool isSavegame), void* context);
/**
* Called when the game ends
--- a/project_files/frontlib/ipc/ipcprotocol.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/ipc/ipcprotocol.c Tue Jul 10 19:33:57 2012 +0200
@@ -131,7 +131,7 @@
return result;
}
-static uint32_t buildModFlags(const flib_cfg *scheme) {
+static uint32_t buildModFlags(const flib_scheme *scheme) {
uint32_t result = 0;
for(int i=0; i<scheme->meta->modCount; i++) {
if(scheme->mods[i]) {
@@ -142,11 +142,11 @@
return result;
}
-int flib_ipc_append_gamescheme(flib_vector *vec, const flib_cfg *scheme) {
+int flib_ipc_append_gamescheme(flib_vector *vec, const flib_scheme *scheme) {
int result = -1;
flib_vector *tempvector = flib_vector_create();
if(!log_badargs_if2(vec==NULL, scheme==NULL) && tempvector) {
- const flib_cfg_meta *meta = scheme->meta;
+ const flib_metascheme *meta = scheme->meta;
bool error = false;
error |= flib_ipc_append_message(tempvector, "e$gmflags %"PRIu32, buildModFlags(scheme));
for(int i=0; i<meta->settingCount; i++) {
@@ -263,9 +263,9 @@
}
if(setup->gamescheme) {
error |= flib_ipc_append_gamescheme(tempvector, setup->gamescheme);
- sharedAmmo = flib_cfg_get_mod(setup->gamescheme, "sharedammo");
+ sharedAmmo = flib_scheme_get_mod(setup->gamescheme, "sharedammo");
// Shared ammo has priority over per-hog ammo
- perHogAmmo = !sharedAmmo && flib_cfg_get_mod(setup->gamescheme, "perhogammo");
+ perHogAmmo = !sharedAmmo && flib_scheme_get_mod(setup->gamescheme, "perhogammo");
}
if(setup->teamlist->teams && setup->teamlist->teamCount>0) {
int *clanColors = flib_calloc(setup->teamlist->teamCount, sizeof(int));
--- a/project_files/frontlib/ipc/ipcprotocol.h Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/ipc/ipcprotocol.h Tue Jul 10 19:33:57 2012 +0200
@@ -23,7 +23,7 @@
#include "../util/buffer.h"
#include "../model/map.h"
#include "../model/team.h"
-#include "../model/cfg.h"
+#include "../model/scheme.h"
#include "../model/gamesetup.h"
#include <stdbool.h>
@@ -71,7 +71,7 @@
* Returns nonzero if something goes wrong. In that case the buffer
* contents are unaffected.
*/
-int flib_ipc_append_gamescheme(flib_vector *vec, const flib_cfg *cfg);
+int flib_ipc_append_gamescheme(flib_vector *vec, const flib_scheme *cfg);
int flib_ipc_append_addteam(flib_vector *vec, const flib_team *team, bool perHogAmmo, bool noAmmoStore);
--- a/project_files/frontlib/model/cfg.c Thu Jul 05 22:22:48 2012 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,237 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (C) 2012 Simeon Maxein <smaxein@googlemail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include "cfg.h"
-
-#include "../util/inihelper.h"
-#include "../util/logging.h"
-#include "../util/util.h"
-#include "../util/refcounter.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <string.h>
-
-static void flib_cfg_meta_destroy(flib_cfg_meta *cfg) {
- if(cfg) {
- if(cfg->settings) {
- for(int i=0; i<cfg->settingCount; i++) {
- free(cfg->settings[i].name);
- free(cfg->settings[i].engineCommand);
- }
- free(cfg->settings);
- }
- if(cfg->mods) {
- for(int i=0; i<cfg->modCount; i++) {
- free(cfg->mods[i].name);
- }
- free(cfg->mods);
- }
- free(cfg);
- }
-}
-
-static void flib_cfg_destroy(flib_cfg* cfg) {
- if(cfg) {
- flib_cfg_meta_release(cfg->meta);
- free(cfg->mods);
- free(cfg->settings);
- free(cfg->name);
- free(cfg);
- }
-}
-
-static flib_cfg_meta *flib_cfg_meta_from_ini_handleError(flib_cfg_meta *result, flib_ini *ini) {
- flib_cfg_meta_destroy(result);
- flib_ini_destroy(ini);
- return NULL;
-}
-
-static int readMetaSettingSections(flib_ini *ini, flib_cfg_meta *result, int limit) {
- while(result->settingCount<limit) {
- char sectionName[32];
- if(snprintf(sectionName, sizeof(sectionName), "setting%i", result->settingCount) <= 0) {
- return -1;
- }
- if(!flib_ini_enter_section(ini, sectionName)) {
- flib_cfg_setting_meta *metasetting = &result->settings[result->settingCount];
- result->settingCount++;
-
- bool error = false;
- error |= flib_ini_get_str(ini, &metasetting->name, "name");
- error |= flib_ini_get_str_opt(ini, &metasetting->engineCommand, "command", NULL);
- error |= flib_ini_get_bool(ini, &metasetting->times1000, "times1000");
- error |= flib_ini_get_bool(ini, &metasetting->maxMeansInfinity, "maxmeansinfinity");
- error |= flib_ini_get_int(ini, &metasetting->min, "min");
- error |= flib_ini_get_int(ini, &metasetting->max, "max");
- error |= flib_ini_get_int(ini, &metasetting->def, "default");
- if(error) {
- flib_log_e("Missing or malformed ini parameter in metaconfig, section %s", sectionName);
- return -1;
- }
- } else {
- return 0;
- }
- }
- return 0;
-}
-
-static int readMetaModSections(flib_ini *ini, flib_cfg_meta *result, int limit) {
- while(result->modCount<limit) {
- char sectionName[32];
- if(snprintf(sectionName, sizeof(sectionName), "mod%i", result->modCount) <= 0) {
- return -1;
- }
- if(!flib_ini_enter_section(ini, sectionName)) {
- flib_cfg_mod_meta *metamod = &result->mods[result->modCount];
- result->modCount++;
-
- bool error = false;
- error |= flib_ini_get_str(ini, &metamod->name, "name");
- error |= flib_ini_get_int(ini, &metamod->bitmaskIndex, "bitmaskIndex");
- if(error) {
- flib_log_e("Missing or malformed ini parameter in metaconfig, section %s", sectionName);
- return -1;
- }
- } else {
- return 0;
- }
- }
- return 0;
-}
-
-flib_cfg_meta *flib_cfg_meta_from_ini(const char *filename) {
- if(log_badargs_if(filename==NULL)) {
- return NULL;
- }
- flib_cfg_meta *result = flib_cfg_meta_retain(flib_calloc(1, sizeof(flib_cfg_meta)));
- flib_ini *ini = flib_ini_load(filename);
-
- if(!result || !ini) {
- return flib_cfg_meta_from_ini_handleError(result, ini);
- }
-
- // We're overallocating here for simplicity
- int sectionCount = flib_ini_get_sectioncount(ini);
- result->settingCount = 0;
- result->modCount = 0;
- result->settings = flib_calloc(sectionCount, sizeof(flib_cfg_setting_meta));
- result->mods = flib_calloc(sectionCount, sizeof(flib_cfg_mod_meta));
-
- if(!result->settings || !result->mods) {
- return flib_cfg_meta_from_ini_handleError(result, ini);
- }
-
- if(readMetaSettingSections(ini, result, sectionCount) || readMetaModSections(ini, result, sectionCount)) {
- return flib_cfg_meta_from_ini_handleError(result, ini);
- }
-
- if(result->settingCount+result->modCount != sectionCount) {
- flib_log_e("Unknown or non-contiguous sections headers in metaconfig.");
- return flib_cfg_meta_from_ini_handleError(result, ini);
- }
-
- flib_ini_destroy(ini);
- return result;
-}
-
-flib_cfg_meta *flib_cfg_meta_retain(flib_cfg_meta *metainfo) {
- if(metainfo) {
- flib_retain(&metainfo->_referenceCount, "flib_cfg_meta");
- }
- return metainfo;
-}
-
-void flib_cfg_meta_release(flib_cfg_meta *cfg) {
- if(cfg && flib_release(&cfg->_referenceCount, "flib_cfg_meta")) {
- flib_cfg_meta_destroy(cfg);
- }
-}
-
-flib_cfg *flib_cfg_create(flib_cfg_meta *meta, const char *schemeName) {
- flib_cfg *result = flib_cfg_retain(flib_calloc(1, sizeof(flib_cfg)));
- if(log_badargs_if2(meta==NULL, schemeName==NULL) || result==NULL) {
- return NULL;
- }
-
- result->meta = flib_cfg_meta_retain(meta);
- result->name = flib_strdupnull(schemeName);
- result->mods = flib_calloc(meta->modCount, sizeof(*result->mods));
- result->settings = flib_calloc(meta->settingCount, sizeof(*result->settings));
-
- if(!result->mods || !result->settings || !result->name) {
- flib_cfg_destroy(result);
- return NULL;
- }
-
- for(int i=0; i<meta->settingCount; i++) {
- result->settings[i] = meta->settings[i].def;
- }
- return result;
-}
-
-flib_cfg *flib_cfg_copy(const flib_cfg *cfg) {
- flib_cfg *result = NULL;
- if(cfg) {
- result = flib_cfg_create(cfg->meta, cfg->name);
- if(result) {
- memcpy(result->mods, cfg->mods, cfg->meta->modCount * sizeof(*cfg->mods));
- memcpy(result->settings, cfg->settings, cfg->meta->settingCount * sizeof(*cfg->settings));
- }
- }
- return result;
-}
-
-flib_cfg *flib_cfg_retain(flib_cfg *cfg) {
- if(cfg) {
- flib_retain(&cfg->_referenceCount, "flib_cfg");
- }
- return cfg;
-}
-
-void flib_cfg_release(flib_cfg *cfg) {
- if(cfg && flib_release(&cfg->_referenceCount, "flib_cfg")) {
- flib_cfg_destroy(cfg);
- }
-}
-
-bool flib_cfg_get_mod(flib_cfg *cfg, const char *name) {
- if(!log_badargs_if2(cfg==NULL, name==NULL)) {
- for(int i=0; i<cfg->meta->modCount; i++) {
- if(!strcmp(cfg->meta->mods[i].name, name)) {
- return cfg->mods[i];
- }
- }
- flib_log_e("Unable to find game mod %s", name);
- }
- return false;
-}
-
-int flib_cfg_get_setting(flib_cfg *cfg, const char *name, int def) {
- if(!log_badargs_if2(cfg==NULL, name==NULL)) {
- for(int i=0; i<cfg->meta->settingCount; i++) {
- if(!strcmp(cfg->meta->settings[i].name, name)) {
- return cfg->settings[i];
- }
- }
- flib_log_e("Unable to find game setting %s", name);
- }
- return def;
-}
--- a/project_files/frontlib/model/cfg.h Thu Jul 05 22:22:48 2012 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,118 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (C) 2012 Simeon Maxein <smaxein@googlemail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-/**
- * Data structures for game scheme information.
- */
-
-#ifndef CFG_H_
-#define CFG_H_
-
-#include <stdbool.h>
-
-// TODO: cfg/config -> scheme
-
-typedef struct {
- char *name;
- char *engineCommand;
- bool maxMeansInfinity;
- bool times1000;
- int min;
- int max;
- int def;
-} flib_cfg_setting_meta;
-
-typedef struct {
- char *name;
- int bitmaskIndex;
-} flib_cfg_mod_meta;
-
-/**
- * The order of the meta information in the arrays is the same as the order
- * of the mod/setting information in the net protocol messages.
- */
-typedef struct {
- int _referenceCount;
- int settingCount;
- int modCount;
- flib_cfg_setting_meta *settings;
- flib_cfg_mod_meta *mods;
-} flib_cfg_meta;
-
-typedef struct {
- int _referenceCount;
- flib_cfg_meta *meta;
-
- char *name;
- int *settings;
- bool *mods;
-} flib_cfg;
-
-/**
- * Read the meta-configuration from a .ini file (e.g. which settings exist,
- * what are their defaults etc.)
- *
- * Returns the meta-configuration or NULL.
- */
-flib_cfg_meta *flib_cfg_meta_from_ini(const char *filename);
-
-/**
- * Increase the reference count of the object. Call this if you store a pointer to it somewhere.
- * Returns the parameter.
- */
-flib_cfg_meta *flib_cfg_meta_retain(flib_cfg_meta *metainfo);
-
-/**
- * Decrease the reference count of the object and free it if this was the last reference.
- */
-void flib_cfg_meta_release(flib_cfg_meta *metainfo);
-
-/**
- * Create a new configuration with everything set to default or false
- * Returns NULL on error.
- */
-flib_cfg *flib_cfg_create(flib_cfg_meta *meta, const char *schemeName);
-
-/**
- * Create a copy of the scheme. Returns NULL on error or if NULL was passed.
- */
-flib_cfg *flib_cfg_copy(const flib_cfg *cfg);
-
-/**
- * Increase the reference count of the object. Call this if you store a pointer to it somewhere.
- * Returns the parameter.
- */
-flib_cfg *flib_cfg_retain(flib_cfg *cfg);
-
-/**
- * Decrease the reference count of the object and free it if this was the last reference.
- */
-void flib_cfg_release(flib_cfg* cfg);
-
-/**
- * Retrieve a mod setting by its name. If the mod is not found, logs an error and returns false.
- */
-bool flib_cfg_get_mod(flib_cfg *cfg, const char *name);
-
-/**
- * Retrieve a game setting by its name. If the setting is not found, logs an error and returns def.
- */
-int flib_cfg_get_setting(flib_cfg *cfg, const char *name, int def);
-
-#endif /* CFG_H_ */
--- a/project_files/frontlib/model/gamesetup.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/model/gamesetup.c Tue Jul 10 19:33:57 2012 +0200
@@ -25,7 +25,7 @@
void flib_gamesetup_destroy(flib_gamesetup *gamesetup) {
if(gamesetup) {
free(gamesetup->script);
- flib_cfg_release(gamesetup->gamescheme);
+ flib_scheme_release(gamesetup->gamescheme);
flib_map_release(gamesetup->map);
flib_teamlist_destroy(gamesetup->teamlist);
free(gamesetup);
@@ -40,7 +40,7 @@
flib_gamesetup *result = flib_calloc(1, sizeof(flib_gamesetup));
if(result) {
result->script = flib_strdupnull(setup->script);
- result->gamescheme = flib_cfg_copy(setup->gamescheme);
+ result->gamescheme = flib_scheme_copy(setup->gamescheme);
result->map = flib_map_copy(setup->map);
result->teamlist = flib_teamlist_copy(setup->teamlist);
if((setup->script && !result->script)
--- a/project_files/frontlib/model/gamesetup.h Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/model/gamesetup.h Tue Jul 10 19:33:57 2012 +0200
@@ -25,14 +25,14 @@
#ifndef MODEL_GAMESETUP_H_
#define MODEL_GAMESETUP_H_
-#include "cfg.h"
+#include "scheme.h"
#include "weapon.h"
#include "map.h"
#include "teamlist.h"
typedef struct {
char *script;
- flib_cfg *gamescheme;
+ flib_scheme *gamescheme;
flib_map *map;
flib_teamlist *teamlist;
} flib_gamesetup;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/frontlib/model/scheme.c Tue Jul 10 19:33:57 2012 +0200
@@ -0,0 +1,237 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (C) 2012 Simeon Maxein <smaxein@googlemail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "scheme.h"
+
+#include "../util/inihelper.h"
+#include "../util/logging.h"
+#include "../util/util.h"
+#include "../util/refcounter.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <string.h>
+
+static void flib_metascheme_destroy(flib_metascheme *meta) {
+ if(meta) {
+ if(meta->settings) {
+ for(int i=0; i<meta->settingCount; i++) {
+ free(meta->settings[i].name);
+ free(meta->settings[i].engineCommand);
+ }
+ free(meta->settings);
+ }
+ if(meta->mods) {
+ for(int i=0; i<meta->modCount; i++) {
+ free(meta->mods[i].name);
+ }
+ free(meta->mods);
+ }
+ free(meta);
+ }
+}
+
+static void flib_scheme_destroy(flib_scheme* scheme) {
+ if(scheme) {
+ flib_metascheme_release(scheme->meta);
+ free(scheme->mods);
+ free(scheme->settings);
+ free(scheme->name);
+ free(scheme);
+ }
+}
+
+static flib_metascheme *flib_metascheme_from_ini_handleError(flib_metascheme *result, flib_ini *ini) {
+ flib_metascheme_destroy(result);
+ flib_ini_destroy(ini);
+ return NULL;
+}
+
+static int readMetaSettingSections(flib_ini *ini, flib_metascheme *result, int limit) {
+ while(result->settingCount<limit) {
+ char sectionName[32];
+ if(snprintf(sectionName, sizeof(sectionName), "setting%i", result->settingCount) <= 0) {
+ return -1;
+ }
+ if(!flib_ini_enter_section(ini, sectionName)) {
+ flib_metascheme_setting *metasetting = &result->settings[result->settingCount];
+ result->settingCount++;
+
+ bool error = false;
+ error |= flib_ini_get_str(ini, &metasetting->name, "name");
+ error |= flib_ini_get_str_opt(ini, &metasetting->engineCommand, "command", NULL);
+ error |= flib_ini_get_bool(ini, &metasetting->times1000, "times1000");
+ error |= flib_ini_get_bool(ini, &metasetting->maxMeansInfinity, "maxmeansinfinity");
+ error |= flib_ini_get_int(ini, &metasetting->min, "min");
+ error |= flib_ini_get_int(ini, &metasetting->max, "max");
+ error |= flib_ini_get_int(ini, &metasetting->def, "default");
+ if(error) {
+ flib_log_e("Missing or malformed ini parameter in metaconfig, section %s", sectionName);
+ return -1;
+ }
+ } else {
+ return 0;
+ }
+ }
+ return 0;
+}
+
+static int readMetaModSections(flib_ini *ini, flib_metascheme *result, int limit) {
+ while(result->modCount<limit) {
+ char sectionName[32];
+ if(snprintf(sectionName, sizeof(sectionName), "mod%i", result->modCount) <= 0) {
+ return -1;
+ }
+ if(!flib_ini_enter_section(ini, sectionName)) {
+ flib_metascheme_mod *metamod = &result->mods[result->modCount];
+ result->modCount++;
+
+ bool error = false;
+ error |= flib_ini_get_str(ini, &metamod->name, "name");
+ error |= flib_ini_get_int(ini, &metamod->bitmaskIndex, "bitmaskIndex");
+ if(error) {
+ flib_log_e("Missing or malformed ini parameter in metaconfig, section %s", sectionName);
+ return -1;
+ }
+ } else {
+ return 0;
+ }
+ }
+ return 0;
+}
+
+flib_metascheme *flib_metascheme_from_ini(const char *filename) {
+ if(log_badargs_if(filename==NULL)) {
+ return NULL;
+ }
+ flib_metascheme *result = flib_metascheme_retain(flib_calloc(1, sizeof(flib_metascheme)));
+ flib_ini *ini = flib_ini_load(filename);
+
+ if(!result || !ini) {
+ return flib_metascheme_from_ini_handleError(result, ini);
+ }
+
+ // We're overallocating here for simplicity
+ int sectionCount = flib_ini_get_sectioncount(ini);
+ result->settingCount = 0;
+ result->modCount = 0;
+ result->settings = flib_calloc(sectionCount, sizeof(flib_metascheme_setting));
+ result->mods = flib_calloc(sectionCount, sizeof(flib_metascheme_mod));
+
+ if(!result->settings || !result->mods) {
+ return flib_metascheme_from_ini_handleError(result, ini);
+ }
+
+ if(readMetaSettingSections(ini, result, sectionCount) || readMetaModSections(ini, result, sectionCount)) {
+ return flib_metascheme_from_ini_handleError(result, ini);
+ }
+
+ if(result->settingCount+result->modCount != sectionCount) {
+ flib_log_e("Unknown or non-contiguous sections headers in metaconfig.");
+ return flib_metascheme_from_ini_handleError(result, ini);
+ }
+
+ flib_ini_destroy(ini);
+ return result;
+}
+
+flib_metascheme *flib_metascheme_retain(flib_metascheme *metainfo) {
+ if(metainfo) {
+ flib_retain(&metainfo->_referenceCount, "flib_metascheme");
+ }
+ return metainfo;
+}
+
+void flib_metascheme_release(flib_metascheme *meta) {
+ if(meta && flib_release(&meta->_referenceCount, "flib_metascheme")) {
+ flib_metascheme_destroy(meta);
+ }
+}
+
+flib_scheme *flib_scheme_create(flib_metascheme *meta, const char *schemeName) {
+ flib_scheme *result = flib_scheme_retain(flib_calloc(1, sizeof(flib_scheme)));
+ if(log_badargs_if2(meta==NULL, schemeName==NULL) || result==NULL) {
+ return NULL;
+ }
+
+ result->meta = flib_metascheme_retain(meta);
+ result->name = flib_strdupnull(schemeName);
+ result->mods = flib_calloc(meta->modCount, sizeof(*result->mods));
+ result->settings = flib_calloc(meta->settingCount, sizeof(*result->settings));
+
+ if(!result->mods || !result->settings || !result->name) {
+ flib_scheme_destroy(result);
+ return NULL;
+ }
+
+ for(int i=0; i<meta->settingCount; i++) {
+ result->settings[i] = meta->settings[i].def;
+ }
+ return result;
+}
+
+flib_scheme *flib_scheme_copy(const flib_scheme *scheme) {
+ flib_scheme *result = NULL;
+ if(scheme) {
+ result = flib_scheme_create(scheme->meta, scheme->name);
+ if(result) {
+ memcpy(result->mods, scheme->mods, scheme->meta->modCount * sizeof(*scheme->mods));
+ memcpy(result->settings, scheme->settings, scheme->meta->settingCount * sizeof(*scheme->settings));
+ }
+ }
+ return result;
+}
+
+flib_scheme *flib_scheme_retain(flib_scheme *scheme) {
+ if(scheme) {
+ flib_retain(&scheme->_referenceCount, "flib_scheme");
+ }
+ return scheme;
+}
+
+void flib_scheme_release(flib_scheme *scheme) {
+ if(scheme && flib_release(&scheme->_referenceCount, "flib_scheme")) {
+ flib_scheme_destroy(scheme);
+ }
+}
+
+bool flib_scheme_get_mod(flib_scheme *scheme, const char *name) {
+ if(!log_badargs_if2(scheme==NULL, name==NULL)) {
+ for(int i=0; i<scheme->meta->modCount; i++) {
+ if(!strcmp(scheme->meta->mods[i].name, name)) {
+ return scheme->mods[i];
+ }
+ }
+ flib_log_e("Unable to find game mod %s", name);
+ }
+ return false;
+}
+
+int flib_scheme_get_setting(flib_scheme *scheme, const char *name, int def) {
+ if(!log_badargs_if2(scheme==NULL, name==NULL)) {
+ for(int i=0; i<scheme->meta->settingCount; i++) {
+ if(!strcmp(scheme->meta->settings[i].name, name)) {
+ return scheme->settings[i];
+ }
+ }
+ flib_log_e("Unable to find game setting %s", name);
+ }
+ return def;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/frontlib/model/scheme.h Tue Jul 10 19:33:57 2012 +0200
@@ -0,0 +1,116 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (C) 2012 Simeon Maxein <smaxein@googlemail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * Data structures for game scheme information.
+ */
+
+#ifndef SCHEME_H_
+#define SCHEME_H_
+
+#include <stdbool.h>
+
+typedef struct {
+ char *name;
+ char *engineCommand;
+ bool maxMeansInfinity;
+ bool times1000;
+ int min;
+ int max;
+ int def;
+} flib_metascheme_setting;
+
+typedef struct {
+ char *name;
+ int bitmaskIndex;
+} flib_metascheme_mod;
+
+/**
+ * The order of the meta information in the arrays is the same as the order
+ * of the mod/setting information in the net protocol messages.
+ */
+typedef struct {
+ int _referenceCount;
+ int settingCount;
+ int modCount;
+ flib_metascheme_setting *settings;
+ flib_metascheme_mod *mods;
+} flib_metascheme;
+
+typedef struct {
+ int _referenceCount;
+ flib_metascheme *meta;
+
+ char *name;
+ int *settings;
+ bool *mods;
+} flib_scheme;
+
+/**
+ * Read the meta-configuration from a .ini file (e.g. which settings exist,
+ * what are their defaults etc.)
+ *
+ * Returns the meta-configuration or NULL.
+ */
+flib_metascheme *flib_metascheme_from_ini(const char *filename);
+
+/**
+ * Increase the reference count of the object. Call this if you store a pointer to it somewhere.
+ * Returns the parameter.
+ */
+flib_metascheme *flib_metascheme_retain(flib_metascheme *metainfo);
+
+/**
+ * Decrease the reference count of the object and free it if this was the last reference.
+ */
+void flib_metascheme_release(flib_metascheme *metainfo);
+
+/**
+ * Create a new configuration with everything set to default or false
+ * Returns NULL on error.
+ */
+flib_scheme *flib_scheme_create(flib_metascheme *meta, const char *schemeName);
+
+/**
+ * Create a copy of the scheme. Returns NULL on error or if NULL was passed.
+ */
+flib_scheme *flib_scheme_copy(const flib_scheme *scheme);
+
+/**
+ * Increase the reference count of the object. Call this if you store a pointer to it somewhere.
+ * Returns the parameter.
+ */
+flib_scheme *flib_scheme_retain(flib_scheme *scheme);
+
+/**
+ * Decrease the reference count of the object and free it if this was the last reference.
+ */
+void flib_scheme_release(flib_scheme* scheme);
+
+/**
+ * Retrieve a mod setting by its name. If the mod is not found, logs an error and returns false.
+ */
+bool flib_scheme_get_mod(flib_scheme *scheme, const char *name);
+
+/**
+ * Retrieve a game setting by its name. If the setting is not found, logs an error and returns def.
+ */
+int flib_scheme_get_setting(flib_scheme *scheme, const char *name, int def);
+
+#endif /* SCHEME_H_ */
--- a/project_files/frontlib/model/schemelist.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/model/schemelist.c Tue Jul 10 19:33:57 2012 +0200
@@ -33,7 +33,7 @@
static void flib_schemelist_destroy(flib_schemelist *list) {
if(list) {
for(int i=0; i<list->schemeCount; i++) {
- flib_cfg_release(list->schemes[i]);
+ flib_scheme_release(list->schemes[i]);
}
free(list->schemes);
free(list);
@@ -44,8 +44,8 @@
return flib_asprintf("%i\\%s", schemeIndex, settingName);
}
-static int readSettingsFromIni(flib_ini *ini, flib_cfg *scheme, int index) {
- flib_cfg_meta *meta = scheme->meta;
+static int readSettingsFromIni(flib_ini *ini, flib_scheme *scheme, int index) {
+ flib_metascheme *meta = scheme->meta;
bool error = false;
for(int i=0; i<meta->settingCount && !error; i++) {
char *key = makePrefixedName(index, meta->settings[i].name);
@@ -60,8 +60,8 @@
return error;
}
-static int readModsFromIni(flib_ini *ini, flib_cfg *scheme, int index) {
- flib_cfg_meta *meta = scheme->meta;
+static int readModsFromIni(flib_ini *ini, flib_scheme *scheme, int index) {
+ flib_metascheme *meta = scheme->meta;
bool error = false;
for(int i=0; i<meta->modCount && !error; i++) {
char *key = makePrefixedName(index, meta->mods[i].name);
@@ -76,19 +76,19 @@
return error;
}
-static flib_cfg *readSchemeFromIni(flib_cfg_meta *meta, flib_ini *ini, int index) {
- flib_cfg *result = NULL;
+static flib_scheme *readSchemeFromIni(flib_metascheme *meta, flib_ini *ini, int index) {
+ flib_scheme *result = NULL;
char *schemeNameKey = makePrefixedName(index+1, "name");
if(schemeNameKey) {
char *schemeName = NULL;
if(!flib_ini_get_str_opt(ini, &schemeName, schemeNameKey, "Unnamed")) {
- flib_cfg *scheme = flib_cfg_create(meta, schemeName);
+ flib_scheme *scheme = flib_scheme_create(meta, schemeName);
if(scheme) {
if(!readSettingsFromIni(ini, scheme, index) && !readModsFromIni(ini, scheme, index)) {
- result = flib_cfg_retain(scheme);
+ result = flib_scheme_retain(scheme);
}
}
- flib_cfg_release(scheme);
+ flib_scheme_release(scheme);
}
free(schemeName);
}
@@ -102,7 +102,7 @@
return NULL;
}
-flib_schemelist *flib_schemelist_from_ini(flib_cfg_meta *meta, const char *filename) {
+flib_schemelist *flib_schemelist_from_ini(flib_metascheme *meta, const char *filename) {
if(log_badargs_if2(meta==NULL, filename==NULL)) {
return NULL;
}
@@ -126,13 +126,13 @@
}
for(int i=0; i<schemeCount; i++) {
- flib_cfg *scheme = readSchemeFromIni(meta, ini, i);
+ flib_scheme *scheme = readSchemeFromIni(meta, ini, i);
if(!scheme || flib_schemelist_insert(list, scheme, i)) {
- flib_cfg_release(scheme);
+ flib_scheme_release(scheme);
flib_log_e("Error reading scheme %i from config file %s.", i, filename);
return fromIniHandleError(list, ini);
}
- flib_cfg_release(scheme);
+ flib_scheme_release(scheme);
}
@@ -140,8 +140,8 @@
return list;
}
-static int writeSchemeToIni(flib_cfg *scheme, flib_ini *ini, int index) {
- flib_cfg_meta *meta = scheme->meta;
+static int writeSchemeToIni(flib_scheme *scheme, flib_ini *ini, int index) {
+ flib_metascheme *meta = scheme->meta;
bool error = false;
char *key = makePrefixedName(index+1, "name");
@@ -199,7 +199,7 @@
}
}
-flib_cfg *flib_schemelist_find(flib_schemelist *list, const char *name) {
+flib_scheme *flib_schemelist_find(flib_schemelist *list, const char *name) {
if(!log_badargs_if2(list==NULL, name==NULL)) {
for(int i=0; i<list->schemeCount; i++) {
if(!strcmp(name, list->schemes[i]->name)) {
@@ -210,13 +210,13 @@
return NULL;
}
-GENERATE_STATIC_LIST_INSERT(insertScheme, flib_cfg*)
-GENERATE_STATIC_LIST_DELETE(deleteScheme, flib_cfg*)
+GENERATE_STATIC_LIST_INSERT(insertScheme, flib_scheme*)
+GENERATE_STATIC_LIST_DELETE(deleteScheme, flib_scheme*)
-int flib_schemelist_insert(flib_schemelist *list, flib_cfg *cfg, int pos) {
+int flib_schemelist_insert(flib_schemelist *list, flib_scheme *cfg, int pos) {
if(!log_badargs_if2(list==NULL, cfg==NULL)
&& !insertScheme(&list->schemes, &list->schemeCount, cfg, pos)) {
- flib_cfg_retain(cfg);
+ flib_scheme_retain(cfg);
return 0;
}
return -1;
@@ -224,9 +224,9 @@
int flib_schemelist_delete(flib_schemelist *list, int pos) {
if(!log_badargs_if(list==NULL)) {
- flib_cfg *elem = list->schemes[pos];
+ flib_scheme *elem = list->schemes[pos];
if(!deleteScheme(&list->schemes, &list->schemeCount, pos)) {
- flib_cfg_release(elem);
+ flib_scheme_release(elem);
return 0;
}
}
--- a/project_files/frontlib/model/schemelist.h Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/model/schemelist.h Tue Jul 10 19:33:57 2012 +0200
@@ -26,19 +26,19 @@
#ifndef SCHEMELIST_H_
#define SCHEMELIST_H_
-#include "cfg.h"
+#include "scheme.h"
typedef struct {
int _referenceCount;
int schemeCount;
- flib_cfg **schemes;
+ flib_scheme **schemes;
} flib_schemelist;
/**
* Load a list of configurations from the ini file.
* Returns NULL on error.
*/
-flib_schemelist *flib_schemelist_from_ini(flib_cfg_meta *meta, const char *filename);
+flib_schemelist *flib_schemelist_from_ini(flib_metascheme *meta, const char *filename);
/**
* Store the list of configurations to an ini file.
@@ -57,7 +57,7 @@
* The scheme is retained automatically.
* Returns 0 on success.
*/
-int flib_schemelist_insert(flib_schemelist *list, flib_cfg *cfg, int pos);
+int flib_schemelist_insert(flib_schemelist *list, flib_scheme *cfg, int pos);
/**
* Delete a cfg from the list at position pos, moving down all higher schemes.
@@ -69,7 +69,7 @@
/**
* Find the scheme with a specific name
*/
-flib_cfg *flib_schemelist_find(flib_schemelist *list, const char *name);
+flib_scheme *flib_schemelist_find(flib_schemelist *list, const char *name);
/**
* Increase the reference count of the object. Call this if you store a pointer to it somewhere.
--- a/project_files/frontlib/model/team.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/model/team.c Tue Jul 10 19:33:57 2012 +0200
@@ -29,7 +29,7 @@
static flib_team *from_ini_handleError(flib_team *result, flib_ini *settingfile) {
flib_ini_destroy(settingfile);
- flib_team_release(result);
+ flib_team_destroy(result);
return NULL;
}
@@ -38,7 +38,7 @@
return NULL;
}
- flib_team *result = flib_team_retain(flib_calloc(1, sizeof(flib_team)));
+ flib_team *result = flib_calloc(1, sizeof(flib_team));
flib_ini *ini = NULL;
if(!result) {
@@ -130,6 +130,30 @@
return result;
}
+void flib_team_destroy(flib_team *team) {
+ if(team) {
+ for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) {
+ free(team->hogs[i].name);
+ free(team->hogs[i].hat);
+ flib_weaponset_release(team->hogs[i].weaponset);
+ }
+ free(team->name);
+ free(team->grave);
+ free(team->fort);
+ free(team->voicepack);
+ free(team->flag);
+ if(team->bindings) {
+ for(int i=0; i<team->bindingCount; i++) {
+ free(team->bindings[i].action);
+ free(team->bindings[i].binding);
+ }
+ }
+ free(team->bindings);
+ free(team->ownerName);
+ free(team);
+ }
+}
+
static int writeTeamSection(const flib_team *team, flib_ini *ini) {
if(flib_ini_create_section(ini, "team")) {
return -1;
@@ -207,37 +231,6 @@
return result;
}
-flib_team *flib_team_retain(flib_team *team) {
- if(team) {
- flib_retain(&team->_referenceCount, "flib_team");
- }
- return team;
-}
-
-void flib_team_release(flib_team *team) {
- if(team && flib_release(&team->_referenceCount, "flib_team")) {
- for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) {
- free(team->hogs[i].name);
- free(team->hogs[i].hat);
- flib_weaponset_release(team->hogs[i].weaponset);
- }
- free(team->name);
- free(team->grave);
- free(team->fort);
- free(team->voicepack);
- free(team->flag);
- if(team->bindings) {
- for(int i=0; i<team->bindingCount; i++) {
- free(team->bindings[i].action);
- free(team->bindings[i].binding);
- }
- }
- free(team->bindings);
- free(team->ownerName);
- free(team);
- }
-}
-
void flib_team_set_weaponset(flib_team *team, flib_weaponset *set) {
if(team) {
for(int i=0; i<HEDGEHOGS_PER_TEAM; i++) {
@@ -266,7 +259,7 @@
flib_team *flib_team_copy(const flib_team *team) {
flib_team *result = NULL;
if(team) {
- flib_team *tmpTeam = flib_team_retain(flib_calloc(1, sizeof(flib_team)));
+ flib_team *tmpTeam = flib_calloc(1, sizeof(flib_team));
if(tmpTeam) {
bool error = false;
@@ -315,7 +308,7 @@
tmpTeam = 0;
}
}
- flib_team_release(tmpTeam);
+ flib_team_destroy(tmpTeam);
}
return result;
}
--- a/project_files/frontlib/model/team.h Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/model/team.h Tue Jul 10 19:33:57 2012 +0200
@@ -63,7 +63,6 @@
} flib_hog;
typedef struct {
- int _referenceCount;
flib_hog hogs[HEDGEHOGS_PER_TEAM];
char *name;
char *grave;
@@ -95,6 +94,11 @@
flib_team *flib_team_create(const char *name);
/**
+ * Free all memory associated with the team
+ */
+void flib_team_destroy(flib_team *team);
+
+/**
* Loads a team, returns NULL on error.
*/
flib_team *flib_team_from_ini(const char *filename);
@@ -122,17 +126,6 @@
void flib_team_set_health(flib_team *team, int health);
/**
- * Increase the reference count of the object. Call this if you store a pointer to it somewhere.
- * Returns the parameter.
- */
-flib_team *flib_team_retain(flib_team *team);
-
-/**
- * Decrease the reference count of the object and free it if this was the last reference.
- */
-void flib_team_release(flib_team *team);
-
-/**
* Create a deep copy of a team. Returns NULL on failure.
* The referenced weaponsets are not copied, so the new
* team references the same weaponsets.
--- a/project_files/frontlib/model/teamlist.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/model/teamlist.c Tue Jul 10 19:33:57 2012 +0200
@@ -33,7 +33,7 @@
void flib_teamlist_destroy(flib_teamlist *list) {
if(list) {
for(int i=0; i<list->teamCount; i++) {
- flib_team_release(list->teams[i]);
+ flib_team_destroy(list->teams[i]);
}
free(list->teams);
free(list);
@@ -55,7 +55,6 @@
int flib_teamlist_insert(flib_teamlist *list, flib_team *team, int pos) {
if(!log_badargs_if2(list==NULL, team==NULL)
&& !insertTeam(&list->teams, &list->teamCount, team, pos)) {
- flib_team_retain(team);
return 0;
}
return -1;
@@ -68,7 +67,7 @@
if(itemid>=0) {
flib_team *team = list->teams[itemid];
if(!deleteTeam(&list->teams, &list->teamCount, itemid)) {
- flib_team_release(team);
+ flib_team_destroy(team);
result = 0;
}
}
@@ -90,7 +89,7 @@
void flib_teamlist_clear(flib_teamlist *list) {
if(!log_badargs_if(list==NULL)) {
for(int i=0; i<list->teamCount; i++) {
- flib_team_release(list->teams[i]);
+ flib_team_destroy(list->teams[i]);
}
free(list->teams);
list->teams = NULL;
@@ -107,12 +106,10 @@
bool error = false;
for(int i=0; !error && i<list->teamCount; i++) {
flib_team *teamcopy = flib_team_copy(list->teams[i]);
- if(!teamcopy) {
+ if(!teamcopy || flib_teamlist_insert(result, teamcopy, i)) {
+ flib_team_destroy(teamcopy);
error = true;
- } else {
- error |= flib_teamlist_insert(result, teamcopy, i);
}
- flib_team_release(teamcopy);
}
if(error) {
flib_teamlist_destroy(result);
--- a/project_files/frontlib/model/teamlist.h Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/model/teamlist.h Tue Jul 10 19:33:57 2012 +0200
@@ -32,12 +32,12 @@
void flib_teamlist_destroy(flib_teamlist *list);
/**
- * Insert a team into the list. Returns 0 on success.
+ * Insert a team into the list. The list takes ownership of the team. Returns 0 on success.
*/
int flib_teamlist_insert(flib_teamlist *list, flib_team *team, int pos);
/**
- * Delete the item with the name [name] from the list.
+ * Delete the team with the name [name] from the list and destroys it.
* Returns 0 on success.
*/
int flib_teamlist_delete(flib_teamlist *list, const char *name);
@@ -48,7 +48,7 @@
flib_team *flib_teamlist_find(const flib_teamlist *list, const char *name);
/**
- * Removes all items from the list and frees "teams".
+ * Removes all items from the list and destroys them.
*/
void flib_teamlist_clear(flib_teamlist *list);
--- a/project_files/frontlib/model/weapon.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/model/weapon.c Tue Jul 10 19:33:57 2012 +0200
@@ -105,7 +105,7 @@
return result;
}
-static void flib_weaponsetlist_destroy(flib_weaponsetlist *list) {
+void flib_weaponsetlist_destroy(flib_weaponsetlist *list) {
if(list) {
for(int i=0; i<list->weaponsetCount; i++) {
flib_weaponset_release(list->weaponsets[i]);
@@ -167,13 +167,12 @@
} else if(flib_ini_enter_section(ini, "General")) {
flib_log_e("Missing section \"General\" in file %s.", filename);
} else {
- flib_weaponsetlist *list = flib_weaponsetlist_create();
- if(list) {
- if(!fillWeaponsetsFromIni(list, ini)) {
- result = flib_weaponsetlist_retain(list);
- }
+ flib_weaponsetlist *tmpList = flib_weaponsetlist_create();
+ if(tmpList && !fillWeaponsetsFromIni(tmpList, ini)) {
+ result = tmpList;
+ tmpList = NULL;
}
- flib_weaponsetlist_release(list);
+ flib_weaponsetlist_destroy(tmpList);
}
flib_ini_destroy(ini);
}
@@ -220,7 +219,7 @@
}
flib_weaponsetlist *flib_weaponsetlist_create() {
- return flib_weaponsetlist_retain(flib_calloc(1, sizeof(flib_weaponsetlist)));
+ return flib_calloc(1, sizeof(flib_weaponsetlist));
}
GENERATE_STATIC_LIST_INSERT(insertWeaponset, flib_weaponset*)
@@ -245,16 +244,3 @@
}
return -1;
}
-
-flib_weaponsetlist *flib_weaponsetlist_retain(flib_weaponsetlist *list) {
- if(list) {
- flib_retain(&list->_referenceCount, "flib_weaponsetlist");
- }
- return list;
-}
-
-void flib_weaponsetlist_release(flib_weaponsetlist *list) {
- if(list && flib_release(&list->_referenceCount, "flib_weaponsetlist")) {
- flib_weaponsetlist_destroy(list);
- }
-}
--- a/project_files/frontlib/model/weapon.h Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/model/weapon.h Tue Jul 10 19:33:57 2012 +0200
@@ -38,7 +38,6 @@
} flib_weaponset;
typedef struct {
- int _referenceCount;
int weaponsetCount;
flib_weaponset **weaponsets;
} flib_weaponsetlist;
@@ -89,6 +88,11 @@
flib_weaponsetlist *flib_weaponsetlist_create();
/**
+ * Release all memory associated with the weaponsetlist and release all contained weaponsets
+ */
+void flib_weaponsetlist_destroy(flib_weaponsetlist *list);
+
+/**
* Insert a new weaponset into the list at position pos, moving all higher weaponsets to make place.
* pos must be at least 0 (insert at the start) and at most list->weaponsetCount (insert at the end).
* The weaponset is retained automatically.
@@ -103,15 +107,4 @@
*/
int flib_weaponsetlist_delete(flib_weaponsetlist *list, int pos);
-/**
- * Increase the reference count of the object. Call this if you store a pointer to it somewhere.
- * Returns the parameter.
- */
-flib_weaponsetlist *flib_weaponsetlist_retain(flib_weaponsetlist *list);
-
-/**
- * Decrease the reference count of the object and free it if this was the last reference.
- */
-void flib_weaponsetlist_release(flib_weaponsetlist *list);
-
#endif
--- a/project_files/frontlib/net/netconn.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/net/netconn.c Tue Jul 10 19:33:57 2012 +0200
@@ -34,9 +34,9 @@
#include <errno.h>
#include <ctype.h>
-flib_netconn *flib_netconn_create(const char *playerName, flib_cfg_meta *metacfg, const char *dataDirPath, const char *host, uint16_t port) {
+flib_netconn *flib_netconn_create(const char *playerName, flib_metascheme *metacfg, const char *dataDirPath, const char *host, int port) {
flib_netconn *result = NULL;
- if(!log_badargs_if3(playerName==NULL, metacfg==NULL, host==NULL)) {
+ if(!log_badargs_if5(playerName==NULL, metacfg==NULL, host==NULL, port<1, port>65535)) {
flib_netconn *newConn = flib_calloc(1, sizeof(flib_netconn));
if(newConn) {
newConn->netBase = flib_netbase_create(host, port);
@@ -45,7 +45,7 @@
newConn->netconnState = NETCONN_STATE_CONNECTING;
newConn->isAdmin = false;
- newConn->metaCfg = flib_cfg_meta_retain(metacfg);
+ newConn->metaCfg = flib_metascheme_retain(metacfg);
newConn->roomList.roomCount = 0;
newConn->roomList.rooms = NULL;
@@ -87,13 +87,13 @@
free(conn->playerName);
free(conn->dataDirPath);
- flib_cfg_meta_release(conn->metaCfg);
+ flib_metascheme_release(conn->metaCfg);
flib_roomlist_clear(&conn->roomList);
flib_map_release(conn->map);
flib_teamlist_clear(&conn->pendingTeamlist);
flib_teamlist_clear(&conn->teamlist);
- flib_cfg_release(conn->scheme);
+ flib_scheme_release(conn->scheme);
free(conn->script);
flib_weaponset_release(conn->weaponset);
@@ -123,7 +123,7 @@
conn->map = flib_map_create_named("", "NoSuchMap");
flib_teamlist_clear(&conn->pendingTeamlist);
flib_teamlist_clear(&conn->teamlist);
- flib_cfg_release(conn->scheme);
+ flib_scheme_release(conn->scheme);
conn->scheme = NULL;
free(conn->script);
conn->script = NULL;
@@ -159,10 +159,10 @@
}
}
-void netconn_setScheme(flib_netconn *conn, const flib_cfg *scheme) {
- flib_cfg *copy = flib_cfg_copy(scheme);
+void netconn_setScheme(flib_netconn *conn, const flib_scheme *scheme) {
+ flib_scheme *copy = flib_scheme_copy(scheme);
if(copy) {
- flib_cfg_release(conn->scheme);
+ flib_scheme_release(conn->scheme);
conn->scheme = copy;
}
}
@@ -182,7 +182,7 @@
if(tmpSetup) {
for(int i=0; i<tmpSetup->teamlist->teamCount; i++) {
flib_team_set_weaponset(tmpSetup->teamlist->teams[i], conn->weaponset);
- flib_team_set_health(tmpSetup->teamlist->teams[i], flib_cfg_get_setting(conn->scheme, "health", 100));
+ flib_team_set_health(tmpSetup->teamlist->teams[i], flib_scheme_get_setting(conn->scheme, "health", 100));
}
if(tmpSetup->map->mapgen == MAPGEN_NAMED && tmpSetup->map->name) {
flib_mapcfg mapcfg;
@@ -332,19 +332,15 @@
flib_log_w("Net: Bad ADD_TEAM message");
} else {
flib_team *team = flib_team_from_netmsg(netmsg->parts+1);
- flib_team *teamcopy = flib_team_from_netmsg(netmsg->parts+1);
- if(!team || !teamcopy) {
+ if(!team || flib_teamlist_insert(&conn->teamlist, team, conn->teamlist.teamCount)) {
+ flib_team_destroy(team);
conn->netconnState = NETCONN_STATE_DISCONNECTED;
conn->onDisconnectedCb(conn->onDisconnectedCtx, NETCONN_DISCONNECT_INTERNAL_ERROR, "Internal error");
exit = true;
} else {
team->remoteDriven = true;
- teamcopy->remoteDriven = true;
- flib_teamlist_insert(&conn->teamlist, teamcopy, conn->teamlist.teamCount);
conn->onTeamAddCb(conn->onTeamAddCtx, team);
}
- flib_team_release(team);
- flib_team_release(teamcopy);
}
} else if (!strcmp(cmd, "REMOVE_TEAM")) {
if(netmsg->partCount != 2 || !flib_netconn_is_in_room_context(conn)) {
@@ -467,14 +463,14 @@
} else {
const char *subcmd = netmsg->parts[1];
if(!strcmp(subcmd, "SCHEME") && netmsg->partCount == conn->metaCfg->modCount + conn->metaCfg->settingCount + 3) {
- flib_cfg *cfg = flib_netmsg_to_cfg(conn->metaCfg, netmsg->parts+2);
+ flib_scheme *cfg = flib_netmsg_to_cfg(conn->metaCfg, netmsg->parts+2);
if(cfg) {
netconn_setScheme(conn, cfg);
conn->onCfgSchemeCb(conn->onCfgSchemeCtx, cfg);
} else {
flib_log_e("Error processing CFG SCHEME message");
}
- flib_cfg_release(cfg);
+ flib_scheme_release(cfg);
} else if(!strcmp(subcmd, "FULLMAPCONFIG") && netmsg->partCount == 7) {
flib_map *map = flib_netmsg_to_map(netmsg->parts+2);
if(map) {
--- a/project_files/frontlib/net/netconn.h Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/net/netconn.h Tue Jul 10 19:33:57 2012 +0200
@@ -21,7 +21,7 @@
#define NETCONN_H_
#include "../model/gamesetup.h"
-#include "../model/cfg.h"
+#include "../model/scheme.h"
#include "../model/roomlist.h"
#include <stddef.h>
@@ -63,7 +63,7 @@
* Create a new netplay connection with these parameters.
* The path to the data directory must end with a path delimiter (e.g. C:\Games\Hedgewars\Data\)
*/
-flib_netconn *flib_netconn_create(const char *playerName, flib_cfg_meta *metacfg, const char *dataDirPath, const char *host, uint16_t port);
+flib_netconn *flib_netconn_create(const char *playerName, flib_metascheme *metacfg, const char *dataDirPath, const char *host, int port);
void flib_netconn_destroy(flib_netconn *conn);
/**
@@ -252,7 +252,7 @@
* Set the scheme. Only makes sense in room state and if you are chief.
* The server does not send a reply.
*/
-int flib_netconn_send_scheme(flib_netconn *conn, const flib_cfg *scheme);
+int flib_netconn_send_scheme(flib_netconn *conn, const flib_scheme *scheme);
/**
* Inform the server that the round has ended. Call this when the engine
@@ -425,7 +425,7 @@
* A new team was added to the room. The person who adds a team does NOT receive this callback (he gets onTeamAccepted instead).
* The team does not contain bindings, stats, weaponset, color or the number of hogs.
*/
-void flib_netconn_onTeamAdd(flib_netconn *conn, void (*callback)(void *context, flib_team *team), void *context);
+void flib_netconn_onTeamAdd(flib_netconn *conn, void (*callback)(void *context, const flib_team *team), void *context);
/**
* A team was removed from the room.
@@ -462,7 +462,7 @@
void flib_netconn_onEngineMessage(flib_netconn *conn, void (*callback)(void *context, const uint8_t *message, size_t size), void *context);
-void flib_netconn_onCfgScheme(flib_netconn *conn, void (*callback)(void *context, flib_cfg *scheme), void *context);
+void flib_netconn_onCfgScheme(flib_netconn *conn, void (*callback)(void *context, const flib_scheme *scheme), void *context);
/**
* This is called when the map configuration in a room is changed (or first received). Only non-chiefs receive these messages.
@@ -486,7 +486,7 @@
* The weaponset has been changed by the room chief. If you are the chief and change the weaponset yourself,
* you will not receive this callback!
*/
-void flib_netconn_onWeaponsetChanged(flib_netconn *conn, void (*callback)(void *context, flib_weaponset *weaponset), void *context);
+void flib_netconn_onWeaponsetChanged(flib_netconn *conn, void (*callback)(void *context, const flib_weaponset *weaponset), void *context);
/**
* This callback is called if the server informs us that we have admin rights.
--- a/project_files/frontlib/net/netconn_callbacks.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/net/netconn_callbacks.c Tue Jul 10 19:33:57 2012 +0200
@@ -116,6 +116,7 @@
static void _noop_callback_##cbName cbParameterTypes {} \
GENERATE_CB_SETTER(cbName, cbParameterTypes, _noop_callback_##cbName)
+// TODO Disallow transfer of ownership?
GENERATE_CB_SETTER(onMessage, (void *context, int msgtype, const char *msg), defaultCallback_onMessage);
GENERATE_CB_SETTER_AND_DEFAULT(onConnected, (void *context));
GENERATE_CB_SETTER_AND_DEFAULT(onDisconnected, (void *context, int reason, const char *message));
@@ -133,17 +134,17 @@
GENERATE_CB_SETTER_AND_DEFAULT(onReadyState, (void *context, const char *nick, bool ready));
GENERATE_CB_SETTER_AND_DEFAULT(onEnterRoom, (void *context, bool chief));
GENERATE_CB_SETTER_AND_DEFAULT(onLeaveRoom, (void *context, int reason, const char *message));
-GENERATE_CB_SETTER_AND_DEFAULT(onTeamAdd, (void *context, flib_team *team));
+GENERATE_CB_SETTER_AND_DEFAULT(onTeamAdd, (void *context, const flib_team *team));
GENERATE_CB_SETTER_AND_DEFAULT(onTeamDelete, (void *context, const char *teamname));
GENERATE_CB_SETTER_AND_DEFAULT(onRunGame, (void *context));
GENERATE_CB_SETTER_AND_DEFAULT(onTeamAccepted, (void *context, const char *teamName));
GENERATE_CB_SETTER_AND_DEFAULT(onHogCountChanged, (void *context, const char *teamName, int hogs));
GENERATE_CB_SETTER_AND_DEFAULT(onTeamColorChanged, (void *context, const char *teamName, int colorIndex));
GENERATE_CB_SETTER_AND_DEFAULT(onEngineMessage, (void *context, const uint8_t *message, size_t size));
-GENERATE_CB_SETTER_AND_DEFAULT(onCfgScheme, (void *context, flib_cfg *scheme));
+GENERATE_CB_SETTER_AND_DEFAULT(onCfgScheme, (void *context, const flib_scheme *scheme));
GENERATE_CB_SETTER_AND_DEFAULT(onMapChanged, (void *context, const flib_map *map, int changetype));
GENERATE_CB_SETTER_AND_DEFAULT(onScriptChanged, (void *context, const char *script));
-GENERATE_CB_SETTER_AND_DEFAULT(onWeaponsetChanged, (void *context, flib_weaponset *weaponset));
+GENERATE_CB_SETTER_AND_DEFAULT(onWeaponsetChanged, (void *context, const flib_weaponset *weaponset));
GENERATE_CB_SETTER_AND_DEFAULT(onAdminAccess, (void *context));
GENERATE_CB_SETTER_AND_DEFAULT(onServerVar, (void *context, const char *name, const char *value));
--- a/project_files/frontlib/net/netconn_internal.h Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/net/netconn_internal.h Tue Jul 10 19:33:57 2012 +0200
@@ -26,7 +26,6 @@
#include "netconn.h"
#include "netbase.h"
-#include "../model/cfg.h"
#include "../model/roomlist.h"
#include "../model/map.h"
#include "../model/team.h"
@@ -44,14 +43,14 @@
int netconnState; // One of the NETCONN_STATE constants
bool isAdmin; // Player is server administrator
- flib_cfg_meta *metaCfg;
+ flib_metascheme *metaCfg;
flib_roomlist roomList;
bool isChief; // Player can modify the current room
flib_map *map;
flib_teamlist pendingTeamlist;
flib_teamlist teamlist;
- flib_cfg *scheme;
+ flib_scheme *scheme;
char *script;
flib_weaponset *weaponset;
@@ -106,7 +105,7 @@
void (*onLeaveRoomCb)(void *context, int reason, const char *message);
void *onLeaveRoomCtx;
- void (*onTeamAddCb)(void *context, flib_team *team);
+ void (*onTeamAddCb)(void *context, const flib_team *team);
void *onTeamAddCtx;
void (*onTeamDeleteCb)(void *context, const char *teamname);
@@ -127,7 +126,7 @@
void (*onEngineMessageCb)(void *context, const uint8_t *message, size_t size);
void *onEngineMessageCtx;
- void (*onCfgSchemeCb)(void *context, flib_cfg *scheme);
+ void (*onCfgSchemeCb)(void *context, const flib_scheme *scheme);
void *onCfgSchemeCtx;
void (*onMapChangedCb)(void *context, const flib_map *map, int changetype);
@@ -136,7 +135,7 @@
void (*onScriptChangedCb)(void *context, const char *script);
void *onScriptChangedCtx;
- void (*onWeaponsetChangedCb)(void *context, flib_weaponset *weaponset);
+ void (*onWeaponsetChangedCb)(void *context, const flib_weaponset *weaponset);
void *onWeaponsetChangedCtx;
void (*onAdminAccessCb)(void *context);
@@ -154,6 +153,6 @@
void netconn_setMap(flib_netconn *conn, const flib_map *map);
void netconn_setWeaponset(flib_netconn *conn, const flib_weaponset *weaponset);
void netconn_setScript(flib_netconn *conn, const char *script);
-void netconn_setScheme(flib_netconn *conn, const flib_cfg *scheme);
+void netconn_setScheme(flib_netconn *conn, const flib_scheme *scheme);
#endif
--- a/project_files/frontlib/net/netconn_send.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/net/netconn_send.c Tue Jul 10 19:33:57 2012 +0200
@@ -150,10 +150,12 @@
teamcopy->ownerName = flib_strdupnull(conn->playerName);
if(teamcopy->ownerName) {
flib_teamlist_delete(&conn->pendingTeamlist, team->name);
- flib_teamlist_insert(&conn->pendingTeamlist, teamcopy, 0);
+ if(!flib_teamlist_insert(&conn->pendingTeamlist, teamcopy, 0)) {
+ teamcopy = NULL;
+ }
}
}
- flib_team_release(teamcopy);
+ flib_team_destroy(teamcopy);
}
int flib_netconn_send_addTeam(flib_netconn *conn, const flib_team *team) {
@@ -397,7 +399,7 @@
return -1;
}
-int flib_netconn_send_scheme(flib_netconn *conn, const flib_cfg *scheme) {
+int flib_netconn_send_scheme(flib_netconn *conn, const flib_scheme *scheme) {
int result = -1;
if(!log_badargs_if3(conn==NULL, scheme==NULL, flib_strempty(scheme->name))) {
flib_vector *vec = flib_vector_create();
--- a/project_files/frontlib/net/netprotocol.c Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/net/netprotocol.c Tue Jul 10 19:33:57 2012 +0200
@@ -62,7 +62,7 @@
flib_team *flib_team_from_netmsg(char **parts) {
flib_team *result = NULL;
- flib_team *tmpTeam = flib_team_retain(flib_calloc(1, sizeof(flib_team)));
+ flib_team *tmpTeam = flib_calloc(1, sizeof(flib_team));
if(tmpTeam) {
if(!fillTeamFromMsg(tmpTeam, parts)) {
result = tmpTeam;
@@ -71,12 +71,12 @@
flib_log_e("Error parsing team from net.");
}
}
- flib_team_release(tmpTeam);
+ flib_team_destroy(tmpTeam);
return result;
}
-flib_cfg *flib_netmsg_to_cfg(flib_cfg_meta *meta, char **parts) {
- flib_cfg *result = flib_cfg_create(meta, parts[0]);
+flib_scheme *flib_netmsg_to_cfg(flib_metascheme *meta, char **parts) {
+ flib_scheme *result = flib_scheme_create(meta, parts[0]);
if(result) {
for(int i=0; i<meta->modCount; i++) {
result->mods[i] = !strcmp(parts[i+1], "true");
--- a/project_files/frontlib/net/netprotocol.h Thu Jul 05 22:22:48 2012 +0200
+++ b/project_files/frontlib/net/netprotocol.h Tue Jul 10 19:33:57 2012 +0200
@@ -21,7 +21,7 @@
#define NETPROTOCOL_H_
#include "../model/team.h"
-#include "../model/cfg.h"
+#include "../model/scheme.h"
#include "../model/map.h"
#include <stddef.h>
@@ -35,7 +35,7 @@
* Create a new scheme from this net message, which must have
* meta->modCount+meta->settingCount+1 parts.
*/
-flib_cfg *flib_netmsg_to_cfg(flib_cfg_meta *meta, char **parts);
+flib_scheme *flib_netmsg_to_cfg(flib_metascheme *meta, char **parts);
/**
* Create a new map from this five-part netmsg