diff options
author | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2012-02-26 22:06:10 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2012-03-02 18:12:07 +0100 |
commit | 34ac0d64e23f2b2d3981dbb0ea72157f334805dd (patch) | |
tree | 114b1f7a65956c097f7a59078292c9fa29c6451f /src/scripting/scriptmanager.cpp | |
parent | e896d0b0125b48e12d43d99ace4498e56d968d50 (diff) | |
download | manaserv-34ac0d64e23f2b2d3981dbb0ea72157f334805dd.tar.gz manaserv-34ac0d64e23f2b2d3981dbb0ea72157f334805dd.tar.bz2 manaserv-34ac0d64e23f2b2d3981dbb0ea72157f334805dd.tar.xz manaserv-34ac0d64e23f2b2d3981dbb0ea72157f334805dd.zip |
Merged all the different Lua states into one
No more Lua state for each status effect, monster, item effect or map. All
scripts are loaded into the same state. This should be more efficient overall
and make it easier to implement dynamic reloading of the scripts in the
future.
Now, this introduces the problem of name collisions between different Lua
scripts. For now this is solved by using more specific function names, like
'tick_plague' and 'tick_jump' rather than just 'tick'. The plan is however
to get rid of these globals, and register these callbacks from the script,
so that they can be local functions without the danger of colliding with
other scripts.
Reviewed-by: Erik Schilling
Reviewed-by: Yohann Ferreira
Diffstat (limited to 'src/scripting/scriptmanager.cpp')
-rw-r--r-- | src/scripting/scriptmanager.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/scripting/scriptmanager.cpp b/src/scripting/scriptmanager.cpp new file mode 100644 index 00000000..52515699 --- /dev/null +++ b/src/scripting/scriptmanager.cpp @@ -0,0 +1,98 @@ +/* + * The Mana Server + * Copyright (C) 2012 The Mana Developers + * + * This file is part of The Mana Server. + * + * The Mana Server is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana Server. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "scriptmanager.h" + +#include "common/configuration.h" +#include "scripting/script.h" + +static Script *_currentState; + +void ScriptManager::initialize() +{ + const std::string engine = Configuration::getValue("script_engine", "lua"); + _currentState = Script::create(engine); +} + +void ScriptManager::deinitialize() +{ + delete _currentState; + _currentState = 0; +} + +bool ScriptManager::loadMainScript(const std::string &file) +{ + return _currentState->loadFile(file); +} + +Script *ScriptManager::currentState() +{ + return _currentState; +} + +// TODO: Have some generic event mechanism rather than calling global functions + +bool ScriptManager::executeGlobalEventFunction(const std::string &function, Being* obj) +{ + bool isScriptHandled = false; + _currentState->setMap(obj->getMap()); + _currentState->prepare(function); + _currentState->push(obj); + _currentState->execute(); + _currentState->setMap(NULL); + isScriptHandled = true; // TODO: don't set to true when execution failed + return isScriptHandled; +} + + +void ScriptManager::addDataToSpecial(int id, Special *special) +{ + /* currently only gets the recharge cost. + TODO: get any other info in a similar way, but + first we have to agree on what other + info we actually want to provide. + */ + if (special) + { + _currentState->prepare("get_special_recharge_cost"); + _currentState->push(id); + int scriptReturn = _currentState->execute(); + special->neededMana = scriptReturn; + } +} + +bool ScriptManager::performSpecialAction(int specialId, Being *caster) +{ + _currentState->prepare("use_special"); + _currentState->push(caster); + _currentState->push(specialId); + _currentState->execute(); + return true; +} + +bool ScriptManager::performCraft(Being *crafter, + const std::list<InventoryItem> &recipe) +{ + _currentState->prepare("on_craft"); + _currentState->push(crafter); + _currentState->push(recipe); + _currentState->execute(); + return true; +} |