diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index ce8adeb06..062072618 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -11104,6 +11104,12 @@ function texture_to_lua_table(tex)
-- ...
end
+--- @return integer
+--- Gets the total number of game ticks since the game was launched. Wraps around at U64_MAX.
+function get_game_tick_counter()
+ -- ...
+end
+
--- @param name string
--- @return ModelExtendedId
--- Gets the extended model ID for the `name` of a `GeoLayout`
diff --git a/docs/lua/functions-6.md b/docs/lua/functions-6.md
index c87745a38..6e6331fc1 100644
--- a/docs/lua/functions-6.md
+++ b/docs/lua/functions-6.md
@@ -5128,6 +5128,27 @@ Converts a texture's pixels to a Lua table. Returns nil if failed. Otherwise, re
+## [get_game_tick_counter](#get_game_tick_counter)
+
+### Description
+Gets the total number of game ticks since the game was launched. Wraps around at U64_MAX.
+
+### Lua Example
+`local integerValue = get_game_tick_counter()`
+
+### Parameters
+- None
+
+### Returns
+- `integer`
+
+### C Prototype
+`u64 get_game_tick_counter(void);`
+
+[:arrow_up_small:](#)
+
+
+
---
# functions from smlua_model_utils.h
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index 10d832f15..b13b718ee 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -1991,6 +1991,7 @@
- [geo_get_current_camera](functions-6.md#geo_get_current_camera)
- [geo_get_current_held_object](functions-6.md#geo_get_current_held_object)
- [texture_to_lua_table](functions-6.md#texture_to_lua_table)
+ - [get_game_tick_counter](functions-6.md#get_game_tick_counter)
diff --git a/src/game/game_init.c b/src/game/game_init.c
index 2e13c7e57..63ea79102 100644
--- a/src/game/game_init.c
+++ b/src/game/game_init.c
@@ -63,6 +63,7 @@ struct Controller *gPlayer3Controller = &gControllers[2];
struct DemoInput *gCurrDemoInput = NULL; // demo input sequence
u16 gDemoInputListID = 0;
struct DemoInput gRecordedDemoInput = { 0 }; // possibly removed in EU. TODO: Check
+u64 gGameTickCounter = 0;
/**
* Initializes the Reality Display Processor (RDP).
@@ -602,6 +603,8 @@ void thread5_game_loop(UNUSED void *arg) {
void game_loop_one_iteration(void) {
profiler_log_thread5_time(THREAD5_START);
+ gGameTickCounter++;
+
// if any controllers are plugged in, start read the data for when
// read_controller_inputs is called later.
if (gControllerBits) {
diff --git a/src/game/game_init.h b/src/game/game_init.h
index 86710b1e0..ee6edd254 100644
--- a/src/game/game_init.h
+++ b/src/game/game_init.h
@@ -58,6 +58,7 @@ extern u8 gDemoInputs[];
extern u16 frameBufferIndex;
extern u32 gGlobalTimer;
+extern u64 gGameTickCounter;
void setup_game_memory(void);
void thread5_game_loop(UNUSED void *arg);
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index 2bf3ba87c..db72048f1 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -33296,6 +33296,21 @@ int smlua_func_texture_to_lua_table(lua_State* L) {
return 1;
}
+int smlua_func_get_game_tick_counter(UNUSED lua_State* L) {
+ if (L == NULL) { return 0; }
+
+ int top = lua_gettop(L);
+ if (top != 0) {
+ LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "get_game_tick_counter", 0, top);
+ return 0;
+ }
+
+
+ lua_pushinteger(L, get_game_tick_counter());
+
+ return 1;
+}
+
/////////////////////////
// smlua_model_utils.h //
/////////////////////////
@@ -37179,6 +37194,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "geo_get_current_camera", smlua_func_geo_get_current_camera);
smlua_bind_function(L, "geo_get_current_held_object", smlua_func_geo_get_current_held_object);
smlua_bind_function(L, "texture_to_lua_table", smlua_func_texture_to_lua_table);
+ smlua_bind_function(L, "get_game_tick_counter", smlua_func_get_game_tick_counter);
// smlua_model_utils.h
smlua_bind_function(L, "smlua_model_util_get_id", smlua_func_smlua_model_util_get_id);
diff --git a/src/pc/lua/utils/smlua_misc_utils.c b/src/pc/lua/utils/smlua_misc_utils.c
index 5fe69642c..d567335ea 100644
--- a/src/pc/lua/utils/smlua_misc_utils.c
+++ b/src/pc/lua/utils/smlua_misc_utils.c
@@ -625,3 +625,7 @@ void texture_to_lua_table(const u8 *tex) {
lua_rawseti(L, -2, i / bytesPerPixel + 1);
}
}
+
+u64 get_game_tick_counter(void) {
+ return gGameTickCounter;
+}
diff --git a/src/pc/lua/utils/smlua_misc_utils.h b/src/pc/lua/utils/smlua_misc_utils.h
index 401467a6e..8d2bc1b18 100644
--- a/src/pc/lua/utils/smlua_misc_utils.h
+++ b/src/pc/lua/utils/smlua_misc_utils.h
@@ -234,4 +234,7 @@ struct GraphNodeHeldObject* geo_get_current_held_object(void);
/* |description|Converts a texture's pixels to a Lua table. Returns nil if failed. Otherwise, returns a table as a pure memory buffer. Supports rgba16 and rgba32 textures.|descriptionEnd|*/
void texture_to_lua_table(const u8 *tex);
+/* |description|Gets the total number of game ticks since the game was launched. Wraps around at U64_MAX.|descriptionEnd|*/
+u64 get_game_tick_counter(void);
+
#endif