From 3dd89eb7c852a80dd6f4afce044a4937c8bee57b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 7 Apr 2019 14:49:51 -0400 Subject: [PATCH] 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 --- src/dehacked.c | 12 ++++++++++++ src/info.c | 12 ++++++++++++ src/info.h | 12 ++++++++++++ src/k_kart.c | 5 +++-- src/p_enemy.c | 27 +++++++++++++++++++++------ src/p_mobj.c | 43 ++++++++++++++++++++----------------------- 6 files changed, 80 insertions(+), 31 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index bd054f7a3..dfcd18501 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -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", diff --git a/src/info.c b/src/info.c index f297fb0aa..adf1cbb00 100644 --- a/src/info.c +++ b/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 diff --git a/src/info.h b/src/info.h index 0e23a07c5..6a35f011c 100644 --- a/src/info.h +++ b/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, diff --git a/src/k_kart.c b/src/k_kart.c index 63afd171a..f50f3d2cc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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 diff --git a/src/p_enemy.c b/src/p_enemy.c index a8e6dd998..5e3247b96 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -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<momz = 5<momz = 8<fuse = 120*TICRATE; P_RemoveMobj(actor); return; diff --git a/src/p_mobj.c b/src/p_mobj.c index 1d91c8239..664222de6 100644 --- a/src/p_mobj.c +++ b/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;