From 7ba56bc6cc867846fa94f9ccdf799d6ef74f16d7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 4 Sep 2022 20:23:54 +0200 Subject: [PATCH] - floatified USER slide variables. --- source/games/sw/src/actor.cpp | 19 +++++++-------- source/games/sw/src/game.h | 8 +++---- source/games/sw/src/player.cpp | 43 +++++++++++++++------------------- source/games/sw/src/save.cpp | 6 ++--- source/games/sw/src/weapon.cpp | 21 ++++++++--------- source/games/sw/src/weapon.h | 2 +- 6 files changed, 45 insertions(+), 54 deletions(-) diff --git a/source/games/sw/src/actor.cpp b/source/games/sw/src/actor.cpp index 9e1b1d2ec..6c7ce976f 100644 --- a/source/games/sw/src/actor.cpp +++ b/source/games/sw/src/actor.cpp @@ -614,13 +614,13 @@ void KeepActorOnFloor(DSWActor* actor) // //--------------------------------------------------------------------------- -int DoActorBeginSlide(DSWActor* actor, int ang, int vel, int dec) +int DoActorBeginSlide(DSWActor* actor, DAngle ang, double vel) { actor->user.Flags |= (SPR_SLIDING); - actor->user._slide_ang = ang; - actor->user._slide_vel = vel; - actor->user._slide_dec = dec; + actor->user.slide_ang = ang; + actor->user.slide_vel = vel; + actor->user.slide_dec = 5/16.; //DoActorSlide(actor); @@ -632,20 +632,17 @@ int DoActorBeginSlide(DSWActor* actor, int ang, int vel, int dec) int DoActorSlide(DSWActor* actor) { - int nx, ny; + auto vec = actor->user.slide_ang.ToVector() * actor->user.slide_vel; - nx = MulScale(actor->user._slide_vel, bcos(actor->user._slide_ang), 14); - ny = MulScale(actor->user._slide_vel, bsin(actor->user._slide_ang), 14); - - if (!move_actor(actor, DVector3(nx * inttoworld, ny * inttoworld, 0))) + if (!move_actor(actor, DVector3(vec, 0))) { actor->user.Flags &= ~(SPR_SLIDING); return false; } - actor->user._slide_vel -= actor->user._slide_dec * ACTORMOVETICS; + actor->user.slide_vel -= actor->user.slide_dec * ACTORMOVETICS; - if (actor->user._slide_vel < 20) + if (actor->user.slide_vel < 1.25) { actor->user.Flags &= ~(SPR_SLIDING); } diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index bc434f948..21d9d09f1 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -120,7 +120,7 @@ inline double RandomRangeF(double range) } int RANDOM_P2(int pwr_of_2) { return (RANDOM() & (pwr_of_2 - 1)); } double RANDOM_P2F(int pwr_of_2, int shift) { return (RANDOM() & ((pwr_of_2 << shift) - 1)) * (1./(1 << shift)); } -DAngle RANDOM_ANGLE() { return DAngle::fromBuild(RANDOM_P2(2048)); } +DAngle RANDOM_ANGLE(int range = 2048) { return DAngle::fromBuild(RANDOM_P2(range)); } // // Map directions/degrees @@ -1040,9 +1040,9 @@ struct USER int track_vel; // sliding variables - slide backwards etc - int16_t _slide_ang; - int _slide_vel; - int16_t _slide_dec; + DAngle slide_ang; + double slide_vel; + double slide_dec; int16_t motion_blur_dist; int16_t motion_blur_num; diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp index 7af4aec02..95eeafff4 100644 --- a/source/games/sw/src/player.cpp +++ b/source/games/sw/src/player.cpp @@ -2361,7 +2361,7 @@ void DriveCrush(PLAYER* pp, DVector2* quad) int32_t const vel = FindDistance2D(pp->vect.X>>8, pp->vect.Y>>8); if (vel < 9000) { - DoActorBeginSlide(actor, getangle(pp->vect.X, pp->vect.Y), vel/8, 5); + DoActorBeginSlide(actor, VecToAngle(pp->vect.X, pp->vect.Y), vel/8 * inttoworld); if (DoActorSlide(actor)) continue; } @@ -5451,7 +5451,7 @@ void DoPlayerBeginDie(PLAYER* pp) pp->Flags |= (PF_DEAD_HEAD | PF_JUMPING); pp->jump_speed = -300; - plActor->user._slide_vel = 0; + plActor->user.slide_vel = 0; SpawnShrap(pp->actor, nullptr); plActor->spr.cstat |= (CSTAT_SPRITE_YCENTER); NewStateGroup(pp->actor, sg_PlayerHeadFly); @@ -5484,7 +5484,7 @@ void DoPlayerBeginDie(PLAYER* pp) pp->Flags |= (PF_DEAD_HEAD | PF_JUMPING); pp->jump_speed = 200; - plActor->user._slide_vel = 800; + plActor->user.slide_vel = 50; SpawnShrap(pp->actor, nullptr); plActor->spr.cstat |= (CSTAT_SPRITE_YCENTER); NewStateGroup(pp->actor, sg_PlayerHeadFly); @@ -5703,10 +5703,10 @@ void DoPlayerDeathCheckKick(PLAYER* pp) { pp->KillerActor = itActor; - plActor->user._slide_ang = getangle(plActor->int_pos().X - itActor->int_pos().X, plActor->int_pos().Y - itActor->int_pos().Y); - plActor->user._slide_ang = NORM_ANGLE(plActor->user._slide_ang + (RANDOM_P2(128<<5)>>5) - 64); + plActor->user.slide_ang = VecToAngle(plActor->spr.pos - itActor->spr.pos); + plActor->user.slide_ang += DAngle::fromBuild((RANDOM_P2(128<<5)>>5) - 64); - plActor->user._slide_vel = itActor->int_xvel() << 1; + plActor->user.slide_vel = itActor->vel.X * 2; plActor->user.Flags &= ~(SPR_BOUNCE); pp->jump_speed = -500; NewStateGroup(pp->actor, sg_PlayerHeadFly); @@ -5721,8 +5721,8 @@ void DoPlayerDeathCheckKick(PLAYER* pp) // sector stomper kick if (abs(pp->loz - pp->hiz) < ActorSizeZ(plActor) - 8) { - plActor->user._slide_ang = RANDOM_P2(2048); - plActor->user._slide_vel = 1000; + plActor->user.slide_ang = RANDOM_ANGLE(); + plActor->user.slide_vel = 62.5; plActor->user.Flags &= ~(SPR_BOUNCE); pp->jump_speed = -100; NewStateGroup(pp->actor, sg_PlayerHeadFly); @@ -5735,38 +5735,33 @@ void DoPlayerDeathCheckKick(PLAYER* pp) void DoPlayerDeathMoveHead(PLAYER* pp) { DSWActor* plActor = pp->actor; - int dax,day; - dax = MOVEx(plActor->user._slide_vel, plActor->user._slide_ang); - day = MOVEy(plActor->user._slide_vel, plActor->user._slide_ang); + auto davec = plActor->user.slide_ang.ToVector() * plActor->user.slide_vel; - plActor->user.coll = move_sprite(pp->actor, dax, day, 0, Z(16), Z(16), 1, synctics); + plActor->user.coll = move_sprite(pp->actor, DVector3(davec, 0), 16, 16, 1, synctics); { switch (plActor->user.coll.type) { case kHitSprite: { - short wall_ang, dang; - auto hitActor = plActor->user.coll.actor(); if (!(hitActor->spr.cstat & CSTAT_SPRITE_ALIGNMENT_WALL)) break; - wall_ang = NORM_ANGLE(hitActor->int_ang()); - dang = getincangle(wall_ang, plActor->user._slide_ang); - plActor->user._slide_ang = NORM_ANGLE(wall_ang + 1024 - dang); + DAngle wall_ang = hitActor->spr.angle; + DAngle dang = deltaangle(wall_ang, plActor->user.slide_ang); + plActor->user.slide_ang = wall_ang + DAngle180 - dang; SpawnShrap(pp->actor, nullptr); break; } case kHitWall: { - int wall_ang = NORM_ANGLE(getangle(plActor->user.coll.hitWall->delta())-512); - - int dang = getincangle(wall_ang, plActor->user._slide_ang); - plActor->user._slide_ang = NORM_ANGLE(wall_ang + 1024 - dang); + DAngle wall_ang = VecToAngle(plActor->user.coll.hitWall->delta()) - DAngle90; + DAngle dang = deltaangle(wall_ang, plActor->user.slide_ang); + plActor->user.slide_ang = wall_ang + DAngle180 - dang; SpawnShrap(pp->actor, nullptr); break; @@ -5879,7 +5874,7 @@ void DoPlayerDeathBounce(PLAYER* pp) { plActor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK|CSTAT_SPRITE_BLOCK_HITSCAN); NewStateGroup(pp->actor, sg_PlayerHead); - plActor->user._slide_vel = 0; + plActor->user.slide_vel = 0; plActor->user.Flags |= (SPR_BOUNCE); @@ -5888,8 +5883,8 @@ void DoPlayerDeathBounce(PLAYER* pp) plActor->user.Flags |= (SPR_BOUNCE); pp->jump_speed = -300; - plActor->user._slide_vel >>= 2; - plActor->user._slide_ang = NORM_ANGLE((RANDOM_P2(64<<8)>>8) - 32); + plActor->user.slide_vel *= 0.25; + plActor->user.slide_ang = DAngle::fromBuild((RANDOM_P2(64<<8)>>8) - 32); pp->Flags |= (PF_JUMPING); SpawnShrap(pp->actor, nullptr); } diff --git a/source/games/sw/src/save.cpp b/source/games/sw/src/save.cpp index 41447bbcc..1f20809c7 100644 --- a/source/games/sw/src/save.cpp +++ b/source/games/sw/src/save.cpp @@ -815,9 +815,9 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, USER& w, USER* def ("point", w.point, def->point) ("track_dir", w.track_dir, def->track_dir) ("track_vel", w.track_vel, def->track_vel) - ("slide_ang", w._slide_ang, def->_slide_ang) - ("slide_vel", w._slide_vel, def->_slide_vel) - ("slide_dec", w._slide_dec, def->_slide_dec) + ("slide_ang", w.slide_ang, def->slide_ang) + ("slide_vel", w.slide_vel, def->slide_vel) + ("slide_dec", w.slide_dec, def->slide_dec) ("motion_blur_dist", w.motion_blur_dist, def->motion_blur_dist) ("motion_blur_num", w.motion_blur_num, def->motion_blur_num) ("wait_active_check", w.wait_active_check, def->wait_active_check) diff --git a/source/games/sw/src/weapon.cpp b/source/games/sw/src/weapon.cpp index 0b9738ad6..ecbf24b88 100644 --- a/source/games/sw/src/weapon.cpp +++ b/source/games/sw/src/weapon.cpp @@ -5198,7 +5198,7 @@ int ActorStdMissile(DSWActor* actor, DSWActor* weapActor) int ActorDamageSlide(DSWActor* actor, int damage, int ang) { - int slide_vel,slide_dec; + auto angle = DAngle::fromBuild(ang); if (actor->user.Flags & (SPR_CLIMBING)) return false; @@ -5210,22 +5210,21 @@ int ActorDamageSlide(DSWActor* actor, int damage, int ang) if (damage <= 10) { - DoActorBeginSlide(actor, ang, 64, 5); + DoActorBeginSlide(actor, angle, 4); return true; } else if (damage <= 20) { - DoActorBeginSlide(actor, ang, 128, 5); + DoActorBeginSlide(actor, angle, 8); return true; } else { - slide_vel = (damage * 6) - (actor->user.MaxHealth); + int slide_vel = (damage * 6) - (actor->user.MaxHealth); if (slide_vel < -1000) slide_vel = -1000; - slide_dec = 5; - DoActorBeginSlide(actor, ang, slide_vel, slide_dec); + DoActorBeginSlide(actor, angle, slide_vel / 16.); return true; } @@ -5366,9 +5365,9 @@ int PlayerCheckDeath(PLAYER* pp, DSWActor* weapActor) DoPlayerBeginDie(pp); // for death direction - actor->user._slide_ang = getangle(actor->int_pos().X - weapActor->int_pos().X, actor->int_pos().Y - weapActor->int_pos().Y); + actor->user.slide_ang = VecToAngle(actor->spr.pos - weapActor->spr.pos); // for death velocity - actor->user._slide_vel = actor->user.LastDamage * 5; + actor->user.slide_vel = actor->user.LastDamage * (5 / 16.); return true; } @@ -11114,7 +11113,7 @@ int DoSerpRing(DSWActor* actor) } // rotate the ring - actor->user._slide_ang = NORM_ANGLE(actor->user._slide_ang + actor->spr.yint); + actor->user.slide_ang += DAngle::fromBuild(actor->spr.yint); // rotate the heads if (actor->user.Flags & (SPR_BOUNCE)) @@ -11123,7 +11122,7 @@ int DoSerpRing(DSWActor* actor) actor->set_int_ang(NORM_ANGLE(actor->int_ang() - (28 * RINGMOVETICS))); // put it out there - actor->add_int_pos({ MulScale(int(actor->user.Dist * worldtoint), bcos(actor->user._slide_ang), 14), MulScale(int(actor->user.Dist * worldtoint), bsin(actor->user._slide_ang), 14), 0 }); + actor->spr.pos += actor->user.slide_ang.ToVector() * actor->user.Dist; SetActor(actor, actor->spr.pos); @@ -11337,7 +11336,7 @@ int InitSerpRing(DSWActor* actor) actorNew->user.pos.Z = 50; // ang around the serp is now slide_ang - actorNew->user._slide_ang = actorNew->int_ang(); + actorNew->user.slide_ang = actorNew->spr.angle; // randomize the head turning angle actorNew->set_int_ang(RANDOM_P2(2048<<5)>>5); diff --git a/source/games/sw/src/weapon.h b/source/games/sw/src/weapon.h index 9e34feaeb..99aa0b8b2 100644 --- a/source/games/sw/src/weapon.h +++ b/source/games/sw/src/weapon.h @@ -169,7 +169,7 @@ inline int CloseRangeDist(DSWActor* a1, DSWActor* a2, int fudge) extern short target_ang; DSWActor* SpawnShotgunSparks(PLAYER* pp, sectortype* hit_sect, walltype* hit_wall, int hit_x, int hit_y, int hit_z, short hit_ang); -int DoActorBeginSlide(DSWActor* actor, int ang, int vel, int dec); +int DoActorBeginSlide(DSWActor* actor, DAngle ang, double vel); int GetOverlapSector(int x, int y, sectortype** over, sectortype** under); bool MissileHitDiveArea(DSWActor*);