diff --git a/res/core/de/strings.xml b/res/core/de/strings.xml
index 3186dcc42..0f16f91b1 100644
--- a/res/core/de/strings.xml
+++ b/res/core/de/strings.xml
@@ -1581,6 +1581,14 @@
Schneemann
snowman
+
+ Schneekugel
+ snow globe
+
+
+ Schneekugeln
+ snow globes
+
Schneemänner
snowmen
diff --git a/res/eressea/items.xml b/res/eressea/items.xml
index 076cc023c..8b2df7add 100644
--- a/res/eressea/items.xml
+++ b/res/eressea/items.xml
@@ -22,6 +22,12 @@
+
+ -
+
+
+
+
-
diff --git a/scripts/eressea/xmasitems.lua b/scripts/eressea/xmasitems.lua
new file mode 100644
index 000000000..6fe3512b8
--- /dev/null
+++ b/scripts/eressea/xmasitems.lua
@@ -0,0 +1,79 @@
+local function get_direction(locale, token)
+ local dir = eressea.locale.direction(locale, token)
+ if dir and dir>=0 then
+ return dir
+ end
+ return nil
+end
+
+function use_snowglobe(u, amount, token)
+ local direction = get_direction(u.faction.locale, token)
+ if direction then
+ local r = u.region:next(direction)
+ if r and r.terrain=="ocean" then
+ r.terrain = "glacier"
+ end
+ else
+ return -4
+ end
+ return 1
+end
+
+function use_snowman(u, amount)
+ if amount>0 and u.region.terrain == "glacier" then
+ local man = unit.create(u.faction, u.region)
+ man.race = "snowman"
+ man.number = amount
+ return amount
+ end
+ return -4
+end
+
+function use_xmastree(u, amount)
+ if u.region.herb~=nil then
+ -- TODO: else?
+ local trees = u.region:get_resource("tree")
+ u.region:set_key("xm06", true)
+ u.region:set_resource("tree", 10+trees)
+ local msg = message.create("usepotion")
+ msg:set_unit("unit", u)
+ msg:set_resource("potion", "xmastree")
+ msg:send_region(u.region)
+ return amount
+ end
+ return 0
+end
+
+local self = {}
+
+function self.update()
+ local turn = get_turn()
+ local season = get_season(turn)
+ if season == "calendar::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
+ if r:get_key("xm06") then
+ trees = r:get_resource("tree")
+ if trees*0.1>=1 then
+ r:set_resource("tree", trees * 1.1)
+ msg:send_region(r)
+ end
+ if clear then
+ end
+ end
+ end
+ else
+ local prevseason = get_season(turn-1)
+ if prevseason == "calendar::winter" then
+ -- we celebrate knut and kick out the trees.
+ for r in regions() do
+ if r:get_key("xm06") then
+ r:set_key("xm06", false)
+ end
+ end
+ end
+ end
+end
+
+return self
diff --git a/scripts/tests/e2/e2features.lua b/scripts/tests/e2/e2features.lua
index 8505bfd39..b9a705fa5 100644
--- a/scripts/tests/e2/e2features.lua
+++ b/scripts/tests/e2/e2features.lua
@@ -201,6 +201,18 @@ function test_no_uruk()
assert_equal(f1.race, "orc")
end
+function test_snowglobe()
+ local r1 = region.create(0, 0, "glacier")
+ local r2 = region.create(1, 0, "ocean")
+ local f = faction.create("noreply@eressea.de", "human", "de")
+ local u = unit.create(f, r1, 1)
+ u:add_item("snowglobe", 1)
+ u:clear_orders()
+ u:add_order("BENUTZEN 1 Schneekugel Ost")
+ process_orders()
+ assert_equal("glacier", r2.terrain)
+end
+
function test_snowman()
local r = region.create(0, 0, "glacier")
local f = faction.create("noreply@eressea.de", "human", "de")
diff --git a/src/helpers.c b/src/helpers.c
index a81a91679..c784e9901 100644
--- a/src/helpers.c
+++ b/src/helpers.c
@@ -19,6 +19,7 @@ without prior permission by the authors of Eressea.
#include
#include
#include
+#include
#include
#include
@@ -509,8 +510,8 @@ struct order *ord)
if (lua_isfunction(L, -1)) {
tolua_pushusertype(L, (void *)u, TOLUA_CAST "unit");
lua_pushinteger(L, amount);
-
- if (lua_pcall(L, 2, 1, 0) != 0) {
+ lua_pushstring(L, getstrtoken());
+ if (lua_pcall(L, 3, 1, 0) != 0) {
const char *error = lua_tostring(L, -1);
log_error("use(%s) calling '%s': %s.\n", unitname(u), fname, error);
lua_pop(L, 1);
diff --git a/src/laws.c b/src/laws.c
index f508c4b69..5c6d5a46e 100755
--- a/src/laws.c
+++ b/src/laws.c
@@ -3442,10 +3442,13 @@ void update_long_order(unit * u)
static int use_item(unit * u, const item_type * itype, int amount, struct order *ord)
{
int i;
- int target = read_unitid(u->faction, u->region);
+ int target = -1;
+
+ if (itype->useonother) {
+ target = read_unitid(u->faction, u->region);
+ }
i = get_pooled(u, itype->rtype, GET_DEFAULT, amount);
-
if (amount > i) {
/* TODO: message? eg. "not enough %, using only %" */
amount = i;
@@ -3455,20 +3458,16 @@ static int use_item(unit * u, const item_type * itype, int amount, struct order
}
if (target == -1) {
- int result;
- if (itype->use == NULL) {
- return EUNUSABLE;
+ if (itype->use) {
+ int result = itype->use(u, itype, amount, ord);
+ if (result > 0) {
+ use_pooled(u, itype->rtype, GET_DEFAULT, result);
+ }
+ return result;
}
- result = itype->use ? itype->use(u, itype, amount, ord) : EUNUSABLE;
- if (result>0) {
- use_pooled(u, itype->rtype, GET_DEFAULT, result);
- }
- return result;
+ return EUNUSABLE;
}
else {
- if (itype->useonother == NULL) {
- return EUNUSABLE;
- }
return itype->useonother(u, target, itype, amount, ord);
}
}