00001 /* $Id: script_instance.hpp 23735 2012-01-03 20:26:05Z rubidium $ */ 00002 00003 /* 00004 * This file is part of OpenTTD. 00005 * 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. 00006 * 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. 00007 * 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/>. 00008 */ 00009 00012 #ifndef SCRIPT_INSTANCE_HPP 00013 #define SCRIPT_INSTANCE_HPP 00014 00015 #include <squirrel.h> 00016 #include "script_suspend.hpp" 00017 00018 #include "../command_type.h" 00019 #include "../company_type.h" 00020 00021 static const uint SQUIRREL_MAX_DEPTH = 25; 00022 00024 class ScriptInstance { 00025 public: 00026 friend class ScriptObject; 00027 friend class ScriptController; 00028 00032 ScriptInstance(const char *APIName); 00033 virtual ~ScriptInstance(); 00034 00041 void Initialize(const char *main_script, const char *instance_name, CompanyID company); 00042 00048 virtual int GetSetting(const char *name) = 0; 00049 00056 virtual class ScriptInfo *FindLibrary(const char *library, int version) = 0; 00057 00062 void Continue(); 00063 00067 void GameLoop(); 00068 00072 void CollectGarbage() const; 00073 00077 class ScriptStorage *GetStorage(); 00078 00082 void *GetLogPointer(); 00083 00087 static void DoCommandReturn(ScriptInstance *instance); 00088 00092 static void DoCommandReturnVehicleID(ScriptInstance *instance); 00093 00097 static void DoCommandReturnSignID(ScriptInstance *instance); 00098 00102 static void DoCommandReturnGroupID(ScriptInstance *instance); 00103 00107 static void DoCommandReturnGoalID(ScriptInstance *instance); 00108 00112 class ScriptController *GetController() { return controller; } 00113 00117 inline bool IsDead() const { return this->is_dead; } 00118 00122 void Save(); 00123 00127 static void SaveEmpty(); 00128 00134 void Load(int version); 00135 00139 static void LoadEmpty(); 00140 00147 void Suspend(); 00148 00154 SQInteger GetOpsTillSuspend(); 00155 00163 void DoCommandCallback(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2); 00164 00169 void InsertEvent(class ScriptEvent *event); 00170 00175 bool IsSleeping() { return this->suspend != 0; } 00176 00177 protected: 00178 class Squirrel *engine; 00179 00183 virtual void RegisterAPI(); 00184 00188 virtual void Died(); 00189 00193 virtual CommandCallback *GetDoCommandCallback() = 0; 00194 00198 virtual void LoadDummyScript() = 0; 00199 00200 private: 00201 class ScriptController *controller; 00202 class ScriptStorage *storage; 00203 SQObject *instance; 00204 00205 bool is_started; 00206 bool is_dead; 00207 bool is_save_data_on_stack; 00208 int suspend; 00209 Script_SuspendCallbackProc *callback; 00210 00215 bool CallLoad(); 00216 00227 static bool SaveObject(HSQUIRRELVM vm, SQInteger index, int max_depth, bool test); 00228 00233 static bool LoadObjects(HSQUIRRELVM vm); 00234 }; 00235 00236 #endif /* SCRIPT_INSTANCE_HPP */