Extra touches

- Re-enable ring respawn
- Make Attraction Shield chasing rings faster
- Combi-band is invisible to non-affected players
- Used rings animate faster
- Sync ring animation to a global timer
This commit is contained in:
TehRealSalt 2019-04-07 14:49:51 -04:00
parent 23948c14ec
commit 3dd89eb7c8
6 changed files with 80 additions and 31 deletions

View file

@ -4784,6 +4784,18 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
// Ring
"S_RING",
"S_FASTRING1",
"S_FASTRING2",
"S_FASTRING3",
"S_FASTRING4",
"S_FASTRING5",
"S_FASTRING6",
"S_FASTRING7",
"S_FASTRING8",
"S_FASTRING9",
"S_FASTRING10",
"S_FASTRING11",
"S_FASTRING12",
// Blue Sphere for special stages
"S_BLUEBALL",

View file

@ -970,6 +970,18 @@ state_t states[NUMSTATES] =
// Ring
{SPR_RING, FF_ANIMATE, -1, {NULL}, 23, 1, S_RING}, // S_RING
{SPR_RING, 0, 1, {NULL}, 0, 0, S_FASTRING2}, // S_FASTRING1
{SPR_RING, 2, 1, {NULL}, 0, 0, S_FASTRING3}, // S_FASTRING2
{SPR_RING, 4, 1, {NULL}, 0, 0, S_FASTRING4}, // S_FASTRING3
{SPR_RING, 6, 1, {NULL}, 0, 0, S_FASTRING5}, // S_FASTRING4
{SPR_RING, 8, 1, {NULL}, 0, 0, S_FASTRING6}, // S_FASTRING5
{SPR_RING, 10, 1, {NULL}, 0, 0, S_FASTRING7}, // S_FASTRING6
{SPR_RING, 12, 1, {NULL}, 0, 0, S_FASTRING8}, // S_FASTRING7
{SPR_RING, 14, 1, {NULL}, 0, 0, S_FASTRING9}, // S_FASTRING8
{SPR_RING, 16, 1, {NULL}, 0, 0, S_FASTRING10}, // S_FASTRING9
{SPR_RING, 18, 1, {NULL}, 0, 0, S_FASTRING11}, // S_FASTRING10
{SPR_RING, 20, 1, {NULL}, 0, 0, S_FASTRING12}, // S_FASTRING11
{SPR_RING, 22, 1, {NULL}, 0, 0, S_FASTRING1}, // S_FASTRING12
// Blue Sphere Replacement for special stages
{SPR_BBAL, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BLUEBALL

View file

@ -1675,6 +1675,18 @@ typedef enum state
// Ring
S_RING,
S_FASTRING1,
S_FASTRING2,
S_FASTRING3,
S_FASTRING4,
S_FASTRING5,
S_FASTRING6,
S_FASTRING7,
S_FASTRING8,
S_FASTRING9,
S_FASTRING10,
S_FASTRING11,
S_FASTRING12,
// Blue Sphere for special stages
S_BLUEBALL,

View file

@ -1662,6 +1662,8 @@ static void K_UpdateDraft(player_t *player)
band->color = colors[c];
band->colorized = true;
band->fuse = 2;
if (!P_IsLocalPlayer(player) && !P_IsLocalPlayer(&players[i]))
band->flags2 |= MF2_DONTDRAW;
}
curx += stepx;
@ -5016,7 +5018,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->kartstuff[k_superring] % 3 == 0)
{
mobj_t *ring = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_RING);
ring->frame = (leveltime % 23);
ring->extravalue1 = 1; // Ring collect animation timer
ring->angle = player->mo->angle; // animation angle
P_SetTarget(&ring->target, player->mo); // toucher for thinker
@ -5710,7 +5711,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
if ((player->pflags & PF_ATTACKDOWN) && !player->kartstuff[k_ringdelay] && player->kartstuff[k_rings] > 0)
{
mobj_t *ring = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_RING);
ring->frame = (leveltime % 23);
P_SetMobjState(ring, S_FASTRING1);
ring->extravalue1 = 1; // Ring use animation timer
ring->extravalue2 = 1; // Ring use animation flag
P_SetTarget(&ring->target, player->mo); // user

View file

@ -757,7 +757,7 @@ static boolean P_LookForShield(mobj_t *actor)
if ((player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD) && ((player->kartstuff[k_rings]+player->kartstuff[k_pickuprings]) < 20)
&& P_AproxDistance(actor->x-player->mo->x, actor->y-player->mo->y) < FixedMul(RING_DIST/4, player->mo->scale)
&& P_AproxDistance(0, actor->z-player->mo->z) < FixedMul(RING_DIST/8, player->mo->scale))
&& P_AproxDistance(0, actor->z-player->mo->z) < FixedMul(RING_DIST/16, player->mo->scale))
{
P_SetTarget(&actor->tracer, player->mo);
return true;
@ -3634,6 +3634,9 @@ void A_AttractChase(mobj_t *actor)
if (actor->extravalue2) // Using for ring boost
{
// Always fullbright
actor->frame |= FF_FULLBRIGHT;
if (actor->extravalue1 >= 21)
{
// Base add is 3 tics for 9,9, adds 1.5 tics for each point closer to the 1,1 end
@ -3655,6 +3658,12 @@ void A_AttractChase(mobj_t *actor)
}
else // Collecting
{
// Flicker fullbright
if (leveltime & 1)
actor->frame |= FF_FULLBRIGHT;
else
actor->frame &= ~FF_FULLBRIGHT;
if (actor->extravalue1 >= 16)
{
if (actor->target->player->kartstuff[k_rings] >= 20)
@ -3689,6 +3698,12 @@ void A_AttractChase(mobj_t *actor)
}
else
{
// Flicker fullbright
if (leveltime & 1)
actor->frame |= FF_FULLBRIGHT;
else
actor->frame &= ~FF_FULLBRIGHT;
// Don't immediately pick up spilled rings
if (actor->threshold > 0)
actor->threshold--;
@ -3716,7 +3731,7 @@ void A_AttractChase(mobj_t *actor)
}
if (actor->tracer && actor->tracer->player && actor->tracer->health
&& P_CheckSight(actor, actor->tracer)
//&& P_CheckSight(actor, actor->tracer)
&& actor->tracer->player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD
&& (actor->tracer->player->kartstuff[k_rings]+actor->tracer->player->kartstuff[k_pickuprings]) < 20)
{
@ -3746,9 +3761,9 @@ void A_AttractChase(mobj_t *actor)
vang = R_PointToAngle2(actor->z , 0, actor->tracer->z, dist);
actor->momx -= actor->momx>>4, actor->momy -= actor->momy>>4, actor->momz -= actor->momz>>4;
actor->momx += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINECOSINE(hang>>ANGLETOFINESHIFT), 2*actor->scale));
actor->momy += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINESINE(hang>>ANGLETOFINESHIFT), 2*actor->scale));
actor->momz += FixedMul(FINECOSINE(vang>>ANGLETOFINESHIFT), 2*actor->scale);
actor->momx += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINECOSINE(hang>>ANGLETOFINESHIFT), 4*actor->scale));
actor->momy += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINESINE(hang>>ANGLETOFINESHIFT), 4*actor->scale));
actor->momz += FixedMul(FINECOSINE(vang>>ANGLETOFINESHIFT), 4*actor->scale);
}
else
{
@ -3758,7 +3773,7 @@ void A_AttractChase(mobj_t *actor)
mobj_t *newring;
newring = P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->reactiontime);
P_InstaThrust(newring, P_RandomRange(0,7) * ANGLE_45, 2<<FRACBITS);
newring->momz = 5<<FRACBITS;
newring->momz = 8<<FRACBITS;
newring->fuse = 120*TICRATE;
P_RemoveMobj(actor);
return;

View file

@ -3983,7 +3983,10 @@ static void P_RingThinker(mobj_t *mobj)
return;
}
P_CycleMobjState(mobj);
if (mobj->state == &states[S_RING]) // sync map rings to a global timer
mobj->frame = (leveltime % ((UINT32)mobj->state->var1)) | (mobj->state->frame & ~FF_FRAMEMASK);
else
P_CycleMobjState(mobj);
}
//
@ -10272,8 +10275,8 @@ void P_RemoveMobj(mobj_t *mobj)
// Rings only, please!
if (mobj->spawnpoint &&
(/*mobj->type == MT_RING
||*/ mobj->type == MT_COIN
(mobj->type == MT_RING
|| mobj->type == MT_COIN
|| mobj->type == MT_BLUEBALL
|| mobj->type == MT_REDTEAMRING
|| mobj->type == MT_BLUETEAMRING
@ -10628,7 +10631,7 @@ void P_PrecipitationEffects(void)
void P_RespawnSpecials(void)
{
UINT8 p, pcount = 0;
tic_t time = 168*TICRATE;
tic_t time = 30*TICRATE; // Respawn things in empty dedicated servers
fixed_t x, y, z;
subsector_t *ss;
mobj_t *mo = NULL;
@ -10675,32 +10678,26 @@ void P_RespawnSpecials(void)
numgotboxes = 0;
}
// only respawn items when cv_itemrespawn is on
if (!cv_itemrespawn.value)
return;
// wait time depends on player count
for (p = 0; p < MAXPLAYERS; p++)
{
if (playeringame[p] && !players[p].spectator)
pcount++;
}
// Don't respawn in special stages!
if (G_IsSpecialStage(gamemap))
if (pcount == 1) // No respawn when alone
return;
else if (pcount > 1)
time = (180 - (pcount * 10))*TICRATE;
// only respawn items when cv_itemrespawn is on
//if (!cv_itemrespawn.value) // TODO: remove this cvar
//return;
// nothing left to respawn?
if (iquehead == iquetail)
return;
// wait time depends on player count
for (p = 0; p < MAXPLAYERS; p++)
{
if (!playeringame[p] || players[p].spectator)
pcount++;
}
if (pcount > 1)
time -= pcount * (8*TICRATE);
else if (pcount == 1) // No respawn when alone
return;
else
time = 30*TICRATE; // Respawn things in empty dedicated servers
// the first item in the queue is the first to respawn
if (leveltime - itemrespawntime[iquetail] < time)
return;