diff --git a/src/i_system.h b/src/i_system.h index 4a8bf0c27..762726fb2 100644 --- a/src/i_system.h +++ b/src/i_system.h @@ -54,7 +54,7 @@ float I_GetTimeFrac(void); */ precise_t I_GetPreciseTime(void); -/** \brief Returns the difference between precise times as microseconds. +/** \brief Converts a precise_t to microseconds and casts it to a 32 bit integer. */ int I_PreciseToMicros(precise_t d); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 3a8dcacae..7a366917b 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -35,9 +35,8 @@ #include "d_netcmd.h" // IsPlayerAdmin #include "m_menu.h" // Player Setup menu color stuff #include "m_misc.h" // M_MapNumber - -// SRB2Kart #include "p_spec.h" // P_StartQuake +#include "i_system.h" // I_GetPreciseTime, I_PreciseToMicros #include "lua_script.h" #include "lua_libs.h" @@ -3843,6 +3842,12 @@ static int lib_kDeclareWeakspot(lua_State *L) return 0; } +static int lib_iGetTimestamp(lua_State *L) +{ + lua_pushinteger(L, I_PreciseToMicros(I_GetPreciseTime())); + return 1; +} + static luaL_Reg lib[] = { {"print", lib_print}, {"chatprint", lib_chatprint}, @@ -4076,6 +4081,7 @@ static luaL_Reg lib[] = { {"G_TicsToSeconds",lib_gTicsToSeconds}, {"G_TicsToCentiseconds",lib_gTicsToCentiseconds}, {"G_TicsToMilliseconds",lib_gTicsToMilliseconds}, + {"I_GetTimestamp",lib_iGetTimestamp}, // k_kart {"K_PlayAttackTaunt", lib_kAttackSound}, diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index feb58d2e9..42be92edf 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -1671,7 +1671,13 @@ precise_t I_GetPreciseTime(void) int I_PreciseToMicros(precise_t d) { - return (int)(d / (timer_frequency / 1000000.0)); + // d is going to be converted into a double. So remove the highest bits + // to avoid loss of precision in the lower bits, for the (probably rare) case + // that the higher bits are actually used. + d &= ((precise_t)1 << 53) - 1; // The mantissa of a double can handle 53 bits at most. + // The resulting double from the calculation is converted first to UINT64 to avoid overflow, + // which is undefined behaviour when converting floating point values to integers. + return (int)(UINT64)(d / (timer_frequency / 1000000.0)); } //