From c9b17c456dd8df6c855b25ba1eac8422d63e48d5 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Wed, 29 Jul 2020 09:30:29 -0400 Subject: [PATCH 01/16] Re-attempt at hitlag I remember when I tried to fix wolfs' branch I was having issues, but this ended up working pretty much fine? Don't remember why the old branch was messed up though (it was simply too old & not substantial enough to try and work off of imo) --- src/k_collide.c | 3 +++ src/lua_mobjlib.c | 8 ++++++++ src/p_map.c | 6 ++++++ src/p_mobj.c | 8 ++++++++ src/p_mobj.h | 2 ++ src/p_saveg.c | 11 +++++++++-- src/p_user.c | 5 +++++ src/r_things.c | 14 +++++++++++--- 8 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index 1921e3d38..e2fa2e9d4 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -48,6 +48,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) P_DamageMobj(t2, t1, t1->target, 1); K_KartBouncing(t2, t1, false, false); S_StartSound(t2, sfx_s3k7b); + t2->hitlag = TICRATE; } damageitem = true; @@ -99,6 +100,8 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) else t1->z += t1->height; + t1->hitlag = TICRATE; + S_StartSound(t1, t1->info->deathsound); P_KillMobj(t1, t2, t2); diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 3c85c358b..a1d7eee60 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -87,6 +87,7 @@ enum mobj_e { mobj_standingslope, #endif mobj_colorized, + mobj_hitlag, mobj_shadowscale, mobj_whiteshadow, mobj_sprxoff, @@ -156,6 +157,7 @@ static const char *const mobj_opt[] = { "standingslope", #endif "colorized", + "hitlag", "shadowscale", "whiteshadow", "sprxoff", @@ -375,6 +377,9 @@ static int mobj_get(lua_State *L) case mobj_colorized: lua_pushboolean(L, mo->colorized); break; + case mobj_hitlag: + lua_pushinteger(L, mo->hitlag); + break; case mobj_shadowscale: lua_pushfixed(L, mo->shadowscale); break; @@ -710,6 +715,9 @@ static int mobj_set(lua_State *L) case mobj_colorized: mo->colorized = luaL_checkboolean(L, 3); break; + case mobj_hitlag: + mo->hitlag = luaL_checkinteger(L, 3); + break; case mobj_shadowscale: mo->shadowscale = luaL_checkfixed(L, 3); break; diff --git a/src/p_map.c b/src/p_map.c index 4ef258ebb..69a638ce4 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2598,6 +2598,12 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) if (radius < mapobjectscale) radius = mapobjectscale; + if (thing->hitlag > 0) + { + // Do not move during hitlag + return false; + } + do { if (thing->flags & MF_NOCLIP) { tryx = x; diff --git a/src/p_mobj.c b/src/p_mobj.c index 734a6e3f3..806fccf50 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6392,6 +6392,12 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->flags & MF_NOTHINK) return; + if (mobj->hitlag > 0) + { + mobj->hitlag--; + return; + } + // Remove dead target/tracer. if (mobj->target && P_MobjWasRemoved(mobj->target)) P_SetTarget(&mobj->target, NULL); @@ -10875,6 +10881,8 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->colorized = false; + mobj->hitlag = 0; + // Set shadowscale here, before spawn hook so that Lua can change it P_DefaultMobjShadowScale(mobj); diff --git a/src/p_mobj.h b/src/p_mobj.h index dbb3f4d58..75a6bf3b8 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -410,6 +410,8 @@ typedef struct mobj_s fixed_t sprxoff, spryoff, sprzoff; // Sprite offsets in real space, does NOT affect position or collision + INT32 hitlag; + // WARNING: New fields must be added separately to savegame and Lua. } mobj_t; diff --git a/src/p_saveg.c b/src/p_saveg.c index c197b5a3c..5085f2644 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1000,6 +1000,7 @@ typedef enum #endif MD2_SHADOWSCALE = 1<<14, MD2_DRAWFLAGS = 1<<15, + MD2_HITLAG = 1<<16 } mobj_diff2_t; typedef enum @@ -1196,12 +1197,14 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) if (mobj->standingslope) diff2 |= MD2_SLOPE; #endif + if (mobj->colorized) + diff2 |= MD2_COLORIZED; if (mobj->shadowscale) diff2 |= MD2_SHADOWSCALE; if (mobj->drawflags) diff2 |= MD2_DRAWFLAGS; - if (mobj->colorized) - diff2 |= MD2_COLORIZED; + if (mobj->hitlag) + diff2 |= MD2_HITLAG; if (mobj == waypointcap) diff2 |= MD2_WAYPOINTCAP; if (mobj == kitemcap) @@ -1342,6 +1345,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) WRITEUINT16(save_p, df); } + if (diff2 & MD2_HITLAG) + WRITEINT32(save_p, mobj->hitlag); WRITEUINT32(save_p, mobj->mobjnum); } @@ -2273,6 +2278,8 @@ static void LoadMobjThinker(actionf_p1 thinker) mobj->shadowscale = READFIXED(save_p); if (diff2 & MD2_DRAWFLAGS) mobj->drawflags = READUINT16(save_p); + if (diff2 & MD2_HITLAG) + mobj->hitlag = READINT32(save_p); if (diff & MD_REDFLAG) { diff --git a/src/p_user.c b/src/p_user.c index 8d6014926..3750c1378 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8677,6 +8677,11 @@ void P_PlayerThink(player_t *player) } #endif + if (player->mo->hitlag > 0) + { + return; + } + if (player->awayviewmobj && P_MobjWasRemoved(player->awayviewmobj)) { P_SetTarget(&player->awayviewmobj, NULL); // remove awayviewmobj asap if invalid diff --git a/src/r_things.c b/src/r_things.c index 05672ae4d..fb12fcb4b 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1429,9 +1429,9 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, // static void R_ProjectSprite(mobj_t *thing) { - const fixed_t thingxpos = thing->x + thing->sprxoff; - const fixed_t thingypos = thing->y + thing->spryoff; - const fixed_t thingzpos = thing->z + thing->sprzoff; + fixed_t thingxpos = thing->x + thing->sprxoff; + fixed_t thingypos = thing->y + thing->spryoff; + fixed_t thingzpos = thing->z + thing->sprzoff; fixed_t tr_x, tr_y; fixed_t gxt, gyt; @@ -1468,6 +1468,14 @@ static void R_ProjectSprite(mobj_t *thing) INT32 light = 0; fixed_t this_scale = thing->scale; + // hitlag vibrating + if (thing->hitlag > 0 && (leveltime & 1)) + { + thingxpos += thing->momx; + thingypos += thing->momy; + thingzpos += thing->momz; + } + // transform the origin point tr_x = thingxpos - viewx; tr_y = thingypos - viewy; From 1bec6945eefe61addafcd187269479a73734e663 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Wed, 29 Jul 2020 11:26:24 -0400 Subject: [PATCH 02/16] Ease hitlag vibration over time --- src/p_mobj.h | 2 +- src/r_things.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/p_mobj.h b/src/p_mobj.h index 75a6bf3b8..8ba15af84 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -410,7 +410,7 @@ typedef struct mobj_s fixed_t sprxoff, spryoff, sprzoff; // Sprite offsets in real space, does NOT affect position or collision - INT32 hitlag; + INT32 hitlag; // Sal-style hit lag, straight from Captain Fetch's jowls // WARNING: New fields must be added separately to savegame and Lua. } mobj_t; diff --git a/src/r_things.c b/src/r_things.c index fb12fcb4b..708e9e146 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1469,11 +1469,18 @@ static void R_ProjectSprite(mobj_t *thing) fixed_t this_scale = thing->scale; // hitlag vibrating - if (thing->hitlag > 0 && (leveltime & 1)) + if (thing->hitlag > 0) { - thingxpos += thing->momx; - thingypos += thing->momy; - thingzpos += thing->momz; + fixed_t mul = (thing->hitlag * FRACUNIT) / (TICRATE); + + if (leveltime & 1) + { + mul = -mul; + } + + thingxpos += FixedMul(thing->momx, mul); + thingypos += FixedMul(thing->momy, mul); + thingzpos += FixedMul(thing->momz, mul); } // transform the origin point From 0cb123f74e45675cfada023cb009b777fe2c4215 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 31 Jul 2020 00:07:24 -0400 Subject: [PATCH 03/16] Apply to more things, make the timing more reasonable --- src/k_collide.c | 46 ++++++++++++++++++++++------------------------ src/r_things.c | 2 +- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index e2fa2e9d4..26863f493 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -41,6 +41,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) { // Melt item S_StartSound(t2, sfx_s3k43); + t2->hitlag += 3; } else { @@ -48,7 +49,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) P_DamageMobj(t2, t1, t1->target, 1); K_KartBouncing(t2, t1, false, false); S_StartSound(t2, sfx_s3k7b); - t2->hitlag = TICRATE; + t2->hitlag += 10; } damageitem = true; @@ -59,10 +60,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) || t2->type == MT_BALLHOG) { // Other Item Damage - if (t2->eflags & MFE_VERTICALFLIP) - t2->z -= t2->height; - else - t2->z += t2->height; + t2->hitlag += 10; S_StartSound(t2, t2->info->deathsound); P_KillMobj(t2, t1, t1); @@ -89,18 +87,14 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) { // Shootable damage P_DamageMobj(t2, t2, t1->target, 1); + t2->hitlag += 10; damageitem = true; } if (damageitem) { // This Item Damage - if (t1->eflags & MFE_VERTICALFLIP) - t1->z -= t1->height; - else - t1->z += t1->height; - - t1->hitlag = TICRATE; + t1->hitlag += 10; S_StartSound(t1, t1->info->deathsound); P_KillMobj(t1, t2, t2); @@ -147,11 +141,13 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) { // Melt item S_StartSound(t2, sfx_s3k43); + t2->hitlag += 3; } else { // Player Damage K_SpinPlayer(t2->player, t1->target, 0, t1, (t1->type == MT_BANANA || t1->type == MT_BANANA_SHIELD)); + t2->hitlag += 5; } damageitem = true; @@ -162,10 +158,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) || t2->type == MT_BALLHOG) { // Other Item Damage - if (t2->eflags & MFE_VERTICALFLIP) - t2->z -= t2->height; - else - t2->z += t2->height; + t2->hitlag += 10; S_StartSound(t2, t2->info->deathsound); P_KillMobj(t2, t1, t1); @@ -181,16 +174,14 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) { // Shootable damage P_DamageMobj(t2, t2, t1->target, 1); + t2->hitlag += 10; damageitem = true; } if (damageitem) { // This Item Damage - if (t1->eflags & MFE_VERTICALFLIP) - t1->z -= t1->height; - else - t1->z += t1->height; + t1->hitlag += 10; S_StartSound(t1, t1->info->deathsound); P_KillMobj(t1, t2, t2); @@ -303,10 +294,7 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2) P_KillMobj(t1, t2, t2); // Other Item Damage - if (t2->eflags & MFE_VERTICALFLIP) - t2->z -= t2->height; - else - t2->z += t2->height; + t2->hitlag += 10; S_StartSound(t2, t2->info->deathsound); P_KillMobj(t2, t1, t1); @@ -333,9 +321,15 @@ boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2) return true; if (t1->state == &states[S_MINEEXPLOSION1]) + { K_ExplodePlayer(t2->player, t1->target, t1); + t2->hitlag += 10; + } else + { K_SpinPlayer(t2->player, t1->target, 0, t1, false); + t2->hitlag += 5; + } } else if (t2->flags & MF_SHOOTABLE) { @@ -363,12 +357,16 @@ boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2) I_OutputMsg("%s was hit by a kitchen sink.\n", player_names[t2->player-players]); P_DamageMobj(t2, t1, t1->target, 10000); P_KillMobj(t1, t2, t2); + t1->hitlag += 10; + t2->hitlag += 10; } else if (t2->flags & MF_SHOOTABLE) { // Shootable damage P_KillMobj(t2, t2, t1->target); - // This item damage + t2->hitlag += 10; + // This Item Damage + t1->hitlag += 10; P_KillMobj(t1, t2, t2); } diff --git a/src/r_things.c b/src/r_things.c index e999e55bc..806326d1f 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1487,7 +1487,7 @@ static void R_ProjectSprite(mobj_t *thing) // hitlag vibrating if (thing->hitlag > 0) { - fixed_t mul = (thing->hitlag * FRACUNIT) / (TICRATE); + fixed_t mul = (thing->hitlag * FRACUNIT) / 5; if (leveltime & 1) { From 0db881d058edddd24b642e0684fbaf391e3ce8be Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 31 Jul 2020 22:29:08 -0400 Subject: [PATCH 04/16] Allow hitting players who are flashing, but are still in hitlag --- src/k_collide.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index 26863f493..7931322b5 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -30,7 +30,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) if (t2->player) { - if (t2->player->powers[pw_flashing] + if ((t2->player->powers[pw_flashing] > 0 && t2->hitlag == 0) && !(t1->type == MT_ORBINAUT || t1->type == MT_JAWZ || t1->type == MT_JAWZ_DUD)) return true; @@ -130,7 +130,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) if (t2->player) { - if (t2->player->powers[pw_flashing]) + if (t2->player->powers[pw_flashing] > 0 && t2->hitlag == 0) return true; // Banana snipe! @@ -277,7 +277,7 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2) if (t2->player) { - if (t2->player->powers[pw_flashing]) + if (t2->player->powers[pw_flashing] > 0 && t2->hitlag == 0) return true; // Bomb punting @@ -317,7 +317,7 @@ boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2) { if (t2->player) { - if (t2->player->powers[pw_flashing]) + if (t2->player->powers[pw_flashing] > 0 && t2->hitlag == 0) return true; if (t1->state == &states[S_MINEEXPLOSION1]) @@ -347,7 +347,7 @@ boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2) if (t2->player) { - if (t2->player->powers[pw_flashing]) + if (t2->player->powers[pw_flashing] > 0 && t2->hitlag == 0) return true; S_StartSound(NULL, sfx_bsnipe); // let all players hear it. From a8908d22cfe6d393a10af4d80361beba39aec703 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 1 Aug 2020 01:14:18 -0400 Subject: [PATCH 05/16] K_SetHitlagForObjects, sets hitlag based on speed --- src/k_collide.c | 45 ++++++++++++++++++++----------------- src/k_kart.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ src/k_kart.h | 2 ++ src/p_map.c | 18 +++++++++++++++ 4 files changed, 104 insertions(+), 20 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index 7931322b5..454ff9527 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -41,15 +41,14 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) { // Melt item S_StartSound(t2, sfx_s3k43); - t2->hitlag += 3; } else { // Player Damage + K_SetHitLagForObjects(t1, t2, 10); P_DamageMobj(t2, t1, t1->target, 1); K_KartBouncing(t2, t1, false, false); S_StartSound(t2, sfx_s3k7b); - t2->hitlag += 10; } damageitem = true; @@ -60,8 +59,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) || t2->type == MT_BALLHOG) { // Other Item Damage - t2->hitlag += 10; - + K_SetHitLagForObjects(t1, t2, 10); S_StartSound(t2, t2->info->deathsound); P_KillMobj(t2, t1, t1); @@ -74,6 +72,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) } else if (t2->type == MT_SSMINE_SHIELD || t2->type == MT_SSMINE) { + K_SetHitLagForObjects(t1, t2, 10); damageitem = true; // Bomb death P_KillMobj(t2, t1, t1); @@ -85,17 +84,15 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) } else if (t2->flags & MF_SHOOTABLE) { + K_SetHitLagForObjects(t1, t2, 10); // Shootable damage P_DamageMobj(t2, t2, t1->target, 1); - t2->hitlag += 10; damageitem = true; } if (damageitem) { // This Item Damage - t1->hitlag += 10; - S_StartSound(t1, t1->info->deathsound); P_KillMobj(t1, t2, t2); @@ -141,13 +138,12 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) { // Melt item S_StartSound(t2, sfx_s3k43); - t2->hitlag += 3; } else { // Player Damage + K_SetHitLagForObjects(t1, t2, 2); K_SpinPlayer(t2->player, t1->target, 0, t1, (t1->type == MT_BANANA || t1->type == MT_BANANA_SHIELD)); - t2->hitlag += 5; } damageitem = true; @@ -158,7 +154,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) || t2->type == MT_BALLHOG) { // Other Item Damage - t2->hitlag += 10; + K_SetHitLagForObjects(t1, t2, 10); S_StartSound(t2, t2->info->deathsound); P_KillMobj(t2, t1, t1); @@ -173,15 +169,15 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) else if (t2->flags & MF_SHOOTABLE) { // Shootable damage + K_SetHitLagForObjects(t1, t2, 10); P_DamageMobj(t2, t2, t1->target, 1); - t2->hitlag += 10; damageitem = true; } if (damageitem) { // This Item Damage - t1->hitlag += 10; + K_SetHitLagForObjects(t1, t2, 10); S_StartSound(t1, t1->info->deathsound); P_KillMobj(t1, t2, t2); @@ -283,19 +279,25 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2) // Bomb punting if ((t1->state >= &states[S_SSMINE1] && t1->state <= &states[S_SSMINE4]) || (t1->state >= &states[S_SSMINE_DEPLOY8] && t1->state <= &states[S_SSMINE_DEPLOY13])) + { + K_SetHitLagForObjects(t1, t2, 10); P_KillMobj(t1, t2, t2); + } else + { + K_SetHitLagForObjects(t1, t2, 2); K_PuntMine(t1, t2); + } } else if (t2->type == MT_ORBINAUT || t2->type == MT_JAWZ || t2->type == MT_JAWZ_DUD || t2->type == MT_ORBINAUT_SHIELD || t2->type == MT_JAWZ_SHIELD) { + K_SetHitLagForObjects(t1, t2, 10); + // Bomb death P_KillMobj(t1, t2, t2); // Other Item Damage - t2->hitlag += 10; - S_StartSound(t2, t2->info->deathsound); P_KillMobj(t2, t1, t1); @@ -304,6 +306,7 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2) } else if (t2->flags & MF_SHOOTABLE) { + K_SetHitLagForObjects(t1, t2, 10); // Bomb death P_KillMobj(t1, t2, t2); // Shootable damage @@ -322,18 +325,19 @@ boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2) if (t1->state == &states[S_MINEEXPLOSION1]) { + K_SetHitLagForObjects(t1, t2, 10); K_ExplodePlayer(t2->player, t1->target, t1); - t2->hitlag += 10; } else { + K_SetHitLagForObjects(t1, t2, 2); K_SpinPlayer(t2->player, t1->target, 0, t1, false); - t2->hitlag += 5; } } else if (t2->flags & MF_SHOOTABLE) { // Shootable damage + K_SetHitLagForObjects(t1, t2, 10); P_DamageMobj(t2, t2, t1->target, 1); } @@ -350,23 +354,24 @@ boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2) if (t2->player->powers[pw_flashing] > 0 && t2->hitlag == 0) return true; + K_SetHitLagForObjects(t1, t2, 10); + S_StartSound(NULL, sfx_bsnipe); // let all players hear it. + HU_SetCEchoFlags(0); HU_SetCEchoDuration(5); HU_DoCEcho(va("%s\\was hit by a kitchen sink.\\\\\\\\", player_names[t2->player-players])); I_OutputMsg("%s was hit by a kitchen sink.\n", player_names[t2->player-players]); + P_DamageMobj(t2, t1, t1->target, 10000); P_KillMobj(t1, t2, t2); - t1->hitlag += 10; - t2->hitlag += 10; } else if (t2->flags & MF_SHOOTABLE) { + K_SetHitLagForObjects(t1, t2, 10); // Shootable damage P_KillMobj(t2, t2, t1->target); - t2->hitlag += 10; // This Item Damage - t1->hitlag += 10; P_KillMobj(t1, t2, t2); } diff --git a/src/k_kart.c b/src/k_kart.c index 0af1ec658..4b02fc4d1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2343,6 +2343,65 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground) return finalspeed; } +angle_t K_MomentumAngle(mobj_t *mo) +{ + if (mo->momx || mo->momy) + { + return R_PointToAngle2(0, 0, mo->momx, mo->momy); + } + else + { + return mo->angle; // default to facing angle, rather than 0 + } +} + +void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics) +{ + const fixed_t ticaddfactor = mapobjectscale * 4; + + const fixed_t mo1speed = P_AproxDistance(P_AproxDistance(mo1->momx, mo1->momy), mo1->momz); + const fixed_t mo2speed = P_AproxDistance(P_AproxDistance(mo2->momx, mo2->momy), mo2->momz); + const fixed_t speeddiff = abs(mo1speed - mo2speed); + + //const angle_t mo1angle = K_MomentumAngle(mo1); + //const angle_t mo2angle = K_MomentumAngle(mo2); + + //angle_t anglediff = mo1angle - mo2angle; + fixed_t anglemul = FRACUNIT; + + INT32 tics1 = tics; + INT32 tics2 = tics; + + //if (anglediff > ANGLE_180) + //{ + //anglediff = InvAngle(anglediff); + //} + + //anglemul = FRACUNIT/2 + (FixedAngle(ANGLE_180 - anglediff) / 90); // x0.5 at 0, x1.5 at 90, x2.5 at 180 + + tics1 += FixedMul(speeddiff, anglemul) / ticaddfactor; // FixedMul(ticaddfactor, max(1, FRACUNIT + (mo2->scale - mo1->scale))); + tics2 += FixedMul(speeddiff, anglemul) / ticaddfactor; + + if (mo1->player && !mo2->player) + { + if (mo1->player->powers[pw_flashing] > 0 + || mo1->player->kartstuff[k_invincibilitytimer] > 0 + || mo1->player->kartstuff[k_growshrinktimer] > 0) + tics1 = 0; + } + + if (mo2->player && !mo1->player) + { + if (mo2->player->powers[pw_flashing] > 0 + || mo2->player->kartstuff[k_invincibilitytimer] > 0 + || mo2->player->kartstuff[k_growshrinktimer] > 0) + tics2 = 0; + } + + mo1->hitlag += tics1; + mo2->hitlag += tics2; +} + void K_DoInstashield(player_t *player) { mobj_t *layera; diff --git a/src/k_kart.h b/src/k_kart.h index d44be14f4..4529a4563 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -37,6 +37,8 @@ void K_KartMoveAnimation(player_t *player); void K_KartPlayerHUDUpdate(player_t *player); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_KartPlayerAfterThink(player_t *player); +angle_t K_MomentumAngle(mobj_t *mo); +void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics); void K_DoInstashield(player_t *player); void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflictor, boolean trapitem); void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor); diff --git a/src/p_map.c b/src/p_map.c index 69a638ce4..4b2283020 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1306,19 +1306,37 @@ static boolean PIT_CheckThing(mobj_t *thing) && !(thing->z + thing->height < tmthing->z || thing->z > tmthing->z + tmthing->height)) { if (tmthing->scale > thing->scale + (mapobjectscale/8)) // SRB2kart - Handle squishes first! + { + K_SetHitLagForObjects(tmthing, thing, 10); K_SquishPlayer(thing->player, tmthing, tmthing); + } else if (thing->scale > tmthing->scale + (mapobjectscale/8)) + { + K_SetHitLagForObjects(thing, tmthing, 10); K_SquishPlayer(tmthing->player, thing, tmthing); + } else if (tmthing->player->kartstuff[k_invincibilitytimer] && !thing->player->kartstuff[k_invincibilitytimer]) // SRB2kart - Then invincibility! + { + K_SetHitLagForObjects(tmthing, thing, 10); P_DamageMobj(thing, tmthing, tmthing, 1); + } else if (thing->player->kartstuff[k_invincibilitytimer] && !tmthing->player->kartstuff[k_invincibilitytimer]) + { + K_SetHitLagForObjects(thing, tmthing, 10); P_DamageMobj(tmthing, thing, thing, 1); + } else if ((tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) && !(thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) // SRB2kart - Then flame shield! + { + K_SetHitLagForObjects(tmthing, thing, 10); P_DamageMobj(thing, tmthing, tmthing, 1); + } else if ((thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) && !(tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) // SRB2kart - Then flame shield! + { + K_SetHitLagForObjects(tmthing, thing, 10); P_DamageMobj(tmthing, thing, thing, 1); + } /*if (G_BattleGametype() && (!G_GametypeHasTeams() || tmthing->player->ctfteam != thing->player->ctfteam)) { From 3dc2f4804fa081bd5775a73015adb1d52643c90e Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 2 Aug 2020 10:26:29 -0400 Subject: [PATCH 06/16] Angle & scale now impact how long you're in hitlag --- src/k_collide.c | 44 +++++++++++++++++++------------- src/k_kart.c | 68 ++++++++++++++++++++++++++++++++++--------------- src/k_kart.h | 2 +- src/p_map.c | 12 ++++----- src/r_things.c | 2 +- 5 files changed, 83 insertions(+), 45 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index 454ff9527..d6e457474 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -45,7 +45,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) else { // Player Damage - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); P_DamageMobj(t2, t1, t1->target, 1); K_KartBouncing(t2, t1, false, false); S_StartSound(t2, sfx_s3k7b); @@ -59,7 +59,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) || t2->type == MT_BALLHOG) { // Other Item Damage - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); S_StartSound(t2, t2->info->deathsound); P_KillMobj(t2, t1, t1); @@ -72,7 +72,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) } else if (t2->type == MT_SSMINE_SHIELD || t2->type == MT_SSMINE) { - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); damageitem = true; // Bomb death P_KillMobj(t2, t1, t1); @@ -84,7 +84,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) } else if (t2->flags & MF_SHOOTABLE) { - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); // Shootable damage P_DamageMobj(t2, t2, t1->target, 1); damageitem = true; @@ -142,7 +142,17 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) else { // Player Damage - K_SetHitLagForObjects(t1, t2, 2); + if (t1->type == MT_BALLHOG || (t1->type == MT_BANANA && t1->health > 1)) + { + // Long hitlag + K_SetHitLagForObjects(t1, t2, 10, false); + } + else + { + // Short hitlag + K_SetHitLagForObjects(t1, t2, 2, true); + } + K_SpinPlayer(t2->player, t1->target, 0, t1, (t1->type == MT_BANANA || t1->type == MT_BANANA_SHIELD)); } @@ -154,7 +164,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) || t2->type == MT_BALLHOG) { // Other Item Damage - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); S_StartSound(t2, t2->info->deathsound); P_KillMobj(t2, t1, t1); @@ -169,7 +179,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) else if (t2->flags & MF_SHOOTABLE) { // Shootable damage - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); P_DamageMobj(t2, t2, t1->target, 1); damageitem = true; } @@ -177,7 +187,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) if (damageitem) { // This Item Damage - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); S_StartSound(t1, t1->info->deathsound); P_KillMobj(t1, t2, t2); @@ -280,19 +290,19 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2) if ((t1->state >= &states[S_SSMINE1] && t1->state <= &states[S_SSMINE4]) || (t1->state >= &states[S_SSMINE_DEPLOY8] && t1->state <= &states[S_SSMINE_DEPLOY13])) { - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); P_KillMobj(t1, t2, t2); } else { - K_SetHitLagForObjects(t1, t2, 2); + K_SetHitLagForObjects(t1, t2, 2, true); K_PuntMine(t1, t2); } } else if (t2->type == MT_ORBINAUT || t2->type == MT_JAWZ || t2->type == MT_JAWZ_DUD || t2->type == MT_ORBINAUT_SHIELD || t2->type == MT_JAWZ_SHIELD) { - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); // Bomb death P_KillMobj(t1, t2, t2); @@ -306,7 +316,7 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2) } else if (t2->flags & MF_SHOOTABLE) { - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); // Bomb death P_KillMobj(t1, t2, t2); // Shootable damage @@ -325,19 +335,19 @@ boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2) if (t1->state == &states[S_MINEEXPLOSION1]) { - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); K_ExplodePlayer(t2->player, t1->target, t1); } else { - K_SetHitLagForObjects(t1, t2, 2); + K_SetHitLagForObjects(t1, t2, 2, true); K_SpinPlayer(t2->player, t1->target, 0, t1, false); } } else if (t2->flags & MF_SHOOTABLE) { // Shootable damage - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); P_DamageMobj(t2, t2, t1->target, 1); } @@ -354,7 +364,7 @@ boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2) if (t2->player->powers[pw_flashing] > 0 && t2->hitlag == 0) return true; - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); S_StartSound(NULL, sfx_bsnipe); // let all players hear it. @@ -368,7 +378,7 @@ boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2) } else if (t2->flags & MF_SHOOTABLE) { - K_SetHitLagForObjects(t1, t2, 10); + K_SetHitLagForObjects(t1, t2, 10, false); // Shootable damage P_KillMobj(t2, t2, t1->target); // This Item Damage diff --git a/src/k_kart.c b/src/k_kart.c index 94942abf7..5495c0130 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2375,39 +2375,63 @@ angle_t K_MomentumAngle(mobj_t *mo) } } -void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics) +void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fixed) { - const fixed_t ticaddfactor = mapobjectscale * 4; - - const fixed_t mo1speed = P_AproxDistance(P_AproxDistance(mo1->momx, mo1->momy), mo1->momz); - const fixed_t mo2speed = P_AproxDistance(P_AproxDistance(mo2->momx, mo2->momy), mo2->momz); - const fixed_t speeddiff = abs(mo1speed - mo2speed); - - //const angle_t mo1angle = K_MomentumAngle(mo1); - //const angle_t mo2angle = K_MomentumAngle(mo2); - - //angle_t anglediff = mo1angle - mo2angle; - fixed_t anglemul = FRACUNIT; - INT32 tics1 = tics; INT32 tics2 = tics; - //if (anglediff > ANGLE_180) - //{ - //anglediff = InvAngle(anglediff); - //} + if (fixed == false) + { + const fixed_t ticaddfactor = mapobjectscale * 8; + const INT32 mintics = tics; - //anglemul = FRACUNIT/2 + (FixedAngle(ANGLE_180 - anglediff) / 90); // x0.5 at 0, x1.5 at 90, x2.5 at 180 + const fixed_t mo1speed = P_AproxDistance(P_AproxDistance(mo1->momx, mo1->momy), mo1->momz); + const fixed_t mo2speed = P_AproxDistance(P_AproxDistance(mo2->momx, mo2->momy), mo2->momz); + const fixed_t speeddiff = mo2speed - mo1speed; - tics1 += FixedMul(speeddiff, anglemul) / ticaddfactor; // FixedMul(ticaddfactor, max(1, FRACUNIT + (mo2->scale - mo1->scale))); - tics2 += FixedMul(speeddiff, anglemul) / ticaddfactor; + const fixed_t scalediff = mo2->scale - mo1->scale; + + const angle_t mo1angle = K_MomentumAngle(mo1); + const angle_t mo2angle = K_MomentumAngle(mo2); + + angle_t anglediff = mo1angle - mo2angle; + fixed_t anglemul = FRACUNIT; + + if (anglediff > ANGLE_180) + { + anglediff = InvAngle(anglediff); + } + + anglemul = FRACUNIT + (AngleFixed(anglediff) / 180); // x1.0 at 0, x1.5 at 90, x2.0 at 180 + + /* + CONS_Printf("anglemul: %f\n", FIXED_TO_FLOAT(anglemul)); + CONS_Printf("speeddiff: %f\n", FIXED_TO_FLOAT(speeddiff)); + CONS_Printf("scalediff: %f\n", FIXED_TO_FLOAT(scalediff)); + */ + + tics1 += FixedMul(speeddiff, FixedMul(anglemul, FRACUNIT + scalediff)) / ticaddfactor; + tics2 += FixedMul(-speeddiff, FixedMul(anglemul, FRACUNIT - scalediff)) / ticaddfactor; + + if (tics1 < mintics) + { + tics1 = mintics; + } + + if (tics2 < mintics) + { + tics2 = mintics; + } + } if (mo1->player && !mo2->player) { if (mo1->player->powers[pw_flashing] > 0 || mo1->player->kartstuff[k_invincibilitytimer] > 0 || mo1->player->kartstuff[k_growshrinktimer] > 0) + { tics1 = 0; + } } if (mo2->player && !mo1->player) @@ -2415,9 +2439,13 @@ void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics) if (mo2->player->powers[pw_flashing] > 0 || mo2->player->kartstuff[k_invincibilitytimer] > 0 || mo2->player->kartstuff[k_growshrinktimer] > 0) + { tics2 = 0; + } } + //CONS_Printf("tics1: %d, tics2: %d\n", tics1, tics2); + mo1->hitlag += tics1; mo2->hitlag += tics2; } diff --git a/src/k_kart.h b/src/k_kart.h index b2ab04c23..f632da842 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -40,7 +40,7 @@ void K_KartPlayerHUDUpdate(player_t *player); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_KartPlayerAfterThink(player_t *player); angle_t K_MomentumAngle(mobj_t *mo); -void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics); +void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fixed); void K_DoInstashield(player_t *player); void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflictor, boolean trapitem); void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor); diff --git a/src/p_map.c b/src/p_map.c index 4b2283020..5d4f4c8fe 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1307,34 +1307,34 @@ static boolean PIT_CheckThing(mobj_t *thing) { if (tmthing->scale > thing->scale + (mapobjectscale/8)) // SRB2kart - Handle squishes first! { - K_SetHitLagForObjects(tmthing, thing, 10); + K_SetHitLagForObjects(tmthing, thing, 10, false); K_SquishPlayer(thing->player, tmthing, tmthing); } else if (thing->scale > tmthing->scale + (mapobjectscale/8)) { - K_SetHitLagForObjects(thing, tmthing, 10); + K_SetHitLagForObjects(thing, tmthing, 10, false); K_SquishPlayer(tmthing->player, thing, tmthing); } else if (tmthing->player->kartstuff[k_invincibilitytimer] && !thing->player->kartstuff[k_invincibilitytimer]) // SRB2kart - Then invincibility! { - K_SetHitLagForObjects(tmthing, thing, 10); + K_SetHitLagForObjects(tmthing, thing, 10, false); P_DamageMobj(thing, tmthing, tmthing, 1); } else if (thing->player->kartstuff[k_invincibilitytimer] && !tmthing->player->kartstuff[k_invincibilitytimer]) { - K_SetHitLagForObjects(thing, tmthing, 10); + K_SetHitLagForObjects(thing, tmthing, 10, false); P_DamageMobj(tmthing, thing, thing, 1); } else if ((tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) && !(thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) // SRB2kart - Then flame shield! { - K_SetHitLagForObjects(tmthing, thing, 10); + K_SetHitLagForObjects(tmthing, thing, 10, false); P_DamageMobj(thing, tmthing, tmthing, 1); } else if ((thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) && !(tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) // SRB2kart - Then flame shield! { - K_SetHitLagForObjects(tmthing, thing, 10); + K_SetHitLagForObjects(tmthing, thing, 10, false); P_DamageMobj(tmthing, thing, thing, 1); } diff --git a/src/r_things.c b/src/r_things.c index 806326d1f..bea298e71 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1487,7 +1487,7 @@ static void R_ProjectSprite(mobj_t *thing) // hitlag vibrating if (thing->hitlag > 0) { - fixed_t mul = (thing->hitlag * FRACUNIT) / 5; + fixed_t mul = thing->hitlag * (FRACUNIT / 20); if (leveltime & 1) { From 31b99de407861f116ba03c089df8d98a6d7440b2 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 2 Aug 2020 11:40:21 -0400 Subject: [PATCH 07/16] Use K_MomentumAngle for all instances of needing momentum angle for an object This means we will never ever have any "standing still defaults to angle 0" issues again :) --- src/k_kart.c | 28 +++++++++++----------------- src/p_enemy.c | 6 +++--- src/p_map.c | 2 +- src/p_mobj.c | 13 +++++-------- src/p_spec.c | 8 +++----- src/p_user.c | 4 ++-- 6 files changed, 25 insertions(+), 36 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 5495c0130..e56618120 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1450,8 +1450,8 @@ static void K_UpdateDraft(player_t *player) continue; #ifndef EASYDRAFTTEST - yourangle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); - theirangle = R_PointToAngle2(0, 0, players[i].mo->momx, players[i].mo->momy); + yourangle = K_MomentumAngle(player->mo); + theirangle = K_MomentumAngle(players[i].mo); diff = R_PointToAngle2(player->mo->x, player->mo->y, players[i].mo->x, players[i].mo->y) - yourangle; if (diff > ANGLE_180) @@ -2019,7 +2019,7 @@ void K_PlayPowerGloatSound(mobj_t *source) void K_MomentumToFacing(player_t *player) { - angle_t dangle = player->mo->angle - R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); + angle_t dangle = player->mo->angle - K_MomentumAngle(player->mo); if (dangle > ANGLE_180) dangle = InvAngle(dangle); @@ -3445,7 +3445,7 @@ static void K_SpawnAIZDust(player_t *player) if (player->speed <= K_GetKartSpeed(player, false)) return; - travelangle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); + travelangle = K_MomentumAngle(player->mo); //S_StartSound(player->mo, sfx_s3k47); { @@ -3716,7 +3716,7 @@ void K_DriftDustHandling(mobj_t *spawner) if (P_AproxDistance(spawner->momx, spawner->momy) < 5*spawner->scale) return; - anglediff = abs((signed)(spawner->angle - R_PointToAngle2(0, 0, spawner->momx, spawner->momy))); + anglediff = abs((signed)(spawner->angle - K_MomentumAngle(spawner))); } if (anglediff > ANGLE_180) @@ -4018,7 +4018,7 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map void K_PuntMine(mobj_t *thismine, mobj_t *punter) { - angle_t fa = R_PointToAngle2(0, 0, punter->momx, punter->momy) >> ANGLETOFINESHIFT; + angle_t fa = K_MomentumAngle(punter) >> ANGLETOFINESHIFT; fixed_t z = 30*mapobjectscale + punter->momz; fixed_t spd; mobj_t *mine; @@ -5604,7 +5604,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) MT_FASTLINE); P_SetTarget(&fast->target, player->mo); - fast->angle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); + fast->angle = K_MomentumAngle(player->mo); fast->momx = 3*player->mo->momx/4; fast->momy = 3*player->mo->momy/4; fast->momz = 3*player->mo->momz/4; @@ -6154,18 +6154,12 @@ static waypoint_t *K_GetPlayerNextWaypoint(player_t *player) { boolean finishlinehack = false; angle_t playerangle = player->mo->angle; - angle_t momangle = player->mo->angle; + angle_t momangle = K_MomentumAngle(player->mo); angle_t angletowaypoint = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->mobj->x, waypoint->mobj->y); angle_t angledelta = ANGLE_MAX; angle_t momdelta = ANGLE_MAX; - if (player->mo->momx != 0 || player->mo->momy != 0) - { - // Defaults to facing angle if you're not moving. - momangle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); - } - angledelta = playerangle - angletowaypoint; if (angledelta > ANGLE_180) { @@ -6664,7 +6658,7 @@ static void K_KartDrift(player_t *player, boolean onground) { if (player->kartstuff[k_driftcharge] < 0 || player->kartstuff[k_driftcharge] >= dsone) { - angle_t pushdir = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); + angle_t pushdir = K_MomentumAngle(player->mo); S_StartSound(player->mo, sfx_s23c); //K_SpawnDashDustRelease(player); @@ -7045,7 +7039,7 @@ static void K_KartSpindash(player_t *player) mobj_t *grease; grease = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_TIREGREASE); P_SetTarget(&grease->target, player->mo); - grease->angle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); + grease->angle = K_MomentumAngle(player->mo); grease->extravalue1 = i; } } @@ -7615,7 +7609,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (!onground) { P_Thrust( - player->mo, R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy), + player->mo, K_MomentumAngle(player->mo), FixedMul(player->mo->scale, K_GetKartGameSpeedScalar(gamespeed)) ); } diff --git a/src/p_enemy.c b/src/p_enemy.c index 80189f8e7..3d3735204 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8393,7 +8393,7 @@ void A_JawzChase(mobj_t *actor) if (!actor->tracer) { - actor->angle = R_PointToAngle2(0, 0, actor->momx, actor->momy); + actor->angle = K_MomentumAngle(actor); } P_Thrust(actor, actor->angle, thrustamount); @@ -8525,7 +8525,7 @@ static void SpawnSPBAIZDust(mobj_t *mo, INT32 dir) if (mo->eflags & MFE_VERTICALFLIP) sz = mo->ceilingz; - travelangle = R_PointToAngle2(0, 0, mo->momx, mo->momy); + travelangle = K_MomentumAngle(mo); if (leveltime & 1 && abs(mo->z - sz) < FRACUNIT*64) { newx = mo->x + P_ReturnThrustX(mo, travelangle - (dir*ANGLE_45), FixedMul(24*FRACUNIT, mo->scale)); @@ -8555,7 +8555,7 @@ static void SpawnSPBSpeedLines(mobj_t *actor) MT_FASTLINE); P_SetTarget(&fast->target, actor); - fast->angle = R_PointToAngle2(0, 0, actor->momx, actor->momy); + fast->angle = K_MomentumAngle(actor); fast->color = SKINCOLOR_RED; fast->colorized = true; K_MatchGenericExtraFlags(fast, actor); diff --git a/src/p_map.c b/src/p_map.c index 5d4f4c8fe..aeed64748 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -344,7 +344,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object) mobj_t *grease; grease = P_SpawnMobj(object->x, object->y, object->z, MT_TIREGREASE); P_SetTarget(&grease->target, object); - grease->angle = R_PointToAngle2(0, 0, object->momx, object->momy); + grease->angle = K_MomentumAngle(object); grease->extravalue1 = i; } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 027e597c6..da4aecee3 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8001,7 +8001,7 @@ void P_MobjThinker(mobj_t *mobj) frictionsafety = FRACUNIT; } - mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy); + mobj->angle = K_MomentumAngle(mobj); if (mobj->health <= 5) { INT32 i; @@ -8103,7 +8103,7 @@ void P_MobjThinker(mobj_t *mobj) thrustamount = beatfriction + FixedDiv(mobj->movefactor - currentspeed, frictionsafety); } - mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy); + mobj->angle = K_MomentumAngle(mobj); P_Thrust(mobj, mobj->angle, thrustamount); if (P_MobjTouchingSectorSpecial(mobj, 3, 1, true)) @@ -8266,7 +8266,7 @@ void P_MobjThinker(mobj_t *mobj) //mobj->angle = mobj->target->angle; { - angle_t angle = R_PointToAngle2(0, 0, mobj->target->momx, mobj->target->momy); + angle_t angle = K_MomentumAngle(mobj->target); fixed_t nudge; mobj->angle = angle; @@ -8545,7 +8545,7 @@ void P_MobjThinker(mobj_t *mobj) z += mobj->target->height; if (mobj->target->momx || mobj->target->momy) - ang = R_PointToAngle2(0, 0, mobj->target->momx, mobj->target->momy); + ang = K_MomentumAngle(mobj->target); if (mobj->extravalue1) ang = (signed)(ang - off); @@ -8841,10 +8841,7 @@ void P_MobjThinker(mobj_t *mobj) } P_TeleportMove(mobj, destx, desty, mobj->target->z); - if (mobj->target->momx || mobj->target->momy) - mobj->angle = R_PointToAngle2(0, 0, mobj->target->momx, mobj->target->momy); - else - mobj->angle = mobj->target->angle; + mobj->angle = K_MomentumAngle(mobj->target); if (underlayst != S_NULL) { diff --git a/src/p_spec.c b/src/p_spec.c index 1e3c30299..326ae930f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4021,8 +4021,7 @@ DoneSection2: { const fixed_t hscale = mapobjectscale + (mapobjectscale - player->mo->scale); const fixed_t minspeed = 24*hscale; - angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle; - // if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0 + angle_t pushangle = K_MomentumAngle(player->mo); if (player->mo->eflags & MFE_SPRUNG) break; @@ -4044,8 +4043,7 @@ DoneSection2: const fixed_t hscale = mapobjectscale + (mapobjectscale - player->mo->scale); const fixed_t minspeed = 24*hscale; const fixed_t maxspeed = 28*hscale; - angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle; - // if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0 + angle_t pushangle = K_MomentumAngle(player->mo); if (player->mo->eflags & MFE_SPRUNG) break; @@ -4087,7 +4085,7 @@ DoneSection2: } lineangle = K_ReflectAngle( - R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy), lineangle, + K_MomentumAngle(player->mo), lineangle, playerspeed, linespeed ); diff --git a/src/p_user.c b/src/p_user.c index 3750c1378..684a00e5c 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6061,7 +6061,7 @@ static void P_MovePlayer(player_t *player) if (trailScale > 0) { - const angle_t forwardangle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); + const angle_t forwardangle = K_MomentumAngle(player->mo); const fixed_t playerVisualRadius = player->mo->radius + 8*FRACUNIT; const size_t numFrames = S_WATERTRAIL8 - S_WATERTRAIL1; const statenum_t curOverlayFrame = S_WATERTRAIL1 + (leveltime % numFrames); @@ -8530,7 +8530,7 @@ static void P_HandleFollower(player_t *player) player->follower->drawflags |= MFD_DONTDRAW; if (player->speed && (player->follower->momx || player->follower->momy)) - player->follower->angle = R_PointToAngle2(0, 0, player->follower->momx, player->follower->momy); + player->follower->angle = K_MomentumAngle(player->follower); // if we're moving let's make the angle the direction we're moving towards. This is to avoid drifting / reverse looking awkward. // Make sure the follower itself is also moving however, otherwise we'll be facing angle 0 From 9434dd3ae3c1abd1a2911145203f4ef6048556f1 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 8 Nov 2020 02:10:53 -0500 Subject: [PATCH 08/16] Make the stuff that lost it use K_MomentumAngle again --- src/k_kart.c | 4 ++-- src/p_mobj.c | 24 ++++++++++-------------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 6ecdc7223..68f8c70c6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3262,7 +3262,7 @@ void K_SpawnBoostTrail(player_t *player) if (player->kartstuff[k_drift] != 0) travelangle = player->mo->angle; else - travelangle = R_PointToAngle2(0, 0, player->rmomx, player->rmomy); + travelangle = K_MomentumAngle(player->mo); for (i = 0; i < 2; i++) { @@ -3354,7 +3354,7 @@ void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent) mo->z, MT_WIPEOUTTRAIL); P_SetTarget(&dust->target, mo); - dust->angle = R_PointToAngle2(0,0,mo->momx,mo->momy); + dust->angle = K_MomentumAngle(mo); dust->destscale = mo->scale; P_SetScale(dust, mo->scale); K_FlipFromObject(dust, mo); diff --git a/src/p_mobj.c b/src/p_mobj.c index bd56665ae..3e595dec8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1620,8 +1620,10 @@ void P_XYMovement(mobj_t *mo) relation = transferslope->xydirection - R_PointToAngle2(0, 0, mo->momx, mo->momy); else // Give it for free, I guess. relation = ANGLE_90; + transfermomz = FixedMul(transfermomz, abs(FINESINE((relation >> ANGLETOFINESHIFT) & FINEMASK))); + if (P_MobjFlip(mo)*(transfermomz - mo->momz) > 2*FRACUNIT) // Do the actual launch! { mo->momz = transfermomz; @@ -1696,7 +1698,7 @@ void P_XYMovement(mobj_t *mo) if (oldslope != mo->standingslope) { // First, compare different slopes angle_t oldangle, newangle; - angle_t moveangle = R_PointToAngle2(0, 0, mo->momx, mo->momy); + angle_t moveangle = K_MomentumAngle(mo); oldangle = FixedMul((signed)oldslope->zangle, FINECOSINE((moveangle - oldslope->xydirection) >> ANGLETOFINESHIFT)); @@ -1728,7 +1730,7 @@ void P_XYMovement(mobj_t *mo) P_SlopeLaunch(mo); } } else if (moved && mo->standingslope && predictedz) { - angle_t moveangle = R_PointToAngle2(0, 0, mo->momx, mo->momy); + angle_t moveangle = K_MomentumAngle(mo); angle_t newangle = FixedMul((signed)mo->standingslope->zangle, FINECOSINE((moveangle - mo->standingslope->xydirection) >> ANGLETOFINESHIFT)); /*CONS_Printf("flat to angle %f - predicted z of %f\n", @@ -6137,7 +6139,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) frictionsafety = FRACUNIT; } - mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy); + mobj->angle = K_MomentumAngle(mobj); if (mobj->health <= 5) { INT32 i; @@ -6239,7 +6241,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) thrustamount = beatfriction + FixedDiv(mobj->movefactor - currentspeed, frictionsafety); } - mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy); + mobj->angle = K_MomentumAngle(mobj); P_Thrust(mobj, mobj->angle, thrustamount); if (P_MobjTouchingSectorSpecial(mobj, 3, 1, true)) @@ -6402,7 +6404,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) //mobj->angle = mobj->target->angle; { - angle_t angle = R_PointToAngle2(0, 0, mobj->target->momx, mobj->target->momy); + angle_t angle = K_MomentumAngle(mobj->target); fixed_t nudge; mobj->angle = angle; @@ -6670,7 +6672,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) { const angle_t off = FixedAngle(40*FRACUNIT); - angle_t ang = mobj->target->angle; + angle_t ang = K_MomentumAngle(mobj->target); fixed_t z; UINT8 trans = (mobj->target->player->kartstuff[k_tiregrease] * (NUMTRANSMAPS+1)) / greasetics; @@ -6683,9 +6685,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (mobj->eflags & MFE_VERTICALFLIP) z += mobj->target->height; - if (mobj->target->momx || mobj->target->momy) - ang = R_PointToAngle2(0, 0, mobj->target->momx, mobj->target->momy); - if (mobj->extravalue1) ang = (signed)(ang - off); else @@ -6980,10 +6979,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } P_TeleportMove(mobj, destx, desty, mobj->target->z); - if (mobj->target->momx || mobj->target->momy) - mobj->angle = R_PointToAngle2(0, 0, mobj->target->momx, mobj->target->momy); - else - mobj->angle = mobj->target->angle; + mobj->angle = K_MomentumAngle(mobj->target); if (underlayst != S_NULL) { @@ -7860,7 +7856,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->momx = (23*mobj->momx)/24; mobj->momy = (23*mobj->momy)/24; - mobj->angle = R_PointToAngle2(0,0,mobj->momx,mobj->momy); + mobj->angle = K_MomentumAngle(mobj); if ((mobj->z - mobj->floorz) < (24*mobj->scale) && (leveltime % 3 != 0)) { From 8b5a78114ea989d0cf2d84da1a564c9b0bd616f6 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 9 Nov 2020 21:35:08 -0500 Subject: [PATCH 09/16] Hitlag occurs on registered damage instead of being before damage calls --- src/k_collide.c | 32 -------------------------------- src/k_kart.c | 24 ++---------------------- src/p_inter.c | 33 +++++++++++++++++++++++++-------- src/p_map.c | 6 ------ 4 files changed, 27 insertions(+), 68 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index f5e9f96b5..00bd9c6b3 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -45,7 +45,6 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) else { // Player Damage - K_SetHitLagForObjects(t1, t2, 10, false); P_DamageMobj(t2, t1, t1->target, 1, DMG_WIPEOUT); K_KartBouncing(t2, t1, false, false); S_StartSound(t2, sfx_s3k7b); @@ -59,7 +58,6 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) || t2->type == MT_BALLHOG) { // Other Item Damage - K_SetHitLagForObjects(t1, t2, 10, false); S_StartSound(t2, t2->info->deathsound); P_KillMobj(t2, t1, t1, DMG_NORMAL); @@ -72,7 +70,6 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) } else if (t2->type == MT_SSMINE_SHIELD || t2->type == MT_SSMINE) { - K_SetHitLagForObjects(t1, t2, 10, false); damageitem = true; // Bomb death P_KillMobj(t2, t1, t1, DMG_NORMAL); @@ -84,7 +81,6 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) } else if (t2->flags & MF_SHOOTABLE) { - K_SetHitLagForObjects(t1, t2, 10, false); // Shootable damage P_DamageMobj(t2, t1, t1->target, 1, DMG_NORMAL); damageitem = true; @@ -141,18 +137,6 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) } else { - // Player Damage - if (t1->type == MT_BALLHOG || (t1->type == MT_BANANA && t1->health > 1)) - { - // Long hitlag - K_SetHitLagForObjects(t1, t2, 10, false); - } - else - { - // Short hitlag - K_SetHitLagForObjects(t1, t2, 2, true); - } - P_DamageMobj(t2, t1, t1->target, 1, DMG_NORMAL); } @@ -164,8 +148,6 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) || t2->type == MT_BALLHOG) { // Other Item Damage - K_SetHitLagForObjects(t1, t2, 10, false); - S_StartSound(t2, t2->info->deathsound); P_KillMobj(t2, t1, t1, DMG_NORMAL); @@ -179,7 +161,6 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) else if (t2->flags & MF_SHOOTABLE) { // Shootable damage - K_SetHitLagForObjects(t1, t2, 10, false); P_DamageMobj(t2, t1, t1->target, 1, DMG_NORMAL); damageitem = true; } @@ -187,8 +168,6 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) if (damageitem) { // This Item Damage - K_SetHitLagForObjects(t1, t2, 10, false); - S_StartSound(t1, t1->info->deathsound); P_KillMobj(t1, t2, t2, DMG_NORMAL); @@ -290,7 +269,6 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2) if ((t1->state >= &states[S_SSMINE1] && t1->state <= &states[S_SSMINE4]) || (t1->state >= &states[S_SSMINE_DEPLOY8] && t1->state <= &states[S_SSMINE_DEPLOY13])) { - K_SetHitLagForObjects(t1, t2, 10, false); P_KillMobj(t1, t2, t2, DMG_NORMAL); } else @@ -302,8 +280,6 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2) else if (t2->type == MT_ORBINAUT || t2->type == MT_JAWZ || t2->type == MT_JAWZ_DUD || t2->type == MT_ORBINAUT_SHIELD || t2->type == MT_JAWZ_SHIELD) { - K_SetHitLagForObjects(t1, t2, 10, false); - // Bomb death P_KillMobj(t1, t2, t2, DMG_NORMAL); @@ -316,7 +292,6 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2) } else if (t2->flags & MF_SHOOTABLE) { - K_SetHitLagForObjects(t1, t2, 10, false); // Bomb death P_KillMobj(t1, t2, t2, DMG_NORMAL); // Shootable damage @@ -335,19 +310,16 @@ boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2) if (t1->state == &states[S_MINEEXPLOSION1]) { - K_SetHitLagForObjects(t1, t2, 10, false); P_DamageMobj(t2, t1, t1->target, 1, DMG_EXPLODE); } else { - K_SetHitLagForObjects(t1, t2, 2, true); P_DamageMobj(t2, t1, t1->target, 1, DMG_NORMAL); } } else if (t2->flags & MF_SHOOTABLE) { // Shootable damage - K_SetHitLagForObjects(t1, t2, 10, false); P_DamageMobj(t2, t1, t1->target, 1, DMG_NORMAL); } @@ -364,8 +336,6 @@ boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2) if (t2->player->powers[pw_flashing] > 0 && t2->hitlag == 0) return true; - K_SetHitLagForObjects(t1, t2, 10, false); - S_StartSound(NULL, sfx_bsnipe); // let all players hear it. HU_SetCEchoFlags(0); @@ -378,8 +348,6 @@ boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2) } else if (t2->flags & MF_SHOOTABLE) { - K_SetHitLagForObjects(t1, t2, 10, false); - // Shootable damage P_KillMobj(t2, t2, t1->target, DMG_NORMAL); // This item damage diff --git a/src/k_kart.c b/src/k_kart.c index 68f8c70c6..2cdb731cd 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2384,8 +2384,8 @@ void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fixed) const fixed_t ticaddfactor = mapobjectscale * 8; const INT32 mintics = tics; - const fixed_t mo1speed = P_AproxDistance(P_AproxDistance(mo1->momx, mo1->momy), mo1->momz); - const fixed_t mo2speed = P_AproxDistance(P_AproxDistance(mo2->momx, mo2->momy), mo2->momz); + const fixed_t mo1speed = FixedHypot(FixedHypot(mo1->momx, mo1->momy), mo1->momz); + const fixed_t mo2speed = FixedHypot(FixedHypot(mo2->momx, mo2->momy), mo2->momz); const fixed_t speeddiff = mo2speed - mo1speed; const fixed_t scalediff = mo2->scale - mo1->scale; @@ -2423,26 +2423,6 @@ void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fixed) } } - if (mo1->player && !mo2->player) - { - if (mo1->player->powers[pw_flashing] > 0 - || mo1->player->kartstuff[k_invincibilitytimer] > 0 - || mo1->player->kartstuff[k_growshrinktimer] > 0) - { - tics1 = 0; - } - } - - if (mo2->player && !mo1->player) - { - if (mo2->player->powers[pw_flashing] > 0 - || mo2->player->kartstuff[k_invincibilitytimer] > 0 - || mo2->player->kartstuff[k_growshrinktimer] > 0) - { - tics2 = 0; - } - } - //CONS_Printf("tics1: %d, tics2: %d\n", tics1, tics2); mo1->hitlag += tics1; diff --git a/src/p_inter.c b/src/p_inter.c index b0dd45156..cc6bb89e7 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1075,6 +1075,8 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget if (LUAh_MobjDeath(target, inflictor, source, damagetype) || P_MobjWasRemoved(target)) return; + //K_SetHitLagForObjects(target, inflictor, 15, false); + // SRB2kart // I wish I knew a better way to do this if (target->target && target->target->player && target->target->player->mo) @@ -1646,8 +1648,10 @@ static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *sou return true; } -static boolean P_KillPlayer(player_t *player, UINT8 type) +static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, UINT8 type) { + (void)source; + if (player->exiting) { player->mo->destscale = 1; @@ -1668,6 +1672,8 @@ static boolean P_KillPlayer(player_t *player, UINT8 type) break; } + K_SetHitLagForObjects(player->mo, inflictor, 15, false); + player->pflags &= ~PF_SLIDING; player->powers[pw_carry] = CR_NONE; @@ -1753,6 +1759,9 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da player_t *player; boolean force = false; + INT32 laglength = 2; + boolean lagfixed = true; + if (objectplacing) return false; @@ -1760,13 +1769,16 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da return false; // Spectator handling - if (multiplayer) - { - if (damagetype != DMG_SPECTATOR && target->player && target->player->spectator) - return false; + if (damagetype != DMG_SPECTATOR && target->player && target->player->spectator) + return false; - if (source && source->player && source->player->spectator) - return false; + if (source && source->player && source->player->spectator) + return false; + + if ((damagetype & DMG_TYPEMASK) != DMG_NORMAL && (damagetype & DMG_TYPEMASK) != DMG_STING) + { + laglength = 10; + lagfixed = false; } // Everything above here can't be forced. @@ -1830,7 +1842,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da // Instant-Death if ((damagetype & DMG_DEATHMASK)) { - if (!P_KillPlayer(player, damagetype)) + if (!P_KillPlayer(player, inflictor, source, damagetype)) return false; } else if (LUAh_MobjDamage(target, inflictor, source, damage, damagetype)) @@ -1941,6 +1953,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da } player->kartstuff[k_instashield] = 15; + K_SetHitLagForObjects(target, inflictor, laglength, lagfixed); return true; } } @@ -1962,12 +1975,16 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (source && source->player && target) G_GhostAddHit((INT32) (source->player - players), target); + K_SetHitLagForObjects(target, inflictor, laglength, lagfixed); + if (target->health <= 0) { P_KillMobj(target, inflictor, source, damagetype); return true; } + //K_SetHitLagForObjects(target, inflictor, laglength, lagfixed); + if (player) P_ResetPlayer(target->player); else diff --git a/src/p_map.c b/src/p_map.c index 376d70f20..48e274ebb 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1218,34 +1218,28 @@ static boolean PIT_CheckThing(mobj_t *thing) { if (tmthing->scale > thing->scale + (mapobjectscale/8)) // SRB2kart - Handle squishes first! { - K_SetHitLagForObjects(tmthing, thing, 10, false); P_DamageMobj(thing, tmthing, tmthing, 1, DMG_SQUISH); } else if (thing->scale > tmthing->scale + (mapobjectscale/8)) { - K_SetHitLagForObjects(thing, tmthing, 10, false); P_DamageMobj(tmthing, thing, thing, 1, DMG_SQUISH); } else if (tmthing->player->kartstuff[k_invincibilitytimer] && !thing->player->kartstuff[k_invincibilitytimer]) // SRB2kart - Then invincibility! { - K_SetHitLagForObjects(tmthing, thing, 10, false); P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT); } else if (thing->player->kartstuff[k_invincibilitytimer] && !tmthing->player->kartstuff[k_invincibilitytimer]) { - K_SetHitLagForObjects(thing, tmthing, 10, false); P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT); } else if ((tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) && !(thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) // SRB2kart - Then flame shield! { - K_SetHitLagForObjects(tmthing, thing, 10, false); P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT); } else if ((thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) && !(tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) { - K_SetHitLagForObjects(thing, tmthing, 10, false); P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT); } } From 5f12dd156c479e7be0161393d50d88f58c37c608 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 10 Nov 2020 21:49:11 -0500 Subject: [PATCH 10/16] Fix hitlag crashing for level damage --- src/k_kart.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index bc275e19c..0df4cacd2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2376,10 +2376,13 @@ angle_t K_MomentumAngle(mobj_t *mo) void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fixed) { + boolean mo1valid = (mo1 && !P_MobjWasRemoved(mo1)); + boolean mo2valid = (mo2 && !P_MobjWasRemoved(mo2)); + INT32 tics1 = tics; INT32 tics2 = tics; - if (fixed == false) + if (mo1valid == true && mo2valid == true && fixed == false) { const fixed_t ticaddfactor = mapobjectscale * 8; const INT32 mintics = tics; @@ -2425,8 +2428,15 @@ void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fixed) //CONS_Printf("tics1: %d, tics2: %d\n", tics1, tics2); - mo1->hitlag += tics1; - mo2->hitlag += tics2; + if (mo1valid == true) + { + mo1->hitlag += tics1; + } + + if (mo2valid == true) + { + mo2->hitlag += tics2; + } } void K_DoInstashield(player_t *player) From c86d496fefb012653ec35c7b76172eda5cee0f0f Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 10 Nov 2020 23:02:58 -0500 Subject: [PATCH 11/16] Removed fixed length hit lag --- src/k_collide.c | 2 +- src/k_kart.c | 4 ++-- src/k_kart.h | 2 +- src/p_inter.c | 14 ++++++-------- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index 00bd9c6b3..13b17e981 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -273,7 +273,7 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2) } else { - K_SetHitLagForObjects(t1, t2, 2, true); + K_SetHitLagForObjects(t1, t2, 2); K_PuntMine(t1, t2); } } diff --git a/src/k_kart.c b/src/k_kart.c index 0df4cacd2..8512649b3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2374,7 +2374,7 @@ angle_t K_MomentumAngle(mobj_t *mo) } } -void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fixed) +void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics) { boolean mo1valid = (mo1 && !P_MobjWasRemoved(mo1)); boolean mo2valid = (mo2 && !P_MobjWasRemoved(mo2)); @@ -2382,7 +2382,7 @@ void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fixed) INT32 tics1 = tics; INT32 tics2 = tics; - if (mo1valid == true && mo2valid == true && fixed == false) + if (mo1valid == true && mo2valid == true) { const fixed_t ticaddfactor = mapobjectscale * 8; const INT32 mintics = tics; diff --git a/src/k_kart.h b/src/k_kart.h index dd390f362..408ed3303 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -40,7 +40,7 @@ void K_KartPlayerHUDUpdate(player_t *player); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_KartPlayerAfterThink(player_t *player); angle_t K_MomentumAngle(mobj_t *mo); -void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fixed); +void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics); void K_DoInstashield(player_t *player); void K_BattleHitPlayer(player_t *player, player_t *victim, UINT8 points, boolean reducewanted); void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source); diff --git a/src/p_inter.c b/src/p_inter.c index cc6bb89e7..499ba5713 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1075,7 +1075,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget if (LUAh_MobjDeath(target, inflictor, source, damagetype) || P_MobjWasRemoved(target)) return; - //K_SetHitLagForObjects(target, inflictor, 15, false); + //K_SetHitLagForObjects(target, inflictor, 15); // SRB2kart // I wish I knew a better way to do this @@ -1672,7 +1672,7 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, break; } - K_SetHitLagForObjects(player->mo, inflictor, 15, false); + K_SetHitLagForObjects(player->mo, inflictor, 15); player->pflags &= ~PF_SLIDING; player->powers[pw_carry] = CR_NONE; @@ -1759,8 +1759,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da player_t *player; boolean force = false; - INT32 laglength = 2; - boolean lagfixed = true; + INT32 laglength = 3; if (objectplacing) return false; @@ -1778,7 +1777,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if ((damagetype & DMG_TYPEMASK) != DMG_NORMAL && (damagetype & DMG_TYPEMASK) != DMG_STING) { laglength = 10; - lagfixed = false; } // Everything above here can't be forced. @@ -1953,7 +1951,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da } player->kartstuff[k_instashield] = 15; - K_SetHitLagForObjects(target, inflictor, laglength, lagfixed); + K_SetHitLagForObjects(target, inflictor, laglength); return true; } } @@ -1975,7 +1973,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (source && source->player && target) G_GhostAddHit((INT32) (source->player - players), target); - K_SetHitLagForObjects(target, inflictor, laglength, lagfixed); + K_SetHitLagForObjects(target, inflictor, laglength); if (target->health <= 0) { @@ -1983,7 +1981,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da return true; } - //K_SetHitLagForObjects(target, inflictor, laglength, lagfixed); + //K_SetHitLagForObjects(target, inflictor, laglength); if (player) P_ResetPlayer(target->player); From da59009ba196cdbb642814ec9e24d849d6230459 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 10 Nov 2020 23:12:17 -0500 Subject: [PATCH 12/16] More extreme hitlag vibration --- src/hardware/hw_main.c | 4 ++-- src/hardware/hw_md2.c | 2 +- src/r_things.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index c8905c689..5f1d3e74f 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3640,7 +3640,7 @@ static void HWR_DrawDropShadow(mobj_t *thing, fixed_t scale) // hitlag vibrating if (thing->hitlag > 0) { - fixed_t mul = thing->hitlag * (FRACUNIT / 20); + fixed_t mul = thing->hitlag * (FRACUNIT / 10); if (leveltime & 1) { @@ -4925,7 +4925,7 @@ static void HWR_ProjectSprite(mobj_t *thing) // hitlag vibrating if (thing->hitlag > 0) { - fixed_t mul = thing->hitlag * (FRACUNIT / 20); + fixed_t mul = thing->hitlag * (FRACUNIT / 10); if (leveltime & 1) { diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 0a39092f4..f68771a1b 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1361,7 +1361,7 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) // hitlag vibrating if (spr->mobj->hitlag > 0) { - fixed_t mul = spr->mobj->hitlag * (FRACUNIT / 20); + fixed_t mul = spr->mobj->hitlag * (FRACUNIT / 10); if (leveltime & 1) { diff --git a/src/r_things.c b/src/r_things.c index d337bd219..9788d916b 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1467,7 +1467,7 @@ static void R_ProjectSprite(mobj_t *thing) // hitlag vibrating if (thing->hitlag > 0) { - fixed_t mul = thing->hitlag * (FRACUNIT / 20); + fixed_t mul = thing->hitlag * (FRACUNIT / 10); if (leveltime & 1) { From bd495c7f55130ad9380f94707564bb57636984a7 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 10 Nov 2020 23:13:32 -0500 Subject: [PATCH 13/16] Increase hitlag for bananas from 2 to 5, use 10 for normal damage by default instead Ballhogs & Lightning Shield get intense hitlag again --- src/p_inter.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 499ba5713..acd8f0433 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1759,7 +1759,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da player_t *player; boolean force = false; - INT32 laglength = 3; + INT32 laglength = 10; if (objectplacing) return false; @@ -1774,9 +1774,10 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (source && source->player && source->player->spectator) return false; - if ((damagetype & DMG_TYPEMASK) != DMG_NORMAL && (damagetype & DMG_TYPEMASK) != DMG_STING) + if (((damagetype & DMG_TYPEMASK) == DMG_STING) + || (inflictor->type == MT_BANANA && inflictor->health <= 1)) { - laglength = 10; + laglength = 5; } // Everything above here can't be forced. From 4abb14a158fc80518822668ec52febec59de633c Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 10 Nov 2020 23:22:05 -0500 Subject: [PATCH 14/16] Check for null --- src/p_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index acd8f0433..efa3d3eaa 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1775,7 +1775,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da return false; if (((damagetype & DMG_TYPEMASK) == DMG_STING) - || (inflictor->type == MT_BANANA && inflictor->health <= 1)) + || ((inflictor && !P_MobjWasRemoved(inflictor)) && inflictor->type == MT_BANANA && inflictor->health <= 1)) { laglength = 5; } From 87e3dd518b12c5ebcb8f1306cc4238313e520089 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 10 Nov 2020 23:42:30 -0500 Subject: [PATCH 15/16] Don't set hitlag for punted mines multiple times --- src/k_collide.c | 1 - src/k_kart.c | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/k_collide.c b/src/k_collide.c index 13b17e981..7fbe17603 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -273,7 +273,6 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2) } else { - K_SetHitLagForObjects(t1, t2, 2); K_PuntMine(t1, t2); } } diff --git a/src/k_kart.c b/src/k_kart.c index 8512649b3..117136fb9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3816,6 +3816,9 @@ void K_PuntMine(mobj_t *thismine, mobj_t *punter) if (!mine || P_MobjWasRemoved(mine)) return; + if (mine->threshold > 0 || mine->hitlag > 0) + return; + spd = (82 + ((gamespeed-1) * 14))*mapobjectscale; // Avg Speed is 41 in Normal mine->flags |= MF_NOCLIPTHING; @@ -3825,6 +3828,8 @@ void K_PuntMine(mobj_t *thismine, mobj_t *punter) mine->extravalue1 = 0; mine->reactiontime = mine->info->reactiontime; + K_SetHitLagForObjects(punter, mine, 5); + mine->momx = punter->momx + FixedMul(FINECOSINE(fa), spd); mine->momy = punter->momy + FixedMul(FINESINE(fa), spd); mine->momz = P_MobjFlip(mine) * z; From 94eca0f92843a0fea0fd87d1ee88e6b4ce431a60 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 10 Nov 2020 23:50:59 -0500 Subject: [PATCH 16/16] Don't explode mines multiple times while they're in hitlag --- src/k_kart.c | 2 +- src/p_enemy.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 117136fb9..e35b9ff56 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2815,7 +2815,7 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color) if (!bombflashtimer && P_CheckSight(p->mo, source)) { bombflashtimer = TICRATE*2; - P_FlashPal(p, 1, 1); + P_FlashPal(p, PAL_WHITE, 1); } break; // we can break right now because quakes are global to all split players somehow. } diff --git a/src/p_enemy.c b/src/p_enemy.c index 78d6f0668..bc925d4aa 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -4457,6 +4457,9 @@ void A_GrenadeRing(mobj_t *actor) if (actor->flags2 & MF2_DEBRIS) return; + if (actor->hitlag > 0) + return; + if (actor->state == &states[S_SSMINE_DEPLOY8]) explodedist = (3*explodedist)/2; @@ -4524,6 +4527,9 @@ void A_SSMineExplode(mobj_t *actor) if (actor->flags2 & MF2_DEBRIS) return; + if (actor->hitlag > 0) + return; + type = (mobjtype_t)locvar1; // Use blockmap to check for nearby shootables