0.9.8b release:

- Crouched gesture animations.
 - Proper crouch-jumping (now always enabled).
 - New fanart by Endie.
 - Swimming animations (also used by flight).
 - Hexen-style startup screen.
 - More model cleanup.
 - Prevent Wallbuster reload menu from opening on intermissions.
 - Intermissions now only handle fire and use for advance, to prevent some lil' accidents.
 - Holding altfire on intermissions hides ui elements, so the bg is fully visible.
 - Begin writing lore for collectibles (these will come in a couple updates).
 - Fix fuzz shader being affected by texture upscaling.
 - Enemies with >=1000 starting hp also can drop golden shells.
 - Explodium Gun no longer shows with a "1x" prefix on menus when single.
 - Player animation transition tweaks.
This commit is contained in:
Mari the Deer 2020-09-24 14:05:04 +02:00
commit 65db7e8367
73 changed files with 561 additions and 76 deletions

View file

@ -54,7 +54,7 @@ Class WallbusterReloadMenu : GenericMenu
if ( !pauseme ) pauseme = CVar.GetCVar('swwm_cbtpause',players[consoleplayer]);
if ( pauseme.GetBool() ) menuactive = Menu.On;
else menuactive = Menu.OnNoPause;
if ( (players[consoleplayer].Health > 0) && (players[consoleplayer].ReadyWeapon is 'Wallbuster') ) return;
if ( (players[consoleplayer].Health > 0) && (players[consoleplayer].ReadyWeapon is 'Wallbuster') && (gamestate == GS_LEVEL) ) return;
MenuEvent(MKEY_BACK,false);
}

View file

@ -80,7 +80,6 @@ Class FroggyChair : SWWMCollectable
}
// The other collectables, which will be implemented eventually
/*
Class MMiaSRVol1 : SWWMCollectable
{
Default
@ -328,7 +327,6 @@ Class KirinManga : SWWMCollectable
Stamina 1600;
}
}
*/
// yay!
Class FancyConfetti : Actor

View file

@ -835,7 +835,7 @@ Class SWWMHandler : EventHandler
override void WorldThingDied( WorldEvent e )
{
if ( e.Thing.default.bBOSS && !Random[GoldDrop](0,2) )
if ( ((e.Thing.default.bBOSS) || (e.Thing.default.Health >= 1000)) && !Random[GoldDrop](0,2) )
{
let g = Actor.Spawn("GoldShell",e.Thing.Vec3Offset(0,0,e.Thing.Height/2));
double ang = FRandom[SpareShells](0,360);
@ -1202,6 +1202,8 @@ Class SWWMHandler : EventHandler
}
}
}
if ( (kcode > 2) || (lcode > 2) )
return true; // eat keypresses from this point
}
return false;
}

View file

@ -13,6 +13,7 @@ Class SWWMStatScreen : StatusScreen abstract
transient CVar intertype, lang, origmus;
double hs, hs2;
Vector2 ss, ss2, origin, origin2;
double bgfade;
// returns MPlus if we're playing in Japanese, otherwise returns the requested font
Font LangFont( Font req )
@ -247,6 +248,75 @@ Class SWWMStatScreen : StatusScreen abstract
drawNoState();
break;
}
if ( bgfade <= 0. ) return;
// redraw bgs on top, hiding the rest of the ui
if ( intertype.GetInt() == 1 )
{
double ar = Screen.GetAspectRatio();
Vector2 tsize = TexMan.GetScaledSize(arttex);
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(arttex,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true,DTA_Alpha,bgfade);
}
/*else if ( intertype.GetInt() == 2 )
{
// TBD when there's art
}*/
else
{
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,DTA_Alpha,bgfade);
}
}
protected void checkForAccelerateNew( void )
{
// check for button presses to skip delays (but only recognize fire/use buttons)
for ( int i=0; i < MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
{
PlayerInfo p = players[i];
if ( (p.cmd.buttons^p.oldbuttons) && ((p.cmd.buttons&p.oldbuttons) == p.oldbuttons) && !p.Bot && (p.cmd.buttons&(BT_ATTACK|BT_USE)) )
{
acceleratestage = 1;
playerready[i] = true;
}
p.oldbuttons = p.buttons;
}
}
}
override void Ticker( void )
{
bcnt++;
if ( bcnt == 1 ) StartMusic();
checkForAccelerateNew();
switch (CurState)
{
case StatCount:
updateStats();
break;
case ShowNextLoc:
updateShowNextLoc();
break;
case NoState:
updateNoState();
break;
case LeavingIntermission:
// sorry nothing
break;
}
// check fade
if ( players[consoleplayer].cmd.buttons&BT_ALTATTACK ) bgfade = min(1.,bgfade+3./Thinker.TICRATE);
else bgfade = max(0.,bgfade-4./Thinker.TICRATE);
}
protected String TimeStr( int secs )
{

View file

@ -809,7 +809,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -854,7 +854,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -883,7 +883,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -928,7 +928,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -1338,7 +1338,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -2384,7 +2384,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
len = fnt.StringWidth(str);
if ( len > longest ) longest = len;
@ -2396,7 +2396,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
{
if ( !invlist[i] ) continue;
if ( invlist[i] is 'Ammo' ) str = String.Format("(%d/%d) %s",invlist[i].Amount,invlist[i].MaxAmount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
int clscol = Font.CR_WHITE;
if ( invlist[i] is 'Weapon' ) clscol = Font.CR_GOLD;

View file

@ -1398,7 +1398,8 @@ Class Demolitionist : PlayerPawn
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("FloatLoop")) )
|| InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("StartCrouch");
}
else
@ -1407,8 +1408,7 @@ Class Demolitionist : PlayerPawn
|| InStateSequence(CurState,FindState("CrouchMove")) )
SetStateLabel("EndCrouch");
else if ( InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("FloatLoop")) )
|| InStateSequence(CurState,FindState("Float")) )
{
SetStateLabel("Spawn");
A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
@ -1416,26 +1416,17 @@ Class Demolitionist : PlayerPawn
else if ( InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop")) )
SetStateLabel("SeeFastEnd");
else if ( InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("SwimEnd");
}
}
else if ( !bNoGravity && (waterlevel < 1) )
{
// Falling
if ( (InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("FloatLoop")))
&& (abs(pos.z-floorz) > maxstepheight) )
SetStateLabel("Fall");
}
else
{
// Floating
if ( InStateSequence(CurState,FindState("Spawn"))
if ( player.crouchdir == -1 )
{
if ( InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
@ -1443,8 +1434,70 @@ Class Demolitionist : PlayerPawn
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Jump"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("FloatLoop")) )
SetStateLabel("Fall");
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop"))
|| InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("StartCrouch");
}
else
{
if ( (InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Float")))
&& (abs(pos.z-floorz) > maxstepheight) )
SetStateLabel("Fall");
else if ( InStateSequence(CurState,FindState("Crouch"))
|| InStateSequence(CurState,FindState("CrouchMove")) )
SetStateLabel("EndCrouch");
else if ( InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("SwimEnd");
}
}
else
{
// Swimming
if ( player.crouchdir == -1 )
{
// Crouching
if ( InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Jump"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop"))
|| InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("StartCrouch");
}
else
{
if ( InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Jump"))
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop")) )
SetStateLabel("Float");
else if ( InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("SwimEnd");
else if ( InStateSequence(CurState,FindState("Crouch"))
|| InStateSequence(CurState,FindState("CrouchMove")) )
SetStateLabel("EndCrouch");
}
}
}
override void PlayRunning()
@ -1467,7 +1520,12 @@ Class Demolitionist : PlayerPawn
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd")) )
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("StartCrouch");
else if ( InStateSequence(CurState,FindState("Crouch")) )
SetStateLabel("CrouchMove");
@ -1477,6 +1535,9 @@ Class Demolitionist : PlayerPawn
if ( InStateSequence(CurState,FindState("Crouch"))
|| InStateSequence(CurState,FindState("CrouchMove")) )
SetStateLabel("EndCrouch");
else if ( InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("SwimEnd");
else if ( FastCheck()
&& (InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
@ -1497,8 +1558,11 @@ Class Demolitionist : PlayerPawn
}
else
{
// Floating
if ( InStateSequence(CurState,FindState("Spawn"))
// Swimming
if ( player.crouchdir == -1 )
{
// Crouching
if ( InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
@ -1506,8 +1570,31 @@ Class Demolitionist : PlayerPawn
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Jump"))
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop")) )
SetStateLabel("Float");
|| InStateSequence(CurState,FindState("FallLoop"))
|| InStateSequence(CurState,FindState("Float"))
|| InStateSequence(CurState,FindState("Swim"))
|| InStateSequence(CurState,FindState("SwimLoop")) )
SetStateLabel("StartCrouch");
else if ( InStateSequence(CurState,FindState("Crouch")) )
SetStateLabel("CrouchMove");
}
else
{
if ( InStateSequence(CurState,FindState("Spawn"))
|| InStateSequence(CurState,FindState("Turn"))
|| InStateSequence(CurState,FindState("See"))
|| InStateSequence(CurState,FindState("SeeFast"))
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|| InStateSequence(CurState,FindState("Jump"))
|| InStateSequence(CurState,FindState("Fall"))
|| InStateSequence(CurState,FindState("FallLoop"))
|| InStateSequence(CurState,FindState("Float")) )
SetStateLabel("Swim");
else if ( InStateSequence(CurState,FindState("Crouch"))
|| InStateSequence(CurState,FindState("CrouchMove")) )
SetStateLabel("EndCrouch");
}
}
}
override void PlayAttacking()
@ -1716,9 +1803,6 @@ Class Demolitionist : PlayerPawn
{
if ( player.cmd.buttons&BT_JUMP ) return false;
if ( InStateSequence(CurState,FindState("Dash")) ) return false; // no crouch during dash
if ( swwm_crouchjump ) return true; // allowed
if ( (waterlevel > 2) || bNOGRAVITY ) return false; // no crouch while swimming/floating
if ( !player.onground ) return false; // no crouch while in air
return true;
}
// Imagine having to duplicate two functions only to change a couple values in both
@ -1946,18 +2030,6 @@ Class Demolitionist : PlayerPawn
// landing
XZW4 CIJKLMN 2;
Goto Spawn+1;
Float:
// start
#### # 2;
XZW4 O 3;
Goto FloatLoop;
FloatLoop:
XZW4 PQRS 6;
Loop;
FloatEnd:
#### # 2;
XZW4 TUVWX 3;
Goto Spawn+1;
Dash:
#### # 2;
XZW4 O 2 A_Dash();
@ -2031,6 +2103,25 @@ Class Demolitionist : PlayerPawn
XZW7 T 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
XZW7 TUV 2;
Loop;
CrouchWave:
#### # 3;
XZWE Z 3;
XZWF ABCDEFGHIJKLMN 3;
Goto Crouch+1;
CrouchApprove:
#### # 3;
XZWF OPQRSTUVWXYZ 3;
XZWG ABCDE 3;
Goto Crouch+1;
CrouchVictory:
#### # 3;
XZWG FGHIJKLMNOPQRSTUVWX 3;
Goto Crouch+1;
CrouchBlowKiss:
#### # 3;
XZWG YZ 3;
XZWH ABCDEFGHIJKLMNOPQ 3;
Goto Crouch+1;
CrouchMissile:
XZW7 M 2;
XZW7 WXYZ 2;
@ -2075,6 +2166,26 @@ Class Demolitionist : PlayerPawn
#### # 2 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.45);
XZW8 MNOPQRS 2;
Goto Spawn+1;
Float:
#### # 3;
XZWD WXYZ 3;
XZWE ABCDEFGH 3;
Goto Float+1;
Swim:
#### # 2;
XZWE IJK 2;
Goto SwimLoop;
SwimLoop:
XZWE LMN 2;
XZWE O 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
XZWE OPQRST 2;
XZWE U 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
XZWE UVW 2;
Loop;
SwimEnd:
#### # 2;
XZWE LXY 2;
Goto Float+1;
VoodooSpawn:
XZWZ A -1;
Loop;
@ -2731,10 +2842,9 @@ Class SWWMGesture : SWWMWeapon
action void A_CallPlayerGesture( statelabel st, statelabel cst )
{
if ( invoker.Owner.Health <= 0 ) return;
// crouched gestures not yet added
/*if ( (player.crouchdir == -1) && invoker.Owner.FindState(cst) )
if ( (player.crouchdir == -1) && invoker.Owner.FindState(cst) )
invoker.Owner.SetStateLabel(cst);
else */if ( invoker.Owner.FindState(st) )
else if ( invoker.Owner.FindState(st) )
invoker.Owner.SetStateLabel(st);
}