/* Получить значения указанного элемента массива */ AS3_Val QSPGetVarValues(void *param, AS3_Val args) { char *name; int ind; QSP_CHAR *nameWC; char *strUTF8; QSPVar *var; AS3_Val res; AS3_ArrayValue(args, "StrType, IntType", &name, &ind); if (qspIsExitOnError && qspErrorNum) return AS3_Null(); qspResetError(); nameWC = qspC2W(name); var = qspVarReference(nameWC, QSP_FALSE); free(nameWC); if (qspErrorNum || ind < 0 || ind >= var->ValsCount) return AS3_Null(); if (var->Values[ind].Str) { strUTF8 = qspW2C(var->Values[ind].Str); res = AS3_Object("numVal:IntType, strVal:StrType", var->Values[ind].Num, strUTF8); free(strUTF8); } else res = AS3_Object("numVal:IntType, strVal:StrType", var->Values[ind].Num, 0); return res; }
/* Получить значение указанного выражения */ AS3_Val QSPGetExprValue(void *param, AS3_Val args) { char *expr; QSP_CHAR *exprWC; char *strUTF8; QSPVariant v; AS3_Val res; AS3_ArrayValue(args, "StrType", &expr); if (qspIsExitOnError && qspErrorNum) return AS3_Null(); qspResetError(); if (qspIsDisableCodeExec) return AS3_Null(); exprWC = qspC2W(expr); v = qspExprValue(exprWC); free(exprWC); if (qspErrorNum) return AS3_Null(); if (v.IsStr) { strUTF8 = qspW2C(QSP_STR(v)); free(QSP_STR(v)); res = AS3_Object("isString:IntType, numVal:IntType, strVal:StrType", QSP_TRUE, 0, strUTF8); free(strUTF8); } else res = AS3_Object("isString:IntType, numVal:IntType, strVal:StrType", QSP_FALSE, QSP_NUM(v), 0); return res; }
/* Получить количество элементов массива */ AS3_Val QSPGetVarValuesCount(void *param, AS3_Val args) { char *name; QSP_CHAR *nameWC; QSPVar *var; AS3_ArrayValue(args, "StrType", &name); if (qspIsExitOnError && qspErrorNum) return AS3_Null(); qspResetError(); nameWC = qspC2W(name); var = qspVarReference(nameWC, QSP_FALSE); free(nameWC); if (qspErrorNum) return AS3_Null(); return AS3_Int(var->ValsCount); }
/* * Create an ActionScript value from the lua stack starting * at index start and ending at index end. If collapse_array == 1, * an empty return will be transformed into AS3_Undefined() and a * return of length 1 will just return the specific value. * Otherwise an array is returned. */ AS3_Val create_as3_value_from_lua_stack( lua_State * L, int start, int end, BOOL collapse_array ) { /* WARNING: Panic alert! Use L*_FN checkers here! */ LCALL(L, stack); AS3_Val ret; SPAM(("create_as3_value_from_lua_stack(): begin")); if (collapse_array == TRUE && start > end) { ret = AS3_Null(); } else if (collapse_array == TRUE && start == end) { ret = get_as3_value_from_lua_stack(L, start); } else { int i; ret = AS3_Array(""); for (i = start; i <= end; ++i) { AS3_Val value; AS3_Val r; /*SPAM(("create_as3_value_from_lua_stack() + 1 begin"));*/ value = get_as3_value_from_lua_stack(L, i); r = AS3_CallTS("push", ret, "AS3ValType", value); SAFE_RELEASE(r); /* Ignoring result */ SAFE_RELEASE(value); /*SPAM(("create_as3_value_from_lua_stack() + 1 end"));*/ } } #ifdef DO_SPAM SPAM(("create_as3_value_from_lua_stack(): end")); AS3_Trace( AS3_Call( getQualifiedClassName_method, NULL, AS3_Array("AS3ValType", ret) ) ); #endif /* DO_SPAM */ LCHECK_FN(L, stack, 0, fatal_error); return ret; }
/* Получить имя переменной с указанным индексом */ AS3_Val QSPGetVarNameByIndex(void *param, AS3_Val args) { int index; QSP_CHAR *name; char *nameUTF8; AS3_Val res; AS3_ArrayValue(args, "IntType", &index); if (index < 0 || index >= QSP_VARSCOUNT || !qspVars[index].Name) return AS3_Null(); nameUTF8 = qspW2C(qspVars[index].Name); res = AS3_String(nameUTF8); free(nameUTF8); return res; }
// MIKE 11/08 main game loop, called every frame by Flash void D_DoomLoop (void) { // frame syncronous IO operations I_StartFrame (); if(!wipe) { // process one or more tics if (singletics) { I_StartTic (); D_ProcessEvents (); G_BuildTiccmd (&netcmds[consoleplayer][maketic%BACKUPTICS]); if (advancedemo) D_DoAdvanceDemo (); M_Ticker (); G_Ticker (); gametic++; maketic++; } else { TryRunTics (); // will run at least one tic } S_UpdateSounds (players[consoleplayer].mo);// move positional sounds // Update display, next frame, with current state. //D_Display (); } // MIKE #ifndef SNDSERV // Sound mixing for the buffer is snychronous. I_UpdateSound(); #endif // Synchronous sound output is explicitly called. #ifndef SNDINTR // Update sound output. // I_SubmitSound(); #endif gameTime++; return AS3_Null(); }
/* * Take the Lua stack item at index i and convert it into an * ActionScript value. */ AS3_Val get_as3_value_from_lua_stack_type(lua_State * L, int i, int type) { /* WARNING: Panic alert! Use L*_FN checkers here! */ LCALL(L, stack); AS3_Val value; switch (type) { case LUA_TSTRING: /* strings */ { size_t length = 0; const char * str = lua_tolstring(L, i, &length); if (str == NULL) /* NOTE: This is unreachable. Assert instead */ { length = 6; str = "(null)"; } /* NOTE: Alchemy .5a truncates embedded zeroes in string * regardless to the passed length */ value = AS3_StringN(str, length); } break; case LUA_TBOOLEAN: /* booleans */ value = lua_toboolean(L, i) ? AS3_True() : AS3_False(); break; case LUA_TNUMBER: /* numbers */ value = AS3_Number(lua_tonumber(L, i)); break; case LUA_TNONE: /* fall through */ case LUA_TNIL: /* nil */ value = AS3_Null(); break; case LUA_TUSERDATA: /* userdata */ { void * userdata = lua_touserdata(L, i); lua_getfield(L, LUA_REGISTRYINDEX, AS3LUA_METATABLE); if (userdata == NULL || !lua_getmetatable(L, i)) { lua_pop(L, 1); /* Pop AS3LUA_METATABLE */ value = as3_value_from_foreign_userdata(L, i); } else if (!lua_rawequal(L, -2, -1)) { lua_pop(L, 2); /* Pop AS3LUA_METATABLE and userdata metatable */ value = as3_value_from_foreign_userdata(L, i); } else { lua_pop(L, 2); /* Pop AS3LUA_METATABLE and userdata metatable */ AS3LuaUserData * userdata = (AS3LuaUserData *)lua_touserdata(L, i); value = userdata->value; /* * We just created one more reference to the AS3 value, * as it still lives inside Lua. * (And will probably be collected by GC.) */ AS3_Acquire(value); } } break; case LUA_TFUNCTION: /* function */ value = setup_callback(L, i); break; case LUA_TLIGHTUSERDATA: /* TODO: blackbox this type */ case LUA_TTABLE: /* TODO: deal with this type */ case LUA_TTHREAD: /* TODO: blackbox this type */ value = AS3_String(lua_typename(L, type)); break; default: /* unreachable */ fatal_error("unknown Lua type"); break; } #ifdef DO_SPAM SPAM(("get_as3_value_from_lua_stack(): end")); AS3_Trace( AS3_Call( getQualifiedClassName_method, NULL, AS3_Array("AS3ValType", value) ) ); #endif /* DO_SPAM */ LCHECK_FN(L, stack, 0, fatal_error); return value; }
AS3_Val emptyFunction(void* data, AS3_Val args) { /// empty. return AS3_Null(); }