From bef29efba380d7642d19593af5a2ff593796c1b4 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Sun, 27 May 2018 17:13:58 +0200 Subject: [PATCH] Implemented Enforcer (with dual option). Tweaked some offsets on junk. Added clip count displays. Only 4 weapons remaining... --- decaldef.txt | 35 +++ modeldef.enforcer | 355 ++++++++++++++++++++++++++++ modeldef.flak | 98 ++++---- modeldef.misc | 4 +- modeldef.pulse | 2 +- models/EMuz1.png | Bin 0 -> 13648 bytes readme.txt | 4 +- sndinfo.txt | 10 + textures.enforcer | 252 ++++++++++++++++++++ zscript/chainsaw.zsc | 14 +- zscript/enforcer.zsc | 486 ++++++++++++++++++++++++++++++++++++++- zscript/flakcannon.zsc | 9 +- zscript/impacthammer.zsc | 18 +- zscript/pulsegun.zsc | 6 + zscript/utcommon.zsc | 5 +- 15 files changed, 1210 insertions(+), 88 deletions(-) create mode 100644 models/EMuz1.png diff --git a/decaldef.txt b/decaldef.txt index b5e781f..a8fc503 100644 --- a/decaldef.txt +++ b/decaldef.txt @@ -135,3 +135,38 @@ decal ImpactMark x-scale 0.25 y-scale 0.25 } + +decal Pock1 +{ + pic pock0_t + shade "00 00 00" + x-scale 0.1 + y-scale 0.1 + randomflipx + randomflipy +} +decal Pock2 +{ + pic pock2_t + shade "00 00 00" + x-scale 0.1 + y-scale 0.1 + randomflipx + randomflipy +} +decal Pock3 +{ + pic pock4_t + shade "00 00 00" + x-scale 0.1 + y-scale 0.1 + randomflipx + randomflipy +} + +decalgroup Pock +{ + Pock1 1 + Pock2 1 + Pock3 1 +} diff --git a/modeldef.enforcer b/modeldef.enforcer index bb1fb95..ec1a99c 100644 --- a/modeldef.enforcer +++ b/modeldef.enforcer @@ -10,6 +10,22 @@ Model "EClip" FrameIndex ECLP A 0 0 } +Model "UTCasing" +{ + Path "models" + Model 0 "Shellc_d.3d" + Skin 0 "Shellcase1.png" + Scale -0.014 0.014 0.0168 + ZOffset 1 + USEACTORPITCH + USEACTORROLL + DONTCULLBACKFACES + USEROTATIONCENTER + Rotation-Center 0 0 1 + + FrameIndex PCAS A 0 0 +} + Model "Enforcer" { Path "models" @@ -35,3 +51,342 @@ Model "Enforcer" FrameIndex ENFP B 1 0 } + +Model "Enforcer" +{ + Path "models" + Model 3 "Flat_d.3d" + Skin 3 "EMuz1.png" + PitchOffset 90 + Scale 0.04 0.04 0.04 + Offset 10.4 -25.0 -2.9 + + FrameIndex EMUZ A 3 0 +} +Model "Enforcer" +{ + Path "models" + Model 3 "Flat_d.3d" + Skin 3 "EMuz1.png" + PitchOffset 90 + Scale 0.04 0.04 0.04 + Offset 1.9 -25.0 -9.3 + + FrameIndex EMUZ B 3 0 +} +Model "Enforcer" +{ + Path "models" + Model 3 "Flat_d.3d" + Skin 3 "EMuz1.png" + PitchOffset 90 + Scale 0.04 0.04 0.04 + Offset -10.4 -25.0 -2.9 + + FrameIndex EMUZ C 3 0 +} +Model "Enforcer" +{ + Path "models" + Model 3 "Flat_d.3d" + Skin 3 "EMuz1.png" + PitchOffset 90 + Scale 0.04 0.04 0.04 + Offset -1.9 -25.0 -9.3 + + FrameIndex EMUZ D 3 0 +} + +Model "Enforcer" +{ + Path "models" + Model 0 "AutoMR_d.3d" + SurfaceSkin 0 0 "Jtutot1.png" + SurfaceSkin 0 1 "Jtutot2.png" + SurfaceSkin 0 2 "Jtutot3.png" + SurfaceSkin 0 3 "Jtutot4.png" + Scale 0.14 0.08 0.12 + Offset 8.6 -12.8 -13.5 + PitchOffset 90 + + // Fire + FrameIndex ENFF A 0 6 + FrameIndex ENFF B 0 7 + FrameIndex ENFF C 0 8 + FrameIndex ENFF D 0 9 + FrameIndex ENFF E 0 10 + FrameIndex ENFF F 0 11 + FrameIndex ENFF G 0 12 + FrameIndex ENFF H 0 13 + FrameIndex ENFF I 0 14 + FrameIndex ENFF J 0 15 + // Reload + FrameIndex ENFR A 0 22 + FrameIndex ENFR B 0 23 + FrameIndex ENFR C 0 24 + FrameIndex ENFR D 0 25 + FrameIndex ENFR E 0 26 + FrameIndex ENFR F 0 27 + FrameIndex ENFR G 0 28 + FrameIndex ENFR H 0 29 + FrameIndex ENFR I 0 30 + FrameIndex ENFR J 0 31 + FrameIndex ENFR K 0 32 + FrameIndex ENFR L 0 33 + FrameIndex ENFR M 0 34 + FrameIndex ENFR N 0 35 + FrameIndex ENFR O 0 36 + FrameIndex ENFR P 0 37 + FrameIndex ENFR Q 0 38 + FrameIndex ENFR R 0 39 + FrameIndex ENFR S 0 40 + FrameIndex ENFR T 0 41 + FrameIndex ENFR U 0 42 + FrameIndex ENFR V 0 43 + FrameIndex ENFR W 0 44 + FrameIndex ENFR X 0 45 + FrameIndex ENFR Y 0 46 + FrameIndex ENFR Z 0 47 + FrameIndex ENR2 A 0 48 + FrameIndex ENR2 B 0 49 + // Select + FrameIndex ENFS A 0 60 + FrameIndex ENFS B 0 61 + FrameIndex ENFS C 0 62 + FrameIndex ENFS D 0 63 + FrameIndex ENFS E 0 64 + FrameIndex ENFS F 0 65 + FrameIndex ENFS G 0 66 + FrameIndex ENFS H 0 67 + FrameIndex ENFS I 0 68 + FrameIndex ENFS J 0 69 + FrameIndex ENFS K 0 70 + FrameIndex ENFS L 0 71 + FrameIndex ENFS M 0 72 + FrameIndex ENFS N 0 73 + FrameIndex ENFS O 0 74 + FrameIndex ENFS P 0 75 + FrameIndex ENFS Q 0 76 + FrameIndex ENFS R 0 77 + FrameIndex ENFS S 0 78 + FrameIndex ENFS T 0 79 + FrameIndex ENFS U 0 80 + FrameIndex ENFS V 0 81 + FrameIndex ENFS W 0 82 + FrameIndex ENFS X 0 83 + FrameIndex ENFS Y 0 84 + FrameIndex ENFS Z 0 85 + // Idle + FrameIndex ENFI A 0 86 + FrameIndex ENFI B 0 87 + // Twiddle + FrameIndex ENFT A 0 87 + FrameIndex ENFT B 0 88 + FrameIndex ENFT C 0 89 + FrameIndex ENFT D 0 90 + FrameIndex ENFT E 0 91 + FrameIndex ENFT F 0 92 + FrameIndex ENFT G 0 93 + FrameIndex ENFT H 0 94 + FrameIndex ENFT I 0 95 + FrameIndex ENFT J 0 96 + FrameIndex ENFT K 0 97 + FrameIndex ENFT L 0 98 + FrameIndex ENFT M 0 99 + FrameIndex ENFT N 0 100 + FrameIndex ENFT O 0 101 + FrameIndex ENFT P 0 102 + FrameIndex ENFT Q 0 103 + FrameIndex ENFT R 0 104 + FrameIndex ENFT S 0 105 + FrameIndex ENFT T 0 106 + FrameIndex ENFT U 0 107 + FrameIndex ENFT V 0 108 + FrameIndex ENFT W 0 109 + FrameIndex ENFT X 0 110 + FrameIndex ENFT Y 0 111 + // Down + FrameIndex ENFD A 0 115 + FrameIndex ENFD B 0 116 + FrameIndex ENFD C 0 117 + FrameIndex ENFD D 0 118 + FrameIndex ENFD E 0 119 + FrameIndex ENFD F 0 120 + FrameIndex ENFD G 0 121 + FrameIndex ENFD H 0 122 + FrameIndex ENFD I 0 123 + FrameIndex ENFD J 0 124 + FrameIndex ENFD K 0 125 + FrameIndex ENFD L 0 126 + // T1 + FrameIndex ENFA A 0 130 + FrameIndex ENFA B 0 131 + FrameIndex ENFA C 0 132 + FrameIndex ENFA D 0 133 + FrameIndex ENFA E 0 134 + FrameIndex ENFA F 0 135 + // Alt Fire + FrameIndex ENFA G 0 136 + FrameIndex ENFA H 0 137 + FrameIndex ENFA I 0 138 + FrameIndex ENFA J 0 139 + FrameIndex ENFA K 0 140 + FrameIndex ENFA L 0 141 + FrameIndex ENFA M 0 142 + FrameIndex ENFA N 0 143 + // T2 + FrameIndex ENFA O 0 144 + FrameIndex ENFA P 0 145 + FrameIndex ENFA Q 0 146 + FrameIndex ENFA R 0 147 + FrameIndex ENFA S 0 148 + FrameIndex ENFA T 0 149 + FrameIndex ENFA U 0 150 +} + +Model "Enforcer" +{ + Path "models" + Model 2 "AutoML_d.3d" + SurfaceSkin 2 0 "Jtutot1.png" + SurfaceSkin 2 1 "Jtutot2.png" + SurfaceSkin 2 2 "Jtutot3.png" + SurfaceSkin 2 3 "Jtutot4.png" + Scale 0.14 0.08 0.12 + Offset -8.8 -12.8 -13.5 + PitchOffset 90 + + // Fire + FrameIndex 2NFF A 2 6 + FrameIndex 2NFF B 2 7 + FrameIndex 2NFF C 2 8 + FrameIndex 2NFF D 2 9 + FrameIndex 2NFF E 2 10 + FrameIndex 2NFF F 2 11 + FrameIndex 2NFF G 2 12 + FrameIndex 2NFF H 2 13 + FrameIndex 2NFF I 2 14 + FrameIndex 2NFF J 2 15 + // Reload + FrameIndex 2NFR A 2 22 + FrameIndex 2NFR B 2 23 + FrameIndex 2NFR C 2 24 + FrameIndex 2NFR D 2 25 + FrameIndex 2NFR E 2 26 + FrameIndex 2NFR F 2 27 + FrameIndex 2NFR G 2 28 + FrameIndex 2NFR H 2 29 + FrameIndex 2NFR I 2 30 + FrameIndex 2NFR J 2 31 + FrameIndex 2NFR K 2 32 + FrameIndex 2NFR L 2 33 + FrameIndex 2NFR M 2 34 + FrameIndex 2NFR N 2 35 + FrameIndex 2NFR O 2 36 + FrameIndex 2NFR P 2 37 + FrameIndex 2NFR Q 2 38 + FrameIndex 2NFR R 2 39 + FrameIndex 2NFR S 2 40 + FrameIndex 2NFR T 2 41 + FrameIndex 2NFR U 2 42 + FrameIndex 2NFR V 2 43 + FrameIndex 2NFR W 2 44 + FrameIndex 2NFR X 2 45 + FrameIndex 2NFR Y 2 46 + FrameIndex 2NFR Z 2 47 + FrameIndex 2NR2 A 2 48 + FrameIndex 2NR2 B 2 49 + // Select + FrameIndex 2NFS A 2 60 + FrameIndex 2NFS B 2 61 + FrameIndex 2NFS C 2 62 + FrameIndex 2NFS D 2 63 + FrameIndex 2NFS E 2 64 + FrameIndex 2NFS F 2 65 + FrameIndex 2NFS G 2 66 + FrameIndex 2NFS H 2 67 + FrameIndex 2NFS I 2 68 + FrameIndex 2NFS J 2 69 + FrameIndex 2NFS K 2 70 + FrameIndex 2NFS L 2 71 + FrameIndex 2NFS M 2 72 + FrameIndex 2NFS N 2 73 + FrameIndex 2NFS O 2 74 + FrameIndex 2NFS P 2 75 + FrameIndex 2NFS Q 2 76 + FrameIndex 2NFS R 2 77 + FrameIndex 2NFS S 2 78 + FrameIndex 2NFS T 2 79 + FrameIndex 2NFS U 2 80 + FrameIndex 2NFS V 2 81 + FrameIndex 2NFS W 2 82 + FrameIndex 2NFS X 2 83 + FrameIndex 2NFS Y 2 84 + FrameIndex 2NFS Z 2 85 + // Idle + FrameIndex 2NFI A 2 86 + FrameIndex 2NFI B 2 87 + // Twiddle + FrameIndex 2NFT A 2 87 + FrameIndex 2NFT B 2 88 + FrameIndex 2NFT C 2 89 + FrameIndex 2NFT D 2 90 + FrameIndex 2NFT E 2 91 + FrameIndex 2NFT F 2 92 + FrameIndex 2NFT G 2 93 + FrameIndex 2NFT H 2 94 + FrameIndex 2NFT I 2 95 + FrameIndex 2NFT J 2 96 + FrameIndex 2NFT K 2 97 + FrameIndex 2NFT L 2 98 + FrameIndex 2NFT M 2 99 + FrameIndex 2NFT N 2 100 + FrameIndex 2NFT O 2 101 + FrameIndex 2NFT P 2 102 + FrameIndex 2NFT Q 2 103 + FrameIndex 2NFT R 2 104 + FrameIndex 2NFT S 2 105 + FrameIndex 2NFT T 2 106 + FrameIndex 2NFT U 2 107 + FrameIndex 2NFT V 2 108 + FrameIndex 2NFT W 2 109 + FrameIndex 2NFT X 2 110 + FrameIndex 2NFT Y 2 111 + // Down + FrameIndex 2NFD A 2 115 + FrameIndex 2NFD B 2 116 + FrameIndex 2NFD C 2 117 + FrameIndex 2NFD D 2 118 + FrameIndex 2NFD E 2 119 + FrameIndex 2NFD F 2 120 + FrameIndex 2NFD G 2 121 + FrameIndex 2NFD H 2 122 + FrameIndex 2NFD I 2 123 + FrameIndex 2NFD J 2 124 + FrameIndex 2NFD K 2 125 + FrameIndex 2NFD L 2 126 + // T1 + FrameIndex 2NFA A 2 130 + FrameIndex 2NFA B 2 131 + FrameIndex 2NFA C 2 132 + FrameIndex 2NFA D 2 133 + FrameIndex 2NFA E 2 134 + FrameIndex 2NFA F 2 135 + // Alt Fire + FrameIndex 2NFA G 2 136 + FrameIndex 2NFA H 2 137 + FrameIndex 2NFA I 2 138 + FrameIndex 2NFA J 2 139 + FrameIndex 2NFA K 2 140 + FrameIndex 2NFA L 2 141 + FrameIndex 2NFA M 2 142 + FrameIndex 2NFA N 2 143 + // T2 + FrameIndex 2NFA O 2 144 + FrameIndex 2NFA P 2 145 + FrameIndex 2NFA Q 2 146 + FrameIndex 2NFA R 2 147 + FrameIndex 2NFA S 2 148 + FrameIndex 2NFA T 2 149 + FrameIndex 2NFA U 2 150 +} \ No newline at end of file diff --git a/modeldef.flak b/modeldef.flak index 32d20ca..04a6dfd 100644 --- a/modeldef.flak +++ b/modeldef.flak @@ -44,7 +44,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 A 0 0 } @@ -58,7 +58,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 B 0 0 } @@ -72,7 +72,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 C 0 0 } @@ -86,7 +86,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 D 0 0 } @@ -100,7 +100,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 E 0 0 } @@ -114,7 +114,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 F 0 0 } @@ -128,7 +128,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 G 0 0 } @@ -142,7 +142,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 H 0 0 } @@ -156,7 +156,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 I 0 0 } @@ -170,7 +170,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 J 0 0 } @@ -184,7 +184,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 K 0 0 } @@ -198,7 +198,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 L 0 0 } @@ -213,7 +213,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 A 1 0 } @@ -227,7 +227,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 B 1 0 } @@ -241,7 +241,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 C 1 0 } @@ -255,7 +255,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 D 1 0 } @@ -269,7 +269,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 E 1 0 } @@ -283,7 +283,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 F 1 0 } @@ -297,7 +297,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 G 1 0 } @@ -311,7 +311,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 H 1 0 } @@ -325,7 +325,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 I 1 0 } @@ -339,7 +339,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 J 1 0 } @@ -353,7 +353,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 K 1 0 } @@ -367,7 +367,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 L 1 0 } @@ -382,7 +382,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 A 2 0 } @@ -396,7 +396,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 B 2 0 } @@ -410,7 +410,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 C 2 0 } @@ -424,7 +424,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 D 2 0 } @@ -438,7 +438,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 E 2 0 } @@ -452,7 +452,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 F 2 0 } @@ -466,7 +466,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 G 2 0 } @@ -480,7 +480,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 H 2 0 } @@ -494,7 +494,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 I 2 0 } @@ -508,7 +508,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 J 2 0 } @@ -522,7 +522,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 K 2 0 } @@ -536,7 +536,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 L 2 0 } @@ -551,7 +551,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 A 3 0 } @@ -565,7 +565,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 B 3 0 } @@ -579,7 +579,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 C 3 0 } @@ -593,7 +593,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 D 3 0 } @@ -607,7 +607,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 E 3 0 } @@ -621,7 +621,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 F 3 0 } @@ -635,7 +635,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 G 3 0 } @@ -649,7 +649,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 H 3 0 } @@ -663,7 +663,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 I 3 0 } @@ -677,7 +677,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 J 3 0 } @@ -691,7 +691,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 K 3 0 } @@ -705,7 +705,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 L 3 0 } @@ -747,7 +747,7 @@ Model "FlakCannon" Scale 0.08 0.08 0.08 Offset 4.0 -25.0 -7.5 - FrameIndex FMUZ A 0 0 + FrameIndex FMUZ A 2 0 } Model "FlakCannon" diff --git a/modeldef.misc b/modeldef.misc index abc79ec..3018f42 100644 --- a/modeldef.misc +++ b/modeldef.misc @@ -331,8 +331,8 @@ Model "UTChip" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 - ZOffset 2 + Rotation-Center 0 0 0 + ZOffset 1 FrameIndex CHIP A 0 0 FrameIndex CHIP B 0 1 diff --git a/modeldef.pulse b/modeldef.pulse index c2254e7..e21553c 100644 --- a/modeldef.pulse +++ b/modeldef.pulse @@ -45,7 +45,7 @@ Model "PulseGun" Scale 0.08 0.08 0.08 Offset 8.5 -25.0 -4.5 - FrameIndex PMUZ A 0 0 + FrameIndex PMUZ A 2 0 } Model "PulseGun" diff --git a/models/EMuz1.png b/models/EMuz1.png new file mode 100644 index 0000000000000000000000000000000000000000..c5b182c8e944a708283c9b3bd1c40d509713ee4b GIT binary patch literal 13648 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 literal 0 HcmV?d00001 diff --git a/readme.txt b/readme.txt index cb2f981..c1cafb5 100644 --- a/readme.txt +++ b/readme.txt @@ -33,11 +33,11 @@ Currently implemented: - Impact Hammer (slot 1) - Chainsaw (slot 1) - Translocator (slot 1) + - Enforcer (slot 2) + - Dual Enforcers (slot 2) In progress: - - Enforcer (slot 2) - - Dual Enforcers (slot 2) - Ripper (slot 6) - Minigun (slot 7) - Rocket Launcher (slot 9) diff --git a/sndinfo.txt b/sndinfo.txt index 5bbcb66..936e932 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -139,6 +139,16 @@ transloc/spark tdisrupt transloc/bounce hit1 transloc/hum targeth +enforcer/select cocking +enforcer/shoot e_shot +enforcer/reload reload +enforcer/click click + +bullet/casing shell2 +bullet/hit1 impact1 +bullet/hit2 impact2 +$random bullet/hit { bullet/hit1 bullet/hit2 } + ges/hit gelhit ges/select gelselec ges/fire gelshot diff --git a/textures.enforcer b/textures.enforcer index cbcd74b..8fe10fc 100644 --- a/textures.enforcer +++ b/textures.enforcer @@ -1,3 +1,255 @@ Sprite "ECLPA0",1,1{} Sprite "ENFPA0",1,1{} Sprite "ENFPB0",1,1{} +Sprite "ENFFA0",1,1{} +Sprite "ENFFB0",1,1{} +Sprite "ENFFC0",1,1{} +Sprite "ENFFD0",1,1{} +Sprite "ENFFE0",1,1{} +Sprite "ENFFF0",1,1{} +Sprite "ENFFG0",1,1{} +Sprite "ENFFH0",1,1{} +Sprite "ENFFI0",1,1{} +Sprite "ENFFJ0",1,1{} +Sprite "ENFRA0",1,1{} +Sprite "ENFRB0",1,1{} +Sprite "ENFRC0",1,1{} +Sprite "ENFRD0",1,1{} +Sprite "ENFRE0",1,1{} +Sprite "ENFRF0",1,1{} +Sprite "ENFRG0",1,1{} +Sprite "ENFRH0",1,1{} +Sprite "ENFRI0",1,1{} +Sprite "ENFRJ0",1,1{} +Sprite "ENFRK0",1,1{} +Sprite "ENFRL0",1,1{} +Sprite "ENFRM0",1,1{} +Sprite "ENFRN0",1,1{} +Sprite "ENFRO0",1,1{} +Sprite "ENFRP0",1,1{} +Sprite "ENFRQ0",1,1{} +Sprite "ENFRR0",1,1{} +Sprite "ENFRS0",1,1{} +Sprite "ENFRT0",1,1{} +Sprite "ENFRU0",1,1{} +Sprite "ENFRV0",1,1{} +Sprite "ENFRW0",1,1{} +Sprite "ENFRX0",1,1{} +Sprite "ENFRY0",1,1{} +Sprite "ENFRZ0",1,1{} +Sprite "ENR2A0",1,1{} +Sprite "ENR2B0",1,1{} +Sprite "ENFSA0",1,1{} +Sprite "ENFSB0",1,1{} +Sprite "ENFSC0",1,1{} +Sprite "ENFSD0",1,1{} +Sprite "ENFSE0",1,1{} +Sprite "ENFSF0",1,1{} +Sprite "ENFSG0",1,1{} +Sprite "ENFSH0",1,1{} +Sprite "ENFSI0",1,1{} +Sprite "ENFSJ0",1,1{} +Sprite "ENFSK0",1,1{} +Sprite "ENFSL0",1,1{} +Sprite "ENFSM0",1,1{} +Sprite "ENFSN0",1,1{} +Sprite "ENFSO0",1,1{} +Sprite "ENFSP0",1,1{} +Sprite "ENFSQ0",1,1{} +Sprite "ENFSR0",1,1{} +Sprite "ENFSS0",1,1{} +Sprite "ENFST0",1,1{} +Sprite "ENFSU0",1,1{} +Sprite "ENFSV0",1,1{} +Sprite "ENFSW0",1,1{} +Sprite "ENFSX0",1,1{} +Sprite "ENFSY0",1,1{} +Sprite "ENFSZ0",1,1{} +Sprite "ENFIA0",1,1{} +Sprite "ENFIB0",1,1{} +Sprite "ENFTA0",1,1{} +Sprite "ENFTB0",1,1{} +Sprite "ENFTC0",1,1{} +Sprite "ENFTD0",1,1{} +Sprite "ENFTE0",1,1{} +Sprite "ENFTF0",1,1{} +Sprite "ENFTG0",1,1{} +Sprite "ENFTH0",1,1{} +Sprite "ENFTI0",1,1{} +Sprite "ENFTJ0",1,1{} +Sprite "ENFTK0",1,1{} +Sprite "ENFTL0",1,1{} +Sprite "ENFTM0",1,1{} +Sprite "ENFTN0",1,1{} +Sprite "ENFTO0",1,1{} +Sprite "ENFTP0",1,1{} +Sprite "ENFTQ0",1,1{} +Sprite "ENFTR0",1,1{} +Sprite "ENFTS0",1,1{} +Sprite "ENFTT0",1,1{} +Sprite "ENFTU0",1,1{} +Sprite "ENFTV0",1,1{} +Sprite "ENFTW0",1,1{} +Sprite "ENFTX0",1,1{} +Sprite "ENFTY0",1,1{} +Sprite "ENFDA0",1,1{} +Sprite "ENFDB0",1,1{} +Sprite "ENFDC0",1,1{} +Sprite "ENFDD0",1,1{} +Sprite "ENFDE0",1,1{} +Sprite "ENFDF0",1,1{} +Sprite "ENFDG0",1,1{} +Sprite "ENFDH0",1,1{} +Sprite "ENFDI0",1,1{} +Sprite "ENFDJ0",1,1{} +Sprite "ENFDK0",1,1{} +Sprite "ENFDL0",1,1{} +Sprite "ENFAA0",1,1{} +Sprite "ENFAB0",1,1{} +Sprite "ENFAC0",1,1{} +Sprite "ENFAD0",1,1{} +Sprite "ENFAE0",1,1{} +Sprite "ENFAF0",1,1{} +Sprite "ENFAG0",1,1{} +Sprite "ENFAH0",1,1{} +Sprite "ENFAI0",1,1{} +Sprite "ENFAJ0",1,1{} +Sprite "ENFAK0",1,1{} +Sprite "ENFAL0",1,1{} +Sprite "ENFAM0",1,1{} +Sprite "ENFAN0",1,1{} +Sprite "ENFAO0",1,1{} +Sprite "ENFAP0",1,1{} +Sprite "ENFAQ0",1,1{} +Sprite "ENFAR0",1,1{} +Sprite "ENFAS0",1,1{} +Sprite "ENFAT0",1,1{} +Sprite "ENFAU0",1,1{} +Sprite "2NFFA0",1,1{} +Sprite "2NFFB0",1,1{} +Sprite "2NFFC0",1,1{} +Sprite "2NFFD0",1,1{} +Sprite "2NFFE0",1,1{} +Sprite "2NFFF0",1,1{} +Sprite "2NFFG0",1,1{} +Sprite "2NFFH0",1,1{} +Sprite "2NFFI0",1,1{} +Sprite "2NFFJ0",1,1{} +Sprite "2NFRA0",1,1{} +Sprite "2NFRB0",1,1{} +Sprite "2NFRC0",1,1{} +Sprite "2NFRD0",1,1{} +Sprite "2NFRE0",1,1{} +Sprite "2NFRF0",1,1{} +Sprite "2NFRG0",1,1{} +Sprite "2NFRH0",1,1{} +Sprite "2NFRI0",1,1{} +Sprite "2NFRJ0",1,1{} +Sprite "2NFRK0",1,1{} +Sprite "2NFRL0",1,1{} +Sprite "2NFRM0",1,1{} +Sprite "2NFRN0",1,1{} +Sprite "2NFRO0",1,1{} +Sprite "2NFRP0",1,1{} +Sprite "2NFRQ0",1,1{} +Sprite "2NFRR0",1,1{} +Sprite "2NFRS0",1,1{} +Sprite "2NFRT0",1,1{} +Sprite "2NFRU0",1,1{} +Sprite "2NFRV0",1,1{} +Sprite "2NFRW0",1,1{} +Sprite "2NFRX0",1,1{} +Sprite "2NFRY0",1,1{} +Sprite "2NFRZ0",1,1{} +Sprite "2NR2A0",1,1{} +Sprite "2NR2B0",1,1{} +Sprite "2NFSA0",1,1{} +Sprite "2NFSB0",1,1{} +Sprite "2NFSC0",1,1{} +Sprite "2NFSD0",1,1{} +Sprite "2NFSE0",1,1{} +Sprite "2NFSF0",1,1{} +Sprite "2NFSG0",1,1{} +Sprite "2NFSH0",1,1{} +Sprite "2NFSI0",1,1{} +Sprite "2NFSJ0",1,1{} +Sprite "2NFSK0",1,1{} +Sprite "2NFSL0",1,1{} +Sprite "2NFSM0",1,1{} +Sprite "2NFSN0",1,1{} +Sprite "2NFSO0",1,1{} +Sprite "2NFSP0",1,1{} +Sprite "2NFSQ0",1,1{} +Sprite "2NFSR0",1,1{} +Sprite "2NFSS0",1,1{} +Sprite "2NFST0",1,1{} +Sprite "2NFSU0",1,1{} +Sprite "2NFSV0",1,1{} +Sprite "2NFSW0",1,1{} +Sprite "2NFSX0",1,1{} +Sprite "2NFSY0",1,1{} +Sprite "2NFSZ0",1,1{} +Sprite "2NFIA0",1,1{} +Sprite "2NFIB0",1,1{} +Sprite "2NFTA0",1,1{} +Sprite "2NFTB0",1,1{} +Sprite "2NFTC0",1,1{} +Sprite "2NFTD0",1,1{} +Sprite "2NFTE0",1,1{} +Sprite "2NFTF0",1,1{} +Sprite "2NFTG0",1,1{} +Sprite "2NFTH0",1,1{} +Sprite "2NFTI0",1,1{} +Sprite "2NFTJ0",1,1{} +Sprite "2NFTK0",1,1{} +Sprite "2NFTL0",1,1{} +Sprite "2NFTM0",1,1{} +Sprite "2NFTN0",1,1{} +Sprite "2NFTO0",1,1{} +Sprite "2NFTP0",1,1{} +Sprite "2NFTQ0",1,1{} +Sprite "2NFTR0",1,1{} +Sprite "2NFTS0",1,1{} +Sprite "2NFTT0",1,1{} +Sprite "2NFTU0",1,1{} +Sprite "2NFTV0",1,1{} +Sprite "2NFTW0",1,1{} +Sprite "2NFTX0",1,1{} +Sprite "2NFTY0",1,1{} +Sprite "2NFDA0",1,1{} +Sprite "2NFDB0",1,1{} +Sprite "2NFDC0",1,1{} +Sprite "2NFDD0",1,1{} +Sprite "2NFDE0",1,1{} +Sprite "2NFDF0",1,1{} +Sprite "2NFDG0",1,1{} +Sprite "2NFDH0",1,1{} +Sprite "2NFDI0",1,1{} +Sprite "2NFDJ0",1,1{} +Sprite "2NFDK0",1,1{} +Sprite "2NFDL0",1,1{} +Sprite "2NFAA0",1,1{} +Sprite "2NFAB0",1,1{} +Sprite "2NFAC0",1,1{} +Sprite "2NFAD0",1,1{} +Sprite "2NFAE0",1,1{} +Sprite "2NFAF0",1,1{} +Sprite "2NFAG0",1,1{} +Sprite "2NFAH0",1,1{} +Sprite "2NFAI0",1,1{} +Sprite "2NFAJ0",1,1{} +Sprite "2NFAK0",1,1{} +Sprite "2NFAL0",1,1{} +Sprite "2NFAM0",1,1{} +Sprite "2NFAN0",1,1{} +Sprite "2NFAO0",1,1{} +Sprite "2NFAP0",1,1{} +Sprite "2NFAQ0",1,1{} +Sprite "2NFAR0",1,1{} +Sprite "2NFAS0",1,1{} +Sprite "2NFAT0",1,1{} +Sprite "2NFAU0",1,1{} +Sprite "EMUZA0",1,1{} +Sprite "EMUZB0",1,1{} +Sprite "EMUZC0",1,1{} +Sprite "EMUZD0",1,1{} diff --git a/zscript/chainsaw.zsc b/zscript/chainsaw.zsc index 04404c7..fb03288 100644 --- a/zscript/chainsaw.zsc +++ b/zscript/chainsaw.zsc @@ -58,7 +58,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw LineTrace(angle,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); if ( d.HitType == TRACE_HitActor ) { - d.HitActor.DamageMobj(invoker,self,20,'slashed'); + int dmg = Random[Chainsaw](16,22); + dmg = d.HitActor.DamageMobj(invoker,self,dmg,'slashed'); d.HitActor.vel -= x*(500/d.HitActor.mass); vel += x*(100/mass); if ( d.HitActor.player ) d.HitActor.A_QuakeEx(5,5,5,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.25); @@ -70,8 +71,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw } else { - d.HitActor.TraceBleed(20,invoker); - d.HitActor.SpawnBlood(d.HitLocation,atan2(-d.HitDir.y,-d.HitDir.x),20); + d.HitActor.TraceBleed(dmg,invoker); + d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg); } } else if ( d.HitType != TRACE_HitNone ) @@ -94,7 +95,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw LineTrace(angle,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); if ( d.HitType == TRACE_HitActor ) { - d.HitActor.DamageMobj(invoker,self,110,'Decapitated'); + int dmg = Random[Chainsaw](100,110); + dmg = d.HitActor.DamageMobj(invoker,self,dmg,'Decapitated'); d.HitActor.vel = -y*(1200/d.HitActor.mass); vel += x*(100/mass); if ( d.HitActor.player ) d.HitActor.A_QuakeEx(5,5,5,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.25); @@ -106,8 +108,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw } else { - d.HitActor.TraceBleed(110,invoker); - d.HitActor.SpawnBlood(d.HitLocation,atan2(-d.HitDir.y,-d.HitDir.x),110); + d.HitActor.TraceBleed(dmg,invoker); + d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg); } } else if ( d.HitType != TRACE_HitNone ) diff --git a/zscript/enforcer.zsc b/zscript/enforcer.zsc index aebfb5a..2fe71e4 100644 --- a/zscript/enforcer.zsc +++ b/zscript/enforcer.zsc @@ -15,23 +15,154 @@ Class EClip : MiniAmmo replaces Clip } } +Class EnforcerLight : DynamicLight +{ + int cnt; + Default + { + DynamicLight.Type "Point"; + args 255,224,64,150; + } + override void Tick() + { + Super.Tick(); + if ( !target ) + { + Destroy(); + return; + } + if ( target.player ) SetOrigin(target.Vec2OffsetZ(0,0,target.player.viewz),true); + else SetOrigin(target.pos,true); + if ( cnt++ > 2 ) Destroy(); + } +} + +Class BulletImpact : Actor +{ + Default + { + Radius 0.1; + Height 0; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + A_SprayDecal("Pock",20); + int numpt = Random[Enforcer](5,10); + Vector3 x = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + for ( int i=0; i 300 ) A_FadeOut(0.05); + return; + } + } + States + { + Spawn: + PCAS A 1 + { + A_SetAngle(angle+anglevel,SPF_INTERPOLATE); + A_SetPitch(pitch+pitchvel,SPF_INTERPOLATE); + } + Loop; + Bounce: + PCAS A 0 + { + pitchvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + anglevel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + vel = (vel.unit()+(FRandom[Junk](-.2,.2),FRandom[Junk](-.2,.2),FRandom[Junk](-.2,.2))).unit()*vel.length(); + } + Goto Spawn; + Death: + PCAS A -1 + { + A_SetPitch(0); + A_SetRoll(FRandom[Junk](0,360)); + } + Stop; + } +} + Class Enforcer : UTWeapon replaces Pistol { - bool Akimbo; + int ClipCount, SlaveClipCount; + bool SlaveActive, SlaveDown, SlaveReload, SlaveAltFire; + int SlaveRefire; - override string PickupMessage() + property ClipCount : ClipCount; + property SlaveClipCount : SlaveClipCount; + + override void PostRender() { - if ( Owner.CountInv(GetClass()) ) return "You picked up another Enforcer!"; - else return PickupMsg; + if ( !CVar.GetCVar('flak_enforcerreload').GetBool() ) return; + if ( Amount > 1 ) Screen.DrawText(confont,Font.CR_GREEN,Screen.GetWidth()*0.01,Screen.GetHeight()*0.88,String.Format("L Clip: % 2d / 20\nR Clip: % 2d / 20",slaveclipcount,clipcount)); + else Screen.DrawText(confont,Font.CR_GREEN,Screen.GetWidth()*0.01,Screen.GetHeight()*0.88,String.Format("Clip: % 2d / 20",clipcount)); } override bool HandlePickup (Inventory item) { - if (item.GetClass() == GetClass()) + if ( item.GetClass() == GetClass() ) { - if ( !Enforcer(item).Akimbo ) + if ( item.Amount == 1 ) { - Enforcer(item).Akimbo = true; item.bPickupGood = true; item.SetTag("Dual Enforcers"); } @@ -42,15 +173,183 @@ Class Enforcer : UTWeapon replaces Pistol override Inventory CreateTossable( int amt ) { - // TODO separate drops - return Super.CreateTossable(amt); + Inventory inv = Super.CreateTossable(amt); + if ( inv ) + { + SetTag("Enforcer"); + inv.SetTag("Enforcer"); + if ( Owner && (Owner.player.ReadyWeapon == self) ) + { + // delete the slave overlay + PSprite psp; + for ( psp = Owner.player.psprites; psp; psp = psp.next ) + { + if ( (psp.Caller == self) && (psp.id == 2) ) psp.Destroy(); + slaveactive = false; + slavedown = false; + } + } + } + return inv; + } + + action void A_EnforcerRefire( statelabel flash = null, bool slave = false ) + { + Weapon weap = Weapon(invoker); + if ( !weap || !player ) return; + if ( slave ) + { + if ( invoker.slaveclipcount < 5 ) A_PlaySound("enforcer/click",CHAN_7); + if ( (invoker.slaveclipcount <= 0) || (weap.Ammo1.Amount <= 0) ) + { + invoker.slaverefire = 0; + return; + } + bool pending = (player.PendingWeapon != WP_NOCHANGE) && (player.WeaponState & WF_REFIRESWITCHOK); + if ( (player.cmd.buttons&BT_ATTACK) && !invoker.slavealtfire && !pending && (player.health > 0) ) + { + invoker.slaverefire++; + if ( player.ReadyWeapon.CheckAmmo(Weapon.PrimaryFire,true) ) + player.setpsprite(2,flash?ResolveState(flash):ResolveState("LeftHold")); + } + else if ( (player.cmd.buttons&BT_ALTATTACK) && invoker.slavealtfire && !pending && (player.health > 0) ) + { + invoker.slaverefire++; + if ( player.ReadyWeapon.CheckAmmo(Weapon.AltFire,true) ) + player.setpsprite(2,flash?ResolveState(flash):ResolveState("LeftAltHold")); + } + else + { + invoker.slaverefire = 0; + player.ReadyWeapon.CheckAmmo(invoker.slavealtfire?Weapon.AltFire:Weapon.PrimaryFire,true); + } + } + else + { + if ( invoker.clipcount < 5 ) A_PlaySound("enforcer/click",CHAN_WEAPON); + if ( (invoker.clipcount <= 0) || (weap.Ammo1.Amount <= 0) ) + { + A_ClearRefire(); + return; + } + A_Refire(flash); + } + } + + action void A_LeftWeaponReady() + { + Weapon weap = Weapon(invoker); + if ( !weap || !player ) return; + if ( player.cmd.buttons&BT_ATTACK && !player.ReadyWeapon.bAltFire ) + { + invoker.slaverefire = 0; + invoker.slavealtfire = false; + player.setpsprite(2,ResolveState("LeftFire")); + } + else if ( player.cmd.buttons&BT_ALTATTACK && player.ReadyWeapon.bAltFire ) + { + invoker.slaverefire = 0; + invoker.slavealtfire = true; + player.setpsprite(2,ResolveState("LeftAltFire")); + } + } + + action void A_EnforcerFire( bool alt = false, bool slave = false ) + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; + if ( slave ) + { + invoker.slaveclipcount--; + if ( !CVar.GetCVar('flak_enforcerreload').GetBool() && (invoker.slaveclipcount <=0) ) invoker.slaveclipcount = Min(20,weap.Ammo1.Amount); + } + else + { + invoker.clipcount--; + if ( !CVar.GetCVar('flak_enforcerreload').GetBool() && (invoker.clipcount <=0) ) invoker.clipcount = Min(20,weap.Ammo1.Amount); + } + invoker.FireEffect(); + UTMainHandler.DoFlash(self,Color(32,255,128,0),1); + A_PlaySound("enforcer/shoot",slave?CHAN_7:CHAN_WEAPON); + A_AlertMonsters(); + A_QuakeEx(2,2,2,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.08); + if ( slave ) + { + if ( alt ) A_Overlay(-3,"LeftAltMuzzleFlash"); + else A_Overlay(-3,"LeftMuzzleFlash"); + A_OverlayFlags(-3,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); + A_OverlayRenderstyle(-3,STYLE_Add); + } + else + { + if ( alt ) A_Overlay(-2,"AltMuzzleFlash"); + else A_Overlay(-2,"MuzzleFlash"); + A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); + A_OverlayRenderstyle(-2,STYLE_Add); + } + Vector3 x, y, z; + double a; + [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); + Vector3 origin = pos+(0,0,player.viewheight)+10.0*x; + int ydir = slave?-1:1; + if ( alt ) origin = origin-z*9.0+ydir*y*1.0; + else origin = origin-z*2.0+ydir*y*6.0; + double ang = angle; + double pt = BulletSlope(); + if ( alt ) + { + ang += FRandom[Enforcer](-3,3); + pt += FRandom[Enforcer](-3,3); + } + else + { + ang += FRandom[Enforcer](-0.4,0.4); + pt += FRandom[Enforcer](-0.4,0.4); + } + FLineTraceData d; + LineTrace(ang,10000,pt,TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); + if ( d.HitType == TRACE_HitActor ) + { + int dmg = Random[Enforcer](15,20); + dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot'); + if ( d.HitActor.bNOBLOOD ) + { + let p = Spawn("BulletImpact",d.HitLocation-d.HitDir*4); + p.angle = atan2(d.HitDir.y,d.HitDir.x); + p.pitch = asin(-d.HitDir.z); + } + else + { + d.HitActor.TraceBleed(dmg,self); + d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg); + } + } + else if ( d.HitType != TRACE_HitNone ) + { + let p = Spawn("BulletImpact",d.HitLocation-d.HitDir*4); + p.angle = atan2(d.HitDir.y,d.HitDir.x); + p.pitch = asin(-d.HitDir.z); + if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); + } + origin += x*8.0+ydir*y*6.0-z*2.0; + let c = Spawn("UTCasing",origin); + c.vel = x*FRandom[Junk](-2,2)+y*ydir*FRandom[Junk](3,6)+z*FRandom[Junk](3,5); + } + + override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) + { + if ( Amount > 1 ) return "%k riddled %o full of holes with the Dual Enforcers."; + return "%k riddled %o full of holes with the Enforcer."; } Default { Tag "Enforcer"; - Inventory.PickupMessage "You picked up an Enforcer."; - Weapon.UpSound ""; + Inventory.PickupMessage "You picked up another Enforcer!"; + Inventory.MaxAmount 2; + Weapon.UpSound "enforcer/select"; Weapon.SlotNumber 2; Weapon.SelectionOrder 8; Weapon.AmmoType "MiniAmmo"; @@ -58,6 +357,8 @@ Class Enforcer : UTWeapon replaces Pistol Weapon.AmmoType2 "MiniAmmo"; Weapon.AmmoUse2 1; Weapon.AmmoGive 30; + Enforcer.ClipCount 20; + Enforcer.SlaveClipCount 20; } States { @@ -66,5 +367,168 @@ Class Enforcer : UTWeapon replaces Pistol Stop; ENFP B -1; Stop; + Select: + ENFS A 1 A_Raise(int.max); + Ready: + ENFS A 0 + { + invoker.slavedown = false; + if ( !invoker.slaveactive && (CountInv("Enforcer") > 1) ) + A_Overlay(2,"LeftReady"); + } + ENFS ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; + Idle: + ENFI A 0 A_Overlay(-9999,"Dummy"); + ENFI AB 30; + ENFI A 0 A_Jump(50,"Twiddle"); + Goto Idle+1; + LeftReady: + 2NFS A 0 + { + A_PlaySound("enforcer/select",CHAN_7); + invoker.slaveactive = true; + } + 2NFS ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; + LeftIdle: + 2NFI A 0 A_Overlay(-9998,"LeftDummy"); + 2NFI AB 30; + 2NFI A 0 A_Jump(50,"LeftTwiddle"); + Goto LeftIdle+1; + Twiddle: + ENFT ABCDEFGHIJKLMNOPQRSTUVWXY 2; + Goto Idle+1; + LeftTwiddle: + 2NFT ABCDEFGHIJKLMNOPQRSTUVWXY 2; + Goto LeftIdle+1; + Dummy: + TNT1 A 1 + { + if ( (invoker.clipcount <= 0) && (invoker.Ammo1.Amount > 0) ) A_Overlay(PSP_WEAPON,"Reload"); + if ( CVar.GetCVar('flak_enforcerreload').GetBool() && ((invoker.clipcount < min(20,invoker.Ammo1.Amount)) || (invoker.slaveclipcount < min(20,invoker.Ammo1.Amount))) ) A_WeaponReady(WRF_ALLOWRELOAD); + else A_WeaponReady(); + if ( !invoker.slaveactive && (CountInv("Enforcer") > 1) ) A_Overlay(2,"LeftReady"); + } + Wait; + LeftDummy: + TNT1 A 1 + { + if ( health <= 0 ) + { + invoker.slaveactive = false; + A_Overlay(2,"LeftDeselect"); + } + if ( CVar.GetCVar('flak_enforcerreload').GetBool() && (invoker.slavereload || (invoker.slaveclipcount < 0)) ) A_Overlay(2,"LeftReload"); + if ( invoker.slavedown ) A_Overlay(2,"LeftDeselect"); + A_LeftWeaponReady(); + } + Wait; + Fire: + ENFF A 0 A_Overlay(-9999,"Null"); + Hold: + ENFF A 0 A_EnforcerFire(); + ENFF ABCDEFGHI 1; + ENFF J 3 A_EnforcerRefire(); + Goto Idle; + LeftFire: + 2NFI A 0 A_Overlay(-9998,"Null"); + 2NFI A 1 A_SetTics(Random[Enforcer](0,5)); + LeftHold: + 2NFF A 0 A_EnforcerFire(false,true); + 2NFF ABCDEFGHI 1; + 2NFF J 3 A_EnforcerRefire("LeftHold",true); + Goto LeftIdle; + AltFire: + ENFA A 0 A_Overlay(-9999,"Null"); + ENFA ABCDEF 1; + AltHold: + ENFA G 0 A_EnforcerFire(true); + ENFA GHIJKLMN 1; + ENFA G 0 A_EnforcerRefire(); + ENFA OPQRSTU 1; + Goto Idle; + LeftAltFire: + 2NFI A 0 A_Overlay(-9998,"Null"); + 2NFI A 1 A_SetTics(Random[Enforcer](0,5)); + 2NFI A 0; + 2NFA ABCDEF 1; + LeftAltHold: + 2NFA G 0 A_EnforcerFire(true,true); + 2NFA GHIJKLMN 1; + 2NFA G 0 A_EnforcerRefire("LeftAltHold",true); + 2NFA OPQRSTU 1; + Goto LeftIdle; + Reload: + ENFR A 0 + { + invoker.slavereload = ((player.cmd.buttons&BT_RELOAD)&&(invoker.slaveclipcount < min(20,invoker.Ammo1.Amount)))||(invoker.slaveclipcount <= 0); + return A_JumpIf(invoker.clipcount>=min(20,invoker.Ammo1.Amount),"Idle"); + } + ENFR A 0 + { + invoker.clipcount = Min(20,invoker.Ammo1.Amount); + A_Overlay(-9999,"Null"); + A_PlaySound("enforcer/click",CHAN_WEAPON); + } + ENFR ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; + ENR2 AB 1; + ENR2 B 30 A_PlaySound("enforcer/reload",CHAN_WEAPON); + ENFS A 0 A_PlaySound("enforcer/select",CHAN_WEAPON); + Goto Ready; + LeftReload: + 2NFR A 0 + { + invoker.slaveclipcount = Min(20,invoker.Ammo1.Amount); + invoker.slavereload = false; + A_Overlay(-9998,"Null"); + A_PlaySound("enforcer/click",CHAN_7); + } + 2NFR ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; + 2NR2 AB 1; + 2NR2 B 30 A_PlaySound("enforcer/reload",CHAN_7); + 2NFS A 0 A_PlaySound("enforcer/select",CHAN_7); + Goto LeftReady; + Deselect: + ENFI A 1 { invoker.slavedown = true; } + ENFD A 0 A_Overlay(-9999,"Null"); + ENFD A 0 A_JumpIf(invoker.slaveactive,"Deselect"); + ENFD ABCDEFGHIJKL 1; + ENFD L 1 A_Lower(int.max); + Wait; + LeftDeselect: + 2NFD A 0 + { + A_Overlay(-9998,"Null"); + invoker.slaveactive = false; + } + 2NFD ABCDEFGHIJKL 1; + Stop; + MuzzleFlash: + EMUZ A 2 Bright + { + let l = Spawn("EnforcerLight",pos); + l.target = self; + } + Stop; + AltMuzzleFlash: + EMUZ B 2 Bright + { + let l = Spawn("EnforcerLight",pos); + l.target = self; + } + Stop; + LeftMuzzleFlash: + EMUZ C 2 Bright + { + let l = Spawn("EnforcerLight",pos); + l.target = self; + } + Stop; + LeftAltMuzzleFlash: + EMUZ D 2 Bright + { + let l = Spawn("EnforcerLight",pos); + l.target = self; + } + Stop; } } diff --git a/zscript/flakcannon.zsc b/zscript/flakcannon.zsc index be80c62..fb23324 100644 --- a/zscript/flakcannon.zsc +++ b/zscript/flakcannon.zsc @@ -461,14 +461,7 @@ Class FlakLight : DynamicLight Default { DynamicLight.Type "Point"; - } - override void PostBeginPlay() - { - Super.PostBeginPlay(); - args[LIGHT_INTENSITY] = 150; - args[LIGHT_RED] = 255; - args[LIGHT_GREEN] = 224; - args[LIGHT_BLUE] = 128; + args 255,224,128,150; } override void Tick() { diff --git a/zscript/impacthammer.zsc b/zscript/impacthammer.zsc index bb5e072..5d766f5 100644 --- a/zscript/impacthammer.zsc +++ b/zscript/impacthammer.zsc @@ -75,7 +75,8 @@ Class ImpactHammer : UTWeapon replaces Fist LineTrace(angle,80,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); if ( d.HitType == TRACE_HitActor ) { - d.HitActor.DamageMobj(invoker,self,60*realcharge,'impact'); + int dmg = Random[Impact](50,60)*realcharge; + dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact'); d.HitActor.vel = x*(1000/d.HitActor.mass)*realcharge; if ( d.HitActor.bNOBLOOD ) { @@ -85,15 +86,16 @@ Class ImpactHammer : UTWeapon replaces Fist } else { - d.HitActor.TraceBleed(60*realcharge,invoker); - d.HitActor.SpawnBlood(d.HitLocation,atan2(-d.HitDir.y,-d.HitDir.x),60*realcharge); + d.HitActor.TraceBleed(dmg,invoker); + d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg); } } else if ( d.HitType != TRACE_HitNone ) { realcharge = max(1.0,realcharge); - DamageMobj(invoker,self,24*realcharge,'impact'); // It's a flat damage of 36 on UT, but I think it's more fair for it to scale - TraceBleed(24*realcharge,invoker); + int dmg = Random[Impact](16,24)*realcharge; // It's a flat damage of 36 on UT, but I think it's more fair for it to scale + dmg = DamageMobj(invoker,self,dmg,'impact'); + TraceBleed(dmg,invoker); vel -= x*(1200/mass)*realcharge; let p = Spawn("HammerImpact",d.HitLocation-d.HitDir*4); p.angle = atan2(d.HitDir.y,d.HitDir.x); @@ -135,12 +137,14 @@ Class ImpactHammer : UTWeapon replaces Fist double dscale = d.Distance/180.; if ( d.HitType == TRACE_HitActor ) { - d.HitActor.DamageMobj(invoker,self,20*dscale,'impact'); + int dmg = Random[Impact](16,20)*dscale; + dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact'); d.HitActor.vel = x*(500/d.HitActor.mass)*dscale; } else if ( d.HitType != TRACE_HitNone ) { - DamageMobj(invoker,self,24*dscale,'impact'); + int dmg = Random[Impact](16,24)*dscale; + dmg = DamageMobj(invoker,self,dmg,'impact'); vel -= x*(600/mass)*dscale; if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation-d.HitDir*4); } diff --git a/zscript/pulsegun.zsc b/zscript/pulsegun.zsc index 8336f6f..3f79509 100644 --- a/zscript/pulsegun.zsc +++ b/zscript/pulsegun.zsc @@ -330,6 +330,12 @@ Class PulseGun : UTWeapon Property ClipCount : clipcount; + override void PostRender() + { + if ( !CVar.GetCVar('flak_pulsereload').GetBool() ) return; + Screen.DrawText(confont,Font.CR_GREEN,Screen.GetWidth()*0.01,Screen.GetHeight()*0.88,String.Format("Clip: % 2d / 50",clipcount)); + } + action void A_Reloading() { Weapon weap = Weapon(invoker); diff --git a/zscript/utcommon.zsc b/zscript/utcommon.zsc index 289f62f..b3c85b1 100644 --- a/zscript/utcommon.zsc +++ b/zscript/utcommon.zsc @@ -2,9 +2,10 @@ Class UTPlayer : DoomPlayer { Default { - Player.StartItem "ImpactHammer"; - Player.StartItem "Translocator"; + Player.StartItem "MiniAmmo", 30; Player.StartItem "Enforcer"; + Player.StartItem "Translocator"; + Player.StartItem "ImpactHammer"; } // Have to modify the give cheat to handle UT armor