Merge branch 'develop' of github.com:ennorehling/eressea into develop

This commit is contained in:
Enno Rehling 2017-05-08 06:53:12 +02:00
commit a2c963beb0
30 changed files with 355 additions and 149 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

@ -15,8 +15,6 @@
<xi:include href="config://game/familiars.xml"/> <xi:include href="config://game/familiars.xml"/>
<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"/>
<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

@ -10,7 +10,6 @@
<xi:include href="config://game/ships.xml"/> <xi:include href="config://game/ships.xml"/>
<xi:include href="config://game/shipnames.xml"/> <xi:include href="config://game/shipnames.xml"/>
<xi:include href="config://core/calendar.xml"/>
<xi:include href="config://game/items.xml" /> <xi:include href="config://game/items.xml" />
<xi:include href="config://game/races.xml"/> <xi:include href="config://game/races.xml"/>
<xi:include href="config://game/buildings.xml"/> <xi:include href="config://game/buildings.xml"/>
@ -21,8 +20,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

@ -38,6 +38,7 @@ function ponnuki.init()
u.name = "Ponnuki" u.name = "Ponnuki"
u.info = "Go, Ponnuki, Go!" u.info = "Go, Ponnuki, Go!"
u.race_name = "Ritter von Go" u.race_name = "Ritter von Go"
u.status = 5 -- FLIEHE
print(u:show()) print(u:show())
end end
else else

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

@ -197,42 +197,42 @@ target_link_libraries(convert
) )
set(TESTS_SRC set(TESTS_SRC
monsters.test.c
names.test.c
donations.test.c
wormhole.test.c
alchemy.test.c
guard.test.c
test_eressea.c test_eressea.c
tests.c tests.c
alchemy.test.c
battle.test.c battle.test.c
vortex.test.c calendar.test.c
tests.test.c
volcano.test.c
reports.test.c
creport.test.c creport.test.c
report.test.c
summary.test.c
travelthru.test.c
direction.test.c direction.test.c
donations.test.c
economy.test.c economy.test.c
give.test.c
guard.test.c
json.test.c json.test.c
keyword.test.c keyword.test.c
give.test.c
laws.test.c laws.test.c
lighthouse.test.c lighthouse.test.c
magic.test.c magic.test.c
market.test.c market.test.c
monsters.test.c monsters.test.c
move.test.c move.test.c
names.test.c
piracy.test.c piracy.test.c
prefix.test.c prefix.test.c
renumber.test.c renumber.test.c
reports.test.c
report.test.c
summary.test.c
skill.test.c skill.test.c
spells.test.c spells.test.c
spy.test.c spy.test.c
study.test.c study.test.c
tests.test.c
travelthru.test.c
upkeep.test.c upkeep.test.c
volcano.test.c
vortex.test.c
wormhole.test.c
spells/flyingship.test.c spells/flyingship.test.c
spells/magicresistance.test.c spells/magicresistance.test.c
triggers/shock.test.c triggers/shock.test.c

View File

@ -921,7 +921,7 @@ static int init_data(const char *filename, const char *catalog)
if (l) { if (l) {
return l; return l;
} }
if (turn < 0) { if (turn <= 0) {
turn = first_turn(); turn = first_turn();
} }
return 0; return 0;

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 = 4; 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,8 +42,7 @@ const gamedate *get_gamedate(int turn, gamedate * gd)
int t = turn - first_turn(); int t = turn - first_turn();
assert(gd); assert(gd);
if (t < 0) assert(t>=0);
t = turn;
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 */
@ -41,36 +55,23 @@ 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);
weeknames2 = 0; weeknames2 = 0;
first_month = 0;
weeks_per_month = 3;
months_per_year = 12;
} }

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

98
src/calendar.test.c Normal file
View File

@ -0,0 +1,98 @@
#include <platform.h>
#include "calendar.h"
#include <kernel/config.h>
#include <CuTest.h>
#include "tests.h"
static void test_calendar_config(CuTest * tc)
{
gamedate gd;
test_setup();
get_gamedate(0, &gd);
CuAssertIntEquals(tc, 0, first_turn());
config_set_int("game.start", 42);
CuAssertIntEquals(tc, 42, first_turn());
test_cleanup();
}
static void test_calendar(CuTest * tc)
{
gamedate gd;
test_setup();
get_gamedate(0, &gd);
CuAssertIntEquals(tc, 1, gd.year);
CuAssertIntEquals(tc, 0, gd.season);
CuAssertIntEquals(tc, 0, gd.month);
CuAssertIntEquals(tc, 0, gd.week);
get_gamedate(1, &gd);
CuAssertIntEquals(tc, 1, gd.year);
CuAssertIntEquals(tc, 0, gd.season);
CuAssertIntEquals(tc, 0, gd.month);
CuAssertIntEquals(tc, 1, gd.week);
get_gamedate(weeks_per_month, &gd);
CuAssertIntEquals(tc, 1, gd.year);
CuAssertIntEquals(tc, 0, gd.season);
CuAssertIntEquals(tc, 1, gd.month);
CuAssertIntEquals(tc, 0, gd.week);
get_gamedate(weeks_per_month*months_per_year, &gd);
CuAssertIntEquals(tc, 2, gd.year);
CuAssertIntEquals(tc, 0, gd.season);
CuAssertIntEquals(tc, 0, gd.month);
CuAssertIntEquals(tc, 0, gd.week);
config_set_int("game.start", 42);
get_gamedate(42, &gd);
CuAssertIntEquals(tc, 1, gd.year);
CuAssertIntEquals(tc, 0, gd.season);
CuAssertIntEquals(tc, 0, gd.month);
CuAssertIntEquals(tc, 0, gd.week);
first_month = 2;
get_gamedate(42, &gd);
CuAssertIntEquals(tc, 1, gd.year);
CuAssertIntEquals(tc, 0, gd.season);
CuAssertIntEquals(tc, 2, gd.month);
CuAssertIntEquals(tc, 0, gd.week);
test_cleanup();
}
static void test_calendar_season(CuTest * tc)
{
gamedate gd;
test_setup();
month_season = calloc(months_per_year, sizeof(int));
get_gamedate(0, &gd);
CuAssertIntEquals(tc, 1, gd.year);
CuAssertIntEquals(tc, 0, gd.season);
CuAssertIntEquals(tc, 0, gd.month);
CuAssertIntEquals(tc, 0, gd.week);
month_season[1] = 1;
get_gamedate(weeks_per_month + 1, &gd);
CuAssertIntEquals(tc, 1, gd.year);
CuAssertIntEquals(tc, 1, gd.season);
CuAssertIntEquals(tc, 1, gd.month);
CuAssertIntEquals(tc, 1, gd.week);
test_cleanup();
}
CuSuite *get_calendar_suite(void)
{
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_calendar_config);
SUITE_ADD_TEST(suite, test_calendar);
SUITE_ADD_TEST(suite, test_calendar_season);
return suite;
}

View File

@ -96,7 +96,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
struct settings global; struct settings global;
bool lomem = false; bool lomem = false;
int turn = -1; int turn = 0;
const char *parameters[MAXPARAMS] = { const char *parameters[MAXPARAMS] = {
"LOCALE", "LOCALE",
@ -782,11 +782,18 @@ void config_set_from(const dictionary *d, const char *valid_keys[])
} }
} }
void config_set(const char *key, const char *value) { void config_set(const char *key, const char *value)
{
++config_cache_key; ++config_cache_key;
set_param(&configuration, key, value); set_param(&configuration, key, value);
} }
void config_set_int(const char *key, int value)
{
++config_cache_key;
set_param(&configuration, key, itoa10(value));
}
const char *config_get(const char *key) { const char *config_get(const char *key) {
return get_param(configuration, key); return get_param(configuration, key);
} }

View File

@ -121,6 +121,7 @@ extern "C" {
void free_params(struct param **pp); void free_params(struct param **pp);
void config_set(const char *key, const char *value); void config_set(const char *key, const char *value);
void config_set_int(const char *key, int value);
void config_set_from(const struct _dictionary_ *d, const char *keys[]); void config_set_from(const struct _dictionary_ *d, const char *keys[]);
const char *config_get(const char *key); const char *config_get(const char *key);
int config_get_int(const char *key, int def); int config_get_int(const char *key, int def);

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

@ -13,6 +13,8 @@
#include "order.h" #include "order.h"
#include "terrain.h" #include "terrain.h"
#include "move.h"
#include "calendar.h"
#include "prefix.h" #include "prefix.h"
#include "util/language.h" #include "util/language.h"
@ -75,7 +77,7 @@ static void test_settings(CuTest * tc)
"\"float\" : 1.5 }}"; "\"float\" : 1.5 }}";
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
test_cleanup(); test_setup();
config_set("game.id", "42"); /* should not be replaced */ config_set("game.id", "42"); /* should not be replaced */
config_set("game.name", "Eressea"); /* should not be replaced */ config_set("game.name", "Eressea"); /* should not be replaced */
json_config(json); json_config(json);
@ -99,7 +101,7 @@ static void test_prefixes(CuTest * tc)
"]}"; "]}";
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
test_cleanup(); test_setup();
json_config(json); json_config(json);
CuAssertPtrNotNull(tc, race_prefixes); CuAssertPtrNotNull(tc, race_prefixes);
CuAssertStrEquals(tc, "snow", race_prefixes[0]); CuAssertStrEquals(tc, "snow", race_prefixes[0]);
@ -119,7 +121,7 @@ static void test_disable(CuTest * tc)
"]}"; "]}";
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
test_cleanup(); test_setup();
CuAssertTrue(tc, skill_enabled(SK_ALCHEMY)); CuAssertTrue(tc, skill_enabled(SK_ALCHEMY));
CuAssertTrue(tc, !keyword_disabled(K_BANNER)); CuAssertTrue(tc, !keyword_disabled(K_BANNER));
CuAssertTrue(tc, !keyword_disabled(K_PAY)); CuAssertTrue(tc, !keyword_disabled(K_PAY));
@ -135,6 +137,31 @@ static void test_disable(CuTest * tc)
test_cleanup(); test_cleanup();
} }
static void test_calendar(CuTest * tc)
{
const char * data = "{\"calendar\": { "
"\"weeks\" : [ \"one\", \"two\", \"three\" ],"
"\"months\" : ["
"{ \"storm\" : 99, \"season\" : 1 },"
"{ \"storm\" : 22, \"season\" : 2 }"
"]"
"}}";
cJSON *json = cJSON_Parse(data);
test_setup();
json_config(json);
CuAssertPtrNotNull(tc, storms);
CuAssertIntEquals(tc, 2, months_per_year);
CuAssertIntEquals(tc, 3, weeks_per_month);
CuAssertIntEquals(tc, 99, storms[0]);
CuAssertIntEquals(tc, 22, storms[1]);
CuAssertPtrNotNull(tc, month_season);
CuAssertIntEquals(tc, 1, month_season[0]);
CuAssertIntEquals(tc, 2, month_season[1]);
cJSON_Delete(json);
test_cleanup();
}
static void test_races(CuTest * tc) static void test_races(CuTest * tc)
{ {
const char * data = "{\"races\": { \"orc\" : { " const char * data = "{\"races\": { \"orc\" : { "
@ -155,7 +182,7 @@ static void test_races(CuTest * tc)
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
const struct race *rc; const struct race *rc;
test_cleanup(); test_setup();
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
CuAssertPtrEquals(tc, 0, races); CuAssertPtrEquals(tc, 0, races);
@ -189,7 +216,7 @@ static void test_findrace(CuTest *tc) {
const race *rc; const race *rc;
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
test_cleanup(); test_setup();
lang = get_or_create_locale("de"); lang = get_or_create_locale("de");
CuAssertPtrEquals(tc, 0, (void *)findrace("Zwerg", lang)); CuAssertPtrEquals(tc, 0, (void *)findrace("Zwerg", lang));
@ -211,7 +238,7 @@ static void test_items(CuTest * tc)
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
const item_type * itype; const item_type * itype;
test_cleanup(); test_setup();
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
CuAssertPtrEquals(tc, 0, it_find("axe")); CuAssertPtrEquals(tc, 0, it_find("axe"));
@ -249,7 +276,7 @@ static void test_ships(CuTest * tc)
const ship_type *st; const ship_type *st;
const terrain_type *ter; const terrain_type *ter;
test_cleanup(); test_setup();
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
CuAssertPtrEquals(tc, 0, shiptypes); CuAssertPtrEquals(tc, 0, shiptypes);
@ -286,7 +313,7 @@ static void test_castles(CuTest *tc) {
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
const building_type *bt; const building_type *bt;
test_cleanup(); test_setup();
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
CuAssertPtrEquals(tc, 0, buildingtypes); CuAssertPtrEquals(tc, 0, buildingtypes);
@ -311,7 +338,7 @@ static void test_spells(CuTest * tc)
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
const spell *sp; const spell *sp;
test_cleanup(); test_setup();
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
CuAssertPtrEquals(tc, 0, find_spell("fireball")); CuAssertPtrEquals(tc, 0, find_spell("fireball"));
@ -350,7 +377,7 @@ static void test_buildings(CuTest * tc)
cJSON *json = cJSON_Parse(building_data); cJSON *json = cJSON_Parse(building_data);
const building_type *bt; const building_type *bt;
test_cleanup(); test_setup();
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
CuAssertPtrEquals(tc, 0, buildingtypes); CuAssertPtrEquals(tc, 0, buildingtypes);
@ -400,7 +427,7 @@ static void test_buildings_default(CuTest * tc)
const building_type *bt; const building_type *bt;
building_type clone; building_type clone;
test_cleanup(); test_setup();
bt = bt_get_or_create("house"); bt = bt_get_or_create("house");
clone = *bt; clone = *bt;
@ -425,7 +452,7 @@ static void test_ships_default(CuTest * tc)
const ship_type *st; const ship_type *st;
ship_type clone; ship_type clone;
test_cleanup(); test_setup();
st = st_get_or_create("hodor"); st = st_get_or_create("hodor");
clone = *st; clone = *st;
@ -446,7 +473,7 @@ static void test_configs(CuTest * tc)
FILE *F; FILE *F;
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
test_cleanup(); test_setup();
F = fopen("test.json", "w"); F = fopen("test.json", "w");
fwrite(building_data, 1, strlen(building_data), F); fwrite(building_data, 1, strlen(building_data), F);
@ -475,7 +502,7 @@ static void test_terrains(CuTest * tc)
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
test_cleanup(); test_setup();
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
CuAssertPtrEquals(tc, 0, (void *)get_terrain("plain")); CuAssertPtrEquals(tc, 0, (void *)get_terrain("plain"));
@ -511,7 +538,7 @@ static void test_directions(CuTest * tc)
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
test_cleanup(); test_setup();
lang = get_or_create_locale("de"); lang = get_or_create_locale("de");
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
CuAssertIntEquals(tc, NODIRECTION, get_direction("ost", lang)); CuAssertIntEquals(tc, NODIRECTION, get_direction("ost", lang));
@ -533,7 +560,7 @@ static void test_skills(CuTest * tc)
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
test_cleanup(); test_setup();
lang = get_or_create_locale("de"); lang = get_or_create_locale("de");
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
CuAssertIntEquals(tc, NOSKILL, get_skill("potato", lang)); CuAssertIntEquals(tc, NOSKILL, get_skill("potato", lang));
@ -558,7 +585,7 @@ static void test_keywords(CuTest * tc)
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
test_cleanup(); test_setup();
lang = get_or_create_locale("de"); lang = get_or_create_locale("de");
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
CuAssertIntEquals(tc, NOKEYWORD, get_keyword("potato", lang)); CuAssertIntEquals(tc, NOKEYWORD, get_keyword("potato", lang));
@ -583,7 +610,7 @@ static void test_strings(CuTest * tc)
cJSON *json = cJSON_Parse(data); cJSON *json = cJSON_Parse(data);
CuAssertPtrNotNull(tc, json); CuAssertPtrNotNull(tc, json);
test_cleanup(); test_setup();
lang = get_or_create_locale("de"); lang = get_or_create_locale("de");
CuAssertPtrNotNull(tc, lang); CuAssertPtrNotNull(tc, lang);
CuAssertPtrEquals(tc, NULL, (void *)LOC(lang, "move")); CuAssertPtrEquals(tc, NULL, (void *)LOC(lang, "move"));
@ -640,6 +667,7 @@ CuSuite *get_jsonconf_suite(void)
SUITE_ADD_TEST(suite, test_prefixes); SUITE_ADD_TEST(suite, test_prefixes);
SUITE_ADD_TEST(suite, test_disable); SUITE_ADD_TEST(suite, test_disable);
SUITE_ADD_TEST(suite, test_infinitive_from_config); SUITE_ADD_TEST(suite, test_infinitive_from_config);
SUITE_ADD_TEST(suite, test_calendar);
return suite; return suite;
} }

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

@ -4183,6 +4183,7 @@ static void reset_game(void)
void turn_begin(void) void turn_begin(void)
{ {
assert(turn >= 0);
++turn; ++turn;
reset_game(); reset_game();
} }

View File

@ -748,10 +748,6 @@ void plan_monsters(faction * f)
produceexp(u, SK_PERCEPTION, u->number); produceexp(u, SK_PERCEPTION, u->number);
} }
if (u->status > ST_BEHIND) {
setstatus(u, ST_FIGHT);
/* all monsters fight */
}
if (attacking && (!r->land || is_guard(u))) { if (attacking && (!r->land || is_guard(u))) {
monster_attacks(u, true, false); monster_attacks(u, true, false);
} }

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

View File

@ -116,35 +116,36 @@ int RunAllTests(int argc, char *argv[])
ADD_SUITE(ally); ADD_SUITE(ally);
ADD_SUITE(messages); ADD_SUITE(messages);
/* gamecode */ /* gamecode */
ADD_SUITE(guard);
ADD_SUITE(report);
ADD_SUITE(creport);
ADD_SUITE(summary);
ADD_SUITE(names);
ADD_SUITE(battle); ADD_SUITE(battle);
ADD_SUITE(volcano); ADD_SUITE(calendar);
ADD_SUITE(creport);
ADD_SUITE(donations); ADD_SUITE(donations);
ADD_SUITE(travelthru);
ADD_SUITE(economy); ADD_SUITE(economy);
ADD_SUITE(flyingship); ADD_SUITE(flyingship);
ADD_SUITE(give); ADD_SUITE(give);
ADD_SUITE(guard);
ADD_SUITE(key);
ADD_SUITE(laws); ADD_SUITE(laws);
ADD_SUITE(lighthouse); ADD_SUITE(lighthouse);
ADD_SUITE(market); ADD_SUITE(market);
ADD_SUITE(monsters); ADD_SUITE(monsters);
ADD_SUITE(move); ADD_SUITE(move);
ADD_SUITE(names);
ADD_SUITE(otherfaction);
ADD_SUITE(piracy); ADD_SUITE(piracy);
ADD_SUITE(prefix); ADD_SUITE(prefix);
ADD_SUITE(renumber); ADD_SUITE(renumber);
ADD_SUITE(key); ADD_SUITE(report);
ADD_SUITE(shock);
ADD_SUITE(spy);
ADD_SUITE(stealth); ADD_SUITE(stealth);
ADD_SUITE(otherfaction); ADD_SUITE(study);
ADD_SUITE(summary);
ADD_SUITE(travelthru);
ADD_SUITE(upkeep); ADD_SUITE(upkeep);
ADD_SUITE(volcano);
ADD_SUITE(vortex); ADD_SUITE(vortex);
ADD_SUITE(wormhole); ADD_SUITE(wormhole);
ADD_SUITE(spy);
ADD_SUITE(study);
ADD_SUITE(shock);
if (suites) { if (suites) {
CuSuite *summary = CuSuiteNew(); CuSuite *summary = CuSuiteNew();

View File

@ -3,6 +3,7 @@
#include "keyword.h" #include "keyword.h"
#include "prefix.h" #include "prefix.h"
#include "reports.h" #include "reports.h"
#include "calendar.h"
#include <kernel/config.h> #include <kernel/config.h>
#include <kernel/alliance.h> #include <kernel/alliance.h>
@ -192,7 +193,7 @@ void test_log_stderr(int flags) {
static void test_reset(void) { static void test_reset(void) {
int i; int i;
turn = 0; turn = 1;
default_locale = 0; default_locale = 0;
if (errno) { if (errno) {
@ -206,6 +207,7 @@ static void test_reset(void) {
free_resources(); free_resources();
free_config(); free_config();
default_locale = 0; default_locale = 0;
calendar_cleanup();
close_orders(); close_orders();
free_locales(); free_locales();
free_spells(); free_spells();