/* * Method: CallEvery * * Request that a function be called over at over at a regular interval. * * > Timer:CallEvery(interval, function) * * Since the <Timer> system is locked to the game time, time acceleration may * cause the function to be called more frequently than the corresponding * number of real-time seconds. Even under time acceleration, the function * will never called more than once per real-time second. * * If the called function returns a false value (as is the default for Lua * when no return value is specified), the timer will continue to be triggered * after each interval. To request that no further timer events be fired, the * function should explicitly return a true value. * * Parameters: * * time - the interval between calls to the function, in seconds * * function - the function to call. Returns false to continue receiving * calls after the next interval, or true to cancel the timer. * * Example: * * > -- dump fuel every two seconds until none left * > Timer:CallEvery(2, function () * > local did_dump = Game.player:Jettison(Equip.Type.HYDROGEN) * > return not did_dump * > end) * * Availability: * * alpha 10 * * Status: * * stable */ static int l_timer_call_every(lua_State *l) { if (!Pi::game) { luaL_error(l, "Game is not started"); return 0; } double every = luaL_checknumber(l, 2); luaL_checktype(l, 3, LUA_TFUNCTION); // any type of function if (every <= 0) luaL_error(l, "Specified interval must be greater than zero"); LUA_DEBUG_START(l); lua_newtable(l); pi_lua_settable(l, "every", every); pi_lua_settable(l, "at", Pi::game->GetTime() + every); _finish_timer_create(l); LUA_DEBUG_END(l, 0); return 0; }
/* * Method: CallAt * * Request that a function be called at a specific game time. * * > Timer:CallAt(time, function) * * Time acceleration may cause the function to be called long after the desired * time has passed. * * Parameters: * * time - the absolute game time to call the function at. This will usually * be created by adding some small amount to <Game.time>. * * function - the function to call. Takes no parameters and returns nothing. * * Example: * * > Timer:CallAt(Game.time+30, function () * > UI.Message("Special offer expired, sorry.") * > end) * * Availability: * * alpha 10 * * Status: * * stable */ static int l_timer_call_at(lua_State *l) { double at = luaL_checknumber(l, 2); if (!lua_isfunction(l, 3)) luaL_typerror(l, 3, lua_typename(l, LUA_TFUNCTION)); if (at <= Pi::GetGameTime()) luaL_error(l, "Specified time is in the past"); LUA_DEBUG_START(l); lua_newtable(l); pi_lua_settable(l, "at", at); _finish_timer_create(l); LUA_DEBUG_END(l, 0); return 0; }
/* * Method: CallEvery * * Request that a function be called over at over at a regular interval. * * > Timer:CallEvery(interval, function) * * Since the <Timer> system is locked to the game time, time acceleration may * cause the function to be called more frequently than the corresponding * number of real-time seconds. Even under time acceleration, the function * will never called more than once per real-time second. * * If the called function returns a false value (as is the default for Lua * when no return value is specified), the timer will continue to be triggered * after each interval. To request that no further timer events be fired, the * function should explicitly return a true value. * * Parameters: * * time - the interval between calls to the function, in seconds * * function - the function to call. Returns false to continue receiving * calls after the next interval, or true to cancel the timer. * * Example: * * > -- dump fuel every two seconds until none left * > Timer:CallEvery(2, function () * > local did_dump = Game.player:Jettison(Equip.Type.HYDROGEN) * > return not did_dump * > end) * * Availability: * * alpha 10 * * Status: * * stable */ static int l_timer_call_every(lua_State *l) { double every = luaL_checknumber(l, 2); if (!lua_isfunction(l, 3)) luaL_typerror(l, 3, lua_typename(l, LUA_TFUNCTION)); if (every <= 0) luaL_error(l, "Specified interval must be greater than zero"); LUA_DEBUG_START(l); lua_newtable(l); pi_lua_settable(l, "every", every); pi_lua_settable(l, "at", Pi::GetGameTime() + every); _finish_timer_create(l); LUA_DEBUG_END(l, 0); return 0; }
/* * Method: CallAt * * Request that a function be called at a specific game time. * * > Timer:CallAt(time, function) * * Time acceleration may cause the function to be called long after the desired * time has passed. * * Parameters: * * time - the absolute game time to call the function at. This will usually * be created by adding some small amount to <Game.time>. * * function - the function to call. Takes no parameters and returns nothing. * * Example: * * > Timer:CallAt(Game.time+30, function () * > Comms.Message("Special offer expired, sorry.") * > end) * * Availability: * * alpha 10 * * Status: * * stable */ static int l_timer_call_at(lua_State *l) { if (!Pi::game) luaL_error(l, "Game is not started"); double at = luaL_checknumber(l, 2); luaL_checktype(l, 3, LUA_TFUNCTION); // any type of function if (at <= Pi::game->GetTime()) luaL_error(l, "Specified time is in the past"); LUA_DEBUG_START(l); lua_newtable(l); pi_lua_settable(l, "at", at); _finish_timer_create(l); LUA_DEBUG_END(l, 0); return 0; }