* Additional kiss voices * Mirror interaction lines (not yet implemented) * Intonation changes for two existing lines * Fix randomization of some voices (grunts and whatnot)
962 lines
30 KiB
Text
962 lines
30 KiB
Text
// animations and states
|
|
extend Class Demolitionist
|
|
{
|
|
override void PlayIdle()
|
|
{
|
|
if ( !player )
|
|
{
|
|
if ( !InStateSequence(CurState,FindState("Spawn")) )
|
|
SetStateLabel("Spawn");
|
|
return;
|
|
}
|
|
if ( player.health <= 0 ) return;
|
|
if ( !bNoGravity && player.onground )
|
|
{
|
|
// Ground
|
|
if ( player.crouchdir == -1 )
|
|
{
|
|
// Crouching
|
|
if ( InStateSequence(CurState,FindState("CrouchMove"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveRun"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveFast")) )
|
|
SetStateLabel("Crouch");
|
|
else if ( InStateSequence(CurState,FindState("Spawn"))
|
|
|| InStateSequence(CurState,FindState("Turn"))
|
|
|| InStateSequence(CurState,FindState("See"))
|
|
|| InStateSequence(CurState,FindState("SeeRun"))
|
|
|| InStateSequence(CurState,FindState("SeeFast"))
|
|
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|
|
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|
|
|| InStateSequence(CurState,FindState("Float"))
|
|
|| InStateSequence(CurState,FindState("Swim"))
|
|
|| InStateSequence(CurState,FindState("SwimLoop"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopRun"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopFast")) )
|
|
SetStateLabel("StartCrouch");
|
|
}
|
|
else
|
|
{
|
|
if ( InStateSequence(CurState,FindState("Crouch"))
|
|
|| InStateSequence(CurState,FindState("CrouchMove"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveRun"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveFast")) )
|
|
SetStateLabel("EndCrouch");
|
|
else if ( InStateSequence(CurState,FindState("See"))
|
|
|| InStateSequence(CurState,FindState("SeeRun"))
|
|
|| InStateSequence(CurState,FindState("Float")) )
|
|
{
|
|
SetStateLabel("Spawn");
|
|
A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
|
|
}
|
|
else if ( InStateSequence(CurState,FindState("SeeFast"))
|
|
|| InStateSequence(CurState,FindState("SeeFastLoop")) )
|
|
SetStateLabel("SeeFastEnd");
|
|
else if ( InStateSequence(CurState,FindState("Swim"))
|
|
|| InStateSequence(CurState,FindState("SwimLoop"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopRun"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopFast")) )
|
|
SetStateLabel("SwimEnd");
|
|
}
|
|
}
|
|
else if ( !bNoGravity )
|
|
{
|
|
// Falling
|
|
if ( player.crouchdir == -1 )
|
|
{
|
|
if ( InStateSequence(CurState,FindState("Spawn"))
|
|
|| InStateSequence(CurState,FindState("Turn"))
|
|
|| InStateSequence(CurState,FindState("See"))
|
|
|| InStateSequence(CurState,FindState("SeeRun"))
|
|
|| 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"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopRun"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopFast")) )
|
|
SetStateLabel("StartCrouch");
|
|
}
|
|
else
|
|
{
|
|
if ( (InStateSequence(CurState,FindState("Spawn"))
|
|
|| InStateSequence(CurState,FindState("Turn"))
|
|
|| InStateSequence(CurState,FindState("See"))
|
|
|| InStateSequence(CurState,FindState("SeeRun"))
|
|
|| 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"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveRun"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveFast")) )
|
|
SetStateLabel("EndCrouch");
|
|
else if ( InStateSequence(CurState,FindState("Swim"))
|
|
|| InStateSequence(CurState,FindState("SwimLoop"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopRun"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopFast")) )
|
|
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("SeeRun"))
|
|
|| 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"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopRun"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopFast")) )
|
|
SetStateLabel("StartCrouch");
|
|
}
|
|
else
|
|
{
|
|
if ( InStateSequence(CurState,FindState("Spawn"))
|
|
|| InStateSequence(CurState,FindState("Turn"))
|
|
|| InStateSequence(CurState,FindState("See"))
|
|
|| InStateSequence(CurState,FindState("SeeRun"))
|
|
|| 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"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopRun"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopFast")) )
|
|
SetStateLabel("SwimEnd");
|
|
else if ( InStateSequence(CurState,FindState("Crouch"))
|
|
|| InStateSequence(CurState,FindState("CrouchMove"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveRun"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveFast")) )
|
|
SetStateLabel("EndCrouch");
|
|
}
|
|
}
|
|
}
|
|
|
|
override void PlayRunning()
|
|
{
|
|
if ( !player )
|
|
{
|
|
if ( !InStateSequence(CurState,FindState("SeeRun")) )
|
|
SetStateLabel("SeeRun");
|
|
return;
|
|
}
|
|
if ( player.health <= 0 ) return;
|
|
if ( !bNoGravity && player.onground )
|
|
{
|
|
// Ground
|
|
if ( player.crouchdir == -1 )
|
|
{
|
|
// Crouching
|
|
if ( InStateSequence(CurState,FindState("Spawn"))
|
|
|| InStateSequence(CurState,FindState("Turn"))
|
|
|| InStateSequence(CurState,FindState("See"))
|
|
|| InStateSequence(CurState,FindState("SeeRun"))
|
|
|| InStateSequence(CurState,FindState("SeeFast"))
|
|
|| InStateSequence(CurState,FindState("SeeFastLoop"))
|
|
|| InStateSequence(CurState,FindState("SeeFastEnd"))
|
|
|| InStateSequence(CurState,FindState("Fall"))
|
|
|| InStateSequence(CurState,FindState("FallLoop"))
|
|
|| InStateSequence(CurState,FindState("Float"))
|
|
|| InStateSequence(CurState,FindState("Swim"))
|
|
|| InStateSequence(CurState,FindState("SwimLoop"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopRun"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopFast")) )
|
|
SetStateLabel("StartCrouch");
|
|
else if ( InStateSequence(CurState,FindState("Crouch")) )
|
|
{
|
|
switch( FastCheck() )
|
|
{
|
|
case 2:
|
|
SetStateLabel("CrouchMoveFast");
|
|
break;
|
|
case 1:
|
|
SetStateLabel("CrouchMoveRun");
|
|
break;
|
|
default:
|
|
SetStateLabel("CrouchMove");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( InStateSequence(CurState,FindState("Crouch"))
|
|
|| InStateSequence(CurState,FindState("CrouchMove"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveRun"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveFast")) )
|
|
SetStateLabel("EndCrouch");
|
|
else if ( InStateSequence(CurState,FindState("Swim"))
|
|
|| InStateSequence(CurState,FindState("SwimLoop"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopRun"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopFast")) )
|
|
SetStateLabel("SwimEnd");
|
|
else if ( (FastCheck() == 2)
|
|
&& (InStateSequence(CurState,FindState("Spawn"))
|
|
|| InStateSequence(CurState,FindState("Turn"))
|
|
|| InStateSequence(CurState,FindState("See"))
|
|
|| InStateSequence(CurState,FindState("SeeRun"))) )
|
|
SetStateLabel("SeeFast");
|
|
else if ( InStateSequence(CurState,FindState("Spawn"))
|
|
|| InStateSequence(CurState,FindState("Float"))
|
|
|| InStateSequence(CurState,FindState("Turn")) )
|
|
{
|
|
if ( FastCheck() == 1 ) SetStateLabel("SeeRun");
|
|
else SetStateLabel("See");
|
|
A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
|
|
}
|
|
}
|
|
}
|
|
else if ( !bNoGravity )
|
|
{
|
|
// Falling
|
|
PlayIdle();
|
|
}
|
|
else
|
|
{
|
|
// Swimming
|
|
if ( player.crouchdir == -1 )
|
|
{
|
|
// Crouching
|
|
if ( InStateSequence(CurState,FindState("Spawn"))
|
|
|| InStateSequence(CurState,FindState("Turn"))
|
|
|| InStateSequence(CurState,FindState("See"))
|
|
|| InStateSequence(CurState,FindState("SeeRun"))
|
|
|| 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"))
|
|
|| InStateSequence(CurState,FindState("Swim"))
|
|
|| InStateSequence(CurState,FindState("SwimLoop"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopRun"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopFast")) )
|
|
SetStateLabel("StartCrouch");
|
|
else if ( InStateSequence(CurState,FindState("Crouch")) )
|
|
{
|
|
switch( FastCheck() )
|
|
{
|
|
case 2:
|
|
SetStateLabel("CrouchMoveFast");
|
|
break;
|
|
case 1:
|
|
SetStateLabel("CrouchMoveRun");
|
|
break;
|
|
default:
|
|
SetStateLabel("CrouchMove");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if ( bFlyCheat || (player.cheats&CF_NOCLIP2) )
|
|
{
|
|
// Special case, fly cheats don't play a swim animation, only float
|
|
// (this fixes Demo "swimming" on the library ladder in Spooktober, for example)
|
|
if ( InStateSequence(CurState,FindState("Spawn"))
|
|
|| InStateSequence(CurState,FindState("Turn"))
|
|
|| InStateSequence(CurState,FindState("See"))
|
|
|| InStateSequence(CurState,FindState("SeeRun"))
|
|
|| 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("Swim"))
|
|
|| InStateSequence(CurState,FindState("SwimLoop"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopRun"))
|
|
|| InStateSequence(CurState,FindState("SwimLoopFast")) )
|
|
SetStateLabel("Float");
|
|
else if ( InStateSequence(CurState,FindState("Crouch"))
|
|
|| InStateSequence(CurState,FindState("CrouchMove"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveRun"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveFast")) )
|
|
SetStateLabel("EndCrouch");
|
|
}
|
|
else
|
|
{
|
|
if ( InStateSequence(CurState,FindState("Spawn"))
|
|
|| InStateSequence(CurState,FindState("Turn"))
|
|
|| InStateSequence(CurState,FindState("See"))
|
|
|| InStateSequence(CurState,FindState("SeeRun"))
|
|
|| 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("CrouchMoveRun"))
|
|
|| InStateSequence(CurState,FindState("CrouchMoveFast")) )
|
|
SetStateLabel("EndCrouch");
|
|
}
|
|
}
|
|
}
|
|
|
|
override void PlayAttacking()
|
|
{
|
|
// Do nothing if it's a SWWM weapon, since those do things themselves
|
|
if ( player && (player.ReadyWeapon is 'SWWMWeapon') )
|
|
return;
|
|
if ( InStateSequence(CurState,FindState("Dash"))
|
|
|| InStateSequence(CurState,FindState("Boost")) )
|
|
return; // don't cancel dash/boost
|
|
if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchMissile");
|
|
else SetStateLabel("Missile");
|
|
}
|
|
|
|
override void PlayAttacking2()
|
|
{
|
|
PlayAttacking();
|
|
}
|
|
|
|
void PlayFire()
|
|
{
|
|
if ( InStateSequence(CurState,FindState("Dash"))
|
|
|| InStateSequence(CurState,FindState("Boost")) )
|
|
return; // don't cancel dash/boost
|
|
if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchMissile");
|
|
else SetStateLabel("Missile");
|
|
}
|
|
|
|
void PlayMelee()
|
|
{
|
|
if ( InStateSequence(CurState,FindState("Dash"))
|
|
|| InStateSequence(CurState,FindState("Boost")) )
|
|
return; // don't cancel dash/boost
|
|
if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchMelee");
|
|
else SetStateLabel("Melee");
|
|
}
|
|
|
|
void PlayFastMelee()
|
|
{
|
|
if ( InStateSequence(CurState,FindState("Dash"))
|
|
|| InStateSequence(CurState,FindState("Boost")) )
|
|
return; // don't cancel dash/boost
|
|
if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchFastMelee");
|
|
else SetStateLabel("FastMelee");
|
|
}
|
|
|
|
void PlayReload()
|
|
{
|
|
if ( InStateSequence(CurState,FindState("Dash"))
|
|
|| InStateSequence(CurState,FindState("Boost")) )
|
|
return; // don't cancel dash/boost
|
|
if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchReload");
|
|
else SetStateLabel("Reload");
|
|
}
|
|
|
|
void PlayFastReload()
|
|
{
|
|
if ( InStateSequence(CurState,FindState("Dash"))
|
|
|| InStateSequence(CurState,FindState("Boost")) )
|
|
return; // don't cancel dash/boost
|
|
if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchFastReload");
|
|
else SetStateLabel("FastReload");
|
|
}
|
|
|
|
void PlayCheckGun()
|
|
{
|
|
if ( InStateSequence(CurState,FindState("Dash"))
|
|
|| InStateSequence(CurState,FindState("Boost")) )
|
|
return; // don't cancel dash/boost
|
|
if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchCheckGun");
|
|
else SetStateLabel("CheckGun");
|
|
}
|
|
|
|
void A_DMFade()
|
|
{
|
|
if ( player ) return;
|
|
Spawn("TeleportFog",pos,ALLOW_REPLACE);
|
|
Destroy();
|
|
}
|
|
|
|
void A_DemoPain()
|
|
{
|
|
if ( IsActorPlayingSound(CHAN_JETPACK,"demolitionist/jet") )
|
|
A_StartSound("demolitionist/jetstop",CHAN_JETPACK);
|
|
String myvoice = CVar.GetCVar('swwm_voicetype',player).GetString();
|
|
int loudlv = swwm_voiceamp;
|
|
if ( lastdamage > 70 )
|
|
{
|
|
A_QuakeEx(3,3,3,9,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D);
|
|
A_StartSound("demolitionist/hipain",CHAN_VOICE);
|
|
lastbump *= 1.04;
|
|
if ( swwm_mutevoice < 4 )
|
|
{
|
|
int maxpain = StringTable.Localize("$SWWM_"..myvoice.."_NHIPAIN").ToInt();
|
|
int idx = (maxpain<=1)?1:Random[DemoLines](1,maxpain);
|
|
A_StartSound(String.Format("voice/%s/hipain%d",myvoice,idx),CHAN_DEMOVOICE,CHANF_OVERLAP);
|
|
if ( loudlv > 1 ) A_StartSound(String.Format("voice/%s/hipain%d",myvoice,idx),CHAN_DEMOVOICEAUX,CHANF_OVERLAP);
|
|
if ( loudlv > 2 ) A_StartSound(String.Format("voice/%s/hipain%d",myvoice,idx),CHAN_DEMOVOICEAUX2,CHANF_OVERLAP);
|
|
if ( loudlv > 3 ) A_StartSound(String.Format("voice/%s/hipain%d",myvoice,idx),CHAN_DEMOVOICEAUX3,CHANF_OVERLAP);
|
|
}
|
|
}
|
|
else if ( lastdamage > 30 )
|
|
{
|
|
A_QuakeEx(2,2,2,6,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D);
|
|
A_StartSound("demolitionist/pain",CHAN_VOICE);
|
|
lastbump *= 1.02;
|
|
if ( swwm_mutevoice < 4 )
|
|
{
|
|
int maxpain = StringTable.Localize("$SWWM_"..myvoice.."_NPAIN").ToInt();
|
|
int idx = (maxpain<=1)?1:Random[DemoLines](1,maxpain);
|
|
A_StartSound(String.Format("voice/%s/pain%d",myvoice,idx),CHAN_DEMOVOICE,CHANF_OVERLAP);
|
|
if ( loudlv > 1 ) A_StartSound(String.Format("voice/%s/pain%d",myvoice,idx),CHAN_DEMOVOICEAUX,CHANF_OVERLAP);
|
|
if ( loudlv > 2 ) A_StartSound(String.Format("voice/%s/pain%d",myvoice,idx),CHAN_DEMOVOICEAUX2,CHANF_OVERLAP);
|
|
if ( loudlv > 3 ) A_StartSound(String.Format("voice/%s/pain%d",myvoice,idx),CHAN_DEMOVOICEAUX3,CHANF_OVERLAP);
|
|
}
|
|
}
|
|
else if ( lastdamage > 0 )
|
|
{
|
|
A_QuakeEx(1,1,1,3,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D);
|
|
A_StartSound("demolitionist/lopain",CHAN_VOICE);
|
|
lastbump *= 1.01;
|
|
if ( swwm_mutevoice < 4 )
|
|
{
|
|
int maxpain = StringTable.Localize("$SWWM_"..myvoice.."_NLOPAIN").ToInt();
|
|
int idx = (maxpain<=1)?1:Random[DemoLines](1,maxpain);
|
|
A_StartSound(String.Format("voice/%s/lopain%d",myvoice,idx),CHAN_DEMOVOICE,CHANF_OVERLAP);
|
|
if ( loudlv > 1 ) A_StartSound(String.Format("voice/%s/lopain%d",myvoice,idx),CHAN_DEMOVOICEAUX,CHANF_OVERLAP);
|
|
if ( loudlv > 2 ) A_StartSound(String.Format("voice/%s/lopain%d",myvoice,idx),CHAN_DEMOVOICEAUX2,CHANF_OVERLAP);
|
|
if ( loudlv > 3 ) A_StartSound(String.Format("voice/%s/lopain%d",myvoice,idx),CHAN_DEMOVOICEAUX3,CHANF_OVERLAP);
|
|
}
|
|
}
|
|
}
|
|
|
|
void A_DemoScream()
|
|
{
|
|
if ( IsActorPlayingSound(CHAN_JETPACK,"demolitionist/jet") )
|
|
A_StartSound("demolitionist/jetstop",CHAN_JETPACK);
|
|
A_StopSound(CHAN_DEMOVOICE);
|
|
A_StopSound(CHAN_DEMOVOICEAUX);
|
|
A_StopSound(CHAN_DEMOVOICEAUX2);
|
|
A_StopSound(CHAN_DEMOVOICEAUX3);
|
|
String myvoice = CVar.GetCVar('swwm_voicetype',player).GetString();
|
|
int loudlv = swwm_voiceamp;
|
|
Sound snd = "demolitionist/death";
|
|
if ( special1 < 10 )
|
|
snd = "demolitionist/wdeath";
|
|
if ( health < -50 )
|
|
snd = "demolitionist/xdeath";
|
|
A_StartSound(snd,CHAN_VOICE);
|
|
if ( swwm_mutevoice < 4 )
|
|
{
|
|
int maxdeath = StringTable.Localize("$SWWM_"..myvoice.."_NDEATH").ToInt();
|
|
int idx = (maxdeath<=1)?1:Random[DemoLines](1,maxdeath);
|
|
A_StartSound(String.Format("voice/%s/death%d",myvoice,idx),CHAN_DEMOVOICE,CHANF_OVERLAP);
|
|
if ( loudlv > 1 ) A_StartSound(String.Format("voice/%s/death%d",myvoice,idx),CHAN_DEMOVOICEAUX,CHANF_OVERLAP);
|
|
if ( loudlv > 2 ) A_StartSound(String.Format("voice/%s/death%d",myvoice,idx),CHAN_DEMOVOICEAUX2,CHANF_OVERLAP);
|
|
if ( loudlv > 3 ) A_StartSound(String.Format("voice/%s/death%d",myvoice,idx),CHAN_DEMOVOICEAUX3,CHANF_OVERLAP);
|
|
}
|
|
}
|
|
|
|
void A_Dash()
|
|
{
|
|
vel += dashdir*dashboost*clamp(dashfuel/20.,0.,1.);
|
|
player.vel *= 0.;
|
|
if ( dashboost < .2 ) dashboost = 0.;
|
|
else if ( !(player.cmd.buttons&BT_USER2) ) dashboost *= .1;
|
|
double fueluse = (dashfuel-max(0.,dashfuel-dashboost))/60.;
|
|
SWWMUtility.AchievementProgressIncDouble("fuel",fueluse,player);
|
|
mystats.fuelusage += fueluse;
|
|
if ( !swwm_superfuel ) dashfuel = max(0.,dashfuel-dashboost);
|
|
dashcooldown = min(40,max(10,int(dashcooldown*1.4)));
|
|
dashlockst = clamp(dashcooldown/3,2,10);
|
|
fuelcooldown = max(30,fuelcooldown);
|
|
if ( (dashfuel <= 0.) && fullfuel )
|
|
SWWMUtility.AchievementProgressInc("brake",1,player);
|
|
if ( (dashfuel <= 0.) || (dashboost <= 0.) )
|
|
SetStateLabel("DashEnd");
|
|
}
|
|
|
|
void A_BoostUp( bool initial = false )
|
|
{
|
|
vel.z += .25*dashboost*clamp(dashfuel/20.,0,1.);
|
|
player.vel *= 0.;
|
|
if ( dashboost < .2 ) dashboost = 0.;
|
|
else
|
|
{
|
|
if ( player.cmd.buttons&BT_JUMP ) dashboost = min(5.,dashboost*1.01);
|
|
else dashboost *= .4;
|
|
last_boost = level.maptime+1;
|
|
}
|
|
double fueluse = (dashfuel-max(0.,dashfuel-dashboost))/60.;
|
|
SWWMUtility.AchievementProgressIncDouble("fuel",fueluse,player);
|
|
mystats.fuelusage += fueluse;
|
|
if ( !swwm_superfuel ) dashfuel = max(0.,dashfuel-dashboost);
|
|
if ( ((dashfuel <= 0.) || (dashboost <= 0.)) )
|
|
{
|
|
if ( !initial )
|
|
{
|
|
if ( player.onground ) SetStateLabel("JumpEnd");
|
|
else SetStateLabel("Fall");
|
|
}
|
|
return;
|
|
}
|
|
fuelcooldown = max(20,fuelcooldown);
|
|
}
|
|
|
|
void A_Footstep( double yofs, int run = 0, double vol = .3, bool nosplash = false )
|
|
{
|
|
if ( run == 2 )
|
|
{
|
|
A_StartSound("demolitionist/run",CHAN_FOOTSTEP,CHANF_OVERLAP,vol);
|
|
if ( !nosplash )
|
|
{
|
|
let b = Spawn("InvisibleSplasher",level.Vec3Offset(pos,(RotateVector((0,yofs*.25*radius),angle),0)));
|
|
b.target = self;
|
|
b.A_CheckTerrain();
|
|
}
|
|
vel.xy += (RotateVector(NormalizedMove(),angle)/3600.)*TweakSpeed();
|
|
}
|
|
else if ( run == 1 )
|
|
{
|
|
A_StartSound("demolitionist/walk",CHAN_FOOTSTEP,CHANF_OVERLAP,vol*.5);
|
|
if ( !nosplash )
|
|
{
|
|
let b = Spawn("InvisibleSplasher",level.Vec3Offset(pos,(RotateVector((0,yofs*.25*radius),angle),0)));
|
|
b.target = self;
|
|
b.A_CheckTerrain();
|
|
}
|
|
vel.xy += (RotateVector(NormalizedMove(),angle)/4800.)*TweakSpeed();
|
|
}
|
|
else
|
|
{
|
|
A_StartSound("demolitionist/walk",CHAN_FOOTSTEP,CHANF_OVERLAP,vol*.2);
|
|
if ( !nosplash )
|
|
{
|
|
let b = Spawn("SmolInvisibleSplasher",level.Vec3Offset(pos,(RotateVector((0,yofs*.25*radius),angle),0)));
|
|
b.target = self;
|
|
b.A_CheckTerrain();
|
|
}
|
|
vel.xy += (RotateVector(NormalizedMove(),angle)/6400.)*TweakSpeed();
|
|
}
|
|
}
|
|
|
|
int FastCheck()
|
|
{
|
|
if ( !player ) return 1;
|
|
if ( bWalking || (NormalizedMove().length() <= 8000.) ) return 0; // walk
|
|
if ( player.cmd.buttons&BT_RUN ) return 2; // sprint
|
|
return 1; // walk
|
|
}
|
|
|
|
State A_FastJump( StateLabel walk = null, StateLabel run = null, StateLabel sprint = null )
|
|
{
|
|
int fc = FastCheck();
|
|
if ( (fc == 2) && sprint ) return ResolveState(sprint);
|
|
if ( (fc == 1) && run ) return ResolveState(run);
|
|
if ( (fc == 0) && walk ) return ResolveState(walk);
|
|
return ResolveState(null);
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
// normal idle
|
|
#### # 2;
|
|
XZW1 A 1 A_JumpIf(player&&(player.mo==self)&&(abs(player.cmd.yaw|player.cmd.pitch)>128),"Turn");
|
|
Wait;
|
|
See:
|
|
// normal walking
|
|
#### # 2;
|
|
XZW1 BCD 2 A_FastJump(null,"SeeRun","SeeFast");
|
|
XZW1 E 0 A_Footstep(1);
|
|
XZW1 EFGHIJKL 2 A_FastJump(null,"SeeRun","SeeFast");
|
|
XZW1 M 0 A_Footstep(-1);
|
|
XZW1 MNOPA 2 A_FastJump(null,"SeeRun","SeeFast");
|
|
Goto See+1;
|
|
Turn:
|
|
#### # 8 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.1);
|
|
XZW1 C 1 A_JumpIf(!player||!(player.cmd.yaw|player.cmd.pitch),1);
|
|
Wait;
|
|
XZW1 C 3 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.1);
|
|
Goto Spawn+1;
|
|
SeeRun:
|
|
#### # 2;
|
|
XZWI PQR 2 A_FastJump("See",null,"SeeFast");
|
|
XZWI S 0 A_Footstep(1,1);
|
|
XZWI STUVWX 2 A_FastJump("See",null,"SeeFast");
|
|
XZWI Y 0 A_Footstep(-1,1);
|
|
XZWI YZ 2 A_FastJump("See",null,"SeeFast");
|
|
XZW1 A 2 A_FastJump("See",null,"SeeFast");
|
|
Goto SeeRun+1;
|
|
SeeFast:
|
|
// sprinting
|
|
#### # 2 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.3);
|
|
XZW1 QRS 2;
|
|
Goto SeeFastLoop;
|
|
SeeFastLoop:
|
|
// keep sprinting
|
|
XZW1 T 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW1 U 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW1 V 0 A_Footstep(1,2);
|
|
XZW1 V 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW1 W 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW1 X 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW1 Y 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW1 Z 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW2 A 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW2 B 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW2 C 0 A_Footstep(-1,2);
|
|
XZW2 C 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW2 D 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW2 E 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW2 F 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
XZW2 G 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd");
|
|
Goto SeeFastLoop;
|
|
SeeFastEnd:
|
|
// brake
|
|
#### # 2 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.3);
|
|
XZW2 HIJKL 2;
|
|
Goto Spawn+1;
|
|
Pain:
|
|
// ouchy
|
|
XZW1 A 1 A_JumpIf(player&&(player.mo==self)&&(player.crouchdir==-1),"CrouchPain");
|
|
XZW2 M 1 A_DemoPain();
|
|
XZW2 NOPQ 1;
|
|
Goto Spawn+1;
|
|
Death:
|
|
XDeath:
|
|
// ded
|
|
XZW1 A 0 A_JumpIf(player&&(player.mo==self)&&(player.crouchdir==-1),"CrouchDeath");
|
|
XZW1 A 2
|
|
{
|
|
A_DemoScream();
|
|
bSOLID = true; // we need this to avoid clipping into things
|
|
}
|
|
XZW2 RSTUVWXYZ 2;
|
|
XZW3 ABCDEFG 2;
|
|
XZW3 H 1 A_DMFade();
|
|
Wait;
|
|
Boost:
|
|
// start boost
|
|
#### # 2;
|
|
XZW3 IJKLMNO 2
|
|
{
|
|
if ( player.onground||bNoGravity )
|
|
return ResolveState("BoostEnd");
|
|
A_BoostUp(true);
|
|
return ResolveState(null);
|
|
}
|
|
// keep boost
|
|
XZW3 P 1
|
|
{
|
|
if ( player.onground||bNoGravity )
|
|
return ResolveState("BoostEnd");
|
|
A_BoostUp(false);
|
|
return ResolveState(null);
|
|
}
|
|
XZW3 P 1 A_JumpIf((vel.z<-10)&&(pos.z>(floorz+80)),"Fall");
|
|
Goto Boost+8;
|
|
BoostEnd:
|
|
// stop boost
|
|
#### # 2;
|
|
XZW3 PQRSTUVW 2;
|
|
Goto Spawn+1;
|
|
Jump:
|
|
#### # 2;
|
|
XZWJ ABCDEF 2 A_JumpIf(player.onground&&!bNoGravity,"FallEnd");
|
|
Goto FallLoop;
|
|
Fall:
|
|
// start fall
|
|
#### # 4;
|
|
XZW3 XYZ 2 A_JumpIf(player.onground&&!bNoGravity,"FallEnd");
|
|
XZW4 AB 2 A_JumpIf(player.onground&&!bNoGravity,"FallEnd");
|
|
Goto FallLoop;
|
|
FallLoop:
|
|
// falling
|
|
XZW4 CDEFGH 3 A_JumpIf(player.onground&&!bNoGravity,"FallEnd");
|
|
Goto FallLoop;
|
|
FallEnd:
|
|
// landing
|
|
XZW4 CIJKLMN 2;
|
|
Goto Spawn+1;
|
|
Dash:
|
|
#### # 2;
|
|
XZW4 O 2 A_Dash();
|
|
XZW4 PQRS 2 A_Dash();
|
|
Goto Dash+2;
|
|
DashEnd:
|
|
XZW4 TUVWX 2;
|
|
Goto Spawn+1;
|
|
Wave:
|
|
#### # 3;
|
|
XZW4 YZ 3;
|
|
XZW5 ABCDEFGHIJKLM 3;
|
|
Goto Spawn+1;
|
|
Approve:
|
|
#### # 3;
|
|
XZW5 NOPQR 3;
|
|
XZW5 S 3 { facegrin = true; }
|
|
XZW5 TUVWXYZ 3;
|
|
XZW6 ABCD 3;
|
|
Goto Spawn+1;
|
|
Victory:
|
|
#### # 3;
|
|
XZW6 EFGH 3;
|
|
XZW6 I 3 { facegrin = true; }
|
|
XZW6 JKLMNOPQRSTUVW 3;
|
|
Goto Spawn+1;
|
|
BlowKiss:
|
|
#### # 3;
|
|
XZWD EFGH 3;
|
|
XZWD I 3 { faceblink = true; }
|
|
XZWD JKLMNO 3;
|
|
XZWD P 3 { facewink = true; }
|
|
XZWD QRSTUVW 3;
|
|
Goto Spawn+1;
|
|
Headpat:
|
|
#### # 3;
|
|
XZWH ST 3;
|
|
XZWH U 2;
|
|
XZWH V 2 { facegrin = true; }
|
|
XZWH W 2;
|
|
XZWH XYZ 1;
|
|
XZWI A 1;
|
|
XZWI B 2;
|
|
XZWI C 2 { facegrin = true; }
|
|
XZWI DE 2;
|
|
XZWI FG 1;
|
|
HeadpatLoop:
|
|
XZWI H 1;
|
|
XZWH XYZ 1;
|
|
XZWI A 1;
|
|
XZWI B 2;
|
|
XZWI C 2 { facegrin = true; }
|
|
XZWI DE 2;
|
|
XZWI FGH 1;
|
|
XZWI IJK 2;
|
|
XZWI LMNO 3;
|
|
Goto Spawn+1;
|
|
Ragepat:
|
|
#### # 3;
|
|
XZWH ST 2;
|
|
XZWH UVW 1;
|
|
XZWH XZ 1;
|
|
XZWI BCDE 1;
|
|
XZWI FH 1;
|
|
XZWH XZ 1;
|
|
XZWI BCDE 1;
|
|
XZWI FH 1;
|
|
XZWH XZ 1;
|
|
XZWI BCDE 1;
|
|
XZWI F 1;
|
|
RagepatLoop:
|
|
XZWI H 1;
|
|
XZWH XZ 1;
|
|
XZWI BCDE 1;
|
|
XZWI FH 1;
|
|
XZWI IJK 1;
|
|
XZWI LMNO 2;
|
|
Goto Spawn+1;
|
|
Missile:
|
|
// attacking
|
|
#### # 2;
|
|
XZW6 XYZ 2;
|
|
XZW7 ABC 2;
|
|
Goto Spawn+1;
|
|
Melee:
|
|
// ponch
|
|
#### # 2;
|
|
XZW8 TUVWXYZ 2;
|
|
XZW9 ABCDEF 2;
|
|
Goto Spawn+1;
|
|
FastMelee:
|
|
// ponch (fast)
|
|
#### # 2;
|
|
XZW8 TUVWXYZ 1;
|
|
XZW9 ABCDE 1;
|
|
XZW9 F 2;
|
|
Goto Spawn+1;
|
|
Reload:
|
|
// reload
|
|
#### # 2;
|
|
XZW9 GHIJKLMNOPQRSTUVWXYZ 2;
|
|
XZWA ABCDE 2;
|
|
Goto Spawn+1;
|
|
FastReload:
|
|
// reload (fast)
|
|
#### # 2;
|
|
XZW9 GHIJKLMNOPQRSTUVWXYZ 1;
|
|
XZWA ABCDE 1;
|
|
Goto Spawn+1;
|
|
CheckGun:
|
|
// speen
|
|
#### # 2;
|
|
XZWA FGHIJKLMNOPQRSTUVWXY 2;
|
|
Goto Spawn+1;
|
|
StartCrouch:
|
|
// go crouching
|
|
#### # 2 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.45);
|
|
XZW7 DEFGH 1;
|
|
XZW7 IJKL 2;
|
|
Goto Crouch+1;
|
|
Crouch:
|
|
#### # 4;
|
|
XZW7 M -1;
|
|
Stop;
|
|
CrouchMove:
|
|
#### # 4;
|
|
XZW7 MN 4 A_FastJump(null,"CrouchMoveRun","CrouchMoveFast");
|
|
XZW7 O 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.1);
|
|
XZW7 OPQRS 4 A_FastJump(null,"CrouchMoveRun","CrouchMoveFast");
|
|
XZW7 T 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.1);
|
|
XZW7 TUV 4 A_FastJump(null,"CrouchMoveRun","CrouchMoveFast");
|
|
Goto CrouchMove+1;
|
|
CrouchMoveRun:
|
|
#### # 3;
|
|
XZW7 MN 3 A_FastJump("CrouchMove",null,"CrouchMoveFast");
|
|
XZW7 O 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
|
|
XZW7 OPQRS 3 A_FastJump("CrouchMove",null,"CrouchMoveFast");
|
|
XZW7 T 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
|
|
XZW7 TUV 3 A_FastJump("CrouchMove",null,"CrouchMoveFast");
|
|
Goto CrouchMoveRun+1;
|
|
CrouchMoveFast:
|
|
#### # 2;
|
|
XZW7 MN 2 A_FastJump("CrouchMove","CrouchMoveRun",null);
|
|
XZW7 O 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.4);
|
|
XZW7 OPQRS 2 A_FastJump("CrouchMove","CrouchMoveRun",null);
|
|
XZW7 T 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.4);
|
|
XZW7 TUV 2 A_FastJump("CrouchMove","CrouchMoveRun",null);
|
|
Goto CrouchMoveFast+2;
|
|
CrouchWave:
|
|
#### # 3;
|
|
XZWF ABCDEFGHIJKLMNO 3;
|
|
Goto Crouch+1;
|
|
CrouchApprove:
|
|
#### # 3;
|
|
XZWF PQRST 3;
|
|
XZWF U 3 { facegrin = true; }
|
|
XZWF VWXYZ 3;
|
|
XZWG ABCDEF 3;
|
|
Goto Crouch+1;
|
|
CrouchVictory:
|
|
#### # 3;
|
|
XZWG GHIJ 3;
|
|
XZWG K 3 { facegrin = true; }
|
|
XZWG LMNOPQRSTUVWXY 3;
|
|
Goto Crouch+1;
|
|
CrouchBlowKiss:
|
|
#### # 3;
|
|
XZWG Z 3;
|
|
XZWH ABC 3;
|
|
XZWH D 3 { faceblink = true; }
|
|
XZWH EFGHIJ 3;
|
|
XZWH K 3 { facewink = true; }
|
|
XZWH LMNOPQR 3;
|
|
Goto Crouch+1;
|
|
CrouchMissile:
|
|
XZW7 M 2;
|
|
XZW7 WXYZ 2;
|
|
XZW8 AB 2;
|
|
Goto Crouch+1;
|
|
CrouchMelee:
|
|
XZW7 M 2;
|
|
XZWA Z 2;
|
|
XZWB ABCDEFGHIJKL 2;
|
|
Goto Crouch+1;
|
|
CrouchFastMelee:
|
|
XZW7 M 2;
|
|
XZWA Z 1;
|
|
XZWB ABCDEFGHIJK 1;
|
|
XZWB L 2;
|
|
Goto Crouch+1;
|
|
CrouchReload:
|
|
XZW7 M 2;
|
|
XZWB MNOPQRSTUVWXYZ 2;
|
|
XZWC ABCDEFGHIJ 2;
|
|
Goto Crouch+1;
|
|
CrouchFastReload:
|
|
XZW7 M 2;
|
|
XZWB MNOPQRSTUVWXYZ 1;
|
|
XZWC ABCDEFGHIJ 1;
|
|
Goto Crouch+1;
|
|
CrouchCheckGun:
|
|
XZW7 M 2;
|
|
XZWC LMNOPQRSTUVWXYZ 2;
|
|
XZWD ABCD 2;
|
|
Goto Crouch+1;
|
|
CrouchPain:
|
|
XZW7 M 1;
|
|
XZW8 C 1 A_DemoPain();
|
|
XZW8 DEF 1;
|
|
Goto Crouch+1;
|
|
CrouchDeath:
|
|
XZW7 M 2
|
|
{
|
|
A_DemoScream();
|
|
bSOLID = true; // we need this to avoid clipping into things
|
|
}
|
|
XZW8 GHIJK 2;
|
|
XZW8 L 1 A_DMFade();
|
|
Wait;
|
|
EndCrouch:
|
|
#### # 2 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.45);
|
|
XZW8 MNOPQRS 2;
|
|
Goto Spawn+1;
|
|
Float:
|
|
#### # 3;
|
|
XZWD XYZ 3;
|
|
XZWE ABCDEFGHI 3;
|
|
Goto Float+1;
|
|
Swim:
|
|
#### # 2;
|
|
XZWE JKL 2;
|
|
Goto SwimLoop;
|
|
SwimLoop:
|
|
#### # 5;
|
|
XZWE MNO 5 A_FastJump(null,"SwimLoopRun","SwimLoopFast");
|
|
XZWE P 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.1);
|
|
XZWE PQRSTU 5 A_FastJump(null,"SwimLoopRun","SwimLoopFast");
|
|
XZWE V 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.1);
|
|
XZWE VWX 5 A_FastJump(null,"SwimLoopRun","SwimLoopFast");
|
|
Goto SwimLoop+1;
|
|
SwimLoopRun:
|
|
#### # 3;
|
|
XZWE MNO 3 A_FastJump("SwimLoop",null,"SwimLoopFast");
|
|
XZWE P 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
|
|
XZWE PQRSTU 3 A_FastJump("SwimLoop",null,"SwimLoopFast");
|
|
XZWE V 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.2);
|
|
XZWE VWX 3 A_FastJump("SwimLoop",null,"SwimLoopFast");
|
|
Goto SwimLoopRun+1;
|
|
SwimLoopFast:
|
|
#### # 2;
|
|
XZWE MNO 2 A_FastJump("SwimLoop","SwimLoopRun",null);
|
|
XZWE P 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.4);
|
|
XZWE PQRSTU 2 A_FastJump("SwimLoop","SwimLoopRun",null);
|
|
XZWE V 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.4);
|
|
XZWE VWX 2 A_FastJump("SwimLoop","SwimLoopRun",null);
|
|
Goto SwimLoopFast+1;
|
|
SwimEnd:
|
|
#### # 2;
|
|
XZWE MYZ 2;
|
|
Goto Float+1;
|
|
}
|
|
}
|