29#ifndef AGS_ENGINE_SCRIPT_SCRIPT_API_H
30#define AGS_ENGINE_SCRIPT_SCRIPT_API_H
32#include "ags/shared/core/types.h"
33#include "ags/engine/ac/runtime_defines.h"
34#include "ags/shared/debugging/out.h"
38struct RuntimeScriptValue;
41typedef RuntimeScriptValue ScriptAPIFunction(
const RuntimeScriptValue *params, int32_t param_count);
42typedef RuntimeScriptValue ScriptAPIObjectFunction(
void *self,
const RuntimeScriptValue *params, int32_t param_count);
47const char *ScriptSprintf(
char *buffer,
size_t buf_length,
const char *format,
48 const RuntimeScriptValue *sc_args, int32_t sc_argc, va_list *varg_ptr);
50inline const char *ScriptSprintf(
char *buffer,
size_t buf_length,
const char *format,
const RuntimeScriptValue *args, int32_t argc) {
51 return ScriptSprintf(buffer, buf_length, format, args, argc,
nullptr);
55inline const char *ScriptVSprintf(
char *buffer,
size_t buf_length,
const char *format, va_list &arg_ptr) {
56 return ScriptSprintf(buffer, buf_length, format,
nullptr, 0, &arg_ptr);
62#define API_FN_PAIR(FN_NAME) Sc_##FN_NAME, (void *)FN_NAME
66#define ASSERT_SELF(METHOD) \
67 (void)params; (void)param_count; \
68 assert((self != NULL) && "Object pointer is null in call to API function")
69#define ASSERT_PARAM_COUNT(FUNCTION, X) \
70 (void)params; (void)param_count; \
71 assert((params != NULL && param_count >= X) && "Not enough parameters in call to API function")
72#define ASSERT_VARIABLE_VALUE(VARIABLE) \
73 (void)params; (void)param_count; \
74 assert((params != NULL && param_count >= 1) && "Not enough parameters to set API property")
75#define ASSERT_OBJ_PARAM_COUNT(METHOD, X) \
76 ASSERT_SELF(METHOD); \
77 ASSERT_PARAM_COUNT(METHOD, X)
82#define API_SCALL_SCRIPT_SPRINTF(FUNCTION, PARAM_COUNT) \
83 ASSERT_PARAM_COUNT(FUNCTION, PARAM_COUNT); \
84 char ScSfBuffer[STD_BUFFER_SIZE]; \
85 const char *scsf_buffer = ScriptSprintf(ScSfBuffer, STD_BUFFER_SIZE, get_translation(params[PARAM_COUNT - 1].CStr), params + PARAM_COUNT, param_count - PARAM_COUNT)
87#define API_OBJCALL_SCRIPT_SPRINTF(METHOD, PARAM_COUNT) \
88 ASSERT_OBJ_PARAM_COUNT(METHOD, PARAM_COUNT); \
89 char ScSfBuffer[STD_BUFFER_SIZE]; \
90 const char *scsf_buffer = ScriptSprintf(ScSfBuffer, STD_BUFFER_SIZE, get_translation(params[PARAM_COUNT - 1].CStr), params + PARAM_COUNT, param_count - PARAM_COUNT)
95#define API_SCALL_SCRIPT_SPRINTF_PURE(FUNCTION, PARAM_COUNT) \
96 ASSERT_PARAM_COUNT(FUNCTION, PARAM_COUNT); \
97 char ScSfBuffer[STD_BUFFER_SIZE]; \
98 const char *scsf_buffer = ScriptSprintf(ScSfBuffer, STD_BUFFER_SIZE, params[PARAM_COUNT - 1].CStr, params + PARAM_COUNT, param_count - PARAM_COUNT)
104#define API_PLUGIN_SCRIPT_SPRINTF(FORMAT_STR) \
106 va_start(args, FORMAT_STR); \
107 char ScSfBuffer[STD_BUFFER_SIZE]; \
108 const char *scsf_buffer = ScriptVSprintf(ScSfBuffer, STD_BUFFER_SIZE, get_translation(FORMAT_STR), args); \
111#define API_PLUGIN_SCRIPT_SPRINTF_PURE(FORMAT_STR) \
113 va_start(args, FORMAT_STR); \
114 char ScSfBuffer[STD_BUFFER_SIZE]; \
115 const char *scsf_buffer = ScriptVSprintf(ScSfBuffer, STD_BUFFER_SIZE, FORMAT_STR, args); \
128#define API_SCALL_VOID(FUNCTION) \
129 (void)params; (void)param_count; \
131 return RuntimeScriptValue((int32_t)0)
133#define API_SCALL_VOID_PBOOL(FUNCTION) \
134 ASSERT_PARAM_COUNT(FUNCTION, 1); \
135 FUNCTION(params[0].GetAsBool()); \
136 return RuntimeScriptValue((int32_t)0)
138#define API_SCALL_VOID_PINT(FUNCTION) \
139 ASSERT_PARAM_COUNT(FUNCTION, 1); \
140 FUNCTION(params[0].IValue); \
141 return RuntimeScriptValue((int32_t)0)
143#define API_SCALL_VOID_PINT2(FUNCTION) \
144 ASSERT_PARAM_COUNT(FUNCTION, 2); \
145 FUNCTION(params[0].IValue, params[1].IValue); \
146 return RuntimeScriptValue((int32_t)0)
148#define API_SCALL_VOID_PINT3(FUNCTION) \
149 ASSERT_PARAM_COUNT(FUNCTION, 3); \
150 FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue); \
151 return RuntimeScriptValue((int32_t)0)
153#define API_SCALL_VOID_PINT4(FUNCTION) \
154 ASSERT_PARAM_COUNT(FUNCTION, 4); \
155 FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue); \
156 return RuntimeScriptValue((int32_t)0)
158#define API_SCALL_VOID_PINT5(FUNCTION) \
159 ASSERT_PARAM_COUNT(FUNCTION, 5); \
160 FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue, params[4].IValue); \
161 return RuntimeScriptValue((int32_t)0)
163#define API_SCALL_VOID_PINT6(FUNCTION) \
164 ASSERT_PARAM_COUNT(FUNCTION, 6); \
165 FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue, params[4].IValue, params[5].IValue); \
166 return RuntimeScriptValue((int32_t)0)
168#define API_SCALL_VOID_PINT_POBJ(FUNCTION, P1CLASS) \
169 ASSERT_PARAM_COUNT(FUNCTION, 2); \
170 FUNCTION(params[0].IValue, (P1CLASS*)params[1].Ptr); \
171 return RuntimeScriptValue((int32_t)0)
173#define API_SCALL_VOID_PINT_POBJ2(FUNCTION, P1CLASS, P2CLASS) \
174 ASSERT_PARAM_COUNT(FUNCTION, 3); \
175 FUNCTION(params[0].IValue, (P1CLASS*)params[1].Ptr, (P2CLASS*)params[2].Ptr); \
176 return RuntimeScriptValue((int32_t)0)
178#define API_SCALL_VOID_PINT2_POBJ(FUNCTION, P1CLASS) \
179 ASSERT_PARAM_COUNT(FUNCTION, 3); \
180 FUNCTION(params[0].IValue, params[1].IValue, (P1CLASS*)params[2].Ptr); \
181 return RuntimeScriptValue((int32_t)0)
183#define API_SCALL_VOID_PINT3_POBJ_PINT(FUNCTION, P1CLASS) \
184 ASSERT_PARAM_COUNT(FUNCTION, 5); \
185 FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, (P1CLASS*)params[3].Ptr, params[4].IValue); \
186 return RuntimeScriptValue((int32_t)0)
188#define API_SCALL_VOID_PINT4_POBJ(FUNCTION, P1CLASS) \
189 ASSERT_PARAM_COUNT(FUNCTION, 5); \
190 FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue, (P1CLASS*)params[4].Ptr); \
191 return RuntimeScriptValue((int32_t)0)
193#define API_SCALL_VOID_PFLOAT2(FUNCTION) \
194 ASSERT_PARAM_COUNT(FUNCTION, 2); \
195 FUNCTION(params[0].FValue, params[1].FValue); \
196 return RuntimeScriptValue((int32_t)0)
198#define API_SCALL_VOID_POBJ(FUNCTION, P1CLASS) \
199 ASSERT_PARAM_COUNT(FUNCTION, 1); \
200 FUNCTION((P1CLASS*)params[0].Ptr); \
201 return RuntimeScriptValue((int32_t)0)
203#define API_SCALL_VOID_POBJ_PINT(FUNCTION, P1CLASS) \
204 ASSERT_PARAM_COUNT(FUNCTION, 2); \
205 FUNCTION((P1CLASS*)params[0].Ptr, params[1].IValue); \
206 return RuntimeScriptValue((int32_t)0)
208#define API_SCALL_VOID_POBJ_PINT2(FUNCTION, P1CLASS) \
209 ASSERT_PARAM_COUNT(FUNCTION, 3); \
210 FUNCTION((P1CLASS*)params[0].Ptr, params[1].IValue, params[2].IValue); \
211 return RuntimeScriptValue((int32_t)0)
213#define API_SCALL_VOID_POBJ2(FUNCTION, P1CLASS, P2CLASS) \
214 ASSERT_PARAM_COUNT(FUNCTION, 2); \
215 FUNCTION((P1CLASS*)params[0].Ptr, (P2CLASS*)params[1].Ptr); \
216 return RuntimeScriptValue((int32_t)0)
218#define API_SCALL_INT(FUNCTION) \
219 (void)params; (void)param_count; \
220 return RuntimeScriptValue().SetInt32(FUNCTION())
222#define API_SCALL_INT_PINT(FUNCTION) \
223 ASSERT_PARAM_COUNT(FUNCTION, 1); \
224 return RuntimeScriptValue().SetInt32(FUNCTION(params[0].IValue))
226#define API_SCALL_INT_PINT2(FUNCTION) \
227 ASSERT_PARAM_COUNT(FUNCTION, 2); \
228 return RuntimeScriptValue().SetInt32(FUNCTION(params[0].IValue, params[1].IValue))
230#define API_SCALL_INT_PINT3(FUNCTION) \
231 ASSERT_PARAM_COUNT(FUNCTION, 3); \
232 return RuntimeScriptValue().SetInt32(FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue))
234#define API_SCALL_INT_PINT4(FUNCTION) \
235 ASSERT_PARAM_COUNT(FUNCTION, 4); \
236 return RuntimeScriptValue().SetInt32(FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue))
238#define API_SCALL_INT_PINT4_PFLOAT(FUNCTION) \
239 ASSERT_PARAM_COUNT(FUNCTION, 5) \
240 return RuntimeScriptValue().SetInt32(FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue, params[3].FValue))
242#define API_SCALL_INT_PINT5(FUNCTION) \
243 ASSERT_PARAM_COUNT(FUNCTION, 5); \
244 return RuntimeScriptValue().SetInt32(FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue, params[4].IValue))
246#define API_SCALL_INT_PFLOAT_PINT(FUNCTION) \
247 ASSERT_PARAM_COUNT(FUNCTION, 2); \
248 return RuntimeScriptValue().SetInt32(FUNCTION(params[0].FValue, params[1].IValue))
250#define API_SCALL_INT_POBJ(FUNCTION, P1CLASS) \
251 ASSERT_PARAM_COUNT(FUNCTION, 1); \
252 return RuntimeScriptValue().SetInt32(FUNCTION((P1CLASS*)params[0].Ptr))
254#define API_SCALL_INT_POBJ_PINT(FUNCTION, P1CLASS) \
255 ASSERT_PARAM_COUNT(FUNCTION, 2); \
256 return RuntimeScriptValue().SetInt32(FUNCTION((P1CLASS*)params[0].Ptr, params[1].IValue))
258#define API_SCALL_INT_POBJ_PINT2(FUNCTION, P1CLASS) \
259 ASSERT_PARAM_COUNT(FUNCTION, 3); \
260 return RuntimeScriptValue().SetInt32(FUNCTION((P1CLASS*)params[0].Ptr, params[1].IValue, params[2].IValue))
262#define API_SCALL_INT_POBJ2(FUNCTION, P1CLASS, P2CLASS) \
263 ASSERT_PARAM_COUNT(FUNCTION, 2); \
264 return RuntimeScriptValue().SetInt32(FUNCTION((P1CLASS*)params[0].Ptr, (P2CLASS*)params[1].Ptr))
266#define API_SCALL_INT_PINT_POBJ(FUNCTION, P1CLASS) \
267 ASSERT_PARAM_COUNT(FUNCTION, 2); \
268 return RuntimeScriptValue().SetInt32(FUNCTION(params[0].IValue, (P1CLASS*)params[1].Ptr))
270#define API_SCALL_FLOAT(FUNCTION) \
271 (void)params; (void)param_count; \
272 return RuntimeScriptValue().SetFloat(FUNCTION())
274#define API_SCALL_FLOAT_PINT(FUNCTION) \
275 ASSERT_PARAM_COUNT(FUNCTION, 1); \
276 return RuntimeScriptValue().SetFloat(FUNCTION(params[0].IValue))
278#define API_SCALL_FLOAT_PFLOAT(FUNCTION) \
279 ASSERT_PARAM_COUNT(FUNCTION, 1); \
280 return RuntimeScriptValue().SetFloat(FUNCTION(params[0].FValue))
282#define API_SCALL_FLOAT_PFLOAT2(FUNCTION) \
283 ASSERT_PARAM_COUNT(FUNCTION, 2); \
284 return RuntimeScriptValue().SetFloat(FUNCTION(params[0].FValue, params[1].FValue))
286#define API_SCALL_BOOL(FUNCTION) \
287 (void)params; (void)param_count; \
288 return RuntimeScriptValue().SetInt32AsBool(FUNCTION())
290#define API_SCALL_BOOL_POBJ(FUNCTION, P1CLASS) \
291 ASSERT_PARAM_COUNT(FUNCTION, 1); \
292 return RuntimeScriptValue().SetInt32AsBool(FUNCTION((P1CLASS*)params[0].Ptr))
294#define API_SCALL_BOOL_PINT(FUNCTION) \
295 ASSERT_PARAM_COUNT(FUNCTION, 1); \
296 return RuntimeScriptValue().SetInt32AsBool(FUNCTION(params[0].IValue))
298#define API_SCALL_BOOL_POBJ_PINT(FUNCTION, P1CLASS) \
299 ASSERT_PARAM_COUNT(FUNCTION, 2); \
300 return RuntimeScriptValue().SetInt32AsBool(FUNCTION((P1CLASS*)params[0].Ptr, params[1].IValue))
302#define API_SCALL_BOOL_POBJ2(FUNCTION, P1CLASS, P2CLASS) \
303 ASSERT_PARAM_COUNT(FUNCTION, 2); \
304 return RuntimeScriptValue().SetInt32AsBool(FUNCTION((P1CLASS*)params[0].Ptr, (P2CLASS*)params[1].Ptr))
306#define API_SCALL_OBJ(RET_CLASS, RET_MGR, FUNCTION) \
307 (void)params; (void)param_count; \
308 return RuntimeScriptValue().SetScriptObject(const_cast<void *>((const void *)(RET_CLASS*)FUNCTION()), &RET_MGR)
313#define API_SCALL_OBJ_PINT(RET_CLASS, RET_MGR, FUNCTION) \
314 ASSERT_PARAM_COUNT(FUNCTION, 1); \
315 return RuntimeScriptValue().SetScriptObject(const_cast<void *>((const void *)(RET_CLASS*)FUNCTION(params[0].IValue)), &RET_MGR)
321#define API_SCALL_OBJ_POBJ_PINT_PBOOL(RET_CLASS, RET_MGR, FUNCTION, P1CLASS) \
322 ASSERT_PARAM_COUNT(FUNCTION, 3); \
323 return RuntimeScriptValue().SetScriptObject((void*)(RET_CLASS*)FUNCTION((P1CLASS*)params[0].Ptr, params[1].IValue, params[2].GetAsBool()), &RET_MGR)
325#define API_SCALL_OBJ_PINT2(RET_CLASS, RET_MGR, FUNCTION) \
326 ASSERT_PARAM_COUNT(FUNCTION, 2); \
327 return RuntimeScriptValue().SetScriptObject(const_cast<void *>((const void *)(RET_CLASS*)FUNCTION(params[0].IValue, params[1].IValue)), &RET_MGR)
333#define API_SCALL_OBJ_PINT3_POBJ(RET_CLASS, RET_MGR, FUNCTION, P1CLASS) \
334 ASSERT_PARAM_COUNT(FUNCTION, 4); \
335 return RuntimeScriptValue().SetScriptObject((void*)(RET_CLASS*)FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, (P1CLASS*)params[3].Ptr), &RET_MGR)
337#define API_SCALL_OBJ_POBJ(RET_CLASS, RET_MGR, FUNCTION, P1CLASS) \
338 ASSERT_PARAM_COUNT(FUNCTION, 1); \
339 return RuntimeScriptValue().SetScriptObject(const_cast<void *>((const void *)(RET_CLASS*)FUNCTION((P1CLASS*)params[0].Ptr)), &RET_MGR)
345#define API_SCALL_OBJAUTO(RET_CLASS, FUNCTION) \
346 (void)params; (void)param_count; \
347 RET_CLASS* ret_obj = FUNCTION(); \
348 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
350#define API_SCALL_OBJAUTO_PINT(RET_CLASS, FUNCTION) \
351 ASSERT_PARAM_COUNT(FUNCTION, 1); \
352 RET_CLASS* ret_obj = FUNCTION(params[0].IValue); \
353 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
355#define API_SCALL_OBJAUTO_PINT2(RET_CLASS, FUNCTION) \
356 ASSERT_PARAM_COUNT(FUNCTION, 2); \
357 RET_CLASS* ret_obj = FUNCTION(params[0].IValue, params[1].IValue); \
358 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
360#define API_SCALL_OBJAUTO_PINT3(RET_CLASS, FUNCTION) \
361 ASSERT_PARAM_COUNT(FUNCTION, 3); \
362 RET_CLASS* ret_obj = FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue); \
363 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
365#define API_SCALL_OBJAUTO_PINT4(RET_CLASS, FUNCTION) \
366 ASSERT_PARAM_COUNT(FUNCTION, 4); \
367 RET_CLASS* ret_obj = FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue); \
368 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
370#define API_SCALL_OBJAUTO_PINT5(RET_CLASS, FUNCTION) \
371 ASSERT_PARAM_COUNT(FUNCTION, 5); \
372 RET_CLASS* ret_obj = FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue, params[4].IValue); \
373 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
375#define API_SCALL_OBJAUTO_PINT2_PBOOL(RET_CLASS, FUNCTION) \
376 ASSERT_PARAM_COUNT(FUNCTION, 3); \
377 RET_CLASS *ret_obj = FUNCTION(params[0].IValue, params[1].IValue, params[2].GetAsBool()); \
378 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
380#define API_SCALL_OBJAUTO_PINT3_PBOOL(RET_CLASS, FUNCTION) \
381 ASSERT_PARAM_COUNT(FUNCTION, 4); \
382 RET_CLASS *ret_obj = FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, params[3].GetAsBool()); \
383 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
385#define API_SCALL_OBJAUTO_PINT3_PBOOL2(RET_CLASS, FUNCTION) \
386 ASSERT_PARAM_COUNT(FUNCTION, 5); \
387 RET_CLASS *ret_obj = FUNCTION(params[0].IValue, params[1].IValue, params[2].IValue, params[3].GetAsBool(), params[4].GetAsBool()); \
388 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
390#define API_SCALL_OBJAUTO_PBOOL2(RET_CLASS, FUNCTION) \
391 ASSERT_PARAM_COUNT(FUNCTION, 2); \
392 RET_CLASS* ret_obj = FUNCTION(params[0].GetAsBool(), params[1].GetAsBool()); \
393 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
395#define API_SCALL_OBJAUTO_POBJ(RET_CLASS, FUNCTION, P1CLASS) \
396 ASSERT_PARAM_COUNT(FUNCTION, 1); \
397 RET_CLASS* ret_obj = FUNCTION((P1CLASS*)params[0].Ptr); \
398 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
400#define API_SCALL_OBJAUTO_POBJ_PINT(RET_CLASS, FUNCTION, P1CLASS) \
401 ASSERT_PARAM_COUNT(FUNCTION, 2); \
402 RET_CLASS* ret_obj = (RET_CLASS*)FUNCTION((P1CLASS*)params[0].Ptr, params[1].IValue); \
403 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
405#define API_SCALL_OBJAUTO_POBJ_PINT4(RET_CLASS, FUNCTION, P1CLASS) \
406 ASSERT_PARAM_COUNT(FUNCTION, 5); \
407 RET_CLASS* ret_obj = FUNCTION((P1CLASS*)params[0].Ptr, params[1].IValue, params[2].IValue, params[3].IValue, params[4].IValue); \
408 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
411#define API_SCALL_STOBJ_POBJ2(RET_CLASS, FUNCTION, P1CLASS, P2CLASS) \
412 ASSERT_PARAM_COUNT(FUNCTION, 2); \
413 RET_CLASS* ret_obj = FUNCTION((P1CLASS*)params[0].Ptr, (P2CLASS*)params[1].Ptr); \
414 return RuntimeScriptValue().SetStaticObject(ret_obj, &_GP(GlobalStaticManager))
419#define API_OBJCALL_VOID(CLASS, METHOD) \
420 ASSERT_SELF(METHOD); \
421 METHOD((CLASS*)self); \
422 return RuntimeScriptValue((int32_t)0)
424#define API_OBJCALL_VOID_PINT(CLASS, METHOD) \
425 ASSERT_OBJ_PARAM_COUNT(METHOD, 1); \
426 METHOD((CLASS*)self, params[0].IValue); \
427 return RuntimeScriptValue((int32_t)0)
429#define API_OBJCALL_VOID_PINT2(CLASS, METHOD) \
430 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
431 METHOD((CLASS*)self, params[0].IValue, params[1].IValue); \
432 return RuntimeScriptValue((int32_t)0)
434#define API_OBJCALL_VOID_PINT3(CLASS, METHOD) \
435 ASSERT_OBJ_PARAM_COUNT(METHOD, 3); \
436 METHOD((CLASS*)self, params[0].IValue, params[1].IValue, params[2].IValue); \
437 return RuntimeScriptValue((int32_t)0)
439#define API_OBJCALL_VOID_PINT4(CLASS, METHOD) \
440 ASSERT_OBJ_PARAM_COUNT(METHOD, 4); \
441 METHOD((CLASS*)self, params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue); \
442 return RuntimeScriptValue((int32_t)0)
444#define API_OBJCALL_VOID_PINT5(CLASS, METHOD) \
445 ASSERT_OBJ_PARAM_COUNT(METHOD, 5); \
446 METHOD((CLASS*)self, params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue, params[4].IValue); \
447 return RuntimeScriptValue((int32_t)0)
449#define API_OBJCALL_VOID_PINT6(CLASS, METHOD) \
450 ASSERT_OBJ_PARAM_COUNT(METHOD, 6); \
451 METHOD((CLASS*)self, params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue, params[4].IValue, params[5].IValue); \
452 return RuntimeScriptValue((int32_t)0)
454#define API_OBJCALL_VOID_PINT7(CLASS, METHOD) \
455 ASSERT_OBJ_PARAM_COUNT(METHOD, 7); \
456 METHOD((CLASS*)self, params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue, params[4].IValue, params[5].IValue, params[6].IValue); \
457 return RuntimeScriptValue((int32_t)0)
459#define API_OBJCALL_VOID_PINT8(CLASS, METHOD) \
460 ASSERT_OBJ_PARAM_COUNT(METHOD, 8); \
461 METHOD((CLASS*)self, params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue, params[4].IValue, params[5].IValue, params[6].IValue, params[7].IValue); \
462 return RuntimeScriptValue((int32_t)0)
464#define API_OBJCALL_VOID_PFLOAT(CLASS, METHOD) \
465 ASSERT_OBJ_PARAM_COUNT(METHOD, 1); \
466 METHOD((CLASS*)self, params[0].FValue); \
467 return RuntimeScriptValue()
469#define API_OBJCALL_VOID_PFLOAT2(CLASS, METHOD) \
470 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
471 METHOD((CLASS*)self, params[0].FValue, params[1].FValue); \
472 return RuntimeScriptValue()
474#define API_OBJCALL_VOID_PBOOL(CLASS, METHOD) \
475 ASSERT_OBJ_PARAM_COUNT(METHOD, 1); \
476 METHOD((CLASS*)self, params[0].GetAsBool()); \
477 return RuntimeScriptValue((int32_t)0)
479#define API_OBJCALL_VOID_PINT_PBOOL(CLASS, METHOD) \
480 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
481 METHOD((CLASS*)self, params[0].IValue, params[1].GetAsBool()); \
482 return RuntimeScriptValue((int32_t)0)
484#define API_OBJCALL_VOID_PINT_POBJ(CLASS, METHOD, P1CLASS) \
485 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
486 METHOD((CLASS*)self, params[0].IValue, (P1CLASS*)params[1].Ptr); \
487 return RuntimeScriptValue((int32_t)0)
489#define API_OBJCALL_VOID_PINT3_POBJ(CLASS, METHOD, P1CLASS) \
490 ASSERT_OBJ_PARAM_COUNT(METHOD, 4); \
491 METHOD((CLASS*)self, params[0].IValue, params[1].IValue, params[2].IValue, (P1CLASS*)params[3].Ptr); \
492 return RuntimeScriptValue((int32_t)0)
494#define API_OBJCALL_VOID_PINT5_POBJ(CLASS, METHOD, P1CLASS) \
495 ASSERT_OBJ_PARAM_COUNT(METHOD, 6); \
496 METHOD((CLASS*)self, params[0].IValue, params[1].IValue, params[2].IValue, params[3].IValue, params[4].IValue, (P1CLASS*)params[5].Ptr); \
497 return RuntimeScriptValue((int32_t)0)
499#define API_OBJCALL_VOID_POBJ(CLASS, METHOD, P1CLASS) \
500 ASSERT_OBJ_PARAM_COUNT(METHOD, 1); \
501 METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr); \
502 return RuntimeScriptValue((int32_t)0)
504#define API_OBJCALL_VOID_POBJ_PINT(CLASS, METHOD, P1CLASS) \
505 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
506 METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr, params[1].IValue); \
507 return RuntimeScriptValue((int32_t)0)
509#define API_OBJCALL_VOID_POBJ_PINT2(CLASS, METHOD, P1CLASS) \
510 ASSERT_OBJ_PARAM_COUNT(METHOD, 3); \
511 METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr, params[1].IValue, params[2].IValue); \
512 return RuntimeScriptValue((int32_t)0)
514#define API_OBJCALL_VOID_POBJ2(CLASS, METHOD, P1CLASS, P2CLASS) \
515 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
516 METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr, (P2CLASS*)params[1].Ptr); \
517 return RuntimeScriptValue((int32_t)0)
519#define API_OBJCALL_INT(CLASS, METHOD) \
520 ASSERT_SELF(METHOD); \
521 return RuntimeScriptValue().SetInt32(METHOD((CLASS*)self))
523#define API_OBJCALL_INT_PINT(CLASS, METHOD) \
524 ASSERT_OBJ_PARAM_COUNT(METHOD, 1); \
525 return RuntimeScriptValue().SetInt32(METHOD((CLASS*)self, params[0].IValue))
527#define API_OBJCALL_INT_PINT_POBJ(CLASS, METHOD, P1CLASS) \
528 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
529 return RuntimeScriptValue().SetInt32(METHOD((CLASS*)self, params[0].IValue, params[1].CStr))
531#define API_OBJCALL_INT_PINT2(CLASS, METHOD) \
532 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
533 return RuntimeScriptValue().SetInt32(METHOD((CLASS*)self, params[0].IValue, params[1].IValue))
535#define API_OBJCALL_INT_POBJ(CLASS, METHOD, P1CLASS) \
536 ASSERT_OBJ_PARAM_COUNT(METHOD, 1); \
537 return RuntimeScriptValue().SetInt32(METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr))
539#define API_OBJCALL_INT_POBJ_PINT(CLASS, METHOD, P1CLASS) \
540 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
541 return RuntimeScriptValue().SetInt32(METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr, params[1].IValue))
543#define API_OBJCALL_INT_POBJ_PBOOL(CLASS, METHOD, P1CLASS) \
544 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
545 return RuntimeScriptValue().SetInt32(METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr, params[1].GetAsBool()))
547#define API_OBJCALL_FLOAT(CLASS, METHOD) \
548 ASSERT_SELF(METHOD); \
549 return RuntimeScriptValue().SetFloat(METHOD((CLASS*)self))
551#define API_OBJCALL_BOOL(CLASS, METHOD) \
552 ASSERT_SELF(METHOD); \
553 return RuntimeScriptValue().SetInt32AsBool(METHOD((CLASS*)self))
555#define API_OBJCALL_BOOL_PINT(CLASS, METHOD) \
556 ASSERT_OBJ_PARAM_COUNT(METHOD, 1); \
557 return RuntimeScriptValue().SetInt32AsBool(METHOD((CLASS*)self, params[0].IValue))
559#define API_OBJCALL_BOOL_POBJ(CLASS, METHOD, P1CLASS) \
560 ASSERT_OBJ_PARAM_COUNT(METHOD, 1); \
561 return RuntimeScriptValue().SetInt32AsBool(METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr))
563#define API_OBJCALL_BOOL_POBJ_PINT(CLASS, METHOD, P1CLASS) \
564 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
565 return RuntimeScriptValue().SetInt32AsBool(METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr, params[1].IValue))
567#define API_OBJCALL_BOOL_POBJ2(CLASS, METHOD, P1CLASS, P2CLASS) \
568 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
569 return RuntimeScriptValue().SetInt32AsBool(METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr, (P2CLASS*)params[1].Ptr))
571#define API_OBJCALL_BOOL(CLASS, METHOD) \
572 ASSERT_SELF(METHOD); \
573 return RuntimeScriptValue().SetInt32AsBool(METHOD((CLASS*)self))
575#define API_OBJCALL_OBJ_PINT_POBJ(CLASS, RET_CLASS, RET_MGR, METHOD, P1CLASS) \
576 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
577 return RuntimeScriptValue().SetScriptObject((void*)METHOD((CLASS*)self, params[0].IValue, (P1CLASS*)params[1].Ptr), &RET_MGR)
579#define API_OBJCALL_OBJ_POBJ2_PINT(CLASS, RET_CLASS, RET_MGR, METHOD, P1CLASS, P2CLASS) \
580 ASSERT_OBJ_PARAM_COUNT(METHOD, 3); \
581 return RuntimeScriptValue().SetScriptObject((void*)METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr, (P2CLASS*)params[1].Ptr, params[2].IValue), &RET_MGR)
583#define API_OBJCALL_OBJ_POBJ2_PBOOL(CLASS, RET_CLASS, RET_MGR, METHOD, P1CLASS, P2CLASS) \
584 ASSERT_OBJ_PARAM_COUNT(METHOD, 3); \
585 return RuntimeScriptValue().SetScriptObject(const_cast<void *>((const void *)METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr, (P2CLASS*)params[1].Ptr, params[2].GetAsBool())), &RET_MGR)
591#define API_OBJCALL_OBJ(CLASS, RET_CLASS, RET_MGR, METHOD) \
592 ASSERT_SELF(METHOD); \
593 return RuntimeScriptValue().SetScriptObject(const_cast<void *>((const void *)(RET_CLASS*)METHOD((CLASS*)self)), &RET_MGR)
599#define API_OBJCALL_OBJ_PINT(CLASS, RET_CLASS, RET_MGR, METHOD) \
600 ASSERT_OBJ_PARAM_COUNT(METHOD, 1); \
601 return RuntimeScriptValue().SetScriptObject(const_cast<void *>((const void *)(RET_CLASS*)METHOD((CLASS*)self, params[0].IValue)), &RET_MGR)
607#define API_OBJCALL_OBJ_PINT2(CLASS, RET_CLASS, RET_MGR, METHOD) \
608 ASSERT_OBJ_PARAM_COUNT(METHOD, 2); \
609 return RuntimeScriptValue().SetScriptObject(const_cast<void *>((const void *)(RET_CLASS*)METHOD((CLASS*)self, params[0].IValue, params[1].IValue)), &RET_MGR)
615#define API_OBJCALL_OBJ_PINT3(CLASS, RET_CLASS, RET_MGR, METHOD) \
616 ASSERT_OBJ_PARAM_COUNT(METHOD, 3); \
617 return RuntimeScriptValue().SetScriptObject((void*)(RET_CLASS*)METHOD((CLASS*)self, params[0].IValue, params[1].IValue, params[2].IValue), &RET_MGR)
619#define API_OBJCALL_OBJ_POBJ(CLASS, RET_CLASS, RET_MGR, METHOD, P1CLASS) \
620 ASSERT_OBJ_PARAM_COUNT(METHOD, 1); \
621 return RuntimeScriptValue().SetScriptObject(const_cast<void *>((const void *)(RET_CLASS*)METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr)), &RET_MGR)
627#define API_OBJCALL_OBJAUTO(CLASS, RET_CLASS, METHOD) \
628 ASSERT_SELF(METHOD); \
629 RET_CLASS* ret_obj = METHOD((CLASS*)self); \
630 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
632#define API_OBJCALL_OBJAUTO_PINT2_PBOOL(CLASS, RET_CLASS, METHOD) \
633 ASSERT_OBJ_PARAM_COUNT(METHOD, 3); \
634 RET_CLASS* ret_obj = METHOD((CLASS*)self, params[0].IValue, params[1].IValue, params[2].GetAsBool()); \
635 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)
637#define API_OBJCALL_OBJAUTO_POBJ(CLASS, RET_CLASS, METHOD, P1CLASS) \
638 ASSERT_OBJ_PARAM_COUNT(METHOD, 1); \
639 RET_CLASS* ret_obj = METHOD((CLASS*)self, (P1CLASS*)params[0].Ptr); \
640 return RuntimeScriptValue().SetScriptObject(ret_obj, ret_obj)