diff --git a/conf/e3/locales.xml b/conf/e3/locales.xml
index 2d94bf202..bb7245fa3 100644
--- a/conf/e3/locales.xml
+++ b/conf/e3/locales.xml
@@ -4,7 +4,6 @@
-
diff --git a/res/core/messages.xml b/res/core/messages.xml
index 5d8a60ef0..5bb36e345 100644
--- a/res/core/messages.xml
+++ b/res/core/messages.xml
@@ -2033,6 +2033,13 @@
$if($isnull($mage),"Ein unentdeckter Magier",$unit($mage)) erschuf einen heiligen Hain von $int($amount) Schößlingen.
$if($isnull($mage),"An unknown magician",$unit($mage)) created a holy forest of $int($amount) young trees.
+
+
+
+
+ "$if($isnull($mage),"Ein unentdeckter Magier",$unit($mage)) führt einen sonderbaren Tanz auf. Kurz darauf beginnt es zu regnen."
+ "$if($isnull($mage),"an unseen magician",$unit($mage)) dances a strange dance. Shortly after, rain begins to fall on the fields."
+
diff --git a/res/e3a/messages.xml b/res/e3a/messages.xml
deleted file mode 100644
index 03e5b6eb4..000000000
--- a/res/e3a/messages.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
- "$if($isnull($mage),"Ein unentdeckter Magier",$unit($mage)) führt einen sonderbaren Tanz auf. Kurz darauf beginnt es zu regnen."
- "$if($isnull($mage),"an unseen magician",$unit($mage)) dances a strange dance. Shortly after, rain begins to fall on the fields."
-
-
diff --git a/scripts/eressea/ponnuki.lua b/scripts/eressea/ponnuki.lua
index 1a5d1959e..b5ba58fbe 100644
--- a/scripts/eressea/ponnuki.lua
+++ b/scripts/eressea/ponnuki.lua
@@ -10,23 +10,25 @@ local jokes = {
}
local function ponnuki_brain(u)
- local i = math.random(#jokes)
- u:add_notice("Eine Botschaft von " .. tostring(u) .. ": " ..jokes[i])
- local d = math.random(6)
- local r = u.region:next(d-1)
- if r.terrain == 'glacier' then
u:clear_orders()
- u:add_order("NACH " .. directions[d])
- end
+ local i = math.random(#jokes)
+ u:add_order("BOTSCHAFT REGION \"" .. jokes[i] .. "\"")
+ eressea.log.info("Ponnuki is telling jokes in " .. tostring(u.region))
+ local d = math.random(6)
+ local r = u.region:next(d-1)
+ if r.terrain == 'glacier' then
+ u:add_order("NACH " .. directions[d])
+ eressea.log.info("Ponnuki is walking to " .. tostring(r))
+ end
end
function ponnuki.init()
-- initialize other scripts
+ local f = get_faction(666)
local u = get_unit(atoi36("ponn"))
if not u then
eressea.log.error("Ponnuki is missing, will re-create")
local home = get_region(-67, -5)
- local f = get_faction(666)
if home and f then
if home.terrain~="glacier" then
home.terrain="glacier"
@@ -44,10 +46,11 @@ function ponnuki.init()
else
eressea.log.error("Ponnuki cannot find Magrathea")
end
+ elseif u.faction==f then
+ eressea.log.info("Ponnuki is in " .. tostring(u.region))
+ u.status = 5 -- FLIEHE
end
- if u then
- ponnuki_brain(u)
- end
+ ponnuki_brain(u)
end
return ponnuki
diff --git a/scripts/run-turn.lua b/scripts/run-turn.lua
index 9118ed8ee..4099c7976 100644
--- a/scripts/run-turn.lua
+++ b/scripts/run-turn.lua
@@ -142,7 +142,7 @@ function process(rules, orders)
return -1
end
- callbacks(rules, 'init')
+ turn_begin()
init_summary()
-- run the turn:
@@ -151,14 +151,14 @@ function process(rules, orders)
return -1
end
- plan_monsters()
-
if nmr_check(config.maxnmrs or 80)~=0 then
return -1
end
-
- process_orders()
+ plan_monsters()
+ callbacks(rules, 'init')
+ turn_process()
callbacks(rules, 'update')
+ turn_end() -- ageing, etc.
write_files(config.locales)
dbupdate()
diff --git a/src/kernel/config.c b/src/kernel/config.c
index 37765914b..566b9fc88 100644
--- a/src/kernel/config.c
+++ b/src/kernel/config.c
@@ -869,6 +869,7 @@ const char * game_mailcmd(void)
}
*r = '\0';
log_warning("game.mailcmd configuration is not set, using %s from game.name", result);
+ config_set("game.mailcmd", result);
return result;
}
return param;
diff --git a/src/kernel/config.test.c b/src/kernel/config.test.c
index 40adaa364..ac35b85a3 100644
--- a/src/kernel/config.test.c
+++ b/src/kernel/config.test.c
@@ -278,6 +278,7 @@ static void test_game_mailcmd(CuTest *tc) {
CuAssertStrEquals(tc, "Eressea", game_name());
CuAssertStrEquals(tc, "ERESSEA", game_mailcmd());
config_set("game.name", "Hodor");
+ config_set("game.mailcmd", NULL);
CuAssertStrEquals(tc, "Hodor", game_name());
CuAssertStrEquals(tc, "HODOR", game_mailcmd());
config_set("game.mailcmd", "ERESSEA");
diff --git a/src/kernel/curse.c b/src/kernel/curse.c
index 25f89ec1f..01e77eace 100644
--- a/src/kernel/curse.c
+++ b/src/kernel/curse.c
@@ -107,24 +107,21 @@ void curse_init(attrib * a)
int curse_age(attrib * a, void *owner)
{
curse *c = (curse *)a->data.v;
- int result = 0;
-
+ int result = AT_AGE_KEEP;
UNUSED_ARG(owner);
c_clearflag(c, CURSE_ISNEW);
- if (c_flags(c) & CURSE_NOAGE) {
- c->duration = INT_MAX;
+ if ((c_flags(c) & CURSE_NOAGE) == 0) {
+ if (c->type->age) {
+ if (c->type->age(c) == 0) {
+ result = AT_AGE_REMOVE;
+ }
+ }
+ if (--c->duration <= 0) {
+ result = AT_AGE_REMOVE;
+ }
}
- if (c->type->age) {
- result = c->type->age(c);
- }
- if (result != 0) {
- c->duration = 0;
- }
- else if (c->duration != INT_MAX) {
- c->duration = MAX(0, c->duration - 1);
- }
- return (c->duration > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE;
+ return result;
}
void destroy_curse(curse * c)
@@ -308,6 +305,7 @@ void ct_register(const curse_type * ct)
unsigned int hash = tolower(ct->cname[0]) & 0xFF;
selist **ctlp = cursetypes + hash;
+ assert(ct->age==NULL || (ct->flags&CURSE_NOAGE) == 0);
selist_set_insert(ctlp, (void *)ct, NULL);
++ct_changes;
}
diff --git a/src/kernel/save.c b/src/kernel/save.c
index 83a218622..a3fc7e5af 100644
--- a/src/kernel/save.c
+++ b/src/kernel/save.c
@@ -240,10 +240,7 @@ static faction *factionorders(void)
}
/* Die Partei hat sich zumindest gemeldet, so dass sie noch
* nicht als untätig gilt */
-
- /* TODO: +1 ist ein Workaround, weil cturn erst in process_orders
- * incrementiert wird. */
- f->lastorders = turn + 1;
+ f->lastorders = turn;
}
else {
@@ -762,7 +759,7 @@ unit *read_unit(struct gamedata *data)
assert(u_race(u));
for (;;) {
- int n, level, weeks;
+ int n = NOSKILL, level, weeks;
skill_t sk;
READ_INT(data->store, &n);
sk = (skill_t)n;
@@ -1665,7 +1662,7 @@ int read_game(gamedata *data) {
if (rmax < 0) {
rmax = nread;
}
- log_debug(" - Einzulesende Regionen: %d/%d\r", rmax, nread);
+ log_debug(" - Einzulesende Regionen: %d/%d", rmax, nread);
while (--nread >= 0) {
unit **up;
@@ -1725,10 +1722,6 @@ int read_game(gamedata *data) {
update_interval(u->faction, r);
}
}
-
- if ((nread & 0x3FF) == 0) { /* das spart extrem Zeit */
- log_debug(" - Einzulesende Regionen: %d/%d * %d,%d \r", rmax, nread, r->x, r->y);
- }
--rmax;
}
read_borders(data);
diff --git a/src/magic.c b/src/magic.c
index 93c5009f5..ad6248ae1 100644
--- a/src/magic.c
+++ b/src/magic.c
@@ -3010,6 +3010,7 @@ int cast_spell(struct castorder *co)
fun = get_spellcast(sp->sname);
if (!fun) {
+ log_debug("no spell function for %s, try callback", sp->sname);
return callbacks.cast_spell(co, fname);
}
return fun(co);
diff --git a/src/monsters.c b/src/monsters.c
index 62c982532..ffc04b52e 100644
--- a/src/monsters.c
+++ b/src/monsters.c
@@ -187,25 +187,28 @@ void monsters_desert(struct faction *monsters)
}
}
-int monster_attacks(unit * monster, bool respect_buildings, bool rich_only)
+int monster_attacks(unit * monster, bool rich_only)
{
- region *r = monster->region;
- unit *u2;
- int money = 0;
+ if (monster->status < ST_AVOID) {
+ region *r = monster->region;
+ unit *u2;
+ int money = 0;
- for (u2 = r->units; u2; u2 = u2->next) {
- if (u2->faction != monster->faction && cansee(monster->faction, r, u2, 0) && !in_safe_building(u2, monster)) {
- int m = get_money(u2);
- if (!rich_only || m > 0) {
- order *ord = monster_attack(monster, u2);
- if (ord) {
- addlist(&monster->orders, ord);
- money += m;
+ for (u2 = r->units; u2; u2 = u2->next) {
+ if (u2->faction != monster->faction && cansee(monster->faction, r, u2, 0) && !in_safe_building(u2, monster)) {
+ int m = get_money(u2);
+ if (!rich_only || m > 0) {
+ order *ord = monster_attack(monster, u2);
+ if (ord) {
+ addlist(&monster->orders, ord);
+ money += m;
+ }
}
}
}
+ return money;
}
- return money;
+ return 0;
}
static order *get_money_for_dragon(region * r, unit * udragon, int wanted)
@@ -226,7 +229,7 @@ static order *get_money_for_dragon(region * r, unit * udragon, int wanted)
* und holt sich Silber von Einheiten, vorausgesetzt er bewacht bereits */
money = 0;
if (attacks && is_guard(udragon)) {
- money += monster_attacks(udragon, true, true);
+ money += monster_attacks(udragon, true);
}
/* falls die einnahmen erreicht werden, bleibt das monster noch eine */
@@ -749,7 +752,7 @@ void plan_monsters(faction * f)
}
if (attacking && (!r->land || is_guard(u))) {
- monster_attacks(u, true, false);
+ monster_attacks(u, false);
}
/* units with a plan to kill get ATTACK orders: */
@@ -773,7 +776,7 @@ void plan_monsters(faction * f)
}
/* All monsters guard the region: */
- if (!monster_is_waiting(u) && r->land) {
+ if (u->status < ST_FLEE && !monster_is_waiting(u) && r->land) {
addlist(&u->orders, create_order(K_GUARD, u->faction->locale, NULL));
}
diff --git a/src/monsters.test.c b/src/monsters.test.c
index 3f2782173..b09bb23de 100644
--- a/src/monsters.test.c
+++ b/src/monsters.test.c
@@ -27,7 +27,7 @@
#include
extern void plan_monsters(struct faction *f);
-extern int monster_attacks(unit * monster, bool respect_buildings, bool rich_only);
+extern int monster_attacks(unit * monster, bool rich_only);
static order *find_order(const char *expected, const unit *unit)
{
@@ -64,6 +64,7 @@ static void create_monsters(faction **player, faction **monsters, unit **u, unit
*u = test_create_unit(*player, r);
unit_setid(*u, 1);
*m = test_create_unit(*monsters, r);
+ unit_setstatus(*m, ST_FIGHT);
}
static void test_monsters_attack(CuTest * tc)
@@ -72,7 +73,6 @@ static void test_monsters_attack(CuTest * tc)
unit *u, *m;
create_monsters(&f, &f2, &u, &m);
-
setguard(m, true);
config_set("rules.monsters.attack_chance", "1");
@@ -112,7 +112,7 @@ static void test_monsters_waiting(CuTest * tc)
create_monsters(&f, &f2, &u, &m);
setguard(m, true);
fset(m, UFL_ISNEW);
- monster_attacks(m, false, false);
+ monster_attacks(m, false);
CuAssertPtrEquals(tc, 0, find_order("attack 1", m));
test_cleanup();
}
diff --git a/src/spells.c b/src/spells.c
index fc8c445b7..ea5b2c052 100644
--- a/src/spells.c
+++ b/src/spells.c
@@ -2081,7 +2081,6 @@ static int sp_homestone(castorder * co)
cmistake(mage, co->order, 206, MSG_MAGIC);
return 0;
}
- c_setflag(c, CURSE_NOAGE | CURSE_ONLYONE);
/* Magieresistenz der Burg erhoeht sich um 50% */
effect = 50.0F;
diff --git a/src/spells/buildingcurse.c b/src/spells/buildingcurse.c
index 158383fd2..9c87aaba4 100644
--- a/src/spells/buildingcurse.c
+++ b/src/spells/buildingcurse.c
@@ -76,7 +76,7 @@ CURSETYP_NORM, 0, M_SUMEFFECT, cinfo_magicrunes
/* Heimstein-Zauber */
static struct curse_type ct_magicwalls = { "magicwalls",
-CURSETYP_NORM, 0, NO_MERGE, cinfo_building
+CURSETYP_NORM, CURSE_ONLYONE|CURSE_NOAGE, NO_MERGE, cinfo_building
};
/* Feste Mauer - Präkampfzauber, wirkt nur 1 Runde */
diff --git a/src/spells/flyingship.c b/src/spells/flyingship.c
index 2057b72e0..eac2043dd 100644
--- a/src/spells/flyingship.c
+++ b/src/spells/flyingship.c
@@ -149,10 +149,8 @@ bool flying_ship(const ship * sh)
static curse *shipcurse_flyingship(ship * sh, unit * mage, double power, int duration)
{
curse *c;
- const curse_type *ct_flyingship = ct_find("flyingship");
- assert(ct_flyingship);
if (sh->attribs) {
- if (curse_active(get_curse(sh->attribs, ct_flyingship))) {
+ if (curse_active(get_curse(sh->attribs, &ct_flyingship))) {
return NULL;
}
if (is_cursed(sh->attribs, C_SHIP_SPEEDUP, 0)) {
@@ -160,7 +158,7 @@ static curse *shipcurse_flyingship(ship * sh, unit * mage, double power, int dur
}
}
/* mit C_SHIP_NODRIFT haben wir kein Problem */
- c = create_curse(mage, &sh->attribs, ct_flyingship, power, duration, 0.0, 0);
+ c = create_curse(mage, &sh->attribs, &ct_flyingship, power, duration, 0.0, 0);
if (c) {
c->data.v = sh;
if (c->duration > 0) {
diff --git a/src/summary.c b/src/summary.c
index 90cab98c0..916124815 100644
--- a/src/summary.c
+++ b/src/summary.c
@@ -92,7 +92,7 @@ int update_nmrs(void)
++newplayers;
}
else if (!fval(f, FFL_NOIDLEOUT|FFL_CURSED)) {
- int nmr = turn - f->lastorders + 1;
+ int nmr = turn - f->lastorders;
if (timeout>0) {
if (nmr < 0 || nmr > timeout) {
log_error("faction %s has %d NMR", itoa36(f->no), nmr);