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;
}