Many more bugfixes
This commit is contained in:
parent
91c1e13273
commit
24c6dd1a68
|
@ -13547,5 +13547,6 @@ void A_MinecartSparkThink(mobj_t *actor)
|
||||||
trail->tics = 2;
|
trail->tics = 2;
|
||||||
trail->sprite = actor->sprite;
|
trail->sprite = actor->sprite;
|
||||||
P_SetScale(trail, trail->scale/4);
|
P_SetScale(trail, trail->scale/4);
|
||||||
|
trail->destscale = trail->scale;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -836,10 +836,10 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
|
|
||||||
if (thing->type == MT_SALOONDOOR && tmthing->player)
|
if (thing->type == MT_SALOONDOOR && tmthing->player)
|
||||||
{
|
{
|
||||||
if (tmthing->player->powers[pw_carry] == CR_MINECART)
|
if (tmthing->player->powers[pw_carry] == CR_MINECART && tmthing->tracer && !P_MobjWasRemoved(tmthing->tracer) && tmthing->tracer->health)
|
||||||
{
|
{
|
||||||
fixed_t dx = tmthing->momx;
|
fixed_t dx = tmthing->tracer->momx;
|
||||||
fixed_t dy = tmthing->momy;
|
fixed_t dy = tmthing->tracer->momy;
|
||||||
fixed_t dm = min(FixedHypot(dx, dy), 16*FRACUNIT);
|
fixed_t dm = min(FixedHypot(dx, dy), 16*FRACUNIT);
|
||||||
angle_t ang = R_PointToAngle2(0, 0, dx, dy) - thing->angle;
|
angle_t ang = R_PointToAngle2(0, 0, dx, dy) - thing->angle;
|
||||||
fixed_t s = FINESINE((ang >> ANGLETOFINESHIFT) & FINEMASK);
|
fixed_t s = FINESINE((ang >> ANGLETOFINESHIFT) & FINEMASK);
|
||||||
|
|
18
src/p_mobj.c
18
src/p_mobj.c
|
@ -8567,14 +8567,6 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
}
|
}
|
||||||
mobj->flags2 ^= MF2_DONTDRAW;
|
mobj->flags2 ^= MF2_DONTDRAW;
|
||||||
break;
|
break;
|
||||||
case MT_MINECART:
|
|
||||||
// If player is ded, remove this minecart
|
|
||||||
if (!mobj->target || P_MobjWasRemoved(mobj->target) || !mobj->target->health)
|
|
||||||
{
|
|
||||||
P_KillMobj(mobj, NULL, NULL, 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case MT_SPINFIRE:
|
case MT_SPINFIRE:
|
||||||
if (mobj->flags & MF_NOGRAVITY)
|
if (mobj->flags & MF_NOGRAVITY)
|
||||||
{
|
{
|
||||||
|
@ -8952,6 +8944,16 @@ void P_PushableThinker(mobj_t *mobj)
|
||||||
if (mobj->flags & MF_PUSHABLE && !(mobj->momx || mobj->momy))
|
if (mobj->flags & MF_PUSHABLE && !(mobj->momx || mobj->momy))
|
||||||
P_TryMove(mobj, mobj->x, mobj->y, true);
|
P_TryMove(mobj, mobj->x, mobj->y, true);
|
||||||
|
|
||||||
|
if (mobj->type == MT_MINECART && mobj->health)
|
||||||
|
{
|
||||||
|
// If player is ded, remove this minecart
|
||||||
|
if (!mobj->target || P_MobjWasRemoved(mobj->target) || !mobj->target->health)
|
||||||
|
{
|
||||||
|
P_KillMobj(mobj, NULL, NULL, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (mobj->fuse == 1) // it would explode in the MobjThinker code
|
if (mobj->fuse == 1) // it would explode in the MobjThinker code
|
||||||
{
|
{
|
||||||
mobj_t *spawnmo;
|
mobj_t *spawnmo;
|
||||||
|
|
41
src/p_user.c
41
src/p_user.c
|
@ -9881,23 +9881,21 @@ static void P_SpawnSparks(mobj_t *mo, angle_t maindir)
|
||||||
fixed_t c = FixedMul(FINECOSINE(fa), mo->radius);
|
fixed_t c = FixedMul(FINECOSINE(fa), mo->radius);
|
||||||
fixed_t s = FixedMul(FINESINE(fa), mo->radius);
|
fixed_t s = FixedMul(FINESINE(fa), mo->radius);
|
||||||
mobj_t *spark;
|
mobj_t *spark;
|
||||||
UINT8 b1 = (leveltime % 2 == 1) ? 1 : -1;
|
SINT8 b1 = (leveltime & 1) ? 1 : -1;
|
||||||
UINT8 b2 = ((leveltime / 2) % 2 == 1) ? 1 : -1;
|
SINT8 b2 = (leveltime & 2) ? 1 : -1;
|
||||||
fixed_t r = FRACUNIT*P_RandomRange(-1, 1);
|
fixed_t r1 = FRACUNIT*P_RandomRange(-1, 1);
|
||||||
|
fixed_t r2 = FRACUNIT*P_RandomRange(-1, 1);
|
||||||
|
fixed_t r3 = FRACUNIT*P_RandomRange(-1, 1);
|
||||||
|
fixed_t fm = (maindir >> ANGLETOFINESHIFT) & FINEMASK;
|
||||||
|
|
||||||
spark = P_SpawnMobj(mo->x - b2*s + b1*c, mo->y + b2*c + b1*s, mo->z, MT_MINECARTSPARK);
|
spark = P_SpawnMobj(mo->x - b2*s + b1*c, mo->y + b2*c + b1*s, mo->z, MT_MINECARTSPARK);
|
||||||
spark->momx = mo->momx + r;
|
spark->momx = mo->momx + r1 + 8*FINECOSINE(fm);
|
||||||
spark->momy = mo->momy + r;
|
spark->momy = mo->momy + r2 + 8*FINESINE(fm);
|
||||||
spark->momz = mo->momz + r;
|
spark->momz = mo->momz + r3;
|
||||||
|
|
||||||
if (maindir)
|
|
||||||
{
|
|
||||||
fixed_t fm = (maindir >> ANGLETOFINESHIFT) & FINEMASK;
|
|
||||||
spark->momx += 8*FINECOSINE(fm);
|
|
||||||
spark->momy += 8*FINESINE(fm);
|
|
||||||
}
|
|
||||||
P_Thrust(spark, R_PointToAngle2(mo->x, mo->y, spark->x, spark->y), 8*FRACUNIT);
|
P_Thrust(spark, R_PointToAngle2(mo->x, mo->y, spark->x, spark->y), 8*FRACUNIT);
|
||||||
P_SetScale(spark, FRACUNIT/4);
|
P_SetScale(spark, FRACUNIT/4);
|
||||||
|
spark->destscale = spark->scale;
|
||||||
spark->fuse = TICRATE/3;
|
spark->fuse = TICRATE/3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9979,7 +9977,7 @@ static void P_MinecartThink(player_t *player)
|
||||||
else if (angdiff > ANGLE_180 && angdiff < InvAngle(MINECARTCONEMAX))
|
else if (angdiff > ANGLE_180 && angdiff < InvAngle(MINECARTCONEMAX))
|
||||||
player->mo->angle = minecart->angle - MINECARTCONEMAX;
|
player->mo->angle = minecart->angle - MINECARTCONEMAX;
|
||||||
|
|
||||||
if (angdiff + minecart->angle != player->mo->angle)
|
if (angdiff + minecart->angle != player->mo->angle && (!demoplayback || P_AnalogMove(player)))
|
||||||
{
|
{
|
||||||
if (player == &players[consoleplayer])
|
if (player == &players[consoleplayer])
|
||||||
localangle = player->mo->angle;
|
localangle = player->mo->angle;
|
||||||
|
@ -10051,7 +10049,7 @@ static void P_MinecartThink(player_t *player)
|
||||||
P_ResetScore(player);
|
P_ResetScore(player);
|
||||||
// Handle angle and position
|
// Handle angle and position
|
||||||
P_GetAxisPosition(minecart->x, minecart->y, axis, &newx, &newy, &targetangle, &grind);
|
P_GetAxisPosition(minecart->x, minecart->y, axis, &newx, &newy, &targetangle, &grind);
|
||||||
if (grind)
|
if (axis->type != MT_AXISTRANSFERLINE)
|
||||||
P_SpawnSparks(minecart, grind);
|
P_SpawnSparks(minecart, grind);
|
||||||
P_TryMove(minecart, newx, newy, true);
|
P_TryMove(minecart, newx, newy, true);
|
||||||
|
|
||||||
|
@ -10062,13 +10060,14 @@ static void P_MinecartThink(player_t *player)
|
||||||
minecart->angle = targetangle;
|
minecart->angle = targetangle;
|
||||||
else
|
else
|
||||||
minecart->angle = targetangle + ANGLE_180;
|
minecart->angle = targetangle + ANGLE_180;
|
||||||
player->mo->angle += (minecart->angle - prevangle); // maintain relative angle on turns
|
angdiff = (minecart->angle - prevangle);
|
||||||
if (angdiff + minecart->angle != targetangle)
|
if (angdiff && (!demoplayback || P_AnalogMove(player))) // maintain relative angle on turns
|
||||||
{
|
{
|
||||||
|
player->mo->angle += angdiff;
|
||||||
if (player == &players[consoleplayer])
|
if (player == &players[consoleplayer])
|
||||||
localangle = player->mo->angle;
|
localangle += angdiff;
|
||||||
else if (player == &players[secondarydisplayplayer])
|
else if (player == &players[secondarydisplayplayer])
|
||||||
localangle2 = player->mo->angle;
|
localangle2 += angdiff;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sideways detection
|
// Sideways detection
|
||||||
|
@ -10164,9 +10163,9 @@ static void P_MinecartThink(player_t *player)
|
||||||
|
|
||||||
// Move player to minecart.
|
// Move player to minecart.
|
||||||
P_TeleportMove(player->mo, minecart->x - minecart->momx, minecart->y - minecart->momy, minecart->z + max(minecart->momz, 0) + 8*FRACUNIT);
|
P_TeleportMove(player->mo, minecart->x - minecart->momx, minecart->y - minecart->momy, minecart->z + max(minecart->momz, 0) + 8*FRACUNIT);
|
||||||
player->mo->momx = minecart->momx;
|
if (player->powers[pw_carry] != CR_MINECART)
|
||||||
player->mo->momy = minecart->momy;
|
return;
|
||||||
player->mo->momz = 0;
|
player->mo->momx = player->mo->momy = player->mo->momz = 0;
|
||||||
P_TryMove(player->mo, player->mo->x + minecart->momx, player->mo->y + minecart->momy, true);
|
P_TryMove(player->mo, player->mo->x + minecart->momx, player->mo->y + minecart->momy, true);
|
||||||
|
|
||||||
if (player->powers[pw_flashing] == flashingtics)
|
if (player->powers[pw_flashing] == flashingtics)
|
||||||
|
|
Loading…
Reference in a new issue