25 #include "common/util.h" 26 #include "common/str.h" 27 #include "common/util.h" 29 #include "twp/audio.h" 31 #include "twp/squirrel/squirrel.h" 48 template<
typename T,
typename... Args>
58 SQInteger top = sq_gettop(v);
60 sq_pushstring(v, key.c_str(), -1);
69 sq_pushstring(v, name.c_str(), -1);
70 if (SQ_FAILED(sq_get(v, -2))) {
72 return sq_throwerror(v,
"Failed to get field");
75 if (SQ_FAILED(sqget(v, -1, value)))
76 return sq_throwerror(v,
"Failed to get field");
85 return sqgetf(v, o, name, value);
91 return sqgetf(v, sqrootTbl(v), name, value);
100 template<
typename TFunc>
101 void sqgetitems(
HSQOBJECT o, TFunc func) {
105 while (SQ_SUCCEEDED(sq_next(v, -2))) {
107 if (SQ_FAILED(sqget(v, -1, obj)))
108 error(
"Failed to get item");
117 template<
typename TFunc>
118 SQRESULT sqgetpairs(
HSQOBJECT obj, TFunc func) {
120 sq_pushobject(v, obj);
122 while (SQ_SUCCEEDED(sq_next(v, -2))) {
125 if (SQ_FAILED(sqget(v, -1, o)))
126 return sq_throwerror(v,
"failed to get object");
127 if (SQ_FAILED(sqget(v, -2, key)))
128 return sq_throwerror(v,
"failed to get key");
139 SQInteger top = sq_gettop(v);
141 sq_pushstring(v, key.c_str(), -1);
143 sq_newslot(v, -3, SQFalse);
154 template<
typename... T>
155 void sqcall(
const char *name, T... args);
157 template<
typename... T>
158 void sqcall(
HSQOBJECT o,
const char *name, T... args);
160 template<
typename TResult,
typename... T>
161 static void sqcallfunc(TResult &result,
HSQOBJECT o,
const char *name, T... args);
163 template<
typename TResult,
typename... T>
164 static void sqcallfunc(TResult &result,
const char *name, T... args);
166 void sqexec(
HSQUIRRELVM v,
const char *code,
const char *filename =
nullptr);
185 Light *sqlight(
int id);
188 template<
typename... T>
190 constexpr
size_t n =
sizeof...(T);
191 SQInteger top = sq_gettop(v);
192 sqpushfunc(v, o, name);
196 sqpush(v, Common::forward<T>(args)...);
198 sq_call(v, 1 + n, SQFalse, SQTrue);
202 template<
typename... T>
203 void sqcall(
HSQOBJECT o,
const char *name, T... args) {
204 constexpr
size_t n =
sizeof...(T);
206 SQInteger top = sq_gettop(v);
207 sqpushfunc(v, o, name);
211 sqpush(v, Common::forward<T>(args)...);
213 sq_call(v, 1 + n, SQFalse, SQTrue);
217 template<
typename... T>
218 void sqcall(
const char *name, T... args) {
219 constexpr
size_t n =
sizeof...(T);
222 SQInteger top = sq_gettop(v);
223 sqpushfunc(v, o, name);
227 sqpush(v, Common::forward<T>(args)...);
229 sq_call(v, 1 + n, SQFalse, SQTrue);
233 template<
typename TResult,
typename... T>
234 void sqcallfunc(TResult &result,
HSQOBJECT o,
const char *name, T... args) {
235 constexpr
size_t n =
sizeof...(T);
237 SQInteger top = sq_gettop(v);
239 sq_pushstring(v, _SC(name), -1);
240 if (SQ_FAILED(sq_get(v, -2))) {
242 error(
"can't find %s function", name);
248 sqpush(v, Common::forward<T>(args)...);
249 if (SQ_FAILED(sq_call(v, n + 1, SQTrue, SQTrue))) {
252 error(
"function %s call failed", name);
255 if (SQ_FAILED(sqget(v, -1, result)))
256 error(
"function %s call failed to get result", name);
260 template<
typename TResult,
typename... T>
261 void sqcallfunc(TResult &result,
const char *name, T... args) {
262 constexpr
size_t n =
sizeof...(T);
265 SQInteger top = sq_gettop(v);
267 sq_pushstring(v, _SC(name), -1);
268 if (SQ_FAILED(sq_get(v, -2))) {
270 error(
"can't find %s function", name);
276 sqpush(v, Common::forward<T>(args)...);
277 if (SQ_FAILED(sq_call(v, n + 1, SQTrue, SQTrue))) {
280 error(
"function %s call failed", name);
283 if (SQ_FAILED(sqget(v, -1, result))) {
285 error(
"function %s failed to get result", name);
Definition: squirrel.h:153
Out move(In first, In last, Out dst)
Definition: algorithm.h:109
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
Definition: achievements_tables.h:27