From b36c6f20c705d5eae78f349794a337612c9c8d14 Mon Sep 17 00:00:00 2001 From: zico Date: Mon, 13 Feb 2017 11:00:21 +0100 Subject: [PATCH] Made scrape_player_on_wall() based on a timer. Due to the player being pushed away from the lava/water surface in every frame in a random vector (wrong, too), player movement per frame was not enough to counter this on FPS rates > ~120 which made damage scaling per frame nonsensical in these situations. Instead, execute scrape results in intevals based on DESIGNATED_GAME_FRAMETIME (or per frame if FrameTime>DESIGNATED_GAME_FRAMETIME) which fixes the issues and generally works much better for the purpose of this function. --- similar/main/collide.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/similar/main/collide.cpp b/similar/main/collide.cpp index dd37d6aa4..b020657e2 100644 --- a/similar/main/collide.cpp +++ b/similar/main/collide.cpp @@ -418,6 +418,7 @@ static void collide_player_and_wall(const vobjptridx_t playerobj, fix hitspeed, } } +static fix64 Last_volatile_scrape_time = 0; static fix64 Last_volatile_scrape_sound_time = 0; #if defined(DXX_BUILD_DESCENT_I) @@ -429,9 +430,13 @@ bool scrape_player_on_wall(const vobjptridx_t obj, const vsegptridx_t hitseg, sh if (obj->type != OBJ_PLAYER || get_player_id(obj) != Player_num) return false; + if (!((GameTime64 > Last_volatile_scrape_time + DESIGNATED_GAME_FRAMETIME) || (GameTime64 < Last_volatile_scrape_time))) + return false; + Last_volatile_scrape_time = GameTime64; + if ((d=TmapInfo[hitseg->sides[hitside].tmap_num].damage) > 0) { vms_vector hit_dir; - fix damage = fixmul(d,FrameTime); + fix damage = fixmul(d,(FrameTime>DESIGNATED_GAME_FRAMETIME)?FrameTime:DESIGNATED_GAME_FRAMETIME); auto &player_info = obj->ctype.player_info; if (!(player_info.powerup_flags & PLAYER_FLAGS_INVULNERABLE)) @@ -469,7 +474,7 @@ volatile_wall_result check_volatile_wall(const vobjptridx_t obj, const vcsegptr_ if (get_player_id(obj) == Player_num) { if (d > 0) { - fix damage = fixmul(d,FrameTime); + fix damage = fixmul(d,((FrameTime>DESIGNATED_GAME_FRAMETIME)?FrameTime:DESIGNATED_GAME_FRAMETIME)); if (Difficulty_level == 0) damage /= 2; @@ -498,6 +503,10 @@ bool scrape_player_on_wall(const vobjptridx_t obj, const vsegptridx_t hitseg, sh if (obj->type != OBJ_PLAYER || get_player_id(obj) != Player_num) return false; + if (!((GameTime64 > Last_volatile_scrape_time + DESIGNATED_GAME_FRAMETIME) || (GameTime64 < Last_volatile_scrape_time))) + return false; + Last_volatile_scrape_time = GameTime64; + const auto type = check_volatile_wall(obj, hitseg, hitside); if (type != volatile_wall_result::none) {