store calendar configuration nin JSON, not XML.

This commit is contained in:
Enno Rehling 2017-05-07 17:46:51 +02:00
parent ad465f1028
commit 7806f4991f
19 changed files with 163 additions and 93 deletions

21
conf/calendar.json Normal file
View File

@ -0,0 +1,21 @@
{
"calendar" : {
"months" : [
{ "storm" : 60, "season" : 2 },
{ "storm" : 10, "season" : 2 },
{ "storm" : 60, "season" : 3 },
{ "storm" : 10, "season" : 3 },
{ "storm" : 60, "season" : 0 },
{ "storm" : 80, "season" : 0 },
{ "storm" : 50, "season" : 1 },
{ "storm" : 30, "season" : 1 },
{ "storm" : 60, "season" : 1 }
],
"weeks" : [
"firstweek", "secondweek", "thirdweek"
]
}
}

View File

@ -1,9 +1,10 @@
{ {
"include": [ "include": [
"keywords.json", "keywords.json",
"prefixes.json", "calendar.json",
"prefixes.json",
"e2/terrains.json" "e2/terrains.json"
], ],
"disabled": [ "disabled": [
"jsreport" "jsreport"
], ],
@ -22,6 +23,7 @@
"hunger.long": true, "hunger.long": true,
"init_spells": 0, "init_spells": 0,
"game.era": 2, "game.era": 2,
"game.start": 184,
"rules.reserve.twophase": true, "rules.reserve.twophase": true,
"rules.give.max_men": -1, "rules.give.max_men": -1,
"rules.check_overload": false, "rules.check_overload": false,

View File

@ -16,7 +16,6 @@
<xi:include href="config://game/artrewards.xml"/> <xi:include href="config://game/artrewards.xml"/>
<xi:include href="config://game/buildings.xml"/> <xi:include href="config://game/buildings.xml"/>
<xi:include href="config://core/calendar.xml"/> <xi:include href="config://core/calendar.xml"/>
<calendar name="secondage" newyear="month_1" start="184"/>
<xi:include href="config://game/equipment.xml"/> <xi:include href="config://game/equipment.xml"/>
<xi:include href="config://game/items.xml"/> <xi:include href="config://game/items.xml"/>
<xi:include href="config://game/spells.xml"/> <xi:include href="config://game/spells.xml"/>

View File

@ -1,6 +1,7 @@
{ {
"include": [ "include": [
"keywords.json", "keywords.json",
"calendar.json",
"prefixes.json", "prefixes.json",
"e3/terrains.json" "e3/terrains.json"
], ],
@ -52,6 +53,7 @@
"study.expensivemigrants": true, "study.expensivemigrants": true,
"study.speedup": 2, "study.speedup": 2,
"game.era": 3, "game.era": 3,
"game.start": 1,
"rules.reserve.twophase": true, "rules.reserve.twophase": true,
"rules.owners.force_leave": false, "rules.owners.force_leave": false,
"rules.wage.function": 2, "rules.wage.function": 2,

View File

@ -21,8 +21,6 @@
<xi:include href="config://game/armor.xml" /> <xi:include href="config://game/armor.xml" />
<xi:include href="config://game/resources.xml" /> <xi:include href="config://game/resources.xml" />
<calendar name="thirdage" newyear="month_1" start="1"/>
<xi:include href="config://default/names-undead.xml"/> <xi:include href="config://default/names-undead.xml"/>
<xi:include href="config://default/names-skeletons.xml"/> <xi:include href="config://default/names-skeletons.xml"/>
<xi:include href="config://default/names-zombies.xml"/> <xi:include href="config://default/names-zombies.xml"/>

View File

@ -1,23 +0,0 @@
<?xml version="1.0"?>
<calendar name="secondage" newyear="month_1">
<season name="winter">
<month name="month_4" storm="50" />
<month name="month_5" storm="30" />
<month name="month_6" storm="60" />
</season>
<season name="spring">
<month name="month_7" storm="60" />
<month name="month_8" storm="10" />
</season>
<season name="summer">
<month name="month_9" storm="60" />
<month name="month_1" storm="10" />
</season>
<season name="fall">
<month name="month_2" storm="60" />
<month name="month_3" storm="80" />
</season>
<week name="firstweek" />
<week name="secondweek" />
<week name="thirdweek" />
</calendar>

View File

@ -6523,13 +6523,17 @@
<text locale="de">Sonnenfeuer</text> <text locale="de">Sonnenfeuer</text>
<text locale="en">sunfire</text> <text locale="en">sunfire</text>
</string> </string>
<string name="secondage"> <string name="age_1">
<text locale="de">neuer Zeitrechnung</text>
<text locale="en">of the new age</text>
</string>
<string name="age_2">
<text locale="de">des zweiten Zeitalters</text> <text locale="de">des zweiten Zeitalters</text>
<text locale="en">the second age</text> <text locale="en">the second age</text>
</string> </string>
<string name="newage"> <string name="age_3">
<text locale="de">neuer Zeitrechnung</text> <text locale="de">des dritten Zeitalters</text>
<text locale="en">of the new age</text> <text locale="en">the third age</text>
</string> </string>
</namespace> </namespace>

View File

@ -38,12 +38,6 @@
<text locale="en">adamantium plates</text> <text locale="en">adamantium plates</text>
</string> </string>
<!--Fort-Ausbaustufen -->
<string name="calendar::thirdage">
<text locale="de">des dritten Zeitalters</text>
<text locale="en">the third age</text>
</string>
<string name="packice"> <string name="packice">
<text locale="de">Packeis</text> <text locale="de">Packeis</text>
<text locale="en">fast ice</text> <text locale="en">fast ice</text>
@ -87,6 +81,7 @@
<text locale="en">repeating crossbows</text> <text locale="en">repeating crossbows</text>
</string> </string>
<!--Fort-Ausbaustufen -->
<string name="scaffolding"> <string name="scaffolding">
<text locale="de">Gerüst</text> <text locale="de">Gerüst</text>
<text locale="en">scaffolding</text> <text locale="en">scaffolding</text>
@ -103,6 +98,7 @@
<text locale="de">Wache</text> <text locale="de">Wache</text>
<text locale="en">watch</text> <text locale="en">watch</text>
</string> </string>
<string name="market"> <string name="market">
<text locale="de">Marktplatz</text> <text locale="de">Marktplatz</text>
<text locale="en">marketplace</text> <text locale="en">marketplace</text>

View File

@ -1,11 +1,11 @@
local function is_winter(turn) local function is_winter(turn)
local season = get_season(turn) local season = get_season(turn)
return season == "calendar::winter" return season == "winter"
end end
local function is_spring(turn) local function is_spring(turn)
local season = get_season(turn) local season = get_season(turn)
return season == "calendar::spring" return season == "spring"
end end
local function freeze(r, chance) local function freeze(r, chance)

View File

@ -87,7 +87,7 @@ local self = {}
function self.update() function self.update()
local turn = get_turn() local turn = get_turn()
local season = get_season(turn) local season = get_season(turn)
if season == "calendar::winter" then if season == "winter" then
eressea.log.debug("it is " .. season .. ", the christmas trees do their magic") eressea.log.debug("it is " .. season .. ", the christmas trees do their magic")
local msg = message.create("xmastree_effect") local msg = message.create("xmastree_effect")
for r in regions() do for r in regions() do
@ -103,7 +103,7 @@ function self.update()
end end
else else
local prevseason = get_season(turn-1) local prevseason = get_season(turn-1)
if prevseason == "calendar::winter" then if prevseason == "winter" then
-- we celebrate knut and kick out the trees. -- we celebrate knut and kick out the trees.
for r in regions() do for r in regions() do
if r:get_key("xm06") then if r:get_key("xm06") then

View File

@ -11,8 +11,8 @@ function setup()
end end
function test_calendar() function test_calendar()
assert_equal(get_season(1011), "calendar::winter") assert_equal("winter", get_season(1011))
assert_equal(get_season(1012), "calendar::spring") assert_equal("spring", get_season(1012))
end end
function test_herbalism() function test_herbalism()

View File

@ -38,7 +38,7 @@ function teardown()
end end
function test_calendar() function test_calendar()
assert_equal(get_season(396), "calendar::winter") assert_equal("winter", get_season(396))
end end
function disable_test_bug_1738_build_castle_e3() function disable_test_bug_1738_build_castle_e3()

View File

@ -1,20 +1,35 @@
#include <platform.h> #include <platform.h>
#include "calendar.h" #include "calendar.h"
#include "move.h" /* storms */
#include <kernel/config.h> #include <kernel/config.h>
#include <assert.h> #include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
int first_month = 0; int first_month = 0;
int weeks_per_month = 3; int weeks_per_month = 3;
int months_per_year = 12; int months_per_year = 12;
char **seasonnames = NULL; const char *seasonnames[CALENDAR_SEASONS] = { "winter", "spring", "summer", "fall" };
char **weeknames = NULL; char **weeknames = NULL;
char **weeknames2 = NULL; char **weeknames2 = NULL;
char **monthnames = NULL;
int *month_season = NULL; int *month_season = NULL;
char *agename = NULL;
int seasons = 0; const char *calendar_month(int index)
{
static char result[20];
snprintf(result, sizeof(result), "month_%d", index + 1);
return result;
}
const char *calendar_era(void)
{
static char result[20];
int era = config_get_int("game.era", 1);
snprintf(result, sizeof(result), "age_%d", era);
return result;
}
int first_turn(void) int first_turn(void)
{ {
@ -27,7 +42,7 @@ const gamedate *get_gamedate(int turn, gamedate * gd)
int t = turn - first_turn(); int t = turn - first_turn();
assert(gd); assert(gd);
assert(t >= 0); assert(t>=0);
gd->week = t % weeks_per_month; /* 0 - weeks_per_month-1 */ gd->week = t % weeks_per_month; /* 0 - weeks_per_month-1 */
gd->month = (t / weeks_per_month + first_month) % months_per_year; /* 0 - months_per_year-1 */ gd->month = (t / weeks_per_month + first_month) % months_per_year; /* 0 - months_per_year-1 */
@ -40,34 +55,17 @@ void calendar_cleanup(void)
{ {
int i; int i;
free(agename);
if (seasonnames) {
for (i = 0; i != seasons; ++i) {
free(seasonnames[i]);
}
free(seasonnames);
seasonnames = 0;
}
if (monthnames) {
for (i = 0; i != months_per_year; ++i) {
free(monthnames[i]);
}
free(storms);
storms = 0;
free(month_season);
month_season = 0;
free(monthnames);
monthnames = 0;
}
for (i = 0; i != weeks_per_month; ++i) { for (i = 0; i != weeks_per_month; ++i) {
if (weeknames) if (weeknames)
free(weeknames[i]); free(weeknames[i]);
if (weeknames2) if (weeknames2)
free(weeknames2[i]); free(weeknames2[i]);
} }
free(storms);
storms = 0;
free(month_season);
month_season = 0;
free(weeknames); free(weeknames);
weeknames = 0; weeknames = 0;
free(weeknames2); free(weeknames2);

View File

@ -11,17 +11,12 @@ extern "C" {
SEASON_SUMMER, SEASON_SUMMER,
SEASON_AUTUMN SEASON_AUTUMN
}; };
#define CALENDAR_SEASONS 4
extern char *agename; extern const char *seasonnames[CALENDAR_SEASONS];
extern int first_month;
extern int seasons;
extern char **seasonnames;
extern int months_per_year; extern int months_per_year;
extern char **monthnames;
extern int *month_season; extern int *month_season;
extern int *storms; /* in movement.c */ extern int first_month;
extern char **weeknames; extern char **weeknames;
extern char **weeknames2; extern char **weeknames2;
@ -36,6 +31,8 @@ extern "C" {
const gamedate *get_gamedate(int turn, gamedate * gd); const gamedate *get_gamedate(int turn, gamedate * gd);
void calendar_cleanup(void); void calendar_cleanup(void);
const char *calendar_month(int index);
const char *calendar_era(void);
int first_turn(void); int first_turn(void);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -33,6 +33,8 @@ without prior permission by the authors of Eressea.
/* game modules */ /* game modules */
#include "prefix.h" #include "prefix.h"
#include "move.h"
#include "calendar.h"
/* util includes */ /* util includes */
#include <util/attrib.h> #include <util/attrib.h>
@ -684,6 +686,74 @@ static void json_direction(cJSON *json, struct locale *lang) {
} }
} }
static void json_calendar(cJSON *json) {
cJSON *child;
if (json->type != cJSON_Object) {
log_error("calendar is not an object: %d", json->type);
return;
}
for (child = json->child; child; child = child->next) {
if (strcmp(child->string, "start") == 0) {
config_set_int("game.start", child->valueint);
}
else if (strcmp(child->string, "weeks") == 0) {
cJSON *entry;
int i;
if (child->type != cJSON_Array) {
log_error("calendar.weeks is not an array: %d", json->type);
return;
}
weeks_per_month = cJSON_GetArraySize(child);
free(weeknames);
weeknames = malloc(sizeof(char *) * weeks_per_month);
for (i = 0, entry = child->child; entry; entry = entry->next, ++i) {
if (entry->type == cJSON_String) {
weeknames[i] = strdup(entry->valuestring);
}
else {
log_error("calendar.weeks[%d] is not a string: %d", i, json->type);
free(weeknames);
weeknames = NULL;
return;
}
}
assert(i == weeks_per_month);
free(weeknames2);
weeknames2 = malloc(sizeof(char *) * weeks_per_month);
for (i = 0; i != weeks_per_month; ++i) {
weeknames2[i] = malloc(strlen(weeknames[i]) + 3);
sprintf(weeknames2[i], "%s_d", weeknames[i]);
}
}
else if (strcmp(child->string, "months") == 0) {
cJSON *jmonth;
int i;
if (child->type != cJSON_Array) {
log_error("calendar.seasons is not an array: %d", json->type);
return;
}
free(month_season);
month_season = NULL;
free(storms);
months_per_year = cJSON_GetArraySize(child);
storms = malloc(sizeof(int) * months_per_year);
month_season = malloc(sizeof(int) * months_per_year);
for (i = 0, jmonth = child->child; jmonth; jmonth = jmonth->next, ++i) {
if (jmonth->type == cJSON_Object) {
storms[i] = cJSON_GetObjectItem(jmonth, "storm")->valueint;
month_season[i] = cJSON_GetObjectItem(jmonth, "season")->valueint;
}
else {
log_error("calendar.months[%d] is not an object: %d", i, json->type);
free(storms);
storms = NULL;
return;
}
}
}
}
}
static void json_directions(cJSON *json) { static void json_directions(cJSON *json) {
cJSON *child; cJSON *child;
if (json->type != cJSON_Object) { if (json->type != cJSON_Object) {
@ -890,6 +960,9 @@ void json_config(cJSON *json) {
else if (strcmp(child->string, "strings") == 0) { else if (strcmp(child->string, "strings") == 0) {
json_strings(child); json_strings(child);
} }
else if (strcmp(child->string, "calendar") == 0) {
json_calendar(child);
}
else if (strcmp(child->string, "directions") == 0) { else if (strcmp(child->string, "directions") == 0) {
json_directions(child); json_directions(child);
} }

View File

@ -30,6 +30,7 @@ without prior permission by the authors of Eressea.
#include "spellbook.h" #include "spellbook.h"
#include "calendar.h" #include "calendar.h"
#include "prefix.h" #include "prefix.h"
#include "move.h"
#include "vortex.h" #include "vortex.h"
@ -398,6 +399,7 @@ static int parse_buildings(xmlDocPtr doc)
return 0; return 0;
} }
#if 0
static int parse_calendar(xmlDocPtr doc) static int parse_calendar(xmlDocPtr doc)
{ {
xmlXPathContextPtr xpath = xmlXPathNewContext(doc); xmlXPathContextPtr xpath = xmlXPathNewContext(doc);
@ -523,7 +525,7 @@ static int parse_calendar(xmlDocPtr doc)
return 0; return 0;
} }
#endif
static int parse_ships(xmlDocPtr doc) static int parse_ships(xmlDocPtr doc)
{ {
xmlXPathContextPtr xpath = xmlXPathNewContext(doc); xmlXPathContextPtr xpath = xmlXPathNewContext(doc);
@ -1869,7 +1871,6 @@ static int parse_strings(xmlDocPtr doc)
void register_xmlreader(void) void register_xmlreader(void)
{ {
xml_register_callback(parse_races); xml_register_callback(parse_races);
xml_register_callback(parse_calendar);
xml_register_callback(parse_resources); xml_register_callback(parse_resources);
xml_register_callback(parse_buildings); /* requires resources */ xml_register_callback(parse_buildings); /* requires resources */

View File

@ -34,6 +34,7 @@ extern "C" {
struct order; struct order;
extern struct attrib_type at_shiptrail; extern struct attrib_type at_shiptrail;
extern int *storms;
/* die Zahlen sind genau äquivalent zu den race Flags */ /* die Zahlen sind genau äquivalent zu den race Flags */
#define MV_CANNOTMOVE (1<<5) #define MV_CANNOTMOVE (1<<5)

View File

@ -123,13 +123,15 @@ static char *gamedate_season(const struct locale *lang)
static char buf[256]; /* FIXME: static return value */ static char buf[256]; /* FIXME: static return value */
gamedate gd; gamedate gd;
assert(weeknames);
get_gamedate(turn, &gd); get_gamedate(turn, &gd);
sprintf(buf, (const char *)LOC(lang, "nr_calendar_season"), sprintf(buf, (const char *)LOC(lang, "nr_calendar_season"),
LOC(lang, weeknames[gd.week]), LOC(lang, mkname("calendar", weeknames[gd.week])),
LOC(lang, monthnames[gd.month]), LOC(lang, mkname("calendar", calendar_month(gd.month))),
gd.year, gd.year,
agename ? LOC(lang, agename) : "", LOC(lang, seasonnames[gd.season])); LOC(lang, mkname("calendar", calendar_era())), LOC(lang, mkname("calendar", seasonnames[gd.season])));
return buf; return buf;
} }

View File

@ -151,13 +151,12 @@ static char *gamedate2(const struct locale *lang)
if (weeknames2) { if (weeknames2) {
week = weeknames2[gd.week]; week = weeknames2[gd.week];
} }
if (monthnames) { month = calendar_month(gd.month);
month = monthnames[gd.month];
}
sprintf(buf, "in %s des Monats %s im Jahre %d %s.", sprintf(buf, "in %s des Monats %s im Jahre %d %s.",
LOC(lang, week), LOC(lang, mkname("calendar", week)),
LOC(lang, month), LOC(lang, mkname("calendar", month)),
gd.year, agename ? LOC(lang, agename) : ""); gd.year,
LOC(lang, mkname("calendar", calendar_era())));
return buf; return buf;
} }