diff --git a/res/core/messages.xml b/res/core/messages.xml
index d40efb9ac..ecb5707c1 100644
--- a/res/core/messages.xml
+++ b/res/core/messages.xml
@@ -2690,6 +2690,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/translations/messages.de.po b/res/translations/messages.de.po
index 5d2717e51..af60271ba 100644
--- a/res/translations/messages.de.po
+++ b/res/translations/messages.de.po
@@ -2775,7 +2775,10 @@ msgid "error324"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit gehört nicht zu unserer Partei.\""
msgid "error322"
-msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist bereits auf einem Schiff.\""
+msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur Schiffe gleicher Bauart können einen Konvoi bilden.\""
+
+msgid "error328"
+msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur Schiffe an der selben Küste können einen Konvoi bilden.\""
msgid "error323"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist verzaubert.\""
diff --git a/res/translations/messages.en.po b/res/translations/messages.en.po
index 659adee9f..9ec9c934b 100644
--- a/res/translations/messages.en.po
+++ b/res/translations/messages.en.po
@@ -2781,11 +2781,14 @@ msgid "error324"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not one of ours.\""
msgid "error322"
-msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is already on a ship.\""
+msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only ships of the same type can form a convoy.\""
msgid "error323"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is under a spell.\""
+msgid "error328"
+msgstr "\"$unit($unit) in $region($region): '$order($command)' - All ships of a convoy must be on the same coast.\""
+
msgid "dissolve_units_2"
msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) turned into $if($eq($number,1),\"a tree\", \"trees\").\""
diff --git a/scripts/tests/e2/spells.lua b/scripts/tests/e2/spells.lua
index de2386113..9cdc28b96 100644
--- a/scripts/tests/e2/spells.lua
+++ b/scripts/tests/e2/spells.lua
@@ -14,6 +14,29 @@ function setup()
eressea.settings.set("magic.regeneration.enable", "0")
end
+function test_undead_cannot_enter_holyground()
+ local r1 = region.create(0, 0, 'plain')
+ local r2 = region.create(1, 0, 'plain')
+ local f = faction.create('human')
+ local u1 = unit.create(f, r1, 1)
+ local u2 = unit.create(f, r2, 1)
+
+ u2.name = "Xolgrim's Magier"
+ u1.name = "Xolgrim's Opfer"
+
+ u2.magic = 'gwyrrd'
+ u2:set_skill('magic', 100)
+ u2.aura = 200
+ u2:add_spell('holyground')
+ u2:add_order('ZAUBERE STUFE 10 "Heiliger Boden"')
+
+ u1.race = "skeleton"
+ u1:add_order("NACH Osten")
+ process_orders()
+ assert_not_nil(r2:get_curse('holyground'))
+ assert_equal(r1, u1.region)
+end
+
function test_shapeshift()
local r = region.create(42, 0, "plain")
local f = faction.create("demon", "noreply@eressea.de", "de")
diff --git a/src/bind_monsters.c b/src/bind_monsters.c
index f9aef4a2a..2acacfaa3 100644
--- a/src/bind_monsters.c
+++ b/src/bind_monsters.c
@@ -28,9 +28,6 @@ static int tolua_levitate_ship(lua_State * L)
return 1;
}
-extern void spawn_undead(void);
-extern void plan_monsters(struct faction *f);
-
static int tolua_planmonsters(lua_State * L)
{
faction *f = (faction *)tolua_tousertype(L, 1, get_monsters());
diff --git a/src/bind_tolua.c b/src/bind_tolua.c
index d681b9088..3812e7689 100644
--- a/src/bind_tolua.c
+++ b/src/bind_tolua.c
@@ -14,7 +14,8 @@
#include
-void tolua_bind_open(lua_State * L) {
+void tolua_bind_open(lua_State * L)
+{
tolua_eressea_open(L);
tolua_process_open(L);
tolua_settings_open(L);
diff --git a/src/bindings.c b/src/bindings.c
index 5cb758175..f2beb6d06 100755
--- a/src/bindings.c
+++ b/src/bindings.c
@@ -3,6 +3,7 @@
#endif
#include "bindings.h"
+#include "bind_tolua.h"
#include "console.h"
#include "gamedb.h"
@@ -865,8 +866,6 @@ static int lua_rng_default(lua_State *L) {
return 0;
}
-void tolua_bind_open(lua_State * L);
-
int tolua_bindings_open(lua_State * L, const dictionary *inifile)
{
tolua_open(L);
diff --git a/src/bindings.h b/src/bindings.h
index 144f65ca6..f0259bc6e 100755
--- a/src/bindings.h
+++ b/src/bindings.h
@@ -12,6 +12,8 @@ extern "C" {
int tolua_selist_push(struct lua_State *L, const char *list_type,
const char *elem_type, struct selist *list);
+ void bind_monsters(struct lua_State *L);
+
int log_lua_error(struct lua_State *L);
void lua_done(struct lua_State *L);
diff --git a/src/give.c b/src/give.c
index ac792da9a..ff1a3ac03 100644
--- a/src/give.c
+++ b/src/give.c
@@ -371,7 +371,7 @@ message * give_ship(unit *u1, unit *u2, int n, order *ord)
u2->ship->coast = u1->ship->coast;
}
else {
- return msg_error(u1, ord, 182);
+ return msg_error(u1, ord, 328);
}
}
}
diff --git a/src/kernel/messages.c b/src/kernel/messages.c
index 656e08b3a..98411973d 100644
--- a/src/kernel/messages.c
+++ b/src/kernel/messages.c
@@ -62,6 +62,7 @@ static message *missing_feedback(const char *name, const struct unit *u,
log_error("trying to create undefined feedback of type \"%s\"\n", name);
}
else if (missing_message_mode == MESSAGE_MISSING_REPLACE) {
+ log_warning("trying to create undefined message of type \"%s\"\n", name);
if (strcmp(name, "missing_feedback") != 0) {
if (!mt_find("missing_feedback")) {
mt_create_va(mt_new("missing_feedback", NULL), "unit:unit",
diff --git a/src/laws.c b/src/laws.c
index 10975c6a7..53b49e1b6 100644
--- a/src/laws.c
+++ b/src/laws.c
@@ -594,6 +594,13 @@ growing_trees_e3(region * r, const int current_season,
}
}
+static short cap_short(int i) {
+ if (i > SHRT_MIN) {
+ return ((i < SHRT_MAX) ? (short)i : SHRT_MAX);
+ }
+ return SHRT_MIN;
+}
+
static void
growing_trees(region * r, const season_t current_season, const season_t last_weeks_season)
{
@@ -687,8 +694,8 @@ growing_trees(region * r, const season_t current_season, const season_t last_wee
a = a_find(r->attribs, &at_germs);
if (!a) {
a = a_add(&r->attribs, a_new(&at_germs));
- a->data.sa[0] = (short)rtrees(r, 0);
- a->data.sa[1] = (short)rtrees(r, 1);
+ a->data.sa[0] = cap_short(rtrees(r, 0));
+ a->data.sa[1] = cap_short(rtrees(r, 1));
}
/* wir haben 6 Wochen zum wachsen, jeder Same/Spross hat 18% Chance
* zu wachsen, damit sollten nach 5-6 Wochen alle gewachsen sein */
@@ -3712,8 +3719,9 @@ void process(void)
log_debug("- Step %u", prio);
while (proc && proc->priority == prio) {
- if (proc->name)
+ if (proc->name) {
log_debug(" - %s", proc->name);
+ }
proc = proc->next;
}
@@ -3721,8 +3729,9 @@ void process(void)
pglobal->data.global.process();
pglobal = pglobal->next;
}
- if (pglobal == NULL || pglobal->priority != prio)
+ if (pglobal == NULL || pglobal->priority != prio) {
continue;
+ }
for (r = regions; r; r = r->next) {
unit *u;
@@ -3733,8 +3742,9 @@ void process(void)
pregion->data.per_region.process(r);
pregion = pregion->next;
}
- if (pregion == NULL || pregion->priority != prio)
+ if (pregion == NULL || pregion->priority != prio) {
continue;
+ }
if (r->units) {
for (u = r->units; u; u = u->next) {
@@ -3744,14 +3754,16 @@ void process(void)
punit->data.per_unit.process(u);
punit = punit->next;
}
- if (punit == NULL || punit->priority != prio)
+ if (punit == NULL || punit->priority != prio) {
continue;
+ }
porder = punit;
while (porder && porder->priority == prio && porder->type == PR_ORDER) {
order **ordp = &u->orders;
- if (porder->flags & PROC_THISORDER)
+ if (porder->flags & PROC_THISORDER) {
ordp = &u->thisorder;
+ }
while (*ordp) {
order *ord = *ordp;
if (getkeyword(ord) == porder->data.per_order.kword) {
@@ -3780,8 +3792,9 @@ void process(void)
}
}
}
- if (!ord || *ordp == ord)
+ if (!ord || *ordp == ord) {
ordp = &(*ordp)->next;
+ }
}
porder = porder->next;
}
@@ -3798,9 +3811,9 @@ void process(void)
pregion->data.per_region.process(r);
pregion = pregion->next;
}
- if (pregion == NULL || pregion->priority != prio)
+ if (pregion == NULL || pregion->priority != prio) {
continue;
-
+ }
}
}
diff --git a/src/main.c b/src/main.c
index cfc2f9c22..130a2f6f7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -290,8 +290,6 @@ void locale_init(void)
}
}
-extern void bind_monsters(lua_State *L);
-
int main(int argc, char **argv)
{
int err = 0;
diff --git a/src/monsters.h b/src/monsters.h
index 81f7e39a3..99d60a3fb 100644
--- a/src/monsters.h
+++ b/src/monsters.h
@@ -21,6 +21,10 @@ extern "C" {
bool monster_is_waiting(const struct unit *u);
void make_zombie(struct unit * u);
+ void spawn_undead(void);
+ void plan_monsters(struct faction *f);
+
+
#ifdef __cplusplus
}
#endif
diff --git a/src/move.c b/src/move.c
index d33987d54..5d5513cd3 100644
--- a/src/move.c
+++ b/src/move.c
@@ -974,10 +974,17 @@ bool move_blocked(const unit * u, const region * r, const region * r2)
}
if (r->attribs) {
- const curse_type *fogtrap_ct = &ct_fogtrap;
- curse *c = get_curse(r->attribs, fogtrap_ct);
+ curse *c = get_curse(r->attribs, &ct_fogtrap);
+ if (curse_active(c)) {
+ return true;
+ }
+ }
+
+ if (r2->attribs && fval(u_race(u), RCF_UNDEAD)) {
+ curse *c = get_curse(r2->attribs, &ct_holyground);
return curse_active(c);
}
+
return false;
}