summaryrefslogtreecommitdiff
path: root/src/scripting
diff options
context:
space:
mode:
Diffstat (limited to 'src/scripting')
-rw-r--r--src/scripting/luascript.cpp38
-rw-r--r--src/scripting/luascript.h3
-rw-r--r--src/scripting/script.cpp14
-rw-r--r--src/scripting/script.h8
4 files changed, 63 insertions, 0 deletions
diff --git a/src/scripting/luascript.cpp b/src/scripting/luascript.cpp
index a9c43b72..dc6230ca 100644
--- a/src/scripting/luascript.cpp
+++ b/src/scripting/luascript.cpp
@@ -21,6 +21,9 @@
#include "luascript.h"
+
+#include "scripting/luautil.h"
+
#include "game-server/being.h"
#include "utils/logger.h"
@@ -61,6 +64,30 @@ void LuaScript::push(Thing *v)
++nbArgs;
}
+void LuaScript::push(const std::list<InventoryItem> &itemList)
+{
+ assert(nbArgs >= 0);
+ int position = 0;
+
+ lua_createtable(mState, itemList.size(), 0);
+ int itemTable = lua_gettop(mState);
+
+ for (std::list<InventoryItem>::const_iterator i = itemList.begin();
+ i != itemList.end();
+ i++)
+ {
+ // create the item structure
+ std::map<std::string, int> item;
+ item["id"] = i->itemId;
+ item["amount"] = i->amount;
+ // add the item structure to the item table under the next index
+ lua_pushinteger(mState, ++position);
+ pushSTLContainer<std::string, int>(mState, item);
+ lua_settable(mState, itemTable);
+ }
+ ++nbArgs;
+}
+
int LuaScript::execute()
{
assert(nbArgs >= 0);
@@ -182,3 +209,14 @@ bool LuaScript::loadSpecialActionsScript(const std::string &file)
}
return true;
}
+
+bool LuaScript::loadCraftScript(const std::string &file)
+{
+ Script::craftScript = new LuaScript();
+ if (!Script::craftScript->loadFile(file))
+ {
+ Script::craftScript = NULL;
+ return false;
+ }
+ return true;
+}
diff --git a/src/scripting/luascript.h b/src/scripting/luascript.h
index af13aa22..b9bde2d8 100644
--- a/src/scripting/luascript.h
+++ b/src/scripting/luascript.h
@@ -52,6 +52,8 @@ class LuaScript: public Script
void push(Thing *);
+ void push(const std::list<InventoryItem> &itemList);
+
int execute();
static void getQuestCallback(Character *, const std::string &,
@@ -69,6 +71,7 @@ class LuaScript: public Script
*/
static bool loadGlobalEventScript(const std::string &file);
static bool loadSpecialActionsScript(const std::string &file);
+ static bool loadCraftScript(const std::string &file);
private:
lua_State *mState;
diff --git a/src/scripting/script.cpp b/src/scripting/script.cpp
index b222b0f7..490abf09 100644
--- a/src/scripting/script.cpp
+++ b/src/scripting/script.cpp
@@ -34,6 +34,7 @@ typedef std::map< std::string, Script::Factory > Engines;
static Engines *engines = NULL;
Script *Script::globalEventScript = NULL;
Script *Script::specialActionsScript = NULL;
+Script *Script::craftScript = NULL;
Script::Script():
mMap(NULL),
@@ -158,3 +159,16 @@ bool Script::performSpecialAction(int specialId, Being* caster)
}
return true;
}
+
+bool Script::performCraft(Being* crafter, std::list<InventoryItem> recipe)
+{
+ Script *script = Script::craftScript;
+ if (script)
+ {
+ script->prepare("on_craft");
+ script->push(crafter);
+ script->push(recipe);
+ script->execute();
+ }
+ return true;
+}
diff --git a/src/scripting/script.h b/src/scripting/script.h
index 43eebe10..44a8b7ac 100644
--- a/src/scripting/script.h
+++ b/src/scripting/script.h
@@ -105,6 +105,12 @@ class Script
virtual void push(Thing *) = 0;
/**
+ * Pushes a list of items with amounts to the
+ * script engine.
+ */
+ virtual void push(const std::list<InventoryItem> &itemList) = 0;
+
+ /**
* Executes the function being prepared.
* @return the value returned by the script.
*/
@@ -135,11 +141,13 @@ class Script
static bool executeGlobalEventFunction(const std::string &function, Being *obj);
static void addDataToSpecial(int specialId, Special *special);
static bool performSpecialAction(int specialId, Being *caster);
+ static bool performCraft(Being* crafter, std::list<InventoryItem> recipe);
protected:
static Script *globalEventScript;
static Script *specialActionsScript;
+ static Script *craftScript;
std::string mScriptFile;
private: