Die Sphinx, ordentlich gelöst.

This commit is contained in:
Enno Rehling 2004-08-21 12:02:45 +00:00
parent f5f518bb43
commit 79d61bd763
4 changed files with 145 additions and 135 deletions

View File

@ -46,7 +46,16 @@ call_script(struct unit * u)
if (a==NULL) a = a_findc(u->race->attribs, &at_script); if (a==NULL) a = a_findc(u->race->attribs, &at_script);
if (a!=NULL && a->data.v!=NULL) { if (a!=NULL && a->data.v!=NULL) {
luabind::functor<void> * func = (luabind::functor<void> *)a->data.v; luabind::functor<void> * func = (luabind::functor<void> *)a->data.v;
func->operator()(u); try {
func->operator()(u);
}
catch (luabind::error& e) {
lua_State* L = e.state();
const char* error = lua_tostring(L, -1);
log_error((error));
lua_pop(L, 1);
std::terminate();
}
} }
return -1; return -1;
} }

View File

@ -1,157 +1,59 @@
function process(orders)
function init_sphinxhints() -- read game and orders
for f in factions() do
hints = {}
for i=0,14,1 do
hints[i] = 0
end
for i=0,4,1 do
if f:get_variable("sphinxhint"..tostring(i)) == nil then
repeat
hint = math.random(0,14)
until hints[hint] == 0
hints[hint] = 1
f:set_variable("sphinxhint"..tostring(i),tostring(hint))
end
end
end
end
function sphinx_handler()
local function send_gotHint(u, usphinx)
usphinx:add_order("botschaft einheit " .. itoa36(u.id) .. " \"Du hast diese Woche bereits einen Hinweis erhalten!\"")
end
local function send_hint(u, usphinx)
hintText = {}
possibleHint = {}
hintText[0] = "Das Schiff des Elfen hat ein rotes Segel"
hintText[1] = "Der Zwerg hat eine Nuss dabei"
hintText[2] = "Die Katze führt eine Hellebarde"
hintText[3] = "Das Schiff mit dem grünen Segel liegt links neben dem mit einem weissen Segel"
hintText[4] = "Auf dem Schiff mit grünen Segeln kam der Speerkämpfer"
hintText[5] = "Der Krieger mit dem Kreis im Wappen hat einen Keks"
hintText[6] = "Der Krieger des mittleren Schiffs hat ein Schwert"
hintText[7] = "Auf dem gelben Segel prankt ein Kreuz als Wappen"
hintText[8] = "Der Mensch kam mit dem ersten Schiff"
hintText[9] = "Das Schiff mit dem Stern im Wappen liegt neben dem der einen Mandelkern hat"
hintText[10] = "Das Schiff des Kriegers, der ein Apfel hat, liegt neben dem, der ein Kreuz als Wappen hat"
hintText[11] = "Der Krieger mit dem Turm im Wappen trägt eine Axt"
hintText[12] = "Das Schiff des Menschen liegt neben dem blauen Schiff"
hintText[13] = "Das Insekt trägt einen Baum als Wappen"
hintText[14] = "Das Schiff mit dem Stern im Wappen liegt neben dem des Kriegers, der einen Zweihänder führt"
for i=0,4,1 do
possibleHint[i] = tonumber(u.faction:get_variable("sphinxhint"..tostring(i)))
end
hint = math.random(0,4)
usphinx:add_order("botschaft einheit " .. itoa36(u.id) .. " \"" .. hintText[possibleHint[hint]] .. "!\"")
end
local function msg_handler(u, evt)
str = evt:get_string(0)
u2 = evt:get_unit(1)
if string.lower(str) == "hinweis" then
if u2.faction:get_variable("sphinxGotHint"..itoa36(u.id)) ~= nil then
send_gotHint(u2)
else
send_hint(u2, u)
end
end
end
local f = get_faction(atoi36("ycx9"))
local u = get_unit(atoi36("si7z"))
if u ~= nil and u.faction == f then
u:add_handler("message", msg_handler)
end
local f = get_faction(atoi36("ycx9"))
local u = get_unit(atoi36("qcph"))
if u ~= nil and u.faction == f then
u:add_handler("message", msg_handler)
end
end
function sphinx_weekly()
local f = get_faction(atoi36("ycx9"))
local u = get_unit(atoi36("si7z"))
if u ~= nil and u.faction == f then
u.region:add_notice("Eine Botschaft von Sphinx (si7z): Mit einer Botschaft \"Hinweis\" gebe ich euch einen Hinweis, mit einer Botschaft \"Antwort <Eure Antwort>\" könnt ihr mir eure Antwort mitteilen. Doch Vorsicht, falsche Antworten werde ich bestrafen!")
u.region:add_notice("Eine Botschaft von Sphinx (si7z): Fünf Krieger kamen auf ihren Schiffen in die Ebene der Helden, wollten um die Ehre ringen. Jedes Schiff trug ein anderes Segel, auf dem das Wappen des Kriegers prankte. Ein jeder trug seine liebste Waffe und das Signum seines Volkes und doch war keiner gleich.")
u.region:add_notice("Eine Botschaft von Sphinx (si7z): Wer hat den Schneeball?")
end
local u = get_unit(atoi36("qcph"))
if u ~= nil and u.faction == f then
u.region:add_notice("Eine Botschaft von Sphinx (qcph): Mit einer Botschaft \"Hinweis\" gebe ich euch einen Hinweis, mit einer Botschaft \"Antwort <Eure Antwort>\" könnt ihr mir eure Antwort mitteilen. Doch Vorsicht, falsche Antworten werde ich bestrafen!")
u.region:add_notice("Eine Botschaft von Sphinx (qcph): Fünf Krieger kamen auf ihren Schiffen in die Ebene der Helden, wollten um die Ehre ringen. Jedes Schiff trug ein anderes Segel, auf dem das Wappen des Kriegers prankte. Ein jeder trug seine liebste Waffe und das Signum seines Volkes und doch war keiner gleich.")
u.region:add_notice("Eine Botschaft von Sphinx (qcph): Wer hat den Schneeball?")
end
for faction in factions() do
faction:delete_variable("sphinxGotHintsi7z");
faction:delete_variable("sphinx2GotHintqcph");
end
end
function run_wdw()
local turnfile = "" .. get_turn() local turnfile = "" .. get_turn()
if read_game(turnfile)~=0 then if read_game(turnfile)~=0 then
print("could not read game") print("could not read game")
return -1 return -1
end end
-- run the turn (not yet) -- read the orders file
read_orders(orderfile) read_orders(orders)
print("init_sphinxhints")
-- set up the sphinx
init_sphinxhints() init_sphinxhints()
print("sphinx_weekly")
sphinx_weekly()
sphinx_handler() sphinx_handler()
sphinx_weekly()
-- run the turn:
plan_monsters() plan_monsters()
process_orders() process_orders()
outfile = "" .. get_turn() outfile = "" .. get_turn()
-- siegbedingungen ausgeben
dofile("wdw-standings.lua")
-- write out the initial reports (no need to run a turn) -- write out the initial reports (no need to run a turn)
write_passwords() write_passwords()
write_reports() write_reports()
-- siegbedingungen ausgeben
write_standings()
-- write the resulting file to 'wdw-setup' -- save the game
if write_game(outfile)~=0 then if write_game(outfile)~=0 then
print("could not write game") print("could not write game")
return -1 return -1
end end
end end
--
-- main body of script
--
print("- Running wdw-run.lua") print("- Running wdw-run.lua")
scripts = { scripts = {
"wdw-sphinx.lua",
"wdw-standings.lua"
} }
scriptpath = "/home/vinyambar/wdw-test/scripts/" -- orderfile: contains the name of the orders.
if orderfile==nil then
for index in scripts do print "you must specify an orderfile"
local script = scriptpath .. scripts[index] else
for index in scripts do
print("- running " .. script) local script = scriptpath .. "/" .. scripts[index]
if pcall(dofile, script)==0 then print("- loading " .. script)
print("error: could not load " .. script) if pcall(dofile, script)==0 then
end print("Could not load " .. script)
end
end
process(orderfile)
end end
--
-- main body of the script
run_wdw()

102
src/scripts/wdw-sphinx.lua Normal file
View File

@ -0,0 +1,102 @@
function init_sphinxhints()
for f in factions() do
hints = {}
for i=0,14,1 do
hints[i] = 0
end
for i=0,4,1 do
if f:get_variable("sphinxhint"..tostring(i)) == nil then
repeat
hint = math.random(0,14)
until hints[hint] == 0
hints[hint] = 1
f:set_variable("sphinxhint"..tostring(i),tostring(hint))
end
end
end
end
function sphinx_handler()
local function send_gotHint(u, usphinx)
usphinx:add_order("botschaft einheit " .. itoa36(u.id) .. " \"Du hast diese Woche bereits einen Hinweis erhalten!\"")
end
local function send_hint(u, usphinx)
hintText = {}
possibleHint = {}
hintText[0] = "Das Schiff des Elfen hat ein rotes Segel"
hintText[1] = "Der Zwerg hat eine Nuss dabei"
hintText[2] = "Die Katze führt eine Hellebarde"
hintText[3] = "Das Schiff mit dem grünen Segel liegt links neben dem mit einem weissen Segel"
hintText[4] = "Auf dem Schiff mit grünen Segeln kam der Speerkämpfer"
hintText[5] = "Der Krieger mit dem Kreis im Wappen hat einen Keks"
hintText[6] = "Der Krieger des mittleren Schiffs hat ein Schwert"
hintText[7] = "Auf dem gelben Segel prankt ein Kreuz als Wappen"
hintText[8] = "Der Mensch kam mit dem ersten Schiff"
hintText[9] = "Das Schiff mit dem Stern im Wappen liegt neben dem der einen Mandelkern hat"
hintText[10] = "Das Schiff des Kriegers, der ein Apfel hat, liegt neben dem, der ein Kreuz als Wappen hat"
hintText[11] = "Der Krieger mit dem Turm im Wappen trägt eine Axt"
hintText[12] = "Das Schiff des Menschen liegt neben dem blauen Schiff"
hintText[13] = "Das Insekt trägt einen Baum als Wappen"
hintText[14] = "Das Schiff mit dem Stern im Wappen liegt neben dem des Kriegers, der einen Zweihänder führt"
for i=0,4,1 do
possibleHint[i] = tonumber(u.faction:get_variable("sphinxhint"..tostring(i)))
end
hint = math.random(0,4)
usphinx:add_order("botschaft einheit " .. itoa36(u.id) .. " \"" .. hintText[possibleHint[hint]] .. "!\"")
end
local function msg_handler(u, evt)
str = evt:get_string(0)
u2 = evt:get_unit(1)
if string.lower(str) == "hinweis" then
if u2.faction:get_variable("sphinxGotHint"..itoa36(u.id)) ~= nil then
send_gotHint(u2)
else
send_hint(u2, u)
end
end
end
local f = get_faction(atoi36("ycx9"))
local u = get_unit(atoi36("si7z"))
if u ~= nil and u.faction == f then
u:add_handler("message", msg_handler)
end
local f = get_faction(atoi36("ycx9"))
local u = get_unit(atoi36("qcph"))
if u ~= nil and u.faction == f then
u:add_handler("message", msg_handler)
end
end
function sphinx_weekly()
local f = get_faction(atoi36("ycx9"))
local u = get_unit(atoi36("si7z"))
if u ~= nil and u.faction == f then
u.region:add_notice("Eine Botschaft von Sphinx (si7z): Mit einer Botschaft \"Hinweis\" gebe ich euch einen Hinweis, mit einer Botschaft \"Antwort <Eure Antwort>\" könnt ihr mir eure Antwort mitteilen. Doch Vorsicht, falsche Antworten werde ich bestrafen!")
u.region:add_notice("Eine Botschaft von Sphinx (si7z): Fünf Krieger kamen auf ihren Schiffen in die Ebene der Helden, wollten um die Ehre ringen. Jedes Schiff trug ein anderes Segel, auf dem das Wappen des Kriegers prankte. Ein jeder trug seine liebste Waffe und das Signum seines Volkes und doch war keiner gleich.")
u.region:add_notice("Eine Botschaft von Sphinx (si7z): Wer hat den Schneeball?")
end
local u = get_unit(atoi36("qcph"))
if u ~= nil and u.faction == f then
u.region:add_notice("Eine Botschaft von Sphinx (qcph): Mit einer Botschaft \"Hinweis\" gebe ich euch einen Hinweis, mit einer Botschaft \"Antwort <Eure Antwort>\" könnt ihr mir eure Antwort mitteilen. Doch Vorsicht, falsche Antworten werde ich bestrafen!")
u.region:add_notice("Eine Botschaft von Sphinx (qcph): Fünf Krieger kamen auf ihren Schiffen in die Ebene der Helden, wollten um die Ehre ringen. Jedes Schiff trug ein anderes Segel, auf dem das Wappen des Kriegers prankte. Ein jeder trug seine liebste Waffe und das Signum seines Volkes und doch war keiner gleich.")
u.region:add_notice("Eine Botschaft von Sphinx (qcph): Wer hat den Schneeball?")
end
for faction in factions() do
faction:delete_variable("sphinxGotHintsi7z");
faction:delete_variable("sphinx2GotHintqcph");
end
end

View File

@ -9,7 +9,7 @@ function write_standings()
print(reportpath .. "/victory.txt") print(reportpath .. "/victory.txt")
local file = io.open(reportpath .. "/victory.txt", "w") local file = io.open(reportpath .. "/victory.txt", "w")
log(file, "** Allianzen **") log(file, "** Allianzen ** " .. reportpath .. "/victory.txt")
local alliance local alliance
for alliance in alliances() do for alliance in alliances() do
local faction local faction
@ -38,6 +38,3 @@ function write_standings()
file:close() file:close()
end end
-- main body of script
write_standings()