forked from github/server
putting all of the pieces together for the snow globe, with final use implementation still TBD
Conflicts: scripts/eressea/xmasitems.lua src/laws.c
This commit is contained in:
parent
81888132e4
commit
3fd4884584
|
@ -1581,6 +1581,14 @@
|
||||||
<text locale="de">Schneemann</text>
|
<text locale="de">Schneemann</text>
|
||||||
<text locale="en">snowman</text>
|
<text locale="en">snowman</text>
|
||||||
</string>
|
</string>
|
||||||
|
<string name="snowglobe">
|
||||||
|
<text locale="de">Schneekugel</text>
|
||||||
|
<text locale="en">snow globe</text>
|
||||||
|
</string>
|
||||||
|
<string name="snowglobe_p">
|
||||||
|
<text locale="de">Schneekugeln</text>
|
||||||
|
<text locale="en">snow globes</text>
|
||||||
|
</string>
|
||||||
<string name="snowman_p">
|
<string name="snowman_p">
|
||||||
<text locale="de">Schneemänner</text>
|
<text locale="de">Schneemänner</text>
|
||||||
<text locale="en">snowmen</text>
|
<text locale="en">snowmen</text>
|
||||||
|
|
|
@ -22,6 +22,12 @@
|
||||||
</item>
|
</item>
|
||||||
</resource>
|
</resource>
|
||||||
|
|
||||||
|
<resource name="snowglobe">
|
||||||
|
<item notlost="yes" weight="1">
|
||||||
|
<function name="use" value="lua_useitem"/>
|
||||||
|
</item>
|
||||||
|
</resource>
|
||||||
|
|
||||||
<resource name="ring_of_levitation" appearance="ring">
|
<resource name="ring_of_levitation" appearance="ring">
|
||||||
<item notlost="yes" weight="0" cursed="true">
|
<item notlost="yes" weight="0" cursed="true">
|
||||||
<function name="use" value="lua_useitem"/>
|
<function name="use" value="lua_useitem"/>
|
||||||
|
|
|
@ -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
|
|
@ -201,6 +201,18 @@ function test_no_uruk()
|
||||||
assert_equal(f1.race, "orc")
|
assert_equal(f1.race, "orc")
|
||||||
end
|
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()
|
function test_snowman()
|
||||||
local r = region.create(0, 0, "glacier")
|
local r = region.create(0, 0, "glacier")
|
||||||
local f = faction.create("noreply@eressea.de", "human", "de")
|
local f = faction.create("noreply@eressea.de", "human", "de")
|
||||||
|
|
|
@ -19,6 +19,7 @@ without prior permission by the authors of Eressea.
|
||||||
#include <util/bsdstring.h>
|
#include <util/bsdstring.h>
|
||||||
#include <util/functions.h>
|
#include <util/functions.h>
|
||||||
#include <util/log.h>
|
#include <util/log.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/resolve.h>
|
#include <util/resolve.h>
|
||||||
|
|
||||||
#include <kernel/config.h>
|
#include <kernel/config.h>
|
||||||
|
@ -509,8 +510,8 @@ struct order *ord)
|
||||||
if (lua_isfunction(L, -1)) {
|
if (lua_isfunction(L, -1)) {
|
||||||
tolua_pushusertype(L, (void *)u, TOLUA_CAST "unit");
|
tolua_pushusertype(L, (void *)u, TOLUA_CAST "unit");
|
||||||
lua_pushinteger(L, amount);
|
lua_pushinteger(L, amount);
|
||||||
|
lua_pushstring(L, getstrtoken());
|
||||||
if (lua_pcall(L, 2, 1, 0) != 0) {
|
if (lua_pcall(L, 3, 1, 0) != 0) {
|
||||||
const char *error = lua_tostring(L, -1);
|
const char *error = lua_tostring(L, -1);
|
||||||
log_error("use(%s) calling '%s': %s.\n", unitname(u), fname, error);
|
log_error("use(%s) calling '%s': %s.\n", unitname(u), fname, error);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
19
src/laws.c
19
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)
|
static int use_item(unit * u, const item_type * itype, int amount, struct order *ord)
|
||||||
{
|
{
|
||||||
int i;
|
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);
|
i = get_pooled(u, itype->rtype, GET_DEFAULT, amount);
|
||||||
|
|
||||||
if (amount > i) {
|
if (amount > i) {
|
||||||
/* TODO: message? eg. "not enough %, using only %" */
|
/* TODO: message? eg. "not enough %, using only %" */
|
||||||
amount = i;
|
amount = i;
|
||||||
|
@ -3455,20 +3458,16 @@ static int use_item(unit * u, const item_type * itype, int amount, struct order
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target == -1) {
|
if (target == -1) {
|
||||||
int result;
|
if (itype->use) {
|
||||||
if (itype->use == NULL) {
|
int result = itype->use(u, itype, amount, ord);
|
||||||
return EUNUSABLE;
|
if (result > 0) {
|
||||||
}
|
|
||||||
result = itype->use ? itype->use(u, itype, amount, ord) : EUNUSABLE;
|
|
||||||
if (result>0) {
|
|
||||||
use_pooled(u, itype->rtype, GET_DEFAULT, result);
|
use_pooled(u, itype->rtype, GET_DEFAULT, result);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if (itype->useonother == NULL) {
|
|
||||||
return EUNUSABLE;
|
return EUNUSABLE;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
return itype->useonother(u, target, itype, amount, ord);
|
return itype->useonother(u, target, itype, amount, ord);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue