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