// alternate "Read This!" menu Class SWWMHelpMenu : GenericMenu { int curpage, prevpage; int fadetic; TextureID bgtex; bool isrclick; int pagedir; enum EHelpPage { PAGE_STORY, PAGE_DEMO, PAGE_ARSENAL1, PAGE_ARSENAL2, PAGE_ARSENAL3, PAGE_TECH, PAGE_TIPS, PAGE_KBASE, NUM_HELP_PAGES }; override void Init( Menu parent ) { Super.Init(parent); curpage = 0; prevpage = -1; fadetic = gametic; pagedir = 0; bgtex = TexMan.CheckForTexture("graphics/tempbg.png",TexMan.Type_Any); } override bool MenuEvent( int mkey, bool fromcontroller ) { double alph = clamp((gametic-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 = gametic; } 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 = gametic; } 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 = smallfont.GetHeight(); String hdr = "", txt = ""; BrokenLines l; int maxlen = 0, lh; double y = 0; switch ( page ) { case PAGE_STORY: hdr = StringTable.Localize("$SWWM_HELP_STORY"); if ( gameinfo.gametype&GAME_Heretic ) txt = StringTable.Localize("$SWWM_HELP_STORYHERETIC"); else if ( gameinfo.gametype&GAME_Hexen ) txt = StringTable.Localize("$SWWM_HELP_STORYHEXEN"); else if ( SWWMUtility.IsEviternity() ) txt = StringTable.Localize("$SWWM_HELP_STORYEVITERNITY"); else txt = StringTable.Localize("$SWWM_HELP_STORYDOOM"); break; case PAGE_DEMO: hdr = StringTable.Localize("$SWWM_HELP_DEMO"); txt = StringTable.Localize("$SWWM_HELP_DEMOTXT"); break; case PAGE_ARSENAL1: hdr = StringTable.Localize("$SWWM_HELP_ARSE1"); txt = StringTable.Localize("$SWWM_HELP_ARSE1TXT"); break; case PAGE_ARSENAL2: hdr = StringTable.Localize("$SWWM_HELP_ARSE2"); txt = StringTable.Localize("$SWWM_HELP_ARSE2TXT"); break; case PAGE_ARSENAL3: hdr = StringTable.Localize("$SWWM_HELP_ARSE3"); txt = StringTable.Localize("$SWWM_HELP_ARSE3TXT"); break; case PAGE_KBASE: hdr = StringTable.Localize("$SWWM_HELP_KBASE"); txt = StringTable.Localize("$SWWM_HELP_KBASETXT"); break; case PAGE_TECH: hdr = StringTable.Localize("$SWWM_HELP_TECH"); txt = StringTable.Localize("$SWWM_HELP_TECHTXT"); break; case PAGE_TIPS: hdr = StringTable.Localize("$SWWM_HELP_TIPS"); txt = StringTable.Localize("$SWWM_HELP_TIPSTXT"); break; } if ( !txt || !hdr ) { txt = String.Format("(Unknown help page #%d)",page); Screen.DrawText(smallfont,Font.CR_GOLD,(Screen.GetWidth()-smallfont.StringWidth(txt))/2,(Screen.GetHeight()-smallfont.GetHeight())/2,txt,DTA_CleanNoMove_1,true,DTA_Alpha,alpha); return; } l = smallfont.BreakLines(txt,600); lh = l.Count()*h; Screen.DrawText(smallfont,Font.CR_FIRE,xofs+(Screen.GetWidth()-smallfont.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 maxlen ) maxlen = len; } for ( int i=0; i= 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 = smallfont.GetHeight(); double y = Screen.GetHeight()/2-(h*2)*CleanYFac_1; for ( int i=0; i<4; i++ ) { if ( curpage > 0 ) Screen.DrawText(smallfont,Font.CR_GOLD,12*CleanXFac_1,y,"<",DTA_CleanNoMove_1,true); if ( curpage < NUM_HELP_PAGES-1 ) Screen.DrawText(smallfont,Font.CR_GOLD,Screen.GetWidth()-18*CleanXFac_1,y,">",DTA_CleanNoMove_1,true); y += h*CleanYFac_1; } Super.Drawer(); } }