/*
* The Mana Server
* Copyright (C) 2007 The Mana World Development Team
*
* 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 .
*/
#ifndef SCRIPTING_SCRIPT_HPP
#define SCRIPTING_SCRIPT_HPP
#include
#include "game-server/eventlistener.hpp"
class MapComposite;
class Thing;
/**
* Abstract interface for calling functions written in an external language.
*/
class Script
{
public:
typedef Script *(*Factory)();
/**
* Registers a new scripting engine.
*/
static void registerEngine(const std::string &, Factory);
/**
* Creates a new script context for a given engine.
*/
static Script *create(const std::string &engine);
/**
* Constructor.
*/
Script();
/**
* Destructor.
*/
virtual ~Script() {}
/**
* Loads a chunk of text into script context and executes its global
* statements.
*/
virtual void load(const char *) = 0;
/**
* Loads a text file into script context and executes its global
* statements.
*/
virtual bool loadFile(const std::string &);
/**
* Loads a chunk of text and considers it as an NPC handler. This
* handler will later be used to create the given NPC.
*/
virtual void loadNPC(const std::string &name, int id, int x, int y,
const char *);
/**
* Called every tick for the script to manage its data.
* Calls the "update" function of the script by default.
*/
virtual void update();
/**
* Prepares a call to the given function.
* Only one function can be prepared at once.
*/
virtual void prepare(const std::string &name) = 0;
/**
* Pushes an integer argument for the function being prepared.
*/
virtual void push(int) = 0;
/**
* Pushes a string argument for the function being prepared.
*/
virtual void push(const std::string &) = 0;
/**
* Pushes a pointer argument to a game entity.
* The interface can pass the pointer as an opaque value to the
* scripting engine, if needed. This value will usually be passed
* by the script to some callback functions.
*/
virtual void push(Thing *) = 0;
/**
* Executes the function being prepared.
* @return the value returned by the script.
*/
virtual int execute() = 0;
/**
* Sets associated map.
*/
void setMap(MapComposite *m)
{ mMap = m; }
/**
* Gets associated map.
*/
MapComposite *getMap() const
{ return mMap; }
EventListener *getScriptListener()
{ return &mEventListener; }
virtual void processDeathEvent(Being* thing) = 0;
virtual void processRemoveEvent(Thing* thing) = 0;
protected:
std::string mScriptFile;
private:
MapComposite *mMap;
EventListener mEventListener; /**< Tracking of being deaths. */
friend struct ScriptEventDispatch;
};
struct ScriptEventDispatch: EventDispatch
{
ScriptEventDispatch()
{
typedef EventListenerFactory< Script, &Script::mEventListener > Factory;
died = &Factory::create< Being, &Script::processDeathEvent >::function;
removed = &Factory::create< Thing, &Script::processRemoveEvent >::function;
}
};
static ScriptEventDispatch scriptEventDispatch;
#endif