Menus: Rename MenuPassword_t to MenuTextForm_t, modularize more of its attributes into the data structure, and polish its display and behavior.

git-svn-id: https://svn.eduke32.com/eduke32@5083 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
hendricks266 2015-03-24 10:48:34 +00:00
parent 203b795cc9
commit 6d04da0b49
2 changed files with 43 additions and 29 deletions

View file

@ -1169,7 +1169,7 @@ static MenuMessage_t M_NETWAITMASTER = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None,
static MenuMessage_t M_NETWAITVOTES = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, }; static MenuMessage_t M_NETWAITVOTES = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, };
static MenuMessage_t M_BUYDUKE = { CURSOR_BOTTOMRIGHT, MENU_EPISODE, MA_Return, }; static MenuMessage_t M_BUYDUKE = { CURSOR_BOTTOMRIGHT, MENU_EPISODE, MA_Return, };
static MenuPassword_t M_ADULTPASSWORD = { NULL, MAXPWLOCKOUT }; static MenuTextForm_t M_ADULTPASSWORD = { NULL, "Enter Password:", MAXPWLOCKOUT, MTF_Password };
#define MAKE_MENUFILESELECT(a, b, c) { a, { &MMF_FileSelectLeft, &MMF_FileSelectRight }, { &MF_Minifont, &MF_MinifontRed }, b, c, { NULL, NULL }, { 0, 0 }, { 3<<16, 3<<16 }, FNLIST_INITIALIZER, 0 } #define MAKE_MENUFILESELECT(a, b, c) { a, { &MMF_FileSelectLeft, &MMF_FileSelectRight }, { &MF_Minifont, &MF_MinifontRed }, b, c, { NULL, NULL }, { 0, 0 }, { 3<<16, 3<<16 }, FNLIST_INITIALIZER, 0 }
@ -1226,7 +1226,7 @@ static Menu_t Menus[] = {
{ &M_LOADVERIFY, MENU_LOADVERIFY, MENU_LOAD, MA_None, Verify }, { &M_LOADVERIFY, MENU_LOADVERIFY, MENU_LOAD, MA_None, Verify },
{ &M_NEWVERIFY, MENU_NEWVERIFY, MENU_MAIN, MA_Return, Verify }, { &M_NEWVERIFY, MENU_NEWVERIFY, MENU_MAIN, MA_Return, Verify },
{ &M_SAVEVERIFY, MENU_SAVEVERIFY, MENU_SAVE, MA_None, Verify }, { &M_SAVEVERIFY, MENU_SAVEVERIFY, MENU_SAVE, MA_None, Verify },
{ &M_ADULTPASSWORD, MENU_ADULTPASSWORD, MENU_GAMESETUP, MA_None, Password }, { &M_ADULTPASSWORD, MENU_ADULTPASSWORD, MENU_GAMESETUP, MA_None, TextForm },
{ &M_RESETPLAYER, MENU_RESETPLAYER, MENU_CLOSE, MA_None, Verify }, { &M_RESETPLAYER, MENU_RESETPLAYER, MENU_CLOSE, MA_None, Verify },
{ &M_BUYDUKE, MENU_BUYDUKE, MENU_EPISODE, MA_Return, Message }, { &M_BUYDUKE, MENU_BUYDUKE, MENU_EPISODE, MA_Return, Message },
{ &M_NETWORK, MENU_NETWORK, MENU_MAIN, MA_Return, Menu }, { &M_NETWORK, MENU_NETWORK, MENU_MAIN, MA_Return, Menu },
@ -2911,16 +2911,16 @@ static void M_MenuVerify(int32_t input)
} }
} }
static void M_MenuPasswordSubmit(char *input) static void M_MenuTextFormSubmit(char *input)
{ {
switch (g_currentMenu) switch (g_currentMenu)
{ {
case MENU_ADULTPASSWORD: case MENU_ADULTPASSWORD:
if (Bstrlen(input) && (ud.pwlockout[0] == 0 || ud.lockout == 0)) if (Bstrlen(input) && (ud.pwlockout[0] == 0 || ud.lockout == 0))
Bstrcpy(&ud.pwlockout[0], input); Bstrcpy(&ud.pwlockout[0], input);
#if 0
else if (Bstrcmp(input, &ud.pwlockout[0]) == 0) else if (Bstrcmp(input, &ud.pwlockout[0]) == 0)
{ {
ud.lockout = 0;
#if 0 #if 0
for (x=0; x<g_numAnimWalls; x++) for (x=0; x<g_numAnimWalls; x++)
if (wall[animwall[x].wallnum].picnum != W_SCREENBREAK && if (wall[animwall[x].wallnum].picnum != W_SCREENBREAK &&
@ -2930,7 +2930,9 @@ static void M_MenuPasswordSubmit(char *input)
wall[animwall[x].wallnum].picnum = wall[animwall[x].wallnum].extra; wall[animwall[x].wallnum].picnum = wall[animwall[x].wallnum].extra;
#endif #endif
} }
#endif
S_PlaySound(PISTOL_BODYHIT);
M_ChangeMenu(MENU_GAMESETUP); M_ChangeMenu(MENU_GAMESETUP);
break; break;
@ -3192,10 +3194,10 @@ void M_ChangeMenu(MenuID_t cm)
m_menuchange_watchpoint = 1; m_menuchange_watchpoint = 1;
#endif #endif
if (m_currentMenu->type == Password) if (m_currentMenu->type == TextForm)
{ {
typebuf[0] = 0; typebuf[0] = 0;
((MenuPassword_t*)m_currentMenu->object)->input = typebuf; ((MenuTextForm_t*)m_currentMenu->object)->input = typebuf;
} }
else if (m_currentMenu->type == FileSelect) else if (m_currentMenu->type == FileSelect)
M_MenuFileSelectInit((MenuFileSelect_t*)m_currentMenu->object); M_MenuFileSelectInit((MenuFileSelect_t*)m_currentMenu->object);
@ -3272,7 +3274,7 @@ int32_t M_IsTextInput(Menu_t *cm)
switch (m_currentMenu->type) switch (m_currentMenu->type)
{ {
case Verify: case Verify:
case Password: case TextForm:
case FileSelect: case FileSelect:
case Message: case Message:
return 1; return 1;
@ -3397,11 +3399,11 @@ static int32_t ydim_from_200_16(int32_t y)
return scale(y, ydim, 200<<16); return scale(y, ydim, 200<<16);
} }
static void M_BlackRectangle(int32_t x, int32_t y, int32_t width, int32_t height) static void M_BlackRectangle(int32_t x, int32_t y, int32_t width, int32_t height, int32_t orientation)
{ {
const int32_t xscale = scale(65536, width, tilesiz[0].x<<16), yscale = scale(65536, height, tilesiz[0].y<<16); const int32_t xscale = scale(65536, width, tilesiz[0].x<<16), yscale = scale(65536, height, tilesiz[0].y<<16);
rotatesprite_(x, y, max(xscale, yscale), 0, 0, 127, 4, 1|2|8|16|32, 0, 0, xdim_from_320_16(x), ydim_from_200_16(y), xdim_from_320_16(x + width), ydim_from_200_16(y + height)); rotatesprite_(x, y, max(xscale, yscale), 0, 0, 127, 4, (orientation&(1|32))|2|8|16, 0, 0, xdim_from_320_16(x), ydim_from_200_16(y), xdim_from_320_16(x + width), ydim_from_200_16(y + height));
} }
enum MenuTextFlags_t enum MenuTextFlags_t
@ -3502,7 +3504,7 @@ static void M_RunMenu_Scrollbar(Menu_t *cm, MenuMenuFormat_t const * const forma
const int32_t scrollregionheight = scrollheight - (tilesiz[SELECTDIR].y<<16); const int32_t scrollregionheight = scrollheight - (tilesiz[SELECTDIR].y<<16);
const int32_t scrollPosMax = totalextent - klabs(format->bottomcutoff); const int32_t scrollPosMax = totalextent - klabs(format->bottomcutoff);
M_BlackRectangle(scrollx, scrolly, scrollwidth, scrollheight); M_BlackRectangle(scrollx, scrolly, scrollwidth, scrollheight, 1|32);
rotatesprite_fs(scrollx, scrolly + scale(scrollregionheight, *scrollPos, scrollPosMax), 65536, 0, SELECTDIR, 0, 0, 26); rotatesprite_fs(scrollx, scrolly + scale(scrollregionheight, *scrollPos, scrollPosMax), 65536, 0, SELECTDIR, 0, 0, 26);
@ -4381,27 +4383,35 @@ static void M_RunMenu(Menu_t *cm, const vec2_t origin)
break; break;
} }
case Password: case TextForm:
{ {
MenuPassword_t *object = (MenuPassword_t*)cm->object; MenuTextForm_t *object = (MenuTextForm_t*)cm->object;
vec2_t textreturn;
size_t x;
M_PreMenu(cm->menuID); M_PreMenu(cm->menuID);
M_PreMenuDrawBackground(cm->menuID, origin); M_PreMenuDrawBackground(cm->menuID, origin);
mgametextcenter(origin.x, origin.y + ((50+16+16+16+16-12)<<16), "Enter Password"); M_BlackRectangle(origin.x + (60<<16), origin.y + (86<<16), 200<<16, 28<<16, 0);
for (x=0; x < Bstrlen(object->input); ++x) G_ScreenText(STARTALPHANUM, origin.x + (160<<16), origin.y + (98<<16), 65536, 0, 0, object->instructions, 0, 0, 2|8|16|ROTATESPRITE_FULL16, 0, 5<<16, 8<<16, -1<<16, 1<<16, TEXT_XCENTER|TEXT_YBOTTOM, 0, 0, xdim-1, ydim-1);
tempbuf[x] = '*';
tempbuf[x] = 0;
textreturn = mgametextcenter(origin.x, origin.y + ((50+16+16+16+16)<<16), tempbuf); const char *displaytext = object->input;
if (object->flags & MTF_Password)
{
size_t x;
for (x = 0; x < Bstrlen(object->input); ++x)
tempbuf[x] = '*';
tempbuf[x] = 0;
displaytext = tempbuf;
}
const vec2_t textreturn = G_ScreenText(STARTALPHANUM, origin.x + (160<<16), origin.y + (102<<16), 65536, 0, 0, displaytext, 0, 0, 2|8|16|ROTATESPRITE_FULL16, 0, 5<<16, 8<<16, -1<<16, 1<<16, TEXT_XCENTER, 0, 0, xdim-1, ydim-1);
M_PreMenuDraw(cm->menuID, NULL, origin); M_PreMenuDraw(cm->menuID, NULL, origin);
rotatesprite_fs(origin.x + (168<<16) + (textreturn.x>>1), origin.y + ((50+16+16+16+16+4)<<16), 32768, 0, SPINNINGNUKEICON + ((totalclock >> 3) % 7), cursorShade, 0, 2 | 8); rotatesprite_fs(origin.x + (168<<16) + (textreturn.x>>1), origin.y + (106<<16), 32768, 0, SPINNINGNUKEICON + ((totalclock >> 3) % 7), cursorShade, 0, 2 | 8);
break; break;
} }
@ -4421,7 +4431,7 @@ static void M_RunMenu(Menu_t *cm, const vec2_t origin)
// black translucent background underneath file lists // black translucent background underneath file lists
M_BlackRectangle(origin.x + (36<<16), origin.y + (42<<16), 248<<16, 123<<16); M_BlackRectangle(origin.x + (36<<16), origin.y + (42<<16), 248<<16, 123<<16, 1|32);
// path // path
Bsnprintf(tempbuf, sizeof(tempbuf), "Path: %s", object->destination); Bsnprintf(tempbuf, sizeof(tempbuf), "Path: %s", object->destination);
@ -5065,9 +5075,9 @@ static void M_RunMenuInput(Menu_t *cm)
break; break;
} }
case Password: case TextForm:
{ {
MenuPassword_t *object = (MenuPassword_t*)cm->object; MenuTextForm_t *object = (MenuTextForm_t*)cm->object;
int32_t hitstate = I_EnterText(object->input, object->maxlength, 0); int32_t hitstate = I_EnterText(object->input, object->maxlength, 0);
if (hitstate == -1 || M_RunMenuInput_MouseReturn()) if (hitstate == -1 || M_RunMenuInput_MouseReturn())
@ -5084,9 +5094,7 @@ static void M_RunMenuInput(Menu_t *cm)
{ {
m_mousecaught = 1; m_mousecaught = 1;
S_PlaySound(PISTOL_BODYHIT); M_MenuTextFormSubmit(object->input);
M_MenuPasswordSubmit(object->input);
object->input = NULL; object->input = NULL;
} }

View file

@ -319,7 +319,7 @@ typedef enum MenuType_t
Panel, Panel,
Verify, Verify,
Message, Message,
Password, TextForm,
FileSelect, FileSelect,
} MenuType_t; } MenuType_t;
@ -359,14 +359,20 @@ typedef struct MenuMessage_t
MenuID_t linkID; MenuID_t linkID;
MenuAnimationType_t animation; MenuAnimationType_t animation;
} MenuMessage_t; } MenuMessage_t;
typedef struct MenuPassword_t enum MenuTextFormFlags_t
{
MTF_Password = 1<<0,
};
typedef struct MenuTextForm_t
{ {
// state // state
char *input; char *input;
// traits // traits
const char *instructions;
int32_t maxlength; int32_t maxlength;
} MenuPassword_t; uint8_t flags;
} MenuTextForm_t;
typedef struct MenuFileSelect_t typedef struct MenuFileSelect_t
{ {
const char *title; const char *title;