From b43d62367f9918fa83953059750f4f85d8049a47 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 4 Aug 2024 23:31:21 -0400 Subject: [PATCH] Nametag stuff - Enable item spy in all modes - Add CPU tags - New CPU indicator for tab screen --- src/doomstat.h | 2 +- src/g_game.c | 2 +- src/k_hud.cpp | 160 ++++++++++++++++++++++++++++++++++---------- src/k_hud.h | 1 + src/k_hud_track.cpp | 19 +++++- src/y_inter.cpp | 9 +-- 6 files changed, 150 insertions(+), 43 deletions(-) diff --git a/src/doomstat.h b/src/doomstat.h index a94d0de82..b880a4c22 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -664,7 +664,7 @@ enum GameTypeRules GTR_PAPERITEMS = 1<<6, // Replaces item boxes with paper item spawners GTR_POWERSTONES = 1<<7, // Battle Emerald collectables. GTR_KARMA = 1<<8, // Enables the Karma system if you're out of bumpers - GTR_ITEMARROWS = 1<<9, // Show item box arrows above players + // 1<<9 - UNUSED // Bonus gametype rules GTR_CHECKPOINTS = 1<<10, // Player respawns at specific checkpoints diff --git a/src/g_game.c b/src/g_game.c index 4ba14b585..1598507dc 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3241,7 +3241,7 @@ static gametype_t defaultgametypes[] = { "Battle", "GT_BATTLE", - GTR_SPHERES|GTR_BUMPERS|GTR_PAPERITEMS|GTR_POWERSTONES|GTR_KARMA|GTR_ITEMARROWS|GTR_PRISONS|GTR_BATTLESTARTS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_OVERTIME|GTR_CLOSERPLAYERS, + GTR_SPHERES|GTR_BUMPERS|GTR_PAPERITEMS|GTR_POWERSTONES|GTR_KARMA|GTR_PRISONS|GTR_BATTLESTARTS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_OVERTIME|GTR_CLOSERPLAYERS, TOL_BATTLE, int_scoreortimeattack, KARTSPEED_EASY, diff --git a/src/k_hud.cpp b/src/k_hud.cpp index 398f4cca3..262d88e7a 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -205,7 +205,7 @@ static patch_t *kp_itemminimap; static patch_t *kp_alagles[10]; static patch_t *kp_blagles[6]; -static patch_t *kp_cpu; +static patch_t *kp_cpu[2]; static patch_t *kp_nametagstem; @@ -818,7 +818,8 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_blagles[i], "%s", buffer); } - HU_UpdatePatch(&kp_cpu, "K_CPU"); + HU_UpdatePatch(&kp_cpu[0], "K_CPU1"); + HU_UpdatePatch(&kp_cpu[1], "K_CPU2"); HU_UpdatePatch(&kp_nametagstem, "K_NAMEST"); @@ -3874,19 +3875,6 @@ static boolean K_ShowPlayerNametag(player_t *p) return true; } -static void K_DrawLocalTagForPlayer(fixed_t x, fixed_t y, player_t *p, UINT8 id, UINT32 flags) -{ - UINT8 blink = ((leveltime / 7) & 1); - UINT8 *colormap = R_GetTranslationColormap(TC_RAINBOW, static_cast(p->skincolor), GTC_CACHE); - V_DrawFixedPatch(x, y, FRACUNIT, flags, kp_localtag[id][blink], colormap); -} - -static void K_DrawRivalTagForPlayer(fixed_t x, fixed_t y, UINT32 flags) -{ - UINT8 blink = ((leveltime / 7) & 1); - V_DrawFixedPatch(x, y, FRACUNIT, flags, kp_rival[blink], NULL); -} - static void K_DrawTypingDot(fixed_t x, fixed_t y, UINT8 duration, player_t *p, INT32 flags) { if (p->typing_duration > duration) @@ -3929,23 +3917,43 @@ static void K_DrawNameTagItemSpy(INT32 x, INT32 y, player_t *p, INT32 flags) box.colorize(p->skincolor).patch(kp_itembg[tiny ? 4 : 2]); - if (!(p->itemflags & IF_ITEMOUT) || (leveltime & 1)) + INT32 item_type = KITEM_NONE; + + if (p->itemRoulette.active == true && p->itemRoulette.ringbox == false) { - switch (p->itemtype) + item_type = 1 + (leveltime % (NUMKARTITEMS - 1)); + } + else if (!(p->itemflags & IF_ITEMOUT) || (leveltime & 1)) + { + item_type = p->itemtype; + } + + switch (item_type) + { + case KITEM_NONE: { + break; + } + case KITEM_INVINCIBILITY: + { box.patch(kp_invincibility[((leveltime % (6*3)) / 3) + (tiny ? 13 : 7)]); break; + } case KITEM_ORBINAUT: + { box.patch(kp_orbinaut[4 + tiny]); break; + } default: - if (patch_t *ico = K_GetCachedItemPatch(p->itemtype, 1 + tiny)) + { + if (patch_t *ico = K_GetCachedItemPatch(item_type, 1 + tiny)) { box.patch(ico); } + break; } } @@ -3992,7 +4000,77 @@ static void K_DrawNameTagSphereMeter(INT32 x, INT32 y, INT32 width, INT32 sphere } } -static void K_DrawNameTagForPlayer(fixed_t x, fixed_t y, player_t *p, INT32 flags) +static void K_DrawLocalTagForPlayer(fixed_t x, fixed_t y, player_t *p, UINT8 id, UINT32 flags) +{ + UINT8 blink = ((leveltime / 7) & 1); + UINT8 *colormap = R_GetTranslationColormap(TC_RAINBOW, static_cast(p->skincolor), GTC_CACHE); + + V_DrawFixedPatch(x, y, FRACUNIT, flags, kp_localtag[id][blink], colormap); +} + +static void K_DrawRivalTagForPlayer(fixed_t x, fixed_t y, player_t *p, UINT32 flags) +{ + if ((p->itemtype != KITEM_NONE && p->itemamount != 0) + || (p->itemRoulette.active == true && p->itemRoulette.ringbox == false)) + { + INT32 barx = 0, bary = 0; + + barx = (x * vid.dupx) / FRACUNIT; + bary = (y * vid.dupy) / FRACUNIT; + + barx += (16 * vid.dupx); + bary -= (25 * vid.dupx); + + // Center it if necessary + if (vid.width != BASEVIDWIDTH * vid.dupx) + { + barx += (vid.width - (BASEVIDWIDTH * vid.dupx)) / 2; + } + + if (vid.height != BASEVIDHEIGHT * vid.dupy) + { + bary += (vid.height - (BASEVIDHEIGHT * vid.dupy)) / 2; + } + + K_DrawNameTagItemSpy(barx, bary, p, flags); + } + + UINT8 blink = ((leveltime / 7) & 1); + V_DrawFixedPatch(x, y, FRACUNIT, flags, kp_rival[blink], NULL); +} + +static void K_DrawCPUTagForPlayer(fixed_t x, fixed_t y, player_t *p, UINT32 flags) +{ + if ((p->itemtype != KITEM_NONE && p->itemamount != 0) + || (p->itemRoulette.active == true && p->itemRoulette.ringbox == false)) + { + INT32 barx = 0, bary = 0; + + barx = (x * vid.dupx) / FRACUNIT; + bary = (y * vid.dupy) / FRACUNIT; + + barx += (16 * vid.dupx); + bary -= (25 * vid.dupx); + + // Center it if necessary + if (vid.width != BASEVIDWIDTH * vid.dupx) + { + barx += (vid.width - (BASEVIDWIDTH * vid.dupx)) / 2; + } + + if (vid.height != BASEVIDHEIGHT * vid.dupy) + { + bary += (vid.height - (BASEVIDHEIGHT * vid.dupy)) / 2; + } + + K_DrawNameTagItemSpy(barx, bary, p, flags); + } + + UINT8 blink = ((leveltime / 7) & 1); + V_DrawFixedPatch(x, y, FRACUNIT, flags, kp_cpu[blink], NULL); +} + +static void K_DrawNameTagForPlayer(fixed_t x, fixed_t y, player_t *p, UINT32 flags) { const INT32 clr = skincolors[p->skincolor].chatcolor; const INT32 namelen = V_ThinStringWidth(player_names[p - players], 0); @@ -4042,7 +4120,8 @@ static void K_DrawNameTagForPlayer(fixed_t x, fixed_t y, player_t *p, INT32 flag } // see also K_CullTargetList - if ((gametyperules & GTR_ITEMARROWS) && p->itemtype != KITEM_NONE && p->itemamount != 0) + if ((p->itemtype != KITEM_NONE && p->itemamount != 0) + || (p->itemRoulette.active == true && p->itemRoulette.ringbox == false)) { K_DrawNameTagItemSpy(barx, bary, p, flags); } @@ -4079,6 +4158,10 @@ playertagtype_t K_WhichPlayerTag(player_t *p) { return PLAYERTAG_RIVAL; } + else if (K_ShowPlayerNametag(p) == true) + { + return PLAYERTAG_CPU; + } } else if (netgame || demo.playback) { @@ -4097,25 +4180,30 @@ void K_DrawPlayerTag(fixed_t x, fixed_t y, player_t *p, playertagtype_t type, bo switch (type) { - case PLAYERTAG_LOCAL: - flags |= V_HUDTRANS|V_SPLITSCREEN; - K_DrawLocalTagForPlayer(x, y, p, G_PartyPosition(p - players), flags); - break; + case PLAYERTAG_LOCAL: + flags |= V_SPLITSCREEN; + K_DrawLocalTagForPlayer(x, y, p, G_PartyPosition(p - players), flags); + break; - case PLAYERTAG_RIVAL: - flags |= V_HUDTRANS|V_SPLITSCREEN; - K_DrawRivalTagForPlayer(x, y, flags); - break; + case PLAYERTAG_RIVAL: + flags |= V_SPLITSCREEN; + K_DrawRivalTagForPlayer(x, y, p, flags); + break; - case PLAYERTAG_NAME: - // We only care about the trans flag here (based?) as well as V_VFLIP. - flags |= foreground ? 0 : V_60TRANS; - K_DrawNameTagForPlayer(x, y, p, flags); - K_DrawTypingNotifier(x, y, p, flags); - break; + case PLAYERTAG_CPU: + flags |= V_SPLITSCREEN; + flags |= foreground ? 0 : V_60TRANS; + K_DrawCPUTagForPlayer(x, y, p, flags); + break; - default: - break; + case PLAYERTAG_NAME: + flags |= foreground ? 0 : V_60TRANS; + K_DrawNameTagForPlayer(x, y, p, flags); + K_DrawTypingNotifier(x, y, p, flags); + break; + + default: + break; } } diff --git a/src/k_hud.h b/src/k_hud.h index 698b72653..c6ca841fc 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -119,6 +119,7 @@ typedef enum { PLAYERTAG_NONE, PLAYERTAG_LOCAL, + PLAYERTAG_CPU, PLAYERTAG_RIVAL, PLAYERTAG_NAME, } diff --git a/src/k_hud_track.cpp b/src/k_hud_track.cpp index 4593673e4..f4bacdd09 100644 --- a/src/k_hud_track.cpp +++ b/src/k_hud_track.cpp @@ -735,11 +735,28 @@ void K_CullTargetList(std::vector& targetList) bit = 2; // nametags will cull on a separate plane // see also K_DrawNameTagForPlayer - if ((gametyperules & GTR_ITEMARROWS) && p->itemtype != KITEM_NONE && p->itemamount != 0) + if ((p->itemtype != KITEM_NONE && p->itemamount != 0) + || (p->itemRoulette.active == true && p->itemRoulette.ringbox == false)) { x1 -= 24 * FRACUNIT; } } + else if (tr.nametag == PLAYERTAG_RIVAL || tr.nametag == PLAYERTAG_CPU) + { + const player_t* p = tr.mobj->player; + + x1 = tr.result.x - (14 * FRACUNIT); + x2 = tr.result.x + (14 * FRACUNIT); + y1 = tr.result.y - (20 * FRACUNIT); + y2 = tr.result.y - (4 * FRACUNIT); + bit = 2; // nametags will cull on a separate plane + + // see also K_DrawNameTagForPlayer + if (p->itemtype != KITEM_NONE && p->itemamount != 0) + { + y1 -= 23 * FRACUNIT; + } + } else if (tr.nametag != PLAYERTAG_NONE) { return; diff --git a/src/y_inter.cpp b/src/y_inter.cpp index b6a9735a0..935303fbf 100644 --- a/src/y_inter.cpp +++ b/src/y_inter.cpp @@ -478,6 +478,7 @@ void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 xoffset) INT32 hilicol = highlightflags; patch_t *resbar = static_cast(W_CachePatchName("R_RESBAR", PU_PATCH)); // Results bars for players + patch_t *cpu = static_cast(W_CachePatchName("K_CPU", PU_PATCH)); if (drawping || standings->rankingsmode != 0) { @@ -710,11 +711,11 @@ void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 xoffset) { if (players[pnum].bot) { - /*V_DrawScaledPatch( - x2, y-1, + V_DrawScaledPatch( + x2-2 + (datarightofcolumn ? 2 : -2), y-2, 0, - kp_cpu - );*/ + cpu + ); } else {