require "lunit" module("tests.e3.e3features", package.seeall, lunit.testcase) local settings -- use the C implementation in market.c, because the Lua -- module is wrong (https://bugs.eressea.de/view.php?id=2225) local function process_markets() -- markets = require("eressea.markets") -- markets.update() eressea.process.markets() end local function set_rule(key, value) if value==nil then eressea.settings.set(key, settings[key]) else settings[key] = settings[key] or eressea.settings.get(key) eressea.settings.set(key, value) end end function setup() eressea.game.reset() settings = {} set_rule("rules.move.owner_leave", "1") set_rule("rules.food.flags", "4") set_rule("rules.ship.drifting", "0") set_rule("rules.ship.storms", "0") end function teardown() for k,_ in pairs(settings) do set_rule(k) end end function test_calendar() assert_equal("winter", get_season(396)) end function disable_test_bug_1738_build_castle_e3() local r = region.create(0, 0, "plain") local f = faction.create("human", "bug_1738@eressea.de", "de") local c = building.create(r, "castle") c.size = 228 local u1 = unit.create(f, r, 1) u1:set_skill("building", 5) u1:add_item("stone", 10000) local u2 = unit.create(f, r, 32) u2:set_skill("building", 3) u2:add_item("stone", 10000) u1:clear_orders() u1:add_order("MACHE BURG " .. itoa36(c.id)) -- castle now has size 229. u2:clear_orders() u2:add_order("MACHE BURG " .. itoa36(c.id)) -- 32 * 3 makes 96 skill points. -- from size 229 to size 250 needs 21 * 3 = 63 points, rest 33. -- 33/4 makes 8 points, resulting size is 258. process_orders() -- resulting size should be 250 because unit 2 -- does not have the needed minimum skill. assert_equal(c.size, 250) end function disable_test_alliance() local r = region.create(0, 0, "plain") local f1 = faction.create("human", "noreply@eressea.de", "de") local u1 = unit.create(f1, r, 1) u1:add_item("money", u1.number * 100) local f2 = faction.create("human", "info@eressea.de", "de") local u2 = unit.create(f2, r, 1) u2:add_item("money", u2.number * 100) assert(f1.alliance==nil) assert(f2.alliance==nil) u1:clear_orders() u2:clear_orders() u1:add_order("ALLIANZ NEU pink") u1:add_order("ALLIANZ EINLADEN " .. itoa36(f2.id)) u2:add_order("ALLIANZ BEITRETEN pink") process_orders() assert(f1.alliance~=nil) assert(f2.alliance~=nil) assert(f2.alliance==f1.alliance) u1:clear_orders() u2:clear_orders() u1:add_order("ALLIANZ KOMMANDO " .. itoa36(f2.id)) process_orders() assert(f1.alliance~=nil) assert(f2.alliance~=nil) assert(f2.alliance==f1.alliance) for f in f1.alliance.factions do assert_true(f.id==f1.id or f.id==f2.id) end u1:clear_orders() u2:clear_orders() u2:add_order("ALLIANZ AUSSTOSSEN " .. itoa36(f1.id)) process_orders() assert(f1.alliance==nil) assert(f2.alliance~=nil) u1:clear_orders() u2:clear_orders() u2:add_order("ALLIANZ NEU zing") u1:add_order("ALLIANZ BEITRETEN zing") -- no invite! process_orders() assert(f1.alliance==nil) assert(f2.alliance~=nil) u1:clear_orders() u2:clear_orders() u1:add_order("ALLIANZ NEU zack") u1:add_order("ALLIANZ EINLADEN " .. itoa36(f2.id)) u2:add_order("ALLIANZ BEITRETEN zack") process_orders() assert(f1.alliance==f2.alliance) assert(f2.alliance~=nil) end function test_no_stealth() local r = region.create(0,0, "plain") local f = faction.create("human", "noreply@eressea.de", "de") local u = unit.create(f, r, 1) u:set_skill("stealth", 1) assert_equal(-1, u:get_skill("stealth")) u:clear_orders() u:add_order("LERNEN TARNUNG") process_orders() assert_equal(-1, u:get_skill("stealth")) end function test_no_teach() local r = region.create(0,0, "plain") local f = faction.create("human", "noreply@eressea.de", "de") local u1 = unit.create(f, r, 1) local u2 = unit.create(f, r, 1) u1:clear_orders() u2:clear_orders() u1:set_skill("riding", 3) u2:add_order("LERNE Reiten") u1:add_order("LEHRE " .. itoa36(u2.id)) process_orders() -- TODO: assert something (reflecting skills sucks!) end function test_seecast() local r = region.create(0,0, "plain") for i = 1,10 do -- this prevents storms (only high seas have storms) region.create(i, 1, "plain") end for i = 1,10 do region.create(i, 0, "ocean") end local f = faction.create("human", "noreply@eressea.de", "de") local s1 = ship.create(r, "cutter") local u1 = unit.create(f, r, 2) u1:set_skill("sailing", 3) u1:add_item("money", 1000) u1.ship = s1 local u2 = unit.create(f, r, 1) u2.race = "elf" u2:set_skill("magic", 6) u2.magic = "gwyrrd" u2.aura = 60 u2.ship = s1 u2:add_spell("stormwinds") update_owners() u2:clear_orders() u2:add_order("Zaubere stufe 2 'Beschwoere einen Sturmelementar' " .. itoa36(s1.id)) u1:clear_orders() u1:add_order("NACH O O O O") process_orders() assert_equal(4, u2.region.x) u2:clear_orders() u2:add_order("Zaubere stufe 2 'Beschwoere einen Sturmelementar' " .. itoa36(s1.id)) u1:clear_orders() u1:add_order("NACH O O O O") process_orders() assert_equal(8, u2.region.x) end function test_fishing() eressea.settings.set("rules.food.flags", "0") local r = region.create(0,0, "ocean") local r2 = region.create(1,0, "plain") local f = faction.create("human", "noreply@eressea.de", "de") local s1 = ship.create(r, "cutter") local u1 = unit.create(f, r, 3) u1.ship = s1 u1:set_skill("sailing", 10) u1:add_item("money", 100) u1:clear_orders() u1:add_order("NACH O") update_owners() process_orders() assert_equal(r2, u1.region) assert_equal(90, u1:get_item("money")) u1:clear_orders() u1:add_order("NACH W") process_orders() assert_equal(r, u1.region) assert_equal(60, u1:get_item("money")) end function test_ship_capacity() local r = region.create(0,0, "ocean") region.create(1,0, "ocean") local r2 = region.create(2,0, "ocean") local f = faction.create("human", "noreply@eressea.de", "de") local f2 = faction.create("goblin", "noreply@eressea.de", "de") -- u1 is at the limit and moves local s1 = ship.create(r, "cutter") local u1 = unit.create(f, r, 5) u1.ship = s1 u1:set_skill("sailing", 10) u1:add_item("sword", 55) u1:clear_orders() u1:add_order("NACH O O") -- u2 has too many people local s2 = ship.create(r, "cutter") local u2 = unit.create(f, r, 6) u2.ship = s2 u2:set_skill("sailing", 10) u2:clear_orders() u2:add_order("NACH O O") -- u3 has goblins, they weigh 40% less local s3 = ship.create(r, "cutter") local u3 = unit.create(f2, r, 8) u3.ship = s3 u3:set_skill("sailing", 10) u3:add_item("sword", 55) u3:clear_orders() u3:add_order("NACH O O") -- u4 has too much stuff local s4 = ship.create(r, "cutter") local u4 = unit.create(f, r, 5) u4.ship = s4 u4:set_skill("sailing", 10) u4:add_item("sword", 56) u4:clear_orders() u4:add_order("NACH O O") update_owners() process_orders() if r2~=u1.region then print(get_turn(), u1, u1.faction) end assert_equal(r2, u1.region) assert_not_equal(r2.id, u2.region.id) if r2~=u3.region then print(get_turn(), u3, u3.faction) end assert_equal(r2, u3.region) assert_not_equal(r2.id, u4.region.id) end function test_owners() local r = region.create(0, 0, "plain") local f1 = faction.create("human", "noreply@eressea.de", "de") local u1 = unit.create(f1, r, 1) local f2 = faction.create("human", "noreply@eressea.de", "de") local u2 = unit.create(f2, r, 1) local u3 = unit.create(f2, r, 1) local b3 = building.create(r, "castle") b3.size = 2 u3.building = b3 local b1 = building.create(r, "castle") b1.size = 1 u1.building = b1 local b2 = building.create(r, "castle") b2.size = 2 u2.building = b2 update_owners() assert(r.owner==u3.faction) b1.size=3 b2.size=3 update_owners() assert(r.owner==u2.faction) b1.size=4 update_owners() assert(r.owner==u1.faction) end function test_taxes() local r = region.create(0, 0, "plain") r:set_resource("peasant", 1000) r:set_resource("money", 5000) local f = faction.create("human", "noreply@eressea.de", "de") local u = unit.create(f, r, 1) u:clear_orders() u:add_order("LERNE Holzfaellen") -- do not work local b = building.create(r, "watch") b.size = 10 u.building = b update_owners() assert_equal(1, r.morale) process_orders() assert_equal(1, r.morale) assert_equal(25, u:get_item("money")) end function test_region_owner_cannot_leave_castle() local r = region.create(0, 0, "plain") local f = faction.create("human", "noreply@eressea.de", "de") f.id = 42 local b1 = building.create(r, "castle") b1.size = 10 local b2 = building.create(r, "lighthouse") b2.size = 10 local u = unit.create(f, r, 1) u.building = b1 u:add_item("money", u.number * 100) u:clear_orders() u:add_order("BETRETE BURG " .. itoa36(b2.id)) process_orders() assert_equal(b1, u.building, "region owner has left the building") -- region owners may not leave end function reset_items(u) for i in u.items do u:add_item(i, u:get_item(i)) end u:add_item("money", u.number * 10000) end function market_fixture() local herb_multi = 500 -- from rc_herb_trade() local r local herbnames = { 'h0', 'h1', 'h2', 'h3', 'h4', 'h5' } local herbtable = {} for _, name in pairs(herbnames) do herbtable[name] = name end local luxurynames = { 'balm', 'jewel', 'myrrh', 'oil', 'silk', 'incense' } -- no spice in E3 local luxurytable = {} for _, name in pairs(luxurynames) do luxurytable[name] = name end for x = -1, 1 do for y = -1, 1 do r = region.create(x, y, "plain") r:set_resource("peasant", 1) end end r = get_region(0, 0) local b = building.create(r, "market") b.size = 10 b.working = true local f = faction.create("human", "market1@eressea.de", "de") f.id = 42 local u = unit.create(f, r, 1) u.building = b r.herb = herbnames[6] r.luxury = luxurynames[6] r:set_resource("peasant", herb_multi * 9 + 50) -- 10 herbs per region for i = 0, 4 do local rn = r:next(i) rn.name = luxurynames[i+1] rn.herb = herbnames[i+1] rn.luxury = luxurynames[i+1] rn:set_resource("peasant", herb_multi * 9 + 50) -- 10 herbs per region unit.create(f, rn, 1) end reset_items(u) return r, u, b, herbnames, luxurynames, herbtable, luxurytable end local function test_items(u, names, amount) local len = 0 for i in u.items do if names[i] ~= nil then len = len + 1 end end if amount > 0 then assert_not_equal(0, len, "trader did not get any items") else assert_equal(0, len, "trader should not have items") end for _, name in pairs(names) do local n = u:get_item(name) if n>0 then if amount == 0 then assert_equal(0, n, 'trader should have no ' .. name) else assert_equal(amount, n, 'trader has ' .. n .. ' instead of ' .. amount .. ' ' .. name) end end end end function test_market_regions() -- if i am the only trader around, i should be getting all the herbs from all 7 regions local r, u, b, herbnames, luxurynames, herbtable, luxurytable = market_fixture() process_markets() test_items(u, herbtable, 10) test_items(u, luxurytable, 5) end function test_multiple_markets() local r, u1, b, herbnames, luxurynames, herbtable, luxurytable = market_fixture() local r2 = get_region(1,0) local f = faction.create("human", "multim@eressea.de", "de") local u2 = unit.create(f, r2, 1) local b2 = building.create(r2, "market") b2.size = 10 b2.working = true reset_items(u2) u2.building = b2 process_markets() for _, i in pairs(luxurytable) do assert_equal(5, u1:get_item(i)+u2:get_item(i), "not enough " .. i ) end for _, i in pairs(herbtable) do assert_equal(10, u1:get_item(i)+u2:get_item(i), "not enough " .. i ) end assert_equal(5, u1:get_item('silk')) -- uncontested end function test_market() local r = region.create(0, 0, "plain") local f1 = faction.create("human", "market2@eressea.de", "de") local u1 = unit.create(f1, r, 1) local b = building.create(r, "market") eressea.settings.set("rules.peasants.growth", "0") b.size = 10 u1.building = b u1:add_item("money", 10000) r.herb = "h0" r.luxury = "balm" r:set_resource("peasant", 1050) process_orders() assert_equal(3, u1:get_item("h0")) assert_equal(2, u1:get_item("balm")) local function reset_items() for i in u1.items do u1:add_item(i, -1 * u1:get_item(i)) end u1:add_item("money", u1.number * 10000) -- eressea.game.reset() f1.lastturn=get_turn() assert_not_equal(nil, factions()) local idx = 0 for f in factions() do assert_equal(1,1,"fac".. f.email) idx = idx + 1 end assert_not_equal(0, idx) end reset_items() b.size = 1 process_markets() assert_equal(0, u1:get_item("h0")) b.size = 10 reset_items() r:set_resource("peasant", 2100) process_markets() assert_equal(5, u1:get_item("h0")) assert_equal(3, u1:get_item("balm")) reset_items() r:set_resource("peasant", 1049) process_markets() assert_equal(2, u1:get_item("h0")) assert_equal(1, u1:get_item("balm")) reset_items() r:set_resource("peasant", 550) process_markets() assert_equal(2, u1:get_item("h0")) assert_equal(1, u1:get_item("balm")) reset_items() r:set_resource("peasant", 549) process_markets() assert_equal(1, u1:get_item("h0")) assert_equal(1, u1:get_item("balm")) reset_items() r:set_resource("peasant", 50) process_markets() assert_equal(1, u1:get_item("h0")) assert_equal(1, u1:get_item("balm")) reset_items() r:set_resource("peasant", 49) process_markets() assert_equal(0, u1:get_item("h0")) r:set_resource("peasant", 1050) reset_items() u1:add_item("money", -1 * u1:get_item("money")) assert_equal(0, u1:get_item("money")) process_orders() -- process_orders to update maintenance assert_equal(0, u1:get_item("h0")) process_orders() eressea.settings.set("rules.peasants.growth", "1") end function test_market_gives_items() local r for x = -1, 1 do for y = -1, 1 do r = region.create(x, y, "plain") r:set_resource("peasant", 5000) end end r = get_region(0, 0) local b = building.create(r, "market") b.size = 10 local f = faction.create("human", "market0@eressea.de", "de") f.id = 42 local u = unit.create(f, r, 1) u.building = b u:add_item("money", u.number * 10000) for i = 0, 5 do local rn = r:next(i) end process_orders() local len = 0 for i in u.items do len = len + 1 end assert(len>1) end function test_spells() local r = region.create(0, 0, "plain") local f = faction.create("human", "noreply@eressea.de", "de") local u = unit.create(f, r, 1) u.race = "elf" u:clear_orders() u:add_item("money", 10000) u:set_skill("magic", 5) u:add_order("LERNE MAGIE Illaun") process_orders() local sp local nums = 0 if f.spells~=nil then for sp in f.spells do nums = nums + 1 end assert(nums>0) for sp in u.spells do nums = nums - 1 end assert(nums==0) elseif u.spells~=nil then for sp in u.spells do nums = nums + 1 end assert(nums>0) end end function test_canoe_passes_through_land() local f = faction.create("human", "noreply@eressea.de", "de") local src = region.create(0, 0, "ocean") local land = region.create(1, 0, "plain") region.create(2, 0, "ocean") local dst = region.create(3, 0, "ocean") local sh = ship.create(src, "canoe") local u1 = unit.create(f, src, 1) local u2 = unit.create(f, src, 1) u1.ship = sh u2.ship = sh u1:set_skill("sailing", 10) u1:clear_orders() u1:add_order("NACH O O O") process_orders() assert_equal(land, u2.region, "canoe did not stop at coast") process_orders() assert_equal(dst, sh.region, "canoe could not leave coast") assert_equal(dst, u1.region, "canoe could not leave coast") assert_equal(dst, u2.region, "canoe could not leave coast") end function test_give_50_percent_of_money() local r = region.create(0, 0, "plain") local u1 = unit.create(faction.create("human", "noreply@eressea.de", "de"), r, 1) local u2 = unit.create(faction.create("orc", "noreply@eressea.de", "de"), r, 1) u1.faction.age = 10 u2.faction.age = 10 u1:add_item("money", 500) u2:add_item("money", 500) local m1, m2 = u1:get_item("money"), u2:get_item("money") u1:clear_orders() u1:add_order("GIB " .. itoa36(u2.id) .. " 221 Silber") u2:clear_orders() u2:add_order("LERNEN Hiebwaffen") process_orders() assert_equal(m1, u1:get_item("money")) assert_equal(m2, u2:get_item("money")) m1, m2 = u1:get_item("money"), u2:get_item("money") u1:clear_orders() u1:add_order("GIB " .. itoa36(u2.id) .. " 221 Silber") u2:clear_orders() u2:add_order("HELFEN " .. itoa36(u1.faction.id) .. " GIB") process_orders() assert_equal(m1-221, u1:get_item("money")) assert_equal(m2+110, u2:get_item("money")) end function test_give_100_percent_of_items() r = region.create(0, 0, "plain") local u1 = unit.create(faction.create("human", "noreply@eressea.de", "de"), r, 1) local u2 = unit.create(faction.create("orc", "noreply@eressea.de", "de"), r, 1) u1.faction.age = 10 u2.faction.age = 10 u1:add_item("money", 500) u1:add_item("log", 500) local m1, m2 = u1:get_item("log"), u2:get_item("log") u1:clear_orders() u1:add_order("GIB " .. itoa36(u2.id) .. " 332 Holz") u2:clear_orders() u2:add_order("LERNEN Hiebwaffen") u2:add_order("HELFEN " .. itoa36(u1.faction.id) .. " GIB") process_orders() assert_equal(m1-332, u1:get_item("log")) assert_equal(m2+332, u2:get_item("log")) end function test_cannot_give_person() local r = region.create(0, 0, "plain") local f1 = faction.create("human", "noreply@eressea.de", "de") local f2 = faction.create("human", "noreply@eressea.de", "de") local u1 = unit.create(f1, r, 10) local u2 = unit.create(f2, r, 10) u1.faction.age = 10 u2.faction.age = 10 u1:add_item("money", 500) u2:add_item("money", 500) u2:clear_orders() u2:add_order("GIB ".. itoa36(u1.id) .. " 1 PERSON") u2:add_order("HELFE ".. itoa36(f1.id) .. " GIB") u1:add_order("HELFE ".. itoa36(f2.id) .. " GIB") process_orders() assert_equal(10, u2.number) assert_equal(10, u1.number) end function test_cannot_give_unit() local r = region.create(0, 0, "plain") local f1 = faction.create("human", "noreply@eressea.de", "de") local f2 = faction.create("human", "noreply@eressea.de", "de") local u1 = unit.create(f1, r, 10) local u2 = unit.create(f2, r, 10) u1.faction.age = 10 u2.faction.age = 10 u1:add_item("money", 500) u2:add_item("money", 500) u2:clear_orders() u2:add_order("GIB ".. itoa36(u1.id) .. " EINHEIT") u2:add_order("HELFE ".. itoa36(f1.id) .. " GIB") u1:add_order("HELFE ".. itoa36(f2.id) .. " GIB") process_orders() assert_not_equal(u2.faction.id, u1.faction.id) end function test_guard_by_owners() -- http://bugs.eressea.de/view.php?id=1756 local r = region.create(0,0, "mountain") local f1 = faction.create("human", "noreply@eressea.de", "de") f1.age=20 local f2 = faction.create("human", "noreply@eressea.de", "de") f2.age=20 local u1 = unit.create(f1, r, 1) local b = building.create(r, "castle") b.size = 10 u1.building = b u1:add_item("money", 100) local u2 = unit.create(f2, r, 1) u2:add_item("money", 100) u2:set_skill("mining", 3) u2:clear_orders() u2:add_order("MACHEN EISEN") process_orders() local iron = u2:get_item("iron") process_orders() assert_equal(iron, u2:get_item("iron")) end local function setup_packice(x, onfoot) local f = faction.create("human", "noreply@eressea.de", "de") local plain = region.create(0,0, "plain") local ice = region.create(1,0, "packice") local ocean = region.create(2,0, "ocean") local u = unit.create(f, get_region(x, 0), 2) if not onfoot then local s = ship.create(u.region, "cutter") u:set_skill("sailing", 3) u.ship = s end u:add_item("money", 400) return u end function test_no_sailing_through_packice() local u = setup_packice(0) u:clear_orders() u:add_order("NACH O O") process_orders() assert_equal(0, u.region.x) end function test_can_sail_from_packice_to_ocean() local u = setup_packice(1) u:clear_orders() u:add_order("NACH W") process_orders() assert_equal(1, u.region.x) u:clear_orders() u:add_order("NACH O") process_orders() assert_equal(2, u.region.x) end function test_can_sail_into_packice() local u = setup_packice(2) u:clear_orders() u:add_order("NACH W W") process_orders() assert_equal(1, u.region.x) end function test_can_walk_into_packice() local u = setup_packice(0, true) u:clear_orders() u:add_order("NACH O") process_orders() assert_equal(1, u.region.x) end function test_cannot_walk_into_ocean() local u = setup_packice(1, true) u:clear_orders() u:add_order("NACH O") process_orders() assert_equal(1, u.region.x) end function test_p2() local f = faction.create("human", "noreply@eressea.de", "de") local r = region.create(0, 0, "plain") local u = unit.create(f, r, 1) r:set_resource("tree", 0) u:clear_orders() u:add_order("BENUTZE 'Wasser des Lebens'") u:add_item("lifepotion", 1) u:add_item("log", 10) u:add_item("mallorn", 10) process_orders() assert_equal(5, r:get_resource("tree")) assert_equal(0, u:get_item("lifepotion")) assert_equal(15, u:get_item("log") + u:get_item("mallorn")) end function test_p2_move() -- http://bugs.eressea.de/view.php?id=1855 local f = faction.create("human", "noreply@eressea.de", "de") local r = region.create(0, 0, "plain") region.create(1, 0, "plain") local u = unit.create(f, r, 1) r:set_resource("tree", 0) u:clear_orders() u:add_order("BENUTZE 'Wasser des Lebens'") u:add_order("NACH OST") u:add_item("horse", 1) u:add_item("lifepotion", 1) u:add_item("log", 1) u:add_item("mallorn", 1) process_orders() assert_equal(1, u.region.x) assert_equal(1, r:get_resource("tree")) end function test_golem_use_four_iron() local r0 = region.create(0, 0, "plain") local f1 = faction.create("halfling", "noreply@eressea.de", "de") local u1 = unit.create(f1, r0, 3) u1.race = "irongolem" u1:set_skill("weaponsmithing", 1) u1:set_skill("armorer", 1) u1:clear_orders() u1:add_order("Mache 4 Turmschild") process_orders() assert_equal(4, u1:get_item("towershield")) assert_equal(2, u1.number) end function test_silver_weight_stops_movement() local r1 = region.create(1, 1, "plain") local r2 = region.create(2, 1, "plain") region.create(3, 1, "plain") local f1 = faction.create("human", "noreply@eressea.de", "de") local u1 = unit.create(f1, r1, 1) u1:clear_orders() u1:add_order("NACH OST") u1:add_item("money", 540) assert_equal(1540, u1.weight) process_orders() assert_equal(r2, u1.region) u1:add_item("money", 1) process_orders() assert_equal(r2, u1.region) end function test_silver_weight_stops_ship() local r1 = region.create(1, 1, "ocean") local r2 = region.create(2, 1, "ocean") region.create(3, 1, "ocean") local f1 = faction.create("human", "noreply@eressea.de", "de") local u1 = unit.create(f1, r1, 1) u1:set_skill("sailing", 3) local s1 = ship.create(r1, "canoe") u1.ship = s1 u1:clear_orders() u1:add_order("NACH OST") u1:add_item("money", 2000) process_orders() assert_equal(r2, u1.region) u1:add_item("money", 1) process_orders() assert_equal(r2, u1.region) end function test_building_owner_can_enter_ship() local r1 = region.create(1, 2, "plain") local f1 = faction.create("human", "noreply@eressea.de", "de") local b1 = building.create(r1, "castle") b1.size = 10 local s1 = ship.create(r1, "cutter") local u1 = unit.create(f1, r1, 10) u1.building = b1 u1:add_item("money", u1.number * 100) u1:clear_orders() u1:add_order("VERLASSEN") u1:add_order("BETRETE SCHIFF " .. itoa36(s1.id)) local u2 = unit.create(f1, r1, 10) u2.ship = s1 u2:add_item("money", u1.number * 100) u2:clear_orders() process_orders() assert_equal(s1, u1.ship) assert_equal(null, u1.building, "owner of the building can not go into a ship") end function test_only_building_owner_can_set_not_paid() local r = region.create(0, 0, "plain") local f = faction.create("human", "noreply@eressea.de", "de") local u1 = unit.create(f, r, 1) local u2 = unit.create(f, r, 1) local mine = building.create(r, "mine") mine.size = 2 u1:add_item("money", 500) u1.building = mine u2.building = mine u1:clear_orders() u2:clear_orders() -- Test that Bezahle nicht is working u1:add_order("Bezahle nicht") process_orders() assert_equal(500, u1:get_item("money")) u1:clear_orders() -- Test that bug fix 0001976 is working -- Bezahle nicht is not working u2:add_order("Bezahle nicht") process_orders() assert_equal(0, u1:get_item("money")) end function test_spyreport_message() local r1 = region.create(1, 2, "plain") local f1 = faction.create("human", "noreply@eressea.de", "de") local u1 = unit.create(f1, r1, 1) local u2 = unit.create(f1, r1, 1) msg = message.create("spyreport") msg:set_unit("spy", u1) msg:set_unit("target", u2) msg:set_string("status", "hodor") assert_not_equal("", msg:render("de")) assert_not_equal("", msg:render("en")) end function test_volcanooutbreak_message() local r1 = region.create(1, 0, "plain") local r2 = region.create(1, 1, "plain") msg = message.create("volcanooutbreak") msg:set_region("regionn", r1) msg:set_region("regionv", r2) assert_not_equal("", msg:render("de")) assert_not_equal("", msg:render("en")) end function test_bug2083() local herb_multi = 500 -- from rc_herb_trade() local r = region.create(0,0,"plain") r:set_resource("peasant", 2000) r.luxury = "balm" local f = faction.create("human", "2083@eressea.de", "de") local u = unit.create(f, r, 1) u:set_skill("building", 8) u:add_item("stone", 100) u:add_item("log", 100) u:add_item("iron", 100) u:add_item("money", 10000) u:clear_orders() u:add_order("MACHE Markt") process_orders() -- this is a bit weird, but the bug was caused by market code -- being called in two places. We want to make sure this doesn't happen for k, v in pairs(rules) do set_key("xm09", true) if 'table' == type(v) then cb = v['update'] if 'function' == type(cb) then cb() end end end assert_equal(0, u:get_item("balm")) end function test_no_uruk() local f1 = faction.create("uruk", "noreply@eressea.de", "de") assert_equal(f1.race, "orc") end function test_bug2187() set_rule("rules.food.flags", "0") local r = region.create(0,0,"plain") local f = faction.create("goblin", "2187@eressea.de", "de") local u = unit.create(f, r, 1) u.race = "demon" u.hp = u.hp_max * u.number r:set_resource("peasant", 0) u:add_item("money", 500) hp = u.hp process_orders() assert_equal(hp, u.hp) -- init_reports() -- write_report(f) set_rule("rules.food.flags", "4") end function test_give_to_other_fails() -- E3: cannot give a person to another faction local r = region.create(0, 0, "plain") local f1 = faction.create("human") local f2 = faction.create("human") local u1 = unit.create(f1, r, 2, "human") local u2 = unit.create(f2, r, 1, "human") -- u2:add_order("HELFE " .. itoa36(f1.id) .. " GIB") u2:add_order("KONTAKTIERE " .. itoa36(u1.id)) u1:add_order("GIB " .. itoa36(u2.id) .. " 1 PERSON") process_orders() assert_equal(2, u1.number) assert_equal(1, u2.number) end function test_demons_using_mallornlance() -- bug 2392 set_rule("skillchange.demon.up", "0") set_rule("NewbieImmunity", "0") local r = region.create(0, 0, "plain") local f = faction.create('goblin') local u = unit.create(f, r, 1, 'demon') u:set_skill('taxation', 1) u:set_skill('polearm', 1) u:add_item('mallornlance', 1) u:add_order('BEWACHE') process_orders() if not u.guard then init_reports() write_report(f) end assert_true(u.guard) end function test_new_orc_has_no_skills() -- orcs in E2 get starting skills, but in E3 they do not local f = faction.create('orc') local r = region.create(0, 0, 'plain') local u = unit.create(f, r) u:add_item('money', 400) u.number = 0 u:add_order("REKRUTIEREN 2") process_orders() assert_equal(2, u.number) assert_equal(0, u:get_skill('polearm')) assert_equal(0, u:get_skill('melee')) end