Angle & scale now impact how long you're in hitlag

This commit is contained in:
Sally Coolatta 2020-08-02 10:26:29 -04:00
parent a9a7f71b57
commit 3dc2f4804f
5 changed files with 83 additions and 45 deletions

View file

@ -45,7 +45,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2)
else else
{ {
// Player Damage // Player Damage
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
P_DamageMobj(t2, t1, t1->target, 1); P_DamageMobj(t2, t1, t1->target, 1);
K_KartBouncing(t2, t1, false, false); K_KartBouncing(t2, t1, false, false);
S_StartSound(t2, sfx_s3k7b); S_StartSound(t2, sfx_s3k7b);
@ -59,7 +59,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2)
|| t2->type == MT_BALLHOG) || t2->type == MT_BALLHOG)
{ {
// Other Item Damage // Other Item Damage
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
S_StartSound(t2, t2->info->deathsound); S_StartSound(t2, t2->info->deathsound);
P_KillMobj(t2, t1, t1); 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) else if (t2->type == MT_SSMINE_SHIELD || t2->type == MT_SSMINE)
{ {
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
damageitem = true; damageitem = true;
// Bomb death // Bomb death
P_KillMobj(t2, t1, t1); P_KillMobj(t2, t1, t1);
@ -84,7 +84,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2)
} }
else if (t2->flags & MF_SHOOTABLE) else if (t2->flags & MF_SHOOTABLE)
{ {
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
// Shootable damage // Shootable damage
P_DamageMobj(t2, t2, t1->target, 1); P_DamageMobj(t2, t2, t1->target, 1);
damageitem = true; damageitem = true;
@ -142,7 +142,17 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
else else
{ {
// Player Damage // 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)); 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) || t2->type == MT_BALLHOG)
{ {
// Other Item Damage // Other Item Damage
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
S_StartSound(t2, t2->info->deathsound); S_StartSound(t2, t2->info->deathsound);
P_KillMobj(t2, t1, t1); P_KillMobj(t2, t1, t1);
@ -169,7 +179,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
else if (t2->flags & MF_SHOOTABLE) else if (t2->flags & MF_SHOOTABLE)
{ {
// Shootable damage // Shootable damage
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
P_DamageMobj(t2, t2, t1->target, 1); P_DamageMobj(t2, t2, t1->target, 1);
damageitem = true; damageitem = true;
} }
@ -177,7 +187,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
if (damageitem) if (damageitem)
{ {
// This Item Damage // This Item Damage
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
S_StartSound(t1, t1->info->deathsound); S_StartSound(t1, t1->info->deathsound);
P_KillMobj(t1, t2, t2); 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]) if ((t1->state >= &states[S_SSMINE1] && t1->state <= &states[S_SSMINE4])
|| (t1->state >= &states[S_SSMINE_DEPLOY8] && t1->state <= &states[S_SSMINE_DEPLOY13])) || (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); P_KillMobj(t1, t2, t2);
} }
else else
{ {
K_SetHitLagForObjects(t1, t2, 2); K_SetHitLagForObjects(t1, t2, 2, true);
K_PuntMine(t1, t2); K_PuntMine(t1, t2);
} }
} }
else if (t2->type == MT_ORBINAUT || t2->type == MT_JAWZ || t2->type == MT_JAWZ_DUD 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) || t2->type == MT_ORBINAUT_SHIELD || t2->type == MT_JAWZ_SHIELD)
{ {
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
// Bomb death // Bomb death
P_KillMobj(t1, t2, t2); P_KillMobj(t1, t2, t2);
@ -306,7 +316,7 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2)
} }
else if (t2->flags & MF_SHOOTABLE) else if (t2->flags & MF_SHOOTABLE)
{ {
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
// Bomb death // Bomb death
P_KillMobj(t1, t2, t2); P_KillMobj(t1, t2, t2);
// Shootable damage // Shootable damage
@ -325,19 +335,19 @@ boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2)
if (t1->state == &states[S_MINEEXPLOSION1]) if (t1->state == &states[S_MINEEXPLOSION1])
{ {
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
K_ExplodePlayer(t2->player, t1->target, t1); K_ExplodePlayer(t2->player, t1->target, t1);
} }
else else
{ {
K_SetHitLagForObjects(t1, t2, 2); K_SetHitLagForObjects(t1, t2, 2, true);
K_SpinPlayer(t2->player, t1->target, 0, t1, false); K_SpinPlayer(t2->player, t1->target, 0, t1, false);
} }
} }
else if (t2->flags & MF_SHOOTABLE) else if (t2->flags & MF_SHOOTABLE)
{ {
// Shootable damage // Shootable damage
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
P_DamageMobj(t2, t2, t1->target, 1); 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) if (t2->player->powers[pw_flashing] > 0 && t2->hitlag == 0)
return true; return true;
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
S_StartSound(NULL, sfx_bsnipe); // let all players hear it. 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) else if (t2->flags & MF_SHOOTABLE)
{ {
K_SetHitLagForObjects(t1, t2, 10); K_SetHitLagForObjects(t1, t2, 10, false);
// Shootable damage // Shootable damage
P_KillMobj(t2, t2, t1->target); P_KillMobj(t2, t2, t1->target);
// This Item Damage // This Item Damage

View file

@ -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 tics1 = tics;
INT32 tics2 = tics; INT32 tics2 = tics;
//if (anglediff > ANGLE_180) if (fixed == false)
//{ {
//anglediff = InvAngle(anglediff); 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))); const fixed_t scalediff = mo2->scale - mo1->scale;
tics2 += FixedMul(speeddiff, anglemul) / ticaddfactor;
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 && !mo2->player)
{ {
if (mo1->player->powers[pw_flashing] > 0 if (mo1->player->powers[pw_flashing] > 0
|| mo1->player->kartstuff[k_invincibilitytimer] > 0 || mo1->player->kartstuff[k_invincibilitytimer] > 0
|| mo1->player->kartstuff[k_growshrinktimer] > 0) || mo1->player->kartstuff[k_growshrinktimer] > 0)
{
tics1 = 0; tics1 = 0;
}
} }
if (mo2->player && !mo1->player) 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 if (mo2->player->powers[pw_flashing] > 0
|| mo2->player->kartstuff[k_invincibilitytimer] > 0 || mo2->player->kartstuff[k_invincibilitytimer] > 0
|| mo2->player->kartstuff[k_growshrinktimer] > 0) || mo2->player->kartstuff[k_growshrinktimer] > 0)
{
tics2 = 0; tics2 = 0;
}
} }
//CONS_Printf("tics1: %d, tics2: %d\n", tics1, tics2);
mo1->hitlag += tics1; mo1->hitlag += tics1;
mo2->hitlag += tics2; mo2->hitlag += tics2;
} }

View file

@ -40,7 +40,7 @@ void K_KartPlayerHUDUpdate(player_t *player);
void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd);
void K_KartPlayerAfterThink(player_t *player); void K_KartPlayerAfterThink(player_t *player);
angle_t K_MomentumAngle(mobj_t *mo); 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_DoInstashield(player_t *player);
void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflictor, boolean trapitem); 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); void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor);

View file

@ -1307,34 +1307,34 @@ static boolean PIT_CheckThing(mobj_t *thing)
{ {
if (tmthing->scale > thing->scale + (mapobjectscale/8)) // SRB2kart - Handle squishes first! 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); K_SquishPlayer(thing->player, tmthing, tmthing);
} }
else if (thing->scale > tmthing->scale + (mapobjectscale/8)) 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); K_SquishPlayer(tmthing->player, thing, tmthing);
} }
else if (tmthing->player->kartstuff[k_invincibilitytimer] && !thing->player->kartstuff[k_invincibilitytimer]) // SRB2kart - Then invincibility! 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); P_DamageMobj(thing, tmthing, tmthing, 1);
} }
else if (thing->player->kartstuff[k_invincibilitytimer] && !tmthing->player->kartstuff[k_invincibilitytimer]) 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); P_DamageMobj(tmthing, thing, thing, 1);
} }
else if ((tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) 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! && !(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); P_DamageMobj(thing, tmthing, tmthing, 1);
} }
else if ((thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) 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! && !(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); P_DamageMobj(tmthing, thing, thing, 1);
} }

View file

@ -1487,7 +1487,7 @@ static void R_ProjectSprite(mobj_t *thing)
// hitlag vibrating // hitlag vibrating
if (thing->hitlag > 0) if (thing->hitlag > 0)
{ {
fixed_t mul = (thing->hitlag * FRACUNIT) / 5; fixed_t mul = thing->hitlag * (FRACUNIT / 20);
if (leveltime & 1) if (leveltime & 1)
{ {