diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b4a7ff490..4bb0368a9 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -18,6 +18,7 @@ set(SRB2_CORE_SOURCES
g_game.c
g_input.c
g_splitscreen.c
+ font.c
hu_stuff.c
i_tcp.c
info.c
@@ -73,6 +74,7 @@ set(SRB2_CORE_HEADERS
g_game.h
g_input.h
g_state.h
+ font.h
hu_stuff.h
i_joy.h
i_net.h
diff --git a/src/Makefile b/src/Makefile
index af94a2773..bdbe71f70 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -502,6 +502,7 @@ OBJS:=$(i_main_o) \
$(OBJDIR)/am_map.o \
$(OBJDIR)/command.o \
$(OBJDIR)/console.o \
+ $(OBJDIR)/font.o \
$(OBJDIR)/hu_stuff.o \
$(OBJDIR)/y_inter.o \
$(OBJDIR)/st_stuff.o \
@@ -814,7 +815,7 @@ $(OBJDIR)/v_video.o: v_video.c doomdef.h doomtype.h g_state.h m_swap.h r_local.h
tables.h m_fixed.h screen.h command.h m_bbox.h r_main.h d_player.h \
p_pspr.h info.h d_think.h sounds.h p_mobj.h doomdata.h d_ticcmd.h \
r_data.h r_defs.h r_state.h r_bsp.h r_segs.h r_plane.h r_sky.h \
- r_things.h r_draw.h v_video.h hu_stuff.h d_event.h w_wad.h console.h \
+ r_things.h r_draw.h v_video.h font.h hu_stuff.h d_event.h w_wad.h console.h \
i_video.h z_zone.h doomstat.h d_clisrv.h d_netcmd.h
$(CC) $(CFLAGS) -fno-omit-frame-pointer $(WFLAGS) -c $< -o $@
endif
diff --git a/src/font.c b/src/font.c
new file mode 100644
index 000000000..aeaabd018
--- /dev/null
+++ b/src/font.c
@@ -0,0 +1,77 @@
+// SONIC ROBO BLAST 2
+//-----------------------------------------------------------------------------
+// Copyright (C) 1999-2018 by Sonic Team Junior.
+// Copyright (C) 2019 by Kart Krew.
+//
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
+//-----------------------------------------------------------------------------
+/// \file font.c
+/// \brief Font setup
+
+#include "doomdef.h"
+#include "hu_stuff.h"
+#include "font.h"
+#include "z_zone.h"
+
+font_t fontv[MAX_FONTS];
+int fontc;
+
+static void
+FontCache (font_t *fnt)
+{
+ int i;
+ int c;
+
+ c = fnt->start;
+ for (i = 0; i < fnt->size; ++i, ++c)
+ {
+ fnt->font[i] = HU_CachePatch(
+ "%s%.*d",
+ fnt->prefix,
+ fnt->digits,
+ c);
+ }
+}
+
+void
+Font_Load (void)
+{
+ int i;
+ for (i = 0; i < fontc; ++i)
+ {
+ FontCache(&fontv[i]);
+ }
+}
+
+int
+Font_DumbRegister (const font_t *sfnt)
+{
+ font_t *fnt;
+
+ if (fontc == MAX_FONTS)
+ return -1;
+
+ fnt = &fontv[fontc];
+
+ memcpy(fnt, sfnt, sizeof (font_t));
+
+ if (!( fnt->font = ZZ_Alloc(sfnt->size * sizeof (patch_t *)) ))
+ return -1;
+
+ return fontc++;
+}
+
+int
+Font_Register (const font_t *sfnt)
+{
+ int d;
+
+ d = Font_DumbRegister(sfnt);
+
+ if (d >= 0)
+ FontCache(&fontv[d]);
+
+ return d;
+}
diff --git a/src/font.h b/src/font.h
new file mode 100644
index 000000000..88bedb44f
--- /dev/null
+++ b/src/font.h
@@ -0,0 +1,49 @@
+// SONIC ROBO BLAST 2
+//-----------------------------------------------------------------------------
+// Copyright (C) 1999-2018 by Sonic Team Junior.
+// Copyright (C) 2019 by Kart Krew.
+//
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
+//-----------------------------------------------------------------------------
+/// \file font.h
+/// \brief Font setup
+
+#ifndef __FONT_H__
+#define __FONT_H__
+
+#define MAX_FONTS 32
+
+typedef struct font font_t;
+
+struct font
+{
+ patch_t **font;
+
+ UINT8 start;
+ UINT8 size;
+
+ char prefix[8];/* 7 used at most */
+ unsigned digits : 2;
+};
+
+extern font_t fontv[MAX_FONTS];
+extern int fontc;
+
+/*
+Reloads already registered fonts.
+*/
+void Font_Load (void);
+
+/*
+Registers and loads a new font.
+*/
+int Font_Register (const font_t *);
+
+/*
+Register a new font, but do not load it yet.
+*/
+int Font_DumbRegister (const font_t *);
+
+#endif
diff --git a/src/g_game.c b/src/g_game.c
index 2df3be779..9c283025b 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -8107,7 +8107,7 @@ boolean G_DemoTitleResponder(event_t *ev)
return true;
}
- if ((ch >= HU_FONTSTART && ch <= HU_FONTEND && hu_font[ch-HU_FONTSTART])
+ if ((ch >= HU_FONTSTART && ch <= HU_FONTEND && fontv[HU_FONT].font[ch-HU_FONTSTART])
|| ch == ' ') // Allow spaces, of course
{
len = strlen(demo.titlename);
diff --git a/src/hu_stuff.c b/src/hu_stuff.c
index 7338a232b..1044dee19 100644
--- a/src/hu_stuff.c
+++ b/src/hu_stuff.c
@@ -14,6 +14,7 @@
#include "doomdef.h"
#include "byteptr.h"
#include "hu_stuff.h"
+#include "font.h"
#include "m_menu.h" // gametype_cons_t
#include "m_cond.h" // emblems
@@ -53,6 +54,7 @@
#include "s_sound.h" // song credits
#include "k_kart.h"
+#include "k_color.h"
// coords are scaled
#define HU_INPUTX 0
@@ -64,19 +66,9 @@
//-------------------------------------------
// heads up font
//-------------------------------------------
-patch_t *hu_font[HU_FONTSIZE];
-patch_t *kart_font[KART_FONTSIZE]; // SRB2kart
-patch_t *tny_font[HU_FONTSIZE];
-patch_t *tallnum[10]; // 0-9
-patch_t *nightsnum[10]; // 0-9
-
-// Level title and credits fonts
-patch_t *lt_font[LT_FONTSIZE];
-patch_t *cred_font[CRED_FONTSIZE];
// ping font
// Note: I'd like to adress that at this point we might *REALLY* want to work towards a common drawString function that can take any font we want because this is really turning into a MESS. :V -Lat'
-patch_t *pingnum[10];
patch_t *pinggfx[5]; // small ping graphic
patch_t *mping[5]; // smaller ping graphic
@@ -188,137 +180,53 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum);
void HU_LoadGraphics(void)
{
- char buffer[9];
- INT32 i, j;
+ INT32 i;
if (dedicated)
return;
- j = HU_FONTSTART;
- for (i = 0; i < HU_FONTSIZE; i++, j++)
- {
- // cache the heads-up font for entire game execution
- sprintf(buffer, "STCFN%.3d", j);
- if (W_CheckNumForName(buffer) == LUMPERROR)
- hu_font[i] = NULL;
- else
- hu_font[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
-
- // tiny version of the heads-up font
- sprintf(buffer, "TNYFN%.3d", j);
- if (W_CheckNumForName(buffer) == LUMPERROR)
- tny_font[i] = NULL;
- else
- tny_font[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
- }
-
- // cache the level title font for entire game execution
- lt_font[0] = (patch_t *)W_CachePatchName("LTFNT039", PU_HUDGFX); /// \note fake start hack
-
- // Number support
- lt_font[9] = (patch_t *)W_CachePatchName("LTFNT048", PU_HUDGFX);
- lt_font[10] = (patch_t *)W_CachePatchName("LTFNT049", PU_HUDGFX);
- lt_font[11] = (patch_t *)W_CachePatchName("LTFNT050", PU_HUDGFX);
- lt_font[12] = (patch_t *)W_CachePatchName("LTFNT051", PU_HUDGFX);
- lt_font[13] = (patch_t *)W_CachePatchName("LTFNT052", PU_HUDGFX);
- lt_font[14] = (patch_t *)W_CachePatchName("LTFNT053", PU_HUDGFX);
- lt_font[15] = (patch_t *)W_CachePatchName("LTFNT054", PU_HUDGFX);
- lt_font[16] = (patch_t *)W_CachePatchName("LTFNT055", PU_HUDGFX);
- lt_font[17] = (patch_t *)W_CachePatchName("LTFNT056", PU_HUDGFX);
- lt_font[18] = (patch_t *)W_CachePatchName("LTFNT057", PU_HUDGFX);
-
- // SRB2kart
- j = KART_FONTSTART;
- for (i = 0; i < KART_FONTSIZE; i++, j++)
- {
- // cache the heads-up font for entire game execution
- sprintf(buffer, "MKFNT%.3d", j);
- if (W_CheckNumForName(buffer) == LUMPERROR)
- kart_font[i] = NULL;
- else
- kart_font[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
- }
- //
-
- j = LT_FONTSTART;
- for (i = 0; i < LT_FONTSIZE; i++)
- {
- sprintf(buffer, "LTFNT%.3d", j);
- j++;
-
- if (W_CheckNumForName(buffer) == LUMPERROR)
- lt_font[i] = NULL;
- else
- lt_font[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
- }
-
- // cache the credits font for entire game execution (why not?)
- j = CRED_FONTSTART;
- for (i = 0; i < CRED_FONTSIZE; i++)
- {
- sprintf(buffer, "CRFNT%.3d", j);
- j++;
-
- if (W_CheckNumForName(buffer) == LUMPERROR)
- cred_font[i] = NULL;
- else
- cred_font[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
- }
-
- //cache numbers too!
- for (i = 0; i < 10; i++)
- {
- sprintf(buffer, "STTNUM%d", i);
- tallnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
- sprintf(buffer, "NGTNUM%d", i);
- nightsnum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX);
- sprintf(buffer, "PINGN%d", i);
- pingnum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX);
- }
+ Font_Load();
// minus for negative tallnums
- tallminus = (patch_t *)W_CachePatchName("STTMINUS", PU_HUDGFX);
+ tallminus = HU_CachePatch("STTMINUS");
// cache the crosshairs, don't bother to know which one is being used,
// just cache all 3, they're so small anyway.
for (i = 0; i < HU_CROSSHAIRS; i++)
{
- sprintf(buffer, "CROSHAI%c", '1'+i);
- crosshair[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
+ crosshair[i] = HU_CachePatch("CROSHAI%c", '1'+i);
}
- emblemicon = W_CachePatchName("EMBLICON", PU_HUDGFX);
- tokenicon = W_CachePatchName("TOKNICON", PU_HUDGFX);
+ emblemicon = HU_CachePatch("EMBLICON");
+ tokenicon = HU_CachePatch("TOKNICON");
- emeraldpics[0] = W_CachePatchName("CHAOS1", PU_HUDGFX);
- emeraldpics[1] = W_CachePatchName("CHAOS2", PU_HUDGFX);
- emeraldpics[2] = W_CachePatchName("CHAOS3", PU_HUDGFX);
- emeraldpics[3] = W_CachePatchName("CHAOS4", PU_HUDGFX);
- emeraldpics[4] = W_CachePatchName("CHAOS5", PU_HUDGFX);
- emeraldpics[5] = W_CachePatchName("CHAOS6", PU_HUDGFX);
- emeraldpics[6] = W_CachePatchName("CHAOS7", PU_HUDGFX);
- tinyemeraldpics[0] = W_CachePatchName("TEMER1", PU_HUDGFX);
- tinyemeraldpics[1] = W_CachePatchName("TEMER2", PU_HUDGFX);
- tinyemeraldpics[2] = W_CachePatchName("TEMER3", PU_HUDGFX);
- tinyemeraldpics[3] = W_CachePatchName("TEMER4", PU_HUDGFX);
- tinyemeraldpics[4] = W_CachePatchName("TEMER5", PU_HUDGFX);
- tinyemeraldpics[5] = W_CachePatchName("TEMER6", PU_HUDGFX);
- tinyemeraldpics[6] = W_CachePatchName("TEMER7", PU_HUDGFX);
+ emeraldpics[0] = HU_CachePatch("CHAOS1");
+ emeraldpics[1] = HU_CachePatch("CHAOS2");
+ emeraldpics[2] = HU_CachePatch("CHAOS3");
+ emeraldpics[3] = HU_CachePatch("CHAOS4");
+ emeraldpics[4] = HU_CachePatch("CHAOS5");
+ emeraldpics[5] = HU_CachePatch("CHAOS6");
+ emeraldpics[6] = HU_CachePatch("CHAOS7");
+ tinyemeraldpics[0] = HU_CachePatch("TEMER1");
+ tinyemeraldpics[1] = HU_CachePatch("TEMER2");
+ tinyemeraldpics[2] = HU_CachePatch("TEMER3");
+ tinyemeraldpics[3] = HU_CachePatch("TEMER4");
+ tinyemeraldpics[4] = HU_CachePatch("TEMER5");
+ tinyemeraldpics[5] = HU_CachePatch("TEMER6");
+ tinyemeraldpics[6] = HU_CachePatch("TEMER7");
- songcreditbg = W_CachePatchName("K_SONGCR", PU_HUDGFX);
+ songcreditbg = HU_CachePatch("K_SONGCR");
// cache ping gfx:
for (i = 0; i < 5; i++)
{
- sprintf(buffer, "PINGGFX%d", i+1);
- pinggfx[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
- sprintf(buffer, "MPING%d", i+1);
- mping[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
+ pinggfx[i] = HU_CachePatch("PINGGFX%d", i+1);
+ mping[i] = HU_CachePatch("MPING%d", i+1);
}
// fps stuff
- framecounter = W_CachePatchName("FRAMER", PU_HUDGFX);
- frameslash = W_CachePatchName("FRAMESL", PU_HUDGFX);;
+ framecounter = HU_CachePatch("FRAMER");
+ frameslash = HU_CachePatch("FRAMESL");;
}
// Initialise Heads up
@@ -326,6 +234,8 @@ void HU_LoadGraphics(void)
//
void HU_Init(void)
{
+ font_t font;
+
#ifndef NONET
COM_AddCommand("say", Command_Say_f);
COM_AddCommand("sayto", Command_Sayto_f);
@@ -337,9 +247,78 @@ void HU_Init(void)
// set shift translation table
shiftxform = english_shiftxform;
+ /*
+ Setup fonts
+ */
+
+ if (!dedicated)
+ {
+#define DIM( s, n ) ( font.start = s, font.size = n )
+#define ADIM( name ) DIM (name ## _FONTSTART, name ## _FONTSIZE)
+#define PR( s ) strcpy(font.prefix, s)
+#define DIG( n ) ( font.digits = n )
+#define REG Font_DumbRegister(&font)
+
+ DIG (3);
+
+ ADIM (HU);
+
+ PR ("STCFN");
+ REG;
+
+ PR ("TNYFN");
+ REG;
+
+ ADIM (KART);
+ PR ("MKFNT");
+ REG;
+
+ ADIM (LT);
+ PR ("LTFNT");
+ REG;
+
+ ADIM (CRED);
+ PR ("CRFNT");
+ REG;
+
+ DIG (1);
+
+ DIM (0, 10);
+
+ PR ("STTNUM");
+ REG;
+
+ PR ("NGTNUM");
+ REG;
+
+ PR ("PINGN");
+ REG;
+
+#undef REG
+#undef DIG
+#undef PR
+#undef ADMIN
+#undef DIM
+ }
+
HU_LoadGraphics();
}
+patch_t *HU_CachePatch(const char *format, ...)
+{
+ va_list ap;
+ char buffer[9];
+
+ va_start (ap, format);
+ vsprintf(buffer, format, ap);
+ va_end (ap);
+
+ if (W_CheckNumForName(buffer) == LUMPERROR)
+ return NULL;
+ else
+ return (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
+}
+
static inline void HU_Stop(void)
{
headsupactive = false;
@@ -761,168 +740,27 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
const char *prefix = "", *cstart = "", *cend = "", *adminchar = "\x82~\x83", *remotechar = "\x82@\x83", *fmt2, *textcolor = "\x80";
char *tempchar = NULL;
- // player is a spectator?
- if (players[playernum].spectator)
+ if (players[playernum].spectator)
{
- cstart = "\x86"; // grey name
- textcolor = "\x86";
+ // grey text
+ cstart = textcolor = "\x86";
}
else if (target == -1) // say team
{
- if (players[playernum].ctfteam == 1) // red
+ if (players[playernum].ctfteam == 1)
{
- cstart = "\x85";
- textcolor = "\x85";
+ // red text
+ cstart = textcolor = "\x85";
}
- else // blue
+ else
{
- cstart = "\x84";
- textcolor = "\x84";
+ // blue text
+ cstart = textcolor = "\x84";
}
}
else
{
- const UINT8 color = players[playernum].skincolor;
-
- cstart = "\x83";
-
- switch (color)
- {
- case SKINCOLOR_WHITE:
- case SKINCOLOR_SILVER:
- case SKINCOLOR_SLATE:
- cstart = "\x80"; // White
- break;
- case SKINCOLOR_GREY:
- case SKINCOLOR_NICKEL:
- case SKINCOLOR_BLACK:
- case SKINCOLOR_SKUNK:
- case SKINCOLOR_PLATINUM:
- case SKINCOLOR_JET:
- cstart = "\x86"; // V_GRAYMAP
- break;
- case SKINCOLOR_SEPIA:
- case SKINCOLOR_BEIGE:
- case SKINCOLOR_CARAMEL:
- case SKINCOLOR_PEACH:
- case SKINCOLOR_BROWN:
- case SKINCOLOR_LEATHER:
- case SKINCOLOR_RUST:
- case SKINCOLOR_WRISTWATCH:
- cstart = "\x8e"; // V_BROWNMAP
- break;
- case SKINCOLOR_FAIRY:
- case SKINCOLOR_PINK:
- case SKINCOLOR_ROSE:
- case SKINCOLOR_LEMONADE:
- case SKINCOLOR_LILAC:
- case SKINCOLOR_BLOSSOM:
- case SKINCOLOR_TAFFY:
- cstart = "\x8d"; // V_PINKMAP
- break;
- case SKINCOLOR_CINNAMON:
- case SKINCOLOR_RUBY:
- case SKINCOLOR_RASPBERRY:
- case SKINCOLOR_RED:
- case SKINCOLOR_CRIMSON:
- case SKINCOLOR_MAROON:
- case SKINCOLOR_SCARLET:
- case SKINCOLOR_KETCHUP:
- cstart = "\x85"; // V_REDMAP
- break;
- case SKINCOLOR_DAWN:
- case SKINCOLOR_SUNSLAM:
- case SKINCOLOR_CREAMSICLE:
- case SKINCOLOR_ORANGE:
- case SKINCOLOR_ROSEWOOD:
- case SKINCOLOR_TANGERINE:
- cstart = "\x87"; // V_ORANGEMAP
- break;
- case SKINCOLOR_TAN:
- case SKINCOLOR_CREAM:
- cstart = "\x8f"; // V_TANMAP
- break;
- case SKINCOLOR_GOLD:
- case SKINCOLOR_ROYAL:
- case SKINCOLOR_BRONZE:
- case SKINCOLOR_COPPER:
- case SKINCOLOR_THUNDER:
- cstart = "\x8A"; // V_GOLDMAP
- break;
- case SKINCOLOR_POPCORN:
- case SKINCOLOR_YELLOW:
- case SKINCOLOR_MUSTARD:
- case SKINCOLOR_BANANA:
- case SKINCOLOR_OLIVE:
- case SKINCOLOR_CROCODILE:
- cstart = "\x82"; // V_YELLOWMAP
- break;
- case SKINCOLOR_ARTICHOKE:
- case SKINCOLOR_PERIDOT:
- case SKINCOLOR_VOMIT:
- case SKINCOLOR_GARDEN:
- case SKINCOLOR_LIME:
- case SKINCOLOR_HANDHELD:
- case SKINCOLOR_TEA:
- case SKINCOLOR_PISTACHIO:
- case SKINCOLOR_MOSS:
- case SKINCOLOR_CAMOUFLAGE:
- case SKINCOLOR_MINT:
- case SKINCOLOR_GREEN:
- case SKINCOLOR_PINETREE:
- case SKINCOLOR_TURTLE:
- case SKINCOLOR_SWAMP:
- case SKINCOLOR_DREAM:
- case SKINCOLOR_PLAGUE:
- case SKINCOLOR_EMERALD:
- case SKINCOLOR_ALGAE:
- cstart = "\x83"; // V_GREENMAP
- break;
- case SKINCOLOR_AQUAMARINE:
- case SKINCOLOR_TURQUOISE:
- case SKINCOLOR_TEAL:
- cstart = "\x8b"; // V_AQUAMAP
- break;
- case SKINCOLOR_PIGEON:
- case SKINCOLOR_ROBIN:
- case SKINCOLOR_CYAN:
- case SKINCOLOR_JAWZ:
- case SKINCOLOR_CERULEAN:
- case SKINCOLOR_NAVY:
- case SKINCOLOR_SAPPHIRE:
- cstart = "\x88"; // V_SKYMAP
- break;
- case SKINCOLOR_STEEL:
- case SKINCOLOR_ULTRAMARINE:
- case SKINCOLOR_PERIWINKLE:
- case SKINCOLOR_BLUE:
- case SKINCOLOR_MIDNIGHT:
- case SKINCOLOR_BLUEBERRY:
- case SKINCOLOR_NOVA:
- cstart = "\x84"; // V_BLUEMAP
- break;
- case SKINCOLOR_THISTLE:
- case SKINCOLOR_PURPLE:
- case SKINCOLOR_PASTEL:
- cstart = "\x81"; // V_PURPLEMAP
- break;
- case SKINCOLOR_MAGENTA:
- case SKINCOLOR_FUCHSIA:
- case SKINCOLOR_MOONSET:
- case SKINCOLOR_VIOLET:
- cstart = "\x8c"; // V_MAGENTAMAP
- break;
- case SKINCOLOR_DUSK:
- case SKINCOLOR_TOXIC:
- case SKINCOLOR_MAUVE:
- case SKINCOLOR_LAVENDER:
- case SKINCOLOR_BYZANTIUM:
- case SKINCOLOR_POMEGRANATE:
- cstart = "\x89"; // V_LAVENDERMAP
- break;
- default:
- break;
- }
+ cstart = "\x80" + (K_SkincolorToTextColor(players[playernum].skincolor) >> V_CHARCOLORSHIFT);
}
prefix = cstart;
@@ -932,6 +770,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
tempchar = (char *)Z_Calloc(strlen(cstart) + strlen(adminchar) + 1, PU_STATIC, NULL);
else if (IsPlayerAdmin(playernum))
tempchar = (char *)Z_Calloc(strlen(cstart) + strlen(remotechar) + 1, PU_STATIC, NULL);
+
if (tempchar)
{
if (playernum == serverplayer)
@@ -999,7 +838,7 @@ static inline boolean HU_keyInChatString(char *s, char ch)
{
size_t l;
- if ((ch >= HU_FONTSTART && ch <= HU_FONTEND && hu_font[ch-HU_FONTSTART])
+ if ((ch >= HU_FONTSTART && ch <= HU_FONTEND && fontv[HU_FONT].font[ch-HU_FONTSTART])
|| ch == ' ') // Allow spaces, of course
{
l = strlen(s);
@@ -1433,7 +1272,7 @@ static char *CHAT_WordWrap(INT32 x, INT32 w, INT32 option, const char *string)
c = toupper(c);
c -= HU_FONTSTART;
- if (c < 0 || c >= HU_FONTSIZE || !hu_font[c])
+ if (c < 0 || c >= HU_FONTSIZE || !fontv[HU_FONT].font[c])
{
chw = spacewidth;
lastusablespace = i;
diff --git a/src/hu_stuff.h b/src/hu_stuff.h
index c3da1d2a2..4ad473357 100644
--- a/src/hu_stuff.h
+++ b/src/hu_stuff.h
@@ -17,6 +17,7 @@
#include "d_event.h"
#include "w_wad.h"
#include "r_defs.h"
+#include "font.h"
//------------------------------------
// heads up font
@@ -42,6 +43,23 @@
#define CRED_FONTEND 'Z' // the last font character
#define CRED_FONTSIZE (CRED_FONTEND - CRED_FONTSTART + 1)
+#define X( name ) name ## _FONT
+/* fonts */
+enum
+{
+ X (HU),
+ X (TINY),
+ X (KART),
+
+ X (LT),
+ X (CRED),
+
+ X (TALLNUM),
+ X (NIGHTSNUM),
+ X (PINGNUM),
+};
+#undef X
+
#define HU_CROSSHAIRS 3 // maximum of 9 - see HU_Init();
extern char *shiftxform; // english translation shift table
@@ -78,15 +96,9 @@ void HU_AddChatText(const char *text, boolean playsound);
// set true when entering a chat message
extern boolean chat_on;
-extern patch_t *hu_font[HU_FONTSIZE], *kart_font[KART_FONTSIZE], *tny_font[HU_FONTSIZE]; // SRB2kart
-extern patch_t *tallnum[10];
-extern patch_t *pingnum[10];
extern patch_t *pinggfx[5];
-extern patch_t *nightsnum[10];
extern patch_t *framecounter;
extern patch_t *frameslash;
-extern patch_t *lt_font[LT_FONTSIZE];
-extern patch_t *cred_font[CRED_FONTSIZE];
extern patch_t *emeraldpics[7];
extern patch_t *tinyemeraldpics[7];
extern patch_t *rflagico;
@@ -104,6 +116,9 @@ void HU_Init(void);
void HU_LoadGraphics(void);
+// Load a HUDGFX patch or NULL.
+patch_t *HU_CachePatch(const char *format, ...);
+
// reset heads up when consoleplayer respawns.
void HU_Start(void);
diff --git a/src/k_color.c b/src/k_color.c
index 89112db29..ee3fbc626 100644
--- a/src/k_color.c
+++ b/src/k_color.c
@@ -380,12 +380,160 @@ UINT8 colortranslations[MAXTRANSLATIONS][16] = {
{ 0, 0, 96, 96, 97, 98, 98, 99, 81, 81, 69, 71, 73, 75, 77, 79}, // SKINCOLOR_CSUPER5
};
+/*--------------------------------------------------
+ INT32 K_SkincolorToTextColor(UINT8 skincolor)
+
+ See header file for description.
+--------------------------------------------------*/
+INT32 K_SkincolorToTextColor(UINT8 skincolor)
+{
+ INT32 textcolor = 0;
+
+ switch (skincolor)
+ {
+ default: // default to white?
+ case SKINCOLOR_WHITE:
+ case SKINCOLOR_SILVER:
+ case SKINCOLOR_SLATE:
+ textcolor = 0; // No color is white
+ break;
+ case SKINCOLOR_GREY:
+ case SKINCOLOR_NICKEL:
+ case SKINCOLOR_BLACK:
+ case SKINCOLOR_SKUNK:
+ case SKINCOLOR_PLATINUM:
+ case SKINCOLOR_JET:
+ textcolor = V_GRAYMAP;
+ break;
+ case SKINCOLOR_SEPIA:
+ case SKINCOLOR_BEIGE:
+ case SKINCOLOR_CARAMEL:
+ case SKINCOLOR_PEACH:
+ case SKINCOLOR_BROWN:
+ case SKINCOLOR_LEATHER:
+ case SKINCOLOR_RUST:
+ case SKINCOLOR_WRISTWATCH:
+ textcolor = V_BROWNMAP;
+ break;
+ case SKINCOLOR_FAIRY:
+ case SKINCOLOR_PINK:
+ case SKINCOLOR_ROSE:
+ case SKINCOLOR_LEMONADE:
+ case SKINCOLOR_LILAC:
+ case SKINCOLOR_BLOSSOM:
+ case SKINCOLOR_TAFFY:
+ textcolor = V_PINKMAP;
+ break;
+ case SKINCOLOR_CINNAMON:
+ case SKINCOLOR_RUBY:
+ case SKINCOLOR_RASPBERRY:
+ case SKINCOLOR_RED:
+ case SKINCOLOR_CRIMSON:
+ case SKINCOLOR_MAROON:
+ case SKINCOLOR_SCARLET:
+ case SKINCOLOR_KETCHUP:
+ textcolor = V_REDMAP;
+ break;
+ case SKINCOLOR_DAWN:
+ case SKINCOLOR_SUNSLAM:
+ case SKINCOLOR_CREAMSICLE:
+ case SKINCOLOR_ORANGE:
+ case SKINCOLOR_ROSEWOOD:
+ case SKINCOLOR_TANGERINE:
+ textcolor = V_ORANGEMAP;
+ break;
+ case SKINCOLOR_TAN:
+ case SKINCOLOR_CREAM:
+ textcolor = V_TANMAP;
+ break;
+ case SKINCOLOR_GOLD:
+ case SKINCOLOR_ROYAL:
+ case SKINCOLOR_BRONZE:
+ case SKINCOLOR_COPPER:
+ case SKINCOLOR_THUNDER:
+ textcolor = V_GOLDMAP;
+ break;
+ case SKINCOLOR_POPCORN:
+ case SKINCOLOR_YELLOW:
+ case SKINCOLOR_MUSTARD:
+ case SKINCOLOR_BANANA:
+ case SKINCOLOR_OLIVE:
+ case SKINCOLOR_CROCODILE:
+ textcolor = V_YELLOWMAP;
+ break;
+ case SKINCOLOR_ARTICHOKE:
+ case SKINCOLOR_PERIDOT:
+ case SKINCOLOR_VOMIT:
+ case SKINCOLOR_GARDEN:
+ case SKINCOLOR_LIME:
+ case SKINCOLOR_HANDHELD:
+ case SKINCOLOR_TEA:
+ case SKINCOLOR_PISTACHIO:
+ case SKINCOLOR_MOSS:
+ case SKINCOLOR_CAMOUFLAGE:
+ case SKINCOLOR_MINT:
+ case SKINCOLOR_GREEN:
+ case SKINCOLOR_PINETREE:
+ case SKINCOLOR_TURTLE:
+ case SKINCOLOR_SWAMP:
+ case SKINCOLOR_DREAM:
+ case SKINCOLOR_PLAGUE:
+ case SKINCOLOR_EMERALD:
+ case SKINCOLOR_ALGAE:
+ textcolor = V_GREENMAP;
+ break;
+ case SKINCOLOR_AQUAMARINE:
+ case SKINCOLOR_TURQUOISE:
+ case SKINCOLOR_TEAL:
+ textcolor = V_AQUAMAP;
+ break;
+ case SKINCOLOR_PIGEON:
+ case SKINCOLOR_ROBIN:
+ case SKINCOLOR_CYAN:
+ case SKINCOLOR_JAWZ:
+ case SKINCOLOR_CERULEAN:
+ case SKINCOLOR_NAVY:
+ case SKINCOLOR_SAPPHIRE:
+ textcolor = V_SKYMAP;
+ break;
+ case SKINCOLOR_STEEL:
+ case SKINCOLOR_ULTRAMARINE:
+ case SKINCOLOR_PERIWINKLE:
+ case SKINCOLOR_BLUE:
+ case SKINCOLOR_MIDNIGHT:
+ case SKINCOLOR_BLUEBERRY:
+ case SKINCOLOR_NOVA:
+ textcolor = V_BLUEMAP;
+ break;
+ case SKINCOLOR_THISTLE:
+ case SKINCOLOR_PURPLE:
+ case SKINCOLOR_PASTEL:
+ textcolor = V_PURPLEMAP;
+ break;
+ case SKINCOLOR_MAGENTA:
+ case SKINCOLOR_FUCHSIA:
+ case SKINCOLOR_MOONSET:
+ case SKINCOLOR_VIOLET:
+ textcolor = V_MAGENTAMAP;
+ break;
+ case SKINCOLOR_DUSK:
+ case SKINCOLOR_TOXIC:
+ case SKINCOLOR_MAUVE:
+ case SKINCOLOR_LAVENDER:
+ case SKINCOLOR_BYZANTIUM:
+ case SKINCOLOR_POMEGRANATE:
+ textcolor = V_LAVENDERMAP;
+ break;
+ }
+
+ return textcolor;
+}
+
/*--------------------------------------------------
UINT8 K_ColorRelativeLuminance(UINT8 r, UINT8 g, UINT8 b)
See header file for description.
--------------------------------------------------*/
-
UINT8 K_ColorRelativeLuminance(UINT8 r, UINT8 g, UINT8 b)
{
UINT32 redweight = 1063 * r;
@@ -400,7 +548,6 @@ UINT8 K_ColorRelativeLuminance(UINT8 r, UINT8 g, UINT8 b)
See header file for description.
--------------------------------------------------*/
-
void K_RainbowColormap(UINT8 *dest_colormap, UINT8 skincolor)
{
INT32 i;
@@ -444,14 +591,11 @@ void K_RainbowColormap(UINT8 *dest_colormap, UINT8 skincolor)
}
}
-/** \brief Generates a translation colormap for Kart, to replace R_GenerateTranslationColormap in r_draw.c
+/*--------------------------------------------------
+ void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color)
- \param dest_colormap colormap to populate
- \param skinnum number of skin, TC_DEFAULT or TC_BOSS
- \param color translation color
-
- \return void
-*/
+ See header file for description.
+--------------------------------------------------*/
void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color)
{
INT32 i;
@@ -505,12 +649,11 @@ void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color)
}
}
-/** \brief Pulls kart color by name, to replace R_GetColorByName in r_draw.c
+/*--------------------------------------------------
+ UINT8 K_GetKartColorByName(const char *name)
- \param name color name
-
- \return 0
-*/
+ See header file for description.
+--------------------------------------------------*/
UINT8 K_GetKartColorByName(const char *name)
{
UINT8 color = (UINT8)atoi(name);
diff --git a/src/k_color.h b/src/k_color.h
index 2a21473e2..85164623d 100644
--- a/src/k_color.h
+++ b/src/k_color.h
@@ -23,6 +23,21 @@ extern UINT8 colortranslations[MAXTRANSLATIONS][16];
extern const char *KartColor_Names[MAXSKINCOLORS];
extern const UINT8 KartColor_Opposite[MAXSKINCOLORS*2];
+/*--------------------------------------------------
+ INT32 K_SkincolorToTextColor(UINT8 skincolor);
+
+ Gives you the "text" color (V_ constants) from a skincolor (SKINCOLOR_ constants).
+ Used primarily by the chat system.
+
+ Input Arguments:-
+ skincolor - SKINCOLOR_ constant
+
+ Return:-
+ V_ constant for font coloring
+--------------------------------------------------*/
+INT32 K_SkincolorToTextColor(UINT8 skincolor);
+
+
/*--------------------------------------------------
UINT8 K_ColorRelativeLuminance(UINT8 r, UINT8 g, UINT8 b);
diff --git a/src/k_kart.c b/src/k_kart.c
index 8f334dd49..84aa3b4fc 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -7766,6 +7766,8 @@ static patch_t *kp_blagles[6];
static patch_t *kp_cpu;
+static patch_t *kp_nametagstem;
+
void K_LoadKartHUDGraphics(void)
{
INT32 i, j;
@@ -8133,6 +8135,8 @@ void K_LoadKartHUDGraphics(void)
}
kp_cpu = (patch_t *) W_CachePatchName("K_CPU", PU_HUDGFX);
+
+ kp_nametagstem = (patch_t *) W_CachePatchName("K_NAMEST", PU_HUDGFX);
}
// For the item toggle menu
@@ -9359,14 +9363,14 @@ static void K_drawKartLapsAndRings(void)
ln[0] = ((stplyr->laps / 10) % 10);
ln[1] = (stplyr->laps % 10);
- V_DrawScaledPatch(fx+13, fy, V_HUDTRANS|splitflags, pingnum[ln[0]]);
- V_DrawScaledPatch(fx+17, fy, V_HUDTRANS|splitflags, pingnum[ln[1]]);
+ V_DrawScaledPatch(fx+13, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[0]]);
+ V_DrawScaledPatch(fx+17, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[1]]);
ln[0] = ((abs(cv_numlaps.value) / 10) % 10);
ln[1] = (abs(cv_numlaps.value) % 10);
- V_DrawScaledPatch(fx+27, fy, V_HUDTRANS|splitflags, pingnum[ln[0]]);
- V_DrawScaledPatch(fx+31, fy, V_HUDTRANS|splitflags, pingnum[ln[1]]);
+ V_DrawScaledPatch(fx+27, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[0]]);
+ V_DrawScaledPatch(fx+31, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[1]]);
}
else
{
@@ -9389,8 +9393,8 @@ static void K_drawKartLapsAndRings(void)
if (stplyr->kartstuff[k_rings] < 0) // Draw the minus for ring debt
V_DrawMappedPatch(fr+7, fy-10, V_HUDTRANS|splitflags, kp_ringdebtminussmall, ringmap);
- V_DrawMappedPatch(fr+11, fy-10, V_HUDTRANS|splitflags, pingnum[rn[0]], ringmap);
- V_DrawMappedPatch(fr+15, fy-10, V_HUDTRANS|splitflags, pingnum[rn[1]], ringmap);
+ V_DrawMappedPatch(fr+11, fy-10, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[rn[0]], ringmap);
+ V_DrawMappedPatch(fr+15, fy-10, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[rn[1]], ringmap);
// SPB ring lock
if (stplyr->kartstuff[k_ringlock])
@@ -9401,7 +9405,7 @@ static void K_drawKartLapsAndRings(void)
{
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, stplyr->skincolor, GTC_CACHE);
V_DrawMappedPatch(fr+21, fy-13, V_HUDTRANS|splitflags, facemmapprefix[stplyr->skin], colormap);
- V_DrawScaledPatch(fr+34, fy-10, V_HUDTRANS|splitflags, pingnum[(stplyr->lives % 10)]); // make sure this doesn't overflow
+ V_DrawScaledPatch(fr+34, fy-10, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[(stplyr->lives % 10)]); // make sure this doesn't overflow
}
}
else
@@ -9547,14 +9551,14 @@ static void K_drawKartBumpersOrKarma(void)
ln[0] = ((numtargets / 10) % 10);
ln[1] = (numtargets % 10);
- V_DrawScaledPatch(fx+13, fy, V_HUDTRANS|splitflags, pingnum[ln[0]]);
- V_DrawScaledPatch(fx+17, fy, V_HUDTRANS|splitflags, pingnum[ln[1]]);
+ V_DrawScaledPatch(fx+13, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[0]]);
+ V_DrawScaledPatch(fx+17, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[1]]);
ln[0] = ((maptargets / 10) % 10);
ln[1] = (maptargets % 10);
- V_DrawScaledPatch(fx+27, fy, V_HUDTRANS|splitflags, pingnum[ln[0]]);
- V_DrawScaledPatch(fx+31, fy, V_HUDTRANS|splitflags, pingnum[ln[1]]);
+ V_DrawScaledPatch(fx+27, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[0]]);
+ V_DrawScaledPatch(fx+31, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[1]]);
}
else
{
@@ -9581,14 +9585,14 @@ static void K_drawKartBumpersOrKarma(void)
ln[0] = ((abs(stplyr->kartstuff[k_bumper]) / 10) % 10);
ln[1] = (abs(stplyr->kartstuff[k_bumper]) % 10);
- V_DrawScaledPatch(fx+13, fy, V_HUDTRANS|splitflags, pingnum[ln[0]]);
- V_DrawScaledPatch(fx+17, fy, V_HUDTRANS|splitflags, pingnum[ln[1]]);
+ V_DrawScaledPatch(fx+13, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[0]]);
+ V_DrawScaledPatch(fx+17, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[1]]);
ln[0] = ((abs(maxbumper) / 10) % 10);
ln[1] = (abs(maxbumper) % 10);
- V_DrawScaledPatch(fx+27, fy, V_HUDTRANS|splitflags, pingnum[ln[0]]);
- V_DrawScaledPatch(fx+31, fy, V_HUDTRANS|splitflags, pingnum[ln[1]]);
+ V_DrawScaledPatch(fx+27, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[0]]);
+ V_DrawScaledPatch(fx+31, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[1]]);
}
else
{
@@ -9738,6 +9742,11 @@ static void K_ObjectTracking(fixed_t *hud_x, fixed_t *hud_y, vertex_t *campos, a
{
*hud_x = FixedMul(NEWTAN(anglediff), swhalffixed) + swhalffixed;
+ if (encoremode)
+ {
+ *hud_x = (BASEVIDWIDTH * FRACUNIT) - *hud_x;
+ }
+
if (r_splitscreen >= 2)
{
*hud_x /= 2;
@@ -9810,9 +9819,9 @@ static void K_drawKartPlayerCheck(void)
thiscam = &camera[cnum];
- c.x = thiscam->x;
- c.y = thiscam->y;
- c.z = thiscam->z;
+ c.x = stplyr->mo->x;
+ c.y = stplyr->mo->y;
+ c.z = stplyr->mo->z;
for (i = 0; i < MAXPLAYERS; i++)
{
@@ -9876,7 +9885,7 @@ static void K_drawKartPlayerCheck(void)
static void K_drawKartNameTags(void)
{
- const fixed_t maxdistance = 4096*mapobjectscale;
+ const fixed_t maxdistance = 8192*mapobjectscale;
camera_t *thiscam;
vertex_t c;
UINT8 cnum = 0;
@@ -9947,7 +9956,7 @@ static void K_drawKartNameTags(void)
}
}
- if (j < r_splitscreen)
+ if (j <= r_splitscreen)
{
// Is a player that's being shown on this computer
continue;
@@ -9986,12 +9995,46 @@ static void K_drawKartNameTags(void)
V_DrawFixedPatch(x, y, FRACUNIT, V_HUDTRANS, kp_rival[blink], NULL);
}
}
- else
+ else if (netgame)
{
- if ((ntplayer->kartstuff[k_position] >= stplyr->kartstuff[k_position]-1)
- && (ntplayer->kartstuff[k_position] <= stplyr->kartstuff[k_position]+1))
+ if ((ntplayer->kartstuff[k_position] >= stplyr->kartstuff[k_position]-2)
+ && (ntplayer->kartstuff[k_position] <= stplyr->kartstuff[k_position]+2))
{
- ; // TODO: Draw a cool name tag for online
+ INT32 namelen = V_ThinStringWidth(player_names[i], V_6WIDTHSPACE|V_ALLOWLOWERCASE);
+ INT32 clr = K_SkincolorToTextColor(ntplayer->skincolor);
+ UINT8 *colormap = V_GetStringColormap(clr);
+ INT32 barx = 0, bary = 0, barw = 0;
+
+ // Since there's no "V_DrawFixedFill", and I don't feel like making it,
+ // fuck it, we're gonna just V_NOSCALESTART hack it
+ barw = (namelen * vid.dupx);
+
+ barx = (x * vid.dupx) / FRACUNIT;
+ bary = (y * vid.dupy) / FRACUNIT;
+
+ barx += (6 * vid.dupx);
+ bary -= (16 * 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;
+ }
+
+ V_DrawFill(barx, bary, barw, (3 * vid.dupy), colormap[31]|V_NOSCALESTART);
+ V_DrawFill(barx, bary + vid.dupy, barw, vid.dupy, colormap[0]|V_NOSCALESTART);
+ // END DRAWFILL DUMBNESS
+
+ // Draw the stem
+ V_DrawFixedPatch(x, y, FRACUNIT, 0, kp_nametagstem, colormap);
+
+ // Draw the name itself
+ V_DrawThinStringAtFixed(x + (5*FRACUNIT), y - (26*FRACUNIT), V_6WIDTHSPACE|V_ALLOWLOWERCASE|clr, player_names[i]);
}
}
}
@@ -10649,7 +10692,7 @@ static void K_drawInput(void)
V_DrawFill(x+(xoffs), y+BUTTH, BUTTW-1, 2, splitflags|31);\
}\
V_DrawFill(x+(xoffs), y+offs, BUTTW-1, BUTTH, col);\
- V_DrawFixedPatch((x+1+(xoffs))<
+
@@ -376,6 +377,7 @@
+
diff --git a/src/sdl/Srb2SDL-vc9.vcproj b/src/sdl/Srb2SDL-vc9.vcproj
index b21eedb87..85c2533ea 100644
--- a/src/sdl/Srb2SDL-vc9.vcproj
+++ b/src/sdl/Srb2SDL-vc9.vcproj
@@ -2090,6 +2090,50 @@
RelativePath="..\console.h"
>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/sdl12/Srb2SDL-vc10.vcxproj b/src/sdl12/Srb2SDL-vc10.vcxproj
index d7f13751e..1edb3d2db 100644
--- a/src/sdl12/Srb2SDL-vc10.vcxproj
+++ b/src/sdl12/Srb2SDL-vc10.vcxproj
@@ -655,6 +655,16 @@
%(AdditionalIncludeDirectories)
%(PreprocessorDefinitions)
+
+ %(AdditionalIncludeDirectories)
+ %(PreprocessorDefinitions)
+ %(AdditionalIncludeDirectories)
+ %(PreprocessorDefinitions)
+ %(AdditionalIncludeDirectories)
+ %(PreprocessorDefinitions)
+ %(AdditionalIncludeDirectories)
+ %(PreprocessorDefinitions)
+
%(AdditionalIncludeDirectories)
%(PreprocessorDefinitions)
@@ -1366,6 +1376,7 @@
+
diff --git a/src/sdl12/Srb2SDL-vc9.vcproj b/src/sdl12/Srb2SDL-vc9.vcproj
index 9d807be21..16c00454d 100644
--- a/src/sdl12/Srb2SDL-vc9.vcproj
+++ b/src/sdl12/Srb2SDL-vc9.vcproj
@@ -2090,6 +2090,50 @@
RelativePath="..\console.h"
>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/st_stuff.h b/src/st_stuff.h
index 5ed5dd1c6..3c8c2902f 100644
--- a/src/st_stuff.h
+++ b/src/st_stuff.h
@@ -65,7 +65,6 @@ extern INT32 st_palette; // 0 is default, any others are special palettes.
extern lumpnum_t st_borderpatchnum;
// patches, also used in intermission
-extern patch_t *tallnum[10];
extern patch_t *sboscore;
extern patch_t *sbotime;
extern patch_t *sbocolon;
diff --git a/src/v_video.c b/src/v_video.c
index e5fed2a16..20931291f 100644
--- a/src/v_video.c
+++ b/src/v_video.c
@@ -1582,17 +1582,17 @@ void V_DrawCharacter(INT32 x, INT32 y, INT32 c, boolean lowercaseallowed)
c -= HU_FONTSTART;
else
c = toupper(c) - HU_FONTSTART;
- if (c < 0 || c >= HU_FONTSIZE || !hu_font[c])
+ if (c < 0 || c >= HU_FONTSIZE || !fontv[HU_FONT].font[c])
return;
- w = SHORT(hu_font[c]->width);
+ w = SHORT(fontv[HU_FONT].font[c]->width);
if (x + w > vid.width)
return;
if (colormap != NULL)
- V_DrawMappedPatch(x, y, flags, hu_font[c], colormap);
+ V_DrawMappedPatch(x, y, flags, fontv[HU_FONT].font[c], colormap);
else
- V_DrawScaledPatch(x, y, flags, hu_font[c]);
+ V_DrawScaledPatch(x, y, flags, fontv[HU_FONT].font[c]);
}
// Writes a single character for the chat (half scaled). (draw WHITE if bit 7 set)
@@ -1609,14 +1609,14 @@ void V_DrawChatCharacter(INT32 x, INT32 y, INT32 c, boolean lowercaseallowed, UI
c -= HU_FONTSTART;
else
c = toupper(c) - HU_FONTSTART;
- if (c < 0 || c >= HU_FONTSIZE || !hu_font[c])
+ if (c < 0 || c >= HU_FONTSIZE || !fontv[HU_FONT].font[c])
return;
- w = SHORT(hu_font[c]->width)/2;
+ w = SHORT(fontv[HU_FONT].font[c]->width)/2;
if (x + w > vid.width)
return;
- V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT, FRACUNIT/2, flags, hu_font[c], colormap);
+ V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT, FRACUNIT/2, flags, fontv[HU_FONT].font[c], colormap);
}
// Precompile a wordwrapped string to any given width.
@@ -1667,13 +1667,13 @@ char *V_WordWrap(INT32 x, INT32 w, INT32 option, const char *string)
c = toupper(c);
c -= HU_FONTSTART;
- if (c < 0 || c >= HU_FONTSIZE || !hu_font[c])
+ if (c < 0 || c >= HU_FONTSIZE || !fontv[HU_FONT].font[c])
{
chw = spacewidth;
lastusablespace = i;
}
else
- chw = (charwidth ? charwidth : hu_font[c]->width);
+ chw = (charwidth ? charwidth : fontv[HU_FONT].font[c]->width);
x += chw;
@@ -1688,214 +1688,297 @@ char *V_WordWrap(INT32 x, INT32 w, INT32 option, const char *string)
return newstring;
}
-//
-// Write a string using the hu_font
-// NOTE: the text is centered for screens larger than the base width
-//
-void V_DrawString(INT32 x, INT32 y, INT32 option, const char *string)
+static inline fixed_t FixedCharacterDim(
+ fixed_t scale,
+ fixed_t chw,
+ INT32 hchw,
+ INT32 dupx,
+ fixed_t * cwp)
{
- INT32 w, c, cx = x, cy = y, dupx, dupy, scrwidth, center = 0, left = 0;
- const char *ch = string;
- INT32 charflags = 0;
- const UINT8 *colormap = NULL;
- INT32 spacewidth = 4, charwidth = 0;
-
- INT32 lowercase = (option & V_ALLOWLOWERCASE);
- option &= ~V_FLIP; // which is also shared with V_ALLOWLOWERCASE...
-
- if (option & V_NOSCALESTART)
- {
- dupx = vid.dupx;
- dupy = vid.dupy;
- scrwidth = vid.width;
- }
- else
- {
- dupx = dupy = 1;
- scrwidth = vid.width/vid.dupx;
- if (!(option & V_SNAPTOLEFT))
- {
- left = (scrwidth - BASEVIDWIDTH)/2;
- scrwidth -= left;
- }
- }
-
- charflags = (option & V_CHARCOLORMASK);
- colormap = V_GetStringColormap(charflags);
-
- switch (option & V_SPACINGMASK)
- {
- case V_MONOSPACE:
- spacewidth = 8;
- /* FALLTHRU */
- case V_OLDSPACING:
- charwidth = 8;
- break;
- case V_6WIDTHSPACE:
- spacewidth = 6;
- default:
- break;
- }
-
- for (;;ch++)
- {
- if (!*ch)
- break;
- if (*ch & 0x80) //color parsing -x 2.16.09
- {
- // manually set flags override color codes
- if (!(option & V_CHARCOLORMASK))
- {
- charflags = ((*ch & 0x7f) << V_CHARCOLORSHIFT) & V_CHARCOLORMASK;
- colormap = V_GetStringColormap(charflags);
- }
- continue;
- }
- if (*ch == '\n')
- {
- cx = x;
-
- if (option & V_RETURN8)
- cy += 8*dupy;
- else
- cy += 12*dupy;
-
- continue;
- }
-
- c = *ch;
- if (!lowercase)
- c = toupper(c);
- c -= HU_FONTSTART;
-
- // character does not exist or is a space
- if (c < 0 || c >= HU_FONTSIZE || !hu_font[c])
- {
- cx += spacewidth * dupx;
- continue;
- }
-
- if (charwidth)
- {
- w = charwidth * dupx;
- center = w/2 - SHORT(hu_font[c]->width)*dupx/2;
- }
- else
- w = SHORT(hu_font[c]->width) * dupx;
-
- if (cx > scrwidth)
- break;
- if (cx+left + w < 0) //left boundary check
- {
- cx += w;
- continue;
- }
-
- V_DrawFixedPatch((cx + center)<> 1 );
+ (*cwp) = chw;
+ return FixedMul (( cxoff * dupx )<< FRACBITS, scale);
+}
- if (option & V_NOSCALESTART)
+static inline fixed_t BunchedCharacterDim(
+ fixed_t scale,
+ fixed_t chw,
+ INT32 hchw,
+ INT32 dupx,
+ fixed_t * cwp)
+{
+ (void)chw;
+ (void)hchw;
+ (void)dupx;
+ (*cwp) = FixedMul (max (1, (*cwp) - 1) << FRACBITS, scale);
+ return 0;
+}
+
+void V_DrawStringScaled(
+ fixed_t x,
+ fixed_t y,
+ fixed_t scale,
+ fixed_t spacescale,
+ fixed_t lfscale,
+ INT32 flags,
+ int fontno,
+ const char *s)
+{
+ fixed_t chw;
+ INT32 hchw;/* half-width for centering */
+ fixed_t spacew;
+ fixed_t lfh;
+
+ INT32 dupx;
+
+ fixed_t right;
+ fixed_t bot;
+
+ fixed_t (*dim_fn)(fixed_t,fixed_t,INT32,INT32,fixed_t *);
+
+ font_t *font;
+
+ boolean uppercase;
+ boolean notcolored;
+
+ const UINT8 *colormap;
+
+ fixed_t cx, cy;
+
+ fixed_t cxoff;
+ fixed_t cw;
+
+ INT32 spacing;
+ fixed_t left;
+
+ int c;
+
+ uppercase = !( flags & V_ALLOWLOWERCASE );
+ flags &= ~(V_FLIP);/* These two (V_ALLOWLOWERCASE) share a bit. */
+
+ colormap = V_GetStringColormap(( flags & V_CHARCOLORMASK ));
+ notcolored = !colormap;
+
+ font = &fontv[fontno];
+
+ chw = 0;
+
+ spacing = ( flags & V_SPACINGMASK );
+
+ /*
+ Hardcoded until a better system can be implemented
+ for determining how fonts space.
+ */
+ switch (fontno)
{
- dupx = vid.dupx;
- dupy = vid.dupy;
- scrwidth = vid.width;
+ default:
+ case HU_FONT:
+ spacew = 4;
+ switch (spacing)
+ {
+ case V_MONOSPACE:
+ spacew = 8;
+ /* FALLTHRU */
+ case V_OLDSPACING:
+ chw = 8;
+ break;
+ case V_6WIDTHSPACE:
+ spacew = 6;
+ }
+ break;
+ case TINY_FONT:
+ spacew = 2;
+ switch (spacing)
+ {
+ case V_MONOSPACE:
+ spacew = 5;
+ /* FALLTHRU */
+ case V_OLDSPACING:
+ chw = 5;
+ break;
+ // Out of video flags, so we're reusing this for alternate charwidth instead
+ /*case V_6WIDTHSPACE:
+ spacewidth = 3;*/
+ }
+ break;
+ case KART_FONT:
+ spacew = 12;
+ switch (spacing)
+ {
+ case V_MONOSPACE:
+ spacew = 12;
+ /* FALLTHRU */
+ case V_OLDSPACING:
+ chw = 12;
+ break;
+ case V_6WIDTHSPACE:
+ spacew = 6;
+ }
+ break;
+ case LT_FONT:
+ spacew = 12;
+ break;
+ case CRED_FONT:
+ spacew = 16;
+ break;
+ }
+ switch (fontno)
+ {
+ default:
+ case HU_FONT:
+ case TINY_FONT:
+ case KART_FONT:
+ if (( flags & V_RETURN8 ))
+ lfh = 8;
+ else
+ lfh = 12;
+ break;
+ case LT_FONT:
+ case CRED_FONT:
+ lfh = 12;
+ break;
+ }
+
+ hchw = chw >> 1;
+
+ chw <<= FRACBITS;
+ spacew <<= FRACBITS;
+
+#define Mul( id, scale ) ( id = FixedMul (scale, id) )
+ Mul (chw, scale);
+ Mul (spacew, scale);
+ Mul (lfh, scale);
+
+ Mul (spacew, spacescale);
+ Mul (lfh, lfscale);
+#undef Mul
+
+ if (( flags & V_NOSCALESTART ))
+ {
+ dupx = vid.dupx;
+
+ hchw *= dupx;
+
+ chw *= dupx;
+ spacew *= dupx;
+ lfh *= vid.dupy;
+
+ right = vid.width;
}
else
{
- dupx = dupy = 1;
- scrwidth = vid.width/vid.dupx;
- left = (scrwidth - BASEVIDWIDTH)/2;
+ dupx = 1;
+
+ right = ( vid.width / vid.dupx );
+ if (!( flags & V_SNAPTOLEFT ))
+ {
+ left = ( right - BASEVIDWIDTH )/ 2;/* left edge of drawable area */
+ x = ( left << FRACBITS )+ x;
+ right -= left;
+ }
}
- charflags = (option & V_CHARCOLORMASK);
- colormap = V_GetStringColormap(charflags);
+ right <<= FRACBITS;
+ bot = vid.height << FRACBITS;
- switch (option & V_SPACINGMASK)
+ if (fontno == TINY_FONT)
{
- case V_MONOSPACE:
- spacewidth = 12;
- /* FALLTHRU */
- case V_OLDSPACING:
- charwidth = 12;
- break;
- case V_6WIDTHSPACE:
- spacewidth = 6;
- default:
- break;
- }
-
- for (;;ch++)
- {
- if (!*ch)
- break;
- if (*ch & 0x80) //color parsing -x 2.16.09
- {
- // manually set flags override color codes
- if (!(option & V_CHARCOLORMASK))
- {
- charflags = ((*ch & 0x7f) << V_CHARCOLORSHIFT) & V_CHARCOLORMASK;
- colormap = V_GetStringColormap(charflags);
- }
- continue;
- }
- if (*ch == '\n')
- {
- cx = x;
-
- if (option & V_RETURN8)
- cy += 8*dupy;
- else
- cy += 12*dupy;
-
- continue;
- }
-
- c = *ch;
- if (!lowercase)
- c = toupper(c);
- c -= KART_FONTSTART;
-
- // character does not exist or is a space
- if (c < 0 || c >= KART_FONTSIZE || !kart_font[c])
- {
- cx += spacewidth * dupx;
- continue;
- }
-
- if (charwidth)
- {
- w = charwidth * dupx;
- center = w/2 - SHORT(kart_font[c]->width)*dupx/2;
- }
+ if (chw)
+ dim_fn = FixedCharacterDim;
else
- w = SHORT(kart_font[c]->width) * dupx;
-
- if (cx > scrwidth)
- break;
- if (cx+left + w < 0) //left boundary check
{
- cx += w;
- continue;
+ /* Reuse this flag for the alternate bunched-up spacing. */
+ if (( flags & V_6WIDTHSPACE ))
+ dim_fn = BunchedCharacterDim;
+ else
+ dim_fn = VariableCharacterDim;
}
+ }
+ else
+ {
+ if (chw)
+ dim_fn = CenteredCharacterDim;
+ else
+ dim_fn = VariableCharacterDim;
+ }
- V_DrawFixedPatch((cx + center)<= bot)
+ return;
+ cx = x;
+ break;
+ default:
+ if (( c & 0x80 ))
+ {
+ if (notcolored)
+ {
+ colormap = V_GetStringColormap(
+ ( ( c & 0x7f )<< V_CHARCOLORSHIFT )&
+ V_CHARCOLORMASK);
+ }
+ }
+ else if (cx < right)
+ {
+ if (uppercase)
+ c = toupper(c);
+
+ c -= font->start;
+ if (c >= 0 && c < font->size && font->font[c])
+ {
+ cw = SHORT (font->font[c]->width) * dupx;
+ cxoff = (*dim_fn)(scale, chw, hchw, dupx, &cw);
+ V_DrawFixedPatch(cx + cxoff, cy, scale,
+ flags, font->font[c], colormap);
+ cx += cw;
+ }
+ else
+ cx += spacew;
+ }
+ }
}
}
//
@@ -1912,220 +1995,12 @@ void V_DrawRightAlignedString(INT32 x, INT32 y, INT32 option, const char *string
V_DrawString(x, y, option, string);
}
-//
-// Write a string using the hu_font, 0.5x scale
-// NOTE: the text is centered for screens larger than the base width
-//
-void V_DrawSmallString(INT32 x, INT32 y, INT32 option, const char *string)
-{
- INT32 w, c, cx = x, cy = y, dupx, dupy, scrwidth, center = 0, left = 0;
- const char *ch = string;
- INT32 charflags = 0;
- const UINT8 *colormap = NULL;
- INT32 spacewidth = 2, charwidth = 0;
-
- INT32 lowercase = (option & V_ALLOWLOWERCASE);
- option &= ~V_FLIP; // which is also shared with V_ALLOWLOWERCASE...
-
- if (option & V_NOSCALESTART)
- {
- dupx = vid.dupx;
- dupy = vid.dupy;
- scrwidth = vid.width;
- }
- else
- {
- dupx = dupy = 1;
- scrwidth = vid.width/vid.dupx;
- left = (scrwidth - BASEVIDWIDTH)/2;
- scrwidth -= left;
- }
-
- charflags = (option & V_CHARCOLORMASK);
- colormap = V_GetStringColormap(charflags);
-
- switch (option & V_SPACINGMASK)
- {
- case V_MONOSPACE:
- spacewidth = 4;
- /* FALLTHRU */
- case V_OLDSPACING:
- charwidth = 4;
- break;
- case V_6WIDTHSPACE:
- spacewidth = 3;
- default:
- break;
- }
-
- for (;;ch++)
- {
- if (!*ch)
- break;
- if (*ch & 0x80) //color parsing -x 2.16.09
- {
- // manually set flags override color codes
- if (!(option & V_CHARCOLORMASK))
- {
- charflags = ((*ch & 0x7f) << V_CHARCOLORSHIFT) & V_CHARCOLORMASK;
- colormap = V_GetStringColormap(charflags);
- }
- continue;
- }
- if (*ch == '\n')
- {
- cx = x;
-
- if (option & V_RETURN8)
- cy += 4*dupy;
- else
- cy += 6*dupy;
-
- continue;
- }
-
- c = *ch;
- if (!lowercase)
- c = toupper(c);
- c -= HU_FONTSTART;
-
- if (c < 0 || c >= HU_FONTSIZE || !hu_font[c])
- {
- cx += spacewidth * dupx;
- continue;
- }
-
- if (charwidth)
- {
- w = charwidth * dupx;
- center = w/2 - SHORT(hu_font[c]->width)*dupx/4;
- }
- else
- w = SHORT(hu_font[c]->width) * dupx / 2;
- if (cx > scrwidth)
- break;
- if (cx+left + w < 0) //left boundary check
- {
- cx += w;
- continue;
- }
-
- V_DrawFixedPatch((cx + center)<= HU_FONTSIZE || !tny_font[c])
- {
- cx += spacewidth * dupx;
- continue;
- }
-
- if (charwidth)
- w = charwidth * dupx;
- else
- w = ((option & V_6WIDTHSPACE ? max(1, SHORT(tny_font[c]->width)-1) // Reuse this flag for the alternate bunched-up spacing
- : SHORT(tny_font[c]->width)) * dupx);
-
- if (cx > scrwidth)
- break;
- if (cx+left + w < 0) //left boundary check
- {
- cx += w;
- continue;
- }
-
- V_DrawFixedPatch(cx<= HU_FONTSIZE || !hu_font[c])
- {
- cx += (spacewidth * dupx)<width)*(dupx/2);
- }
- else
- w = SHORT(hu_font[c]->width) * dupx;
-
- if ((cx>>FRACBITS) > scrwidth)
- break;
- if ((cx>>FRACBITS)+left + w < 0) //left boundary check
- {
- cx += w<width);
+ INT32 w = SHORT(fontv[TALLNUM_FONT].font[0]->width);
boolean neg;
if (flags & V_NOSCALESTART)
@@ -2245,7 +2029,7 @@ void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num)
do
{
x -= w;
- V_DrawScaledPatch(x, y, flags, tallnum[num % 10]);
+ V_DrawScaledPatch(x, y, flags, fontv[TALLNUM_FONT].font[num % 10]);
num /= 10;
} while (num);
@@ -2258,7 +2042,7 @@ void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num)
// Does not handle negative numbers in a special way, don't try to feed it any.
void V_DrawPaddedTallNum(INT32 x, INT32 y, INT32 flags, INT32 num, INT32 digits)
{
- INT32 w = SHORT(tallnum[0]->width);
+ INT32 w = SHORT(fontv[TALLNUM_FONT].font[0]->width);
if (flags & V_NOSCALESTART)
w *= vid.dupx;
@@ -2270,7 +2054,7 @@ void V_DrawPaddedTallNum(INT32 x, INT32 y, INT32 flags, INT32 num, INT32 digits)
do
{
x -= w;
- V_DrawScaledPatch(x, y, flags, tallnum[num % 10]);
+ V_DrawScaledPatch(x, y, flags, fontv[TALLNUM_FONT].font[num % 10]);
num /= 10;
} while (--digits);
}
@@ -2280,7 +2064,7 @@ void V_DrawPaddedTallNum(INT32 x, INT32 y, INT32 flags, INT32 num, INT32 digits)
void V_DrawPingNum(INT32 x, INT32 y, INT32 flags, INT32 num, const UINT8 *colormap)
{
- INT32 w = SHORT(pingnum[0]->width); // this SHOULD always be 5 but I guess custom graphics exist.
+ INT32 w = SHORT(fontv[PINGNUM_FONT].font[0]->width); // this SHOULD always be 5 but I guess custom graphics exist.
if (flags & V_NOSCALESTART)
w *= vid.dupx;
@@ -2292,61 +2076,11 @@ void V_DrawPingNum(INT32 x, INT32 y, INT32 flags, INT32 num, const UINT8 *colorm
do
{
x -= (w-1); // Oni wanted their outline to intersect.
- V_DrawFixedPatch(x<= CRED_FONTSIZE)
- {
- cx += (16*dupx)<width) * dupx;
- if ((cx>>FRACBITS) > scrwidth)
- break;
-
- V_DrawSciencePatch(cx, cy, option, cred_font[c], FRACUNIT);
- cx += w<= CRED_FONTSIZE)
w += 16;
else
- w += SHORT(cred_font[c]->width);
+ w += SHORT(fontv[CRED_FONT].font[c]->width);
}
return w;
}
-// Write a string using the level title font
-// NOTE: the text is centered for screens larger than the base width
-//
-void V_DrawLevelTitle(INT32 x, INT32 y, INT32 option, const char *string)
-{
- INT32 w, c, cx = x, cy = y, dupx, dupy, scrwidth, left = 0;
- const char *ch = string;
-
- if (option & V_NOSCALESTART)
- {
- dupx = vid.dupx;
- dupy = vid.dupy;
- scrwidth = vid.width;
- }
- else
- {
- dupx = dupy = 1;
- scrwidth = vid.width/vid.dupx;
- left = (scrwidth - BASEVIDWIDTH)/2;
- scrwidth -= left;
- }
-
- for (;;)
- {
- c = *ch++;
- if (!c)
- break;
- if (c == '\n')
- {
- cx = x;
- cy += 12*dupy;
- continue;
- }
-
- c = toupper(c) - LT_FONTSTART;
- if (c < 0 || c >= LT_FONTSIZE || !lt_font[c])
- {
- cx += 12*dupx;
- continue;
- }
-
- w = SHORT(lt_font[c]->width) * dupx;
- if (cx > scrwidth)
- break;
- if (cx+left + w < 0) //left boundary check
- {
- cx += w;
- continue;
- }
-
- V_DrawScaledPatch(cx, cy, option, lt_font[c]);
- cx += w;
- }
-}
-
// Find string width from lt_font chars
//
INT32 V_LevelNameWidth(const char *string)
@@ -2435,10 +2114,10 @@ INT32 V_LevelNameWidth(const char *string)
for (i = 0; i < strlen(string); i++)
{
c = toupper(string[i]) - LT_FONTSTART;
- if (c < 0 || c >= LT_FONTSIZE || !lt_font[c])
+ if (c < 0 || c >= LT_FONTSIZE || !fontv[LT_FONT].font[c])
w += 12;
else
- w += SHORT(lt_font[c]->width);
+ w += SHORT(fontv[LT_FONT].font[c]->width);
}
return w;
@@ -2454,11 +2133,11 @@ INT32 V_LevelNameHeight(const char *string)
for (i = 0; i < strlen(string); i++)
{
c = toupper(string[i]) - LT_FONTSTART;
- if (c < 0 || c >= LT_FONTSIZE || !lt_font[c])
+ if (c < 0 || c >= LT_FONTSIZE || !fontv[LT_FONT].font[c])
continue;
- if (SHORT(lt_font[c]->height) > w)
- w = SHORT(lt_font[c]->height);
+ if (SHORT(fontv[LT_FONT].font[c]->height) > w)
+ w = SHORT(fontv[LT_FONT].font[c]->height);
}
return w;
@@ -2494,10 +2173,10 @@ INT32 V_StringWidth(const char *string, INT32 option)
continue;
c = toupper(c) - HU_FONTSTART;
- if (c < 0 || c >= HU_FONTSIZE || !hu_font[c])
+ if (c < 0 || c >= HU_FONTSIZE || !fontv[HU_FONT].font[c])
w += spacewidth;
else
- w += (charwidth ? charwidth : SHORT(hu_font[c]->width));
+ w += (charwidth ? charwidth : SHORT(fontv[HU_FONT].font[c]->width));
}
return w;
@@ -2533,10 +2212,10 @@ INT32 V_SmallStringWidth(const char *string, INT32 option)
continue;
c = toupper(c) - HU_FONTSTART;
- if (c < 0 || c >= HU_FONTSIZE || !hu_font[c])
+ if (c < 0 || c >= HU_FONTSIZE || !fontv[HU_FONT].font[c])
w += spacewidth;
else
- w += (charwidth ? charwidth : SHORT(hu_font[c]->width)/2);
+ w += (charwidth ? charwidth : SHORT(fontv[HU_FONT].font[c]->width)/2);
}
return w;
@@ -2573,17 +2252,17 @@ INT32 V_ThinStringWidth(const char *string, INT32 option)
if ((UINT8)c >= 0x80 && (UINT8)c <= 0x8F) //color parsing! -Inuyasha 2.16.09
continue;
- if (!lowercase || !tny_font[c-HU_FONTSTART])
+ if (!lowercase || !fontv[TINY_FONT].font[c-HU_FONTSTART])
c = toupper(c);
c -= HU_FONTSTART;
- if (c < 0 || c >= HU_FONTSIZE || !tny_font[c])
+ if (c < 0 || c >= HU_FONTSIZE || !fontv[TINY_FONT].font[c])
w += spacewidth;
else
{
w += (charwidth ? charwidth
- : ((option & V_6WIDTHSPACE && i < strlen(string)-1) ? max(1, SHORT(tny_font[c]->width)-1) // Reuse this flag for the alternate bunched-up spacing
- : SHORT(tny_font[c]->width)));
+ : ((option & V_6WIDTHSPACE && i < strlen(string)-1) ? max(1, SHORT(fontv[TINY_FONT].font[c]->width)-1) // Reuse this flag for the alternate bunched-up spacing
+ : SHORT(fontv[TINY_FONT].font[c]->width)));
}
}
diff --git a/src/v_video.h b/src/v_video.h
index b3de62c92..2066d1399 100644
--- a/src/v_video.h
+++ b/src/v_video.h
@@ -173,6 +173,12 @@ void V_DrawCustomFadeScreen(const char *lump, UINT8 strength);
void V_DrawFadeConsBack(INT32 plines);
void V_EncoreInvertScreen(void);
+/* Convenience macros for leagacy string function macros. */
+#define V__DrawOneScaleString( x,y,scale,option,font,string ) \
+ V_DrawStringScaled(x,y,scale,FRACUNIT,FRACUNIT,option,font,string)
+#define V__DrawDupxString( x,y,scale,option,font,string )\
+ V__DrawOneScaleString ((x)<>1,option,HU_FONT,string)
void V_DrawRightAlignedSmallString(INT32 x, INT32 y, INT32 option, const char *string);
// draw a string using the tny_font
-void V_DrawThinString(INT32 x, INT32 y, INT32 option, const char *string);
+#define V_DrawThinString( x,y,option,string ) \
+ V__DrawDupxString (x,y,FRACUNIT,option,TINY_FONT,string)
void V_DrawCenteredThinString(INT32 x, INT32 y, INT32 option, const char *string);
void V_DrawRightAlignedThinString(INT32 x, INT32 y, INT32 option, const char *string);
-void V_DrawStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
+#define V_DrawStringAtFixed( x,y,option,string ) \
+ V__DrawOneScaleString (x,y,FRACUNIT,option,HU_FONT,string)
+
+#define V_DrawThinStringAtFixed( x,y,option,string ) \
+ V__DrawOneScaleString (x,y,FRACUNIT,option,TINY_FONT,string)
// Draw tall nums, used for menu, HUD, intermission
void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num);
@@ -214,7 +240,8 @@ void V_DrawPingNum(INT32 x, INT32 y, INT32 flags, INT32 num, const UINT8 *colorm
INT32 V_LevelNameWidth(const char *string);
INT32 V_LevelNameHeight(const char *string);
-void V_DrawCreditString(fixed_t x, fixed_t y, INT32 option, const char *string);
+#define V_DrawCreditString( x,y,option,string ) \
+ V__DrawOneScaleString (x,y,FRACUNIT,option,CRED_FONT,string)
INT32 V_CreditStringWidth(const char *string);
// Find string width from hu_font chars
diff --git a/src/win32/Srb2win-vc10.vcxproj b/src/win32/Srb2win-vc10.vcxproj
index 65500d9bc..698efa09b 100644
--- a/src/win32/Srb2win-vc10.vcxproj
+++ b/src/win32/Srb2win-vc10.vcxproj
@@ -223,6 +223,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -376,6 +390,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/win32/Srb2win-vc9.vcproj b/src/win32/Srb2win-vc9.vcproj
index cac081ad4..2bf2d6631 100644
--- a/src/win32/Srb2win-vc9.vcproj
+++ b/src/win32/Srb2win-vc9.vcproj
@@ -1831,6 +1831,50 @@
RelativePath="..\console.h"
>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+