mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-05-10 19:01:50 +00:00
K_SetHitlagForObjects, sets hitlag based on speed
This commit is contained in:
parent
0db881d058
commit
a8908d22cf
4 changed files with 104 additions and 20 deletions
|
|
@ -41,15 +41,14 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2)
|
||||||
{
|
{
|
||||||
// Melt item
|
// Melt item
|
||||||
S_StartSound(t2, sfx_s3k43);
|
S_StartSound(t2, sfx_s3k43);
|
||||||
t2->hitlag += 3;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Player Damage
|
// Player Damage
|
||||||
|
K_SetHitLagForObjects(t1, t2, 10);
|
||||||
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);
|
||||||
t2->hitlag += 10;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
damageitem = true;
|
damageitem = true;
|
||||||
|
|
@ -60,8 +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
|
||||||
t2->hitlag += 10;
|
K_SetHitLagForObjects(t1, t2, 10);
|
||||||
|
|
||||||
S_StartSound(t2, t2->info->deathsound);
|
S_StartSound(t2, t2->info->deathsound);
|
||||||
P_KillMobj(t2, t1, t1);
|
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)
|
else if (t2->type == MT_SSMINE_SHIELD || t2->type == MT_SSMINE)
|
||||||
{
|
{
|
||||||
|
K_SetHitLagForObjects(t1, t2, 10);
|
||||||
damageitem = true;
|
damageitem = true;
|
||||||
// Bomb death
|
// Bomb death
|
||||||
P_KillMobj(t2, t1, t1);
|
P_KillMobj(t2, t1, t1);
|
||||||
|
|
@ -85,17 +84,15 @@ 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);
|
||||||
// Shootable damage
|
// Shootable damage
|
||||||
P_DamageMobj(t2, t2, t1->target, 1);
|
P_DamageMobj(t2, t2, t1->target, 1);
|
||||||
t2->hitlag += 10;
|
|
||||||
damageitem = true;
|
damageitem = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (damageitem)
|
if (damageitem)
|
||||||
{
|
{
|
||||||
// This Item Damage
|
// This Item Damage
|
||||||
t1->hitlag += 10;
|
|
||||||
|
|
||||||
S_StartSound(t1, t1->info->deathsound);
|
S_StartSound(t1, t1->info->deathsound);
|
||||||
P_KillMobj(t1, t2, t2);
|
P_KillMobj(t1, t2, t2);
|
||||||
|
|
||||||
|
|
@ -141,13 +138,12 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
|
||||||
{
|
{
|
||||||
// Melt item
|
// Melt item
|
||||||
S_StartSound(t2, sfx_s3k43);
|
S_StartSound(t2, sfx_s3k43);
|
||||||
t2->hitlag += 3;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Player Damage
|
// Player Damage
|
||||||
|
K_SetHitLagForObjects(t1, t2, 2);
|
||||||
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));
|
||||||
t2->hitlag += 5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
damageitem = true;
|
damageitem = true;
|
||||||
|
|
@ -158,7 +154,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
|
||||||
|| t2->type == MT_BALLHOG)
|
|| t2->type == MT_BALLHOG)
|
||||||
{
|
{
|
||||||
// Other Item Damage
|
// Other Item Damage
|
||||||
t2->hitlag += 10;
|
K_SetHitLagForObjects(t1, t2, 10);
|
||||||
|
|
||||||
S_StartSound(t2, t2->info->deathsound);
|
S_StartSound(t2, t2->info->deathsound);
|
||||||
P_KillMobj(t2, t1, t1);
|
P_KillMobj(t2, t1, t1);
|
||||||
|
|
@ -173,15 +169,15 @@ 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);
|
||||||
P_DamageMobj(t2, t2, t1->target, 1);
|
P_DamageMobj(t2, t2, t1->target, 1);
|
||||||
t2->hitlag += 10;
|
|
||||||
damageitem = true;
|
damageitem = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (damageitem)
|
if (damageitem)
|
||||||
{
|
{
|
||||||
// This Item Damage
|
// This Item Damage
|
||||||
t1->hitlag += 10;
|
K_SetHitLagForObjects(t1, t2, 10);
|
||||||
|
|
||||||
S_StartSound(t1, t1->info->deathsound);
|
S_StartSound(t1, t1->info->deathsound);
|
||||||
P_KillMobj(t1, t2, t2);
|
P_KillMobj(t1, t2, t2);
|
||||||
|
|
@ -283,19 +279,25 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2)
|
||||||
// Bomb punting
|
// Bomb punting
|
||||||
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);
|
||||||
P_KillMobj(t1, t2, t2);
|
P_KillMobj(t1, t2, t2);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
K_SetHitLagForObjects(t1, t2, 2);
|
||||||
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);
|
||||||
|
|
||||||
// Bomb death
|
// Bomb death
|
||||||
P_KillMobj(t1, t2, t2);
|
P_KillMobj(t1, t2, t2);
|
||||||
|
|
||||||
// Other Item Damage
|
// Other Item Damage
|
||||||
t2->hitlag += 10;
|
|
||||||
|
|
||||||
S_StartSound(t2, t2->info->deathsound);
|
S_StartSound(t2, t2->info->deathsound);
|
||||||
P_KillMobj(t2, t1, t1);
|
P_KillMobj(t2, t1, t1);
|
||||||
|
|
||||||
|
|
@ -304,6 +306,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);
|
||||||
// Bomb death
|
// Bomb death
|
||||||
P_KillMobj(t1, t2, t2);
|
P_KillMobj(t1, t2, t2);
|
||||||
// Shootable damage
|
// Shootable damage
|
||||||
|
|
@ -322,18 +325,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_ExplodePlayer(t2->player, t1->target, t1);
|
K_ExplodePlayer(t2->player, t1->target, t1);
|
||||||
t2->hitlag += 10;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
K_SetHitLagForObjects(t1, t2, 2);
|
||||||
K_SpinPlayer(t2->player, t1->target, 0, t1, false);
|
K_SpinPlayer(t2->player, t1->target, 0, t1, false);
|
||||||
t2->hitlag += 5;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (t2->flags & MF_SHOOTABLE)
|
else if (t2->flags & MF_SHOOTABLE)
|
||||||
{
|
{
|
||||||
// Shootable damage
|
// Shootable damage
|
||||||
|
K_SetHitLagForObjects(t1, t2, 10);
|
||||||
P_DamageMobj(t2, t2, t1->target, 1);
|
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)
|
if (t2->player->powers[pw_flashing] > 0 && t2->hitlag == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
K_SetHitLagForObjects(t1, t2, 10);
|
||||||
|
|
||||||
S_StartSound(NULL, sfx_bsnipe); // let all players hear it.
|
S_StartSound(NULL, sfx_bsnipe); // let all players hear it.
|
||||||
|
|
||||||
HU_SetCEchoFlags(0);
|
HU_SetCEchoFlags(0);
|
||||||
HU_SetCEchoDuration(5);
|
HU_SetCEchoDuration(5);
|
||||||
HU_DoCEcho(va("%s\\was hit by a kitchen sink.\\\\\\\\", player_names[t2->player-players]));
|
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]);
|
I_OutputMsg("%s was hit by a kitchen sink.\n", player_names[t2->player-players]);
|
||||||
|
|
||||||
P_DamageMobj(t2, t1, t1->target, 10000);
|
P_DamageMobj(t2, t1, t1->target, 10000);
|
||||||
P_KillMobj(t1, t2, t2);
|
P_KillMobj(t1, t2, t2);
|
||||||
t1->hitlag += 10;
|
|
||||||
t2->hitlag += 10;
|
|
||||||
}
|
}
|
||||||
else if (t2->flags & MF_SHOOTABLE)
|
else if (t2->flags & MF_SHOOTABLE)
|
||||||
{
|
{
|
||||||
|
K_SetHitLagForObjects(t1, t2, 10);
|
||||||
// Shootable damage
|
// Shootable damage
|
||||||
P_KillMobj(t2, t2, t1->target);
|
P_KillMobj(t2, t2, t1->target);
|
||||||
t2->hitlag += 10;
|
|
||||||
// This Item Damage
|
// This Item Damage
|
||||||
t1->hitlag += 10;
|
|
||||||
P_KillMobj(t1, t2, t2);
|
P_KillMobj(t1, t2, t2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
59
src/k_kart.c
59
src/k_kart.c
|
|
@ -2343,6 +2343,65 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground)
|
||||||
return finalspeed;
|
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)
|
void K_DoInstashield(player_t *player)
|
||||||
{
|
{
|
||||||
mobj_t *layera;
|
mobj_t *layera;
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,8 @@ void K_KartMoveAnimation(player_t *player);
|
||||||
void K_KartPlayerHUDUpdate(player_t *player);
|
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);
|
||||||
|
void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics);
|
||||||
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);
|
||||||
|
|
|
||||||
18
src/p_map.c
18
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))
|
&& !(thing->z + thing->height < tmthing->z || thing->z > tmthing->z + tmthing->height))
|
||||||
{
|
{
|
||||||
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_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_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);
|
||||||
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);
|
||||||
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);
|
||||||
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);
|
||||||
P_DamageMobj(tmthing, thing, thing, 1);
|
P_DamageMobj(tmthing, thing, thing, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/*if (G_BattleGametype() && (!G_GametypeHasTeams() || tmthing->player->ctfteam != thing->player->ctfteam))
|
/*if (G_BattleGametype() && (!G_GametypeHasTeams() || tmthing->player->ctfteam != thing->player->ctfteam))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue