ScummVM API documentation
Script.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 /*
23  * Copyright (C) 2006-2010 - Frictional Games
24  *
25  * This file is part of HPL1 Engine.
26  */
27 
28 #ifndef HPL_SCRIPT_H
29 #define HPL_SCRIPT_H
30 
31 #include "hpl1/engine/resources/ResourceBase.h"
32 
33 // Script Macros to build Generic wrappers if necessary
34 #define SCRIPT_DEFINE_FUNC(return, funcname) \
35  SCRIPT_FUNC_BEGIN(funcname, return, "") \
36  SCRIPT_RETURN_CALL_##return funcname(); \
37  SCRIPT_FUNC_END(funcname, return )
38 #define SCRIPT_DEFINE_FUNC_1(return, funcname, arg0) \
39  SCRIPT_FUNC_BEGIN(funcname, return, #arg0) \
40  SCRIPT_ARG_##arg0(0); \
41  SCRIPT_RETURN_CALL_##return funcname(_arg0); \
42  SCRIPT_FUNC_END(funcname, return )
43 #define SCRIPT_DEFINE_FUNC_2(return, funcname, arg0, arg1) \
44  SCRIPT_FUNC_BEGIN(funcname, return, #arg0 "," #arg1) \
45  SCRIPT_ARG_##arg0(0); \
46  SCRIPT_ARG_##arg1(1); \
47  SCRIPT_RETURN_CALL_##return funcname(_arg0, _arg1); \
48  SCRIPT_FUNC_END(funcname, return )
49 #define SCRIPT_DEFINE_FUNC_3(return, funcname, arg0, arg1, arg2) \
50  SCRIPT_FUNC_BEGIN(funcname, return, #arg0 "," #arg1 "," #arg2) \
51  SCRIPT_ARG_##arg0(0); \
52  SCRIPT_ARG_##arg1(1); \
53  SCRIPT_ARG_##arg2(2); \
54  SCRIPT_RETURN_CALL_##return funcname(_arg0, _arg1, _arg2); \
55  SCRIPT_FUNC_END(funcname, return )
56 #define SCRIPT_DEFINE_FUNC_4(return, funcname, arg0, arg1, arg2, arg3) \
57  SCRIPT_FUNC_BEGIN(funcname, return, #arg0 "," #arg1 "," #arg2 "," #arg3) \
58  SCRIPT_ARG_##arg0(0); \
59  SCRIPT_ARG_##arg1(1); \
60  SCRIPT_ARG_##arg2(2); \
61  SCRIPT_ARG_##arg3(3); \
62  SCRIPT_RETURN_CALL_##return funcname(_arg0, _arg1, _arg2, _arg3); \
63  SCRIPT_FUNC_END(funcname, return )
64 #define SCRIPT_DEFINE_FUNC_5(return, funcname, arg0, arg1, arg2, arg3, arg4) \
65  SCRIPT_FUNC_BEGIN(funcname, return, #arg0 "," #arg1 "," #arg2 "," #arg3 "," #arg4) \
66  SCRIPT_ARG_##arg0(0); \
67  SCRIPT_ARG_##arg1(1); \
68  SCRIPT_ARG_##arg2(2); \
69  SCRIPT_ARG_##arg3(3); \
70  SCRIPT_ARG_##arg4(4); \
71  SCRIPT_RETURN_CALL_##return funcname(_arg0, _arg1, _arg2, _arg3, _arg4); \
72  SCRIPT_FUNC_END(funcname, return )
73 #define SCRIPT_DEFINE_FUNC_6(return, funcname, arg0, arg1, arg2, arg3, arg4, arg5) \
74  SCRIPT_FUNC_BEGIN(funcname, return, #arg0 "," #arg1 "," #arg2 "," #arg3 "," #arg4 "," #arg5) \
75  SCRIPT_ARG_##arg0(0); \
76  SCRIPT_ARG_##arg1(1); \
77  SCRIPT_ARG_##arg2(2); \
78  SCRIPT_ARG_##arg3(3); \
79  SCRIPT_ARG_##arg4(4); \
80  SCRIPT_ARG_##arg5(5); \
81  SCRIPT_RETURN_CALL_##return funcname(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5); \
82  SCRIPT_FUNC_END(funcname, return )
83 #define SCRIPT_DEFINE_FUNC_7(return, funcname, arg0, arg1, arg2, arg3, arg4, arg5, arg6) \
84  SCRIPT_FUNC_BEGIN(funcname, return, #arg0 "," #arg1 "," #arg2 "," #arg3 "," #arg4 "," #arg5 "," #arg6) \
85  SCRIPT_ARG_##arg0(0); \
86  SCRIPT_ARG_##arg1(1); \
87  SCRIPT_ARG_##arg2(2); \
88  SCRIPT_ARG_##arg3(3); \
89  SCRIPT_ARG_##arg4(4); \
90  SCRIPT_ARG_##arg5(5); \
91  SCRIPT_ARG_##arg6(6); \
92  SCRIPT_RETURN_CALL_##return funcname(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6); \
93  SCRIPT_FUNC_END(funcname, return )
94 #define SCRIPT_DEFINE_FUNC_8(return, funcname, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
95  SCRIPT_FUNC_BEGIN(funcname, return, #arg0 "," #arg1 "," #arg2 "," #arg3 "," #arg4 "," #arg5 "," #arg6 "," #arg7) \
96  SCRIPT_ARG_##arg0(0); \
97  SCRIPT_ARG_##arg1(1); \
98  SCRIPT_ARG_##arg2(2); \
99  SCRIPT_ARG_##arg3(3); \
100  SCRIPT_ARG_##arg4(4); \
101  SCRIPT_ARG_##arg5(5); \
102  SCRIPT_ARG_##arg6(6); \
103  SCRIPT_ARG_##arg7(7); \
104  SCRIPT_RETURN_CALL_##return funcname(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7); \
105  SCRIPT_FUNC_END(funcname, return )
106 #define SCRIPT_DEFINE_FUNC_9(return, funcname, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
107  SCRIPT_FUNC_BEGIN(funcname, return, #arg0 "," #arg1 "," #arg2 "," #arg3 "," #arg4 "," #arg5 "," #arg6 "," #arg7 "," #arg8) \
108  SCRIPT_ARG_##arg0(0); \
109  SCRIPT_ARG_##arg1(1); \
110  SCRIPT_ARG_##arg2(2); \
111  SCRIPT_ARG_##arg3(3); \
112  SCRIPT_ARG_##arg4(4); \
113  SCRIPT_ARG_##arg5(5); \
114  SCRIPT_ARG_##arg6(6); \
115  SCRIPT_ARG_##arg7(7); \
116  SCRIPT_ARG_##arg8(8); \
117  SCRIPT_RETURN_CALL_##return funcname(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7, _arg8); \
118  SCRIPT_FUNC_END(funcname, return )
119 
120 #define SCRIPT_DEFINE_FUNC_10(return, funcname, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \
121  SCRIPT_FUNC_BEGIN(funcname, return, #arg0 "," #arg1 "," #arg2 "," #arg3 "," #arg4 "," #arg5 "," #arg6 "," #arg7 "," #arg8 "," #arg9) \
122  SCRIPT_ARG_##arg0(0); \
123  SCRIPT_ARG_##arg1(1); \
124  SCRIPT_ARG_##arg2(2); \
125  SCRIPT_ARG_##arg3(3); \
126  SCRIPT_ARG_##arg4(4); \
127  SCRIPT_ARG_##arg5(5); \
128  SCRIPT_ARG_##arg6(6); \
129  SCRIPT_ARG_##arg7(7); \
130  SCRIPT_ARG_##arg8(8); \
131  SCRIPT_ARG_##arg9(9); \
132  SCRIPT_RETURN_CALL_##return funcname(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7, _arg8, _arg9); \
133  SCRIPT_FUNC_END(funcname, return )
134 
135 #define SCRIPT_DEFINE_FUNC_12(return, funcname, arg0, arg1, arg2, arg3, arg4, arg5, arg6, \
136  arg7, arg8, arg9, arg10, arg11) \
137  SCRIPT_FUNC_BEGIN(funcname, return, #arg0 "," #arg1 "," #arg2 "," #arg3 "," #arg4 "," #arg5 "," #arg6 "," #arg7 "," #arg8 "," #arg9 "," #arg10 "," #arg11) \
138  SCRIPT_ARG_##arg0(0); \
139  SCRIPT_ARG_##arg1(1); \
140  SCRIPT_ARG_##arg2(2); \
141  SCRIPT_ARG_##arg3(3); \
142  SCRIPT_ARG_##arg4(4); \
143  SCRIPT_ARG_##arg5(5); \
144  SCRIPT_ARG_##arg6(6); \
145  SCRIPT_ARG_##arg7(7); \
146  SCRIPT_ARG_##arg8(8); \
147  SCRIPT_ARG_##arg9(9); \
148  SCRIPT_ARG_##arg10(10); \
149  SCRIPT_ARG_##arg11(11); \
150  SCRIPT_RETURN_CALL_##return funcname(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, \
151  _arg7, _arg8, _arg9, _arg10, _arg11); \
152  SCRIPT_FUNC_END(funcname, return )
153 #define SCRIPT_DEFINE_FUNC_17(return, funcname, arg0, arg1, arg2, arg3, arg4, arg5, arg6, \
154  arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16) \
155  SCRIPT_FUNC_BEGIN(funcname, return, #arg0 "," #arg1 "," #arg2 "," #arg3 "," #arg4 "," #arg5 "," #arg6 "," #arg7 "," #arg8 "," #arg9 "," #arg10 "," #arg11 "," #arg12 "," #arg13 "," #arg14 "," #arg15 "," #arg16) \
156  SCRIPT_ARG_##arg0(0); \
157  SCRIPT_ARG_##arg1(1); \
158  SCRIPT_ARG_##arg2(2); \
159  SCRIPT_ARG_##arg3(3); \
160  SCRIPT_ARG_##arg4(4); \
161  SCRIPT_ARG_##arg5(5); \
162  SCRIPT_ARG_##arg6(6); \
163  SCRIPT_ARG_##arg7(7); \
164  SCRIPT_ARG_##arg8(8); \
165  SCRIPT_ARG_##arg9(9); \
166  SCRIPT_ARG_##arg10(10); \
167  SCRIPT_ARG_##arg11(11); \
168  SCRIPT_ARG_##arg12(12); \
169  SCRIPT_ARG_##arg13(13); \
170  SCRIPT_ARG_##arg14(14); \
171  SCRIPT_ARG_##arg15(15); \
172  SCRIPT_ARG_##arg16(16); \
173  SCRIPT_RETURN_CALL_##return funcname(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, \
174  _arg7, _arg8, _arg9, _arg10, _arg11, _arg12, _arg13, _arg14, _arg15, _arg16); \
175  SCRIPT_FUNC_END(funcname, return )
176 
177 #define SCRIPT_FUNC_BEGIN(funcname, return, args) \
178  namespace GenericScript { \
179  static const char *funcname##_return = #return; \
180  static const char *funcname##_arg = args; \
181  void funcname##_Generic(asIScriptGeneric * gen) { \
182  SCRIPT_RETURN_##return;
183 
184 #define SCRIPT_FUNC_END(funcname, return ) \
185  SCRIPT_SET_RETURN_##return; \
186  } \
187  }
188 
189 // Parameter Macros
190 // FIXME: string types
191 #define SCRIPT_ARG_string(n) tString _arg##n = (*(Common::String *)gen->GetArgObject(n))
192 #define SCRIPT_ARG_float(n) float _arg##n = gen->GetArgFloat(n)
193 #define SCRIPT_ARG_int(n) int _arg##n = gen->GetArgDWord(n)
194 #define SCRIPT_ARG_bool(n) bool _arg##n = gen->GetArgByte(n)
195 // Return Value Macros
196 #define SCRIPT_RETURN_string tString _ret
197 #define SCRIPT_RETURN_CALL_string _ret =
198 #define SCRIPT_SET_RETURN_string gen->SetReturnObject(&_ret)
199 #define SCRIPT_RETURN_bool bool _ret
200 #define SCRIPT_RETURN_CALL_bool _ret =
201 #define SCRIPT_SET_RETURN_bool gen->SetReturnByte(_ret ? -1 : 0)
202 #define SCRIPT_RETURN_int int _ret
203 #define SCRIPT_RETURN_CALL_int _ret =
204 #define SCRIPT_SET_RETURN_int gen->SetReturnDWord(_ret)
205 #define SCRIPT_RETURN_float float _ret
206 #define SCRIPT_RETURN_CALL_float _ret =
207 #define SCRIPT_SET_RETURN_float gen->SetReturnFloat(_ret)
208 #define SCRIPT_RETURN_void
209 #define SCRIPT_RETURN_CALL_void
210 #define SCRIPT_SET_RETURN_void
211 
212 #define AS_MAX_PORTABILITY
213 #if defined(AS_MAX_PORTABILITY)
214 #define SCRIPT_REGISTER_FUNC(funcname) \
215  Common::String(GenericScript::funcname##_return) + " " + Common::String(#funcname) + " (" + Common::String(GenericScript::funcname##_arg) + ")", GenericScript::funcname##_Generic, asCALL_GENERIC
216 #else
217 #define SCRIPT_REGISTER_FUNC(funcname) \
218  GenericScript::funcname##_return + " " #funcname " (" + GenericScript::funcname##_arg + ")", (void *)funcname, asCALL_STDCALL
219 #endif
220 
221 namespace hpl {
222 
223 class iScript : public iResourceBase {
224 public:
225  iScript(const tString &asName) : iResourceBase(asName, 0) {}
226  virtual ~iScript() {}
227 
228  bool reload() { return false; }
229  void unload() {}
230  void destroy() {}
231 
232  virtual bool CreateFromFile(const tString &asFile) = 0;
233 
234  virtual int GetFuncHandle(const tString &asFunc) = 0;
235 
236  virtual void AddArg(const tString &asArg) = 0;
237 
243  virtual bool Run(const tString &asFuncLine) = 0;
244 
245  virtual bool Run(int alHandle) = 0;
246 };
247 
248 } // namespace hpl
249 
250 #endif // HPL_SCRIPT_H
Definition: AI.h:36
Definition: Script.h:223
Definition: str.h:59
Definition: ResourceBase.h:36
void unload()
Definition: Script.h:229
void destroy()
Definition: Script.h:230
bool reload()
Definition: Script.h:228
virtual bool Run(const tString &asFuncLine)=0