Begin working on custom intermission.

Tweaks to player voice handling, line counts are language strings now, instead of the old awkward method of counting them manually.
Some adjustments to movement, jump/croush to move up/down when swimming and flying.
Increased damages of Pusher, for balance.
Fixed incorrect behaviour of armor damage absorption, which made the armor nuggets pretty much useless.
Fix incorrect absorption factor of armor nuggets, making them heal at >10% instead of >100%.
This commit is contained in:
Mari the Deer 2020-03-08 11:41:11 +01:00
commit e0821adbe2
14 changed files with 159 additions and 43 deletions

24
TODO.md Normal file
View file

@ -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

BIN
graphics/InterBG.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

BIN
graphics/InterMockup.xcf Normal file

Binary file not shown.

View file

@ -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.";

Binary file not shown.

View file

@ -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/<name>/<group><#> for the sndinfo entries
# SWWM_SUBS_<NAME>_<GROUP><#> 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_<NAME>_<GROUP><#>, plus a SWWM_SUBS_<NAME>_N<GROUP> 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

View file

@ -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"

View file

@ -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"

View file

@ -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;
}
}
}

View file

@ -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++;

62
zscript/swwm_inter.zsc Normal file
View file

@ -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;
}

View file

@ -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;
}
}
}

View file

@ -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));

View file

@ -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
}
}