mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Menus/Controls: add Bind Ben
- Hold right to scroll binding text into Bind Ben
- Release right to cancel
- When the text is done scrolling, Bind Ben begins
chewing
- Release right to have Bind Ben swallow
- After Bind Ben swallows the binding text, he does
a cute pose and the control is cleared
- Press up or down to skip the swallow and pose
animations and clear the control immediately
- Press C to have Bind Ben quickly eat the binding text
and clear the control
This commit is contained in:
parent
0766e8823b
commit
9523fd8652
3 changed files with 156 additions and 3 deletions
|
|
@ -966,6 +966,7 @@ struct modedesc_t
|
||||||
#define MAXCOLUMNMODES 12 //max modes displayed in one column
|
#define MAXCOLUMNMODES 12 //max modes displayed in one column
|
||||||
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
|
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
|
||||||
#define M_OPTIONS_OFSTIME 5
|
#define M_OPTIONS_OFSTIME 5
|
||||||
|
#define M_OPTIONS_BINDBEN_QUICK 106
|
||||||
// Keep track of some options properties
|
// Keep track of some options properties
|
||||||
extern struct optionsmenu_s {
|
extern struct optionsmenu_s {
|
||||||
|
|
||||||
|
|
@ -998,6 +999,8 @@ extern struct optionsmenu_s {
|
||||||
INT16 controlscroll; // scrolling for the control menu....
|
INT16 controlscroll; // scrolling for the control menu....
|
||||||
UINT8 bindcontrol; // 0: not binding, 1: binding control #1, 2: binding control #2
|
UINT8 bindcontrol; // 0: not binding, 1: binding control #1, 2: binding control #2
|
||||||
INT16 bindtimer; // Timer until binding is cancelled (5s)
|
INT16 bindtimer; // Timer until binding is cancelled (5s)
|
||||||
|
UINT16 bindben; // Hold right timer
|
||||||
|
UINT8 bindben_swallow; // (bool) control is about to be cleared; (int) swallow/pose animation timer
|
||||||
|
|
||||||
INT16 trycontroller; // Starts at 3*TICRATE, holding B lowers this, when at 0, cancel controller try mode.
|
INT16 trycontroller; // Starts at 3*TICRATE, holding B lowers this, when at 0, cancel controller try mode.
|
||||||
|
|
||||||
|
|
|
||||||
109
src/k_menudraw.c
109
src/k_menudraw.c
|
|
@ -4785,6 +4785,74 @@ static const char *M_GetDPadPatchName(SINT8 ud, SINT8 lr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void M_DrawBindBen(INT32 x, INT32 y, INT32 scroll_remaining)
|
||||||
|
{
|
||||||
|
// optionsmenu.bindben_swallow
|
||||||
|
const int pose_time = 30;
|
||||||
|
const int swallow_time = pose_time + 14;
|
||||||
|
|
||||||
|
// Lid closed
|
||||||
|
int state = 'A';
|
||||||
|
int frame = 0;
|
||||||
|
|
||||||
|
if (optionsmenu.bindben_swallow > 100)
|
||||||
|
{
|
||||||
|
// Quick swallow (C button)
|
||||||
|
state = 'C';
|
||||||
|
|
||||||
|
int t = 106 - optionsmenu.bindben_swallow;
|
||||||
|
if (t < 3)
|
||||||
|
frame = 0;
|
||||||
|
else
|
||||||
|
frame = t - 3;
|
||||||
|
}
|
||||||
|
else if (scroll_remaining <= 0)
|
||||||
|
{
|
||||||
|
// Chewing (text done scrolling)
|
||||||
|
state = 'B';
|
||||||
|
frame = I_GetTime() / 2 % 4;
|
||||||
|
|
||||||
|
// When state changes from 'lid open' to 'chewing',
|
||||||
|
// play chomp sound.
|
||||||
|
if (!optionsmenu.bindben_swallow)
|
||||||
|
S_StartSound(NULL, sfx_monch);
|
||||||
|
|
||||||
|
// Ready to swallow when button is released.
|
||||||
|
optionsmenu.bindben_swallow = swallow_time + 1;
|
||||||
|
}
|
||||||
|
else if (optionsmenu.bindben)
|
||||||
|
{
|
||||||
|
// Lid open (text scrolling)
|
||||||
|
frame = 1;
|
||||||
|
}
|
||||||
|
else if (optionsmenu.bindben_swallow)
|
||||||
|
{
|
||||||
|
if (optionsmenu.bindben_swallow > pose_time)
|
||||||
|
{
|
||||||
|
// Swallow
|
||||||
|
state = 'C';
|
||||||
|
|
||||||
|
int t = swallow_time - optionsmenu.bindben_swallow;
|
||||||
|
if (t < 8)
|
||||||
|
frame = 0;
|
||||||
|
else
|
||||||
|
frame = 1 + (t - 8) / 2 % 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Pose
|
||||||
|
state = 'D';
|
||||||
|
|
||||||
|
int t = pose_time - optionsmenu.bindben_swallow;
|
||||||
|
if (t < 10)
|
||||||
|
frame = 0;
|
||||||
|
else
|
||||||
|
frame = 1 + (t - 10) / 4 % 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
V_DrawMappedPatch(x-30, y, 0, W_CachePatchName(va("PR_BIN%c%c", state, '1' + frame), PU_CACHE), aquamap);
|
||||||
|
}
|
||||||
|
|
||||||
// the control stuff.
|
// the control stuff.
|
||||||
// Dear god.
|
// Dear god.
|
||||||
|
|
@ -5008,6 +5076,9 @@ void M_DrawProfileControls(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INT32 bindx = x;
|
||||||
|
INT32 benx = 142;
|
||||||
|
INT32 beny = y - 8;
|
||||||
if (i == itemOn)
|
if (i == itemOn)
|
||||||
{
|
{
|
||||||
// Extend yellow wedge down behind
|
// Extend yellow wedge down behind
|
||||||
|
|
@ -5016,12 +5087,46 @@ void M_DrawProfileControls(void)
|
||||||
{
|
{
|
||||||
for (j=24; j < 34; j++)
|
for (j=24; j < 34; j++)
|
||||||
V_DrawFill(0, (y)+j, 128+j, 1, 73);
|
V_DrawFill(0, (y)+j, 128+j, 1, 73);
|
||||||
|
benx += 10;
|
||||||
|
beny += 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scroll text into Bind Ben.
|
||||||
|
bindx += optionsmenu.bindben * 3;
|
||||||
|
|
||||||
|
if (buf2[0])
|
||||||
|
{
|
||||||
|
// Bind Ben: suck characters off
|
||||||
|
// the end of the first line onto
|
||||||
|
// the beginning of the second
|
||||||
|
// line.
|
||||||
|
UINT16 n = strlen(buf);
|
||||||
|
UINT16 t = min(optionsmenu.bindben, n);
|
||||||
|
memmove(&buf2[t], buf2, t + 1);
|
||||||
|
memcpy(buf2, &buf[n - t], t);
|
||||||
|
buf[n - t] = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
cliprect_t clip;
|
||||||
|
V_SaveClipRect(&clip); // preserve cliprect for tooltip
|
||||||
|
|
||||||
|
// Clip text as it scrolls into Bind Ben.
|
||||||
|
V_SetClipRect(0, 0, (benx-14)*FRACUNIT, 200*FRACUNIT, 0);
|
||||||
|
|
||||||
|
if (i != itemOn || !optionsmenu.bindben_swallow)
|
||||||
|
{
|
||||||
// don't shift the text if we didn't draw a patch.
|
// don't shift the text if we didn't draw a patch.
|
||||||
V_DrawThinString(x + (drawnpatch ? 13 : 1), y + 12, vflags, buf);
|
V_DrawThinString(bindx + (drawnpatch ? 13 : 1), y + 12, vflags, buf);
|
||||||
V_DrawThinString(x + (drawnpatch ? 13 : 1), y + 22, vflags, buf2);
|
V_DrawThinString(bindx + (drawnpatch ? 13 : 1), y + 22, vflags, buf2);
|
||||||
|
}
|
||||||
|
|
||||||
|
V_RestoreClipRect(&clip);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == itemOn)
|
||||||
|
M_DrawBindBen(benx, beny, (benx-14) - bindx);
|
||||||
|
|
||||||
// controller dest coords:
|
// controller dest coords:
|
||||||
if (itemOn == i && gc > 0 && gc <= gc_start)
|
if (itemOn == i && gc > 0 && gc <= gc_start)
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,7 @@ static boolean M_ClearCurrentControl(void)
|
||||||
|
|
||||||
void M_HandleProfileControls(void)
|
void M_HandleProfileControls(void)
|
||||||
{
|
{
|
||||||
|
const UINT8 pid = 0;
|
||||||
UINT8 maxscroll = currentMenu->numitems - 5;
|
UINT8 maxscroll = currentMenu->numitems - 5;
|
||||||
M_OptionsTick();
|
M_OptionsTick();
|
||||||
|
|
||||||
|
|
@ -184,6 +185,35 @@ void M_HandleProfileControls(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else if (currentMenu->menuitems[itemOn].mvar1) // check if we're on a valid menu option...
|
||||||
|
{
|
||||||
|
// Hold right to begin clearing the control.
|
||||||
|
//
|
||||||
|
// If bindben timer increases enough, bindben_swallow
|
||||||
|
// will be set.
|
||||||
|
// This is a commitment to clear the control.
|
||||||
|
// You can keep holding right to postpone the clear
|
||||||
|
// but once you let go, you are locked out of
|
||||||
|
// pressing it again until the animation finishes.
|
||||||
|
if (menucmd[pid].dpad_lr > 0 && (optionsmenu.bindben || !optionsmenu.bindben_swallow))
|
||||||
|
{
|
||||||
|
optionsmenu.bindben++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
optionsmenu.bindben = 0;
|
||||||
|
|
||||||
|
if (optionsmenu.bindben_swallow)
|
||||||
|
{
|
||||||
|
optionsmenu.bindben_swallow--;
|
||||||
|
|
||||||
|
if (optionsmenu.bindben_swallow == 100) // special countdown for the "quick" animation
|
||||||
|
optionsmenu.bindben_swallow = 0;
|
||||||
|
else if (!optionsmenu.bindben_swallow) // long animation, clears control when done
|
||||||
|
M_ClearCurrentControl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void M_ProfileTryController(INT32 choice)
|
void M_ProfileTryController(INT32 choice)
|
||||||
|
|
@ -287,6 +317,8 @@ boolean M_ProfileControlsInputs(INT32 ch)
|
||||||
{
|
{
|
||||||
if (M_ClearCurrentControl())
|
if (M_ClearCurrentControl())
|
||||||
S_StartSound(NULL, sfx_monch);
|
S_StartSound(NULL, sfx_monch);
|
||||||
|
optionsmenu.bindben = 0;
|
||||||
|
optionsmenu.bindben_swallow = M_OPTIONS_BINDBEN_QUICK;
|
||||||
M_SetMenuDelay(pid);
|
M_SetMenuDelay(pid);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -297,6 +329,19 @@ boolean M_ProfileControlsInputs(INT32 ch)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (menucmd[pid].dpad_ud)
|
||||||
|
{
|
||||||
|
if (optionsmenu.bindben_swallow)
|
||||||
|
{
|
||||||
|
// Control would be cleared, but we're
|
||||||
|
// interrupting the animation so clear it
|
||||||
|
// immediately.
|
||||||
|
M_ClearCurrentControl();
|
||||||
|
}
|
||||||
|
optionsmenu.bindben = 0;
|
||||||
|
optionsmenu.bindben_swallow = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue