From ce68db4b36c3005f853568d1d7f90b5c9f02adea Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Mon, 2 Sep 2019 21:17:03 +0200 Subject: [PATCH] Dispersion Pistol fully implemented. Jump boots (mostly) implemented (replacement feature not done yet). Various adjustments. DamNums coloring support. --- Readme.md | 3 +- gldefs.txt | 56 +++++ language.txt | 10 + menudef.txt | 2 +- modeldef.dpistol | 181 ++++++++++++++ modeldef.umisc | 11 + models/lboot_a.3d | Bin 0 -> 212 bytes models/lboot_d.3d | Bin 0 -> 1584 bytes sndinfo.txt | 5 + sounds/lbootwk1.ogg | Bin 0 -> 10392 bytes sounds/lbootwk2.ogg | Bin 0 -> 10425 bytes sounds/lbootwk3.ogg | Bin 0 -> 10291 bytes trnslate.txt | 2 + zscript/asmd.zsc | 1 - zscript/dispersionpistol.zsc | 467 +++++++++++++++++++++++++++++++++-- zscript/miscitems.zsc | 21 +- zscript/stinger.zsc | 2 +- zscript/uarmoritems.zsc | 2 + zscript/unrealcommon.zsc | 26 +- zscript/unrealhud.zsc | 4 +- zscript/upowerups.zsc | 60 +++++ zscript/utranslocator.zsc | 5 + 22 files changed, 822 insertions(+), 36 deletions(-) create mode 100644 models/lboot_a.3d create mode 100644 models/lboot_d.3d create mode 100644 sounds/lbootwk1.ogg create mode 100644 sounds/lbootwk2.ogg create mode 100644 sounds/lbootwk3.ogg diff --git a/Readme.md b/Readme.md index 8b5f600..1ef20f7 100644 --- a/Readme.md +++ b/Readme.md @@ -8,6 +8,7 @@ Doom Tournament (currently the devel branch is required). ## Currently Implemented + - Dispersion Pistol (slot 1) (replaces fist) - Automag (slot 2) (replaces pistol) - Dual Automags - Stinger (slot 3) (replaces shotguns) @@ -37,7 +38,6 @@ Doom Tournament (currently the devel branch is required). ## In progress - Flak Cannon (slot 6) (replaces rocket launcher) - - Dispersion Pistol (slot 1) (replaces fist) - Flashlight (replaces light amplifier) - Searchlight (must be placed manually for balance reasons) @@ -71,6 +71,7 @@ Doom Tournament (currently the devel branch is required). - Autocannon (slot 0) (replaces bfg9000) - Motion Detector (replaces computer map) + - Light & Dark Flares - Minigun Sentry (rare spawn in backpacks) ## Known bugs diff --git a/gldefs.txt b/gldefs.txt index d876130..f83a276 100644 --- a/gldefs.txt +++ b/gldefs.txt @@ -186,6 +186,62 @@ Object FlareThrownX frame "FLAR" { light "FLARELIGHT" } } +FlickerLight2 DAMMOLIGHT1 +{ + Color 0.2 0.2 1.0 + Size 72 + SecondarySize 80 + Interval 0.1 +} +FlickerLight2 DAMMOLIGHT2 +{ + Color 0.2 1.0 0.2 + Size 72 + SecondarySize 80 + Interval 0.1 +} +FlickerLight2 DAMMOLIGHT3 +{ + Color 1.0 1.0 0.2 + Size 72 + SecondarySize 80 + Interval 0.1 +} +FlickerLight2 DAMMOLIGHT4 +{ + Color 1.0 0.6 0.2 + Size 72 + SecondarySize 80 + Interval 0.1 +} +FlickerLight2 DAMMOLIGHT5 +{ + Color 1.0 0.2 0.2 + Size 72 + SecondarySize 80 + Interval 0.1 +} +Object DispersionAmmo +{ + Frame "DISM" { light "DAMMOLIGHT1" } +} +Object DAmmo2 +{ + Frame "DISM" { light "DAMMOLIGHT2" } +} +Object DAmmo3 +{ + Frame "DISM" { light "DAMMOLIGHT3" } +} +Object DAmmo4 +{ + Frame "DISM" { light "DAMMOLIGHT4" } +} +Object DAmmo5 +{ + Frame "DISM" { light "DAMMOLIGHT5" } +} + // Shaders / Brightmaps HardwareShader Texture "graphics/MenuBarr.png" { diff --git a/language.txt b/language.txt index 5ee67b2..ac3ecc8 100644 --- a/language.txt +++ b/language.txt @@ -1,4 +1,14 @@ [default eng enc ena enz eni ens enj enb enl ent enw] +/* DamNums support */ +DAMNUM_TYPECOLOR_DAMMO1 = "DamBlue"; +DAMNUM_TYPECOLOR_DAMMO2 = "DamGreen"; +DAMNUM_TYPECOLOR_DAMMO3 = "DamYellow"; +DAMNUM_TYPECOLOR_DAMMO4 = "DamOrange"; +DAMNUM_TYPECOLOR_DAMMO5 = "DamRed"; +DAMNUM_TYPECOLOR_STINGER = "DamTeal"; +DAMNUM_TYPECOLOR_EXPLODED = "DamGold"; +DAMNUM_TYPECOLOR_STUNNED = "DamLightBlue"; +DAMNUM_TYPECOLOR_IMPALER = "DamMagenta"; /* Obituaries */ O_DPISTOL = "%o was killed by %k's Dispersion Pistol. What a loser!"; O_AUTOMAG = "%o got gatted by %k's Automag."; diff --git a/menudef.txt b/menudef.txt index b66fd6a..4302f94 100644 --- a/menudef.txt +++ b/menudef.txt @@ -25,7 +25,7 @@ OptionMenu "UnrealOptionMenu" StaticText "$STING_POPTS", "Gold" Option "$STING_TELEHAND", "sting_telegun", "YesNo" Option "$STING_FLARES", "sting_flares", "YesNo" - Command "$FLAK_APPLY", "event refreshtrans" + Command "$FLAK_APPLY", "netevent refreshtrans" Option "$STING_STINGER", "sting_stinger", "YesNo" Option "$STING_RIFLE", "sting_rifle", "YesNo" Option "$STING_RIFLEL", "sting_riflel", "YesNo" diff --git a/modeldef.dpistol b/modeldef.dpistol index 14f467a..2a62326 100644 --- a/modeldef.dpistol +++ b/modeldef.dpistol @@ -40,6 +40,187 @@ Model "WeaponPowerUpX" FrameIndex WPOW T 0 19 } +Model "DispersionAmmo" +{ + Path "models" + Model 0 "DispM1_d.3d" + Scale 0.3 0.18 0.096 + Offset 8 0 0 + AngleOffset 90 + + PITCHFROMMOMENTUM + DONTCULLBACKFACES + + SurfaceSkin 0 0 "sprites/dpistol/DETBA0.png" + SurfaceSkin 0 1 "ArcB1.png" + FrameIndex DISM A 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETBB0.png" + SurfaceSkin 0 1 "ArcB2.png" + FrameIndex DISM B 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETBC0.png" + SurfaceSkin 0 1 "ArcB3.png" + FrameIndex DISM C 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETBD0.png" + SurfaceSkin 0 1 "ArcB4.png" + FrameIndex DISM D 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETBE0.png" + SurfaceSkin 0 1 "ArcB5.png" + FrameIndex DISM E 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETBD0.png" + SurfaceSkin 0 1 "ArcB6.png" + FrameIndex DISM F 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETBC0.png" + SurfaceSkin 0 1 "ArcB7.png" + FrameIndex DISM G 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETBB0.png" + SurfaceSkin 0 1 "ArcB8.png" + FrameIndex DISM H 0 0 +} +Model "DAmmo2" +{ + Path "models" + Model 0 "DispM1_d.3d" + Scale 0.3 0.18 0.096 + Offset 8 0 0 + AngleOffset 90 + + PITCHFROMMOMENTUM + DONTCULLBACKFACES + + SurfaceSkin 0 0 "sprites/dpistol/DETGA0.png" + SurfaceSkin 0 1 "ArcG1.png" + FrameIndex DISM A 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETGB0.png" + SurfaceSkin 0 1 "ArcG2.png" + FrameIndex DISM B 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETGC0.png" + SurfaceSkin 0 1 "ArcG3.png" + FrameIndex DISM C 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETGD0.png" + SurfaceSkin 0 1 "ArcG4.png" + FrameIndex DISM D 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETGE0.png" + SurfaceSkin 0 1 "ArcG5.png" + FrameIndex DISM E 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETGD0.png" + SurfaceSkin 0 1 "ArcG6.png" + FrameIndex DISM F 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETGC0.png" + SurfaceSkin 0 1 "ArcG7.png" + FrameIndex DISM G 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETGB0.png" + SurfaceSkin 0 1 "ArcG8.png" + FrameIndex DISM H 0 0 +} +Model "DAmmo3" +{ + Path "models" + Model 0 "DispM1_d.3d" + Scale 0.3 0.18 0.096 + Offset 8 0 0 + AngleOffset 90 + + PITCHFROMMOMENTUM + DONTCULLBACKFACES + + SurfaceSkin 0 0 "sprites/dpistol/DETYA0.png" + SurfaceSkin 0 1 "ArcY1.png" + FrameIndex DISM A 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETYB0.png" + SurfaceSkin 0 1 "ArcY2.png" + FrameIndex DISM B 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETYC0.png" + SurfaceSkin 0 1 "ArcY3.png" + FrameIndex DISM C 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETYD0.png" + SurfaceSkin 0 1 "ArcY4.png" + FrameIndex DISM D 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETYE0.png" + SurfaceSkin 0 1 "ArcY5.png" + FrameIndex DISM E 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETYD0.png" + SurfaceSkin 0 1 "ArcY6.png" + FrameIndex DISM F 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETYC0.png" + SurfaceSkin 0 1 "ArcY7.png" + FrameIndex DISM G 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETYB0.png" + SurfaceSkin 0 1 "ArcY8.png" + FrameIndex DISM H 0 0 +} +Model "DAmmo4" +{ + Path "models" + Model 0 "DispM1_d.3d" + Scale 0.3 0.18 0.096 + Offset 8 0 0 + AngleOffset 90 + + PITCHFROMMOMENTUM + DONTCULLBACKFACES + + SurfaceSkin 0 0 "sprites/dpistol/DETOA0.png" + SurfaceSkin 0 1 "ArcO1.png" + FrameIndex DISM A 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETOB0.png" + SurfaceSkin 0 1 "ArcO2.png" + FrameIndex DISM B 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETOC0.png" + SurfaceSkin 0 1 "ArcO3.png" + FrameIndex DISM C 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETOD0.png" + SurfaceSkin 0 1 "ArcO4.png" + FrameIndex DISM D 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETOE0.png" + SurfaceSkin 0 1 "ArcO5.png" + FrameIndex DISM E 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETOD0.png" + SurfaceSkin 0 1 "ArcO6.png" + FrameIndex DISM F 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETOC0.png" + SurfaceSkin 0 1 "ArcO7.png" + FrameIndex DISM G 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETOB0.png" + SurfaceSkin 0 1 "ArcO8.png" + FrameIndex DISM H 0 0 +} +Model "DAmmo5" +{ + Path "models" + Model 0 "DispM1_d.3d" + Scale 0.3 0.18 0.096 + Offset 8 0 0 + AngleOffset 90 + + PITCHFROMMOMENTUM + DONTCULLBACKFACES + + SurfaceSkin 0 0 "sprites/dpistol/DETRA0.png" + SurfaceSkin 0 1 "ArcR1.png" + FrameIndex DISM A 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETRB0.png" + SurfaceSkin 0 1 "ArcR2.png" + FrameIndex DISM B 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETRC0.png" + SurfaceSkin 0 1 "ArcR3.png" + FrameIndex DISM C 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETRD0.png" + SurfaceSkin 0 1 "ArcR4.png" + FrameIndex DISM D 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETRE0.png" + SurfaceSkin 0 1 "ArcR5.png" + FrameIndex DISM E 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETRD0.png" + SurfaceSkin 0 1 "ArcR6.png" + FrameIndex DISM F 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETRC0.png" + SurfaceSkin 0 1 "ArcR7.png" + FrameIndex DISM G 0 0 + SurfaceSkin 0 0 "sprites/dpistol/DETRB0.png" + SurfaceSkin 0 1 "ArcR8.png" + FrameIndex DISM H 0 0 +} + Model "DispersionPistol" { Path "models" diff --git a/modeldef.umisc b/modeldef.umisc index 80de2f0..0415fbb 100644 --- a/modeldef.umisc +++ b/modeldef.umisc @@ -381,3 +381,14 @@ Model "FlareThrownX" FrameIndex FLAR A 0 1 } + +Model "UJumpBoots" +{ + Path "models" + Model 0 "lboot_d.3d" + Skin 0 "Jlboot1.png" + Scale 0.06 0.06 0.072 + ZOffset 6 + + FrameIndex JBUT A 0 0 +} diff --git a/models/lboot_a.3d b/models/lboot_a.3d new file mode 100644 index 0000000000000000000000000000000000000000..4613b69632b28f9e92015de7717a4ce0ba417829 GIT binary patch literal 212 zcmZQ%xWJ$n;V9zEc;Hs?_CL3OZ*aP8#CbsMn}zLdmlgj$=kqt;-j%?9|Jk|;&zu5U z@9%bCf4gcy^DDg-bt24+`($FjyFGZZ&Hh0mJNs*9&L)}F5qn-SrZGQzxz7HzdqwLj zrT4aXTp}F5D3u?)T`>L7Gfj8@+lKo7ABEx^-xaIZKI6}0ytlfdNlJIS*LB1BU0-}M z+CEfnIB{cj$6hJviF;qA#y7r_E^K;rp^WE4#R88{M(O_^o^9*7W0-&N;nV=P*Pa2# XZY7s7+)11N@8y&Tw)<&m2i^k!>0xbL literal 0 HcmV?d00001 diff --git a/models/lboot_d.3d b/models/lboot_d.3d new file mode 100644 index 0000000000000000000000000000000000000000..d84653d78e8e063d12bbf598d8e5dbd77a4efc83 GIT binary patch literal 1584 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 literal 0 HcmV?d00001 diff --git a/sounds/lbootwk3.ogg b/sounds/lbootwk3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8b596eaf70134e3c6a5d2c3916a701c95e8b58a0 GIT binary patch literal 10291 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 literal 0 HcmV?d00001 diff --git a/trnslate.txt b/trnslate.txt index ec400eb..44a1bf1 100644 --- a/trnslate.txt +++ b/trnslate.txt @@ -1 +1,3 @@ +DamTeal="0:255=%[0,0,0]:[0.30,0.76,1.20]" +DamMagenta="0:255=%[0,0,0]:[1.50,0.30,1.50]" RedIcon="0:255=#[255,0,0]" diff --git a/zscript/asmd.zsc b/zscript/asmd.zsc index ad25266..56ad1cb 100644 --- a/zscript/asmd.zsc +++ b/zscript/asmd.zsc @@ -222,7 +222,6 @@ Class ASMDSpark : Actor +FORCEXYBILLBOARD; +THRUACTORS; +ROLLSPRITE; - +ROLLCENTER; +NOTELEPORT; +DONTSPLASH; +CANBOUNCEWATER; diff --git a/zscript/dispersionpistol.zsc b/zscript/dispersionpistol.zsc index 6228366..2037965 100644 --- a/zscript/dispersionpistol.zsc +++ b/zscript/dispersionpistol.zsc @@ -11,7 +11,7 @@ Class WeaponPowerUp : Inventory override bool TryPickup( in out Actor toucher ) { if ( !toucher.FindInventory("DispersionPistol") ) return false; - let damo = DispersionAmmo(toucher.FindInventory("DispersionAmmo")); + let damo = DefaultAmmo(toucher.FindInventory("DefaultAmmo")); if ( damo ) { damo.BackpackMaxAmount = damo.MaxAmount = min(90,damo.MaxAmount+10); @@ -60,7 +60,7 @@ Class WeaponPowerUpX : ASMDAmmoX } } -Class DispersionAmmo : Ammo +Class DefaultAmmo : Ammo { double rechargephase, rechargespeed; @@ -85,6 +85,361 @@ Class DispersionAmmo : Ammo } } +Class DispExLight1 : PaletteLight +{ + Default + { + Tag "DBlue"; + Args 0,0,0,80; + ReactionTime 25; + } +} +Class DispExLight2 : PaletteLight +{ + Default + { + Tag "DGreen"; + Args 0,0,0,80; + ReactionTime 25; + } +} +Class DispExLight3 : PaletteLight +{ + Default + { + Tag "DYellow"; + Args 0,0,0,80; + ReactionTime 25; + } +} +Class DispExLight4 : PaletteLight +{ + Default + { + Tag "DOrange"; + Args 0,0,0,80; + ReactionTime 25; + } +} +Class DispExLight5 : PaletteLight +{ + Default + { + Tag "DRed"; + Args 0,0,0,80; + ReactionTime 25; + } +} + +Class DispBurst1 : ASMDSpark +{ + States + { + Spawn: + DEFB ABCDEFG 1 Bright + { + A_FadeOut(FRandom[ASMD](0.0,0.3)); + vel *= 0.95; + } + Loop; + } +} +Class DispBurst2 : DispBurst1 +{ + States + { + Spawn: + DEFG ABCDEFG 1 Bright + { + A_FadeOut(FRandom[ASMD](0.0,0.3)); + vel *= 0.95; + } + Loop; + } +} +Class DispBurst3 : DispBurst1 +{ + States + { + Spawn: + DEFY ABCDEFG 1 Bright + { + A_FadeOut(FRandom[ASMD](0.0,0.3)); + vel *= 0.95; + } + Loop; + } +} +Class DispBurst4 : DispBurst1 +{ + States + { + Spawn: + DEFO ABCDEFG 1 Bright + { + A_FadeOut(FRandom[ASMD](0.0,0.3)); + vel *= 0.95; + } + Loop; + } +} +Class DispBurst5 : DispBurst1 +{ + States + { + Spawn: + DEFR ABCDEFG 1 Bright + { + A_FadeOut(FRandom[ASMD](0.0,0.3)); + vel *= 0.95; + } + Loop; + } +} +Class ViewDispBurst1 : ViewASMDSpark +{ + States + { + Spawn: + DEFB ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3)); + Loop; + } +} +Class ViewDispBurst2 : ViewDispBurst1 +{ + States + { + Spawn: + DEFG ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3)); + Loop; + } +} +Class ViewDispBurst3 : ViewDispBurst1 +{ + States + { + Spawn: + DEFY ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3)); + Loop; + } +} +Class ViewDispBurst4 : ViewDispBurst1 +{ + States + { + Spawn: + DEFO ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3)); + Loop; + } +} +Class ViewDispBurst5 : ViewDispBurst1 +{ + States + { + Spawn: + DEFR ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3)); + Loop; + } +} + +Class DispExplo1 : Actor +{ + Default + { + RenderStyle "Add"; + Scale 0.4; + +NOGRAVITY; + +NOBLOCKMAP; + Radius 0.1; + Height 0; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + Scale.x *= RandomPick[DPistol](-1,1); + Scale.y *= RandomPick[DPistol](-1,1); + } + States + { + Spawn: + DSEB ABCDEFGHIJ 2 Bright; + Stop; + } +} +Class DispExplo2 : DispExplo1 +{ + States + { + Spawn: + DISE ABCDEFGHIJ 2 Bright; + Stop; + } +} +Class DispExplo3 : DispExplo1 +{ + States + { + Spawn: + DSEY ABCDEFGHIJ 2 Bright; + Stop; + } +} +Class DispExplo4 : DispExplo1 +{ + States + { + Spawn: + DSEO ABCDEFGHIJ 2 Bright; + Stop; + } +} +Class DispExplo5 : DispExplo1 +{ + States + { + Spawn: + DSER ABCDEFGHIJ 2 Bright; + Stop; + } +} + +// yes this is the projectile class name, blame Epic +Class DispersionAmmo : Actor +{ + Class LightClass, BurstClass, ExploClass; + double mult; + + Property LightClass : LightClass; + Property BurstClass : BurstClass; + Property ExploClass : ExploClass; + + action void A_DispTrail() + { + Vector3 x, y, z, dir; + double a, s; + Actor p; + [x,y,z] = dt_CoordUtil.GetAxes(pitch,angle,roll); + for ( int i=0; i<3; i++ ) + { + a = FRandom[DPistol](0,360); + s = FRandom[ASMD](0,0.35); + dir = (-x+y*cos(a)*s+z*sin(a)*s).unit(); + p = Spawn(invoker.BurstClass,level.Vec3Offset(pos,scale.x*(dir*16.+x*32.))); + p.A_SetScale(0.1*min(0.8+invoker.mult*0.75,1.5)); + p.vel = vel*0.5+dir*FRandom[DPistol](3,8); + } + } + action void A_DispExpl() + { + UTMainHandler.DoKnockback(tracer,(cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)),6000); + A_AlertMonsters(); + A_SprayDecal("RazorBlast",20); + Spawn(invoker.LightClass,pos); + Actor a; + double ang, pt; + int numpt = int(Random[DPistol](12,18)*invoker.mult); + for ( int i=0; i proj, part; + int ulevel = invoker.upgradelevel; + if ( !(sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true)) ) + { + if ( weap.Ammo1.Amount < max(10,invoker.MainUse) ) + { + weap.Ammo1.Amount -= 1; + ulevel = 0; + } + else weap.Ammo1.Amount -= invoker.MainUse; + } + switch ( ulevel ) { case 0: + proj = "DispersionAmmo"; + part = "ViewDispBurst1"; UTMainHandler.DoFlash(self,Color(80,96,64,255),1); A_Overlay(PSP_FLASH,"Flash1"); break; case 1: + proj = "DAmmo2"; + part = "ViewDispBurst2"; UTMainHandler.DoFlash(self,Color(80,64,255,96),1); A_Overlay(PSP_FLASH,"Flash2"); break; case 2: + proj = "DAmmo3"; + part = "ViewDispBurst3"; UTMainHandler.DoFlash(self,Color(80,255,255,96),1); A_Overlay(PSP_FLASH,"Flash3"); break; case 3: + proj = "DAmmo4"; + part = "ViewDispBurst4"; UTMainHandler.DoFlash(self,Color(80,255,160,64),1); A_Overlay(PSP_FLASH,"Flash4"); break; default: + proj = "DAmmo5"; + part = "ViewDispBurst5"; UTMainHandler.DoFlash(self,Color(80,255,96,64),1); A_Overlay(PSP_FLASH,"Flash5"); break; @@ -172,6 +549,23 @@ Class DispersionPistol : UnrealWeapon UTMainHandler.DoSwing(self,(FRandom[DPistol](-0.1,-0.3),FRandom[DPistol](-0.1,0.3)),2,-0.3,3,SWING_Spring,0,3); if ( !Dampener.Active(self) ) A_AlertMonsters(); A_QuakeEx(2,2,2,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); + Vector3 x, y, z; + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); + Vector3 origin = (pos.x,pos.y,player.viewz)+10*x+3*y-3*z; + Actor p = Spawn(proj,origin); + p.angle = angle; + p.pitch = BulletSlope(); + p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed; + p.target = self; + DispersionAmmo(p).mult = mult; + int numpt = Random[DPistol](10,20); + for ( int i=0; i proj, part; switch ( ulevel ) { case 0: + proj = "DispersionAmmo"; + part = "ViewDispBurst1"; UTMainHandler.DoFlash(self,Color(80,96,64,255),1); A_Overlay(PSP_FLASH,"Flash1"); break; case 1: + proj = "DAmmo2"; + part = "ViewDispBurst2"; UTMainHandler.DoFlash(self,Color(80,64,255,96),1); A_Overlay(PSP_FLASH,"Flash2"); break; case 2: + proj = "DAmmo3"; + part = "ViewDispBurst3"; UTMainHandler.DoFlash(self,Color(80,255,255,96),1); A_Overlay(PSP_FLASH,"Flash3"); break; case 3: + proj = "DAmmo4"; + part = "ViewDispBurst4"; UTMainHandler.DoFlash(self,Color(80,255,160,64),1); A_Overlay(PSP_FLASH,"Flash4"); break; default: + proj = "DAmmo5"; + part = "ViewDispBurst5"; UTMainHandler.DoFlash(self,Color(80,255,96,64),1); A_Overlay(PSP_FLASH,"Flash5"); break; @@ -216,12 +621,32 @@ Class DispersionPistol : UnrealWeapon if ( !Dampener.Active(self) ) A_AlertMonsters(); int qs = int(1+invoker.chargesize*0.3); A_QuakeEx(qs,qs,qs,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); + Vector3 x, y, z; + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); + Vector3 origin = (pos.x,pos.y,player.viewz)+10*x+3*y-3*z; + Actor p = Spawn(proj,origin); + p.angle = angle; + p.pitch = BulletSlope(); + p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed; + p.target = self; + p.bAMBUSH = true; + double scl = 0.5+invoker.chargesize*0.6; + p.scale *= scl; + DispersionAmmo(p).mult = scl*mult*1.1; + int numpt = Random[DPistol](10,20); + for ( int i=0; i= 5.) ) - return true; + if ( invoker.chargesize >= 5. ) return true; + if ( !(sv_infiniteammo || (FindInventory('PowerInfiniteAmmo',true))) ) + { + if ( weap.Ammo1.Amount < invoker.ChargeUse ) return true; + weap.Ammo1.Amount -= invoker.ChargeUse; + } return false; } - override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount ) - { - if ( bCharging ) return true; - return Super.CheckAmmo(fireMode,autoSwitch,requireAmmo,ammocount); - } Default { Tag "$T_DPISTOL"; @@ -246,9 +669,9 @@ Class DispersionPistol : UnrealWeapon Weapon.UpSound "dpistol/select"; Weapon.SlotNumber 1; Weapon.SelectionOrder 1; - Weapon.AmmoType "DispersionAmmo"; + Weapon.AmmoType "DefaultAmmo"; Weapon.AmmoUse 1; - Weapon.AmmoType2 "DispersionAmmo"; + Weapon.AmmoType2 "DefaultAmmo"; Weapon.AmmoUse2 1; Weapon.AmmoGive 50; UTWeapon.DropAmmo 25; @@ -294,7 +717,9 @@ Class DispersionPistol : UnrealWeapon TNT1 A 1 { A_CheckReload(); - A_WeaponReady(); + let weap = Weapon(invoker); + if ( weap && weap.Ammo1.Amount > 0 ) A_WeaponReady(); + else A_WeaponReady(WRF_NOFIRE); } Wait; Idle: @@ -423,7 +848,7 @@ Class DispersionPistol : UnrealWeapon #### # 0 { A_Overlay(-9999,"Null"); - invoker.AmmoUse1 = min(6,invoker.upgradelevel+1); + invoker.MainUse = min(6,invoker.upgradelevel+1); if ( invoker.upgradelevel == 0 ) return ResolveState("Idle"); else if ( invoker.upgradelevel == 1 ) return ResolveState("Upgrade1"); else if ( invoker.upgradelevel == 2 ) return ResolveState("Upgrade2"); diff --git a/zscript/miscitems.zsc b/zscript/miscitems.zsc index 34a1ea4..06152e0 100644 --- a/zscript/miscitems.zsc +++ b/zscript/miscitems.zsc @@ -570,8 +570,8 @@ Class FlareThrown : Actor States { Spawn: - FLAR A -1; - Stop; + FLAR A 1 A_JumpIf(ReactionTime<=0,"Death"); + Wait; Bounce: FLAR A 0 { @@ -697,11 +697,24 @@ Class FlareThrownX : Actor } } -Class LightFlare : UnrealInventory +Class BetaFlare : UnrealInventory +{ + Class ThrownClass; + + Property ThrownClass : ThrownClass; + + override bool TryPickup( in out Actor toucher ) + { + if ( !sting_flares ) return false; // not allowed + return Super.TryPickup(toucher); + } +} + +Class LightFlare : BetaFlare { } -Class DarkFlare : UnrealInventory +Class DarkFlare : BetaFlare { } diff --git a/zscript/stinger.zsc b/zscript/stinger.zsc index b372a09..c4f5634 100644 --- a/zscript/stinger.zsc +++ b/zscript/stinger.zsc @@ -152,7 +152,7 @@ Class StingerProjectile : Actor Default { Obituary "$O_STINGER"; - DamageType 'shot'; + DamageType 'Stinger'; DamageFunction Random[Stinger](15,25); Speed 40; Radius 2; diff --git a/zscript/uarmoritems.zsc b/zscript/uarmoritems.zsc index 20ee6f6..f8366f3 100644 --- a/zscript/uarmoritems.zsc +++ b/zscript/uarmoritems.zsc @@ -172,6 +172,7 @@ Class ShieldBelt : UnrealArmor Tag "$T_SHIELDBELT"; +COUNTITEM; +INVENTORY.BIGPOWERUP; + +INVENTORY.ALWAYSPICKUP; Inventory.Amount 100; Inventory.MaxAmount 100; Inventory.InterHubAmount 100; @@ -228,6 +229,7 @@ Class PowerShield : UnrealArmor Tag "$T_POWERSHIELD"; +COUNTITEM; +INVENTORY.BIGPOWERUP; + +INVENTORY.ALWAYSPICKUP; Inventory.Amount 200; Inventory.MaxAmount 200; Inventory.InterHubAmount 200; diff --git a/zscript/unrealcommon.zsc b/zscript/unrealcommon.zsc index e945170..6afb462 100644 --- a/zscript/unrealcommon.zsc +++ b/zscript/unrealcommon.zsc @@ -5,7 +5,7 @@ Class UPlayer : UTPlayer Player.StartItem "Automag"; Player.StartItem "DispersionPistol"; Player.StartItem "UMiniAmmo", 30; - Player.StartItem "DispersionAmmo", 50; + Player.StartItem "DefaultAmmo", 50; } // Have to modify the give cheat to handle UT armor @@ -124,7 +124,7 @@ Class UPlayer : UTPlayer let type = (class)(AllActorClasses[i]); if ( !type ) continue; let def = GetDefaultByType (type); - if ( def.Icon.isValid() && (def.MaxAmount > 1) && + if ( def.Icon.isValid() && ((def.MaxAmount > 1) || (type is 'UnrealInventory')) && !(type is "PuzzleItem") && !(type is "Powerup") && !(type is "Ammo") && !(type is "Armor") ) { // Do not give replaced items unless using "give everything" @@ -177,7 +177,7 @@ Class UPlayer : UTPlayer override void PlayFootstep( double vol ) { let boot = UJumpBoots(FindInventory("UJumpBoots")); - if ( boot && boot.bActive ) A_PlaySound("u1/metalfootstep",CHAN_5,min(1.,vol*2)); + if ( boot ) A_PlaySound("u1/bootfootstep",CHAN_5,min(1.,vol*2)); else A_PlaySound("ut/playerfootstep",CHAN_5,vol); } } @@ -467,6 +467,17 @@ Class UPlayerMale : UPlayer } Class UPlayerMale1 : UPlayerMale { + override void PlayFootstep( double vol ) + { + let boot = UJumpBoots(FindInventory("UJumpBoots")); + if ( boot ) A_PlaySound("u1/bootfootstep",CHAN_5,min(1.,vol*2)); + else + { + double ang = level.time/(20*TICRATE/35.)*360.; + if ( sin(ang) > 0 ) A_PlaySound("u1/metalfootstep",CHAN_5,min(1.,vol*2)); + else A_PlaySound("ut/playerfootstep",CHAN_5,vol); + } + } Default { Player.DisplayName "$N_MALE1"; @@ -541,6 +552,7 @@ Class UnrealInventory : Inventory { Super.AttachToOwner(other); Charge = DefaultCharge; + InterHubAmount = MaxAmount; // it's annoying to set this per-subclass } override bool HandlePickup( Inventory item ) { @@ -560,11 +572,15 @@ Class UnrealInventory : Inventory if ( bDROPPED && (pos.z <= floorz) ) vel.xy *= 0; } + override void DetachFromOwner() + { + Super.DetachFromOwner(); + // deactivate + bActive = false; + } override void OnDrop( Actor dropper ) { Super.OnDrop(dropper); - // deactivate - bActive = false; // drop like weapons Vector2 hofs = RotateVector((dropper.radius,0),dropper.angle); SetOrigin(dropper.Vec3Offset(hofs.x,hofs.y,dropper.height*0.5),false); diff --git a/zscript/unrealhud.zsc b/zscript/unrealhud.zsc index ada40af..378fd00 100644 --- a/zscript/unrealhud.zsc +++ b/zscript/unrealhud.zsc @@ -106,7 +106,7 @@ Class UnrealHUD : BaseStatusBar OldAmmo[15] = "Big083"; OldAmmo[16] = "Smini083"; OldAmmo[17] = "Peace083"; - OldAmmoType[0] = "DispersionAmmo"; + OldAmmoType[0] = "DefaultAmmo"; OldAmmoType[1] = "UMiniAmmo"; OldAmmoType[2] = "StingerAmmo"; OldAmmoType[3] = "AsmdAmmo"; @@ -233,7 +233,7 @@ Class UnrealHUD : BaseStatusBar Screen.DrawTexture(IconBase,false,CurX,CurY,DTA_VirtualWidthF,ClipX,DTA_VirtualHeightF,ClipY,DTA_KeepRatio,true); Screen.DrawTexture(i.Icon,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_TopOffset,0,DTA_LeftOffset,0); } - if ( (i is 'UnrealInventory') && (UnrealInventory(i).DefaultCharge > 0) && (UnrealInventory(i).Charge < UnrealInventory(i).DefaultCharge) ) + if ( (i is 'UnrealInventory') && (UnrealInventory(i).DefaultCharge > 0) ) Screen.DrawTexture(HudLine,false,CurX+2,CurY+29,DTA_VirtualWidthF,ClipX,DTA_VirtualHeightF,ClipY,DTA_KeepRatio,true,DTA_WindowRightF,Min(28.*(UnrealInventory(i).Charge/double(UnrealInventory(i).DefaultCharge)),28.)); else if ( (i is 'UTArmor') && !HudMode ) Screen.DrawTexture(HudLine,false,CurX+2,CurY+29,DTA_VirtualWidthF,ClipX,DTA_VirtualHeightF,ClipY,DTA_KeepRatio,true,DTA_WindowRightF,Min(28.*(i.Amount/double(i.MaxAmount)),28.)); diff --git a/zscript/upowerups.zsc b/zscript/upowerups.zsc index 61c2715..ba347be 100644 --- a/zscript/upowerups.zsc +++ b/zscript/upowerups.zsc @@ -186,6 +186,49 @@ Class AmpSound : Actor Class UJumpBoots : UnrealInventory { + int draincnt; + Default + { + Tag "$T_JUMPBOOTS"; + +COUNTITEM; + +INVENTORY.BIGPOWERUP; + +INVENTORY.ALWAYSPICKUP; + Inventory.MaxAmount 3; + Inventory.Icon "I_Boots"; + Inventory.PickupMessage "$I_JUMPBOOTS"; + Inventory.RespawnTics 1050; + UnrealInventory.Charge 3; + } + override bool Use( bool pickup ) + { + if ( pickup ) return false; + bActive = !bActive; + Owner.A_PlaySound("boot/pickup",CHAN_ITEM); + if ( bActive ) Owner.GiveInventory("PowerJumpBoots_HighJump",1); + else Owner.TakeInventory("PowerJumpBoots_HighJump",1); + return false; + } + override void Tick() + { + Super.Tick(); + if ( !Owner || !Owner.player ) return; + draincnt++; + if ( (draincnt >= 700) || (bActive && (owner.player.jumptics == -1)) ) + { + draincnt = 0; + charge--; + Owner.A_PlaySound("boot/jump",CHAN_BODY); + } + else if ( (charge <= 0) && owner.player.onground ) + { + if ( Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_JUMPBOOTS")); + Amount--; + Owner.TakeInventory("PowerJumpBoots_HighJump",1); + charge = defaultcharge; + bActive = false; + if ( Amount <= 0 ) DepleteOrDestroy(); + } + } override void PostBeginPlay() { Super.PostBeginPlay(); @@ -206,6 +249,23 @@ Class UJumpBoots : UnrealInventory } // TODO replace self with asbestos/toxin suits or scuba } + override void AttachToOwner( Actor Other ) + { + Super.AttachToOwner(Other); + Other.GiveInventory("PowerJumpBoots_IronFeet",1); + } + override void DetachFromOwner() + { + Super.DetachFromOwner(); + Owner.TakeInventory("PowerJumpBoots_HighJump",1); + Owner.TakeInventory("PowerJumpBoots_IronFeet",1); + } + States + { + Spawn: + JBUT A -1; + Stop; + } } Class MotionDetector : UnrealInventory diff --git a/zscript/utranslocator.zsc b/zscript/utranslocator.zsc index d1edbdd..accdf9b 100644 --- a/zscript/utranslocator.zsc +++ b/zscript/utranslocator.zsc @@ -4,4 +4,9 @@ Class UTranslocatorAmmo : Ammo Class UTranslocator : UnrealWeapon { + override bool TryPickup( in out Actor toucher ) + { + if ( !sting_telegun ) return false; // not allowed + return Super.TryPickup(toucher); + } }