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.

This commit is contained in:
zico 2017-02-13 11:00:21 +01:00
parent 569d64e927
commit b36c6f20c7

View file

@ -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)
{