Merge branch 'tuto-minor' into 'master'

Minor tutorial addendums

See merge request kart-krew-dev/ring-racers-internal!2733
This commit is contained in:
Oni VelocitOni 2025-08-15 04:44:26 +00:00
commit 56fe6580e2
17 changed files with 300 additions and 88 deletions

View file

@ -305,6 +305,10 @@ void HU_Init(void)
PR ("4GTFN");
REG;
DIG (2);
PR ("GENEFN");
REG;
DIG (1);
DIM (0, 10);

View file

@ -77,6 +77,8 @@ enum
X (GTOL4),
X (GTFN4),
X (GENESIS),
X (TALLNUM),
X (NIGHTSNUM),
X (PINGNUM),

View file

@ -294,9 +294,26 @@ void Dialogue::Tick(void)
{
slide += kSlideSpeed;
}
if (P_LevelIsFrozen())
{
if (fade > 0)
{
fade--;
}
}
else if (fade < 5)
{
fade++;
}
}
else
{
if (fade > 0)
{
fade--;
}
if (slide > 0)
{
slide -= kSlideSpeed;
@ -342,6 +359,11 @@ INT32 Dialogue::SlideAmount(fixed_t multiplier)
return Easing_OutCubic(slide, 0, multiplier);
}
INT32 Dialogue::FadeAmount(void)
{
return fade;
}
void Dialogue::Draw(void)
{
if (slide == 0)
@ -516,6 +538,7 @@ void Dialogue::Unset(void)
Dismiss();
SetSpeaker();
slide = 0;
fade = 0;
current_era = 0;
}
@ -547,3 +570,8 @@ INT32 K_GetDialogueSlide(fixed_t multiplier)
{
return g_dialogue.SlideAmount(multiplier);
}
INT32 K_GetDialogueFade(void)
{
return g_dialogue.FadeAmount();
}

View file

@ -27,6 +27,7 @@ void K_TickDialogue(void);
boolean K_DialogueFreeze(void);
INT32 K_GetDialogueSlide(fixed_t multiplier);
INT32 K_GetDialogueFade(void);
#ifdef __cplusplus
} // extern "C"

View file

@ -47,6 +47,7 @@ public:
void Draw(void);
INT32 SlideAmount(fixed_t multiplier);
INT32 FadeAmount(void);
void Dismiss(void);
void Unset(void);
@ -94,6 +95,7 @@ private:
bool active;
fixed_t slide;
INT32 fade;
bool dismissable;
bool freeze;

View file

@ -7654,6 +7654,31 @@ void K_drawKartHUD(void)
{
if (g_emeraldWin)
K_drawEmeraldWin(false);
// Tacitcal Normie Countermeasure
INT32 dfade = K_GetDialogueFade();
if (dfade)
{
V_DrawFadeScreen(31, dfade); // Fade out
srb2::Draw normiedraw = srb2::Draw()
.clipx(0.f, BASEVIDWIDTH)
.y((BASEVIDHEIGHT - 36)/2)
.flags((10 - dfade)<<FF_TRANSSHIFT)
.font(srb2::Draw::Font::kGenesis);
const char *normietext = "COMMUNICATION IN PROGRESS!! ";
INT32 normiew = srb2::Draw::TextElement(normietext).font(srb2::Draw::Font::kGenesis).width();
INT32 normiex = -((static_cast<INT32>(timeinmap)) % normiew);
while (normiex < BASEVIDWIDTH)
{
normiedraw
.x(normiex)
.text(normietext);
normiex += normiew;
}
}
}
// In case of font debugging break glass
@ -8271,16 +8296,17 @@ void K_DrawMarginSticker(INT32 x, INT32 y, INT32 width, INT32 flags, boolean isS
V_DrawFixedPatch((x + width)*FRACUNIT, y*FRACUNIT, FRACUNIT, flags|V_FLIP, stickerEnd, NULL);
}
// common fonts: 0 = thin, 8 = menu. sorry we have to launder a C++ enum in here
INT32 K_DrawGameControl(UINT16 x, UINT16 y, UINT8 player, const char *str, UINT8 alignment, UINT8 font, UINT32 flags)
{
using srb2::Draw;
Draw::TextElement text = Draw::TextElement().as(player).parse(str).font((Draw::Font)font);
Draw draw = Draw(x, y).align((Draw::Align)alignment).flags(flags);
Draw::TextElement text = Draw::TextElement().as(player).parse(str).font(draw.fontno_to_font(font));
INT32 width = text.width();
Draw(x, y).align((srb2::Draw::Align)alignment).flags(flags).text(text);
draw.text(text);
return width;
}

View file

@ -1458,6 +1458,8 @@ extern struct challengesmenu_s {
boolean chaokeyadd, keywasadded;
UINT8 chaokeyhold;
UINT16 tutorialfound;
boolean requestflip;
UINT16 unlockcount[CMC_MAX];

View file

@ -839,7 +839,7 @@ void M_DrawMenuMessage(void)
workx -= K_DrawGameControl(
workx+2, worky+2,
0, "<b_animated> <x_animated> ",
2, 8, 0
2, MENU_FONT, 0
);
if (menumessage.confirmstr)
@ -863,7 +863,7 @@ void M_DrawMenuMessage(void)
workx -= K_DrawGameControl(
workx+2, worky+2,
0, "<a_animated> ",
2, 8, 0
2, MENU_FONT, 0
);
}
@ -1257,7 +1257,7 @@ static INT32 M_DrawRejoinIP(INT32 x, INT32 y, INT32 tx)
V_DrawMenuString(x - 10 - (skullAnimCounter/5), y, f, "\x1C"); // left arrow
V_DrawMenuString(x + w + 2+ (skullAnimCounter/5), y, f, "\x1D"); // right arrow
V_DrawThinString(x, y, f, text);
K_DrawGameControl(BASEVIDWIDTH + 4 + tx, y, 0, "<c> Rejoin", 2, 0, V_ORANGEMAP);
K_DrawGameControl(BASEVIDWIDTH + 4 + tx, y, 0, "<c> Rejoin", 2, TINY_FONT, V_ORANGEMAP);
return shift;
}
@ -2462,11 +2462,11 @@ void M_DrawCharacterSelect(void)
if (!optionsmenu.profile) // Does nothing on this screen
{
K_DrawGameControl(BASEVIDWIDTH/2, kTop, pid, "<r_animated> Info <c_animated> Default", 1, 0, 0);
K_DrawGameControl(BASEVIDWIDTH/2, kTop, pid, "<r_animated> Info <c_animated> Default", 1, TINY_FONT, 0);
}
else
{
K_DrawGameControl(BASEVIDWIDTH/2+62, kTop, pid, "<a_animated> Accept <x_animated> Back <c_animated> Default", 1, 0, 0);
K_DrawGameControl(BASEVIDWIDTH/2+62, kTop, pid, "<a_animated> Accept <x_animated> Back <c_animated> Default", 1, TINY_FONT, 0);
}
}
@ -2745,11 +2745,11 @@ void M_DrawRaceDifficulty(void)
switch (it->mvar2)
{
case MBT_Y:
K_DrawGameControl(cx + 24, cy + 22, 0, activated ? "<y_pressed>" : "<y>", 0, 8, 0);
K_DrawGameControl(cx + 24, cy + 22, 0, activated ? "<y_pressed>" : "<y>", 0, MENU_FONT, 0);
break;
case MBT_Z:
K_DrawGameControl(cx + 24, cy + 22, 0, activated ? "<z_pressed>" : "<z>", 0, 8, 0);
K_DrawGameControl(cx + 24, cy + 22, 0, activated ? "<z_pressed>" : "<z>", 0, MENU_FONT, 0);
break;
}
break;
@ -3868,7 +3868,7 @@ void M_DrawTimeAttack(void)
if (M_EncoreAttackTogglePermitted())
{
K_DrawGameControl(buttonx + 35, buttony - 3, 0, "<r_animated>", 0, 8, 0);
K_DrawGameControl(buttonx + 35, buttony - 3, 0, "<r_animated>", 0, MENU_FONT, 0);
}
if ((timeattackmenu.spbflicker == 0 || timeattackmenu.ticker % 2) == (cv_dummyspbattack.value == 1))
@ -5559,7 +5559,7 @@ void M_DrawProfileControls(void)
UINT16 oldsetting = cv_descriptiveinput->value;
CV_StealthSetValue(cv_descriptiveinput, cv_dummyprofiledescriptiveinput.value);
INT32 xpos = BASEVIDWIDTH - 12;
xpos = K_DrawGameControl(xpos, ypos, 0, "<right> / <c> Clear", 2, 0, 0);
xpos = K_DrawGameControl(xpos, ypos, 0, "<right> / <c> Clear", 2, TINY_FONT, 0);
CV_StealthSetValue(cv_descriptiveinput, oldsetting);
}
@ -6330,16 +6330,16 @@ void M_DrawPause(void)
}
else if (gametype == GT_TUTORIAL)
{
K_DrawGameControl(4, 184 - 60 + offset/2, 0, "<left> <right> <up> <down> Steering", 0, 0, 0);
K_DrawGameControl(4, 184 - 45 + offset/2, 0, "<a> Accelerate", 0, 0, 0);
K_DrawGameControl(4, 184 - 30 + offset/2, 0, "<b> Look Back", 0, 0, 0);
K_DrawGameControl(4, 184 - 15 + offset/2, 0, "<c> Spindash", 0, 0, 0);
K_DrawGameControl(4, 184 - 0 + offset/2, 0, "<l> Item/Rings", 0, 0, 0);
K_DrawGameControl(4, 184 - 60 + offset/2, 0, "<left> <right> <up> <down> Steering", 0, TINY_FONT, 0);
K_DrawGameControl(4, 184 - 45 + offset/2, 0, "<a> Accelerate", 0, TINY_FONT, 0);
K_DrawGameControl(4, 184 - 30 + offset/2, 0, "<b> Look Back", 0, TINY_FONT, 0);
K_DrawGameControl(4, 184 - 15 + offset/2, 0, "<c> Spindash", 0, TINY_FONT, 0);
K_DrawGameControl(4, 184 - 0 + offset/2, 0, "<l> Item/Rings", 0, TINY_FONT, 0);
K_DrawGameControl(90, 184 - 45 + offset/2, 0, "<x> Brake", 0, 0, 0);
K_DrawGameControl(90, 184 - 30 + offset/2, 0, "<y> Respawn", 0, 0, 0);
K_DrawGameControl(90, 184 - 15 + offset/2, 0, "<z> Dialogue / Action", 0, 0, 0);
K_DrawGameControl(90, 184 - 0 + offset/2, 0, "<r> Drift", 0, 0, 0);
K_DrawGameControl(90, 184 - 45 + offset/2, 0, "<x> Brake", 0, TINY_FONT, 0);
K_DrawGameControl(90, 184 - 30 + offset/2, 0, "<y> Respawn", 0, TINY_FONT, 0);
K_DrawGameControl(90, 184 - 15 + offset/2, 0, "<z> Dialogue / Action", 0, TINY_FONT, 0);
K_DrawGameControl(90, 184 - 0 + offset/2, 0, "<r> Drift", 0, TINY_FONT, 0);
}
else
{
@ -6448,7 +6448,7 @@ void M_DrawKickHandler(void)
(playerkickmenu.adminpowered)
? "You are using <red>Admin Tools<white>. <a> Kick <c> Ban"
: K_GetMidVoteLabel(menucallvote),
1, 0, 0
1, TINY_FONT, 0
);
}
@ -7523,7 +7523,7 @@ static void M_DrawChallengePreview(INT32 x, INT32 y)
y = BASEVIDHEIGHT-16;
V_DrawGamemodeString(x, y - 33, 0, R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PLAGUE, GTC_MENUCACHE), M_UseAlternateTitleScreen() ? "On" : "Off");
K_DrawGameControl(x, y, 0, "<a_animated> Toggle", 0, 0, 0);
K_DrawGameControl(x, y, 0, "<a_animated> Toggle", 0, TINY_FONT, 0);
// K_drawButtonAnim(x, y, 0, kp_button_a[1], challengesmenu.ticker);
// x += SHORT(kp_button_a[1][0]->width);
// V_DrawThinString(x, y + 1, highlightflags, "Toggle");
@ -7590,9 +7590,9 @@ static void M_DrawChallengePreview(INT32 x, INT32 y)
}
if (!pushed)
K_DrawGameControl(x, y, 0, "<l> <sky>E Side", 0, 0, 0);
K_DrawGameControl(x, y, 0, "<l> <sky>E Side", 0, TINY_FONT, 0);
else
K_DrawGameControl(x, y, 0, "<l_pressed> <gray>E Side", 0, 0, 0);
K_DrawGameControl(x, y, 0, "<l_pressed> <gray>E Side", 0, TINY_FONT, 0);
// K_drawButton(x&FRACUNIT, y*FRACUNIT, 0, kp_button_l, pushed);
// x += SHORT(kp_button_l[0]->width);
// V_DrawThinString(x, y + 1, (pushed ? V_GRAYMAP : highlightflags), "E Side");
@ -7615,9 +7615,9 @@ static void M_DrawChallengePreview(INT32 x, INT32 y)
}
if (!pushed)
K_DrawGameControl(x, y, 0, "<a> <sky>Play CD", 0, 0, 0);
K_DrawGameControl(x, y, 0, "<a> <sky>Play CD", 0, TINY_FONT, 0);
else
K_DrawGameControl(x, y, 0, "<a_pressed> <gray>Play CD", 0, 0, 0);
K_DrawGameControl(x, y, 0, "<a_pressed> <gray>Play CD", 0, TINY_FONT, 0);
// K_drawButton(x*FRACUNIT, y*FRACUNIT, 0, kp_button_a[1], pushed);
// x += SHORT(kp_button_a[1][0]->width);
// V_DrawThinString(x, y + 1, (pushed ? V_GRAYMAP : highlightflags), "Play CD");
@ -7700,7 +7700,7 @@ static void M_DrawChallengeKeys(INT32 tilex, INT32 tiley)
K_DrawGameControl(
24, 16,
0, keybuttonpress ? "<c_pressed>" : "<c>",
0, 0, 0
0, TINY_FONT, 0
);
// Metyr of rounds played that contribute to Chao Key generation
@ -9432,13 +9432,13 @@ void M_DrawDiscordRequests(void)
/*
K_DrawSticker(x, y + 26, stickerWidth, 0, true);
K_DrawGameControl(x, y+22, 0, "<a_animated>", 0, 0, V_SNAPTORIGHT);
K_DrawGameControl(x, y+22, 0, "<a_animated>", 0, TINY_FONT, V_SNAPTORIGHT);
// K_drawButtonAnim(x, y + 22, V_SNAPTORIGHT, kp_button_a[1], discordrequestmenu.ticker);
*/
UINT32 bigwidth = K_DrawGameControl(x, y+22, 0, "<a_animated> Accept <b_animated> <x_animated> Decline", 0, 0, V_SNAPTORIGHT);
UINT32 bigwidth = K_DrawGameControl(x, y+22, 0, "<a_animated> Accept <b_animated> <x_animated> Decline", 0, TINY_FONT, V_SNAPTORIGHT);
K_DrawSticker(x, y + 26, bigwidth, 0, true);
K_DrawGameControl(x, y+22, 0, "<a_animated> Accept <b_animated> <x_animated> Decline", 0, 0, V_SNAPTORIGHT);
K_DrawGameControl(x, y+22, 0, "<a_animated> Accept <b_animated> <x_animated> Decline", 0, TINY_FONT, V_SNAPTORIGHT);
/*
V_DrawThinString((x + xoffs), y + 24, 0, acceptText);
@ -9447,7 +9447,7 @@ void M_DrawDiscordRequests(void)
K_drawButtonAnim((x + xoffs), y + 22, V_SNAPTORIGHT, kp_button_b[1], discordrequestmenu.ticker);
xoffs += declineButtonWidth;
xoffs += K_DrawGameControl(x + xoffs, y+22, 0, "<x_animated>", 0, 0, V_SNAPTORIGHT);
xoffs += K_DrawGameControl(x + xoffs, y+22, 0, "<x_animated>", 0, TINY_FONT, V_SNAPTORIGHT);
K_drawButtonAnim((x + xoffs), y + 22, V_SNAPTORIGHT, kp_button_x[1], discordrequestmenu.ticker);
xoffs += altDeclineButtonWidth;

View file

@ -1136,7 +1136,7 @@ void K_DrawMidVote(void)
K_DrawGameControl(
x/FRACUNIT - 4, y/FRACUNIT + exc->height - 8,
id, pressed ? "<z_pressed>" : "<z>",
0, 8, V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SPLITSCREEN
0, MENU_FONT, V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SPLITSCREEN
);
/*
K_drawButton(
@ -1260,7 +1260,7 @@ void K_DrawMidVote(void)
K_DrawGameControl(
x/FRACUNIT-20, y/FRACUNIT + 2, id,
pressed ? "<z_pressed>" : "<z>",
0, 8, V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SPLITSCREEN
0, MENU_FONT, V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SPLITSCREEN
);
/*
K_drawButton(

View file

@ -2570,6 +2570,10 @@ static const char *M_GetConditionString(condition_t *cn)
Z_Free(title);
return work;
}
case UC_CONDITIONSET:
return va("INVALID CN RECURSION \"%d\"", cn->requirement);
case UC_UNLOCKABLE: // Requires unlockable x to be obtained
return va("get %s",
gamedata->unlocked[cn->requirement-1]
@ -3015,20 +3019,17 @@ static const char *M_GetConditionString(condition_t *cn)
default:
break;
}
// UC_MAPTRIGGER and UC_CONDITIONSET are explicitly very hard to support proper descriptions for
// UC_MAPTRIGGER and the like are explicitly very hard to support proper descriptions for
return va("UNSUPPORTED CONDITION \"%d\"", cn->type);
}
char *M_BuildConditionSetString(UINT16 unlockid)
{
conditionset_t *c = NULL;
UINT32 lastID = 0;
condition_t *cn;
size_t len = 1024, worklen;
static char message[1024] = "";
const char *work = NULL;
size_t i;
UINT8 stopasap = 0;
message[0] = '\0';
@ -3049,61 +3050,102 @@ char *M_BuildConditionSetString(UINT16 unlockid)
len--;
}
c = &conditionSets[unlockables[unlockid].conditionset-1];
struct conditionset_traverser_s {
conditionset_t *c;
size_t i;
UINT32 lastID;
UINT8 stopasap;
};
for (i = 0; i < c->numconditions; ++i)
{
cn = &c->condition[i];
struct conditionset_traverser_s current = {0};
current.c = &conditionSets[unlockables[unlockid].conditionset-1];
current.i = current.lastID = current.stopasap = 0;
if (i > 0)
struct conditionset_traverser_s restore = {0};
restore.c = NULL;
do {
if (current.stopasap == UINT8_MAX)
{
worklen = 0;
if (lastID != cn->id)
// Sentinel value for recursion
current.stopasap = 0;
}
else if (restore.c)
{
// De-recur
current = restore;
current.i++;
restore.c = NULL;
}
for (; current.i < current.c->numconditions; ++current.i)
{
cn = &current.c->condition[current.i];
if (current.i > 0)
{
stopasap = 0;
worklen = 6;
strncat(message, " - OR ", len);
worklen = 0;
if (current.lastID != cn->id)
{
current.stopasap = 0;
worklen = 6;
strncat(message, " - OR ", len);
}
else if (current.stopasap == 0 && cn->type != UC_COMMA)
{
worklen = 1;
strncat(message, " ", len);
}
len -= worklen;
}
else if (stopasap == 0 && cn->type != UC_COMMA)
current.lastID = cn->id;
if (current.stopasap == 1)
{
worklen = 1;
strncat(message, " ", len);
// Secret challenge -- show unrelated condition IDs
continue;
}
if (cn->type == UC_CONDITIONSET
&& restore.c == NULL
&& cn->requirement
&& cn->requirement <= MAXCONDITIONSETS)
{
// Conditionset description! Can only recursion once at a time
restore = current;
current.c = &conditionSets[cn->requirement-1];
current.i = current.lastID = 0;
current.stopasap = UINT8_MAX;
break;
}
work = M_GetConditionString(cn);
if (work == NULL)
{
current.stopasap = 1;
if (message[0] && message[1])
work = "???";
else
work = "(Find other secrets to learn about this...)";
}
else if (cn->type == UC_DESCRIPTIONOVERRIDE)
{
current.stopasap = 2;
}
worklen = strlen(work);
strncat(message, work, len);
len -= worklen;
}
lastID = cn->id;
if (stopasap == 1)
{
// Secret challenge -- show unrelated condition IDs
continue;
if (current.stopasap == 2)
{
// Description override - hide all further ones
break;
}
}
work = M_GetConditionString(cn);
if (work == NULL)
{
stopasap = 1;
if (message[0] && message[1])
work = "???";
else
work = "(Find other secrets to learn about this...)";
}
else if (cn->type == UC_DESCRIPTIONOVERRIDE)
{
stopasap = 2;
}
worklen = strlen(work);
strncat(message, work, len);
len -= worklen;
if (stopasap == 2)
{
// Description override - hide all further ones
break;
}
}
} while (restore.c);
if (message[0] == '\0')
{

View file

@ -376,6 +376,7 @@ menu_t *M_InterruptMenuWithChallenges(menu_t *desiredmenu)
challengesmenu.requestnew = false;
challengesmenu.chaokeyadd = false;
challengesmenu.keywasadded = false;
challengesmenu.tutorialfound = NEXTMAP_INVALID;
challengesmenu.chaokeyhold = 0;
challengesmenu.unlockcondition = NULL;
@ -479,6 +480,7 @@ boolean M_CanKeyHiliTile(void)
enum {
CCTUTORIAL_KEYGEN = 0,
CCTUTORIAL_MAJORSKIP,
CCTUTORIAL_TUTORIAL, // I heard you like tutorials, so I...
} cctutorial_e;
static void M_ChallengesTutorial(UINT8 option)
@ -512,6 +514,25 @@ static void M_ChallengesTutorial(UINT8 option)
gamedata->majorkeyskipattempted = true;
break;
}
case CCTUTORIAL_TUTORIAL:
{
M_StartMessage("New Tutorial Data",
va(M_GetText(
"A new piece of Eggman and Tails'\n"
"short adventure has been decrypted.\n"
"\n"
"You can find \"""\x87""%s""\x80""\" on\n"
"the Tutorials menu under Extras!\n"
"\n"
"These may sometimes be needed for progression.\n"
), (challengesmenu.tutorialfound < nummapheaders
&& mapheaderinfo[challengesmenu.tutorialfound]
? mapheaderinfo[challengesmenu.tutorialfound]->menuttl
: "ERROR!?"
)), NULL, MM_NOTHING, NULL, "Got it!");
challengesmenu.tutorialfound = NEXTMAP_INVALID;
break;
}
default:
{
M_StartMessage("M_ChallengesTutorial ERROR",
@ -725,6 +746,28 @@ void M_ChallengesTick(void)
gamedata->unlocked[challengesmenu.currentunlock] = true;
M_UpdateUnlockablesAndExtraEmblems(true, true);
if (challengesmenu.tutorialfound == NEXTMAP_INVALID
&& ref->type == SECRET_MAP)
{
// Map exists...
UINT16 mapnum = M_UnlockableMapNum(ref);
if (mapnum < nummapheaders && mapheaderinfo[mapnum])
{
// is tutorial...
INT32 guessgt = G_GuessGametypeByTOL(mapheaderinfo[mapnum]->typeoflevel);
if (guessgt == GT_TUTORIAL)
{
// and isn't the playground?
if (!tutorialplaygroundmap
|| strcmp(tutorialplaygroundmap, mapheaderinfo[mapnum]->lumpname))
{
// Pop an alert up!
challengesmenu.tutorialfound = mapnum;
}
}
}
}
// Update shown description just in case..?
if (challengesmenu.unlockcondition)
Z_Free(challengesmenu.unlockcondition);
@ -801,6 +844,11 @@ void M_ChallengesTick(void)
// not ideal but at least unlikely to
// get at same time?? :V
}
else if (challengesmenu.tutorialfound != NEXTMAP_INVALID)
{
M_ChallengesTutorial(CCTUTORIAL_TUTORIAL);
// Also no keygen, but that can come later.
}
else if (gamedata->chaokeytutorial == false
&& challengesmenu.keywasadded == true)
{

View file

@ -264,7 +264,7 @@ void draw_menu()
draw.x(BASEVIDWIDTH/2).font(Draw::Font::kGamemode).text(mode_strings[menu_mode()]);
if (server || IsPlayerAdmin(consoleplayer))
K_DrawGameControl(draw.x() + 8, draw.y()-6, 0, M_MenuButtonHeld(0, MBT_Y) ? "<y_pressed> Switch Page" : "<y> Switch Page", 0, 8, 0);
K_DrawGameControl(draw.x() + 8, draw.y()-6, 0, M_MenuButtonHeld(0, MBT_Y) ? "<y_pressed> Switch Page" : "<y> Switch Page", 0, MENU_FONT, 0);
// K_drawButton((draw.x() + 8) * FRACUNIT, (draw.y() + 8) * FRACUNIT, 0, kp_button_y[0], M_MenuButtonHeld(0, MBT_Y));
draw = draw.y(32 + kMargin);

View file

@ -208,7 +208,7 @@ void draw_menu()
draw = draw.y(27 + kMargin);
draw.x(BASEVIDWIDTH/2).font(Draw::Font::kGamemode).text(mode_strings[menu_mode()]);
K_DrawGameControl(draw.x() + 8, draw.y()-6, 0, M_MenuButtonHeld(0, MBT_Y) ? "<y_pressed> Switch Page" : "<y> Switch Page", 0, 8, 0);
K_DrawGameControl(draw.x() + 8, draw.y()-6, 0, M_MenuButtonHeld(0, MBT_Y) ? "<y_pressed> Switch Page" : "<y> Switch Page", 0, MENU_FONT, 0);
// K_drawButton((draw.x() + 8) * FRACUNIT, (draw.y() + 8) * FRACUNIT, 0, kp_button_y[0], M_MenuButtonHeld(0, MBT_Y));
draw = draw.y(32 + kMargin);

View file

@ -1501,7 +1501,7 @@ void ST_DrawSaveReplayHint(INT32 flags)
K_DrawGameControl(
BASEVIDWIDTH - 2, 2, 0,
(demo.willsave && demo.titlename[0]) ? "Replay will be saved. <b> Change title" : "<b> or <x> Save replay",
2, 0, flags|V_YELLOWMAP
2, TINY_FONT, flags|V_YELLOWMAP
);
}

View file

@ -531,16 +531,66 @@ patch_t* Draw::cache_patch(const char* name)
return static_cast<patch_t*>(W_CachePatchName(name, PU_CACHE));
}
Draw::Font Draw::fontno_to_font(int font)
{
switch (font)
{
case TINY_FONT:
default:
return Font::kThin;
case GM_FONT:
return Font::kGamemode;
case GENESIS_FONT:
return Font::kGenesis;
case HU_FONT:
return Font::kConsole;
case KART_FONT:
return Font::kFreeplay;
case OPPRF_FONT:
return Font::kZVote;
case PINGF_FONT:
return Font::kPing;
case TIMER_FONT:
return Font::kTimer;
case TINYTIMER_FONT:
return Font::kThinTimer;
case MENU_FONT:
return Font::kMenu;
case MED_FONT:
return Font::kMedium;
case ROLNUM_FONT:
return Font::kRollingNum;
case RO4NUM_FONT:
return Font::kRollingNum4P;
}
};
int Draw::font_to_fontno(Font font)
{
switch (font)
{
case Font::kThin:
default:
return TINY_FONT;
case Font::kGamemode:
return GM_FONT;
case Font::kGenesis:
return GENESIS_FONT;
case Font::kConsole:
return HU_FONT;
@ -571,8 +621,6 @@ int Draw::font_to_fontno(Font font)
case Font::kRollingNum4P:
return RO4NUM_FONT;
}
return TINY_FONT;
};
INT32 Draw::default_font_flags(Font font)

View file

@ -194,6 +194,7 @@ public:
{
kThin,
kGamemode,
kGenesis,
kConsole,
kFreeplay,
kZVote,
@ -205,6 +206,7 @@ public:
kRollingNum,
kRollingNum4P,
};
Font fontno_to_font(int font);
enum class Align
{

View file

@ -2350,6 +2350,10 @@ static void V_GetFontSpecification(int fontno, INT32 flags, fontspec_t *result)
case GM_FONT:
result->spacew = 6;
break;
case GENESIS_FONT:
result->spacew = 8;
result->right_outline = 0;
break;
case FILE_FONT:
result->spacew = 0;
break;
@ -2390,6 +2394,9 @@ static void V_GetFontSpecification(int fontno, INT32 flags, fontspec_t *result)
case GM_FONT:
result->lfh = 32;
break;
case GENESIS_FONT:
result->lfh = 36;
break;
case LSHI_FONT:
result->lfh = 56;
break;