diff options
author | truebrain <truebrain@openttd.org> | 2011-11-29 23:21:33 +0000 |
---|---|---|
committer | truebrain <truebrain@openttd.org> | 2011-11-29 23:21:33 +0000 |
commit | 3da8b5097a4643d531182173df36ca4d3b45a4e2 (patch) | |
tree | f310e6fd8a61909b60111f6b2e906e0ab6ff8231 /src/script/script_instance.hpp | |
parent | 75c4bd280a720592ec4df26efbedd9df5baa2d8f (diff) | |
download | openttd-3da8b5097a4643d531182173df36ca4d3b45a4e2.tar.xz |
(svn r23360) -Codechange: move AIInstance to ScriptInstance, making it reusable by other script API instances
Diffstat (limited to 'src/script/script_instance.hpp')
-rw-r--r-- | src/script/script_instance.hpp | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/src/script/script_instance.hpp b/src/script/script_instance.hpp new file mode 100644 index 000000000..232218912 --- /dev/null +++ b/src/script/script_instance.hpp @@ -0,0 +1,194 @@ +/* $Id$ */ + +/* + * This file is part of OpenTTD. + * OpenTTD 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, version 2. + * OpenTTD 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 OpenTTD. If not, see <http://www.gnu.org/licenses/>. + */ + +/** @file script_instance.hpp The ScriptInstance tracks a script. */ + +#ifndef SCRIPT_INSTANCE_HPP +#define SCRIPT_INSTANCE_HPP + +#include <squirrel.h> +#include "script_suspend.hpp" + +/** Runtime information about a script like a pointer to the squirrel vm and the current state. */ +class ScriptInstance { +public: + friend class ScriptObject; + friend class ScriptController; + + /** + * Create a new script. + */ + ScriptInstance(const char *APIName); + virtual ~ScriptInstance(); + + /** + * Initialize the script and prepare it for its first run. + * @param main_script The name of the script to load. + * @param instance_name The name of the instance out of the script to load. + */ + void Initialize(const char *main_script, const char *instance_name); + + /** + * A script in multiplayer waits for the server to handle his DoCommand. + * It keeps waiting for this until this function is called. + */ + void Continue(); + + /** + * Run the GameLoop of a script. + */ + void GameLoop(); + + /** + * Let the VM collect any garbage. + */ + void CollectGarbage() const; + + /** + * Get the storage of this script. + */ + class ScriptStorage *GetStorage(); + + /** + * Get the log pointer of this script. + */ + void *GetLogPointer(); + + /** + * Return a true/false reply for a DoCommand. + */ + static void DoCommandReturn(ScriptInstance *instance); + + /** + * Return a VehicleID reply for a DoCommand. + */ + static void DoCommandReturnVehicleID(ScriptInstance *instance); + + /** + * Return a SignID reply for a DoCommand. + */ + static void DoCommandReturnSignID(ScriptInstance *instance); + + /** + * Return a GroupID reply for a DoCommand. + */ + static void DoCommandReturnGroupID(ScriptInstance *instance); + + /** + * Get the controller attached to the instance. + */ + class ScriptController *GetController() { return controller; } + + /** + * Return the "this script died" value + */ + inline bool IsDead() const { return this->is_dead; } + + /** + * Call the script Save function and save all data in the savegame. + */ + void Save(); + + /** + * Don't save any data in the savegame. + */ + static void SaveEmpty(); + + /** + * Load data from a savegame and store it on the stack. + * @param version The version of the script when saving, or -1 if this was + * not the original script saving the game. + */ + void Load(int version); + + /** + * Load and discard data from a savegame. + */ + static void LoadEmpty(); + + /** + * Reduces the number of opcodes the script have left to zero. Unless + * the script is in a state where it cannot suspend it will be suspended + * for the reminder of the current tick. This function is safe to + * call from within a function called by the script. + */ + void Suspend(); + + /** + * Get the number of operations the script can execute before being suspended. + * This function is safe to call from within a function called by the script. + * @return The number of operations to execute. + */ + SQInteger GetOpsTillSuspend(); + + /** + * DoCommand callback function for all commands executed by scripts. + * @param result The result of the command. + * @param tile The tile on which the command was executed. + * @param p1 p1 as given to DoCommandPInternal. + * @param p2 p2 as given to DoCommandPInternal. + */ + void DoCommandCallback(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2); + + /** + * Insert an event for this script. + * @param event The event to insert. + */ + void InsertEvent(class ScriptEvent *event); + +protected: + class Squirrel *engine; ///< A wrapper around the squirrel vm. + + /** + * Register all API functions to the VM. + */ + virtual void RegisterAPI(); + + /** + * Tell the script it died. + */ + virtual void Died(); + +private: + class ScriptController *controller; ///< The script main class. + class ScriptStorage *storage; ///< Some global information for each running script. + SQObject *instance; ///< Squirrel-pointer to the script main class. + + bool is_started; ///< Is the scripts constructor executed? + bool is_dead; ///< True if the script has been stopped. + bool is_save_data_on_stack; ///< Is the save data still on the squirrel stack? + int suspend; ///< The amount of ticks to suspend this script before it's allowed to continue. + Script_SuspendCallbackProc *callback; ///< Callback that should be called in the next tick the script runs. + + /** + * Call the script Load function if it exists and data was loaded + * from a savegame. + */ + bool CallLoad(); + + /** + * Save one object (int / string / array / table) to the savegame. + * @param vm The virtual machine to get all the data from. + * @param index The index on the squirrel stack of the element to save. + * @param max_depth The maximum depth recursive arrays / tables will be stored + * with before an error is returned. + * @param test If true, don't really store the data but only check if it is + * valid. + * @return True if the saving was successful. + */ + static bool SaveObject(HSQUIRRELVM vm, SQInteger index, int max_depth, bool test); + + /** + * Load all objects from a savegame. + * @return True if the loading was successful. + */ + static bool LoadObjects(HSQUIRRELVM vm); +}; + +#endif /* SCRIPT_INSTANCE_HPP */ |