diff --git a/Readme.md b/Readme.md index ed3953f..bf4418f 100644 --- a/Readme.md +++ b/Readme.md @@ -30,6 +30,7 @@ Doom Tournament (currently the devel branch is required). - Restored flashlight - Minigun (slot 0) (replaces chaingun) - SMP 7243 (slot 0) (replaces bfg9000) + - Quadshot (slot 3) (replaces shotguns) - Backpack (replaces backpack, identical to Doom Tournament version) - Unreal 1 HUD - Translator (has to be spawned in, since it would only be useful for mappers) @@ -62,23 +63,26 @@ Doom Tournament (currently the devel branch is required). ## In progress - - N/A - -## Planned - - - Stunner (slot 4) (replaces chainsaw) - Razorclaw (slot 1) (replaces chainsaw) - Teleport Capsules (slot 1) - Protomag (slot 2) (replaces pistol) - Dual Protomags - - Quadshot (slot 3) (replaces shotguns) - - Peacemaker (slot 8) (rare spawn in backpacks) - - Impaler (slot 7) (replaces plasma rifle) - - Flamethrower (slot 6) (replaces plasma rifle) + - Stunner (slot 4) (replaces chainsaw) - Fireblaster (slot 5) (replaces rocket launcher) + - Flamethrower (slot 6) (replaces plasma rifle) + - Impaler (slot 7) (replaces plasma rifle) + - Peacemaker (slot 8) (rare spawn in backpacks) - Demolisher (slot 9) (replaces bfg9000) - Autocannon (slot 0) (replaces bfg9000) +## Planned + + - RTNP add-on + - Monster pack (someday) + - Map pack (maybe? who knows) + ## Known bugs - - N/A + - The Quadshot dry-firing and being unable to reload when you have less than 4 + shells left is intentional. In theory this shouldn't happen anyway as all + ammo is in multiples of 4. Usually cheats and scripts would cause this. diff --git a/modeldef.quadshot b/modeldef.quadshot index 638fa83..697c10b 100644 --- a/modeldef.quadshot +++ b/modeldef.quadshot @@ -22,6 +22,23 @@ Model "UShells2" FrameIndex QAMO A 0 0 } +Model "QCasing" +{ + Path "models" + Model 0 "QShell_d.3d" + Skin 0 "JQuadAm2.png" + Scale 0.03 -0.03 0.036 + AngleOffset 90 + ZOffset 1 + USEACTORPITCH + USEACTORROLL + DONTCULLBACKFACES + USEROTATIONCENTER + Rotation-Center 0 0 1 + + FrameIndex PCAS A 0 0 +} + Model "Quadshot" { Path "models" @@ -31,9 +48,253 @@ Model "Quadshot" AngleOffset -90 Scale 0.08 -0.08 0.096 - FrameIndex QUAP B 1 0 + FrameIndex QSPK B 1 0 ZOffset 12 ROTATING - FrameIndex QUAP A 1 0 + FrameIndex QSPK A 1 0 } + +Model "Quadshot" +{ + Path "models" + Model 2 "Flat_d.3d" + Skin 2 "QuadMuz.png" + AngleOffset 90 + Scale 0.07 0.07 0.07 + Offset 9.5 -50 -7 + + FrameIndex QFLA A 2 0 + + Scale 0.12 0.12 0.12 + Offset 9.5 -50 -8 + FrameIndex QFLA B 2 0 +} +// Way too many goddamn frames on this even though I actually reduced them +Model "Quadshot" +{ + Path "models" + Model 0 "QuadShot_d.3d" + SurfaceSkin 0 0 "GunPick1.png" + SurfaceSkin 0 1 "Automa1.png" + SurfaceSkin 0 2 "JQuadAm1.png" + AngleOffset -90 + Scale 0.32 -0.32 0.32 + Offset 12 -24 -14 + + // Idle + FrameIndex QUAI A 0 0 + FrameIndex QUAI B 0 1 + FrameIndex QUAI C 0 2 + FrameIndex QUAI D 0 3 + FrameIndex QUAI E 0 4 + // Twiddle + FrameIndex QUAT A 0 5 + FrameIndex QUAT B 0 6 + FrameIndex QUAT C 0 7 + FrameIndex QUAT D 0 8 + FrameIndex QUAT E 0 9 + FrameIndex QUAT F 0 10 + FrameIndex QUAT G 0 11 + FrameIndex QUAT H 0 12 + FrameIndex QUAT I 0 13 + FrameIndex QUAT J 0 14 + FrameIndex QUAT K 0 15 + FrameIndex QUAT L 0 16 + FrameIndex QUAT M 0 17 + FrameIndex QUAT N 0 18 + FrameIndex QUAT O 0 19 + FrameIndex QUAT P 0 20 + FrameIndex QUAT Q 0 21 + FrameIndex QUAT R 0 22 + FrameIndex QUAT S 0 23 + FrameIndex QUAT T 0 24 + FrameIndex QUAT U 0 25 + // Select + FrameIndex QUAS A 0 26 + FrameIndex QUAS B 0 27 + FrameIndex QUAS C 0 28 + FrameIndex QUAS D 0 29 + FrameIndex QUAS E 0 30 + FrameIndex QUAS F 0 31 + FrameIndex QUAS G 0 32 + FrameIndex QUAS H 0 33 + FrameIndex QUAS I 0 34 + FrameIndex QUAS J 0 35 + FrameIndex QUAS K 0 36 + // Down + FrameIndex QUAD A 0 36 + FrameIndex QUAD B 0 37 + FrameIndex QUAD C 0 38 + FrameIndex QUAD D 0 39 + FrameIndex QUAD E 0 40 + FrameIndex QUAD F 0 41 + FrameIndex QUAD G 0 42 + FrameIndex QUAD H 0 43 + // Fire + FrameIndex QUAF A 0 44 + FrameIndex QUAF B 0 45 + FrameIndex QUAF C 0 46 + FrameIndex QUAF D 0 47 + FrameIndex QUAF E 0 48 + FrameIndex QUAF F 0 49 + FrameIndex QUAF G 0 50 + FrameIndex QUAF H 0 51 + FrameIndex QUAF I 0 52 + FrameIndex QUAF J 0 53 + FrameIndex QUAF K 0 54 + // Pump + FrameIndex QUAP A 0 54 + FrameIndex QUAP B 0 55 + FrameIndex QUAP C 0 56 + FrameIndex QUAP D 0 57 + FrameIndex QUAP E 0 58 + FrameIndex QUAP F 0 59 + FrameIndex QUAP G 0 60 + FrameIndex QUAP H 0 61 + FrameIndex QUAP I 0 62 + FrameIndex QUAP J 0 63 + FrameIndex QUAP K 0 64 + FrameIndex QUAP L 0 65 + FrameIndex QUAP M 0 66 + FrameIndex QUAP N 0 67 + FrameIndex QUAP O 0 68 + FrameIndex QUAP P 0 69 + FrameIndex QUAP Q 0 70 + FrameIndex QUAP R 0 71 + FrameIndex QUAP S 0 72 + FrameIndex QUAP T 0 73 + FrameIndex QUAP U 0 74 + FrameIndex QUAP V 0 75 + FrameIndex QUAP W 0 76 + FrameIndex QUAP X 0 77 + FrameIndex QUAP Y 0 78 + FrameIndex QUAP Z 0 79 + FrameIndex QUAP [ 0 80 + FrameIndex QUAP \ 0 81 + // AltFire + FrameIndex QUAA A 0 82 + FrameIndex QUAA B 0 83 + FrameIndex QUAA C 0 84 + FrameIndex QUAA D 0 85 + FrameIndex QUAA E 0 86 + FrameIndex QUAA F 0 87 + FrameIndex QUAA G 0 88 + FrameIndex QUAA H 0 89 + FrameIndex QUAA I 0 90 + FrameIndex QUAA J 0 91 + FrameIndex QUAA K 0 92 + FrameIndex QUAA L 0 93 + FrameIndex QUAA M 0 94 + FrameIndex QUAA N 0 95 + FrameIndex QUAA O 0 96 + FrameIndex QUAA P 0 97 + FrameIndex QUAA Q 0 98 + FrameIndex QUAA R 0 99 + FrameIndex QUAA S 0 100 + // Reload + FrameIndex QUAR A 0 101 + FrameIndex QUAR B 0 102 + FrameIndex QUAR C 0 103 + FrameIndex QUAR D 0 104 + FrameIndex QUAR E 0 105 + FrameIndex QUAR F 0 106 + FrameIndex QUAR G 0 107 + FrameIndex QUAR H 0 108 + FrameIndex QUAR I 0 109 + FrameIndex QUAR J 0 110 + FrameIndex QUAR K 0 111 + FrameIndex QUAR L 0 112 // open + FrameIndex QUAR M 0 113 + FrameIndex QUAR N 0 114 + FrameIndex QUAR O 0 115 + FrameIndex QUAR P 0 116 + FrameIndex QUAR Q 0 117 + FrameIndex QUAR R 0 118 + FrameIndex QUAR S 0 119 + FrameIndex QUAR T 0 120 + FrameIndex QUAR U 0 121 + FrameIndex QUAR V 0 122 // drop + FrameIndex QUAR W 0 123 + FrameIndex QUAR X 0 124 + FrameIndex QUAR Y 0 125 + FrameIndex QUAR Z 0 126 + FrameIndex QUAR [ 0 127 + FrameIndex QUAR \ 0 128 + FrameIndex QUAR ] 0 129 + FrameIndex QUR2 A 0 130 + FrameIndex QUR2 B 0 131 + FrameIndex QUR2 C 0 132 + FrameIndex QUR2 D 0 133 + FrameIndex QUR2 E 0 134 + FrameIndex QUR2 F 0 135 + FrameIndex QUR2 G 0 136 + FrameIndex QUR2 H 0 137 + FrameIndex QUR2 I 0 138 + FrameIndex QUR2 J 0 139 + FrameIndex QUR2 K 0 140 + FrameIndex QUR2 L 0 141 + FrameIndex QUR2 M 0 142 + FrameIndex QUR2 N 0 143 + FrameIndex QUR2 O 0 144 + FrameIndex QUR2 P 0 145 + FrameIndex QUR2 Q 0 146 + FrameIndex QUR2 R 0 147 + FrameIndex QUR2 S 0 148 // load + FrameIndex QUR2 T 0 149 + FrameIndex QUR2 U 0 150 + FrameIndex QUR2 V 0 151 + FrameIndex QUR2 W 0 152 + FrameIndex QUR2 X 0 153 + FrameIndex QUR2 Y 0 154 + FrameIndex QUR2 Z 0 155 + FrameIndex QUR2 [ 0 156 + FrameIndex QUR2 \ 0 157 + FrameIndex QUR2 ] 0 158 + FrameIndex QUR3 A 0 159 + FrameIndex QUR3 B 0 160 + FrameIndex QUR3 C 0 161 + FrameIndex QUR3 D 0 162 + FrameIndex QUR3 E 0 163 + FrameIndex QUR3 F 0 164 + FrameIndex QUR3 G 0 165 + FrameIndex QUR3 H 0 166 + FrameIndex QUR3 I 0 167 + FrameIndex QUR3 J 0 168 + FrameIndex QUR3 K 0 169 + FrameIndex QUR3 L 0 170 + FrameIndex QUR3 M 0 171 + FrameIndex QUR3 N 0 172 + FrameIndex QUR3 O 0 173 + FrameIndex QUR3 P 0 174 // load + FrameIndex QUR3 Q 0 175 + FrameIndex QUR3 R 0 176 + FrameIndex QUR3 S 0 177 + FrameIndex QUR3 T 0 178 + FrameIndex QUR3 U 0 179 + FrameIndex QUR3 V 0 180 + FrameIndex QUR3 W 0 181 + FrameIndex QUR3 X 0 182 + FrameIndex QUR3 Y 0 183 + FrameIndex QUR3 Z 0 184 + FrameIndex QUR3 [ 0 185 + FrameIndex QUR3 \ 0 186 + FrameIndex QUR3 ] 0 187 + FrameIndex QUR4 A 0 188 + FrameIndex QUR4 B 0 189 + FrameIndex QUR4 C 0 190 + FrameIndex QUR4 D 0 191 + FrameIndex QUR4 E 0 192 + FrameIndex QUR4 F 0 193 // close + FrameIndex QUR4 G 0 194 + FrameIndex QUR4 H 0 195 + FrameIndex QUR4 I 0 196 + FrameIndex QUR4 J 0 197 + FrameIndex QUR4 K 0 198 + FrameIndex QUR4 L 0 199 + FrameIndex QUR4 M 0 200 + FrameIndex QUR4 N 0 201 + FrameIndex QUR4 O 0 202 + FrameIndex QUR4 P 0 203 + FrameIndex QUR4 Q 0 204 +} \ No newline at end of file diff --git a/models/QuadShot_a.3d b/models/QuadShot_a.3d index 423e305..dbc2ab6 100644 Binary files a/models/QuadShot_a.3d and b/models/QuadShot_a.3d differ diff --git a/models/QuadShot_d.3d b/models/QuadShot_d.3d index 3ad42c8..1c87f29 100644 Binary files a/models/QuadShot_d.3d and b/models/QuadShot_d.3d differ diff --git a/sndinfo.txt b/sndinfo.txt index 132c280..ac95f36 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -229,6 +229,26 @@ umini/fire regf1 umini/altfire altf1 umini/unwind windd2 +quadshot/select quadsel +quadshot/fire quadfire +quadshot/alt quadalt +quadshot/pump1 qpump1 +quadshot/pump2 qpump2 +quadshot/open quadopen +quadshot/load1 quadloa1 +quadshot/load2 quadloa2 +quadshot/load3 quadloa3 +quadshot/load4 quadloa4 +$random quadshot/load { quadshot/load1 quadshot/load2 quadshot/load3 quadshot/load4 } +quadshot/close quadclos +quadshot/shell1 qshell1 +quadshot/shell2 qshell2 +quadshot/shell3 qshell3 +quadshot/shell4 qshell4 +quadshot/shell5 qshell5 +quadshot/shell6 qshell6 +$random quadshot/shell { quadshot/shell1 quadshot/shell2 quadshot/shell3 quadshot/shell4 quadshot/shell5 quadshot/shell6 } + translator/event transa3 detector/start detact diff --git a/textures.quadshot b/textures.quadshot index 8f6a1c2..5ce2d24 100644 --- a/textures.quadshot +++ b/textures.quadshot @@ -1,3 +1,3 @@ Sprite "QAMOA0",1,1{} -Sprite "QUAPA0",1,1{} +Sprite "QSPKA0",1,1{} Sprite "QUASA0",1,1{} diff --git a/zscript/betamag.zsc b/zscript/betamag.zsc index dbeb039..a5d3137 100644 --- a/zscript/betamag.zsc +++ b/zscript/betamag.zsc @@ -2,9 +2,9 @@ Class Betamag : UnrealWeapon { Default { - Tag "$T_BETAMAG"; + Tag "$T_PROTOMAG"; Inventory.Icon "I_ClipAm"; - Inventory.PickupMessage "$I_BETAMAG"; + Inventory.PickupMessage "$I_PROTOMAG"; Inventory.MaxAmount 1; Inventory.InterHubAmount 2; Weapon.UpSound "betamag/select"; diff --git a/zscript/quadshot.zsc b/zscript/quadshot.zsc index eb023e9..672b375 100644 --- a/zscript/quadshot.zsc +++ b/zscript/quadshot.zsc @@ -6,9 +6,9 @@ Class UShells : Ammo Inventory.Icon "I_ShotSh"; Inventory.PickupMessage ""; Inventory.Amount 12; - Inventory.MaxAmount 60; + Inventory.MaxAmount 48; Ammo.BackpackAmount 12; - Ammo.BackpackMaxAmount 120; + Ammo.BackpackMaxAmount 96; Ammo.DropAmount 6; } override String PickupMessage() @@ -37,10 +37,211 @@ Class UShells2 : UShells Class QCasing : UCasing { + Default + { + BounceSound "quadshot/shell"; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + heat = 0.; // no smoke + } +} + +Class QuadshotTracer : LineTracer +{ + Actor ignoreme; + + override ETraceStatus TraceCallback() + { + if ( Results.HitType == TRACE_HitActor ) + { + if ( Results.HitActor == ignoreme ) return TRACE_Skip; + if ( Results.HitActor.bSHOOTABLE ) + { + int amt = FlakAccumulator.GetAmount(Results.HitActor); + // getgibhealth isn't clearscope, fuck + int gibhealth = -int(Results.HitActor.GetSpawnHealth()*gameinfo.gibfactor); + if ( Results.HitActor.GibHealth != int.min ) gibhealth = -abs(Results.HitActor.GibHealth); + // go through actors that are already gibbed + if ( Results.HitActor.health-amt <= gibhealth ) return TRACE_Skip; + return TRACE_Stop; + } + return TRACE_Skip; + } + else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) + { + if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&(Line.ML_BlockHitscan|Line.ML_BlockEverything)) ) + return TRACE_Stop; + return TRACE_Skip; + } + return TRACE_Stop; + } } Class QuadShot : UnrealWeapon { + int clipcount; + QuadshotTracer t; + + action void ProcessTraceHit( Linetracer t ) + { + if ( t.Results.HitType == TRACE_HitActor ) + { + int dmg = Random[Quadshot](8,12); + FlakAccumulator.Accumulate(t.Results.HitActor,dmg,invoker,self,'shot'); + double mm = 2400; + UTMainHandler.DoKnockback(t.Results.HitActor,t.Results.HitVector+(0,0,0.025),mm*FRandom[Quadshot](0.4,1.2)); + if ( t.Results.HitActor.bNOBLOOD ) + { + let p = Spawn("BulletImpact",t.Results.HitPos); + p.scale *= FRandom[Quadshot](0.2,0.4); + p.angle = atan2(t.Results.HitVector.y,t.Results.HitVector.x)+180; + p.pitch = asin(t.Results.HitVector.z); + } + else + { + t.Results.HitActor.TraceBleed(dmg,self); + t.Results.HitActor.SpawnBlood(t.Results.HitPos,atan2(t.Results.HitVector.y,t.Results.HitVector.x)+180,dmg); + } + } + else if ( t.Results.HitType != TRACE_HitNone ) + { + Vector3 hitnormal = -t.Results.HitVector; + if ( t.Results.HitType == TRACE_HitFloor ) + { + if ( t.Results.FFloor ) hitnormal = -t.Results.FFloor.top.Normal; + else hitnormal = t.Results.HitSector.floorplane.Normal; + } + else if ( t.Results.HitType == TRACE_HitCeiling ) + { + if ( t.Results.FFloor ) hitnormal = -t.Results.FFloor.bottom.Normal; + else hitnormal = t.Results.HitSector.ceilingplane.Normal; + } + else if ( t.Results.HitType == TRACE_HitWall ) + { + hitnormal = (-t.Results.HitLine.delta.y,t.Results.HitLine.delta.x,0).unit(); + if ( !t.Results.Side ) hitnormal *= -1; + } + let p = Spawn("BulletImpact",t.Results.HitPos+hitnormal*0.01); + p.scale *= FRandom[Quadshot](0.2,0.4); + p.angle = atan2(hitnormal.y,hitnormal.x); + p.pitch = asin(-hitnormal.z); + if ( t.Results.HitLine ) t.Results.HitLine.RemoteActivate(self,t.Results.Side,SPAC_Impact,t.Results.HitPos); + } + } + + action void A_QuadshotFire( bool bAlt = false ) + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + if ( bAlt && (invoker.clipcount > 2) ) + { + // fall back to normal fire strength + player.SetPSprite(PSP_WEAPON,invoker.FindState("Fire")); + return; + } + Vector3 x, y, z, x2, y2, z2; + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); + Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+y*2-z*2); + [x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll); + double a, s; + Vector3 dir; + FLineTraceData d; + if ( bAlt ) + { + A_QuakeEx(1,1,1,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.12); + A_PlaySound("quadshot/alt",CHAN_WEAPON,!Dampener.Active(self)?1.:.2); + A_PlaySound("quadshot/alt",CHAN_7,!Dampener.Active(self)?1.:.2); + double spread = (4-invoker.clipcount); + for ( int i=invoker.clipcount; i<4; i++ ) + { + for ( int i=0; i<3; i++ ) + UTMainHandler.DoSwing(self,(FRandom[Quadshot](-0.04,-0.2),FRandom[Quadshot](-0.2,0.2)),FRandom[Quadshot](2,4),FRandom[Quadshot](-0.2,0.5),Random[Quadshot](3,4),SWING_Spring,Random[Quadshot](1,6),FRandom[Quadshot](0.8,1.4)); + weap.DepleteAmmo(weap.bAltFire,true,1); + for ( int i=0; i<10; i++ ) + { + a = FRandom[Quadshot](0,360); + s = FRandom[Quadshot](0,0.09+0.05*spread); + dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); + if ( !invoker.t ) invoker.t = new("QuadshotTracer"); + invoker.t.ignoreme = self; + invoker.t.Trace(origin,CurSector,dir,10000,0); + ProcessTraceHit(invoker.t); + } + } + vel += (0,0,(0.3+0.3*spread))-x*(1.5+1.1*spread); + invoker.clipcount = 4; + } + else + { + A_QuakeEx(1,1,1,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.12); + A_PlaySound("quadshot/fire",CHAN_WEAPON,!Dampener.Active(self)?1.:.2); + A_PlaySound("quadshot/fire",CHAN_7,!Dampener.Active(self)?1.:.2); + for ( int i=0; i<3; i++ ) + UTMainHandler.DoSwing(self,(FRandom[Quadshot](-0.04,-0.2),FRandom[Quadshot](-0.2,0.2)),FRandom[Quadshot](2,3),FRandom[Quadshot](-0.2,0.5),Random[Quadshot](2,3),SWING_Spring,Random[Quadshot](0,3),FRandom[Quadshot](0.8,1.4)); + weap.DepleteAmmo(weap.bAltFire,true,1); + for ( int i=0; i<10; i++ ) + { + a = FRandom[Quadshot](0,360); + s = FRandom[Quadshot](0,0.08); + dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); + if ( !invoker.t ) invoker.t = new("QuadshotTracer"); + invoker.t.ignoreme = self; + invoker.t.Trace(origin,CurSector,dir,10000,0); + ProcessTraceHit(invoker.t); + } + vel += (0,0,0.3)-x*1.5; + invoker.clipcount++; + } + if ( bAlt ) A_Overlay(-2,"MuzzleFlashAlt"); + else A_Overlay(-2,"MuzzleFlash"); + A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); + A_OverlayRenderstyle(-2,STYLE_Add); + if ( !Dampener.Active(self) ) A_AlertMonsters(); + invoker.FireEffect(); + UTMainHandler.DoFlash(self,Color(32,255,128,0),1); + int numpt = bAlt?40:15; + for ( int i=0; i 3 ) + { + if ( weap.Ammo1.Amount > 3 ) + { + player.SetPSprite(PSP_WEAPON,invoker.FindState("Reload")); + return true; + } + else if ( bDryFire ) + { + player.SetPSprite(PSP_WEAPON,invoker.FindState("DryFire")); + return true; + } + } + return false; + } Default { Tag "$T_QUADSHOT"; @@ -59,9 +260,109 @@ Class QuadShot : UnrealWeapon States { Spawn: - QUAP A -1; + QSPK A -1; Stop; - QUAP B -1; + QSPK B -1; + Stop; + Select: + QUAS A 1 A_Raise(int.max); + Wait; + Ready: + QUAS ABCDEFGHIJK 2 A_WeaponReady(WRF_NOFIRE); + Goto Idle; + Dummy: + TNT1 A 1 + { + A_CheckReload(); + if ( !A_QuadshotCheckForReload() ) + A_WeaponReady(); + } + Wait; + Idle: + QUAI A 0 A_Overlay(-9999,"Dummy"); + QUAI A 50; + QUAI A 0 A_Jump(40,"Twiddle"); + Goto Idle+1; + Twiddle: + #### # 2; + QUAT ABCDEFGHIJKLMNOPQRSTU 2; + Goto Idle+1; + Fire: + #### # 1 + { + if ( !A_QuadshotCheckForReload(true) ) + { + A_Overlay(-9999,"Null"); + A_QuadshotFire(); + } + } + QUAF ABCDEFGHIJK 1; + Goto Pump; + DryFire: + #### # 1 + { + A_Overlay(-9999,"Null"); + A_PlaySound("automag/click",CHAN_WEAPON,Dampener.Active(self)?.05:.5); + } + QUAF AJK 2; + Goto Idle; + AltFire: + #### # 1 + { + if ( !A_QuadshotCheckForReload(true) ) + { + A_Overlay(-9999,"Null"); + A_QuadshotFire(true); + } + } + QUAA ABCDEFGHIJKLMNOPQRS 1; + Goto Idle; + Pump: + QUAP ABCD 1; + QUAP E 0 A_PlaySound("quadshot/pump1",CHAN_6,Dampener.Active(self)?.1:1.); + QUAP EFGHIJKLM 1; + QUAP N 0 A_PlaySound("quadshot/pump2",CHAN_6,Dampener.Active(self)?.1:1.); + QUAP NOPQRSTUVWXYZ[\ 1; + QUAP \ 0; + QUAI A 0; // force no tween + Goto Idle; + Reload: + QUAR A 0 A_Overlay(-9999,"Null"); + QUAR ABCDEFGHIJK 1; + QUAR L 0 A_PlaySound("quadshot/open",CHAN_6,Dampener.Active(self)?.1:1.); + QUAR LMNOPQRSTU 1; + QUAR V 0 A_DropShells(); + QUAR VWXYZ[\] 1; + QUR2 ABCDEFGHIJKLMNOPQR 1; + QUR2 S 0 A_PlaySound("quadshot/load",CHAN_6,Dampener.Active(self)?.1:1.); + QUR2 STUVWXYZ[\] 1; + QUR3 ABCDEFGHIJKLMNO 1; + QUR3 P 0 A_PlaySound("quadshot/load",CHAN_6,Dampener.Active(self)?.1:1.); + QUR3 PQRSTUVWXYZ[\] 1; + QUR4 ABCDE 1; + QUR4 F 0 A_PlaySound("quadshot/close",CHAN_6,Dampener.Active(self)?.1:1.); + QUR4 FGHIJKLMNOPQ 1; + QUAI A 0 { invoker.clipcount = 0; } + Goto Idle; + Deselect: + #### # 1 A_Overlay(-9999,"Null"); + QUAD ABCDEFG 1; + QUAD G 1 A_Lower(int.max); + Wait; + MuzzleFlash: + QFLA A 3 Bright + { + let l = Spawn("EnforcerLight",pos); + l.target = self; + } + Stop; + MuzzleFlashAlt: + QFLA B 3 Bright + { + let l = Spawn("EnforcerLight",pos); + l.target = self; + l.args[3] += 20; + } Stop; } }