From cce76b52ec379c2cc15bba1ffe7a14b3e4d633dd Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Thu, 10 Feb 2022 21:23:31 +0100 Subject: [PATCH] Achievement Stats tab now fully functional. Optimize menu item list drawing by skipping off-screen items. --- graphics/Achievements/BarAchievementBase.png | Bin 0 -> 75 bytes graphics/Achievements/BarAchievementDone.png | Bin 0 -> 96 bytes .../Achievements/BarAchievementProgress.png | Bin 0 -> 73 bytes language.version | 4 +- zscript/kbase/swwm_kbase_list.zsc | 94 ++++++++++++- zscript/kbase/swwm_kbasetab_stats.zsc | 127 ++++++++++++++++-- zscript/menu/swwm_achievementmenu.zsc | 2 - 7 files changed, 213 insertions(+), 14 deletions(-) create mode 100644 graphics/Achievements/BarAchievementBase.png create mode 100644 graphics/Achievements/BarAchievementDone.png create mode 100644 graphics/Achievements/BarAchievementProgress.png diff --git a/graphics/Achievements/BarAchievementBase.png b/graphics/Achievements/BarAchievementBase.png new file mode 100644 index 0000000000000000000000000000000000000000..853422dc8f260081bfa39939788c055b1bb774e0 GIT binary patch literal 75 zcmeAS@N?(olHy`uVBq!ia0y~yU|?imVBq0kU|?Wqd(hF%z`!8n>Eal|5uN-Y{TFk~ d{(~w)EDZH7+?H0C7q@{_dAjEal|A)8zEal|A)EXn>DR$8 b!oo}p%}U(CT*b>9Kx#Z){an^LB{Ts536K!r literal 0 HcmV?d00001 diff --git a/language.version b/language.version index fa60fac5b..832d52a7a 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.2pre r141 \cu(Thu 10 Feb 13:38:58 CET 2022)\c-"; -SWWM_SHORTVER="\cw1.2pre r141 \cu(2022-02-10 13:38:58)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.2pre r142 \cu(Thu 10 Feb 21:23:31 CET 2022)\c-"; +SWWM_SHORTVER="\cw1.2pre r142 \cu(2022-02-10 21:23:31)\c-"; diff --git a/zscript/kbase/swwm_kbase_list.zsc b/zscript/kbase/swwm_kbase_list.zsc index b7c9f4ba6..125a86e82 100644 --- a/zscript/kbase/swwm_kbase_list.zsc +++ b/zscript/kbase/swwm_kbase_list.zsc @@ -5,6 +5,7 @@ Class DemolitionistMenuList ui { Array items; int selected; + DemolitionistMenu master; override void OnDestroy() { @@ -49,8 +50,19 @@ Class DemolitionistMenuList ui // draw all items with a specific offset and clip region void Drawer( Vector2 offset, int cliptop, int clipbottom, int clipleft, int clipright ) { + Vector2 pos, rpos, rsiz; for ( int i=0; i clipbottom ) continue; + if ( rpos.x+rsiz.x < clipleft ) continue; + if ( rpos.x > clipright ) continue; + items[i].Drawer(pos,(i==selected),cliptop,clipbottom,clipleft,clipright); + } // scrollbar drawing is handled by the tab, as the list itself is entirely unaware of its frame dimensions } } @@ -123,8 +135,16 @@ Class DemolitionistMenuKillItem : DemolitionistMenuListItem return self; } + override int GetWidth() + { + return width; + } + override void Drawer( Vector2 pos, bool selected, int cliptop, int clipbottom, int clipleft, int clipright ) { + // skip draw when out of bounds + if ( (master.origin.y+pos.y > clipbottom) || (master.origin.y+pos.y+smallfont.GetHeight() < cliptop) ) + return; Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+pos.x,master.origin.y+pos.y,label,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright); String str = String.Format("%d",s.kills); Screen.DrawText(smallfont,Font.CR_WHITE,master.origin.x+pos.x+width-smallfont.StringWidth(str),master.origin.y+pos.y,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright); @@ -147,6 +167,11 @@ Class DemolitionistMenuMapStatItem : DemolitionistMenuListItem return self; } + override int GetWidth() + { + return width; + } + override void Drawer( Vector2 pos, bool selected, int cliptop, int clipbottom, int clipleft, int clipright ) { String str = label; @@ -187,6 +212,9 @@ Class DemolitionistMenuMapStatItem : DemolitionistMenuListItem Class DemolitionistMenuAchievementItem : DemolitionistMenuListItem { SWWMAchievementInfo a; + TextureID AchievementUnknown, BaseBox, BarTex[3]; + bool ShouldObscure; + bool bHidden; int width; DemolitionistMenuAchievementItem Init( DemolitionistMenu master, SWWMAchievementInfo a, int width = 0 ) @@ -194,8 +222,72 @@ Class DemolitionistMenuAchievementItem : DemolitionistMenuListItem Super.Init(master,""); self.a = a; self.width = width; + AchievementUnknown = TexMan.CheckForTexture("graphics/Achievements/HiddenAchievement.png",TexMan.Type_Any); + BaseBox = TexMan.CheckForTexture("graphics/Achievements/NoAchievement.png",TexMan.Type_Any); + BarTex[0] = TexMan.CheckForTexture("graphics/Achievements/BarAchievementBase.png",TexMan.Type_Any); + BarTex[1] = TexMan.CheckForTexture("graphics/Achievements/BarAchievementProgress.png",TexMan.Type_Any); + BarTex[2] = TexMan.CheckForTexture("graphics/Achievements/BarAchievementDone.png",TexMan.Type_Any); + ShouldObscure = (swwm_filterachievements==1); + Update(); return self; } + + // cache state/progress to not call it every frame + void Update() + { + a.state = master.shnd.achievementstate.At(a.basename).ToInt(); + if ( !a.maxval ) return; + a.val = master.shnd.achievementprogress.At(a.basename).ToInt(); + if ( !a.bitfield ) return; + int val = 0; + for ( int i=0; i b.baseindex; + if ( !adone && !bdone ) + { + // progress sort? + if ( afactor != bfactor ) + return afactor < bfactor; + // sort by base index + return a.baseindex > b.baseindex; + } + // state sort + return bdone; + } + + private int partition_achievements( Array a, int l, int h ) + { + DemolitionistMenuListItem pv = a[h]; + int i = (l-1); + for ( int j=l; j<=(h-1); j++ ) + { + if ( CmpAchievement(DemolitionistMenuAchievementItem(pv).a,DemolitionistMenuAchievementItem(a[j]).a) ) + { + i++; + DemolitionistMenuListItem tmp = a[j]; + a[j] = a[i]; + a[i] = tmp; + } + } + DemolitionistMenuListItem tmp = a[h]; + a[h] = a[i+1]; + a[i+1] = tmp; + return i+1; + } + private void qsort_achievements( Array a, int l, int h ) + { + if ( l >= h ) return; + int p = partition_achievements(a,l,h); + qsort_achievements(a,l,p-1); + qsort_achievements(a,p+1,h); + } + override void Ticker() { if ( !stats ) return; @@ -314,6 +386,36 @@ Class DemolitionistStatsTab : DemolitionistMenuTab l.maxlen[j] = maxlen[j]; } break; + case 3: + // update achievement progress + for ( int i=0; i 0 ) w -= 8; + for ( int i=0; i 0 ) - { - xx = master.ws.x-8; - master.DrawVSeparator(xx,14,master.ws.y-28); - xx += 2; - yy = floor(smofs[section]*((master.ws.y-39)/maxofs[section]))+14; - Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,"▮",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true); - } + } + if ( maxofs[section] > 0 ) + { + xx = master.ws.x-8; + master.DrawVSeparator(xx,14,master.ws.y-28); + xx += 2; + yy = floor(smofs[section]*((master.ws.y-39)/maxofs[section]))+14; + Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,"▮",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true); } } } diff --git a/zscript/menu/swwm_achievementmenu.zsc b/zscript/menu/swwm_achievementmenu.zsc index 467ee464e..30be7a23b 100644 --- a/zscript/menu/swwm_achievementmenu.zsc +++ b/zscript/menu/swwm_achievementmenu.zsc @@ -30,9 +30,7 @@ Class SWWMAchievementMenu : GenericMenu // cache state/progress mItems[i].state = hnd.achievementstate.At(key).ToInt(); if ( mItems[i].maxval ) - { mItems[i].val = hnd.achievementprogress.At(key).ToInt(); - } // check if we need to hide it if ( (key == "everything") && !mItems[i].state ) {