diff --git a/GunLore.md b/GunLore.md index 1964ead..3030f90 100644 --- a/GunLore.md +++ b/GunLore.md @@ -311,15 +311,17 @@ but that's a story for another time (and mod). ## Demolisher -The signature handgun wielded by the Archangels, who lead the Bigman tribes -living in the southern swamplands of Na Pali. Firing highly explosive, massive -bullets, this truly is a force to be reckoned with. +The Demolisher is the crowning achievement of Bigman gunsmithing. Built with +the finest metals available on Na Pali, and engineered with love for one and +only one thing: EXPLOSIONS. Primary fire: Single explosive shot, high recoil. Secondary fire: Rapid fire. A puny little human like you stands no chance against its recoil. +Magazine holds 4 shots. + ## Autocannon A barely portable weapon. Usually these are mounted on ships, you know... diff --git a/Readme.md b/Readme.md index 65d01b7..b179393 100644 --- a/Readme.md +++ b/Readme.md @@ -35,6 +35,7 @@ Doom Tournament (currently the devel branch is required). - Dual Protomags - Quadshot (slot 3) (replaces shotguns) - Peacemaker (slot 8) (rare spawn in backpacks) + - Demolisher (slot 9) (replaces bfg9000) - 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) @@ -72,7 +73,6 @@ Doom Tournament (currently the devel branch is required). - Fireblaster (slot 5) (replaces rocket launcher) - Flamethrower (slot 6) (replaces plasma rifle) - Impaler (slot 7) (replaces plasma rifle) - - Demolisher (slot 9) (replaces bfg9000) - Autocannon (slot 0) (replaces bfg9000) ## Planned diff --git a/cvarinfo.txt b/cvarinfo.txt index f21fbf9..492ffc7 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -87,5 +87,3 @@ server bool sting_bhold = false; // biorifle can be held fully loaded server bool sting_razoraim = false; // razorjack alt follows aim instead of // being steered by player rotation server bool sting_biosplash = false; // biorifle alt splashes like in ut -server bool sting_impalerauto = false; // impaler reloads automatically after - // primary fire diff --git a/modeldef.automag b/modeldef.automag index b4b81c3..077a578 100644 --- a/modeldef.automag +++ b/modeldef.automag @@ -20,7 +20,6 @@ Model "UCasing" ZOffset 1 USEACTORPITCH USEACTORROLL - DONTCULLBACKFACES USEROTATIONCENTER Rotation-Center 0 0 1 diff --git a/modeldef.betamag b/modeldef.betamag index 0aab251..f7c99b0 100644 --- a/modeldef.betamag +++ b/modeldef.betamag @@ -25,7 +25,6 @@ Model "BCasing" ZOffset 1 USEACTORPITCH USEACTORROLL - DONTCULLBACKFACES USEROTATIONCENTER Rotation-Center 0 0 1 @@ -42,7 +41,6 @@ Model "BCasing2" ZOffset 1 USEACTORPITCH USEACTORROLL - DONTCULLBACKFACES USEROTATIONCENTER Rotation-Center 0 0 1 diff --git a/modeldef.biggun b/modeldef.biggun index 14adbc0..8dd29f9 100644 --- a/modeldef.biggun +++ b/modeldef.biggun @@ -27,6 +27,30 @@ Model "BigAmmo3" FrameIndex BIGA A 0 0 } +Model "FatRing" +{ + Path "models" + Model 0 "FatRing_d.3d" + Skin 0 "JRingEx1.png" + PitchOffset 90 + Scale 1.2 1.0 1.0 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + FrameIndex FATR A 0 0 + FrameIndex FATR B 0 1 + FrameIndex FATR C 0 2 + FrameIndex FATR D 0 3 + FrameIndex FATR E 0 4 + FrameIndex FATR F 0 5 + FrameIndex FATR G 0 6 + FrameIndex FATR H 0 7 + FrameIndex FATR I 0 8 + FrameIndex FATR J 0 9 + FrameIndex FATR K 0 10 +} + Model "BigGun" { Path "models" @@ -42,3 +66,194 @@ Model "BigGun" ROTATING FrameIndex BIGP A 1 0 } + +Model "BigCasing" +{ + Path "models" + Model 0 "BigGShellC_d.3d" + Skin 0 "Jclip1.png" + Scale 0.12 0.1 0.1 + PitchOffset 90 + Offset 3 0 2 + USEACTORPITCH + USEACTORROLL + USEROTATIONCENTER + Rotation-Center 0 0 2 + + FrameIndex PCAS A 0 0 +} + +Model "BigGun" +{ + Path "models" + Model 2 "Flat_d.3d" + Skin 2 "BigMuz.png" + AngleOffset 90 + PitchOffset 90 + Scale 0.2 0.2 0.2 + Offset 25 -60 -5 + + FrameIndex BGMF A 2 0 +} + +Model "BigGun" +{ + Path "models" + Model 0 "BigGun_d.3d" + SurfaceSkin 0 0 "JBigGun1.png" + SurfaceSkin 0 1 "Automa1.png" + AngleOffset -85 + Scale 0.2 -0.1 0.2 + Offset 7 -10 -3 + + // Still + FrameIndex BIGI A 0 0 + // Down + FrameIndex BIGD A 0 1 + FrameIndex BIGD B 0 2 + FrameIndex BIGD C 0 3 + FrameIndex BIGD D 0 4 + FrameIndex BIGD E 0 5 + FrameIndex BIGD F 0 6 + FrameIndex BIGD G 0 7 + FrameIndex BIGD H 0 8 + FrameIndex BIGD I 0 9 + FrameIndex BIGD J 0 10 + FrameIndex BIGD K 0 11 + // Select + FrameIndex BIGS A 0 11 + FrameIndex BIGS B 0 12 + FrameIndex BIGS C 0 13 + FrameIndex BIGS D 0 14 + FrameIndex BIGS E 0 15 + FrameIndex BIGS F 0 16 + FrameIndex BIGS G 0 17 + FrameIndex BIGS H 0 18 + FrameIndex BIGS I 0 19 + // Twiddle1 + FrameIndex BIGW A 0 20 + FrameIndex BIGW B 0 21 + FrameIndex BIGW C 0 22 + FrameIndex BIGW D 0 23 + FrameIndex BIGW E 0 24 + FrameIndex BIGW F 0 25 + FrameIndex BIGW G 0 26 + FrameIndex BIGW H 0 27 + FrameIndex BIGW I 0 28 + FrameIndex BIGW J 0 29 + FrameIndex BIGW K 0 30 + FrameIndex BIGW L 0 31 + FrameIndex BIGW M 0 32 + FrameIndex BIGW N 0 33 + FrameIndex BIGW O 0 34 + // Twiddle2 + FrameIndex BIGT A 0 35 + FrameIndex BIGT B 0 36 + FrameIndex BIGT C 0 37 + FrameIndex BIGT D 0 38 + FrameIndex BIGT E 0 39 + FrameIndex BIGT F 0 40 + FrameIndex BIGT G 0 41 + FrameIndex BIGT H 0 42 + FrameIndex BIGT I 0 43 + FrameIndex BIGT J 0 44 + FrameIndex BIGT K 0 45 + FrameIndex BIGT L 0 46 + FrameIndex BIGT M 0 47 + FrameIndex BIGT N 0 48 + FrameIndex BIGT O 0 49 + FrameIndex BIGT P 0 50 + FrameIndex BIGT Q 0 51 + FrameIndex BIGT R 0 52 + FrameIndex BIGT S 0 53 + FrameIndex BIGT T 0 54 + FrameIndex BIGT U 0 55 + FrameIndex BIGT V 0 56 + FrameIndex BIGT W 0 57 + FrameIndex BIGT X 0 58 + FrameIndex BIGT Y 0 59 + // PreFire + FrameIndex BIGF A 0 60 + FrameIndex BIGF B 0 61 + // Fire + FrameIndex BIGF C 0 62 + FrameIndex BIGF D 0 63 + FrameIndex BIGF E 0 64 + FrameIndex BIGF F 0 65 + FrameIndex BIGF G 0 66 + FrameIndex BIGF H 0 67 + FrameIndex BIGF I 0 68 + FrameIndex BIGF J 0 69 + FrameIndex BIGF K 0 70 + FrameIndex BIGF L 0 71 + // EndFire + FrameIndex BIGF M 0 72 + FrameIndex BIGF N 0 73 + FrameIndex BIGF O 0 74 + FrameIndex BIGF P 0 75 + // Reload + FrameIndex BIGR A 0 76 + FrameIndex BIGR B 0 77 + FrameIndex BIGR C 0 78 + FrameIndex BIGR D 0 79 + FrameIndex BIGR E 0 80 + FrameIndex BIGR F 0 81 + FrameIndex BIGR G 0 82 + FrameIndex BIGR H 0 83 + FrameIndex BIGR I 0 84 + FrameIndex BIGR J 0 85 + FrameIndex BIGR K 0 86 + FrameIndex BIGR L 0 87 + FrameIndex BIGR M 0 88 // punch + FrameIndex BIGR N 0 89 + FrameIndex BIGR O 0 90 + FrameIndex BIGR P 0 91 + FrameIndex BIGR Q 0 92 + FrameIndex BIGR R 0 93 + FrameIndex BIGR S 0 94 + FrameIndex BIGR T 0 95 + FrameIndex BIGR U 0 96 + FrameIndex BIGR V 0 97 + FrameIndex BIGR W 0 98 + FrameIndex BIGR X 0 99 // drop + FrameIndex BIGR Y 0 100 + FrameIndex BIGR Z 0 101 + FrameIndex BIGR [ 0 102 + FrameIndex BIGR \ 0 103 + FrameIndex BIGR ] 0 104 + FrameIndex BIR2 A 0 105 + FrameIndex BIR2 B 0 106 + FrameIndex BIR2 C 0 107 + FrameIndex BIR2 D 0 108 + FrameIndex BIR2 E 0 109 + FrameIndex BIR2 F 0 110 + FrameIndex BIR2 G 0 111 // load + FrameIndex BIR2 H 0 112 + FrameIndex BIR2 I 0 113 + FrameIndex BIR2 J 0 114 + FrameIndex BIR2 K 0 115 + FrameIndex BIR2 L 0 116 + FrameIndex BIR2 M 0 117 + FrameIndex BIR2 N 0 118 + FrameIndex BIR2 O 0 119 + FrameIndex BIR2 P 0 120 // reselect + FrameIndex BIR2 Q 0 121 + FrameIndex BIR2 R 0 122 + FrameIndex BIR2 S 0 123 + FrameIndex BIR2 T 0 124 + FrameIndex BIR2 U 0 125 + FrameIndex BIR2 V 0 126 + FrameIndex BIR2 W 0 127 + FrameIndex BIR2 X 0 128 + FrameIndex BIR2 Y 0 129 + FrameIndex BIR2 Z 0 130 + FrameIndex BIR2 [ 0 131 + FrameIndex BIR2 \ 0 132 + FrameIndex BIR2 ] 0 133 + FrameIndex BIR3 A 0 134 + FrameIndex BIR3 B 0 135 + FrameIndex BIR3 C 0 136 + FrameIndex BIR3 D 0 137 + FrameIndex BIR3 E 0 138 + FrameIndex BIR3 F 0 139 +} diff --git a/modeldef.quadshot b/modeldef.quadshot index 697c10b..1313546 100644 --- a/modeldef.quadshot +++ b/modeldef.quadshot @@ -32,7 +32,6 @@ Model "QCasing" ZOffset 1 USEACTORPITCH USEACTORROLL - DONTCULLBACKFACES USEROTATIONCENTER Rotation-Center 0 0 1 diff --git a/models/BigGMag_a.3d b/models/BigGMag_a.3d new file mode 100644 index 0000000..13a82aa Binary files /dev/null and b/models/BigGMag_a.3d differ diff --git a/models/BigGMag_d.3d b/models/BigGMag_d.3d new file mode 100644 index 0000000..b2d16b0 Binary files /dev/null and b/models/BigGMag_d.3d differ diff --git a/models/BigGShellC_a.3d b/models/BigGShellC_a.3d index b1b3fdb..d7db415 100644 Binary files a/models/BigGShellC_a.3d and b/models/BigGShellC_a.3d differ diff --git a/models/BigGun_1st.blend b/models/BigGun_1st.blend index 63a0162..65d144a 100644 Binary files a/models/BigGun_1st.blend and b/models/BigGun_1st.blend differ diff --git a/models/BigGun_a.3d b/models/BigGun_a.3d index 117d2ee..57a1eec 100644 Binary files a/models/BigGun_a.3d and b/models/BigGun_a.3d differ diff --git a/models/BigGun_d.3d b/models/BigGun_d.3d index 6fea4c7..f692049 100644 Binary files a/models/BigGun_d.3d and b/models/BigGun_d.3d differ diff --git a/models/FatRing_a.3d b/models/FatRing_a.3d new file mode 100644 index 0000000..ab93157 Binary files /dev/null and b/models/FatRing_a.3d differ diff --git a/models/FatRing_d.3d b/models/FatRing_d.3d new file mode 100644 index 0000000..8a71505 Binary files /dev/null and b/models/FatRing_d.3d differ diff --git a/models/JBigGun1.png b/models/JBigGun1.png index 4d2e984..3c2b405 100644 Binary files a/models/JBigGun1.png and b/models/JBigGun1.png differ diff --git a/models/JBigGun1_.png b/models/JBigGun1_.png index 4d2e984..3c2b405 100644 Binary files a/models/JBigGun1_.png and b/models/JBigGun1_.png differ diff --git a/models/JRingex1.png b/models/JRingex1.png new file mode 100644 index 0000000..d25d2c3 Binary files /dev/null and b/models/JRingex1.png differ diff --git a/sndinfo.txt b/sndinfo.txt index 56a5328..6711d82 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -284,6 +284,14 @@ impaler/altfire impboltl impaler/hit imphit impaler/beam ele04 +big/select bigmsel +big/fire bigmfire +big/dry bigmdryf +big/punch bigmejct +big/reload bigmrelo +big/shell bigmshel +big/blast bigmhit + translator/event transa3 detector/start detact diff --git a/sounds/BigMDryF.ogg b/sounds/BigMDryF.ogg new file mode 100644 index 0000000..d83c777 Binary files /dev/null and b/sounds/BigMDryF.ogg differ diff --git a/sounds/BigMEjct.ogg b/sounds/BigMEjct.ogg new file mode 100644 index 0000000..2af8bd8 Binary files /dev/null and b/sounds/BigMEjct.ogg differ diff --git a/sounds/BigMRelo.ogg b/sounds/BigMRelo.ogg new file mode 100644 index 0000000..53f94c7 Binary files /dev/null and b/sounds/BigMRelo.ogg differ diff --git a/sounds/BigMSel.ogg b/sounds/BigMSel.ogg index 2bade09..2495e7f 100644 Binary files a/sounds/BigMSel.ogg and b/sounds/BigMSel.ogg differ diff --git a/sounds/BigMShell.ogg b/sounds/BigMShel.ogg similarity index 100% rename from sounds/BigMShell.ogg rename to sounds/BigMShel.ogg diff --git a/textures.biggun b/textures.biggun index c2cefc1..635ed7c 100644 --- a/textures.biggun +++ b/textures.biggun @@ -1,3 +1,4 @@ Sprite "BIGAA0",1,1{} Sprite "BIGPA0",1,1{} Sprite "BIGSA0",1,1{} +Sprite "FATRA0",1,1{} diff --git a/zscript/biggun.zsc b/zscript/biggun.zsc index 45ef69f..cc0d313 100644 --- a/zscript/biggun.zsc +++ b/zscript/biggun.zsc @@ -6,9 +6,9 @@ Class BigAmmo : Ammo Inventory.Icon "I_BigM"; Inventory.PickupMessage ""; Inventory.Amount 10; - Inventory.MaxAmount 30; + Inventory.MaxAmount 12; Ammo.BackpackAmount 0; - Ammo.BackpackMaxAmount 60; + Ammo.BackpackMaxAmount 24; Ammo.DropAmount 10; Inventory.RespawnTics 2100; +INVENTORY.IGNORESKILL; @@ -90,8 +90,88 @@ Class BigAmmo3 : BigAmmo } } +Class FatRing : Actor +{ + Default + { + RenderStyle "Add"; + +NOGRAVITY; + +NOBLOCKMAP; + } + override void Tick() + { + Super.Tick(); + if ( isFrozen() ) return; + A_FadeOut(1/21.,0); + } + States + { + Spawn: + FATR ABCDEFGHIJK 2 Bright; + Stop; + } +} + Class BigBlast : Actor { + Default + { + RenderStyle "Add"; + DamageType 'BigShot'; + Scale 2.; + +NOGRAVITY; + +NOBLOCKMAP; + +NODAMAGETHRUST; + +FORCERADIUSDMG; + +FORCEXYBILLBOARD; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + A_Explode(200,250); + A_QuakeEx(4,4,4,10,0,400,"",QF_RELATIVE|QF_SCALEDOWN,falloff:200,rollintensity:0.2); + A_PlaySound("big/blast",CHAN_VOICE,pitch:FRandom[BigGun](0.8,1.2)); + UTMainHandler.DoBlast(self,250,80000); + let r = Spawn("FatRing",pos); + r.angle = angle; + r.pitch = pitch; + r.roll = FRandom[ExploS](0,360); + r.scale *= FRandom[ExploS](0.8,1.1); + Scale *= FRandom[ExploS](0.8,1.1); + Scale.x *= RandomPick[ExploS](-1,1); + Scale.y *= RandomPick[ExploS](-1,1); + int numpt = Random[ExploS](30,40); + for ( int i=0; i hitlist; double penetration; // please don't laugh + + override ETraceStatus TraceCallback() + { + if ( Results.HitType == TRACE_HitActor ) + { + if ( Results.HitActor == ignoreme ) return TRACE_Skip; + if ( Results.HitActor.bSHOOTABLE ) + { + let ent = new("HitListEntry"); + ent.hitactor = Results.HitActor; + ent.hitlocation = Results.HitPos; + ent.x = Results.HitVector; + ent.hitdamage = min(Results.HitActor.health,int(penetration)); + hitlist.Push(ent); + penetration -= ent.hitdamage*.3; + if ( penetration <= 0 ) return TRACE_Abort; + return TRACE_Skip; + } + 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 BigCasing : UTCasing { Default { - BounceSound "big/bounce"; // much heavier sound + BounceSound "big/shell"; // much heavier sound } } Class BigGun : UnrealWeapon { + int ClipCount; + BigTracer t; + + property ClipCount : ClipCount; + override bool TryPickup( in out Actor toucher ) { if ( !sting_dubious ) return false; // not allowed @@ -158,9 +272,128 @@ Class BigGun : UnrealWeapon Destroy(); } } + override int, int, bool, bool GetClipAmount() + { + return ClipCount, -1, (ClipCount<2), false; + } + override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount ) + { + if ( ClipCount > 0 ) return true; + return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount); + } + action void A_Eject() + { + Vector3 x, y, z; + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); + Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),4*x+y*12-z*4); + let c = Spawn("BigCasing",origin); + c.vel = x*FRandom[Junk](-1.5,1.5)+y*FRandom[Junk](2,4)+z*FRandom[Junk](-1,2); + } + action void A_BigFire( bool bAlt = false ) + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( invoker.clipcount <= 0 ) return; + invoker.clipcount--; + A_PlaySound("big/fire",CHAN_WEAPON); + A_AlertMonsters(); + A_Overlay(-2,"MuzzleFlash"); + A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); + A_OverlayRenderstyle(-2,STYLE_Add); + invoker.FireEffect(); + UTMainHandler.DoFlash(self,Color(32,255,128,0),1); + A_QuakeEx(2,2,2,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollintensity:0.12); + for ( int i=0; i<6; i++ ) + UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.04,-0.2),FRandom[BigGun](-0.2,0.2)),FRandom[BigGun](6,9),FRandom[BigGun](-0.2,0.8),Random[BigGun](2,4),SWING_Spring,Random[BigGun](3,6),FRandom[BigGun](1.5,2.3)); + Vector3 x, y, z, x2, y2, z2; + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); + vel -= x*(player.onground?9.5:2.5); + vel.z += (player.onground?2.8:.25); + Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+y*5-z*1); + [x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll); + double a = FRandom[BigGun](0,360), s = FRandom[BigGun](0,bAlt?0.2:0.05); + Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); + if ( !invoker.t ) invoker.t = new("BigTracer"); + invoker.t.ignoreme = self; + invoker.t.hitlist.Clear(); + invoker.t.penetration = 1000.; + invoker.t.Trace(origin,level.PointInSector(origin.xy),dir,10000.,0); + for ( int i=0; i 0 ) + { + 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_BIGGUN"; + Obituary "$O_BIGGUN"; Inventory.PickupMessage "$I_BIGGUN"; Weapon.UpSound "big/select"; Weapon.SlotNumber 9; @@ -170,11 +403,12 @@ Class BigGun : UnrealWeapon Weapon.AmmoUse 1; Weapon.AmmoType2 "BigAmmo"; Weapon.AmmoUse2 1; - Weapon.AmmoGive 10; + Weapon.AmmoGive 4; Inventory.RespawnTics 2100; +INVENTORY.IGNORESKILL; - +WEAPON.NOAUTOFIRE; - UTWeapon.DropAmmo 5; + UTWeapon.DropAmmo 4; + BigGun.ClipCount 4; + +EXTREMEDEATH; } States { @@ -183,5 +417,156 @@ Class BigGun : UnrealWeapon Stop; BIGP B -1; Stop; + Select: + BIGS A 1 A_Raise(int.max); + Wait; + Ready: + BIGS A 0 + { + UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.3,-0.2),FRandom[BigGun](0.4,0.5)),3,0,6,SWING_Spring,2,1.8); + } + BIGS ABC 2 A_WeaponReady(WRF_NOFIRE); + BIGS D 0 + { + UTMainHandler.DoSwing(self,(FRandom[BigGun](0.2,0.3),FRandom[BigGun](-0.8,-1.2)),3,0,6,SWING_Spring,2,2.0); + } + BIGS DEFGHI 2 A_WeaponReady(WRF_NOFIRE); + Goto Idle; + Dummy: + TNT1 A 1 + { + A_CheckReload(); + if ( !A_BigCheckForReload() ) + { + if ( (invoker.clipCount < invoker.default.clipcount) && (invoker.Ammo1.Amount > 0) ) + A_WeaponReady(WRF_ALLOWRELOAD); + else A_WeaponReady(); + } + } Wait; + Idle: + BIGI A 0 A_Overlay(-9999,"Dummy"); + BIGI A 20 A_Jump(80,"Twiddle1","Twiddle1","Twiddle2"); + Wait; + Twiddle1: + BIGW A 3 + { + UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.2,-0.3),FRandom[BigGun](0.2,0.3)),2,0,12,SWING_Spring,5,2); + } + BIGW BCDEFGHIJKLMNO 3; + Goto Idle; + Twiddle2: + BIGT A 2 + { + UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.2,-0.3),FRandom[BigGun](0.2,0.3)),3,0,6,SWING_Spring,5,2); + UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.2,-0.3),FRandom[BigGun](-0.4,-0.6)),4,0,12,SWING_Spring,6,1.4); + } + BIGT BCDEFGHIJKLMNOP 2; + BIGT Q 2 + { + UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.3,-0.2),FRandom[BigGun](0.4,0.5)),3,0,6,SWING_Spring,2,1.5); + } + BIGT RSTUVWXY 2; + Goto Idle; + Fire: + BIGF A 0 + { + if ( !A_BigCheckForReload(true) ) + A_Overlay(-9999,"Null"); + } + BIGF AB 2; + BIGF C 2 A_BigFire(); + BIGF DEF 2; + BIGF G 2 A_Eject(); + BIGF HIJKLMNOP 2; + Goto Idle; + AltFire: + BIGF A 0 + { + if ( !A_BigCheckForReload(true) ) + A_Overlay(-9999,"Null"); + } + BIGF AB 3; + Goto AltHold; + AltHold: + BIGF C 1 A_BigFire(); + BIGF DEF 1; + BIGF G 1 A_Eject(); + BIGF HIJK 1; + BIGF L 0 A_BigRefire(1); + Goto AltRelease; + BIGF L 1; + Goto AltHold; + AltRelease: + BIGF LMNOP 3; + Goto Idle; + DryFire: + BIGF A 0 A_Overlay(-9999,"Null"); + BIGF AB 2; + BIGF C 2 + { + A_PlaySound("big/dry",CHAN_WEAPON,Dampener.Active(self)?.3:1.); + if ( !Dampener.Active(self) ) A_AlertMonsters(); + } + BIGF LMNOP 2; + Goto Idle; + Reload: + BIGR A 0 + { + A_Overlay(-9999,"Null"); + UTMainHandler.DoSwing(self,(FRandom[BigGun](0.7,0.3),FRandom[BigGun](0.4,0.3)),3,0,10,SWING_Spring,70,0.8); + } + BIGR ABCDEFGHIJKL 2; + BIGR M 2 + { + UTMainHandler.DoSwing(self,(FRandom[BigGun](0.3,0.4),FRandom[BigGun](0.6,0.8)),6,0,3,SWING_Spring,2,3); + invoker.special1 = min(invoker.ammo1.amount,invoker.default.clipcount)-invoker.clipcount; + invoker.clipcount = -1; + A_QuakeEx(2,2,2,5,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollintensity:0.18); + A_PlaySound("big/punch",CHAN_WEAPON,Dampener.Active(self)?.3:1.); + } + BIGR NOPQRSTUVWXYZ[\] 2; + BIR2 ABCDEF 2; + BIR2 G 2 + { + UTMainHandler.DoSwing(self,(FRandom[BigGun](0.2,0.3),FRandom[BigGun](0.3,0.5)),6,0,3,SWING_Spring,2,3); + invoker.clipcount = min(invoker.ammo1.amount,invoker.default.clipcount); + invoker.Ammo1.Amount -= invoker.special1; + A_QuakeEx(1,1,1,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollintensity:0.12); + A_PlaySound("big/reload",CHAN_WEAPON,Dampener.Active(self)?.3:1.); + } + BIR2 HIJKL 2; + BIR2 M 2 + { + invoker.PlayUpSound(self); + UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.3,-0.2),FRandom[BigGun](0.4,0.5)),3,0,6,SWING_Spring,2,1.5); + } + BIR2 NOP 2; + BIR2 Q 2 + { + UTMainHandler.DoSwing(self,(FRandom[BigGun](0.2,0.3),FRandom[BigGun](-0.8,-1.2)),3,0,6,SWING_Spring,2,1.5); + } + BIR2 RSTUVWXYZ[\] 2; + BIR3 ABCDEF 2; + Goto Idle; + Deselect: + BIGD A 1 + { + A_Overlay(-9999,"Null"); + UTMainHandler.DoSwing(self,(FRandom[BigGun](0.2,0.3),FRandom[BigGun](-0.8,-1.2)),3,0,6,SWING_Spring,2,1.5); + } + BIGD BC 1; + BIGD D 1 + { + UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.3,-0.2),FRandom[BigGun](0.4,0.5)),3,0,6,SWING_Spring,2,1.5); } + BIGD EFGHIJK 1; + BIGD K 1 A_Lower(int.max); + Wait; + MuzzleFlash: + BGMF A 2 Bright + { + let l = Spawn("SniperLight",pos); + l.target = self; + } + Stop; } } diff --git a/zscript/quadshot.zsc b/zscript/quadshot.zsc index 7e8c104..6b7256c 100644 --- a/zscript/quadshot.zsc +++ b/zscript/quadshot.zsc @@ -155,7 +155,6 @@ Class QuadShot : UnrealWeapon [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); diff --git a/zscript/unrealcommon.zsc b/zscript/unrealcommon.zsc index cd7fb3b..0d68008 100644 --- a/zscript/unrealcommon.zsc +++ b/zscript/unrealcommon.zsc @@ -201,7 +201,7 @@ Class UPlayer : UTPlayer dsp.pendingupgrade = 4; else { - dsp.upgradelevel = 4; + dsp.pendingupgrade = dsp.upgradelevel = 4; dsp.MainUse = min(6,dsp.upgradelevel+1); } }