00001 /* $Id$ */ 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 AI_INSTANCE_HPP 00013 #define AI_INSTANCE_HPP 00014 00015 #include <squirrel.h> 00016 00020 typedef void (AISuspendCallbackProc)(class AIInstance *instance); 00021 00025 class AI_VMSuspend { 00026 public: 00032 AI_VMSuspend(int time, AISuspendCallbackProc *callback) : 00033 time(time), 00034 callback(callback) 00035 {} 00036 00041 int GetSuspendTime() { return time; } 00042 00047 AISuspendCallbackProc *GetSuspendCallback() { return callback; } 00048 00049 private: 00050 int time; 00051 AISuspendCallbackProc *callback; 00052 }; 00053 00057 class AI_FatalError { 00058 public: 00063 AI_FatalError(const char *msg) : 00064 msg(msg) 00065 {} 00066 00071 const char *GetErrorMessage() { return msg; } 00072 00073 private: 00074 const char *msg; 00075 }; 00076 00078 class AIInstance { 00079 public: 00080 friend class AIObject; 00081 00086 AIInstance(class AIInfo *info); 00087 ~AIInstance(); 00088 00093 void Continue(); 00094 00098 void GameLoop(); 00099 00103 void CollectGarbage() const; 00104 00108 static class AIStorage *GetStorage(); 00109 00113 static void DoCommandReturn(AIInstance *instance); 00114 00118 static void DoCommandReturnVehicleID(AIInstance *instance); 00119 00123 static void DoCommandReturnSignID(AIInstance *instance); 00124 00128 static void DoCommandReturnGroupID(AIInstance *instance); 00129 00133 class AIController *GetController() { return controller; } 00134 00138 inline bool IsDead() const { return this->is_dead; } 00139 00143 void Save(); 00144 00148 static void SaveEmpty(); 00149 00155 void Load(int version); 00156 00161 bool CallLoad(); 00162 00166 static void LoadEmpty(); 00167 00174 void Suspend(); 00175 private: 00176 class AIController *controller; 00177 class AIStorage *storage; 00178 class Squirrel *engine; 00179 SQObject *instance; 00180 00181 bool is_started; 00182 bool is_dead; 00183 bool is_save_data_on_stack; 00184 int suspend; 00185 AISuspendCallbackProc *callback; 00186 00190 void RegisterAPI(); 00191 00195 bool LoadCompatibilityScripts(const char *api_version); 00196 00200 void Died(); 00201 00212 static bool SaveObject(HSQUIRRELVM vm, SQInteger index, int max_depth, bool test); 00213 00218 static bool LoadObjects(HSQUIRRELVM vm); 00219 }; 00220 00221 #endif /* AI_INSTANCE_HPP */