// 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); if ( !myvoice ) myvoice = CVar.GetCVar('swwm_voicetype',player); 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 ) { A_StartSound(String.Format("voice/%s/hipain",myvoice.GetString()),CHAN_DEMOVOICE,CHANF_OVERLAP); if ( loudlv > 1 ) A_StartSound(String.Format("voice/%s/hipain",myvoice.GetString()),CHAN_DEMOVOICEAUX,CHANF_OVERLAP); if ( loudlv > 2 ) A_StartSound(String.Format("voice/%s/hipain",myvoice.GetString()),CHAN_DEMOVOICEAUX2,CHANF_OVERLAP); if ( loudlv > 3 ) A_StartSound(String.Format("voice/%s/hipain",myvoice.GetString()),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 ) { A_StartSound(String.Format("voice/%s/pain",myvoice.GetString()),CHAN_DEMOVOICE,CHANF_OVERLAP); if ( loudlv > 1 ) A_StartSound(String.Format("voice/%s/pain",myvoice.GetString()),CHAN_DEMOVOICEAUX,CHANF_OVERLAP); if ( loudlv > 2 ) A_StartSound(String.Format("voice/%s/pain",myvoice.GetString()),CHAN_DEMOVOICEAUX2,CHANF_OVERLAP); if ( loudlv > 3 ) A_StartSound(String.Format("voice/%s/pain",myvoice.GetString()),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 ) { A_StartSound(String.Format("voice/%s/lopain",myvoice.GetString()),CHAN_DEMOVOICE,CHANF_OVERLAP); if ( loudlv > 1 ) A_StartSound(String.Format("voice/%s/lopain",myvoice.GetString()),CHAN_DEMOVOICEAUX,CHANF_OVERLAP); if ( loudlv > 2 ) A_StartSound(String.Format("voice/%s/lopain",myvoice.GetString()),CHAN_DEMOVOICEAUX2,CHANF_OVERLAP); if ( loudlv > 3 ) A_StartSound(String.Format("voice/%s/lopain",myvoice.GetString()),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); if ( !myvoice ) myvoice = CVar.GetCVar('swwm_voicetype',player); 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 ) { A_StartSound(String.Format("voice/%s/death",myvoice.GetString()),CHAN_DEMOVOICE,CHANF_OVERLAP); if ( loudlv > 1 ) A_StartSound(String.Format("voice/%s/death",myvoice.GetString()),CHAN_DEMOVOICEAUX,CHANF_OVERLAP); if ( loudlv > 2 ) A_StartSound(String.Format("voice/%s/death",myvoice.GetString()),CHAN_DEMOVOICEAUX2,CHANF_OVERLAP); if ( loudlv > 3 ) A_StartSound(String.Format("voice/%s/death",myvoice.GetString()),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; } }