diff --git a/TODO.md b/TODO.md new file mode 100644 index 000000000..3d4cfa212 --- /dev/null +++ b/TODO.md @@ -0,0 +1,24 @@ +Fundamental things: + - Spreadgun Napalm and Gold Shell ammo types + - Eviscerator + - Hellblazer + - Sparkster + - Silver Bullet + - Ynykron + - Wallbuster + - Custom intermission + - Trading tab + +Extra things: + - Art for custom intermission + - Commission fanart or something idk + - Draw some 4Komas myself + - Titlemap stuff + - A background with a bit more flair than just the fuzz shader. + - Some sort of flyby featuring the Demolitionist booting up, closeups of + weapons/items etc. + - Vanilla monster entries in library + - Money cheat? + - Japanese localization + - Keen replacement (need ideas) + - Mod trailer video diff --git a/graphics/InterBG.png b/graphics/InterBG.png new file mode 100644 index 000000000..33d69cd69 Binary files /dev/null and b/graphics/InterBG.png differ diff --git a/graphics/InterMockup.xcf b/graphics/InterMockup.xcf new file mode 100644 index 000000000..1554970da Binary files /dev/null and b/graphics/InterMockup.xcf differ diff --git a/language.def b/language.def index ee483abce..dd132b096 100644 --- a/language.def +++ b/language.def @@ -2083,6 +2083,7 @@ SWWM_LASTITEM = "\cf%s\cf got the last item. +%d\c-"; SWWM_LASTMONSTER = "\cf%s\cf killed the last monster. +%d\c-"; SWWM_NEWLORE = "New entries have been added to the Library."; // intermission tips +SWWM_NINTERTIP = "22"; 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 mag."; SWWM_INTERTIP3 = "Your fuel regenerates over time, but the more you use the impulsor, the longer this will take."; @@ -2110,6 +2111,7 @@ SWWM_INTERTIP22 = "Although chance boxes may sound like a terrible idea, there i // voice name SWWM_VOICENAME_DEFAULT = "Demolitionist"; // new weapon received +SWWM_SUBS_DEFAULT_NGETWEAPON = "13"; SWWM_SUBS_DEFAULT_GETWEAPON1 = "Not bad... Not bad at all..."; SWWM_SUBS_DEFAULT_GETWEAPON2 = "Good find..."; SWWM_SUBS_DEFAULT_GETWEAPON3 = "Mine now..."; @@ -2124,11 +2126,13 @@ SWWM_SUBS_DEFAULT_GETWEAPON11 = "I like it..."; SWWM_SUBS_DEFAULT_GETWEAPON12 = "That looks nice..."; SWWM_SUBS_DEFAULT_GETWEAPON13 = "It's probably worth a fortune..."; // locked door +SWWM_SUBS_DEFAULT_NLOCKED = "4"; SWWM_SUBS_DEFAULT_LOCKED1 = "Don't have the key."; SWWM_SUBS_DEFAULT_LOCKED2 = "Only opens with a key."; SWWM_SUBS_DEFAULT_LOCKED3 = "Would need the key."; SWWM_SUBS_DEFAULT_LOCKED4 = "Locked tight."; // gacha failure in store +SWWM_SUBS_DEFAULT_NPUZZFAIL = "6"; SWWM_SUBS_DEFAULT_PUZZFAIL1 = "Damn."; SWWM_SUBS_DEFAULT_PUZZFAIL2 = "Damn it."; SWWM_SUBS_DEFAULT_PUZZFAIL3 = "No good."; @@ -2136,12 +2140,14 @@ SWWM_SUBS_DEFAULT_PUZZFAIL4 = "Nope."; SWWM_SUBS_DEFAULT_PUZZFAIL5 = "Uh uh."; SWWM_SUBS_DEFAULT_PUZZFAIL6 = "Hmmm."; // gacha success in store +SWWM_SUBS_DEFAULT_NPUZZSUCC = "5"; SWWM_SUBS_DEFAULT_PUZZSUCC1 = "Nice."; SWWM_SUBS_DEFAULT_PUZZSUCC2 = "That's it."; SWWM_SUBS_DEFAULT_PUZZSUCC3 = "Got it."; SWWM_SUBS_DEFAULT_PUZZSUCC4 = "Yes."; SWWM_SUBS_DEFAULT_PUZZSUCC5 = "Sweet."; // first enemy encounter (20 seconds cooldown since all enemies dead) +SWWM_SUBS_DEFAULT_NFIGHTSTART = "21"; SWWM_SUBS_DEFAULT_FIGHTSTART1 = "Here we go again."; SWWM_SUBS_DEFAULT_FIGHTSTART2 = "Let's get this show on the road."; SWWM_SUBS_DEFAULT_FIGHTSTART3 = "Time to die."; @@ -2164,6 +2170,7 @@ SWWM_SUBS_DEFAULT_FIGHTSTART19 = "Time to put on a show."; SWWM_SUBS_DEFAULT_FIGHTSTART20 = "I'm putting you down."; SWWM_SUBS_DEFAULT_FIGHTSTART21 = "Oh, good. Here I was afraid I'd have nothing to do."; // played at map start +SWWM_SUBS_DEFAULT_NMAPSTART = "14"; SWWM_SUBS_DEFAULT_MAPSTART1 = "Ugh... this place smells horrible."; SWWM_SUBS_DEFAULT_MAPSTART2 = "Okay, let's get to work."; SWWM_SUBS_DEFAULT_MAPSTART3 = "Let's hurry this up."; @@ -2179,6 +2186,7 @@ SWWM_SUBS_DEFAULT_MAPSTART12 = "I'll do my best."; SWWM_SUBS_DEFAULT_MAPSTART13 = "Just so we're clear: Anything good I find is mine."; SWWM_SUBS_DEFAULT_MAPSTART14 = "I bet the food here is terrible."; // every time a secret is found +SWWM_SUBS_DEFAULT_NFINDSECRET = "13"; SWWM_SUBS_DEFAULT_FINDSECRET1 = "Yeah, yeah, I'm the best."; SWWM_SUBS_DEFAULT_FINDSECRET2 = "It's true. I do know my shit."; SWWM_SUBS_DEFAULT_FINDSECRET3 = "What can I say? I'm good at what I do."; @@ -2193,6 +2201,7 @@ SWWM_SUBS_DEFAULT_FINDSECRET11 = "I did good work, didn't I?"; SWWM_SUBS_DEFAULT_FINDSECRET12 = "Wow, that's pretty lucky!"; SWWM_SUBS_DEFAULT_FINDSECRET13 = "Yeah, well, I am pretty awesome."; // frag taunts +SWWM_SUBS_DEFAULT_NSCOREKILL = "27"; SWWM_SUBS_DEFAULT_SCOREKILL1 = "Good riddance."; SWWM_SUBS_DEFAULT_SCOREKILL2 = "One down."; SWWM_SUBS_DEFAULT_SCOREKILL3 = "Goodbye."; @@ -2221,6 +2230,7 @@ SWWM_SUBS_DEFAULT_SCOREKILL25 = "Want some more?"; SWWM_SUBS_DEFAULT_SCOREKILL26 = "Done and done."; SWWM_SUBS_DEFAULT_SCOREKILL27 = "It's done."; // getting hurt by monsters +SWWM_SUBS_DEFAULT_NGETHIT = "18"; SWWM_SUBS_DEFAULT_GETHIT1 = "Whatever..."; SWWM_SUBS_DEFAULT_GETHIT2 = "*sigh*"; SWWM_SUBS_DEFAULT_GETHIT3 = "Hm hmm."; @@ -2240,6 +2250,7 @@ SWWM_SUBS_DEFAULT_GETHIT16 = "Time to shut you up for good."; SWWM_SUBS_DEFAULT_GETHIT17 = "You're not leaving here in one piece."; SWWM_SUBS_DEFAULT_GETHIT18 = "You're obviously upset..."; // getting hurt by friendlies +SWWM_SUBS_DEFAULT_NFRIENDHIT = "7"; SWWM_SUBS_DEFAULT_FRIENDHIT1 = "Are you ticked off at me?"; SWWM_SUBS_DEFAULT_FRIENDHIT2 = "Are you serious?"; SWWM_SUBS_DEFAULT_FRIENDHIT3 = "What? Why?"; @@ -2248,10 +2259,12 @@ SWWM_SUBS_DEFAULT_FRIENDHIT5 = "Sorry, what?"; SWWM_SUBS_DEFAULT_FRIENDHIT6 = "Not very friendly, are you?"; SWWM_SUBS_DEFAULT_FRIENDHIT7 = "Whoa, whoa. Easy there."; // hurting a friendly +SWWM_SUBS_DEFAULT_NHITFRIEND = "3"; SWWM_SUBS_DEFAULT_HITFRIEND1 = "I... sorry."; SWWM_SUBS_DEFAULT_HITFRIEND2 = "I'm sorry."; SWWM_SUBS_DEFAULT_HITFRIEND3 = "Sorry."; // greeting another player +SWWM_SUBS_DEFAULT_NGREET = "7"; SWWM_SUBS_DEFAULT_GREET1 = "Hi."; SWWM_SUBS_DEFAULT_GREET2 = "Hey there."; SWWM_SUBS_DEFAULT_GREET3 = "Hey."; @@ -2260,6 +2273,7 @@ SWWM_SUBS_DEFAULT_GREET5 = "Hey."; SWWM_SUBS_DEFAULT_GREET6 = "Well hello."; SWWM_SUBS_DEFAULT_GREET7 = "Hi there."; // ragekit +SWWM_SUBS_DEFAULT_NRAGEKIT = "6"; SWWM_SUBS_DEFAULT_RAGEKIT1 = "AAAAAAAAAAAAAAAAAAAAAA!!!!!"; SWWM_SUBS_DEFAULT_RAGEKIT2 = "FFFFFFUUUUUUUUUUUCKKKK!!!"; SWWM_SUBS_DEFAULT_RAGEKIT3 = "FUCKFUCKFUCCKKKK!!"; @@ -2268,6 +2282,7 @@ SWWM_SUBS_DEFAULT_RAGEKIT5 = "KILLLLL!!!!"; SWWM_SUBS_DEFAULT_RAGEKIT6 = "RAAAARGH!!! BRING IT!!!"; // --- comebacks for korax hub lines --- // "Greetings mortal, are you ready to die?" +SWWM_SUBS_DEFAULT_NKORAXGREET = "13"; SWWM_SUBS_DEFAULT_KORAXGREET1 = "Oh boy. That's it. I'm outta here"; SWWM_SUBS_DEFAULT_KORAXGREET2 = "Great... That's just great."; SWWM_SUBS_DEFAULT_KORAXGREET3 = "I don't want whatever you're selling."; @@ -2282,6 +2297,7 @@ SWWM_SUBS_DEFAULT_KORAXGREET11 = "I was about to ask you the same thing."; SWWM_SUBS_DEFAULT_KORAXGREET12 = "I'm just looking for the mayonnaise. Maybe you could grab it for me. Second shelf, right next to the pudding."; SWWM_SUBS_DEFAULT_KORAXGREET13 = "I'm here to pick up an order. Two large pepperoni and a calzone. Name is 'Fuck you'."; // "My servants can smell your blood, human" +SWWM_SUBS_DEFAULT_NKORAXBLOOD = "13"; SWWM_SUBS_DEFAULT_KORAXBLOOD1 = "Creep."; SWWM_SUBS_DEFAULT_KORAXBLOOD2 = "That's good to know."; SWWM_SUBS_DEFAULT_KORAXBLOOD3 = "Whatever you say."; @@ -2296,6 +2312,7 @@ SWWM_SUBS_DEFAULT_KORAXBLOOD11 = "I think you're confusing me with someone who g SWWM_SUBS_DEFAULT_KORAXBLOOD12 = "I'm not so sure about that."; SWWM_SUBS_DEFAULT_KORAXBLOOD13 = "Just shut up."; // "You have played this game too long, mortal, I think I shall remove you from the board" +SWWM_SUBS_DEFAULT_NKORAXGAME = "14"; SWWM_SUBS_DEFAULT_KORAXGAME1 = "I really don't care."; SWWM_SUBS_DEFAULT_KORAXGAME2 = "Go fuck yourself."; SWWM_SUBS_DEFAULT_KORAXGAME3 = "Oh, go cough up a hairball."; @@ -2311,6 +2328,7 @@ SWWM_SUBS_DEFAULT_KORAXGAME12 = "I'd like to see you try."; SWWM_SUBS_DEFAULT_KORAXGAME13 = "Oh, please try."; SWWM_SUBS_DEFAULT_KORAXGAME14 = "I don't know what you're talking about, and I don't care."; // "Worship me and I may be yet merciful, then again, maybe not" +SWWM_SUBS_DEFAULT_NKORAXWORSHIP = "11"; SWWM_SUBS_DEFAULT_KORAXWORSHIP1 = "What?"; SWWM_SUBS_DEFAULT_KORAXWORSHIP2 = "What a scumbag..."; SWWM_SUBS_DEFAULT_KORAXWORSHIP3 = "Pompous ass..."; @@ -2323,6 +2341,7 @@ SWWM_SUBS_DEFAULT_KORAXWORSHIP9 = "You must think I'm an idiot."; SWWM_SUBS_DEFAULT_KORAXWORSHIP10 = "Do I look like an idiot?"; SWWM_SUBS_DEFAULT_KORAXWORSHIP11 = "You have an awfully high opinion of yourself."; // "Are you strong enough to face your own masters?" +SWWM_SUBS_DEFAULT_NKORAXMASTERS = "9"; SWWM_SUBS_DEFAULT_KORAXMASTERS1 = "Can we move this along? I've got places to be."; SWWM_SUBS_DEFAULT_KORAXMASTERS2 = "I don't appreciate people telling me what to do."; SWWM_SUBS_DEFAULT_KORAXMASTERS3 = "Uh... yes, that's right."; diff --git a/models/DemolitionistInter.blend b/models/DemolitionistInter.blend new file mode 100644 index 000000000..39e856cc2 Binary files /dev/null and b/models/DemolitionistInter.blend differ diff --git a/swwmvoicepack.txt b/swwmvoicepack.txt index 4e614588c..f227d194b 100644 --- a/swwmvoicepack.txt +++ b/swwmvoicepack.txt @@ -1,13 +1,15 @@ # (lines starting with this character are comments) -# if you want to make custom voice packs for SWWM GZ, you need to provide this -# file in the root of the zip/pk3/whatever, wads are not supported +# if you want to make custom voice packs for SWWM GZ, you need to provide a +# file like this in the root of the zip/pk3/whatever, wads are not supported # list the names of your voice types here and don't forget to define your voice # lines using a similar format to the base game's: # voice//<#> for the sndinfo entries -# SWWM_SUBS__<#> for the language strings -# with the exception of pain/death/grunt sounds, all lines you may want to -# register require a subtitle language string so they can be properly detected, -# but you can set them to an empty string if you don't want text to display. -# also don't forget to add a SWWM_VOICENAME_* language string for each voice -# type so they have a "human-readable" name in the options menu +# SWWM_SUBS__<#>, plus a SWWM_SUBS__N counter, +# for the language strings +# with the exception of pain/death/grunt sounds (which should additionally have +# a $random entry in sndinfo), all lines you may want to register require a +# subtitle language string so they can be properly detected, but you can set +# them to an empty string if you don't want text to display. also don't forget +# to add a SWWM_VOICENAME_* language string for each voice type so they have a +# "human-readable" name in the options menu default diff --git a/zmapinfo.txt b/zmapinfo.txt index 6afff226f..1d8a26610 100644 --- a/zmapinfo.txt +++ b/zmapinfo.txt @@ -1,10 +1,12 @@ GameInfo { AddEventHandlers = "SWWMCrashHandler", "SWWMBrutalHandler", "SWWMHandler" - IntermissionMusic = "music/DRAGONY.XM" PlayerClasses = "Demolitionist" StatusBarClass = "SWWMStatusBar" BackpackType = "HammerspaceEmbiggener" + StatScreen_Single = "SWWMStatScreen_SP" + StatScreen_Coop = "SWWMStatScreen_Coop" + StatScreen_DM = "SWWMStatScreen_DM" } Map TITLEMAP "SWWM GZ - Title Map" diff --git a/zscript.txt b/zscript.txt index d58d9046a..82252eb7b 100644 --- a/zscript.txt +++ b/zscript.txt @@ -21,6 +21,7 @@ version "4.3" #include "zscript/swwm_hud.zsc" #include "zscript/swwm_menu.zsc" #include "zscript/swwm_title.zsc" +#include "zscript/swwm_inter.zsc" // items #include "zscript/swwm_health.zsc" #include "zscript/swwm_armor.zsc" diff --git a/zscript/swwm_armor.zsc b/zscript/swwm_armor.zsc index efd8c195f..d9b917b62 100644 --- a/zscript/swwm_armor.zsc +++ b/zscript/swwm_armor.zsc @@ -13,7 +13,7 @@ Class ArmorNugget : SWWMArmor override int HandleDamage( int damage, Name damageType, int flags ) { - double factor = amount*.1; + double factor = amount*.01; return int(ceil(damage*factor)); } } @@ -143,4 +143,4 @@ Class WarArmorItem : SWWMSpareArmor XZW1 A -1; Stop; } -} \ No newline at end of file +} diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index 686d4e9a0..c818c109d 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -1353,30 +1353,20 @@ Class SWWMHandler : EventHandler // suppress non-rage comments when ragekit is active, only screaming allowed if ( players[consoleplayer].mo.FindInventory("RagekitPower") && (type != "ragekit") ) return 0; int whichline; - int countem = 0, i = 1; - String testme, locme; - do - { - testme = String.Format("SWWM_SUBS_%s_%s%d",voicetype.MakeUpper(),type.MakeUpper(),i); - locme = StringTable.Localize(testme,false); - if ( testme != locme ) countem++; - i++; - } - while ( (testme != locme) && (i < 100) ); // gotta prevent infinite loops + String testme = String.Format("SWWM_SUBS_%s_N%s",voicetype.MakeUpper(),type.MakeUpper()); + String locme = StringTable.Localize(testme,false); + int countem; + if ( testme == locme ) countem = 0; + else countem = locme.ToInt(); if ( countem == 0 ) { if ( voicetype ~== "default" ) return 0; // retry with the default voicetype voicetype = "default"; - i = 1; - do - { - testme = String.Format("SWWM_SUBS_DEFAULT_%s%d",type.MakeUpper(),i); - locme = StringTable.Localize(testme,false); - if ( testme != locme ) countem++; - i++; - } - while ( (testme != locme) && (i < 100) ); // gotta prevent infinite loops + testme = String.Format("SWWM_SUBS_DEFAULT_N%s",type.MakeUpper()); + locme = StringTable.Localize(testme,false); + if ( testme == locme ) countem = 0; + else countem = locme.ToInt(); if ( countem == 0 ) return 0; } // check last line so we don't repeat @@ -1388,7 +1378,8 @@ Class SWWMHandler : EventHandler ent = i; break; } - if ( last > 0 ) + if ( countem == 1 ) whichline = 1; + else if ( last > 0 ) { whichline = Random[DemoLines](1,countem-1); if ( whichline >= last ) whichline++; diff --git a/zscript/swwm_inter.zsc b/zscript/swwm_inter.zsc new file mode 100644 index 000000000..7ec06942c --- /dev/null +++ b/zscript/swwm_inter.zsc @@ -0,0 +1,62 @@ +Mixin Class SWWMStatScreen +{ + TextureID bgtex; + + override void StartMusic() + { + S_ChangeMusic("music/DRAGONY.XM"); + } + private void drawSWWMBg() + { + if ( !bgtex ) bgtex = TexMan.CheckForTexture("graphics/InterBG.png",TexMan.Type_MiscPatch); + double ar = Screen.GetAspectRatio(); + Vector2 tsize = TexMan.GetScaledSize(bgtex); + double sar = tsize.x/tsize.y; + Vector2 vsize; + if ( sar > ar ) vsize = (tsize.y*ar,tsize.y); + else if ( sar < ar ) vsize = (tsize.x,tsize.x/ar); + else vsize = tsize; + Screen.DrawTexture(bgtex,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true); + // TODO background pics (fanart, 4komas, etc.) + // TODO intermission tips at the bottom + } + override void drawShowNextLoc( void ) + { + drawSWWMBg(); + drawEL(); + } + override void Drawer( void ) + { + switch ( CurState ) + { + case StatCount: + drawSWWMBg(); + drawStats(); + break; + case ShowNextLoc: + drawShowNextLoc(); + break; + case LeavingIntermission: + break; + default: + drawNoState(); + break; + } + } +} + +// placeholders, will do the actual custom stuff soon +Class SWWMStatScreen_SP : DoomStatusScreen +{ + Mixin SWWMStatScreen; +} + +Class SWWMStatScreen_Coop : CoopStatusScreen +{ + Mixin SWWMStatScreen; +} + +Class SWWMStatScreen_DM : DeathmatchStatusScreen +{ + Mixin SWWMStatScreen; +} diff --git a/zscript/swwm_inventory.zsc b/zscript/swwm_inventory.zsc index e8e695ccb..ae276365a 100644 --- a/zscript/swwm_inventory.zsc +++ b/zscript/swwm_inventory.zsc @@ -63,9 +63,11 @@ Class SWWMArmor : Armor abstract SWWMHandler.DoFlash(Owner,Color(int(clamp(damage*.15,1,16)),255,224,192),3); Owner.A_StartSound("armor/hit",CHAN_BODY,CHANF_DEFAULT,clamp(damage*.03,0.,1.),2.5); saved = HandleDamage(damage,damageType,flags); + int healed = max(0,saved-damage); + saved = min(saved,damage); if ( amount <= saved ) saved = amount; newdamage -= saved; - if ( newdamage < 0 ) Owner.GiveBody(abs(newdamage)); + if ( healed > 0 ) Owner.GiveBody(healed); amount -= saved; damage = newdamage; if ( amount <= 0 ) @@ -667,4 +669,4 @@ Class SWWMWeapon : Weapon abstract +FLOATBOB; FloatBobStrength 0.25; } -} \ No newline at end of file +} diff --git a/zscript/swwm_jackhammer.zsc b/zscript/swwm_jackhammer.zsc index 427e8a0b8..368d5edb0 100644 --- a/zscript/swwm_jackhammer.zsc +++ b/zscript/swwm_jackhammer.zsc @@ -330,7 +330,7 @@ Class PusherWeapon : SWWMWeapon { A_QuakeEx(3,3,3,7,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.8); A_AlertMonsters(1200); - int dmg = int(3+invoker.chargelevel*2); + int dmg = int(10+invoker.chargelevel*5); if ( d.HitType == TRACE_HitActor ) { double diff = deltaangle(self.angle,AngleTo(d.HitActor)); @@ -351,7 +351,7 @@ Class PusherWeapon : SWWMWeapon d.HitActor.A_StartSound("pusher/meat",CHAN_ITEMEXTRA,CHANF_OVERLAP); } // move towards target - vel.xy += Vec2To(d.HitActor).unit(); + bJUSTATTACKED = true; } else { @@ -413,7 +413,7 @@ Class PusherWeapon : SWWMWeapon { A_QuakeEx(8,8,8,12,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.8); A_AlertMonsters(1600); - int dmg = int(80*invoker.chargelevel); + int dmg = int(150*invoker.chargelevel); if ( d.HitType == TRACE_HitActor ) { double diff = deltaangle(self.angle,AngleTo(d.HitActor)); diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 9fa59843e..0331cd1fc 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -528,6 +528,17 @@ Class Demolitionist : PlayerPawn return; // handled in moveplayer Super.CheckPitch(); } + override void CheckCrouch( bool totallyfrozen ) + { + // crouch to swim/float down + if ( !totallyfrozen && (player.cmd.buttons&BT_CROUCH) ) + { + double mult = (player.cmd.buttons&BT_SPEED)?2.:1.; + if ( waterlevel >= 2 ) vel.z = -4*Speed*mult; + else if ( bNOGRAVITY ) vel.z = -3*mult; + } + Super.CheckCrouch(totallyfrozen); + } override void CheckMoveUpDown() { if ( InStateSequence(CurState,FindState("Dash")) ) @@ -597,11 +608,14 @@ Class Demolitionist : PlayerPawn player.centering = false; } double fs = TweakSpeeds(1.,0.); - fs *= max(abs(player.cmd.forwardmove/12800.),abs(player.cmd.sidemove/10240.)); + double jcmove = 0.; + if ( player.cmd.buttons&BT_JUMP ) jcmove += 4096.; + if ( player.cmd.buttons&BT_CROUCH ) jcmove -= 4096.; + if ( player.cmd.buttons&BT_SPEED ) jcmove *= 2.; if ( CanCrouch() && (player.crouchfactor != -1) ) fs *= player.crouchfactor; Vector3 x, y, z; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); - Vector3 accel = x*player.cmd.forwardmove+y*player.cmd.sidemove+z*player.cmd.upmove; + Vector3 accel = x*player.cmd.forwardmove+y*player.cmd.sidemove+z*jcmove; accel *= fs/320.; double spd = vel.length(); if ( spd > 40. ) vel = (vel+accel/TICRATE).unit()*spd; @@ -624,7 +638,6 @@ Class Demolitionist : PlayerPawn if ( !player.onground && !bNOGRAVITY && (waterlevel < 2) ) { double fs = TweakSpeeds(1.,0.); - fs *= max(abs(player.cmd.forwardmove/12800.),abs(player.cmd.sidemove/10240.)); if ( CanCrouch() && (player.crouchfactor != -1) ) fs *= player.crouchfactor; Vector3 accel = (RotateVector((player.cmd.forwardmove,-player.cmd.sidemove),angle),0); accel *= fs/960.; @@ -728,10 +741,11 @@ Class Demolitionist : PlayerPawn } if ( player.cmd.buttons&BT_JUMP ) { + double mult = (player.cmd.buttons&BT_SPEED)?2.:1.; if ( player.crouchoffset ) player.crouching = 1; - else if ( waterlevel >= 2 ) vel.z = 4*Speed; - else if ( bFly || bFlyCheat ) return; - else if ( bNoGravity ) vel.z = 3; + else if ( waterlevel >= 2 ) vel.z = 4*Speed*mult; + else if ( (waterlevel < 2) && (bFly || bFlyCheat) && !(player.cheats&CF_NOCLIP2) ) return; + else if ( bNoGravity ) vel.z = 3*mult; else if ( level.IsJumpingAllowed() && ((player.onground && (player.jumptics == 0)) || (!player.onground && (level.maptime > last_jump_held) && (((dashfuel > 10.) && (boostcooldown <= 0)) || walljump || wallclimb))) ) @@ -1588,4 +1602,3 @@ Class ReviveCooldown : Powerup // do nothing, this "powerup" is preserved on death } } -