diff --git a/language.version b/language.version index 72c486f2d..6b32f9ac1 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r141 \cu(Fri 24 Jun 17:51:47 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r141 \cu(2022-06-24 17:51:47)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r142 \cu(Tue 28 Jun 17:20:01 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r142 \cu(2022-06-28 17:20:01)\c-"; diff --git a/zscript/hud/swwm_hud.zsc b/zscript/hud/swwm_hud.zsc index 6b3eaaa08..8cdb0c7bd 100644 --- a/zscript/hud/swwm_hud.zsc +++ b/zscript/hud/swwm_hud.zsc @@ -2719,7 +2719,7 @@ Class SWWMStatusBar : BaseStatusBar int maxlen = 0; for ( int i=0; i tabs; int curtab; int oldtab; // used for returning from help tab // fonts Font mSmallFont, mTinyFont; + // for open/close animation + double animtimer; int GenTUID() { @@ -129,10 +131,8 @@ Class DemolitionistMenu : GenericMenu return -1; } - private void DoClose( bool PlaySound = false ) + private void DoClose() { - isclosing = true; - if ( PlaySound ) MenuSound("menu/democlose"); EventHandler.SendNetworkEvent("swwmclearalltransactions",consoleplayer); for ( int i=0; i= 1. ) DontDim = DontBlur = true; + animtimer -= .1; + return; + } + if ( animtimer < 1. ) + { + animtimer += .1; + if ( animtimer < 1. ) return; // ensure tabs tick before first draw + else DontDim = DontBlur = false; + } if ( (tabs.Size() <= 0) || (curtab == -1) || !tabs[curtab] ) return; tabs[curtab].Ticker(); } override bool MouseEvent( int type, int mx, int my ) { + if ( isclosing || (animtimer < 1.) ) return false; bool res = Super.MouseEvent(type,mx,my); Vector2 mpos = (mx/hs,my/hs)-origin; if ( type == MOUSE_Click ) @@ -390,6 +406,7 @@ Class DemolitionistMenu : GenericMenu override bool OnUiEvent( UIEvent ev ) { + if ( isclosing || (animtimer < 1.) ) return false; if ( tabs[curtab].bDirectInput && ((ev.type == UIEvent.Type_KeyDown) || (ev.type == UIEvent.Type_KeyUp)) ) return tabs[curtab].DirectInput(ev); switch ( ev.type ) @@ -433,7 +450,8 @@ Class DemolitionistMenu : GenericMenu } if( (ikey[0] && (ev.keystring == mkey[0])) || (ikey[1] && (ev.keystring == mkey[1])) ) { - DoClose(true); + isclosing = true; + MenuSound("menu/democlose"); return true; } break; @@ -480,20 +498,20 @@ Class DemolitionistMenu : GenericMenu x += origin.x; y += origin.y; Screen.DrawTexture(FrameTex,false,x,y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,0.,DTA_SrcY,0.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,1); - Screen.DrawTexture(FrameTex,false,x+1,y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,1.,DTA_SrcY,0.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,int(w-2),DTA_DestHeight,1); - Screen.DrawTexture(FrameTex,false,x,y+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,0.,DTA_SrcY,1.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,int(h-2)); + if ( w > 2 ) Screen.DrawTexture(FrameTex,false,x+1,y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,1.,DTA_SrcY,0.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,int(w-2),DTA_DestHeight,1); + if ( h > 2 ) Screen.DrawTexture(FrameTex,false,x,y+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,0.,DTA_SrcY,1.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,int(h-2)); Screen.DrawTexture(FrameTex,false,(x+w)-1,y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,0.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,1); Screen.DrawTexture(FrameTex,false,x,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,0.,DTA_SrcY,2.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,1); if ( shadow ) { - Screen.DrawTexture(FrameTex,false,(x+w)-1,y+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,1.,DTA_SrcWidth,2.,DTA_SrcHeight,1.,DTA_DestWidth,2,DTA_DestHeight,int(h-2)); - Screen.DrawTexture(FrameTex,false,x+1,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,1.,DTA_SrcY,2.,DTA_SrcWidth,1.,DTA_SrcHeight,2.,DTA_DestWidth,int(w-2),DTA_DestHeight,2); + if ( h > 2 ) Screen.DrawTexture(FrameTex,false,(x+w)-1,y+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,1.,DTA_SrcWidth,2.,DTA_SrcHeight,1.,DTA_DestWidth,2,DTA_DestHeight,int(h-2)); + if ( w > 2 ) Screen.DrawTexture(FrameTex,false,x+1,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,1.,DTA_SrcY,2.,DTA_SrcWidth,1.,DTA_SrcHeight,2.,DTA_DestWidth,int(w-2),DTA_DestHeight,2); Screen.DrawTexture(FrameTex,false,(x+w)-1,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,2.,DTA_SrcWidth,2.,DTA_SrcHeight,2.,DTA_DestWidth,2,DTA_DestHeight,2); } else { - Screen.DrawTexture(FrameTex,false,(x+w)-1,y+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,1.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,int(h-2)); - Screen.DrawTexture(FrameTex,false,x+1,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,1.,DTA_SrcY,2.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,int(w-2),DTA_DestHeight,1); + if ( h > 2 ) Screen.DrawTexture(FrameTex,false,(x+w)-1,y+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,1.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,int(h-2)); + if ( w > 2 ) Screen.DrawTexture(FrameTex,false,x+1,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,1.,DTA_SrcY,2.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,int(w-2),DTA_DestHeight,1); Screen.DrawTexture(FrameTex,false,(x+w)-1,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,2.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,1); } } @@ -518,7 +536,44 @@ Class DemolitionistMenu : GenericMenu override void Drawer() { - if ( isclosing ) return; + if ( animtimer < 0 ) return; + // animated frame (more math) + if ( isclosing || (animtimer < 1.) ) + { + double intp, xfact, yfact; + if ( isclosing ) + { + intp = animtimer-.1*System.GetTimeFrac(); + xfact = clamp(intp*2.,0.,1.)**2.; + yfact = clamp(intp,0.,1.)**5.; + } + else + { + intp = animtimer+.1*System.GetTimeFrac(); + xfact = clamp(intp*2,0.,1.)**2.; + yfact = clamp(intp,0.,1.)**5.; + } + double rwsx = int(SWWMUtility.Lerp(2,ws.x,xfact)); + double rwsy = int(SWWMUtility.Lerp(2,ws.y,yfact)); + if ( (rwsx == 2) && (rwsy == 2) ) return; + double rox = int(ss.x-rwsx)/2; + double roy = int(ss.y-rwsy)/2; + // copy the menu dim below the window during animations, so the transition looks smoother + Screen.Dim((dimamount<0)?Color("Black"):dimcolor,(dimamount<0)?.5:dimamount,int(rox*hs),int(roy*hs),int(rwsx*hs),int(rwsy*hs)); + // draw the background and main frame + if ( swwm_fuzz ) + { + // fuzz was designed for 16:10, so we'll have to extend it at taller ratios + int count = int(ceil(ws.y/400.)); + Screen.SetClipRect(int(rox*hs),int(roy*hs),int(rwsx*hs),int(rwsy*hs)); + for ( int i=0; i