forked from github/server
Lua module rewrite, part deux.
rules for E3 and E4 some missing files.
This commit is contained in:
parent
d994caf7a3
commit
44c89e26ec
|
@ -0,0 +1,95 @@
|
|||
---------------------------------------------
|
||||
-- Return indentation string for passed level
|
||||
---------------------------------------------
|
||||
local function tabs(i)
|
||||
return string.rep(".",i).." " -- Dots followed by a space
|
||||
end
|
||||
|
||||
-----------------------------------------------------------
|
||||
-- Return string representation of parameter's value & type
|
||||
-----------------------------------------------------------
|
||||
local function toStrType(t)
|
||||
local function fttu2hex(t) -- Grab hex value from tostring() output
|
||||
local str = tostring(t);
|
||||
if str == nil then
|
||||
return "tostring() failure! \n"
|
||||
else
|
||||
local str2 = string.match(str,"[ :][ (](%x+)")
|
||||
if str2 == nil then
|
||||
return "string.match() failure: "..str.."\n"
|
||||
else
|
||||
return "0x"..str2
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Stringify a value of a given type using a table of functions keyed
|
||||
-- by the name of the type (Lua's version of C's switch() statement).
|
||||
local stringify = {
|
||||
-- Keys are all possible strings that type() may return,
|
||||
-- per http://www.lua.org/manual/5.1/manual.html#pdf-type.
|
||||
["nil"] = function(v) return "nil (nil)" end,
|
||||
["string"] = function(v) return '"'..v..'" (string)' end,
|
||||
["number"] = function(v) return v.." (number)" end,
|
||||
["boolean"] = function(v) return tostring(v).." (boolean)" end,
|
||||
["function"] = function(v) return fttu2hex(v).." (function)" end,
|
||||
["table"] = function(v) return fttu2hex(v).." (table)" end,
|
||||
["thread"] = function(v) return fttu2hex(v).." (thread)" end,
|
||||
["userdata"] = function(v) return fttu2hex(v).." (userdata)" end
|
||||
}
|
||||
return stringify[type(t)](t)
|
||||
end
|
||||
|
||||
-------------------------------------
|
||||
-- Count elements in the passed table
|
||||
-------------------------------------
|
||||
local function lenTable(t) -- What Lua builtin does this simple thing?
|
||||
local n=0 -- '#' doesn't work with mixed key types
|
||||
if ("table" == type(t)) then
|
||||
for key in pairs(t) do -- Just count 'em
|
||||
n = n + 1
|
||||
end
|
||||
return n
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------
|
||||
-- Pretty-print the passed table
|
||||
--------------------------------
|
||||
local function do_dumptable(t, indent, seen)
|
||||
-- "seen" is an initially empty table used to track all tables
|
||||
-- that have been dumped so far. No table is dumped twice.
|
||||
-- This also keeps the code from following self-referential loops,
|
||||
-- the need for which was found when first dumping "_G".
|
||||
if ("table" == type(t)) then -- Dump passed table
|
||||
seen[t] = 1
|
||||
if (indent == 0) then
|
||||
print ("The passed table has "..lenTable(t).." entries:")
|
||||
indent = 1
|
||||
end
|
||||
for f,v in pairsByKeys(t) do
|
||||
if ("table" == type(v)) and (seen[v] == nil) then -- Recurse
|
||||
print( tabs(indent)..toStrType(f).." has "..lenTable(v).." entries: {")
|
||||
do_dumptable(v, indent+1, seen)
|
||||
print( tabs(indent).."}" )
|
||||
else
|
||||
print( tabs(indent)..toStrType(f).." = "..toStrType(v))
|
||||
end
|
||||
end
|
||||
else
|
||||
print (tabs(indent).."Not a table!")
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------
|
||||
-- Wrapper to handle persistence
|
||||
--------------------------------
|
||||
function dumptable(t) -- Only global declaration in the package
|
||||
-- This wrapper exists only to set the environment for the first run:
|
||||
-- The second param is the indentation level.
|
||||
-- The third param is the list of tables dumped during this call.
|
||||
-- Getting this list allocated and freed was a pain, and this
|
||||
-- wrapper was the best solution I came up with...
|
||||
return do_dumptable(t, 0, {})
|
||||
end
|
|
@ -0,0 +1,10 @@
|
|||
-- Astralraum
|
||||
|
||||
astral = {}
|
||||
|
||||
function astral.update()
|
||||
print('spawn braineaters')
|
||||
spawn_braineaters(0.25)
|
||||
end
|
||||
|
||||
return astral
|
|
@ -0,0 +1,16 @@
|
|||
require 'eressea.spells'
|
||||
print("rules for game E2")
|
||||
|
||||
return {
|
||||
require('eressea'),
|
||||
require('eressea.xmas2004'),
|
||||
require('eressea.xmas2005'),
|
||||
require('eressea.xmas2006'),
|
||||
require('eressea.wedding'),
|
||||
require('eressea.embassy'),
|
||||
require('eressea.eternath'),
|
||||
require('eressea.tunnels'),
|
||||
require('eressea.ponnuki'),
|
||||
require('eressea.astral'),
|
||||
require('eressea.ents')
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
require 'eressea.e3.rules'
|
||||
require 'eressea.spells'
|
||||
print("rules for game E3")
|
||||
|
||||
return {
|
||||
require('eressea'),
|
||||
require('eressea.xmas2009'),
|
||||
require('eressea.markets'),
|
||||
require('eressea.frost'),
|
||||
require('eressea.ents')
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
-- when appending to this, make sure the item has a canuse-function!
|
||||
local goblin_denied = " plate lance mallornlance greatbow axe greatsword halberd rustyaxe rustyhalberd towershield scale "
|
||||
function item_canuse(u, iname)
|
||||
local race = u.race
|
||||
if race=="goblin" then
|
||||
if string.find(goblin_denied, " " .. iname .. " ") then
|
||||
return false
|
||||
end
|
||||
end
|
||||
if iname=="rep_crossbow" then
|
||||
-- only dwarves and halflings allowed to use repeating crossbow
|
||||
return race=="dwarf" or race=="halfling"
|
||||
end
|
||||
if iname=="scale" then
|
||||
-- only dwarves and halflings can use scale
|
||||
return race=="dwarf" or race=="halfling"
|
||||
end
|
||||
if iname=="towershield" then
|
||||
-- only dwarves allowed to use towershield
|
||||
return race=="dwarf"
|
||||
end
|
||||
if iname=="greatbow" then
|
||||
-- only elves use greatbow
|
||||
return race=="elf"
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function building_protection(b, u)
|
||||
return 1
|
||||
end
|
||||
|
||||
function building_taxes(b, blevel)
|
||||
btype = b.type
|
||||
if btype=="castle" then
|
||||
return blevel * 0.01
|
||||
elseif btype=="watch" then
|
||||
return blevel * 0.005
|
||||
end
|
||||
return 0.0
|
||||
end
|
||||
|
||||
-- the "raindance" spell
|
||||
function raindance(r, mage, level, force)
|
||||
if (create_curse(mage, r, "blessedharvest", force, 1+force*2, 100 * force)) then
|
||||
-- slightly crooked way of reporting an action to everyone in the region
|
||||
local msg = message.create("raindance_effect")
|
||||
msg:set_unit("mage", mage)
|
||||
if (msg:report_action(r, mage, 3)) then
|
||||
local msg2 = message.create("raindance_effect")
|
||||
msg2:set_unit("mage", nil)
|
||||
msg2:report_action(r, mage, 4)
|
||||
end
|
||||
end
|
||||
return level
|
||||
end
|
||||
|
||||
-- the "blessed harvest" spell
|
||||
function blessedharvest(r, mage, level, force)
|
||||
if create_curse(mage, r, "blessedharvest", force, 1+force*2, 50 * force) then
|
||||
-- slightly crooked way of reporting an action to everyone in the region
|
||||
local msg = message.create("harvest_effect")
|
||||
msg:set_unit("mage", mage)
|
||||
if (msg:report_action(r, mage, 3)) then
|
||||
local msg2 = message.create("harvest_effect")
|
||||
msg2:set_unit("mage", nil)
|
||||
msg2:report_action(r, mage, 4)
|
||||
end
|
||||
for idx, rn in ipairs(r.adj) do
|
||||
-- nur landregionen haben moral>=0
|
||||
if r.morale>=0 then
|
||||
create_curse(mage, r, "blessedharvest", force, force*2, 50 * force)
|
||||
end
|
||||
end
|
||||
end
|
||||
return level
|
||||
end
|
|
@ -0,0 +1,11 @@
|
|||
require 'eressea.e3.rules'
|
||||
require 'eressea.spells'
|
||||
print("rules for game E3")
|
||||
|
||||
return {
|
||||
require('eressea'),
|
||||
require('eressea.xmas2009'),
|
||||
require('eressea.markets'),
|
||||
require('eressea.frost'),
|
||||
require('eressea.ents')
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
local function is_winter(turn)
|
||||
local season = get_season(turn)
|
||||
return season == "calendar::winter"
|
||||
end
|
||||
|
||||
local function is_spring(turn)
|
||||
local season = get_season(turn)
|
||||
return season == "calendar::spring"
|
||||
end
|
||||
|
||||
local function freeze(r, chance)
|
||||
for i, rn in ipairs(r.adj) do
|
||||
-- each region has a chance to freeze
|
||||
if rn.terrain=="ocean" and (chance>=100 or math.fmod(rng_int(), 100)<chance) then
|
||||
rn.terrain = "packice"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function thaw(r, chance)
|
||||
if chance>=100 or math.fmod(rng_int(), 100)<chance then
|
||||
r.terrain = "ocean"
|
||||
for s in r.ships do
|
||||
s.coast = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local frost = {}
|
||||
function frost.update()
|
||||
local turn = get_turn()
|
||||
if is_winter(turn) then
|
||||
for r in regions() do
|
||||
if r.terrain=="glacier" then
|
||||
freeze(r, 20)
|
||||
end
|
||||
end
|
||||
elseif is_spring(turn) then
|
||||
for r in regions() do
|
||||
if r.terrain=="packice" then
|
||||
thaw(r, 20)
|
||||
end
|
||||
end
|
||||
elseif is_spring(turn-1) then
|
||||
for r in regions() do
|
||||
if r.terrain=="packice" then
|
||||
thaw(r, 100)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return frost
|
|
@ -0,0 +1,29 @@
|
|||
-- implements gates and travel between them
|
||||
-- used in HSE and Eressea
|
||||
|
||||
local gates = {}
|
||||
|
||||
function gates.travel(b, units)
|
||||
-- we've found which units we want to exchange, now swap them:
|
||||
local u
|
||||
for key, u in pairs(units) do
|
||||
u.region = b.region
|
||||
u.building = b
|
||||
end
|
||||
end
|
||||
|
||||
function gates.units(b, maxsize)
|
||||
local size = maxsize
|
||||
local units = {}
|
||||
local u
|
||||
|
||||
for u in b.units do
|
||||
if u.number<=size and u.weight<=u.capacity then
|
||||
units[u] = u
|
||||
size = size - u.number
|
||||
end
|
||||
end
|
||||
return units
|
||||
end
|
||||
|
||||
return gates
|
|
@ -0,0 +1,23 @@
|
|||
if config.paths ~= nil then
|
||||
for path in string.gmatch(config.paths, "([^:]+)") do
|
||||
package.path = package.path .. ';' .. path .. '\\?.lua;' .. path .. '\\?\\init.lua'
|
||||
end
|
||||
end
|
||||
print(package.path)
|
||||
|
||||
require 'eressea.resources'
|
||||
require 'eressea.spells'
|
||||
|
||||
local self = {}
|
||||
|
||||
function self.update()
|
||||
print('spawn dragons')
|
||||
spawn_dragons()
|
||||
print('spawn undead')
|
||||
spawn_undead()
|
||||
|
||||
update_guards()
|
||||
update_scores()
|
||||
end
|
||||
|
||||
return self
|
|
@ -0,0 +1,90 @@
|
|||
local function get_markets(r, result)
|
||||
local n = 0
|
||||
result = result or {}
|
||||
|
||||
for b in r.buildings do
|
||||
if b.type=="market" then
|
||||
u = b.owner
|
||||
if u~=nil then
|
||||
table.insert(result, u)
|
||||
n = n + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
return n, result
|
||||
end
|
||||
|
||||
local function collect_markets(r, result)
|
||||
local result = result or {}
|
||||
local n = 0
|
||||
n, result = get_markets(r, result)
|
||||
for i, r in ipairs(r.adj) do
|
||||
if r then
|
||||
local x, result = get_markets(r, result)
|
||||
n = n + x
|
||||
end
|
||||
end
|
||||
return n, result
|
||||
end
|
||||
|
||||
local function market_action(r)
|
||||
local f = r.owner
|
||||
local trade = 1000
|
||||
if f~=nil and f.race=="halfling" then
|
||||
trade = 600
|
||||
end
|
||||
|
||||
local p = r:get_resource("peasant")
|
||||
if p > 500 then
|
||||
local n, markets = collect_markets(r)
|
||||
|
||||
if n>0 then
|
||||
local give
|
||||
if r.luxury~=nil then
|
||||
give = {}
|
||||
local numlux = p / trade
|
||||
for x = 1, numlux do
|
||||
local m = 1+math.fmod(rng_int(), n)
|
||||
u = markets[m]
|
||||
if give[u] then
|
||||
give[u] = give[u] + 1
|
||||
else
|
||||
give[u] = 1
|
||||
end
|
||||
end
|
||||
|
||||
for u, v in pairs(give) do
|
||||
u:add_item(r.luxury, v)
|
||||
end
|
||||
end
|
||||
|
||||
if r.herb~=nil then
|
||||
give = {}
|
||||
local numherb = p / 500
|
||||
for x = 1, numherb do
|
||||
local m = 1+math.fmod(rng_int(), n)
|
||||
u = markets[m]
|
||||
if give[u] then
|
||||
give[u] = give[u] + 1
|
||||
else
|
||||
give[u] = 1
|
||||
end
|
||||
end
|
||||
|
||||
for u, v in pairs(give) do
|
||||
u:add_item(r.herb, v)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local markets = {}
|
||||
local function markets.update()
|
||||
local r
|
||||
for r in regions() do
|
||||
market_action(r)
|
||||
end
|
||||
end
|
||||
|
||||
return markets
|
|
@ -0,0 +1,98 @@
|
|||
-- global functions used in items.xml
|
||||
|
||||
if not item_canuse then
|
||||
-- define a default, everyone can use everything
|
||||
function item_canuse(u, iname)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
function peasant_getresource(u)
|
||||
return u.region:get_resource("peasant")
|
||||
end
|
||||
|
||||
function peasant_changeresource(u, delta)
|
||||
local p = u.region:get_resource("peasant")
|
||||
p = p + delta
|
||||
if p < 0 then
|
||||
p = 0
|
||||
end
|
||||
u.region:set_resource("peasant", p)
|
||||
return p
|
||||
end
|
||||
|
||||
function hp_getresource(u)
|
||||
return u.hp
|
||||
end
|
||||
|
||||
function hp_changeresource(u, delta)
|
||||
local hp = u.hp + delta
|
||||
|
||||
if hp < u.number then
|
||||
if hp < 0 then
|
||||
hp = 0
|
||||
end
|
||||
u.number = hp
|
||||
end
|
||||
u.hp = hp
|
||||
return hp
|
||||
end
|
||||
|
||||
function horse_limit(r)
|
||||
return r:get_resource("horse")
|
||||
end
|
||||
|
||||
function horse_produce(r, n)
|
||||
local horses = r:get_resource("horse")
|
||||
if horses>=n then
|
||||
r:set_resource("horse", horses-n)
|
||||
else
|
||||
r:set_resource("horse", 0)
|
||||
end
|
||||
end
|
||||
|
||||
function log_limit(r)
|
||||
-- if r:get_flag(1) then -- RF_MALLORN
|
||||
-- return 0
|
||||
-- end
|
||||
return r:get_resource("tree") + r:get_resource("sapling")
|
||||
end
|
||||
|
||||
function log_produce(r, n)
|
||||
local trees = r:get_resource("tree")
|
||||
if trees>=n then
|
||||
r:set_resource("tree", trees-n)
|
||||
else
|
||||
r:set_resource("tree", 0)
|
||||
n = n - trees
|
||||
trees = r:get_resource("sapling")
|
||||
if trees>=n then
|
||||
r:set_resource("sapling", trees-n)
|
||||
else
|
||||
r:set_resource("sapling", 0)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mallorn_limit(r)
|
||||
if not r:get_flag(1) then -- RF_MALLORN
|
||||
return 0
|
||||
end
|
||||
return r:get_resource("tree") + r:get_resource("sapling")
|
||||
end
|
||||
|
||||
function mallorn_produce(r, n)
|
||||
local trees = r:get_resource("tree")
|
||||
if trees>=n then
|
||||
r:set_resource("tree", trees-n)
|
||||
else
|
||||
r:set_resource("tree", 0)
|
||||
n = n - trees
|
||||
trees = r:get_resource("sapling")
|
||||
if trees>=n then
|
||||
r:set_resource("sapling", trees-n)
|
||||
else
|
||||
r:set_resource("sapling", 0)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,155 @@
|
|||
function creation_message(mage, type, number)
|
||||
local msg = message.create("item_create_spell")
|
||||
local err = 0
|
||||
err = err + msg:set_unit("mage", mage)
|
||||
err = err + msg:set_int("number", number)
|
||||
err = err + msg:set_resource("item", type)
|
||||
if err ~= 0 then
|
||||
return nil
|
||||
else
|
||||
return msg
|
||||
end
|
||||
end
|
||||
|
||||
local function create_item(mage, level, name, number)
|
||||
local count = number or 1
|
||||
mage:add_item(name, count);
|
||||
local msg = creation_message(mage, name, count)
|
||||
msg:send_faction(mage.faction)
|
||||
return level
|
||||
end
|
||||
|
||||
-- Wasser des Lebens
|
||||
function create_potion_p2(r, mage, level, force)
|
||||
return create_item(mage, level, "p2", level)
|
||||
end
|
||||
|
||||
-- Siebenmeilentee
|
||||
function create_potion_p0(r, mage, level, force)
|
||||
return create_item(mage, level, "p0", level)
|
||||
end
|
||||
|
||||
-- Wundsalbe
|
||||
function create_potion_ointment(r, mage, level, force)
|
||||
return create_item(mage, level, "ointment", level)
|
||||
end
|
||||
|
||||
-- Bauernblut
|
||||
function create_potion_peasantblood(r, mage, level, force)
|
||||
return create_item(mage, level, "peasantblood", level)
|
||||
end
|
||||
|
||||
-- Pferdeglueck
|
||||
function create_potion_p9(r, mage, level, force)
|
||||
return create_item(mage, level, "p9", level)
|
||||
end
|
||||
|
||||
-- Schaffenstrunk
|
||||
function create_potion_p3(r, mage, level, force)
|
||||
return create_item(mage, level, "p3", level)
|
||||
end
|
||||
|
||||
-- Heiltrank
|
||||
function create_potion_p14(r, mage, level, force)
|
||||
return create_item(mage, level, "p14", level)
|
||||
end
|
||||
|
||||
-- Elixier der Macht
|
||||
function create_potion_p13(r, mage, level, force)
|
||||
return create_item(mage, level, "p13", level)
|
||||
end
|
||||
|
||||
-- Erschaffe ein Flammenschwert
|
||||
function create_firesword(r, mage, level, force)
|
||||
return create_item(mage, level, "firesword")
|
||||
end
|
||||
|
||||
-- Erschaffe einen Guertel der Trollstaerke
|
||||
function create_trollbelt(r, mage, level, force)
|
||||
return create_item(mage, level, "trollbelt")
|
||||
end
|
||||
|
||||
-- Erschaffe einen Ring der Unsichtbarkeit
|
||||
function create_roi(r, mage, level, force)
|
||||
return create_item(mage, level, "roi")
|
||||
end
|
||||
|
||||
-- Erschaffe einen Ring der flinken Finger
|
||||
function create_roqf(r, mage, level, force)
|
||||
return create_item(mage, level, "roqf")
|
||||
end
|
||||
|
||||
-- Erschaffe ein Amulett des wahren Sehens
|
||||
function create_aots(r, mage, level, force)
|
||||
return create_item(mage, level, "aots")
|
||||
end
|
||||
|
||||
-- Erschaffe einen magischen Kraeuterbeutel
|
||||
function create_magicherbbag(r, mage, level, force)
|
||||
return create_item(mage, level, "magicherbbag")
|
||||
end
|
||||
|
||||
-- Erschaffe einen Taktikkristal
|
||||
function create_dreameye(r, mage, level, force)
|
||||
return create_item(mage, level, "dreameye")
|
||||
end
|
||||
|
||||
-- Erschaffe einen Antimagiekristall
|
||||
function create_antimagic(r, mage, level, force)
|
||||
return create_item(mage, level, "antimagic")
|
||||
end
|
||||
|
||||
-- Erschaffe eine Sphaere der Unsichtbarkeit
|
||||
function create_invisibility_sphere(r, mage, level, force)
|
||||
return create_item(mage, level, "sphereofinv")
|
||||
end
|
||||
|
||||
-- Erschaffe einen Guertel der Keuschheit
|
||||
function create_chastitybelt(r, mage, level, force)
|
||||
return create_item(mage, level, "ao_chastity")
|
||||
end
|
||||
|
||||
-- Erschaffe ein Runenschwert
|
||||
function create_runesword(r, mage, level, force)
|
||||
return create_item(mage, level, "runesword")
|
||||
end
|
||||
|
||||
-- Erschaffe ein Aurafokus
|
||||
function create_focus(r, mage, level, force)
|
||||
return create_item(mage, level, "aurafocus")
|
||||
end
|
||||
|
||||
-- Erschaffe einen Ring der Macht
|
||||
function create_rop(r, mage, level, force)
|
||||
return create_item(mage, level, "rop")
|
||||
end
|
||||
|
||||
-- Erschaffe einen Ring der Regeneration
|
||||
function create_ror(r, mage, level, force)
|
||||
return create_item(mage, level, "ror")
|
||||
end
|
||||
|
||||
-- Erschaffe einen Zauberbeutel
|
||||
function create_bagofholding(r, mage, level, force)
|
||||
return create_item(mage, level, "magicbag")
|
||||
end
|
||||
|
||||
function earn_silver(r, mage, level, force)
|
||||
local money = r:get_resource("money")
|
||||
local wanted = 50 * force
|
||||
local amount = wanted
|
||||
if wanted > money then
|
||||
amount = money
|
||||
end
|
||||
r:set_resource("money", money - amount)
|
||||
mage:add_item("money", amount)
|
||||
|
||||
local msg = message.create("income")
|
||||
msg:set_unit("unit", mage)
|
||||
msg:set_region("region", r)
|
||||
msg:set_int("mode", 6)
|
||||
msg:set_int("wanted", wanted)
|
||||
msg:set_int("amount", amount)
|
||||
msg:send_faction(mage.faction)
|
||||
return level
|
||||
end
|
|
@ -0,0 +1,52 @@
|
|||
-- DEPRECATED
|
||||
|
||||
-- this script contains the action functions for the two portals
|
||||
-- used on the jadee/wildente wedding island. the two _action functions
|
||||
-- are used as age() functions for a building_action with b:addaction("name")
|
||||
-- this module is deprecated, because it puts functions in the global environment for at_building_action
|
||||
|
||||
local gates = require('eressea.gates')
|
||||
|
||||
local hellgate = nil
|
||||
local peacegate = nil
|
||||
|
||||
local function wedding_travellers(b)
|
||||
local units = {}
|
||||
|
||||
for u in b.units do
|
||||
if u:get_flag('wdgt') then
|
||||
units[u] = u
|
||||
end
|
||||
end
|
||||
return units
|
||||
end
|
||||
|
||||
local function wedding_exchange(b1, b2)
|
||||
local units1 = wedding_travellers(b1)
|
||||
local units2 = wedding_travellers(b2)
|
||||
|
||||
gates.travel(b2, units1)
|
||||
gates.travel(b1, units2)
|
||||
end
|
||||
|
||||
function hellgate_action(b)
|
||||
hellgate = b
|
||||
return 1
|
||||
end
|
||||
|
||||
function peacegate_action(b)
|
||||
peacegate = b
|
||||
return 1
|
||||
end
|
||||
|
||||
local wedding = {}
|
||||
|
||||
function wedding.update()
|
||||
if peacegate and hellgate then
|
||||
wedding_exchange(peacegate, hellgate)
|
||||
else
|
||||
eressea.log.error("hellgate or peacegate not found!", hellgate, peacegate)
|
||||
end
|
||||
end
|
||||
|
||||
return wedding
|
|
@ -0,0 +1,29 @@
|
|||
function use_xmastree(u, amount)
|
||||
if u.region.herb~=nil then
|
||||
local trees = u.region:get_resource("tree")
|
||||
u.region:set_resource("tree", 10+trees)
|
||||
u:use_pooled("xmastree", amount)
|
||||
local msg = message.create("usepotion")
|
||||
msg:set_unit("unit", u)
|
||||
msg:set_resource("potion", "xmastree")
|
||||
msg:send_region(u.region)
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
local xmas = {}
|
||||
|
||||
function xmas.update()
|
||||
if not get_key("xm09") then
|
||||
print("Es weihnachtet sehr (2009)")
|
||||
set_key("xm09", true)
|
||||
for f in factions() do
|
||||
f:add_item("xmastree", 1)
|
||||
local msg = message.create("msg_event")
|
||||
msg:set_string("string", translate("santa2006"))
|
||||
msg:send_faction(f)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return xmas
|
|
@ -0,0 +1,194 @@
|
|||
function size()
|
||||
return 16
|
||||
end
|
||||
|
||||
function make_island(pl, x, y, a, b)
|
||||
if b==nil then b = a/3 end
|
||||
local nx, ny = plane.normalize(pl, x, y)
|
||||
gmtool.make_island(nx, ny, a, b)
|
||||
end
|
||||
|
||||
function make_block(pl, x, y, r)
|
||||
local nx, ny = plane.normalize(pl, x, y)
|
||||
gmtool.make_block(nx, ny, r)
|
||||
end
|
||||
|
||||
function find(email)
|
||||
for f in factions() do if f.email==email then return f end end
|
||||
return nil
|
||||
end
|
||||
|
||||
function give_item(email, id, uname, iname)
|
||||
f = find(email)
|
||||
for u in f.units do
|
||||
u.id=atoi36(id)
|
||||
u.name=uname
|
||||
u:add_item(iname, 1)
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
function give_items()
|
||||
give_item("hongeldongel@web.de", "boss", "Drollitz", "rpg_item_1")
|
||||
give_item("zangerl.helmut@chello.at", "holb", "Holbard", "rpg_item_2")
|
||||
give_item("r.lang@chello.at", "brtL", "Bertl", "rpg_item_2")
|
||||
give_item("schlaustauch@gmx.de", "bert", "Bertram", "rpg_item_3")
|
||||
end
|
||||
|
||||
function island(pl, x, y, r)
|
||||
make_block(pl, x, y, r)
|
||||
make_island(pl, x+r/2+2, y+r/2, size() * 3)
|
||||
make_island(pl, x-r-2, y+r/2, size() * 3)
|
||||
make_island(pl, x-r/2-2, y-r/2, size() * 3)
|
||||
make_island(pl, x+r+2, y-r/2, size() * 3)
|
||||
make_island(pl, x+r/2+2, y-r-2, size() * 3)
|
||||
make_island(pl, x-r/2-2, y+r+2, size() * 3)
|
||||
end
|
||||
|
||||
function cross(pl, x, y, r)
|
||||
make_block(pl, x-r, y+r*2, r)
|
||||
make_block(pl, x+r*4/3, y, r)
|
||||
make_block(pl, x-r*4/3, y, r)
|
||||
make_block(pl, x+r, y-r*2, r)
|
||||
|
||||
make_island(pl, x, y, size() * 3)
|
||||
make_island(pl, x, y-r*4/3, size() * 3)
|
||||
make_island(pl, x, y+r*4/3, size() * 3)
|
||||
make_island(pl, x+r*4/3, y-r*4/3, size() * 3)
|
||||
make_island(pl, x-r*4/3, y+r*4/3, size() * 3)
|
||||
end
|
||||
|
||||
function clean()
|
||||
for r in regions() do
|
||||
if r.terrain=="ocean" then
|
||||
-- print(r)
|
||||
region.destroy(r)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function count()
|
||||
local i = 0
|
||||
for f in factions() do i = i + 1 end
|
||||
print(i)
|
||||
end
|
||||
|
||||
function line(pl)
|
||||
local m = 0
|
||||
local i = 0
|
||||
local x, y = plane.normalize(pl, 0, i)
|
||||
local r = get_region(x, y)
|
||||
while true do
|
||||
if r==nil then
|
||||
if m==0 and (i>=0 or i<-10) then
|
||||
local s = size()
|
||||
gmtool.make_island(x, y, s*3, s)
|
||||
else
|
||||
gmtool.make_block(x, y, 6)
|
||||
end
|
||||
r = get_region(x, y)
|
||||
if r==nil then
|
||||
r = region.create(x, y, "ocean")
|
||||
end
|
||||
m = 1 - m
|
||||
end
|
||||
i = r.y + 1
|
||||
x, y = plane.normalize(pl, 0, i)
|
||||
r = get_region(x, y)
|
||||
if r~=nil and r.y==0 then break end
|
||||
end
|
||||
end
|
||||
|
||||
function build(pl)
|
||||
local d = 28
|
||||
local h = 20
|
||||
line(pl)
|
||||
island(pl, d+15, -6, 11)
|
||||
island(pl, -d, -h-10, 11)
|
||||
cross(pl, -d, h-10, 6)
|
||||
island(pl, d, 2*h, 11)
|
||||
end
|
||||
|
||||
function fill(pl, w, h)
|
||||
local x, y
|
||||
for x=0,w do
|
||||
for y=0,h do
|
||||
local nx, ny = plane.normalize(pl, x, y)
|
||||
local r = get_region(nx, ny)
|
||||
if r==nil then
|
||||
r = region.create(nx, ny, "ocean")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function seed()
|
||||
local input = io.open(config.basepath .. "/parteien.txt")
|
||||
for f in factions() do
|
||||
if f.race=="vampunicorn" then
|
||||
local str = input:read("*line")
|
||||
if str==nil then break end
|
||||
local race, lang, email = str:match("([^ ]*) ([^ ]*) ([^ ]*)")
|
||||
f.race = race:lower()
|
||||
f.options = f.options + 4096
|
||||
f.email = email
|
||||
f.locale = lang
|
||||
for u in f.units do
|
||||
u.race = race:lower()
|
||||
u.hp = u.hp_max
|
||||
local b = building.create(u.region, "castle")
|
||||
if lang=="de" then
|
||||
u.name = "Entdecker"
|
||||
b.name = "Heimat"
|
||||
else
|
||||
u.name = "Explorer"
|
||||
b.name = "Home"
|
||||
end
|
||||
b.size = 10
|
||||
u.building = b
|
||||
end
|
||||
end
|
||||
end
|
||||
for r in regions() do
|
||||
r:set_resource("sapling", r:get_resource("tree")/4)
|
||||
r:set_resource("seed", 0)
|
||||
end
|
||||
update_owners()
|
||||
end
|
||||
|
||||
function select()
|
||||
for f in factions() do
|
||||
if f.email=="enno@eressea.de" then
|
||||
for u in f.units do
|
||||
gmtool.select(u.region, true)
|
||||
u.number = 0
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function justWords(str)
|
||||
local t = {}
|
||||
local function helper(word) table.insert(t, word) return "" end
|
||||
if not str:gsub("%w+", helper):find"%S" then return t end
|
||||
end
|
||||
|
||||
function rebuild()
|
||||
free_game()
|
||||
local w = 110
|
||||
local h = 80
|
||||
local pl = plane.create(0, -w/2, -h/2, w+1, h+1)
|
||||
build(pl)
|
||||
fill(pl, w, h)
|
||||
write_map("export.cr")
|
||||
end
|
||||
|
||||
function testwelt()
|
||||
free_game()
|
||||
local w = 10
|
||||
local h = 10
|
||||
local pl = plane.create(0, -w/2, -h/2, w+1, h+1)
|
||||
gmtool.make_island(0, 0, 30, 3)
|
||||
fill(pl, w, h)
|
||||
write_map("export.cr")
|
||||
end
|
|
@ -0,0 +1,100 @@
|
|||
function new_faction(email, race, lang, r)
|
||||
f = faction.create(email, race, lang)
|
||||
u = unit.create(f, r, 10)
|
||||
u:add_item("log", 5);
|
||||
u:add_item("horse", 2);
|
||||
u:add_item("silver", 1000);
|
||||
u:add_item("adamantium", 1);
|
||||
end
|
||||
|
||||
function get_homes(f)
|
||||
homes={}
|
||||
for u in f.units do
|
||||
table.insert(homes, u.region)
|
||||
end
|
||||
return homes
|
||||
end
|
||||
|
||||
if eressea~=nil then
|
||||
eressea.free_game()
|
||||
eressea.read_game("game4.dat")
|
||||
homes = get_homes(get_faction("xin8"))
|
||||
else
|
||||
-- running in the lua interpreter, not eressea. fake it.
|
||||
new_faction = print
|
||||
eressea = { ['write_game'] = function(s) print("writing " .. s) end }
|
||||
homes = { "Andune", "Bedap", "Curtis", "Dovre" }
|
||||
end
|
||||
|
||||
local f=assert(io.open("factions", "r"))
|
||||
line=f:read("*line")
|
||||
players = {}
|
||||
emails = {}
|
||||
patrons = {}
|
||||
nplayers = 0
|
||||
while line~=nil do
|
||||
fields = {}
|
||||
line:gsub("([^\t]*)\t*", function(c) table.insert(fields, c) end)
|
||||
line=f:read("*line")
|
||||
email = fields[1]
|
||||
if fields[2]=='yes' then
|
||||
table.insert(patrons, email)
|
||||
else
|
||||
table.insert(emails, email)
|
||||
end
|
||||
if fields[3]=='German' then lang='de' else lang='en' end
|
||||
race=string.gsub(fields[4], "/.*", ''):lower()
|
||||
players[email] = { ['lang'] = lang, ['race'] = race }
|
||||
nplayers = nplayers + 1
|
||||
end
|
||||
|
||||
for k, r in ipairs(homes) do
|
||||
print(k, r)
|
||||
end
|
||||
npatrons = #patrons
|
||||
print(#homes .. " regions.")
|
||||
print(nplayers .. " players.")
|
||||
print(npatrons .. " patrons.")
|
||||
|
||||
maxfactions = 20
|
||||
selected = {}
|
||||
if maxfactions > nplayers then maxfactions = nplayers end
|
||||
while maxfactions > 0 do
|
||||
if npatrons > 0 then
|
||||
email = patrons[npatrons]
|
||||
patrons[npatrons] = nil
|
||||
npatrons = npatrons - 1
|
||||
else
|
||||
local np = #emails
|
||||
local i = math.random(np)
|
||||
email = emails[i]
|
||||
emails[i] = emails[np]
|
||||
emails[np] = nil
|
||||
end
|
||||
local player = players[email]
|
||||
player.email = email
|
||||
table.insert(selected, player)
|
||||
maxfactions = maxfactions - 1
|
||||
end
|
||||
|
||||
-- random shuffle
|
||||
for j=1,#selected do
|
||||
k = math.random(j)
|
||||
if k ~= j then
|
||||
local temp = selected[j]
|
||||
selected[j] = selected[k]
|
||||
selected[k] = temp
|
||||
end
|
||||
end
|
||||
|
||||
print('## players')
|
||||
for k, player in ipairs(selected) do
|
||||
local r = homes[1 + k % #homes]
|
||||
new_faction(player.email, player.race, player.lang, r)
|
||||
print(player.email)
|
||||
end
|
||||
eressea.write_game("game4.dat")
|
||||
print("## no faction")
|
||||
for i, email in ipairs(emails) do
|
||||
print(email)
|
||||
end
|
Loading…
Reference in New Issue