From 163fdce33b33617cdabbfb47d03f2214c075f650 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Sun, 26 Apr 2020 18:13:06 +0200 Subject: [PATCH] Intermission displays for Coop and DM are now added. Tweaks/fixes for dash slam and ground pound. Score numbers will pop up in the world for count items, secrets, and others. Fonts are now preloaded at launch, to reduce freezes. This obviously increases load times. Berserk punches now have additional splash damage. --- zmapinfo.txt | 2 +- zscript/swwm_common.zsc | 20 +++ zscript/swwm_inter.zsc | 273 +++++++++++++++++++++++++++++++------ zscript/swwm_inventory.zsc | 33 +++++ zscript/swwm_player.zsc | 13 +- 5 files changed, 295 insertions(+), 46 deletions(-) diff --git a/zmapinfo.txt b/zmapinfo.txt index 70cda13e6..bce72f7cc 100644 --- a/zmapinfo.txt +++ b/zmapinfo.txt @@ -1,6 +1,6 @@ GameInfo { - AddEventHandlers = "SWWMCrashHandler", "SWWMBrutalHandler", "SWWMVanillaBossHandler", "SWWMHandler" + AddEventHandlers = "SWWMFontPreloader", "SWWMCrashHandler", "SWWMBrutalHandler", "SWWMVanillaBossHandler", "SWWMHandler" PlayerClasses = "Demolitionist" StatusBarClass = "SWWMStatusBar" BackpackType = "HammerspaceEmbiggener" diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index 0327e23c0..9d2fbf67f 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -1520,6 +1520,23 @@ Class UglyBoyGetsFuckedUp : Thinker } } +// Hack +Class SWWMFontPreloader : StaticEventHandler +{ + override void OnRegister() + { + Font.GetFont('Miniwi'); + Font.GetFont('MiniwiShaded'); + Font.GetFont('MiniwiShadedInverse'); + Font.GetFont('MPlus'); + Font.GetFont('MPlusShaded'); + Font.GetFont('MPlusShadedInverse'); + Font.GetFont('Tewi'); + Font.GetFont('TewiShaded'); + Font.GetFont('TewiShadedInverse'); + } +} + // Handler responsible for item replacements and whatever else Class SWWMHandler : EventHandler { @@ -1903,6 +1920,7 @@ Class SWWMHandler : EventHandler score += 2475; } SWWMCredits.Give(players[i],score); + SWWMScoreObj.Spawn(score,players[i].mo.Vec3Offset(0,0,players[i].mo.Height/2)); lastitemcount[i] = players[i].itemcount; } } @@ -2141,6 +2159,7 @@ Class SWWMHandler : EventHandler allkills = true; SWWMCredits.Give(e.DamageSource.player,2000); Console.Printf(StringTable.Localize("$SWWM_LASTMONSTER"),e.DamageSource.player.GetUserName(),2000); + SWWMScoreObj.Spawn(2000,e.DamageSource.Vec3Offset(0,0,e.DamageSource.Height/2)); } spreecount[pnum]++; if ( s && spreecount[pnum] > s.skill ) @@ -2643,6 +2662,7 @@ Class SWWMHandler : EventHandler S_StartSound("misc/emone",CHAN_VOICE,CHANF_UI); } SWWMCredits.Give(players[e.Args[0]],999999999); + SWWMScoreObj.Spawn(999999999,players[e.Args[0]].mo.Vec3Offset(0,0,players[e.Args[0]].mo.Height/2)); } } diff --git a/zscript/swwm_inter.zsc b/zscript/swwm_inter.zsc index e19f7c444..04e114885 100644 --- a/zscript/swwm_inter.zsc +++ b/zscript/swwm_inter.zsc @@ -66,38 +66,41 @@ Class SWWMStatScreen : StatusScreen abstract int maxtip = StringTable.Localize("$SWWM_NINTERTIP").ToInt(); whichtip = Random[InterArt](1,maxtip); } - String tipstr = "\cd"..String.Format(StringTable.Localize("$SWWM_INTERTIP"),whichtip).."\c- "..StringTable.Localize(String.Format("$SWWM_INTERTIP%d",whichtip)); + String tipstr = "\cd"..String.Format(StringTable.Localize("$SWWM_INTERTIP"),whichtip).."\c-\n"..StringTable.Localize(String.Format("$SWWM_INTERTIP%d",whichtip)); BrokenLines l = fnt.BreakLines(tipstr,300); - int bw = int(308*hs), bh = int((fnt.GetHeight()*l.Count()+8)*hs); - double xx = 10, yy = (ss.y-10)-(fnt.GetHeight()*l.Count()); + int bw = int(308*hs), bh = int((fnt.GetHeight()*l.Count()+12)*hs); + double xx = 10, yy = (ss.y-10)-(fnt.GetHeight()*l.Count()+4); Screen.Dim("Black",.8,int((xx-4)*hs),int((yy-4)*hs),bw,bh); for ( int i=0; i0); - Screen.Dim("Black",.8,int((ss2.x-len-8)/2*hs2),int(4*hs2),int((len+8)*hs2),int((fnt.GetHeight()+(auth?2:4))*hs2)); - Screen.DrawText(fnt,Font.CR_GREEN,(ss2.x-len)/2.,6,lnametexts[0],DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); + Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(4*hs2),dimlen,int((fnt.GetHeight()+(auth?2:4))*hs2)); + Screen.DrawText(fnt,Font.CR_GREEN,(ss2.x-len[0])/2.,6,lnametexts[0],DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); double foy = fnt.GetHeight()+(auth?6:8); if ( auth ) { double oy = foy*(hs2/hs); - int len2 = fnt.StringWidth(authortexts[0]); - Screen.Dim("Black",.8,int((ss2.x-len-8)/2*hs2),int(oy*hs),int((len+8)*hs2),int((fnt.GetHeight()+2)*hs)); - Screen.DrawText(fnt,Font.CR_WHITE,(ss.x-len2)/2.,oy,authortexts[0],DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(oy*hs),dimlen,int((fnt.GetHeight()+2)*hs)); + Screen.DrawText(fnt,Font.CR_WHITE,(ss.x-len[1])/2.,oy,authortexts[0],DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); foy += (fnt.GetHeight()+2)*(hs/hs2); } foy += 8.; String str = StringTable.Localize("$WI_FINISHED"); - len = fnt.StringWidth(str); - Screen.Dim("Black",.8,int((ss2.x-len-8)/2*hs2),int(foy*hs2),int((len+8)*hs2),int((fnt.GetHeight()+4)*hs2)); - Screen.DrawText(fnt,Font.CR_FIRE,(ss2.x-len)/2.,foy+2,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); + len[0] = fnt.StringWidth(str); + Screen.Dim("Black",.8,int((ss2.x-len[0]-8)/2*hs2),int(foy*hs2),int((len[0]+8)*hs2),int((fnt.GetHeight()+4)*hs2)); + Screen.DrawText(fnt,Font.CR_FIRE,(ss2.x-len[0])/2.,foy+2,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); // return not used return 0; } @@ -105,20 +108,22 @@ Class SWWMStatScreen : StatusScreen abstract { Font fnt = LangFont(TewiFont); String str = StringTable.Localize("$WI_ENTERING"); - int len = fnt.StringWidth(str); - Screen.Dim("Black",.8,int((ss2.x-len-8)/2*hs2),int(4*hs2),int((len+8)*hs2),int((fnt.GetHeight()+4)*hs2)); - Screen.DrawText(fnt,Font.CR_FIRE,(ss2.x-len)/2.,6,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); + int len[2]; + len[0] = fnt.StringWidth(str); + Screen.Dim("Black",.8,int((ss2.x-len[0]-8)/2*hs2),int(4*hs2),int((len[0]+8)*hs2),int((fnt.GetHeight()+4)*hs2)); + Screen.DrawText(fnt,Font.CR_FIRE,(ss2.x-len[0])/2.,6,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); double foy = fnt.GetHeight()+16; - len = fnt.StringWidth(lnametexts[1]); + len[0] = fnt.StringWidth(lnametexts[1]); + len[1] = fnt.StringWidth(authortexts[1]); + int dimlen = max(int((len[0]+8)*hs2),int((len[1]+8)*hs)); bool auth = (authortexts[1].Length()>0); - Screen.Dim("Black",.8,int((ss2.x-len-8)/2*hs2),int(foy*hs2),int((len+8)*hs2),int((fnt.GetHeight()+(auth?2:4))*hs2)); - Screen.DrawText(fnt,Font.CR_GREEN,(ss2.x-len)/2.,foy+2,lnametexts[1],DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); + Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(foy*hs2),dimlen,int((fnt.GetHeight()+(auth?2:4))*hs2)); + Screen.DrawText(fnt,Font.CR_GREEN,(ss2.x-len[0])/2.,foy+2,lnametexts[1],DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); if ( auth ) { double oy = (foy+fnt.GetHeight()+2)*(hs2/hs); - int len2 = fnt.StringWidth(authortexts[1]); - Screen.Dim("Black",.8,int((ss2.x-len-8)/2*hs2),int(oy*hs),int((len+8)*hs2),int((fnt.GetHeight()+2)*hs)); - Screen.DrawText(fnt,Font.CR_WHITE,(ss.x-len2)/2.,oy,authortexts[1],DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(oy*hs),dimlen,int((fnt.GetHeight()+2)*hs)); + Screen.DrawText(fnt,Font.CR_WHITE,(ss.x-len[1])/2.,oy,authortexts[1],DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); } } override void drawShowNextLoc( void ) @@ -159,13 +164,13 @@ Class SWWMStatScreen : StatusScreen abstract int m = (secs/60)%60; int s = secs%60; if ( h ) return String.Format("%d\cu:\c-%02d\cu:\c-%02d",h,m,s); - else if ( m ) return String.Format("%d\cu:\c-%02d",m,s); - else return String.Format("%d",s); + if ( m ) return String.Format("%d\cu:\c-%02d",m,s); + return String.Format("%d",s); } - protected int GetPct( int a, int b ) + protected int GetPct( int a, int b, bool inv = false ) { if ( a < 0 ) return 0; - if ( b <= 0 ) return 100; + if ( b <= 0 ) return inv?0:100; // for "missed" percentage return (a*100)/b; } } @@ -321,13 +326,13 @@ Class SWWMStatScreen_SP : SWWMStatScreen // right strings if ( wi_percents ) { - str = String.Format("%d%",GetPct(Plrs[me].skills,wbs.maxkills)); + str = String.Format("%d%%",GetPct(Plrs[me].skills,wbs.maxkills)); len = fnt.StringWidth(str); maxlenr = len; - str = String.Format("%d%",GetPct(Plrs[me].sitems,wbs.maxitems)); + str = String.Format("%d%%",GetPct(Plrs[me].sitems,wbs.maxitems)); len = fnt.StringWidth(str); if ( len > maxlenr ) maxlenr = len; - str = String.Format("%d%",GetPct(Plrs[me].ssecret,wbs.maxsecret)); + str = String.Format("%d%%",GetPct(Plrs[me].ssecret,wbs.maxsecret)); len = fnt.StringWidth(str); if ( len > maxlenr ) maxlenr = len; } @@ -390,23 +395,23 @@ Class SWWMStatScreen_SP : SWWMStatScreen { if ( cnt_kills[0] >= 0 ) { - str = String.Format("%d\cu%\c-",GetPct(cnt_kills[0],wbs.maxkills)); + str = String.Format("%d\cu%%\c-",GetPct(cnt_kills[0],wbs.maxkills)); len = fnt.StringWidth(str); - Screen.DrawText(fnt,Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); + Screen.DrawText(fnt,(!wbs.maxkills||(cnt_kills[0]>=wbs.maxkills))?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); } yy += step; if ( cnt_items[0] >= 0 ) { - str = String.Format("%d\cu%\c-",GetPct(cnt_items[0],wbs.maxitems)); + str = String.Format("%d\cu%%\c-",GetPct(cnt_items[0],wbs.maxitems)); len = fnt.StringWidth(str); - Screen.DrawText(fnt,Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); + Screen.DrawText(fnt,(!wbs.maxitems||(cnt_items[0]>=wbs.maxitems))?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); } yy += step; if ( cnt_secret[0] >= 0 ) { - str = String.Format("%d\cu%\c-",GetPct(cnt_secret[0],wbs.maxsecret)); + str = String.Format("%d\cu%%\c-",GetPct(cnt_secret[0],wbs.maxsecret)); len = fnt.StringWidth(str); - Screen.DrawText(fnt,Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); + Screen.DrawText(fnt,(!wbs.maxsecret||(cnt_secret[0]>=wbs.maxsecret))?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); } yy += step; } @@ -414,23 +419,23 @@ Class SWWMStatScreen_SP : SWWMStatScreen { if ( cnt_kills[0] >= 0 ) { - str = String.Format("%d \cu/\c- %d",max(cnt_kills[0],0),wbs.maxkills); + str = String.Format("%d \cu/\c- \cj%d\c-",max(cnt_kills[0],0),wbs.maxkills); len = fnt.StringWidth(str); - Screen.DrawText(fnt,Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); + Screen.DrawText(fnt,(wbs.maxkills&&(cnt_kills[0]>=wbs.maxkills))?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); } yy += step; if ( cnt_items[0] >= 0 ) { - str = String.Format("%d \cu/\c- %d",max(cnt_items[0],0),wbs.maxitems); + str = String.Format("%d \cu/\c- \cj%d\c-",max(cnt_items[0],0),wbs.maxitems); len = fnt.StringWidth(str); - Screen.DrawText(fnt,Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); + Screen.DrawText(fnt,(wbs.maxitems&&(cnt_items[0]>=wbs.maxitems))?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); } yy += step; if ( cnt_secret[0] >= 0 ) { - str = String.Format("%d \cu/\c- %d",max(cnt_secret[0],0),wbs.maxsecret); + str = String.Format("%d \cu/\c- \cj%d\c-",max(cnt_secret[0],0),wbs.maxsecret); len = fnt.StringWidth(str); - Screen.DrawText(fnt,Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); + Screen.DrawText(fnt,(wbs.maxsecret&&(cnt_secret[0]>=wbs.maxsecret))?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); } yy += step; } @@ -438,7 +443,7 @@ Class SWWMStatScreen_SP : SWWMStatScreen { str = TimeStr(cnt_time); len = fnt.StringWidth(str); - Screen.DrawText(fnt,Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); + Screen.DrawText(fnt,(wbs.partime&&(cnt_time<=(wbs.partime/Thinker.TICRATE)))?Font.CR_GOLD:(cnt_time>3600)?Font.CR_RED:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true); } yy += step; if ( wi_showtotaltime ) @@ -595,7 +600,117 @@ Class SWWMStatScreen_Coop : SWWMStatScreen override void drawStats( void ) { drawLF(); - // TODO Coop Stat Drawing + Font fnt = LangFont(TewiFont); + int checkmark = 0x2714; // "✔", only available on Tewi + String namestr = StringTable.Localize("$SCORE_NAME"); + String itemsstr = StringTable.Localize((gameinfo.gametype&GAME_Raven)?"$SCORE_BONUS":"$SCORE_ITEMS"); + String secretstr = StringTable.Localize("$SCORE_SECRET"); + String killsstr = StringTable.Localize("$SCORE_KILLS"); + String missedstr = StringTable.Localize("$SCORE_MISSED"); + String totalstr = StringTable.Localize("$SCORE_TOTAL"); + int namelen = max(max(fnt.StringWidth(namestr),fnt.StringWidth("XXXXXXXXXX")),max(fnt.StringWidth(missedstr),fnt.StringWidth(totalstr))); + int nplayers = 0; + for ( int i=0; i= 4 ) + { + str = String.Format("%3d\cu%%\c-",GetPct(cnt_items[i],wbs.maxitems)); + Screen.DrawText(fnt,(!wbs.maxitems||(cnt_items[i]>=wbs.maxitems))?Font.CR_GOLD:Font.CR_WHITE,xx+itemslen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + misseditems -= cnt_items[i]; + } + xx += itemslen+spc; + if ( ng_state >= 6 ) + { + str = String.Format("%3d\cu%%\c-",GetPct(cnt_secret[i],wbs.maxsecret)); + Screen.DrawText(fnt,(!wbs.maxsecret||(cnt_secret[i]>=wbs.maxsecret))?Font.CR_GOLD:Font.CR_WHITE,xx+secretlen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + missedsecret -= cnt_secret[i]; } + xx += secretlen+spc; + str = String.Format("%3d\cu%%\c-",GetPct(cnt_kills[i],wbs.maxkills)); + Screen.DrawText(fnt,(!wbs.maxkills||(cnt_kills[i]>=wbs.maxkills))?Font.CR_GOLD:Font.CR_WHITE,xx+killslen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + missedkills -= cnt_kills[i]; + yy += lineh+lspc; + } + xx = (ss.x-boxwidth)/2.+pad+pad+rwidth; + yy += spc; + Screen.DrawText(fnt,Font.CR_GREEN,xx,yy,missedstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + xx += namelen+spc; + if ( ng_state >= 4 ) + { + str = String.Format("%3d\cu%%\c-",GetPct(misseditems,wbs.maxitems,true)); + Screen.DrawText(fnt,(wbs.maxitems&&(misseditems>0))?Font.CR_WHITE:Font.CR_GOLD,xx+itemslen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + } + xx += itemslen+spc; + if ( ng_state >= 6 ) + { + str = String.Format("%3d\cu%%\c-",GetPct(missedsecret,wbs.maxsecret,true)); + Screen.DrawText(fnt,(wbs.maxsecret&&(missedsecret>0))?Font.CR_WHITE:Font.CR_GOLD,xx+secretlen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + } + xx += secretlen+spc; + str = String.Format("%3d\cu%%\c-",GetPct(missedkills,wbs.maxkills,true)); + Screen.DrawText(fnt,(wbs.maxkills&&(missedkills>0))?Font.CR_WHITE:Font.CR_GOLD,xx+killslen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + yy += lineh+lspc; + xx = (ss.x-boxwidth)/2.+pad+pad+rwidth; + Screen.DrawText(fnt,Font.CR_GREEN,xx,yy,totalstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + xx += namelen+spc; + if ( ng_state >= 4 ) + { + str = String.Format("%d",wbs.maxitems); + Screen.DrawText(fnt,Font.CR_WHITE,xx+itemslen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + } + xx += itemslen+spc; + if ( ng_state >= 6 ) + { + str = String.Format("%d",wbs.maxsecret); + Screen.DrawText(fnt,Font.CR_WHITE,xx+secretlen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + } + xx += secretlen+spc; + str = String.Format("%d",wbs.maxkills); + Screen.DrawText(fnt,Font.CR_WHITE,xx+killslen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); } } @@ -706,6 +821,78 @@ Class SWWMStatScreen_DM : SWWMStatScreen override void drawStats( void ) { drawLF(); - // TODO DM Stat Drawing + Font fnt = LangFont(TewiFont); + int checkmark = 0x2714; // "✔", only available on Tewi + String namestr = StringTable.Localize("$SCORE_NAME"); + String deathsstr = StringTable.Localize("$SCORE_DEATHS"); + String fragsstr = StringTable.Localize("$SCORE_FRAGS"); + String totalstr = StringTable.Localize("$SCORE_TOTAL"); + int namelen = max(max(fnt.StringWidth(namestr),fnt.StringWidth("XXXXXXXXXX")),fnt.StringWidth(totalstr)); + int nplayers = 0; + for ( int i=0; i sorted; + GetSortedPlayers(sorted,teamplay); + for ( int j=0; j= 2 ) + { + str = String.Format("%d",cnt_deaths[i]); + Screen.DrawText(fnt,Font.CR_WHITE,xx+deathslen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + } + xx += deathslen+spc; + str = String.Format("%d",cnt_frags[i]); + Screen.DrawText(fnt,Font.CR_WHITE,xx+fragslen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + yy += lineh+lspc; + } + xx = (ss.x-boxwidth)/2.+pad+pad+rwidth; + yy += spc; + Screen.DrawText(fnt,Font.CR_GREEN,xx,yy,totalstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + xx += namelen+spc; + if ( ng_state >= 4 ) + { + str = String.Format("%d",total_deaths); + Screen.DrawText(fnt,Font.CR_WHITE,xx+deathslen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + } + xx += deathslen+spc; + str = String.Format("%d",total_frags); + Screen.DrawText(fnt,Font.CR_WHITE,xx+fragslen-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); } } diff --git a/zscript/swwm_inventory.zsc b/zscript/swwm_inventory.zsc index 71d22435d..9f8fff1ce 100644 --- a/zscript/swwm_inventory.zsc +++ b/zscript/swwm_inventory.zsc @@ -438,6 +438,29 @@ Class PunchImpact : Actor } } +Class BigPunchSplash : Actor +{ + Default + { + DamageType 'Melee'; + Radius 0.1; + Height 0; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +NOTELEPORT; + +NODAMAGETHRUST; + +FORCERADIUSDMG; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + SWWMHandler.DoBlast(self,50,40000,target); + A_Explode(5,80,0); + Destroy(); + } +} + Class BigPunchImpact : Actor { Default @@ -931,6 +954,11 @@ Class SWWMWeapon : Weapon abstract let p = Spawn(raging?"BigPunchImpact":"PunchImpact",d.HitLocation); p.angle = atan2(-d.HitDir.y,-d.HitDir.x); } + if ( raging ) + { + let ps = Spawn("BigPunchSplash",d.HitLocation); + ps.target = self; + } A_QuakeEx(quakin/2,quakin/2,quakin/2,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.06*quakin); if ( raging ) A_StartSound(bloodless?"pusher/althit":"pusher/altmeat",CHAN_WEAPON,CHANF_OVERLAP); else A_StartSound(bloodless?"demolitionist/punch":"demolitionist/punchf",CHAN_WEAPON,CHANF_OVERLAP); @@ -999,6 +1027,11 @@ Class SWWMWeapon : Weapon abstract let p = Spawn(raging?"BigPunchImpact":"PunchImpact",d.HitLocation+HitNormal*4); p.angle = atan2(HitNormal.y,HitNormal.x); p.pitch = asin(-HitNormal.z); + if ( raging ) + { + let ps = Spawn("BigPunchSplash",d.HitLocation+HitNormal*4); + ps.target = self; + } int quakin = raging?4:1; A_QuakeEx(quakin,quakin,quakin,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.12*quakin); A_StartSound(raging?"pusher/althit":"demolitionist/punch",CHAN_WEAPON,CHANF_OVERLAP); diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 1c56e8eb7..a603cb01d 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -576,6 +576,7 @@ Class Demolitionist : PlayerPawn if ( (abs(diff.x) > (radius+a.radius+spd*2)) || (abs(diff.y) > (radius+a.radius+spd*2)) ) continue; if ( (diff.z > (height+spd*2)) || (diff.z < -(a.height+spd*2)) ) continue; if ( diff.unit() dot dir.unit() < .35 ) continue; + if ( !CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; // large monsters will stop the player A_QuakeEx(4,4,4,10,0,128,"",QF_RELATIVE|QF_SCALEDOWN); A_StartSound("demolitionist/bump",CHAN_FOOTSTEP,CHANF_OVERLAP); @@ -598,6 +599,7 @@ Class Demolitionist : PlayerPawn } int flg = DMG_THRUSTLESS; if ( FindInventory("RagekitPower") ) flg |= DMG_FOILINVUL; + a.bBLASTED = true; a.DamageMobj(self,self,int(15+spd*2.5),'Dash',flg); } } @@ -1219,6 +1221,7 @@ Class Demolitionist : PlayerPawn else Console.Printf(StringTable.Localize("$SWWM_FINDSECRET"),player.GetUserName(),score); if ( CheckLocalView() ) SWWMHandler.AddOneliner("findsecret",2,40); SWWMCredits.Give(player,score); + SWWMScoreObj.Spawn(score,Vec3Offset(0,0,Height/2)); return true; } override void AddInventory( Inventory item ) @@ -1229,12 +1232,13 @@ Class Demolitionist : PlayerPawn SWWMLoreLibrary.Add(player,item.GetClassName()); if ( (item is 'Weapon') && !(item is 'SWWMGesture') && mystats && !mystats.GotWeapon(Weapon(item).GetClass()) && CheckLocalView() ) SWWMHandler.AddOneliner("getweapon",2); - if ( (item is 'Key') && !key_reentrant ) + if ( (item is 'Key') && !key_reentrant && !deathmatch ) { // score int score = 250; Console.Printf(StringTable.Localize("$SWWM_FINDKEY"),player.GetUserName(),item.GetTag(),score); SWWMCredits.Give(player,score); + SWWMScoreObj.Spawn(250,Vec3Offset(0,0,Height/2)); if ( !swwm_sharekeys ) return; // share all keys in mp for ( int i=0; i