diff --git a/credits.txt b/credits.txt index c89afc4bf..dc95dfe78 100644 --- a/credits.txt +++ b/credits.txt @@ -4,6 +4,10 @@ Most of the work here is original, but there are some notable exceptions: - Many sounds have been mixed and matched and filtered and whatnot from the following games: * Fallout New Vegas * Fallout 4 + * Unreal + * Unreal Tournament + * Unreal Tournament 2004 + * Deus Ex - This mod uses libeye, by KeksDose. Big thanks. - Title theme, "Traumatic State", by Teque (which a lot of people just know as "the AS-Golgotha music"). - Intermission theme, "Dragony", also by Teque (very comfy music considering the rest of his repertoire). diff --git a/graphics/HUD/ChatBoxBottom.png b/graphics/HUD/ChatBoxBottom.png index 0188c6e49..3cbf3db77 100644 Binary files a/graphics/HUD/ChatBoxBottom.png and b/graphics/HUD/ChatBoxBottom.png differ diff --git a/graphics/HUD/ChatBoxBottom_Smol.png b/graphics/HUD/ChatBoxBottom_Smol.png new file mode 100644 index 000000000..1db1250a1 Binary files /dev/null and b/graphics/HUD/ChatBoxBottom_Smol.png differ diff --git a/graphics/HUD/ChatBoxLine_Smol.png b/graphics/HUD/ChatBoxLine_Smol.png new file mode 100644 index 000000000..0c4857118 Binary files /dev/null and b/graphics/HUD/ChatBoxLine_Smol.png differ diff --git a/graphics/HUD/ChatBoxTop_Smol.png b/graphics/HUD/ChatBoxTop_Smol.png new file mode 100644 index 000000000..1c1e32453 Binary files /dev/null and b/graphics/HUD/ChatBoxTop_Smol.png differ diff --git a/language.txt b/language.txt index 9d39d2878..3304529d4 100644 --- a/language.txt +++ b/language.txt @@ -105,12 +105,27 @@ D_LAMP = "The Lamp ran out of oil."; D_RAGEKIT = "The Ragekit has ragequit."; D_REFRESHER = "The Refresher boost has ended."; D_WARARMOR = "The War Armor is no more."; -// messages +// score messages SWWM_FINDSECRET = "\cf%s\cf found a secret. +%d\c-"; SWWM_FINDKEY = "\cf%s\cf got the %s. +%d\c-"; SWWM_LASTSECRET = "\cf%s\cf found the last secret. +%d\c-"; SWWM_LASTITEM = "\cf%s\cf got the last item. +%d\c-"; SWWM_LASTMONSTER = "\cf%s\cf killed the last monster. +%d\c-"; +// intermission tips +SWWM_INTERTIP1 = "The Demolitionist is immune to drowning, poison and even fall damage (excluding instant kill pits, e.g. in Hexen)."; +SWWM_INTERTIP2 = "The Explodium Gun's altfire has an explosive yield proportional to the bullets left in the clip."; +SWWM_INTERTIP3 = "Your fuel regenerates over time, but the more you use dashing and boosting, the longer this will take."; +SWWM_INTERTIP4 = "The Pusher will slip off your hands on altfire if it doesn't land a hit, however as a ranged attack it may still be effective."; +SWWM_INTERTIP5 = "Spare copies of items will be stashed away in your inventory if they can't be immediately used, this even includes health and armor."; +SWWM_INTERTIP6 = "The Omnisight makes secret hunting a breeze by highlighting any usable objects in the map."; +SWWM_INTERTIP7 = "True to its name, the Wallbuster's tertiary fire can be used to completely obliterate doors and other obstacles."; +SWWM_INTERTIP8 = "The Eviscerator can easily clear entire rooms and corridors, but keep in mind that some of the shrapnel might bounce right back at you if you're not careful."; +SWWM_INTERTIP9 = "When on the move, the Silver Bullet's jet compensators will reduce most of the recoil from firing, but will also deal some damage if you're not wearing armor."; +SWWM_INTERTIP10 = "Just like other energy weapons of similar function, the Sparkster's primary and secondary fires can be combined with deadly results."; +SWWM_INTERTIP11 = "The Lämp has a chance to attract a rare type of moth that is much more aggressive than others in its attacks."; +SWWM_INTERTIP12 = "Most healing items will auto-activate if you're about to die, though sometimes they may not be enough to really save you... unless it's a Grilled Cheese Sandwich."; +SWWM_INTERTIP13 = "The Ynykron Artifact will instantly kill everything you aim it at, unless it's really unkillable, though usually that's only the case for gods. You're not planning on going after any gods, right?"; +SWWM_INTERTIP14 = "Do not be deceived by the Candy Gun, it may seem like a simple recolor, but it is A LOT stronger than your starting weapon."; /* SUBTITLES */ // new weapon received diff --git a/models/CandyGun_mask.png b/models/CandyGun_mask.png new file mode 100644 index 000000000..ac1cc20a3 Binary files /dev/null and b/models/CandyGun_mask.png differ diff --git a/music/GW2.XM b/music/GW2.XM new file mode 100644 index 000000000..ae1bc8a7b Binary files /dev/null and b/music/GW2.XM differ diff --git a/sndinfo.txt b/sndinfo.txt index b5142ca87..c1757ed32 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -1,8 +1,8 @@ $pitchshiftrange 0 -crash/glass glasscrk -crash/curb curb -brutal/ezmodo easymodo +crash/glass sounds/GLASSCRK.ogg +crash/curb sounds/CURB.ogg +brutal/ezmodo sounds/EASYMODO.ogg voice/default/death1 sounds/voice/default/death1.ogg voice/default/death2 sounds/voice/default/death2.ogg @@ -257,18 +257,53 @@ explodium/slideforward sounds/explodiumgun/expl_slideforward.ogg explodium/speen sounds/explodiumgun/expl_speen.ogg explodium/throwmag sounds/explodiumgun/expl_throwmag.ogg -$playersound demolitionist neutral *grunt DSEMPTY -$playeralias demolitionist neutral *pain100 demolitionist/lopain -$playeralias demolitionist neutral *pain75 demolitionist/pain -$playeralias demolitionist neutral *pain50 demolitionist/pain -$playeralias demolitionist neutral *pain25 demolitionist/hipain -$playersound demolitionist neutral *usefail DSEMPTY -$playeralias demolitionist neutral *death demolitionist/death -$playeralias demolitionist neutral *xdeath demolitionist/xdeath -$playeralias demolitionist neutral *gibbed demolitionist/xdeath -$playeralias demolitionist neutral *wimpydeath demolitionist/wdeath -$playersound demolitionist neutral *land DSEMPTY -$playersound demolitionist neutral *falling DSEMPTY -$playersound demolitionist neutral *puzzfail DSEMPTY +candygun/fire1 sounds/candygun/candy_fire1.ogg +candygun/fire2 sounds/candygun/candy_fire2.ogg +candygun/fire3 sounds/candygun/candy_fire3.ogg +$random candygun/fire { candygun/fire1 candygun/fire2 candygun/fire3 } +candygun/hit1 sounds/candygun/candy_hit1.ogg +candygun/hit2 sounds/candygun/candy_hit2.ogg +$random candygun/hit { candygun/hit1 candygun/hit2 } +candygun/maghit1 sounds/candygun/candy_maghit1.ogg +candygun/maghit2 sounds/candygun/candy_maghit2.ogg +$random candygun/maghit { candygun/maghit1 candygun/maghit2 } +candygun/gunhit1 sounds/candygun/candy_gunhit1.ogg +candygun/gunhit2 sounds/candygun/candy_gunhit2.ogg +$random candygun/gunhit { candygun/gunhit1 candygun/gunhit2 } -$alias misc/keytry DSEMPTY +$playersound demolitionist neutral *grunt DSEMPTY +$playeralias demolitionist neutral *pain100 demolitionist/lopain +$playeralias demolitionist neutral *pain75 demolitionist/pain +$playeralias demolitionist neutral *pain50 demolitionist/pain +$playeralias demolitionist neutral *pain25 demolitionist/hipain +$playersound demolitionist neutral *usefail sounds/menu/failuse.ogg +$playeralias demolitionist neutral *death demolitionist/death +$playeralias demolitionist neutral *xdeath demolitionist/xdeath +$playeralias demolitionist neutral *gibbed demolitionist/xdeath +$playeralias demolitionist neutral *wimpydeath demolitionist/wdeath +$playersound demolitionist neutral *land DSEMPTY +$playersound demolitionist neutral *falling DSEMPTY +$playersound demolitionist neutral *puzzfail sounds/menu/failuse.ogg + +misc/secret sounds/menu/findsecret.ogg +misc/keytry sounds/menu/failuse.ogg +misc/w_pkup sounds/general/wpickup.ogg +misc/p_pkup DSEMPTY +misc/i_pkup DSEMPTY +misc/k_pkup DSEMPTY +misc/ammo_pkup sounds/general/apickup.ogg +misc/armor_pkup DSEMPTY +misc/health_pkup DSEMPTY +misc/spawn sounds/CORK.ogg +misc/chat sounds/menu/chatsnd.ogg +misc/chat2 sounds/menu/chatsnd.ogg + +menu/activate sounds/hmenu/hmenu1.ogg +menu/backup sounds/hmenu/hmenu2.ogg +menu/prompt sounds/hmenu/hmenu1.ogg +menu/cursor sounds/hmenu/hmenu1.ogg +menu/change sounds/hmenu/hmenu1.ogg +menu/invalid sounds/hmenu/hmenu2.ogg +menu/dismiss sounds/hmenu/hmenu2.ogg +menu/choose sounds/hmenu/hmenu1.ogg +menu/clear sounds/hmenu/hmenu2.ogg diff --git a/sounds/CORK.ogg b/sounds/CORK.ogg new file mode 100644 index 000000000..bfcfdab00 Binary files /dev/null and b/sounds/CORK.ogg differ diff --git a/sounds/candygun/candy_fire1.ogg b/sounds/candygun/candy_fire1.ogg new file mode 100644 index 000000000..64c7df8ce Binary files /dev/null and b/sounds/candygun/candy_fire1.ogg differ diff --git a/sounds/candygun/candy_fire2.ogg b/sounds/candygun/candy_fire2.ogg new file mode 100644 index 000000000..6c742bf95 Binary files /dev/null and b/sounds/candygun/candy_fire2.ogg differ diff --git a/sounds/candygun/candy_fire3.ogg b/sounds/candygun/candy_fire3.ogg new file mode 100644 index 000000000..d3221f5b9 Binary files /dev/null and b/sounds/candygun/candy_fire3.ogg differ diff --git a/sounds/candygun/candy_gunhit1.ogg b/sounds/candygun/candy_gunhit1.ogg new file mode 100644 index 000000000..2139770a8 Binary files /dev/null and b/sounds/candygun/candy_gunhit1.ogg differ diff --git a/sounds/candygun/candy_gunhit2.ogg b/sounds/candygun/candy_gunhit2.ogg new file mode 100644 index 000000000..b4cd7cad1 Binary files /dev/null and b/sounds/candygun/candy_gunhit2.ogg differ diff --git a/sounds/candygun/candy_hit1.ogg b/sounds/candygun/candy_hit1.ogg new file mode 100644 index 000000000..33e9270f2 Binary files /dev/null and b/sounds/candygun/candy_hit1.ogg differ diff --git a/sounds/candygun/candy_hit2.ogg b/sounds/candygun/candy_hit2.ogg new file mode 100644 index 000000000..5eb2b3924 Binary files /dev/null and b/sounds/candygun/candy_hit2.ogg differ diff --git a/sounds/candygun/candy_maghit1.ogg b/sounds/candygun/candy_maghit1.ogg new file mode 100644 index 000000000..13c7ac153 Binary files /dev/null and b/sounds/candygun/candy_maghit1.ogg differ diff --git a/sounds/candygun/candy_maghit2.ogg b/sounds/candygun/candy_maghit2.ogg new file mode 100644 index 000000000..01e8113c8 Binary files /dev/null and b/sounds/candygun/candy_maghit2.ogg differ diff --git a/sounds/general/apickup.ogg b/sounds/general/apickup.ogg new file mode 100644 index 000000000..4bfb5d3ef Binary files /dev/null and b/sounds/general/apickup.ogg differ diff --git a/sounds/general/wpickup.ogg b/sounds/general/wpickup.ogg new file mode 100644 index 000000000..6f5a5feb4 Binary files /dev/null and b/sounds/general/wpickup.ogg differ diff --git a/sounds/hmenu/hmenu1.ogg b/sounds/hmenu/hmenu1.ogg new file mode 100644 index 000000000..b3a811039 Binary files /dev/null and b/sounds/hmenu/hmenu1.ogg differ diff --git a/sounds/hmenu/hmenu2.ogg b/sounds/hmenu/hmenu2.ogg new file mode 100644 index 000000000..fd96fffb5 Binary files /dev/null and b/sounds/hmenu/hmenu2.ogg differ diff --git a/sounds/menu/chatsnd.ogg b/sounds/menu/chatsnd.ogg new file mode 100644 index 000000000..2afb0d528 Binary files /dev/null and b/sounds/menu/chatsnd.ogg differ diff --git a/sounds/menu/failinv.ogg b/sounds/menu/failinv.ogg new file mode 100644 index 000000000..b51135baa Binary files /dev/null and b/sounds/menu/failinv.ogg differ diff --git a/sounds/menu/failuse.ogg b/sounds/menu/failuse.ogg new file mode 100644 index 000000000..712c360a7 Binary files /dev/null and b/sounds/menu/failuse.ogg differ diff --git a/sounds/menu/findsecret.ogg b/sounds/menu/findsecret.ogg new file mode 100644 index 000000000..c4ff49853 Binary files /dev/null and b/sounds/menu/findsecret.ogg differ diff --git a/sounds/menu/invsel.ogg b/sounds/menu/invsel.ogg new file mode 100644 index 000000000..d422a9931 Binary files /dev/null and b/sounds/menu/invsel.ogg differ diff --git a/sounds/menu/menuscroll.ogg b/sounds/menu/menuscroll.ogg new file mode 100644 index 000000000..3738df3b3 Binary files /dev/null and b/sounds/menu/menuscroll.ogg differ diff --git a/sounds/menu/menuset.ogg b/sounds/menu/menuset.ogg new file mode 100644 index 000000000..c90c8e3a3 Binary files /dev/null and b/sounds/menu/menuset.ogg differ diff --git a/sounds/menu/menutab.ogg b/sounds/menu/menutab.ogg new file mode 100644 index 000000000..06dbd850c Binary files /dev/null and b/sounds/menu/menutab.ogg differ diff --git a/sounds/menu/openkbase.ogg b/sounds/menu/openkbase.ogg new file mode 100644 index 000000000..6492924c5 Binary files /dev/null and b/sounds/menu/openkbase.ogg differ diff --git a/sprites/BLPFB0.png b/sprites/BLPFB0.png new file mode 100644 index 000000000..440de111d Binary files /dev/null and b/sprites/BLPFB0.png differ diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index 2f41107c8..72bce379b 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -84,12 +84,26 @@ Class SWWMOneLiner : HUDMessageBase Vector2 hs = StatusBar.GetHUDScale(); Vector2 ss = (Screen.GetWidth()/hs.x,Screen.GetHeight()/hs.y); String locs = "\""..StringTable.Localize(whichline).."\""; - int len = mTewiFont.mFont.StringWidth(locs); + // split so it can fit + BrokenLines l = mTewiFont.mFont.BreakLines(locs,int(ss.x*.5)); + int maxlen = 0; + for ( int i=0; i maxlen ) maxlen = len; + } int h = mTewiFont.mFont.GetHeight(); + int fh = h*l.Count(); double alph = clamp((curtime/20.)+1.,0.,1.); alph *= clamp((lifespan-curtime)/10.,0.,1.); - Screen.Dim("Black",alph*.8,int((Screen.GetWidth()-(len+12)*hs.x)/2.),int(bottom-(margin+2+h)*hs.y),int((len+12)*hs.x),int((h+4)*hs.y)); - Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,(ss.x-len)/2.,(bottom/hs.y)-(margin+h),locs,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph); + Screen.Dim("Black",alph*.8,int((Screen.GetWidth()-(maxlen+12)*hs.x)/2.),int(bottom-(margin+2+fh)*hs.y),int((maxlen+12)*hs.x),int((fh+4)*hs.y)); + int yy = margin+fh; + for ( int i=0; i PRINT_TEAMCHAT) ) return true; // we couldn't care less about these @@ -90,17 +84,21 @@ Class SWWMStatusBar : BaseStatusBar override void Tick() { + if ( !chatduration ) chatduration = CVar.GetCVar('swwm_chatduration',players[consoleplayer]); + if ( !msgduration ) msgduration = CVar.GetCVar('swwm_msgduration',players[consoleplayer]); + if ( !pickduration ) pickduration = CVar.GetCVar('swwm_pickduration',players[consoleplayer]); Super.Tick(); // prune old messages for ( int i=0; i PRINT_HIGH) && (gametic < (MainQueue[i].tic+chatduration.GetInt())) ) continue; MainQueue.Delete(i); i--; } @@ -127,7 +125,7 @@ Class SWWMStatusBar : BaseStatusBar override void Init() { Super.Init(); - SetSize(0,640,400); + SetSize(0,640,360); StatusTex = TexMan.CheckForTexture("graphics/HUD/StatusBox.png",TexMan.Type_Any); DashTex = TexMan.CheckForTexture("graphics/HUD/DashBar.png",TexMan.Type_Any); FuelTex = TexMan.CheckForTexture("graphics/HUD/FuelBar.png",TexMan.Type_Any); @@ -140,6 +138,9 @@ Class SWWMStatusBar : BaseStatusBar ChatTex[0] = TexMan.CheckForTexture("graphics/HUD/ChatBoxTop.png",TexMan.Type_Any); ChatTex[1] = TexMan.CheckForTexture("graphics/HUD/ChatBoxLine.png",TexMan.Type_Any); ChatTex[2] = TexMan.CheckForTexture("graphics/HUD/ChatBoxBottom.png",TexMan.Type_Any); + ChatTex[3] = TexMan.CheckForTexture("graphics/HUD/ChatBoxTop_Smol.png",TexMan.Type_Any); + ChatTex[4] = TexMan.CheckForTexture("graphics/HUD/ChatBoxLine_Smol.png",TexMan.Type_Any); + ChatTex[5] = TexMan.CheckForTexture("graphics/HUD/ChatBoxBottom_Smol.png",TexMan.Type_Any); mTewiFont = HUDFont.Create("TewiShaded"); HealthInter = DynamicValueInterpolator.Create(100,.1,1,100); ScoreInter = DynamicValueInterpolator.Create(0,.1,1,1000); @@ -242,6 +243,9 @@ Class SWWMStatusBar : BaseStatusBar private void DrawMessages() { + if ( !chatduration ) chatduration = CVar.GetCVar('swwm_chatduration',players[consoleplayer]); + if ( !msgduration ) msgduration = CVar.GetCVar('swwm_msgduration',players[consoleplayer]); + if ( !pickduration ) pickduration = CVar.GetCVar('swwm_pickduration',players[consoleplayer]); if ( !pickcol ) pickcol = CVar.GetCVar('msg0color',players[consoleplayer]); if ( !obitcol ) obitcol = CVar.GetCVar('msg1color',players[consoleplayer]); if ( !critcol ) critcol = CVar.GetCVar('msg2color',players[consoleplayer]); @@ -252,7 +256,8 @@ Class SWWMStatusBar : BaseStatusBar { int mstart = max(0,MainQueue.Size()-(1+maxchat[chatopen>=gametic].GetInt())); double xx = margin, yy = margin; - Screen.DrawTexture(ChatTex[0],false,xx,yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + bool smol = (ss.x<640); + Screen.DrawTexture(ChatTex[smol?3:0],false,xx,yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); yy++; for ( int i=mstart; i 1 ) cstr.AppendFormat(" (x%d)",MainQueue[i].rep); - BrokenLines l = mTewiFont.mFont.BreakLines(cstr,361); + int curtime = MainQueue[i].tic-gametic; + if ( MainQueue[i].type < PRINT_CHAT ) curtime += msgduration.GetInt(); + else curtime += chatduration.GetInt(); + double alph = clamp(curtime/20.,0.,1.); + BrokenLines l = mTewiFont.mFont.BreakLines(cstr,smol?211:361); for ( int j=0; j 0 ) { // reverse order since they're drawn bottom to top int mend = max(0,PickupQueue.Size()-(1+maxpick.GetInt())); - double yy = ss.y-(margin+40); + double yy = ss.y-(margin+50); for ( int i=PickupQueue.Size()-1; i>=mend; i-- ) { String cstr = PickupQueue[i].str; if ( PickupQueue[i].rep > 1 ) cstr.AppendFormat(" (x%d)",PickupQueue[i].rep); + int curtime = (PickupQueue[i].tic+pickduration.GetInt())-gametic; + double alph = clamp(curtime/20.,0.,1.); BrokenLines l = mTewiFont.mFont.BreakLines(cstr,int(ss.x*.75)); + int maxlen = 0; + for ( int j=0; j maxlen ) maxlen = len; + } + int h = mTewiFont.mFont.GetHeight(); + double xx = (ss.x-maxlen)/2.; + Screen.Dim("Black",.8*alph,int((xx-6)*hs.x),int((yy-h*(l.Count()-1))*hs.y),int((maxlen+12)*hs.x),int((h*l.Count()+4)*hs.y)); for ( int j=l.Count()-1; j>=0; j-- ) { int len = mTewiFont.mFont.StringWidth(l.StringAt(j)); - double xx = (ss.x-len)/2.; - Screen.Dim("Black",.8,int((xx-6)*hs.x),int(yy*hs.y),int((len+12)*hs.x),int(15*hs.y)); - Screen.DrawText(mTewiFont.mFont,pickcol.GetInt(),xx,yy+1,l.StringAt(j),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); - yy -= 15; + xx = (ss.x-len)/2.; + Screen.DrawText(mTewiFont.mFont,pickcol.GetInt(),xx,yy+2,l.StringAt(j),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph); + yy -= h; } + yy -= 6; } } } @@ -344,7 +364,7 @@ Class SWWMStatusBar : BaseStatusBar BeginHUD(); hs = GetHUDScale(); ss = (Screen.GetWidth()/hs.x,Screen.GetHeight()/hs.y); - margin = clamp(safezone.GetInt(),0,40); + margin = clamp(safezone.GetInt(),0,(ss.x<640)?10:40); FracTic = TicFrac; DrawTarget(); DrawScore(); diff --git a/zscript/swwm_menu.zsc b/zscript/swwm_menu.zsc index 3e01ee2ab..ce7e0f40c 100644 --- a/zscript/swwm_menu.zsc +++ b/zscript/swwm_menu.zsc @@ -7,8 +7,13 @@ Class SWWMKnowledgeBaseMenu : GenericMenu override void Init( Menu parent ) { Super.Init(parent); + if ( gamestate != GS_LEVEL ) + { + // can't open this menu outside of the game + Close(); + return; + } TewiFont = Font.GetFont('TewiShaded'); - MenuSound("menu/activate"); } override bool MenuEvent( int mkey, bool fromcontroller ) diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index cad78c3fe..00dae0032 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -255,12 +255,16 @@ Class Demolitionist : PlayerPawn } } if ( jumpfac > 0 ) jumpvelz *= jumpfac; - vel.z = max(0,vel.z)+jumpvelz; + double pvelz = vel.z; if ( !player.onground ) { // check for wall kicks if ( walljump ) + { + vel.z = max(-abs(vel.z)*.1,vel.z); + vel.z += jumpvelz; vel.xy = (cos(angle),sin(angle))*20*Speed; + } } bOnMobj = false; player.jumpTics = -1; @@ -270,12 +274,13 @@ Class Demolitionist : PlayerPawn { dashboost = 3.; boostcooldown = 20; + vel.z += jumpvelz+clamp(-pvelz,0.,30.); A_StartSound("demolitionist/jet",CHAN_JETPACK,CHANF_LOOP); } else { dashboost = 0.; - vel.z *= 1.25; + vel.z += jumpvelz*1.25; } SetStateLabel("Jump"); } @@ -467,7 +472,7 @@ Class Demolitionist : PlayerPawn else Console.Printf(StringTable.Localize("$SWWM_FINDSECRET"),player.GetUserName(),score); if ( CheckLocalView() && (mute.GetInt() < 2) ) SWWMHandler.AddOneliner("findsecret",40); SWWMCredits.GiveCredits(player,score); - return false; + return true; } override void AddInventory( Inventory item ) {