diff --git a/conf/calendar.json b/conf/calendar.json new file mode 100644 index 000000000..8a134dc40 --- /dev/null +++ b/conf/calendar.json @@ -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" + ] + } +} diff --git a/conf/e2/config.json b/conf/e2/config.json index 46ee01497..84265b78f 100644 --- a/conf/e2/config.json +++ b/conf/e2/config.json @@ -1,9 +1,10 @@ { - "include": [ - "keywords.json", - "prefixes.json", + "include": [ + "keywords.json", + "calendar.json", + "prefixes.json", "e2/terrains.json" - ], + ], "disabled": [ "jsreport" ], @@ -22,6 +23,7 @@ "hunger.long": true, "init_spells": 0, "game.era": 2, + "game.start": 184, "rules.reserve.twophase": true, "rules.give.max_men": -1, "rules.check_overload": false, diff --git a/conf/e2/rules.xml b/conf/e2/rules.xml index 8d0b01b27..c237773ab 100644 --- a/conf/e2/rules.xml +++ b/conf/e2/rules.xml @@ -16,7 +16,6 @@ - diff --git a/conf/e3/config.json b/conf/e3/config.json index beb45f35d..adbfa3526 100644 --- a/conf/e3/config.json +++ b/conf/e3/config.json @@ -1,6 +1,7 @@ { "include": [ "keywords.json", + "calendar.json", "prefixes.json", "e3/terrains.json" ], @@ -52,6 +53,7 @@ "study.expensivemigrants": true, "study.speedup": 2, "game.era": 3, + "game.start": 1, "rules.reserve.twophase": true, "rules.owners.force_leave": false, "rules.wage.function": 2, diff --git a/conf/e3/rules.xml b/conf/e3/rules.xml index d59787551..b86a397c8 100644 --- a/conf/e3/rules.xml +++ b/conf/e3/rules.xml @@ -21,8 +21,6 @@ - - diff --git a/res/core/calendar.xml b/res/core/calendar.xml deleted file mode 100644 index d96037698..000000000 --- a/res/core/calendar.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/core/de/strings.xml b/res/core/de/strings.xml index 349892e4e..c26bfe03b 100644 --- a/res/core/de/strings.xml +++ b/res/core/de/strings.xml @@ -6523,13 +6523,17 @@ Sonnenfeuer sunfire - + + neuer Zeitrechnung + of the new age + + des zweiten Zeitalters the second age - - neuer Zeitrechnung - of the new age + + des dritten Zeitalters + the third age diff --git a/res/e3a/strings.xml b/res/e3a/strings.xml index eb9f48cf3..e3c5b10ae 100644 --- a/res/e3a/strings.xml +++ b/res/e3a/strings.xml @@ -38,12 +38,6 @@ adamantium plates - - - des dritten Zeitalters - the third age - - Packeis fast ice @@ -87,6 +81,7 @@ repeating crossbows + Gerüst scaffolding @@ -103,6 +98,7 @@ Wache watch + Marktplatz marketplace diff --git a/scripts/eressea/frost.lua b/scripts/eressea/frost.lua index 2c2df4dae..beeef68f6 100644 --- a/scripts/eressea/frost.lua +++ b/scripts/eressea/frost.lua @@ -1,11 +1,11 @@ local function is_winter(turn) local season = get_season(turn) - return season == "calendar::winter" + return season == "winter" end local function is_spring(turn) local season = get_season(turn) - return season == "calendar::spring" + return season == "spring" end local function freeze(r, chance) diff --git a/scripts/eressea/xmasitems.lua b/scripts/eressea/xmasitems.lua index 27ea641ee..dffea2675 100644 --- a/scripts/eressea/xmasitems.lua +++ b/scripts/eressea/xmasitems.lua @@ -87,7 +87,7 @@ local self = {} function self.update() local turn = get_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") local msg = message.create("xmastree_effect") for r in regions() do @@ -103,7 +103,7 @@ function self.update() end else local prevseason = get_season(turn-1) - if prevseason == "calendar::winter" then + if prevseason == "winter" then -- we celebrate knut and kick out the trees. for r in regions() do if r:get_key("xm06") then diff --git a/scripts/tests/e2/e2features.lua b/scripts/tests/e2/e2features.lua index eb118c931..6495bd5e6 100644 --- a/scripts/tests/e2/e2features.lua +++ b/scripts/tests/e2/e2features.lua @@ -11,8 +11,8 @@ function setup() end function test_calendar() - assert_equal(get_season(1011), "calendar::winter") - assert_equal(get_season(1012), "calendar::spring") + assert_equal("winter", get_season(1011)) + assert_equal("spring", get_season(1012)) end function test_herbalism() diff --git a/scripts/tests/e3/rules.lua b/scripts/tests/e3/rules.lua index 60adf77d1..7eb2f13a3 100644 --- a/scripts/tests/e3/rules.lua +++ b/scripts/tests/e3/rules.lua @@ -38,7 +38,7 @@ function teardown() end function test_calendar() - assert_equal(get_season(396), "calendar::winter") + assert_equal("winter", get_season(396)) end function disable_test_bug_1738_build_castle_e3() diff --git a/src/calendar.c b/src/calendar.c index 1804ff497..6fd717429 100644 --- a/src/calendar.c +++ b/src/calendar.c @@ -1,20 +1,35 @@ #include #include "calendar.h" +#include "move.h" /* storms */ + #include #include #include +#include int first_month = 0; int weeks_per_month = 3; int months_per_year = 12; -char **seasonnames = NULL; +const char *seasonnames[CALENDAR_SEASONS] = { "winter", "spring", "summer", "fall" }; char **weeknames = NULL; char **weeknames2 = NULL; -char **monthnames = 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) { @@ -27,7 +42,7 @@ const gamedate *get_gamedate(int turn, gamedate * gd) int t = turn - first_turn(); assert(gd); - assert(t >= 0); + assert(t>=0); 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 */ @@ -40,34 +55,17 @@ void calendar_cleanup(void) { 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) { if (weeknames) free(weeknames[i]); if (weeknames2) free(weeknames2[i]); } + + free(storms); + storms = 0; + free(month_season); + month_season = 0; free(weeknames); weeknames = 0; free(weeknames2); diff --git a/src/calendar.h b/src/calendar.h index d398cd77c..f8efa392c 100644 --- a/src/calendar.h +++ b/src/calendar.h @@ -11,17 +11,12 @@ extern "C" { SEASON_SUMMER, SEASON_AUTUMN }; - - extern char *agename; - extern int first_month; - - extern int seasons; - extern char **seasonnames; +#define CALENDAR_SEASONS 4 + extern const char *seasonnames[CALENDAR_SEASONS]; extern int months_per_year; - extern char **monthnames; extern int *month_season; - extern int *storms; /* in movement.c */ + extern int first_month; extern char **weeknames; extern char **weeknames2; @@ -36,6 +31,8 @@ extern "C" { const gamedate *get_gamedate(int turn, gamedate * gd); void calendar_cleanup(void); +const char *calendar_month(int index); +const char *calendar_era(void); int first_turn(void); #ifdef __cplusplus diff --git a/src/kernel/jsonconf.c b/src/kernel/jsonconf.c index 9f96ea9d7..b7d79b64d 100644 --- a/src/kernel/jsonconf.c +++ b/src/kernel/jsonconf.c @@ -33,6 +33,8 @@ without prior permission by the authors of Eressea. /* game modules */ #include "prefix.h" +#include "move.h" +#include "calendar.h" /* util includes */ #include @@ -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) { cJSON *child; if (json->type != cJSON_Object) { @@ -890,6 +960,9 @@ void json_config(cJSON *json) { else if (strcmp(child->string, "strings") == 0) { json_strings(child); } + else if (strcmp(child->string, "calendar") == 0) { + json_calendar(child); + } else if (strcmp(child->string, "directions") == 0) { json_directions(child); } diff --git a/src/kernel/xmlreader.c b/src/kernel/xmlreader.c index 080ff4207..7ba3ceb94 100644 --- a/src/kernel/xmlreader.c +++ b/src/kernel/xmlreader.c @@ -30,6 +30,7 @@ without prior permission by the authors of Eressea. #include "spellbook.h" #include "calendar.h" #include "prefix.h" +#include "move.h" #include "vortex.h" @@ -398,6 +399,7 @@ static int parse_buildings(xmlDocPtr doc) return 0; } +#if 0 static int parse_calendar(xmlDocPtr doc) { xmlXPathContextPtr xpath = xmlXPathNewContext(doc); @@ -523,7 +525,7 @@ static int parse_calendar(xmlDocPtr doc) return 0; } - +#endif static int parse_ships(xmlDocPtr doc) { xmlXPathContextPtr xpath = xmlXPathNewContext(doc); @@ -1869,7 +1871,6 @@ static int parse_strings(xmlDocPtr doc) void register_xmlreader(void) { xml_register_callback(parse_races); - xml_register_callback(parse_calendar); xml_register_callback(parse_resources); xml_register_callback(parse_buildings); /* requires resources */ diff --git a/src/move.h b/src/move.h index 4d0b4e9f2..d5b07fef9 100644 --- a/src/move.h +++ b/src/move.h @@ -34,6 +34,7 @@ extern "C" { struct order; extern struct attrib_type at_shiptrail; + extern int *storms; /* die Zahlen sind genau äquivalent zu den race Flags */ #define MV_CANNOTMOVE (1<<5) diff --git a/src/report.c b/src/report.c index dbcf54ff1..188d8dfa9 100644 --- a/src/report.c +++ b/src/report.c @@ -123,13 +123,15 @@ static char *gamedate_season(const struct locale *lang) static char buf[256]; /* FIXME: static return value */ gamedate gd; + assert(weeknames); + get_gamedate(turn, &gd); sprintf(buf, (const char *)LOC(lang, "nr_calendar_season"), - LOC(lang, weeknames[gd.week]), - LOC(lang, monthnames[gd.month]), + LOC(lang, mkname("calendar", weeknames[gd.week])), + LOC(lang, mkname("calendar", calendar_month(gd.month))), 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; } diff --git a/src/summary.c b/src/summary.c index c18e54ee5..90cab98c0 100644 --- a/src/summary.c +++ b/src/summary.c @@ -151,13 +151,12 @@ static char *gamedate2(const struct locale *lang) if (weeknames2) { week = weeknames2[gd.week]; } - if (monthnames) { - month = monthnames[gd.month]; - } + month = calendar_month(gd.month); sprintf(buf, "in %s des Monats %s im Jahre %d %s.", - LOC(lang, week), - LOC(lang, month), - gd.year, agename ? LOC(lang, agename) : ""); + LOC(lang, mkname("calendar", week)), + LOC(lang, mkname("calendar", month)), + gd.year, + LOC(lang, mkname("calendar", calendar_era()))); return buf; }