diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 8f4e63aa..1e586d79 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -315,6 +315,7 @@ consvar_t cv_tripleredshell = {"tripleredshells", "On", CV_NETVAR|CV_CHEAT, CV consvar_t cv_lightning = {"lightning", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_karthud = {"karthud", "Default", CV_SAVE|CV_CALL, karthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartcheck = {"kartcheck", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartcc = {"kartcc", "100cc", CV_NETVAR, kartcc_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {99, "MAX"}, {0, NULL}}; consvar_t cv_kartballoons = {"kartballoons", "3", CV_NETVAR, kartballoons_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 75d3a0ba..42b208f2 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -105,6 +105,7 @@ extern consvar_t cv_greenshell, cv_redshell, cv_laserwisp, cv_triplegreenshell, extern consvar_t cv_blueshell, cv_jaws, cv_fireflower, cv_tripleredshell, cv_lightning; extern consvar_t cv_karthud; +extern consvar_t cv_kartcheck; extern consvar_t cv_kartcc; extern consvar_t cv_kartballoons; extern consvar_t cv_kartfrantic; diff --git a/src/k_kart.c b/src/k_kart.c index 7473f87b..625665b4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -301,6 +301,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_tripleredshell); CV_RegisterVar(&cv_lightning); + CV_RegisterVar(&cv_kartcheck); CV_RegisterVar(&cv_kartcc); CV_RegisterVar(&cv_kartballoons); CV_RegisterVar(&cv_kartfrantic); @@ -3431,6 +3432,12 @@ static patch_t *kp_triplegreenshellicon; static patch_t *kp_singleredshellicon; static patch_t *kp_doubleredshellicon; static patch_t *kp_tripleredshellicon; +static patch_t *kp_check; +static patch_t *kp_checkw; +static patch_t *kp_checkstar; +static patch_t *kp_checkstarw; +static patch_t *kp_checkmega; +static patch_t *kp_checkmegaw; /* static patch_t *kp_neonoitem; static patch_t *kp_electroshield; @@ -3567,6 +3574,14 @@ void K_LoadKartHUDGraphics(void) kp_doubleredshellicon = W_CachePatchName("K_TRRED2", PU_HUDGFX); kp_tripleredshellicon = W_CachePatchName("K_TRRED3", PU_HUDGFX); + // CHECK indicators + kp_check = W_CachePatchName("K_CHECK1", PU_HUDGFX); + kp_checkw = W_CachePatchName("K_CHECK2", PU_HUDGFX); + kp_checkstar = W_CachePatchName("K_CHECK3", PU_HUDGFX); + kp_checkstarw = W_CachePatchName("K_CHECK4", PU_HUDGFX); + kp_checkmega = W_CachePatchName("K_CHECK5", PU_HUDGFX); + kp_checkmegaw = W_CachePatchName("K_CHECK6", PU_HUDGFX); + /* // Neo-Kart item windows kp_electroshield = W_CachePatchName("KNITELEC", PU_HUDGFX); @@ -4176,6 +4191,98 @@ static void K_drawKartSpeedometer(void) } } +fixed_t K_FindCheckX(INT32 p, fixed_t mx, fixed_t my) +{ + fixed_t camx, camy, dist, x; + angle_t camangle; + camera_t *c = &camera; + + if (players[p].awayviewtics) + { + camx = players[p].awayviewmobj->x; + camy = players[p].awayviewmobj->y; + camangle = players[p].awayviewmobj->angle; + } + else if (c->chase) + { + camx = c->x; + camy = c->y; + camangle = c->angle; + } + else + { + camx = players[p].mo->x; + camy = players[p].mo->y; + camangle = players[p].mo->angle; + } + + dist = abs(R_PointToDist2(camx, camy, mx, my)); + if (dist > RING_DIST) + return -320; + + camangle = camangle+ANGLE_180; + x = camangle-R_PointToAngle2(camx, camy, mx, my); + + if (x > ANGLE_90 || x < ANGLE_270) + return -320; + else + x = FixedMul(FINETANGENT(((x+ANGLE_90)>>ANGLETOFINESHIFT) & FINEMASK), 160<>FRACBITS); +} + +static void K_drawKartPlayerCheck(void) +{ + INT32 i; + UINT8 *colormap; + fixed_t x; + patch_t *localpatch; + + if (splitscreen) + return; + + if (players[displayplayer].mo == NULL) + return; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (i == displayplayer) + continue; + if (players[i].mo == NULL) + continue; + + if ((players[i].kartstuff[k_startimer] <= 0) && (leveltime & 2)) + { + if (players[i].kartstuff[k_megashroom] || players[i].kartstuff[k_growshrinktimer] > 0) + localpatch = kp_checkmegaw; + else if (players[i].kartstuff[k_star] || players[i].kartstuff[k_startimer]) + localpatch = kp_checkstarw; + else + localpatch = kp_checkw; + } + else + { + if (players[i].kartstuff[k_megashroom] || players[i].kartstuff[k_growshrinktimer] > 0) + localpatch = kp_checkmega; + else if (players[i].kartstuff[k_star] || players[i].kartstuff[k_startimer]) + localpatch = kp_checkstar; + else + localpatch = kp_check; + } + + x = K_FindCheckX(displayplayer, players[i].mo->x, players[i].mo->y); + if (x <= 320 && x >= 0) + { + if (x < 14) + x = 14; + else if (x > 306) + x = 306; + colormap = R_GetTranslationColormap(-1, players[i].mo->color, 0); + V_DrawMappedPatch(x, 200, 0, localpatch, colormap); + } + } +} + static void K_drawStartLakitu(void) { patch_t *localpatch = kp_nodraw; @@ -4287,6 +4394,10 @@ void K_drawKartHUD(void) // This is handled by console/menu values K_initKartHUD(); + // Draw the CHECK indicator first, so it's overlapped by everything else + if (cv_kartcheck.value) + K_drawKartPlayerCheck(); + // Draw Lakitu // This is done first so that regardless of HUD layers, // he'll appear to be in the 'real world'