mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-01-22 22:46:12 +00:00
Speed pads reflect your angle like horizontal springs do
This commit is contained in:
parent
0fc9844b85
commit
a9687144ec
4 changed files with 55 additions and 41 deletions
42
src/k_kart.c
42
src/k_kart.c
|
|
@ -78,6 +78,48 @@ player_t *K_GetItemBoxPlayer(mobj_t *mobj)
|
|||
return player;
|
||||
}
|
||||
|
||||
// Angle reflection used by springs & speed pads
|
||||
angle_t K_ReflectAngle(angle_t yourangle, angle_t theirangle, fixed_t yourspeed, fixed_t theirspeed)
|
||||
{
|
||||
INT32 angoffset;
|
||||
boolean subtract = false;
|
||||
|
||||
angoffset = yourangle - theirangle;
|
||||
|
||||
if ((angle_t)angoffset > ANGLE_180)
|
||||
{
|
||||
// Flip on wrong side
|
||||
angoffset = InvAngle((angle_t)angoffset);
|
||||
subtract = !subtract;
|
||||
}
|
||||
|
||||
// Fix going directly against the spring's angle sending you the wrong way
|
||||
if ((angle_t)angoffset > ANGLE_90)
|
||||
{
|
||||
angoffset = ANGLE_180 - angoffset;
|
||||
}
|
||||
|
||||
// Offset is reduced to cap it (90 / 2 = max of 45 degrees)
|
||||
angoffset /= 2;
|
||||
|
||||
// Reduce further based on how slow your speed is compared to the spring's speed
|
||||
// (set both to 0 to ignore this)
|
||||
if (theirspeed != 0 && yourspeed != 0)
|
||||
{
|
||||
if (theirspeed > yourspeed)
|
||||
{
|
||||
angoffset = FixedDiv(angoffset, FixedDiv(theirspeed, yourspeed));
|
||||
}
|
||||
}
|
||||
|
||||
if (subtract)
|
||||
angoffset = (signed)(theirangle) - angoffset;
|
||||
else
|
||||
angoffset = (signed)(theirangle) + angoffset;
|
||||
|
||||
return (angle_t)angoffset;
|
||||
}
|
||||
|
||||
//{ SRB2kart Net Variables
|
||||
|
||||
void K_RegisterKartStuff(void)
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#define KART_FULLTURN 800
|
||||
|
||||
player_t *K_GetItemBoxPlayer(mobj_t *mobj);
|
||||
angle_t K_ReflectAngle(angle_t angle, angle_t against, fixed_t maxspeed, fixed_t yourspeed);
|
||||
|
||||
void K_RegisterKartStuff(void);
|
||||
|
||||
|
|
|
|||
44
src/p_map.c
44
src/p_map.c
|
|
@ -308,12 +308,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
|||
{
|
||||
angle_t finalAngle = spring->angle;
|
||||
fixed_t finalSpeed = FixedMul(horizspeed, FixedSqrt(FixedMul(hscale, spring->scale)));
|
||||
fixed_t objectSpeed;
|
||||
|
||||
if (object->player)
|
||||
objectSpeed = object->player->speed;
|
||||
else
|
||||
objectSpeed = R_PointToDist2(0, 0, savemomx, savemomy);
|
||||
fixed_t objectSpeed = R_PointToDist2(0, 0, savemomx, savemomy);
|
||||
|
||||
if (!vertispeed)
|
||||
{
|
||||
|
|
@ -324,39 +319,10 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
|||
// This makes it a bit more interesting & unique than just being a speed boost in a pre-defined direction
|
||||
if (savemomx || savemomy)
|
||||
{
|
||||
angle_t momang;
|
||||
INT32 angoffset;
|
||||
boolean subtract = false;
|
||||
|
||||
momang = R_PointToAngle2(0, 0, savemomx, savemomy);
|
||||
|
||||
angoffset = momang;
|
||||
angoffset -= spring->angle; // Subtract
|
||||
|
||||
// Flip on wrong side
|
||||
if ((angle_t)angoffset > ANGLE_180)
|
||||
{
|
||||
angoffset = InvAngle((angle_t)angoffset);
|
||||
subtract = !subtract;
|
||||
}
|
||||
|
||||
// Fix going directly against the spring's angle sending you the wrong way
|
||||
if ((spring->angle - momang) > ANGLE_90)
|
||||
angoffset = ANGLE_180 - angoffset;
|
||||
|
||||
// Offset is reduced to cap it (90 / 2 = max of 45 degrees)
|
||||
angoffset /= 2;
|
||||
|
||||
// Reduce further based on how slow your speed is compared to the spring's speed
|
||||
if (finalSpeed > objectSpeed)
|
||||
angoffset = FixedDiv(angoffset, FixedDiv(finalSpeed, objectSpeed));
|
||||
|
||||
if (subtract)
|
||||
angoffset = (signed)(spring->angle) - angoffset;
|
||||
else
|
||||
angoffset = (signed)(spring->angle) + angoffset;
|
||||
|
||||
finalAngle = angoffset;
|
||||
finalAngle = K_ReflectAngle(
|
||||
R_PointToAngle2(0, 0, savemomx, savemomy), finalAngle,
|
||||
objectSpeed, finalSpeed
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4064,7 +4064,7 @@ DoneSection2:
|
|||
{
|
||||
angle_t lineangle = R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y);
|
||||
fixed_t linespeed = P_AproxDistance(lines[i].v2->x-lines[i].v1->x, lines[i].v2->y-lines[i].v1->y);
|
||||
fixed_t newspeed = 2 * P_AproxDistance(player->mo->momx, player->mo->momy);
|
||||
fixed_t playerspeed = P_AproxDistance(player->mo->momx, player->mo->momy);
|
||||
|
||||
// SRB2Kart: Scale the speed you get from them!
|
||||
// This is scaled differently from other horizontal speed boosts from stuff like springs, because of how this is used for some ramp jumps.
|
||||
|
|
@ -4073,7 +4073,12 @@ DoneSection2:
|
|||
linespeed = FixedMul(linespeed, mapobjectscale + (player->mo->scale - mapobjectscale));
|
||||
}
|
||||
|
||||
P_InstaThrust(player->mo, lineangle, max(linespeed, newspeed));
|
||||
lineangle = K_ReflectAngle(
|
||||
R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy), lineangle,
|
||||
playerspeed, linespeed
|
||||
);
|
||||
|
||||
P_InstaThrust(player->mo, lineangle, max(linespeed, 2*playerspeed));
|
||||
|
||||
player->kartstuff[k_dashpadcooldown] = 2;
|
||||
player->kartstuff[k_pogospring] = 0;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue