diff --git a/src/eressea/lua/script.cpp b/src/eressea/lua/script.cpp index a719532b3..45982f61e 100644 --- a/src/eressea/lua/script.cpp +++ b/src/eressea/lua/script.cpp @@ -46,7 +46,16 @@ call_script(struct unit * u) if (a==NULL) a = a_findc(u->race->attribs, &at_script); if (a!=NULL && a->data.v!=NULL) { luabind::functor * func = (luabind::functor *)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; } diff --git a/src/scripts/wdw-run.lua b/src/scripts/wdw-run.lua index 178d9fafb..fed15bf52 100644 --- a/src/scripts/wdw-run.lua +++ b/src/scripts/wdw-run.lua @@ -1,157 +1,59 @@ - -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 \" 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 \" 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() +function process(orders) + -- read game and orders local turnfile = "" .. get_turn() if read_game(turnfile)~=0 then print("could not read game") return -1 end - - -- run the turn (not yet) - read_orders(orderfile) - print("init_sphinxhints") + + -- read the orders file + read_orders(orders) + + -- set up the sphinx init_sphinxhints() - print("sphinx_weekly") - sphinx_weekly() sphinx_handler() + sphinx_weekly() + + -- run the turn: plan_monsters() process_orders() outfile = "" .. get_turn() - -- siegbedingungen ausgeben - dofile("wdw-standings.lua") - -- write out the initial reports (no need to run a turn) write_passwords() write_reports() + -- siegbedingungen ausgeben + write_standings() - -- write the resulting file to 'wdw-setup' + -- save the game if write_game(outfile)~=0 then print("could not write game") return -1 end end +-- +-- main body of script +-- + print("- Running wdw-run.lua") -scripts = { +scripts = { + "wdw-sphinx.lua", + "wdw-standings.lua" } -scriptpath = "/home/vinyambar/wdw-test/scripts/" - -for index in scripts do - local script = scriptpath .. scripts[index] - - print("- running " .. script) - if pcall(dofile, script)==0 then - print("error: could not load " .. script) - end +-- orderfile: contains the name of the orders. +if orderfile==nil then + print "you must specify an orderfile" +else + for index in scripts do + local script = scriptpath .. "/" .. scripts[index] + print("- loading " .. script) + if pcall(dofile, script)==0 then + print("Could not load " .. script) + end + end + process(orderfile) end - --- --- main body of the script -run_wdw() - diff --git a/src/scripts/wdw-sphinx.lua b/src/scripts/wdw-sphinx.lua new file mode 100644 index 000000000..dda0c0068 --- /dev/null +++ b/src/scripts/wdw-sphinx.lua @@ -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 \" 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 \" 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 diff --git a/src/scripts/wdw-standings.lua b/src/scripts/wdw-standings.lua index 3724670e2..2cdc946da 100644 --- a/src/scripts/wdw-standings.lua +++ b/src/scripts/wdw-standings.lua @@ -9,7 +9,7 @@ function write_standings() print(reportpath .. "/victory.txt") local file = io.open(reportpath .. "/victory.txt", "w") - log(file, "** Allianzen **") + log(file, "** Allianzen ** " .. reportpath .. "/victory.txt") local alliance for alliance in alliances() do local faction @@ -38,6 +38,3 @@ function write_standings() file:close() end - --- main body of script -write_standings()