Feature #505 ยป 0061-Add-tilesets-to-the-.modpacks-system.patch
client/client_main.c | ||
---|---|---|
#include "idex.h"
|
||
#include "map.h"
|
||
#include "mapimg.h"
|
||
#include "modpack.h"
|
||
#include "netintf.h"
|
||
#include "packets.h"
|
||
#include "player.h"
|
||
... | ... | |
static void fc_interface_init_client(void);
|
||
static void cache_tilesets(void);
|
||
char *logfile = NULL;
|
||
char *scriptfile = NULL;
|
||
char *savefile = NULL;
|
||
... | ... | |
argv[1 + ui_options] = NULL;
|
||
argc = 1 + ui_options;
|
||
/* disallow running as root -- too dangerous */
|
||
/* Disallow running as root -- too dangerous */
|
||
dont_run_as_root(argv[0], "freeciv_client");
|
||
log_init(logfile, loglevel, NULL, NULL, fatal_assertions);
|
||
backtrace_init();
|
||
/* after log_init: */
|
||
/* After log_init: */
|
||
(void)user_username(gui_options.default_user_name, MAX_LEN_NAME);
|
||
if (!is_valid_username(gui_options.default_user_name)) {
|
||
... | ... | |
}
|
||
}
|
||
/* initialization */
|
||
/* Initialization */
|
||
game.all_connections = conn_list_new();
|
||
game.est_connections = conn_list_new();
|
||
... | ... | |
fc_init_ow_mutex();
|
||
/* register exit handler */
|
||
/* Register exit handler */
|
||
atexit(at_exit);
|
||
fc_at_quick_exit(emergency_exit);
|
||
... | ... | |
helpdata_init();
|
||
boot_help_texts();
|
||
modpacks_init();
|
||
cache_tilesets();
|
||
audio_real_init(sound_set_name, music_set_name, sound_plugin_name);
|
||
start_menu_music("music_menu", NULL);
|
||
... | ... | |
}
|
||
}
|
||
/* run gui-specific client */
|
||
/* Run gui-specific client */
|
||
uret = ui_main(argc, argv);
|
||
/* termination */
|
||
modpacks_free();
|
||
/* Termination */
|
||
client_exit(uret);
|
||
/* not reached */
|
||
/* Not reached */
|
||
return EXIT_SUCCESS;
|
||
}
|
||
... | ... | |
{
|
||
client_quitting = TRUE;
|
||
}
|
||
/************************************************************************//**
|
||
Create cache of available tilesets.
|
||
****************************************************************************/
|
||
static void cache_tilesets(void)
|
||
{
|
||
struct fileinfo_list *tileset_choices;
|
||
tileset_choices = get_modpacks_list();
|
||
fileinfo_list_iterate(tileset_choices, pfile) {
|
||
struct section_file *sf;
|
||
sf = secfile_load(pfile->fullname, FALSE);
|
||
if (sf != NULL) {
|
||
modpack_cache_tileset(sf);
|
||
secfile_destroy(sf);
|
||
}
|
||
} fileinfo_list_iterate_end;
|
||
fileinfo_list_destroy(tileset_choices);
|
||
}
|
client/tilespec.c | ||
---|---|---|
#include "game.h" /* game.control.num_city_styles */
|
||
#include "government.h"
|
||
#include "map.h"
|
||
#include "modpack.h"
|
||
#include "movement.h"
|
||
#include "nation.h"
|
||
#include "player.h"
|
||
... | ... | |
return 0;
|
||
}
|
||
struct ts_list_data {
|
||
struct strvec *list;
|
||
int topo;
|
||
};
|
||
/************************************************************************//**
|
||
Callback called from modpack tileset cache iteration.
|
||
****************************************************************************/
|
||
static void ts_list_cb(const char *modpack_name, const char *filename,
|
||
void *data)
|
||
{
|
||
struct ts_list_data *tsdata = (struct ts_list_data *)data;
|
||
const char *target = modpack_tileset_target(modpack_name);
|
||
struct tileset *t = tileset_read_toplevel(target,
|
||
FALSE, tsdata->topo, 1.0f);
|
||
if (t != nullptr) {
|
||
strvec_append(tsdata->list, target);
|
||
tileset_free(t);
|
||
}
|
||
}
|
||
/************************************************************************//**
|
||
Returns a static list of tilesets available on the system by
|
||
searching all data directories for files matching TILESPEC_SUFFIX.
|
||
Returns a static list of tilesets available on the system.
|
||
****************************************************************************/
|
||
const struct strvec *get_tileset_list(const struct option *poption)
|
||
{
|
||
static struct strvec *tilesets[3] = { NULL, NULL, NULL };
|
||
static struct strvec *tilesets[3] = { nullptr, nullptr, nullptr };
|
||
int topo = option_get_cb_data(poption);
|
||
int idx;
|
||
idx = ts_topology_index(topo);
|
||
fc_assert_ret_val(idx < ARRAY_SIZE(tilesets), NULL);
|
||
fc_assert_ret_val(idx < ARRAY_SIZE(tilesets), nullptr);
|
||
if (tilesets[idx] == nullptr) {
|
||
struct ts_list_data data;
|
||
if (tilesets[idx] == NULL) {
|
||
/* Note: this means you must restart the client after installing a new
|
||
tileset. */
|
||
struct strvec *list = fileinfolist(get_data_dirs(), TILESPEC_SUFFIX);
|
||
tilesets[idx] = strvec_new();
|
||
strvec_iterate(list, file) {
|
||
struct tileset *t = tileset_read_toplevel(file, FALSE, topo, 1.0f);
|
||
if (t) {
|
||
strvec_append(tilesets[idx], file);
|
||
tileset_free(t);
|
||
}
|
||
} strvec_iterate_end;
|
||
strvec_destroy(list);
|
||
data.list = tilesets[idx];
|
||
data.topo = topo;
|
||
modpack_tileset_cache_iterate(ts_list_cb, &data);
|
||
}
|
||
return tilesets[idx];
|
||
... | ... | |
free(t);
|
||
}
|
||
/************************************************************************//**
|
||
Callback called from modpack tileset cache iteration.
|
||
****************************************************************************/
|
||
static void ts_cb(const char *modpack_name, const char *filename, void *data)
|
||
{
|
||
int topo_id = *((int *)data);
|
||
struct tileset *t = tileset_read_toplevel(modpack_tileset_target(modpack_name),
|
||
FALSE, topo_id, 1.0f);
|
||
if (t != nullptr) {
|
||
if (tileset == nullptr) {
|
||
tileset = t;
|
||
} else if (t->priority > tileset->priority
|
||
|| (topo_id >= 0
|
||
&& tileset_topo_index(tileset) != tileset_topo_index(t))) {
|
||
tileset_free(tileset);
|
||
tileset = t;
|
||
} else {
|
||
tileset_free(t);
|
||
}
|
||
}
|
||
}
|
||
/************************************************************************//**
|
||
Read a new tilespec in when first starting the game.
|
||
... | ... | |
{
|
||
bool original;
|
||
if (tileset_name == NULL
|
||
if (tileset_name == nullptr
|
||
|| !(tileset = tileset_read_toplevel(tileset_name, verbose,
|
||
topo_id, 1.0f))) {
|
||
struct strvec *list = fileinfolist(get_data_dirs(), TILESPEC_SUFFIX);
|
||
original = FALSE;
|
||
strvec_iterate(list, file) {
|
||
struct tileset *t = tileset_read_toplevel(file, FALSE, topo_id, 1.0f);
|
||
if (t) {
|
||
if (!tileset) {
|
||
tileset = t;
|
||
} else if (t->priority > tileset->priority
|
||
|| (topo_id >= 0
|
||
&& tileset_topo_index(tileset) != tileset_topo_index(t))) {
|
||
tileset_free(tileset);
|
||
tileset = t;
|
||
} else {
|
||
tileset_free(t);
|
||
}
|
||
}
|
||
} strvec_iterate_end;
|
||
strvec_destroy(list);
|
||
modpack_tileset_cache_iterate(ts_cb, &topo_id);
|
||
if (tileset == NULL) {
|
||
tileset_error(LOG_FATAL, NULL, _("No usable default tileset found, aborting!"));
|
||
if (tileset == nullptr) {
|
||
tileset_error(LOG_FATAL, nullptr, _("No usable default tileset found, aborting!"));
|
||
}
|
||
log_verbose("Trying tileset \"%s\".", tileset->name);
|
common/game.c | ||
---|---|---|
#include "government.h"
|
||
#include "idex.h"
|
||
#include "map.h"
|
||
#include "modpack.h"
|
||
#include "multipliers.h"
|
||
#include "nation.h"
|
||
#include "packets.h"
|
||
... | ... | |
**************************************************************************/
|
||
void game_init(bool keep_ruleset_value)
|
||
{
|
||
modpacks_init();
|
||
game_defaults(keep_ruleset_value);
|
||
player_slots_init();
|
||
map_init(&wld.map, is_server());
|
||
... | ... | |
game_ruleset_free();
|
||
researches_free();
|
||
cm_free();
|
||
modpacks_free();
|
||
}
|
||
/**********************************************************************//**
|
common/modpack.c | ||
---|---|---|
struct modpack_cache_item {
|
||
char *modpack_name;
|
||
char *filename;
|
||
char *target;
|
||
};
|
||
/* Get 'struct modpack_cache_list' and related functions: */
|
||
... | ... | |
#define modpack_cache_iterate_end LIST_ITERATE_END
|
||
static struct modpack_cache_list *modpack_rulesets;
|
||
static struct modpack_cache_list *modpack_tilesets;
|
||
/************************************************************************//**
|
||
Initialize modpacks system
|
||
... | ... | |
{
|
||
if (is_server()) {
|
||
modpack_rulesets = modpack_cache_list_new();
|
||
} else {
|
||
modpack_tilesets = modpack_cache_list_new();
|
||
}
|
||
}
|
||
... | ... | |
} modpack_cache_iterate_end;
|
||
modpack_cache_list_destroy(modpack_rulesets);
|
||
} else {
|
||
modpack_cache_iterate(modpack_tilesets, item) {
|
||
free(item->modpack_name);
|
||
free(item->filename);
|
||
free(item->target);
|
||
free(item);
|
||
} modpack_cache_iterate_end;
|
||
modpack_cache_list_destroy(modpack_tilesets);
|
||
}
|
||
}
|
||
... | ... | |
}
|
||
/************************************************************************//**
|
||
Return name of the modpack if contains a ruleset. If it does not contain
|
||
Return name of the modpack if it contains a ruleset. If it does not contain
|
||
ruleset, return nullptr.
|
||
@param sf Modpack section file
|
||
... | ... | |
return nullptr;
|
||
}
|
||
/************************************************************************//**
|
||
Return name of the modpack if it contains a tileset. If it does not contain
|
||
ruleset, return nullptr.
|
||
@param sf Modpack section file
|
||
@return Name of the modpack, or nullptr
|
||
****************************************************************************/
|
||
const char *modpack_has_tileset(struct section_file *sf)
|
||
{
|
||
if (sf != nullptr) {
|
||
if (!modpack_check_capabilities(sf, MODPACK_CAPSTR, sf->name,
|
||
FALSE)) {
|
||
return nullptr;
|
||
}
|
||
if (secfile_lookup_bool_default(sf, FALSE, "components.tileset")) {
|
||
return secfile_lookup_str_default(sf, nullptr, "modpack.name");
|
||
}
|
||
}
|
||
return nullptr;
|
||
}
|
||
/************************************************************************//**
|
||
Return .serv file name for the modpack, if any.
|
||
... | ... | |
return nullptr;
|
||
}
|
||
/************************************************************************//**
|
||
Return tilespec for the modpack, if any.
|
||
@param sf Modpack section file
|
||
@return Tilespec file name, or nullptr
|
||
****************************************************************************/
|
||
const char *modpack_tilespec(struct section_file *sf)
|
||
{
|
||
if (sf != nullptr) {
|
||
return secfile_lookup_str_default(sf, nullptr, "tileset.tilespec");
|
||
}
|
||
return nullptr;
|
||
}
|
||
/************************************************************************//**
|
||
Add modpack/ruleset mapping to cache, if modpack has ruleset.
|
||
Return name of the modpack, if the mapping exist.
|
||
... | ... | |
return mp_name;
|
||
}
|
||
/************************************************************************//**
|
||
Add modpack/ruleset mapping to cache, if modpack has tileset.
|
||
Return name of the modpack, if the mapping exist.
|
||
@param sf Modpack section file to cache
|
||
@return Name of the modpack, or nullptr
|
||
****************************************************************************/
|
||
const char *modpack_cache_tileset(struct section_file *sf)
|
||
{
|
||
const char *mp_name = modpack_has_tileset(sf);
|
||
struct modpack_cache_item *item;
|
||
const char *target;
|
||
if (mp_name == nullptr) {
|
||
return nullptr;
|
||
}
|
||
fc_assert(sf->name != nullptr);
|
||
item = fc_malloc(sizeof(struct modpack_cache_item));
|
||
item->modpack_name = fc_strdup(mp_name);
|
||
item->filename = fc_strdup(sf->name);
|
||
target = secfile_lookup_str_default(sf, nullptr, "tileset.tilespec");
|
||
if (target != nullptr) {
|
||
item->target = fc_strdup(target);
|
||
} else {
|
||
item->target = nullptr;
|
||
}
|
||
modpack_cache_list_append(modpack_tilesets, item);
|
||
return mp_name;
|
||
}
|
||
/************************************************************************//**
|
||
Find filename by name of the modpack, from the ruleset cache
|
||
... | ... | |
return nullptr;
|
||
}
|
||
/************************************************************************//**
|
||
Find filename by name of the modpack, from the tileset cache
|
||
@param name Modpack name
|
||
@return Filename of the modpack
|
||
****************************************************************************/
|
||
const char *modpack_file_from_tileset_cache(const char *name)
|
||
{
|
||
modpack_cache_iterate(modpack_tilesets, item) {
|
||
if (!fc_strcasecmp(name, item->modpack_name)) {
|
||
return item->filename;
|
||
}
|
||
} modpack_cache_iterate_end;
|
||
return nullptr;
|
||
}
|
||
/************************************************************************//**
|
||
Find target by name of the modpack, from the tileset cache
|
||
@param name Modpack name
|
||
@return Target of the modpack
|
||
****************************************************************************/
|
||
const char *modpack_tileset_target(const char *name)
|
||
{
|
||
modpack_cache_iterate(modpack_tilesets, item) {
|
||
if (!fc_strcasecmp(name, item->modpack_name)) {
|
||
return item->target;
|
||
}
|
||
} modpack_cache_iterate_end;
|
||
return nullptr;
|
||
}
|
||
/************************************************************************//**
|
||
Call callback for each item in the ruleset cache.
|
||
... | ... | |
cb(item->modpack_name, item->filename, data);
|
||
} modpack_cache_iterate_end;
|
||
}
|
||
/************************************************************************//**
|
||
Call callback for each item in the tileset cache.
|
||
@param cb Callback to call
|
||
@param data Data to pass to the callback
|
||
****************************************************************************/
|
||
void modpack_tileset_cache_iterate(mrc_cb cb, void *data)
|
||
{
|
||
modpack_cache_iterate(modpack_tilesets, item) {
|
||
cb(item->modpack_name, item->filename, data);
|
||
} modpack_cache_iterate_end;
|
||
}
|
common/modpack.h | ||
---|---|---|
const char *modpack_cache_ruleset(struct section_file *sf);
|
||
const char *modpack_file_from_ruleset_cache(const char *name);
|
||
const char *modpack_cache_tileset(struct section_file *sf);
|
||
const char *modpack_file_from_tileset_cache(const char *name);
|
||
const char *modpack_tileset_target(const char *name);
|
||
struct fileinfo_list *get_modpacks_list(void);
|
||
const char *modpack_has_ruleset(struct section_file *sf);
|
||
const char *modpack_has_tileset(struct section_file *sf);
|
||
bool modpack_check_capabilities(struct section_file *file, const char *us_capstr,
|
||
const char *filename, bool verbose);
|
||
const char *modpack_serv_file(struct section_file *sf);
|
||
const char *modpack_rulesetdir(struct section_file *sf);
|
||
const char *modpack_tilespec(struct section_file *sf);
|
||
typedef void (*mrc_cb)(const char*, const char *, void *data);
|
||
typedef void (*mrc_cb)(const char *, const char *, void *data);
|
||
void modpack_ruleset_cache_iterate(mrc_cb cb, void *data);
|
||
void modpack_tileset_cache_iterate(mrc_cb cb, void *data);
|
||
#ifdef __cplusplus
|
||
}
|
data/Makefile.am | ||
---|---|---|
if CLIENT
|
||
CLIENT_FILES = \
|
||
amplio2.modpack \
|
||
amplio2.tilespec \
|
||
cimpletoon.modpack \
|
||
cimpletoon.tilespec \
|
||
hex2t.modpack \
|
||
hex2t.tilespec \
|
||
hexemplio.modpack \
|
||
hexemplio.tilespec \
|
||
isophex.modpack \
|
||
isophex.tilespec \
|
||
isotrident.modpack \
|
||
isotrident.tilespec \
|
||
toonhex.modpack \
|
||
toonhex.tilespec \
|
||
alio.modpack \
|
||
alio.tilespec \
|
||
trident.modpack \
|
||
trident.tilespec \
|
||
stdmusic.musicspec \
|
||
stdsounds.soundspec \
|
data/alio.modpack | ||
---|---|---|
[datafile]
|
||
options = "+Freeciv-modpack-3.3-Devel-2024.Apr.14"
|
||
[modpack]
|
||
; Name of the modpack
|
||
name = "alio"
|
||
[components]
|
||
; Whether the modpack has a ruleset component
|
||
tileset = TRUE
|
||
[tileset]
|
||
; For modpacks with the tileset component, "tilespec" needs to be defined.
|
||
tilespec = "alio"
|
data/amplio.modpack | ||
---|---|---|
[datafile]
|
||
options = "+Freeciv-modpack-3.3-Devel-2024.Apr.14"
|
||
[modpack]
|
||
; Name of the modpack
|
||
name = "amplio"
|
||
[components]
|
||
; Whether the modpack has a ruleset component
|
||
tileset = TRUE
|
||
[tileset]
|
||
; For modpacks with the tileset component, "tilespec" needs to be defined.
|
||
tilespec = "amplio"
|
data/amplio2.modpack | ||
---|---|---|
[datafile]
|
||
options = "+Freeciv-modpack-3.3-Devel-2024.Apr.14"
|
||
[modpack]
|
||
; Name of the modpack
|
||
name = "amplio2"
|
||
[components]
|
||
; Whether the modpack has a ruleset component
|
||
tileset = TRUE
|
||
[tileset]
|
||
; For modpacks with the tileset component, "tilespec" needs to be defined.
|
||
tilespec = "amplio2"
|
data/cimpletoon.modpack | ||
---|---|---|
[datafile]
|
||
options = "+Freeciv-modpack-3.3-Devel-2024.Apr.14"
|
||
[modpack]
|
||
; Name of the modpack
|
||
name = "cimpletoon"
|
||
[components]
|
||
; Whether the modpack has a ruleset component
|
||
tileset = TRUE
|
||
[tileset]
|
||
; For modpacks with the tileset component, "tilespec" needs to be defined.
|
||
tilespec = "cimpletoon"
|
data/hex2t.modpack | ||
---|---|---|
[datafile]
|
||
options = "+Freeciv-modpack-3.3-Devel-2024.Apr.14"
|
||
[modpack]
|
||
; Name of the modpack
|
||
name = "hex2t"
|
||
[components]
|
||
; Whether the modpack has a ruleset component
|
||
tileset = TRUE
|
||
[tileset]
|
||
; For modpacks with the tileset component, "tilespec" needs to be defined.
|
||
tilespec = "hex2t"
|
data/hexemplio.modpack | ||
---|---|---|
[datafile]
|
||
options = "+Freeciv-modpack-3.3-Devel-2024.Apr.14"
|
||
[modpack]
|
||
; Name of the modpack
|
||
name = "hexemplio"
|
||
[components]
|
||
; Whether the modpack has a ruleset component
|
||
tileset = TRUE
|
||
[tileset]
|
||
; For modpacks with the tileset component, "tilespec" needs to be defined.
|
||
tilespec = "hexemplio"
|
data/isophex.modpack | ||
---|---|---|
[datafile]
|
||
options = "+Freeciv-modpack-3.3-Devel-2024.Apr.14"
|
||
[modpack]
|
||
; Name of the modpack
|
||
name = "isophex"
|
||
[components]
|
||
; Whether the modpack has a ruleset component
|
||
tileset = TRUE
|
||
[tileset]
|
||
; For modpacks with the tileset component, "tilespec" needs to be defined.
|
||
tilespec = "isophex"
|
data/isotrident.modpack | ||
---|---|---|
[datafile]
|
||
options = "+Freeciv-modpack-3.3-Devel-2024.Apr.14"
|
||
[modpack]
|
||
; Name of the modpack
|
||
name = "isotrident"
|
||
[components]
|
||
; Whether the modpack has a ruleset component
|
||
tileset = TRUE
|
||
[tileset]
|
||
; For modpacks with the tileset component, "tilespec" needs to be defined.
|
||
tilespec = "isotrident"
|
data/toonhex.modpack | ||
---|---|---|
[datafile]
|
||
options = "+Freeciv-modpack-3.3-Devel-2024.Apr.14"
|
||
[modpack]
|
||
; Name of the modpack
|
||
name = "toonhex"
|
||
[components]
|
||
; Whether the modpack has a ruleset component
|
||
tileset = TRUE
|
||
[tileset]
|
||
; For modpacks with the tileset component, "tilespec" needs to be defined.
|
||
tilespec = "toonhex"
|
data/trident.modpack | ||
---|---|---|
[datafile]
|
||
options = "+Freeciv-modpack-3.3-Devel-2024.Apr.14"
|
||
[modpack]
|
||
; Name of the modpack
|
||
name = "trident"
|
||
[components]
|
||
; Whether the modpack has a ruleset component
|
||
tileset = TRUE
|
||
[tileset]
|
||
; For modpacks with the tileset component, "tilespec" needs to be defined.
|
||
tilespec = "trident"
|
meson.build | ||
---|---|---|
)
|
||
install_data('data/helpdata.txt',
|
||
'data/cimpletoon.modpack',
|
||
'data/cimpletoon.tilespec',
|
||
'data/isophex.modpack',
|
||
'data/isophex.tilespec',
|
||
'data/isotrident.modpack',
|
||
'data/isotrident.tilespec',
|
||
'data/toonhex.modpack',
|
||
'data/toonhex.tilespec',
|
||
'data/alio.modpack',
|
||
'data/alio.tilespec',
|
||
'data/trident.modpack',
|
||
'data/trident.tilespec',
|
||
'data/hexemplio.modpack',
|
||
'data/hexemplio.tilespec',
|
||
'data/hex2t.modpack',
|
||
'data/hex2t.tilespec',
|
||
'data/amplio2.modpack',
|
||
'data/amplio2.tilespec',
|
||
'data/stdmusic.musicspec',
|
||
'data/stdsounds.soundspec',
|
server/srv_main.c | ||
---|---|---|
#include "government.h"
|
||
#include "map.h"
|
||
#include "mapimg.h"
|
||
#include "modpack.h"
|
||
#include "nation.h"
|
||
#include "packets.h"
|
||
#include "player.h"
|
||
... | ... | |
}
|
||
#endif /* HAVE_FCDB */
|
||
modpacks_free();
|
||
settings_free();
|
||
stdinhand_free();
|
||
edithand_free();
|
||
... | ... | |
int retries = 0;
|
||
while (identity_number_is_used(increment_identity_number())) {
|
||
/* try again */
|
||
/* Try again */
|
||
if (++retries >= IDENTITY_NUMBER_SIZE) {
|
||
/* Always fails. */
|
||
fc_assert_exit_msg(IDENTITY_NUMBER_SIZE > retries,
|
||
... | ... | |
}
|
||
#endif /* HAVE_FCDB */
|
||
/* make sure it's initialized */
|
||
/* Make sure it's initialized */
|
||
if (!has_been_srv_init) {
|
||
srv_init();
|
||
}
|
||
fc_init_network();
|
||
/* must be before con_log_init() */
|
||
/* Must be before con_log_init() */
|
||
init_connections();
|
||
con_log_init(srvarg.log_filename, srvarg.loglevel,
|
||
srvarg.fatal_assertions);
|
||
/* logging available after this point */
|
||
/* Logging available after this point */
|
||
server_open_socket();
|
||
... | ... | |
voting_init();
|
||
ai_timer_init();
|
||
modpacks_init();
|
||
server_game_init(FALSE);
|
||
mapimg_init(mapimg_server_tile_known, mapimg_server_tile_terrain,
|
||
mapimg_server_tile_owner, mapimg_server_tile_city,
|
||
... | ... | |
**************************************************************************/
|
||
void server_game_init(bool keep_ruleset_value)
|
||
{
|
||
/* was redundantly in game_load() */
|
||
/* Was redundantly in game_load() */
|
||
server.playable_nations = 0;
|
||
server.nbarbarians = 0;
|
||
server.identity_number = IDENTITY_NUMBER_SKIP;
|