From a8908d22cfe6d393a10af4d80361beba39aec703 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 1 Aug 2020 01:14:18 -0400 Subject: [PATCH] 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)) {