diff options
author | Michael Smith <mikesmiffy128@gmail.com> | 2024-08-03 23:40:31 +0100 |
---|---|---|
committer | Michael Smith <mikesmiffy128@gmail.com> | 2024-08-23 20:37:37 +0100 |
commit | 83da606072ce272eb053d4e1497d77e647cfecae (patch) | |
tree | 71d0110881ff8685184c5f4ab720cc8d49c24678 /src/fastfwd.c | |
parent | acbd30e0427b16f885f96aed59881ec04eff25bc (diff) |
Revise syntax macros and add a ton of branch hints
My new programming style is branch hints. All non-confusing branches
must be hinted when I can be bothered. It's faster, sometimes, maybe.
Also, start trying to use more signed sizes in at least some of the
places where it makes sense. Unsigned sizes are surprisingly
error-prone!
Diffstat (limited to 'src/fastfwd.c')
-rw-r--r-- | src/fastfwd.c | 46 |
1 files changed, 21 insertions, 25 deletions
diff --git a/src/fastfwd.c b/src/fastfwd.c index 92d7623..e287770 100644 --- a/src/fastfwd.c +++ b/src/fastfwd.c @@ -26,6 +26,7 @@ #include "feature.h" #include "hook.h" #include "intdefs.h" +#include "langext.h" #include "mem.h" #include "os.h" #include "ppmagic.h" @@ -46,19 +47,14 @@ static float *realtime, *host_frametime; static float skiptime = 0.0, skiprate; static void hook_Host_AccumulateTime(float dt) { float skipinc = skiprate * dt; - if (skiptime > skipinc) { - skiptime -= skipinc; - *realtime += skipinc; - *host_frametime = skipinc; - } - else if (skiptime > 0) { - *realtime += skiptime; - *host_frametime = skiptime; - skiptime = 0; - } - else { + if_hot (!skiptime) { orig_Host_AccumulateTime(dt); + return; } + if_random (skiptime <= skipinc) skipinc = skiptime; // should become fcmovbe + skiptime -= skipinc; + *realtime += skipinc; + *host_frametime = skipinc; } void fastfwd(float seconds, float timescale) { @@ -194,67 +190,67 @@ PREINIT { INIT { void *hldsapi = factory_engine("VENGINE_HLDS_API_VERSION002", 0); - if (!hldsapi) { + if_cold (!hldsapi) { errmsg_errorx("couldn't find HLDS API interface"); return false; } void *enginetool = factory_engine("VENGINETOOL003", 0); - if (!enginetool) { + if_cold (!enginetool) { errmsg_errorx("missing engine tool interface"); return false; } // behold: the greatest pointer chase of all time realtime = find_float((*(void ***)enginetool)[vtidx_GetRealTime]); - if (!realtime) { + if_cold (!realtime) { errmsg_errorx("couldn't find realtime variable"); return false; } host_frametime = find_float((*(void ***)enginetool)[vtidx_HostFrameTime]); - if (!host_frametime) { + if_cold (!host_frametime) { errmsg_errorx("couldn't find host_frametime variable"); return false; } void *eng = find_eng((*(void ***)hldsapi)[vtidx_RunFrame]); - if (!eng) { + if_cold (!eng) { errmsg_errorx("couldn't find eng global object"); return false; } void *func; - if (!(func = find_HostState_Frame((*(void ***)eng)[vtidx_Frame]))) { + if_cold (!(func = find_HostState_Frame((*(void ***)eng)[vtidx_Frame]))) { errmsg_errorx("couldn't find HostState_Frame function"); return false; } - if (!(func = find_FrameUpdate(func))) { + if_cold (!(func = find_FrameUpdate(func))) { errmsg_errorx("couldn't find FrameUpdate function"); return false; } - if (!(func = find_floatcall(func, GAMETYPE_MATCHES(L4D2_2147plus) ? 2 : 1, - "CHostState::State_Run"))) { + if_cold (!(func = find_floatcall(func, GAMETYPE_MATCHES(L4D2_2147plus) ? + 2 : 1, "CHostState::State_Run"))) { errmsg_errorx("couldn't find State_Run function"); return false; } - if (!(func = find_floatcall(func, 1, "Host_RunFrame"))) { + if_cold (!(func = find_floatcall(func, 1, "Host_RunFrame"))) { errmsg_errorx("couldn't find Host_RunFrame function"); return false; } - if (!(func = find_floatcall(func, 1, "_Host_RunFrame"))) { + if_cold (!(func = find_floatcall(func, 1, "_Host_RunFrame"))) { errmsg_errorx("couldn't find _Host_RunFrame"); return false; } - if (!find_Host_AccumulateTime(func)) { + if_cold (!find_Host_AccumulateTime(func)) { errmsg_errorx("couldn't find Host_AccumulateTime"); return false; } orig_Host_AccumulateTime = (Host_AccumulateTime_func)hook_inline( (void *)orig_Host_AccumulateTime, (void *)hook_Host_AccumulateTime); - if (!orig_Host_AccumulateTime) { + if_cold (!orig_Host_AccumulateTime) { errmsg_errorsys("couldn't hook Host_AccumulateTime function"); } return true; } END { - if (!sst_userunloaded) return; + if_hot (!sst_userunloaded) return; unhook_inline((void *)orig_Host_AccumulateTime); } |