From 61cd748e75dbb497a4df2000b03e2f13cc9cd9fa Mon Sep 17 00:00:00 2001 From: EmeraldLockdown <86802223+EmeraldLoc@users.noreply.github.com> Date: Fri, 17 Apr 2026 23:24:18 -0500 Subject: [PATCH] Make ttc speeds change properly --- autogen/lua_definitions/structs.lua | 1 + data/dynos_bin_behavior.cpp | 1 + docs/lua/structs.md | 1 + include/object_fields.h | 1 + src/game/behaviors/ttc_moving_bar.inc.c | 9 +++++++++ src/game/behaviors/ttc_treadmill.inc.c | 8 +++++++- src/pc/lua/smlua_cobject_autogen.c | 3 ++- 7 files changed, 22 insertions(+), 2 deletions(-) diff --git a/autogen/lua_definitions/structs.lua b/autogen/lua_definitions/structs.lua index 62384274f..c16604558 100644 --- a/autogen/lua_definitions/structs.lua +++ b/autogen/lua_definitions/structs.lua @@ -1943,6 +1943,7 @@ --- @field public oTTCTreadmillSpeed number --- @field public oTTCTreadmillTargetSpeed number --- @field public oTTCTreadmillTimeUntilSwitch integer +--- @field public oTTCTreadmillPrevTTCSpeed integer --- @field public oTTCMovingBarDelay integer --- @field public oTTCMovingBarStoppedTimer integer --- @field public oTTCMovingBarOffset number diff --git a/data/dynos_bin_behavior.cpp b/data/dynos_bin_behavior.cpp index d4a50a6a9..b1aa25484 100644 --- a/data/dynos_bin_behavior.cpp +++ b/data/dynos_bin_behavior.cpp @@ -1732,6 +1732,7 @@ s64 DynOS_Bhv_ParseBehaviorScriptConstants(const String &_Arg, bool *found) { bhv_constant(oTTCTreadmillSpeed); bhv_constant(oTTCTreadmillTargetSpeed); bhv_constant(oTTCTreadmillTimeUntilSwitch); + bhv_constant(oTTCTreadmillPrevTTCSpeed); /* TTCMovingBar */ bhv_constant(oTTCMovingBarDelay); diff --git a/docs/lua/structs.md b/docs/lua/structs.md index a41cf1f19..725ae107c 100644 --- a/docs/lua/structs.md +++ b/docs/lua/structs.md @@ -2541,6 +2541,7 @@ | oTTCTreadmillSpeed | `number` | | | oTTCTreadmillTargetSpeed | `number` | | | oTTCTreadmillTimeUntilSwitch | `integer` | | +| oTTCTreadmillPrevTTCSpeed | `integer` | | | oTTCMovingBarDelay | `integer` | | | oTTCMovingBarStoppedTimer | `integer` | | | oTTCMovingBarOffset | `number` | | diff --git a/include/object_fields.h b/include/object_fields.h index 4319a043f..c69461f79 100644 --- a/include/object_fields.h +++ b/include/object_fields.h @@ -1002,6 +1002,7 @@ #define /*0x0FC*/ oTTCTreadmillSpeed OBJECT_FIELD_F32(0x1D) #define /*0x100*/ oTTCTreadmillTargetSpeed OBJECT_FIELD_F32(0x1E) #define /*0x104*/ oTTCTreadmillTimeUntilSwitch OBJECT_FIELD_S32(0x1F) +#define /*0x108*/ oTTCTreadmillPrevTTCSpeed OBJECT_FIELD_S32(0x20) /* TTC Moving Bar */ #define /*0x0F4*/ oTTCMovingBarDelay OBJECT_FIELD_S32(0x1B) diff --git a/src/game/behaviors/ttc_moving_bar.inc.c b/src/game/behaviors/ttc_moving_bar.inc.c index 07d23e9de..4923f7380 100644 --- a/src/game/behaviors/ttc_moving_bar.inc.c +++ b/src/game/behaviors/ttc_moving_bar.inc.c @@ -156,6 +156,15 @@ static void ttc_moving_bar_act_retract(void) { * Update function for bhvTTCMovingBar. */ void bhv_ttc_moving_bar_update(void) { + if (gTTCSpeedSetting == TTC_SPEED_STOPPED) { + if (o->oTTCMovingBarDelay != 0 && (o->oTTCMovingBarDelay = gTTCMovingBarDelays[gTTCSpeedSetting]) == 0) { + o->oTTCMovingBarOffset = 250.0f; + } + return; + } else if (o->oTTCMovingBarDelay == 0) { + o->oTTCMovingBarDelay = gTTCMovingBarDelays[gTTCSpeedSetting]; + } + o->oTTCMovingBarStartOffset = o->oTTCMovingBarOffset; obj_perform_position_op(POS_OP_SAVE_POSITION); diff --git a/src/game/behaviors/ttc_treadmill.inc.c b/src/game/behaviors/ttc_treadmill.inc.c index 6910d6d4f..2c42b476e 100644 --- a/src/game/behaviors/ttc_treadmill.inc.c +++ b/src/game/behaviors/ttc_treadmill.inc.c @@ -34,6 +34,8 @@ void bhv_ttc_treadmill_init(void) { sMasterTreadmill = NULL; + o->oTTCTreadmillPrevTTCSpeed = gTTCSpeedSetting; + // uses standard distance-based syncing struct SyncObject *so = sync_object_init(o, 4000.0f); if (so) { @@ -48,8 +50,12 @@ void bhv_ttc_treadmill_init(void) { * Update function for bhvTTCTreadmill. It calls cur_obj_compute_vel_xz afterward. */ void bhv_ttc_treadmill_update(void) { - if (gTTCSpeedSetting >= 0 && gTTCSpeedSetting <= 3 && *o->oTTCTreadmillBigSurface != gTTCTreadmillSpeeds[gTTCSpeedSetting]) { + if (gTTCSpeedSetting >= 0 && gTTCSpeedSetting <= 3 && o->oTTCTreadmillPrevTTCSpeed != gTTCSpeedSetting) { *o->oTTCTreadmillBigSurface = *o->oTTCTreadmillSmallSurface = gTTCTreadmillSpeeds[gTTCSpeedSetting]; + o->oTTCTreadmillTimeUntilSwitch = random_mod_offset(10, 20, 7); + o->oTTCTreadmillTargetSpeed = random_sign() * 50.0f; + o->oTimer = 0; + o->oTTCTreadmillPrevTTCSpeed = gTTCSpeedSetting; } if (sMasterTreadmill == o || sMasterTreadmill == NULL) { diff --git a/src/pc/lua/smlua_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c index 98995ceaa..5b339b473 100644 --- a/src/pc/lua/smlua_cobject_autogen.c +++ b/src/pc/lua/smlua_cobject_autogen.c @@ -1580,7 +1580,7 @@ static struct LuaObjectField sNetworkPlayerFields[LUA_NETWORK_PLAYER_FIELD_COUNT { "type", LVT_U8, offsetof(struct NetworkPlayer, type), true, LOT_NONE, 1, sizeof(u8) }, }; -#define LUA_OBJECT_FIELD_COUNT 766 +#define LUA_OBJECT_FIELD_COUNT 767 static struct LuaObjectField sObjectFields[LUA_OBJECT_FIELD_COUNT] = { { "activeFlags", LVT_S16, offsetof(struct Object, activeFlags), false, LOT_NONE, 1, sizeof(s16) }, { "allowRemoteInteractions", LVT_U8, offsetof(struct Object, allowRemoteInteractions), false, LOT_NONE, 1, sizeof(u8) }, @@ -2235,6 +2235,7 @@ static struct LuaObjectField sObjectFields[LUA_OBJECT_FIELD_COUNT] = { { "oTTCRotatingSolidVelY", LVT_F32, offsetof(struct Object, oTTCRotatingSolidVelY), false, LOT_NONE, 1, sizeof(f32) }, { "oTTCSpinnerDir", LVT_S32, offsetof(struct Object, oTTCSpinnerDir), false, LOT_NONE, 1, sizeof(s32) }, { "oTTCTreadmillBigSurface", LVT_S16_P, offsetof(struct Object, oTTCTreadmillBigSurface), true, LOT_POINTER, 1, sizeof(s16*) }, + { "oTTCTreadmillPrevTTCSpeed", LVT_S32, offsetof(struct Object, oTTCTreadmillPrevTTCSpeed), false, LOT_NONE, 1, sizeof(s32) }, { "oTTCTreadmillSmallSurface", LVT_S16_P, offsetof(struct Object, oTTCTreadmillSmallSurface), true, LOT_POINTER, 1, sizeof(s16*) }, { "oTTCTreadmillSpeed", LVT_F32, offsetof(struct Object, oTTCTreadmillSpeed), false, LOT_NONE, 1, sizeof(f32) }, { "oTTCTreadmillTargetSpeed", LVT_F32, offsetof(struct Object, oTTCTreadmillTargetSpeed), false, LOT_NONE, 1, sizeof(f32) },