From b0ae2f1cfaebbe9bd36cb6cbb466c37b1acf930e Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 15 Mar 2019 00:29:12 -0400 Subject: [PATCH] Finishing touches --- src/dehacked.c | 3 -- src/info.c | 3 -- src/info.h | 2 -- src/k_kart.c | 88 +++++++++++++++++++++++++++++++++----------------- 4 files changed, 59 insertions(+), 37 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 48fc60b69..bd054f7a3 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7152,9 +7152,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_OPAQUESMOKE4", "S_OPAQUESMOKE5", - // Chaotix draft band - "S_DRAFTBAND", - #ifdef SEENAMES "S_NAMECHECK", #endif diff --git a/src/info.c b/src/info.c index c2fab68f6..f297fb0aa 100644 --- a/src/info.c +++ b/src/info.c @@ -3401,9 +3401,6 @@ state_t states[NUMSTATES] = {SPR_SMOK, 3, 7, {NULL}, 0, 0, S_OPAQUESMOKE5}, // S_OPAQUESMOKE4 {SPR_SMOK, 4, 8, {NULL}, 0, 0, S_NULL}, // S_OPAQUESMOKE5 - // Chaotix draft band - {SPR_FWRK, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_DRAFTBAND - #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK #endif diff --git a/src/info.h b/src/info.h index c38d9d9cc..0e23a07c5 100644 --- a/src/info.h +++ b/src/info.h @@ -4058,8 +4058,6 @@ typedef enum state S_OPAQUESMOKE4, S_OPAQUESMOKE5, - S_DRAFTBAND, - #ifdef SEENAMES S_NAMECHECK, #endif diff --git a/src/k_kart.c b/src/k_kart.c index 333749a1c..612ce21ed 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1559,9 +1559,9 @@ static void K_UpdateDraft(player_t *player) // Distance you have to be to draft. If you're still accelerating, then this distance is lessened. // This distance biases toward low weight! (min weight is 2368 units, max weight is 832 units) - draftdistance = (832 + ((9 - player->kartweight) * 192)) * mapobjectscale; + draftdistance = (2048 + (512 * (9 - player->kartweight))) * mapobjectscale; if (player->speed < topspd) - draftdistance = FixedDiv(FixedMul(player->speed, draftdistance), topspd); + draftdistance = FixedMul(draftdistance, FixedDiv(player->speed, topspd)); // Let's hunt for players to draft off of! for (i = 0; i < MAXPLAYERS; i++) @@ -1580,66 +1580,98 @@ static void K_UpdateDraft(player_t *player) if (players[i].speed < 20*mapobjectscale) continue; - dist = P_AproxDistance(P_AproxDistance(players[i].mo->x - player->mo->x, players[i].mo->y - player->mo->y), players[i].mo->z - player->mo->z); + yourangle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); + theirangle = R_PointToAngle2(0, 0, players[i].mo->momx, players[i].mo->momy); - // Not close enough to draft. - if (dist > draftdistance) + diff = R_PointToAngle2(player->mo->x, player->mo->y, players[i].mo->x, players[i].mo->y) - yourangle; + if (diff > ANGLE_180) + diff = InvAngle(diff); + + // Not in front of this player. + if (diff > ANGLE_90) continue; - yourangle = R_PointToAngle2(0,0,player->mo->momx,player->mo->momy); - theirangle = R_PointToAngle2(0,0,players[i].mo->momx,players[i].mo->momy); - diff = yourangle - theirangle; if (diff > ANGLE_180) diff = InvAngle(diff); // Not moving in the same direction. - if (diff > ANGLE_90) + if (diff > ANG10) continue; - player->kartstuff[k_draftleeway] = TICRATE/2; + dist = P_AproxDistance(P_AproxDistance(players[i].mo->x - player->mo->x, players[i].mo->y - player->mo->y), players[i].mo->z - player->mo->z); + + // TOO close to draft. + if (dist < RING_DIST/2) + continue; + + // Not close enough to draft. + if (dist > draftdistance) + continue; + + player->kartstuff[k_draftleeway] = 10; // Draft power is used later in K_GetKartBoostPower, ranging from 0 for normal speed and FRACUNIT for max draft speed. // How much this increments every tic biases toward acceleration! (min speed is 6.25% per tic, max speed is 0.25% per tic) if (player->kartstuff[k_draftpower] < FRACUNIT) - player->kartstuff[k_draftpower] += (FRACUNIT/400) + ((9 - player->kartspeed) * ((3*FRACUNIT) / 400)); + player->kartstuff[k_draftpower] += (FRACUNIT/400) + ((9 - player->kartspeed) * (FRACUNIT/400)); if (player->kartstuff[k_draftpower] > FRACUNIT) player->kartstuff[k_draftpower] = FRACUNIT; // Spawn in the visual! - if (leveltime & 1) + //if (leveltime & 1) { - const fixed_t spacing = 256; - UINT8 amt = (dist / mapobjectscale) / spacing; +#define CHAOTIXBANDLEN 15 +#define CHAOTIXBANDCOLORS 9 + static const UINT8 colors[CHAOTIXBANDCOLORS] = { + SKINCOLOR_SAPPHIRE, + SKINCOLOR_PLATINUM, + SKINCOLOR_TEA, + SKINCOLOR_GARDEN, + SKINCOLOR_MUSTARD, + SKINCOLOR_YELLOW, + SKINCOLOR_ORANGE, + SKINCOLOR_SCARLET, + SKINCOLOR_CHERRY + }; + UINT8 c = FixedMul(CHAOTIXBANDCOLORS<> FRACBITS; + UINT8 n = CHAOTIXBANDLEN; UINT8 offset = ((leveltime / 3) % 3); fixed_t stepx, stepy, stepz; fixed_t curx, cury, curz; - stepx = (players[i].mo->x - player->mo->x) / amt; - stepy = (players[i].mo->y - player->mo->y) / amt; - stepz = ((players[i].mo->z + (players[i].mo->height / 2)) - (player->mo->z + (player->mo->height / 2))) / amt; + stepx = (players[i].mo->x - player->mo->x) / CHAOTIXBANDLEN; + stepy = (players[i].mo->y - player->mo->y) / CHAOTIXBANDLEN; + stepz = ((players[i].mo->z + (players[i].mo->height / 2)) - (player->mo->z + (player->mo->height / 2))) / CHAOTIXBANDLEN; curx = player->mo->x + stepx; cury = player->mo->y + stepy; curz = player->mo->z + stepz; - while (amt > 0) + while (n) { if (offset == 0) { - mobj_t *band = P_SpawnMobj(curx, cury, curz + (24*mapobjectscale), MT_THOK); - P_SetMobjState(band, S_DRAFTBAND); - band->color = player->skincolor; + mobj_t *band = P_SpawnMobj(curx + (P_RandomRange(-12,12)*mapobjectscale), + cury + (P_RandomRange(-12,12)*mapobjectscale), + curz + (P_RandomRange(24,48)*mapobjectscale), + MT_SIGNSPARKLE); + P_SetMobjState(band, S_SIGNSPARK1 + (abs(leveltime+offset) % 11)); + P_SetScale(band, (band->destscale = (3*band->scale)/2)); + band->color = colors[c]; + band->colorized = true; + band->fuse = 2; } curx += stepx; cury += stepy; curz += stepz; - offset = (offset+1) % 3; - amt--; + offset = abs(offset-1) % 3; + n--; } +#undef CHAOTIXBANDLEN } return; // Finished doing our draft. @@ -2122,7 +2154,7 @@ static void K_GetKartBoostPower(player_t *player) ADDBOOST(FRACUNIT/4, 4*FRACUNIT); // + 25% top speed, + 400% acceleration if (player->kartstuff[k_ringboost]) // Ring Boost - ADDBOOST(FRACUNIT/4, 4*FRACUNIT); // + 20% top speed, + 200% acceleration + ADDBOOST(FRACUNIT/5, 4*FRACUNIT); // + 20% top speed, + 200% acceleration if (player->kartstuff[k_growshrinktimer] > 0) // Grow { @@ -2132,10 +2164,7 @@ static void K_GetKartBoostPower(player_t *player) } if (player->kartstuff[k_draftpower] > 0) // Drafting - { - speedboost += player->kartstuff[k_draftpower]; // + 0-100% - accelboost += player->kartstuff[k_draftpower]; // + 0-100% - } + speedboost += (player->kartstuff[k_draftpower]) / 3; // + 0-33.3% player->kartstuff[k_boostpower] = boostpower; @@ -4786,7 +4815,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // Speed lines if ((EITHERSNEAKER(player) || player->kartstuff[k_ringboost] - || player->kartstuff[k_driftboost] || player->kartstuff[k_startboost]) + || player->kartstuff[k_driftboost] || player->kartstuff[k_startboost] + || player->kartstuff[k_draftpower]) && player->speed > 0) { mobj_t *fast = P_SpawnMobj(player->mo->x + (P_RandomRange(-36,36) * player->mo->scale),