mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-01-14 02:32:38 +00:00
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:
parent
23948c14ec
commit
3dd89eb7c8
6 changed files with 80 additions and 31 deletions
|
|
@ -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",
|
||||
|
|
|
|||
12
src/info.c
12
src/info.c
|
|
@ -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
|
||||
|
|
|
|||
12
src/info.h
12
src/info.h
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
43
src/p_mobj.c
43
src/p_mobj.c
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue