swwmgz_m/zscript/menu/swwm_help.zsc

221 lines
6.5 KiB
Text

// alternate "Read This!" menu
Class SWWMHelpMenu : GenericMenu
{
int curpage, prevpage;
int fadetic;
TextureID bgtex;
bool isrclick;
int pagedir;
Font mSmallFont, mSmallFont2;
enum EHelpPage
{
PAGE_STORY,
PAGE_DEMO,
PAGE_ARSENAL1,
PAGE_ARSENAL2,
PAGE_ARSENAL3,
PAGE_TECH,
PAGE_TIPS,
PAGE_KBASE,
NUM_HELP_PAGES
};
String pagehdr[NUM_HELP_PAGES];
BrokenLines pagetxt[NUM_HELP_PAGES];
override void Init( Menu parent )
{
Super.Init(parent);
Animated = true;
curpage = 0;
prevpage = -1;
fadetic = MenuTime();
pagedir = 0;
bgtex = TexMan.CheckForTexture("graphics/tempbg.png");
mSmallFont = Font.GetFont('TewiFont');
mSmallFont2 = Font.GetFont('TewiFontOutline');
for ( int i=0; i<NUM_HELP_PAGES; i++ )
{
switch ( i )
{
case PAGE_STORY:
pagehdr[i] = StringTable.Localize("$SWWM_HELP_STORY");
if ( gameinfo.gametype&GAME_Heretic ) pagetxt[i] = mSmallFont.BreakLines(StringTable.Localize("$SWWM_HELP_STORYHERETIC"),600);
else if ( gameinfo.gametype&GAME_Hexen ) pagetxt[i] = mSmallFont.BreakLines(StringTable.Localize("$SWWM_HELP_STORYHEXEN"),600);
else if ( SWWMUtility.IsEviternity() ) pagetxt[i] = mSmallFont.BreakLines(StringTable.Localize("$SWWM_HELP_STORYEVITERNITY"),600);
else pagetxt[i] = mSmallFont.BreakLines(StringTable.Localize("$SWWM_HELP_STORYDOOM"),600);
break;
case PAGE_DEMO:
pagehdr[i] = StringTable.Localize("$SWWM_HELP_DEMO");
pagetxt[i] = mSmallFont.BreakLines(StringTable.Localize("$SWWM_HELP_DEMOTXT"),600);
break;
case PAGE_ARSENAL1:
pagehdr[i] = StringTable.Localize("$SWWM_HELP_ARSE1");
pagetxt[i] = mSmallFont.BreakLines(StringTable.Localize("$SWWM_HELP_ARSE1TXT"),600);
break;
case PAGE_ARSENAL2:
pagehdr[i] = StringTable.Localize("$SWWM_HELP_ARSE2");
pagetxt[i] = mSmallFont.BreakLines(StringTable.Localize("$SWWM_HELP_ARSE2TXT"),600);
break;
case PAGE_ARSENAL3:
pagehdr[i] = StringTable.Localize("$SWWM_HELP_ARSE3");
pagetxt[i] = mSmallFont.BreakLines(StringTable.Localize("$SWWM_HELP_ARSE3TXT"),600);
break;
case PAGE_KBASE:
pagehdr[i] = StringTable.Localize("$SWWM_HELP_KBASE");
pagetxt[i] = mSmallFont.BreakLines(StringTable.Localize("$SWWM_HELP_KBASETXT"),600);
break;
case PAGE_TECH:
pagehdr[i] = StringTable.Localize("$SWWM_HELP_TECH");
pagetxt[i] = mSmallFont.BreakLines(StringTable.Localize("$SWWM_HELP_TECHTXT"),600);
break;
case PAGE_TIPS:
pagehdr[i] = StringTable.Localize("$SWWM_HELP_TIPS");
pagetxt[i] = mSmallFont.BreakLines(StringTable.Localize("$SWWM_HELP_TIPSTXT"),600);
break;
}
}
}
override bool MenuEvent( int mkey, bool fromcontroller )
{
double alph = clamp((MenuTime()-fadetic)*(5./GameTicRate),0.,1.);
switch ( mkey )
{
case MKEY_Enter:
case MKEY_Right:
case MKEY_Down:
case MKEY_PageDown:
if ( (curpage < NUM_HELP_PAGES-1) && ((prevpage == -1) || (alph >= 1.)) )
{
MenuSound("menu/cursor");
prevpage = curpage;
curpage++;
pagedir = 1;
fadetic = MenuTime();
}
return true;
break;
case MKEY_Clear:
case MKEY_Left:
case MKEY_Up:
case MKEY_PageUp:
if ( (curpage > 0) && ((prevpage == -1) || (alph >= 1.)) )
{
MenuSound("menu/cursor");
prevpage = curpage;
curpage--;
pagedir = -1;
fadetic = MenuTime();
}
return true;
break;
}
return Super.MenuEvent(mkey,fromcontroller);
}
override bool MouseEvent( int type, int x, int y )
{
if ( (type == MOUSE_Click) && (y != -1) )
return MenuEvent(isrclick?MKEY_Clear:MKEY_Enter,true);
return false;
}
override bool OnUiEvent( UIEvent ev )
{
int y;
bool res;
switch ( ev.type )
{
case UIEvent.Type_WheelDown:
return MenuEvent(MKEY_Enter,true);
break;
case UIEvent.Type_WheelUp:
return MenuEvent(MKEY_Clear,true);
break;
case UIEvent.Type_LButtonDown:
isrclick = false;
return Super.OnUIEvent(ev);
break;
case UIEvent.Type_RButtonDown:
isrclick = true;
// copy over what base menus do for L click
y = ev.MouseY;
res = MouseEventBack(MOUSE_Click,ev.MouseX,y);
if ( res ) y = -1;
res |= MouseEvent(MOUSE_Click,ev.MouseX,y);
if ( res ) SetCapture(true);
return false;
break;
case UIEvent.Type_RButtonUp:
// copy over what base menus do for L release
if ( mMouseCapture )
{
SetCapture(false);
y = ev.MouseY;
res = MouseEventBack(MOUSE_Release,ev.MouseX,y);
if ( res ) y = -1;
res |= MouseEvent(MOUSE_Release,ev.MouseX,y);
}
return false;
break;
}
return Super.OnUIEvent(ev);
}
// big bulk of code
private void DrawPage( int page, double xofs = 0., double alpha = 1. )
{
int h = mSmallFont.GetHeight();
int maxlen = 0, lh;
double y = 0;
if ( (page < 0) || (page >= NUM_HELP_PAGES) )
return;
let hdr = pagehdr[page];
let l = pagetxt[page];
lh = l.Count()*h;
Screen.DrawText(mSmallFont2,Font.CR_FIRE,xofs+(Screen.GetWidth()-mSmallFont2.StringWidth(hdr)*CleanXFac_1)/2,(Screen.GetHeight()-(h*3+lh)*CleanYFac_1)/2,hdr,DTA_CleanNoMove_1,true,DTA_Alpha,alpha);
for ( int i=0; i<l.Count(); i++ )
{
int len = l.StringWidth(i);
if ( len > maxlen ) maxlen = len;
}
for ( int i=0; i<l.Count(); i++ )
{
Screen.DrawText(mSmallFont,Font.CR_WHITE,xofs+(Screen.GetWidth()-maxlen*CleanXFac_1)/2,(Screen.GetHeight()-lh*CleanYFac_1)/2+y,l.StringAt(i),DTA_CleanNoMove_1,true,DTA_Alpha,alpha);
y += h*CleanYFac_1;
}
}
override void Drawer()
{
if ( swwm_fuzz )
{
Vector2 tsize = TexMan.GetScaledSize(bgtex);
double zoom = max(ceil(Screen.GetWidth()/tsize.x),ceil(Screen.GetHeight()/tsize.y));
Vector2 vsize = (Screen.GetWidth(),Screen.GetHeight())/zoom;
Screen.DrawTexture(bgtex,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true,DTA_ColorOverlay,Color(192,0,0,0),DTA_Alpha,.8);
}
else Screen.Dim("Black",.8,0,0,Screen.GetWidth(),Screen.GetHeight());
double alph = clamp(((MenuTime()+System.GetTimeFrac())-fadetic)*(5./GameTicRate),0.,1.);
if ( (prevpage == -1) || (alph >= 1.) ) DrawPage(curpage);
else
{
DrawPage(prevpage,-(pagedir*alph*32)*CleanXFac_1,(1.-alph)**3);
DrawPage(curpage,(pagedir*(1.-alph)*32)*CleanXFac_1,alph**3);
}
int h = mSmallFont.GetHeight();
double y = Screen.GetHeight()/2-(h*2)*CleanYFac_1;
for ( int i=0; i<4; i++ )
{
if ( curpage > 0 )
Screen.DrawText(mSmallFont,Font.CR_GOLD,12*CleanXFac_1,y,"<",DTA_CleanNoMove_1,true);
if ( curpage < NUM_HELP_PAGES-1 )
Screen.DrawText(mSmallFont,Font.CR_GOLD,Screen.GetWidth()-18*CleanXFac_1,y,">",DTA_CleanNoMove_1,true);
y += h*CleanYFac_1;
}
Super.Drawer();
}
}