commit 356219ae5c79811631908592aa0325e7ef2da1fa Author: Marisa Kirisame Date: Tue May 15 02:22:27 2018 +0200 First public commit. diff --git a/animdefs.txt b/animdefs.txt new file mode 100644 index 0000000..ffeb9c3 --- /dev/null +++ b/animdefs.txt @@ -0,0 +1,7 @@ +texture static1 + allowdecals + random + pic static1 tics 1 + pic static2 tics 1 + pic static3 tics 1 + pic static4 tics 1 diff --git a/cvarinfo.txt b/cvarinfo.txt new file mode 100644 index 0000000..cc2c7d6 --- /dev/null +++ b/cvarinfo.txt @@ -0,0 +1 @@ +user bool flak_protomenu = false; diff --git a/decaldef.txt b/decaldef.txt new file mode 100644 index 0000000..6591d2e --- /dev/null +++ b/decaldef.txt @@ -0,0 +1,92 @@ +decal WallCrack1 +{ + pic WallCrk1 + translucent 0.75 + shade "00 00 00" + x-scale 0.25 + y-scale 0.25 + randomflipx + randomflipy +} +decal WallCrack2 +{ + pic WallCrk2 + translucent 0.75 + shade "00 00 00" + x-scale 0.25 + y-scale 0.25 + randomflipx + randomflipy +} + +decalgroup WallCrack +{ + WallCrack1 1 + WallCrack2 1 +} + +decal RocketBlast +{ + pic rcktblst + shade "00 00 00" + x-scale 0.5 + y-scale 0.5 + randomflipx + randomflipy +} + +decal BigShockMark1 +{ + pic bigshck1 + shade "00 00 00" + x-scale 0.5 + y-scale 0.5 +} + +decal BigShockMark2Sub +{ + pic bigshck2 + shade "08 08 20" + x-scale 0.5 + y-scale 0.5 +} + +decal BigShockMark2 +{ + pic bigshck2 + shade "20 10 60" + fullbright + animator GoAway2 + x-scale 0.5 + y-scale 0.5 + lowerdecal BigShockMark2Sub +} + +decal ShockMark +{ + pic shockmrk + shade "00 00 00" + randomflipx + randomflipy + x-scale 0.6 + y-scale 0.6 +} +decal ShockMarkBig +{ + pic shockmrk + shade "00 00 00" + randomflipx + randomflipy + x-scale 1.5 + y-scale 1.5 +} + +decal BigBlast +{ + pic bigblast + shade "00 00 00" + randomflipx + randomflipy + x-scale 1.5 + y-scale 1.5 +} \ No newline at end of file diff --git a/fontdefs.txt b/fontdefs.txt new file mode 100644 index 0000000..0e945c2 --- /dev/null +++ b/fontdefs.txt @@ -0,0 +1,14 @@ +WHFONT +{ + - WHMINUS + 0 WH0 + 1 WH1 + 2 WH2 + 3 WH3 + 4 WH4 + 5 WH5 + 6 WH6 + 7 WH7 + 8 WH8 + 9 WH9 +} diff --git a/graphics/Crosshr6.png b/graphics/Crosshr6.png new file mode 100644 index 0000000..1deee6f Binary files /dev/null and b/graphics/Crosshr6.png differ diff --git a/graphics/GuidedX.png b/graphics/GuidedX.png new file mode 100644 index 0000000..22ce278 Binary files /dev/null and b/graphics/GuidedX.png differ diff --git a/graphics/I_ASMD.png b/graphics/I_ASMD.png new file mode 100644 index 0000000..d65d03f Binary files /dev/null and b/graphics/I_ASMD.png differ diff --git a/graphics/I_FLAK.png b/graphics/I_FLAK.png new file mode 100644 index 0000000..bcd748d Binary files /dev/null and b/graphics/I_FLAK.png differ diff --git a/graphics/Readout.png b/graphics/Readout.png new file mode 100644 index 0000000..e866427 Binary files /dev/null and b/graphics/Readout.png differ diff --git a/graphics/TEMPBG.png b/graphics/TEMPBG.png new file mode 100644 index 0000000..f76ecc1 Binary files /dev/null and b/graphics/TEMPBG.png differ diff --git a/graphics/WallCrk1.png b/graphics/WallCrk1.png new file mode 100644 index 0000000..729b88f Binary files /dev/null and b/graphics/WallCrk1.png differ diff --git a/graphics/WallCrk2.png b/graphics/WallCrk2.png new file mode 100644 index 0000000..ab82d76 Binary files /dev/null and b/graphics/WallCrk2.png differ diff --git a/graphics/bigblast.png b/graphics/bigblast.png new file mode 100644 index 0000000..82b449d Binary files /dev/null and b/graphics/bigblast.png differ diff --git a/graphics/bigshck1.png b/graphics/bigshck1.png new file mode 100644 index 0000000..1df2a20 Binary files /dev/null and b/graphics/bigshck1.png differ diff --git a/graphics/bigshck2.png b/graphics/bigshck2.png new file mode 100644 index 0000000..44e2205 Binary files /dev/null and b/graphics/bigshck2.png differ diff --git a/graphics/finalbg.png b/graphics/finalbg.png new file mode 100644 index 0000000..dd7f69f Binary files /dev/null and b/graphics/finalbg.png differ diff --git a/graphics/protobg.png b/graphics/protobg.png new file mode 100644 index 0000000..1bd8bbf Binary files /dev/null and b/graphics/protobg.png differ diff --git a/graphics/rcktblst.png b/graphics/rcktblst.png new file mode 100644 index 0000000..7d842fc Binary files /dev/null and b/graphics/rcktblst.png differ diff --git a/graphics/shockmrk.png b/graphics/shockmrk.png new file mode 100644 index 0000000..50719f1 Binary files /dev/null and b/graphics/shockmrk.png differ diff --git a/graphics/wh0.png b/graphics/wh0.png new file mode 100644 index 0000000..b45a717 Binary files /dev/null and b/graphics/wh0.png differ diff --git a/graphics/wh1.png b/graphics/wh1.png new file mode 100644 index 0000000..c27ff94 Binary files /dev/null and b/graphics/wh1.png differ diff --git a/graphics/wh2.png b/graphics/wh2.png new file mode 100644 index 0000000..a7f9222 Binary files /dev/null and b/graphics/wh2.png differ diff --git a/graphics/wh3.png b/graphics/wh3.png new file mode 100644 index 0000000..f42e026 Binary files /dev/null and b/graphics/wh3.png differ diff --git a/graphics/wh4.png b/graphics/wh4.png new file mode 100644 index 0000000..3e43150 Binary files /dev/null and b/graphics/wh4.png differ diff --git a/graphics/wh5.png b/graphics/wh5.png new file mode 100644 index 0000000..679a0da Binary files /dev/null and b/graphics/wh5.png differ diff --git a/graphics/wh6.png b/graphics/wh6.png new file mode 100644 index 0000000..c58cc81 Binary files /dev/null and b/graphics/wh6.png differ diff --git a/graphics/wh7.png b/graphics/wh7.png new file mode 100644 index 0000000..9da30e9 Binary files /dev/null and b/graphics/wh7.png differ diff --git a/graphics/wh8.png b/graphics/wh8.png new file mode 100644 index 0000000..9815ad3 Binary files /dev/null and b/graphics/wh8.png differ diff --git a/graphics/wh9.png b/graphics/wh9.png new file mode 100644 index 0000000..b3a1f3c Binary files /dev/null and b/graphics/wh9.png differ diff --git a/graphics/whminus.png b/graphics/whminus.png new file mode 100644 index 0000000..f9224fb Binary files /dev/null and b/graphics/whminus.png differ diff --git a/maps/titlemap.wad b/maps/titlemap.wad new file mode 100644 index 0000000..911cfef Binary files /dev/null and b/maps/titlemap.wad differ diff --git a/menudef.txt b/menudef.txt new file mode 100644 index 0000000..c33f992 --- /dev/null +++ b/menudef.txt @@ -0,0 +1,20 @@ +OptionValue "UTMenuType" +{ + 0, "Final" + 1, "Beta" +} + +OptionMenu "UTOptionMenu" +{ + Title "UT Options" + + StaticText "Menu Options", "Gold" + Option "Menu Type", "flak_protomenu", "UTMenuType" + Command "Apply Changes", "event refreshmenu" +} + +AddOptionMenu "OptionsMenu" +{ + StaticText " " + Submenu "UT Options", "UTOptionMenu" +} diff --git a/modeldef.txt b/modeldef.txt new file mode 100644 index 0000000..340bc94 --- /dev/null +++ b/modeldef.txt @@ -0,0 +1,1022 @@ +//============================================================================= +// SHOCK RIFLE +//============================================================================= + +Model "ShockRifleWave" +{ + Path "models" + Model 0 "shockrwm.umsh" + Skin 0 "shocktt1.png" + DONTCULLBACKFACES + + FrameIndex SWAV A 0 0 + FrameIndex SWAV B 0 1 +} + +Model "ShockBeamRing" +{ + Path "models" + Model 0 "utringex.umsh" + Skin 0 "asaring.png" + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + Scale 1.0 0.9 1.0 + + FrameIndex SRNG A 0 0 + FrameIndex SRNG B 0 1 + FrameIndex SRNG C 0 2 + FrameIndex SRNG D 0 3 + FrameIndex SRNG E 0 4 + FrameIndex SRNG F 0 5 + FrameIndex SRNG G 0 6 + FrameIndex SRNG H 0 7 + FrameIndex SRNG I 0 8 +} + +Model "ShockBlastRing" +{ + Path "models" + Model 0 "utringex.umsh" + Skin 0 "ppurplering.png" + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + Scale 1.0 0.9 1.0 + + FrameIndex SRNG A 0 0 + FrameIndex SRNG B 0 1 + FrameIndex SRNG C 0 2 + FrameIndex SRNG D 0 3 + FrameIndex SRNG E 0 4 + FrameIndex SRNG F 0 5 + FrameIndex SRNG G 0 6 + FrameIndex SRNG H 0 7 + FrameIndex SRNG I 0 8 +} + +Model "ShockRifle" +{ + Path "models" + Model 1 "asmd2pick.umsh" + Skin 1 "asmd_t.png" + AngleOffset 270 + PitchOffset 90 + Scale -0.14 0.14 0.14 + ZOffset 12 + ROTATING + + FrameIndex ASMP A 1 0 +} +Model "ShockRifle" +{ + Path "models" + Model 1 "asmd2pick.umsh" + Skin 1 "asmd_t.png" + AngleOffset 270 + PitchOffset 90 + Scale -0.14 0.14 0.14 + ZOffset 12 + + FrameIndex ASMP B 1 0 +} + +Model "ShockRifle" +{ + Path "models" + Model 0 "asmd2m.umsh" + SurfaceSkin 0 0 "asmd_t1.png" + SurfaceSkin 0 1 "asmd_t2.png" + SurfaceSkin 0 2 "asmd_t3.png" + SurfaceSkin 0 3 "asmd_t3.png" + SurfaceSkin 0 4 "asmd_t4.png" + PitchOffset 90 + Scale 0.15 0.12 0.15 + Offset 4.9 -16.6 -7.1 + + // select + FrameIndex ASMS A 0 0 + FrameIndex ASMS B 0 1 + FrameIndex ASMS C 0 2 + FrameIndex ASMS D 0 3 + FrameIndex ASMS E 0 4 + FrameIndex ASMS F 0 5 + FrameIndex ASMS G 0 6 + FrameIndex ASMS H 0 7 + FrameIndex ASMS I 0 8 + FrameIndex ASMS J 0 9 + FrameIndex ASMS K 0 10 + FrameIndex ASMS L 0 11 + FrameIndex ASMS M 0 12 + FrameIndex ASMS N 0 13 + FrameIndex ASMS O 0 14 + // idle + FrameIndex ASMI A 0 15 + // deselect + FrameIndex ASMD A 0 17 + FrameIndex ASMD B 0 18 + FrameIndex ASMD C 0 19 + FrameIndex ASMD D 0 20 + FrameIndex ASMD E 0 21 + FrameIndex ASMD F 0 22 + FrameIndex ASMD G 0 23 + // fire + FrameIndex ASMF A 0 30 + FrameIndex ASMF B 0 31 + FrameIndex ASMF C 0 32 + FrameIndex ASMF D 0 33 + FrameIndex ASMF E 0 34 + FrameIndex ASMF F 0 35 + FrameIndex ASMF G 0 36 + FrameIndex ASMF H 0 37 + FrameIndex ASMF I 0 38 + FrameIndex ASMF J 0 39 + // altfire + FrameIndex ASMA A 0 40 + FrameIndex ASMA B 0 41 + FrameIndex ASMA C 0 42 + FrameIndex ASMA D 0 43 + FrameIndex ASMA E 0 44 + FrameIndex ASMA F 0 45 + FrameIndex ASMA G 0 46 + FrameIndex ASMA H 0 47 + FrameIndex ASMA I 0 48 + FrameIndex ASMA J 0 49 +} + +//============================================================================= +// FLAK CANNON +//============================================================================= + +Model "FlakAmmo" +{ + Path "models" + Model 0 "flakammom.umsh" + Skin 0 "jfa1.png" + PitchOffset 90 + Scale 0.1 0.1 0.1 + ZOffset 4 + + FrameIndex FAMO A 0 0 +} + +Model "FlakAmmo2" +{ + Path "models" + Model 0 "flakslugm.umsh" + Skin 0 "jflakslugel1.png" + PitchOffset 90 + Scale 0.04 0.04 0.04 + ZOffset 2 + + FrameIndex FSLG A 0 0 +} + +Model "FlakSlug" +{ + Path "models" + Model 0 "flakslugm.umsh" + Skin 0 "jflakslugel1.png" + RollOffset 90 + Scale 0.04 0.04 0.04 + PITCHFROMMOMENTUM + + FrameIndex FSLG A 0 0 +} + +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a00.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 A 0 0 +} +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a01.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 B 0 0 +} +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a02.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 C 0 0 +} +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a03.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 D 0 0 +} +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a04.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 E 0 0 +} +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a05.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 F 0 0 +} +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a06.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 G 0 0 +} +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a07.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 H 0 0 +} +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a08.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 I 0 0 +} +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a09.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 J 0 0 +} +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a10.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 K 0 0 +} +Model "FlakChunk" +{ + Path "models" + Model 0 "chunkm.umsh" + Skin 0 "chunk_a11.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH1 L 0 0 +} + +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a00.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 A 1 0 +} +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a01.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 B 1 0 +} +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a02.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 C 1 0 +} +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a03.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 D 1 0 +} +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a04.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 E 1 0 +} +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a05.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 F 1 0 +} +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a06.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 G 1 0 +} +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a07.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 H 1 0 +} +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a08.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 I 1 0 +} +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a09.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 J 1 0 +} +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a10.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 K 1 0 +} +Model "FlakChunk" +{ + Path "models" + Model 1 "chunk2m.umsh" + Skin 1 "chunk_a11.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH2 L 1 0 +} + +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a00.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 A 2 0 +} +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a01.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 B 2 0 +} +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a02.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 C 2 0 +} +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a03.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 D 2 0 +} +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a04.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 E 2 0 +} +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a05.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 F 2 0 +} +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a06.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 G 2 0 +} +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a07.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 H 2 0 +} +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a08.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 I 2 0 +} +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a09.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 J 2 0 +} +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a10.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 K 2 0 +} +Model "FlakChunk" +{ + Path "models" + Model 2 "chunk3m.umsh" + Skin 2 "chunk_a11.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH3 L 2 0 +} + +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a00.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 A 3 0 +} +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a01.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 B 3 0 +} +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a02.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 C 3 0 +} +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a03.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 D 3 0 +} +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a04.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 E 3 0 +} +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a05.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 F 3 0 +} +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a06.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 G 3 0 +} +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a07.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 H 3 0 +} +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a08.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 I 3 0 +} +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a09.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 J 3 0 +} +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a10.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 K 3 0 +} +Model "FlakChunk" +{ + Path "models" + Model 3 "chunk4m.umsh" + Skin 3 "chunk_a11.png" + Scale 0.06 0.06 0.06 + ZOffset 2 + USEACTORPITCH + USEACTORROLL + + FrameIndex FCH4 L 3 0 +} + +Model "FlakCannon" +{ + Path "models" + Model 1 "flak2pick.umsh" + Skin 1 "flak_t.png" + AngleOffset 90 + PitchOffset 90 + Scale 0.14 0.14 0.14 + Offset 0 -18.9 0 + ZOffset 12 + ROTATING + + FrameIndex FPCK A 1 0 +} +Model "FlakCannon" +{ + Path "models" + Model 1 "flak2pick.umsh" + Skin 1 "flak_t.png" + AngleOffset 90 + PitchOffset 90 + Scale 0.14 0.14 0.14 + Offset 0 -18.9 0 + ZOffset 12 + + FrameIndex FPCK B 1 0 +} + +Model "FlakCannon" +{ + Path "models" + Model 0 "flakm.umsh" + SurfaceSkin 0 0 "flak_t1.png" + SurfaceSkin 0 1 "flak_t2.png" + SurfaceSkin 0 2 "flak_t3.png" + SurfaceSkin 0 3 "flak_t4.png" + SurfaceSkin 0 4 "flakammoledbase.png" + AngleOffset 180 + PitchOffset 90 + Scale 0.2 0.1 0.2 + Offset 5.6 -7.6 -10.4 + + // select + FrameIndex FLKS A 0 0 + FrameIndex FLKS B 0 1 + FrameIndex FLKS C 0 2 + FrameIndex FLKS D 0 3 + FrameIndex FLKS E 0 4 + FrameIndex FLKS F 0 5 + FrameIndex FLKS G 0 6 + FrameIndex FLKS H 0 7 + FrameIndex FLKS I 0 8 + FrameIndex FLKS J 0 9 + FrameIndex FLKS K 0 10 + FrameIndex FLKS L 0 11 + FrameIndex FLKS M 0 12 + FrameIndex FLKS N 0 13 + FrameIndex FLKS O 0 14 + FrameIndex FLKS P 0 15 + FrameIndex FLKS Q 0 16 + FrameIndex FLKS R 0 17 + FrameIndex FLKS S 0 18 + FrameIndex FLKS T 0 19 + FrameIndex FLKS U 0 20 + FrameIndex FLKS V 0 21 + FrameIndex FLKS W 0 22 + FrameIndex FLKS X 0 23 + FrameIndex FLKS Y 0 24 + FrameIndex FLKS Z 0 25 + FrameIndex FKS2 A 0 26 + FrameIndex FKS2 B 0 27 + FrameIndex FKS2 C 0 28 + FrameIndex FKS2 D 0 29 + // loading + FrameIndex FLKL A 0 30 + FrameIndex FLKL B 0 31 + FrameIndex FLKL C 0 32 + FrameIndex FLKL D 0 33 + FrameIndex FLKL E 0 34 + FrameIndex FLKL F 0 35 + FrameIndex FLKL G 0 36 + FrameIndex FLKL H 0 37 + FrameIndex FLKL I 0 38 + FrameIndex FLKL J 0 39 + FrameIndex FLKL K 0 40 + FrameIndex FLKL L 0 41 + FrameIndex FLKL M 0 42 + FrameIndex FLKL N 0 43 + FrameIndex FLKL O 0 44 + // fire + FrameIndex FLKF A 0 46 + FrameIndex FLKF B 0 47 + FrameIndex FLKF C 0 48 + FrameIndex FLKF D 0 49 + FrameIndex FLKF E 0 50 + FrameIndex FLKF F 0 51 + FrameIndex FLKF G 0 52 + FrameIndex FLKF H 0 53 + FrameIndex FLKF I 0 54 + FrameIndex FLKF J 0 55 + // altfire + FrameIndex FLKA A 0 57 + FrameIndex FLKA B 0 58 + FrameIndex FLKA C 0 59 + FrameIndex FLKA D 0 60 + FrameIndex FLKA E 0 61 + FrameIndex FLKA F 0 62 + FrameIndex FLKA G 0 63 + FrameIndex FLKA H 0 64 + FrameIndex FLKA I 0 65 + FrameIndex FLKA J 0 66 + FrameIndex FLKA K 0 67 + // idle + FrameIndex FLKI A 0 80 + // deselect + FrameIndex FLKD A 0 82 + FrameIndex FLKD B 0 83 + FrameIndex FLKD C 0 84 + FrameIndex FLKD D 0 85 + FrameIndex FLKD E 0 86 + FrameIndex FLKD F 0 87 + FrameIndex FLKD G 0 88 + FrameIndex FLKD H 0 89 + FrameIndex FLKD I 0 90 + FrameIndex FLKD J 0 91 +} + +//============================================================================= +// REDEEMER +//============================================================================= +Model "WarheadAmmo" +{ + Path "models" + Model 0 "missile.umsh" + Skin 0 "jmissile_01.png" + Scale -0.2 0.2 0.2 + PitchOffset 90 + ZOffset 21 + + FrameIndex WMIS A 0 0 +} + +Model "ShockWave" +{ + Path "models" + Model 0 "shockwavem.umsh" + Skin 0 "shockt1.png" + DONTCULLBACKFACES + + FrameIndex RWAV A 0 0 + FrameIndex RWAV B 0 1 +} + +Model "WarShell" +{ + Path "models" + Model 0 "missile.umsh" + Skin 0 "jmissile_01.png" + Scale -0.2 0.2 0.2 + Offset -13 0 0 + AngleOffset 180 + USEACTORPITCH + USEACTORROLL + + FrameIndex WMIS A 0 0 +} +Model "GuidedWarShell" +{ + Path "models" + Model 0 "missile.umsh" + Skin 0 "jmissile_01.png" + Scale -0.2 0.2 0.2 + Offset -13 0 0 + AngleOffset 180 + USEACTORPITCH + USEACTORROLL + + FrameIndex WMIS A 0 0 +} + +Model "WarheadLauncher" +{ + Path "models" + Model 1 "whpick.umsh" + Skin 1 "jwhpick1.png" + Scale -0.2 0.2 0.2 + ZOffset 12 + AngleOffset 180 + ROTATING + + FrameIndex RDMP A 1 0 +} +Model "WarheadLauncher" +{ + Path "models" + Model 1 "whpick.umsh" + Skin 1 "jwhpick1.png" + Scale -0.2 0.2 0.2 + AngleOffset 180 + ZOffset 12 + + FrameIndex RDMP B 1 0 +} + +Model "WarheadLauncher" +{ + Path "models" + Model 0 "warhead.umsh" + SurfaceSkin 0 0 "jwarhead1.png" + SurfaceSkin 0 1 "jwarhead2.png" + SurfaceSkin 0 2 "jwarhead3.png" + SurfaceSkin 0 3 "jwarhead4.png" + Scale 0.1 0.05 0.1 + PitchOffset 2.8125 + RollOffset 22.5 + Offset 4.5 -7.8 -4.2 + + // select + FrameIndex WARS A 0 0 + FrameIndex WARS B 0 1 + FrameIndex WARS C 0 2 + FrameIndex WARS D 0 3 + FrameIndex WARS E 0 4 + FrameIndex WARS F 0 5 + FrameIndex WARS G 0 6 + FrameIndex WARS H 0 7 + FrameIndex WARS I 0 8 + FrameIndex WARS J 0 9 + FrameIndex WARS K 0 10 + FrameIndex WARS L 0 11 + FrameIndex WARS M 0 12 + FrameIndex WARS N 0 13 + FrameIndex WARS O 0 14 + // idle + FrameIndex WARI A 0 15 + FrameIndex WARI B 0 16 + FrameIndex WARI C 0 17 + FrameIndex WARI D 0 18 + FrameIndex WARI E 0 19 + // deselect + FrameIndex WARD A 0 20 + FrameIndex WARD B 0 21 + FrameIndex WARD C 0 22 + FrameIndex WARD D 0 23 + FrameIndex WARD E 0 24 + FrameIndex WARD F 0 25 + FrameIndex WARD G 0 26 + // fire + FrameIndex WARF A 0 28 + FrameIndex WARF B 0 29 + FrameIndex WARF C 0 30 + FrameIndex WARF D 0 31 + FrameIndex WARF E 0 32 + FrameIndex WARF F 0 33 + FrameIndex WARF G 0 34 +} diff --git a/models/ASMD2M.umsh b/models/ASMD2M.umsh new file mode 100644 index 0000000..7a59546 Binary files /dev/null and b/models/ASMD2M.umsh differ diff --git a/models/ASMD2pick.umsh b/models/ASMD2pick.umsh new file mode 100644 index 0000000..dcdddba Binary files /dev/null and b/models/ASMD2pick.umsh differ diff --git a/models/ASMD_t.png b/models/ASMD_t.png new file mode 100644 index 0000000..8b03c59 Binary files /dev/null and b/models/ASMD_t.png differ diff --git a/models/ASMD_t1.png b/models/ASMD_t1.png new file mode 100644 index 0000000..6add898 Binary files /dev/null and b/models/ASMD_t1.png differ diff --git a/models/ASMD_t2.png b/models/ASMD_t2.png new file mode 100644 index 0000000..80b6407 Binary files /dev/null and b/models/ASMD_t2.png differ diff --git a/models/ASMD_t3.png b/models/ASMD_t3.png new file mode 100644 index 0000000..b7ae565 Binary files /dev/null and b/models/ASMD_t3.png differ diff --git a/models/ASMD_t4.png b/models/ASMD_t4.png new file mode 100644 index 0000000..848f89d Binary files /dev/null and b/models/ASMD_t4.png differ diff --git a/models/ASaRing.png b/models/ASaRing.png new file mode 100644 index 0000000..9b94572 Binary files /dev/null and b/models/ASaRing.png differ diff --git a/models/Chunk_a00.png b/models/Chunk_a00.png new file mode 100644 index 0000000..f88a528 Binary files /dev/null and b/models/Chunk_a00.png differ diff --git a/models/Chunk_a01.png b/models/Chunk_a01.png new file mode 100644 index 0000000..b227e58 Binary files /dev/null and b/models/Chunk_a01.png differ diff --git a/models/Chunk_a02.png b/models/Chunk_a02.png new file mode 100644 index 0000000..1a311f1 Binary files /dev/null and b/models/Chunk_a02.png differ diff --git a/models/Chunk_a03.png b/models/Chunk_a03.png new file mode 100644 index 0000000..d1db01a Binary files /dev/null and b/models/Chunk_a03.png differ diff --git a/models/Chunk_a04.png b/models/Chunk_a04.png new file mode 100644 index 0000000..9e2846e Binary files /dev/null and b/models/Chunk_a04.png differ diff --git a/models/Chunk_a05.png b/models/Chunk_a05.png new file mode 100644 index 0000000..3d05576 Binary files /dev/null and b/models/Chunk_a05.png differ diff --git a/models/Chunk_a06.png b/models/Chunk_a06.png new file mode 100644 index 0000000..3da4079 Binary files /dev/null and b/models/Chunk_a06.png differ diff --git a/models/Chunk_a07.png b/models/Chunk_a07.png new file mode 100644 index 0000000..3264e58 Binary files /dev/null and b/models/Chunk_a07.png differ diff --git a/models/Chunk_a08.png b/models/Chunk_a08.png new file mode 100644 index 0000000..bf7f544 Binary files /dev/null and b/models/Chunk_a08.png differ diff --git a/models/Chunk_a09.png b/models/Chunk_a09.png new file mode 100644 index 0000000..d8f086b Binary files /dev/null and b/models/Chunk_a09.png differ diff --git a/models/Chunk_a10.png b/models/Chunk_a10.png new file mode 100644 index 0000000..6481b95 Binary files /dev/null and b/models/Chunk_a10.png differ diff --git a/models/Chunk_a11.png b/models/Chunk_a11.png new file mode 100644 index 0000000..218224f Binary files /dev/null and b/models/Chunk_a11.png differ diff --git a/models/Flak2Pick.umsh b/models/Flak2Pick.umsh new file mode 100644 index 0000000..7f1df29 Binary files /dev/null and b/models/Flak2Pick.umsh differ diff --git a/models/FlakAmmoLEDBase.png b/models/FlakAmmoLEDBase.png new file mode 100644 index 0000000..ebf5ea2 Binary files /dev/null and b/models/FlakAmmoLEDBase.png differ diff --git a/models/FlakAmmoM.umsh b/models/FlakAmmoM.umsh new file mode 100644 index 0000000..0ae7ac1 Binary files /dev/null and b/models/FlakAmmoM.umsh differ diff --git a/models/Flak_t.png b/models/Flak_t.png new file mode 100644 index 0000000..e70e602 Binary files /dev/null and b/models/Flak_t.png differ diff --git a/models/Flak_t1.png b/models/Flak_t1.png new file mode 100644 index 0000000..fb1ef78 Binary files /dev/null and b/models/Flak_t1.png differ diff --git a/models/Flak_t2.png b/models/Flak_t2.png new file mode 100644 index 0000000..45c8648 Binary files /dev/null and b/models/Flak_t2.png differ diff --git a/models/Flak_t3.png b/models/Flak_t3.png new file mode 100644 index 0000000..0f0ee19 Binary files /dev/null and b/models/Flak_t3.png differ diff --git a/models/Flak_t4.png b/models/Flak_t4.png new file mode 100644 index 0000000..0b94243 Binary files /dev/null and b/models/Flak_t4.png differ diff --git a/models/JFA1.png b/models/JFA1.png new file mode 100644 index 0000000..5145b42 Binary files /dev/null and b/models/JFA1.png differ diff --git a/models/JShockCore.png b/models/JShockCore.png new file mode 100644 index 0000000..484de67 Binary files /dev/null and b/models/JShockCore.png differ diff --git a/models/Jflakslugel1.png b/models/Jflakslugel1.png new file mode 100644 index 0000000..d560ed9 Binary files /dev/null and b/models/Jflakslugel1.png differ diff --git a/models/Jmissile_01.png b/models/Jmissile_01.png new file mode 100644 index 0000000..2ddb8bf Binary files /dev/null and b/models/Jmissile_01.png differ diff --git a/models/Jwarhead1.png b/models/Jwarhead1.png new file mode 100644 index 0000000..b34f77c Binary files /dev/null and b/models/Jwarhead1.png differ diff --git a/models/Jwarhead2.png b/models/Jwarhead2.png new file mode 100644 index 0000000..418a010 Binary files /dev/null and b/models/Jwarhead2.png differ diff --git a/models/Jwarhead3.png b/models/Jwarhead3.png new file mode 100644 index 0000000..2a363c3 Binary files /dev/null and b/models/Jwarhead3.png differ diff --git a/models/Jwarhead4.png b/models/Jwarhead4.png new file mode 100644 index 0000000..630603f Binary files /dev/null and b/models/Jwarhead4.png differ diff --git a/models/Jwhpick1.png b/models/Jwhpick1.png new file mode 100644 index 0000000..8cd3abe Binary files /dev/null and b/models/Jwhpick1.png differ diff --git a/models/ShockCoreM.umsh b/models/ShockCoreM.umsh new file mode 100644 index 0000000..31b2d6e Binary files /dev/null and b/models/ShockCoreM.umsh differ diff --git a/models/ShockRWM.umsh b/models/ShockRWM.umsh new file mode 100644 index 0000000..c4d2991 Binary files /dev/null and b/models/ShockRWM.umsh differ diff --git a/models/ShockWavem.umsh b/models/ShockWavem.umsh new file mode 100644 index 0000000..c4d2991 Binary files /dev/null and b/models/ShockWavem.umsh differ diff --git a/models/Shockt1.png b/models/Shockt1.png new file mode 100644 index 0000000..e6b70d2 Binary files /dev/null and b/models/Shockt1.png differ diff --git a/models/ShocktT1.png b/models/ShocktT1.png new file mode 100644 index 0000000..1f06c6d Binary files /dev/null and b/models/ShocktT1.png differ diff --git a/models/UTRingex.umsh b/models/UTRingex.umsh new file mode 100644 index 0000000..45464dc Binary files /dev/null and b/models/UTRingex.umsh differ diff --git a/models/WHPick.umsh b/models/WHPick.umsh new file mode 100644 index 0000000..c057172 Binary files /dev/null and b/models/WHPick.umsh differ diff --git a/models/WarHead.umsh b/models/WarHead.umsh new file mode 100644 index 0000000..7a28ec7 Binary files /dev/null and b/models/WarHead.umsh differ diff --git a/models/chunk2M.umsh b/models/chunk2M.umsh new file mode 100644 index 0000000..e5abce1 Binary files /dev/null and b/models/chunk2M.umsh differ diff --git a/models/chunk3M.umsh b/models/chunk3M.umsh new file mode 100644 index 0000000..e5abce1 Binary files /dev/null and b/models/chunk3M.umsh differ diff --git a/models/chunk4M.umsh b/models/chunk4M.umsh new file mode 100644 index 0000000..0439956 Binary files /dev/null and b/models/chunk4M.umsh differ diff --git a/models/chunkM.umsh b/models/chunkM.umsh new file mode 100644 index 0000000..2fdaf26 Binary files /dev/null and b/models/chunkM.umsh differ diff --git a/models/flakm.umsh b/models/flakm.umsh new file mode 100644 index 0000000..e419e54 Binary files /dev/null and b/models/flakm.umsh differ diff --git a/models/flakslugm.umsh b/models/flakslugm.umsh new file mode 100644 index 0000000..1400d29 Binary files /dev/null and b/models/flakslugm.umsh differ diff --git a/models/missile.umsh b/models/missile.umsh new file mode 100644 index 0000000..d1e04c3 Binary files /dev/null and b/models/missile.umsh differ diff --git a/models/pPurpleRing.png b/models/pPurpleRing.png new file mode 100644 index 0000000..400345b Binary files /dev/null and b/models/pPurpleRing.png differ diff --git a/music/utmenu23.it b/music/utmenu23.it new file mode 100644 index 0000000..8728f32 Binary files /dev/null and b/music/utmenu23.it differ diff --git a/music/xyzdMenu.it b/music/xyzdMenu.it new file mode 100644 index 0000000..34b4d4c Binary files /dev/null and b/music/xyzdMenu.it differ diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..0977d6e --- /dev/null +++ b/readme.txt @@ -0,0 +1,40 @@ +DOOM TOURNAMENT + +What began as a test for importing UT vertex meshes is turning into an actual +full UT weapon and item mod. + +Currently implemented: + + - ASMD Shock Rifle (slot 4) + - Flak Cannon (slot 8) + +In progress: + + - Redeemer (slot 0) + +To be done: + + - Impact Hammer (slot 1) + - Chainsaw (slot 1) + - Translocator (slot 1) + - Enforcer (slot 2) + - Dual Enforcers (slot 2) + - GES Biorifle (slot 3) + - Pulsegun (slot 5) + - Ripper (slot 6) + - Minigun (slot 7) + - Rocket Launcher (slot 9) + - Sniper Rifle (slot 0) + + - Health Vial (bonus) + - Health Pack (stimpak) + - Beta Super Health (medkit) + - Big Keg O' Health (soulsphere) + - Thigh Pads (green armor) + - Body Armor (blue armor) + - Shield Belt (megasphere) + - Damage Amplifier (berserk) + - Invisibility (blursphere) + - Jump Boots (light amplification visor) + - Toxin Suit (radsuit) + - diff --git a/sndinfo.txt b/sndinfo.txt new file mode 100644 index 0000000..1b8880a --- /dev/null +++ b/sndinfo.txt @@ -0,0 +1,48 @@ +ut/ammo ammopick +ut/weapon weaponpk +$pitchshift ut/ammo 0 +$pitchshift ut/weapon 0 + +flak/select pdown +flak/load hidraul2 +flak/reload load1 +flak/fire shot1 +flak/altfire explode1 +flak/hit ricochet +flak/meat chunkhit +flak/bounce1 hit1 +flak/bounce2 hit2 +flak/bounce3 hit3 +$random flak/bounce { flak/bounce1 flak/bounce2 flak/bounce3 } +flak/explode expl04 +$pitchshift flak/select 0 +$pitchshift flak/load 0 +$pitchshift flak/reload 0 +$pitchshift flak/fire 0 +$pitchshift flak/altfire 0 +$pitchshift flak/hit 0 +$pitchshift flak/meat 0 +$pitchshift flak/bounce 0 +$pitchshift flak/explode 0 + +shock/select tazersel +shock/fire tazefire +shock/altfire tazealtf +shock/hit expl03 +shock/ball expla02 +shock/blast specexpl +$pitchshift shock/select 0 +$pitchshift shock/fire 0 +$pitchshift shock/altfire 0 +$pitchshift shock/hit 0 +$pitchshift shock/ball 5 +$pitchshift shock/blast 0 + +warhead/explode warexplo +warhead/fly warfly +warhead/select warhpick +warhead/fire warhshot +$pitchshift warhead/explode 0 +$pitchshift warhead/fly 0 +$pitchshift warhead/select 0 +$pitchshift warhead/fire 0 diff --git a/sounds/AmmoPick.WAV b/sounds/AmmoPick.WAV new file mode 100644 index 0000000..0b70432 Binary files /dev/null and b/sounds/AmmoPick.WAV differ diff --git a/sounds/ChunkHit.wav b/sounds/ChunkHit.wav new file mode 100644 index 0000000..e4b0b6d Binary files /dev/null and b/sounds/ChunkHit.wav differ diff --git a/sounds/Expl03.wav b/sounds/Expl03.wav new file mode 100644 index 0000000..eb3879f Binary files /dev/null and b/sounds/Expl03.wav differ diff --git a/sounds/Expl04.WAV b/sounds/Expl04.WAV new file mode 100644 index 0000000..e3396af Binary files /dev/null and b/sounds/Expl04.WAV differ diff --git a/sounds/Expla02.wav b/sounds/Expla02.wav new file mode 100644 index 0000000..19d0b6f Binary files /dev/null and b/sounds/Expla02.wav differ diff --git a/sounds/Explode1.WAV b/sounds/Explode1.WAV new file mode 100644 index 0000000..8257a57 Binary files /dev/null and b/sounds/Explode1.WAV differ diff --git a/sounds/Hidraul2.WAV b/sounds/Hidraul2.WAV new file mode 100644 index 0000000..cbe9b66 Binary files /dev/null and b/sounds/Hidraul2.WAV differ diff --git a/sounds/Hit1.wav b/sounds/Hit1.wav new file mode 100644 index 0000000..b29e76a Binary files /dev/null and b/sounds/Hit1.wav differ diff --git a/sounds/Hit3.wav b/sounds/Hit3.wav new file mode 100644 index 0000000..4d75fd9 Binary files /dev/null and b/sounds/Hit3.wav differ diff --git a/sounds/Hit5.wav b/sounds/Hit5.wav new file mode 100644 index 0000000..e376416 Binary files /dev/null and b/sounds/Hit5.wav differ diff --git a/sounds/Ricochet.wav b/sounds/Ricochet.wav new file mode 100644 index 0000000..f2bbd89 Binary files /dev/null and b/sounds/Ricochet.wav differ diff --git a/sounds/SpecExpl.wav b/sounds/SpecExpl.wav new file mode 100644 index 0000000..ee454b5 Binary files /dev/null and b/sounds/SpecExpl.wav differ diff --git a/sounds/TazeAltF.wav b/sounds/TazeAltF.wav new file mode 100644 index 0000000..7ce9d79 Binary files /dev/null and b/sounds/TazeAltF.wav differ diff --git a/sounds/TazeFire.wav b/sounds/TazeFire.wav new file mode 100644 index 0000000..708c9c6 Binary files /dev/null and b/sounds/TazeFire.wav differ diff --git a/sounds/TazerSel.wav b/sounds/TazerSel.wav new file mode 100644 index 0000000..e200c7d Binary files /dev/null and b/sounds/TazerSel.wav differ diff --git a/sounds/WarExplo.wav b/sounds/WarExplo.wav new file mode 100644 index 0000000..417b091 Binary files /dev/null and b/sounds/WarExplo.wav differ diff --git a/sounds/WarFly.wav b/sounds/WarFly.wav new file mode 100644 index 0000000..b6f04c1 Binary files /dev/null and b/sounds/WarFly.wav differ diff --git a/sounds/WarhPick.wav b/sounds/WarhPick.wav new file mode 100644 index 0000000..3ea8c8e Binary files /dev/null and b/sounds/WarhPick.wav differ diff --git a/sounds/WarhShot.wav b/sounds/WarhShot.wav new file mode 100644 index 0000000..cd5de95 Binary files /dev/null and b/sounds/WarhShot.wav differ diff --git a/sounds/WeaponPk.WAV b/sounds/WeaponPk.WAV new file mode 100644 index 0000000..13bf62f Binary files /dev/null and b/sounds/WeaponPk.WAV differ diff --git a/sounds/load1.WAV b/sounds/load1.WAV new file mode 100644 index 0000000..91f2909 Binary files /dev/null and b/sounds/load1.WAV differ diff --git a/sounds/pdown.WAV b/sounds/pdown.WAV new file mode 100644 index 0000000..485aa11 Binary files /dev/null and b/sounds/pdown.WAV differ diff --git a/sounds/shot1.WAV b/sounds/shot1.WAV new file mode 100644 index 0000000..3bbedef Binary files /dev/null and b/sounds/shot1.WAV differ diff --git a/sprites/ABALA0.png b/sprites/ABALA0.png new file mode 100644 index 0000000..1607a78 Binary files /dev/null and b/sprites/ABALA0.png differ diff --git a/sprites/ABALB0.png b/sprites/ABALB0.png new file mode 100644 index 0000000..afd436a Binary files /dev/null and b/sprites/ABALB0.png differ diff --git a/sprites/ABALC0.png b/sprites/ABALC0.png new file mode 100644 index 0000000..8e24c2b Binary files /dev/null and b/sprites/ABALC0.png differ diff --git a/sprites/ABALD0.png b/sprites/ABALD0.png new file mode 100644 index 0000000..3506999 Binary files /dev/null and b/sprites/ABALD0.png differ diff --git a/sprites/AEXPA0.png b/sprites/AEXPA0.png new file mode 100644 index 0000000..8629080 Binary files /dev/null and b/sprites/AEXPA0.png differ diff --git a/sprites/AEXPB0.png b/sprites/AEXPB0.png new file mode 100644 index 0000000..20305f1 Binary files /dev/null and b/sprites/AEXPB0.png differ diff --git a/sprites/AEXPC0.png b/sprites/AEXPC0.png new file mode 100644 index 0000000..54dfaec Binary files /dev/null and b/sprites/AEXPC0.png differ diff --git a/sprites/AEXPD0.png b/sprites/AEXPD0.png new file mode 100644 index 0000000..7f355b1 Binary files /dev/null and b/sprites/AEXPD0.png differ diff --git a/sprites/AEXPE0.png b/sprites/AEXPE0.png new file mode 100644 index 0000000..20ac1d1 Binary files /dev/null and b/sprites/AEXPE0.png differ diff --git a/sprites/AEXPF0.png b/sprites/AEXPF0.png new file mode 100644 index 0000000..c621826 Binary files /dev/null and b/sprites/AEXPF0.png differ diff --git a/sprites/AEXPG0.png b/sprites/AEXPG0.png new file mode 100644 index 0000000..7f5f96d Binary files /dev/null and b/sprites/AEXPG0.png differ diff --git a/sprites/AEXPH0.png b/sprites/AEXPH0.png new file mode 100644 index 0000000..9aeaa7b Binary files /dev/null and b/sprites/AEXPH0.png differ diff --git a/sprites/AEXPI0.png b/sprites/AEXPI0.png new file mode 100644 index 0000000..f68cb7f Binary files /dev/null and b/sprites/AEXPI0.png differ diff --git a/sprites/AEXPJ0.png b/sprites/AEXPJ0.png new file mode 100644 index 0000000..1f86af7 Binary files /dev/null and b/sprites/AEXPJ0.png differ diff --git a/sprites/AEXPK0.png b/sprites/AEXPK0.png new file mode 100644 index 0000000..63e46bb Binary files /dev/null and b/sprites/AEXPK0.png differ diff --git a/sprites/AEXPL0.png b/sprites/AEXPL0.png new file mode 100644 index 0000000..1a7d1c8 Binary files /dev/null and b/sprites/AEXPL0.png differ diff --git a/sprites/EXP2A0.png b/sprites/EXP2A0.png new file mode 100644 index 0000000..9478876 Binary files /dev/null and b/sprites/EXP2A0.png differ diff --git a/sprites/EXP2B0.png b/sprites/EXP2B0.png new file mode 100644 index 0000000..25b093c Binary files /dev/null and b/sprites/EXP2B0.png differ diff --git a/sprites/EXP2C0.png b/sprites/EXP2C0.png new file mode 100644 index 0000000..8d9f1d7 Binary files /dev/null and b/sprites/EXP2C0.png differ diff --git a/sprites/EXP2D0.png b/sprites/EXP2D0.png new file mode 100644 index 0000000..88c7e79 Binary files /dev/null and b/sprites/EXP2D0.png differ diff --git a/sprites/EXP2E0.png b/sprites/EXP2E0.png new file mode 100644 index 0000000..9501b16 Binary files /dev/null and b/sprites/EXP2E0.png differ diff --git a/sprites/EXP2F0.png b/sprites/EXP2F0.png new file mode 100644 index 0000000..dab6a3e Binary files /dev/null and b/sprites/EXP2F0.png differ diff --git a/sprites/EXP2G0.png b/sprites/EXP2G0.png new file mode 100644 index 0000000..f4a0aad Binary files /dev/null and b/sprites/EXP2G0.png differ diff --git a/sprites/EXP2H0.png b/sprites/EXP2H0.png new file mode 100644 index 0000000..a81cd25 Binary files /dev/null and b/sprites/EXP2H0.png differ diff --git a/sprites/EXP2I0.png b/sprites/EXP2I0.png new file mode 100644 index 0000000..5009302 Binary files /dev/null and b/sprites/EXP2I0.png differ diff --git a/sprites/EXP2J0.png b/sprites/EXP2J0.png new file mode 100644 index 0000000..46a80e1 Binary files /dev/null and b/sprites/EXP2J0.png differ diff --git a/sprites/EXP2K0.png b/sprites/EXP2K0.png new file mode 100644 index 0000000..592c8b0 Binary files /dev/null and b/sprites/EXP2K0.png differ diff --git a/sprites/EXP2L0.png b/sprites/EXP2L0.png new file mode 100644 index 0000000..5732a24 Binary files /dev/null and b/sprites/EXP2L0.png differ diff --git a/sprites/EXP2M0.png b/sprites/EXP2M0.png new file mode 100644 index 0000000..fc15b0c Binary files /dev/null and b/sprites/EXP2M0.png differ diff --git a/sprites/EXP2N0.png b/sprites/EXP2N0.png new file mode 100644 index 0000000..b228cf7 Binary files /dev/null and b/sprites/EXP2N0.png differ diff --git a/sprites/EXP2O0.png b/sprites/EXP2O0.png new file mode 100644 index 0000000..8620398 Binary files /dev/null and b/sprites/EXP2O0.png differ diff --git a/sprites/EXP2P0.png b/sprites/EXP2P0.png new file mode 100644 index 0000000..d7f1629 Binary files /dev/null and b/sprites/EXP2P0.png differ diff --git a/sprites/EXP2Q0.png b/sprites/EXP2Q0.png new file mode 100644 index 0000000..4559c28 Binary files /dev/null and b/sprites/EXP2Q0.png differ diff --git a/sprites/EXP2R0.png b/sprites/EXP2R0.png new file mode 100644 index 0000000..5a22b9b Binary files /dev/null and b/sprites/EXP2R0.png differ diff --git a/sprites/FGLOA0.png b/sprites/FGLOA0.png new file mode 100644 index 0000000..834c7c4 Binary files /dev/null and b/sprites/FGLOA0.png differ diff --git a/sprites/FMUZA0.png b/sprites/FMUZA0.png new file mode 100644 index 0000000..000e589 Binary files /dev/null and b/sprites/FMUZA0.png differ diff --git a/sprites/NE__A0.png b/sprites/NE__A0.png new file mode 100644 index 0000000..f07e199 Binary files /dev/null and b/sprites/NE__A0.png differ diff --git a/sprites/NE__B0.png b/sprites/NE__B0.png new file mode 100644 index 0000000..924cc9d Binary files /dev/null and b/sprites/NE__B0.png differ diff --git a/sprites/NE__C0.png b/sprites/NE__C0.png new file mode 100644 index 0000000..013e5f4 Binary files /dev/null and b/sprites/NE__C0.png differ diff --git a/sprites/NE__D0.png b/sprites/NE__D0.png new file mode 100644 index 0000000..90c3944 Binary files /dev/null and b/sprites/NE__D0.png differ diff --git a/sprites/NE__E0.png b/sprites/NE__E0.png new file mode 100644 index 0000000..3cb2aaa Binary files /dev/null and b/sprites/NE__E0.png differ diff --git a/sprites/NE__F0.png b/sprites/NE__F0.png new file mode 100644 index 0000000..de81d25 Binary files /dev/null and b/sprites/NE__F0.png differ diff --git a/sprites/NE__G0.png b/sprites/NE__G0.png new file mode 100644 index 0000000..a529ade Binary files /dev/null and b/sprites/NE__G0.png differ diff --git a/sprites/NE__H0.png b/sprites/NE__H0.png new file mode 100644 index 0000000..2029d99 Binary files /dev/null and b/sprites/NE__H0.png differ diff --git a/sprites/NE__I0.png b/sprites/NE__I0.png new file mode 100644 index 0000000..a229d04 Binary files /dev/null and b/sprites/NE__I0.png differ diff --git a/sprites/NE__J0.png b/sprites/NE__J0.png new file mode 100644 index 0000000..4d656d6 Binary files /dev/null and b/sprites/NE__J0.png differ diff --git a/sprites/NE__K0.png b/sprites/NE__K0.png new file mode 100644 index 0000000..307c1cc Binary files /dev/null and b/sprites/NE__K0.png differ diff --git a/sprites/NE__L0.png b/sprites/NE__L0.png new file mode 100644 index 0000000..69a069d Binary files /dev/null and b/sprites/NE__L0.png differ diff --git a/sprites/NE__M0.png b/sprites/NE__M0.png new file mode 100644 index 0000000..af7e3ae Binary files /dev/null and b/sprites/NE__M0.png differ diff --git a/sprites/WE__A0.png b/sprites/WE__A0.png new file mode 100644 index 0000000..f220805 Binary files /dev/null and b/sprites/WE__A0.png differ diff --git a/sprites/WE__B0.png b/sprites/WE__B0.png new file mode 100644 index 0000000..2832663 Binary files /dev/null and b/sprites/WE__B0.png differ diff --git a/sprites/WE__C0.png b/sprites/WE__C0.png new file mode 100644 index 0000000..264f904 Binary files /dev/null and b/sprites/WE__C0.png differ diff --git a/sprites/WE__D0.png b/sprites/WE__D0.png new file mode 100644 index 0000000..1ae501f Binary files /dev/null and b/sprites/WE__D0.png differ diff --git a/sprites/WE__E0.png b/sprites/WE__E0.png new file mode 100644 index 0000000..4317665 Binary files /dev/null and b/sprites/WE__E0.png differ diff --git a/sprites/WE__F0.png b/sprites/WE__F0.png new file mode 100644 index 0000000..25a731d Binary files /dev/null and b/sprites/WE__F0.png differ diff --git a/sprites/WE__G0.png b/sprites/WE__G0.png new file mode 100644 index 0000000..ba175d8 Binary files /dev/null and b/sprites/WE__G0.png differ diff --git a/sprites/WE__H0.png b/sprites/WE__H0.png new file mode 100644 index 0000000..e7490bf Binary files /dev/null and b/sprites/WE__H0.png differ diff --git a/sprites/WE__I0.png b/sprites/WE__I0.png new file mode 100644 index 0000000..dde2091 Binary files /dev/null and b/sprites/WE__I0.png differ diff --git a/sprites/WE__J0.png b/sprites/WE__J0.png new file mode 100644 index 0000000..5879d46 Binary files /dev/null and b/sprites/WE__J0.png differ diff --git a/sprites/WE__K0.png b/sprites/WE__K0.png new file mode 100644 index 0000000..70d18c0 Binary files /dev/null and b/sprites/WE__K0.png differ diff --git a/sprites/WE__L0.png b/sprites/WE__L0.png new file mode 100644 index 0000000..b5f07f5 Binary files /dev/null and b/sprites/WE__L0.png differ diff --git a/sprites/WE__M0.png b/sprites/WE__M0.png new file mode 100644 index 0000000..0575c73 Binary files /dev/null and b/sprites/WE__M0.png differ diff --git a/sprites/WE__N0.png b/sprites/WE__N0.png new file mode 100644 index 0000000..1a4ca43 Binary files /dev/null and b/sprites/WE__N0.png differ diff --git a/sprites/WE__O0.png b/sprites/WE__O0.png new file mode 100644 index 0000000..1a98bea Binary files /dev/null and b/sprites/WE__O0.png differ diff --git a/sprites/WE__P0.png b/sprites/WE__P0.png new file mode 100644 index 0000000..714156d Binary files /dev/null and b/sprites/WE__P0.png differ diff --git a/sprites/WE__Q0.png b/sprites/WE__Q0.png new file mode 100644 index 0000000..4ca2a8d Binary files /dev/null and b/sprites/WE__Q0.png differ diff --git a/sprites/WE__R0.png b/sprites/WE__R0.png new file mode 100644 index 0000000..af19355 Binary files /dev/null and b/sprites/WE__R0.png differ diff --git a/textures.flak b/textures.flak new file mode 100644 index 0000000..bfc9b83 --- /dev/null +++ b/textures.flak @@ -0,0 +1,124 @@ +Sprite "FPCKA0",1,1{} +Sprite "FPCKB0",1,1{} +Sprite "FAMOA0",1,1{} +Sprite "FCH1A0",1,1{} +Sprite "FCH1B0",1,1{} +Sprite "FCH1C0",1,1{} +Sprite "FCH1D0",1,1{} +Sprite "FCH1E0",1,1{} +Sprite "FCH1F0",1,1{} +Sprite "FCH1G0",1,1{} +Sprite "FCH1H0",1,1{} +Sprite "FCH1I0",1,1{} +Sprite "FCH1J0",1,1{} +Sprite "FCH1K0",1,1{} +Sprite "FCH2A0",1,1{} +Sprite "FCH2B0",1,1{} +Sprite "FCH2C0",1,1{} +Sprite "FCH2D0",1,1{} +Sprite "FCH2E0",1,1{} +Sprite "FCH2F0",1,1{} +Sprite "FCH2G0",1,1{} +Sprite "FCH2H0",1,1{} +Sprite "FCH2I0",1,1{} +Sprite "FCH2J0",1,1{} +Sprite "FCH2K0",1,1{} +Sprite "FCH3A0",1,1{} +Sprite "FCH3B0",1,1{} +Sprite "FCH3C0",1,1{} +Sprite "FCH3D0",1,1{} +Sprite "FCH3E0",1,1{} +Sprite "FCH3F0",1,1{} +Sprite "FCH3G0",1,1{} +Sprite "FCH3H0",1,1{} +Sprite "FCH3I0",1,1{} +Sprite "FCH3J0",1,1{} +Sprite "FCH3K0",1,1{} +Sprite "FCH4A0",1,1{} +Sprite "FCH4B0",1,1{} +Sprite "FCH4C0",1,1{} +Sprite "FCH4D0",1,1{} +Sprite "FCH4E0",1,1{} +Sprite "FCH4F0",1,1{} +Sprite "FCH4G0",1,1{} +Sprite "FCH4H0",1,1{} +Sprite "FCH4I0",1,1{} +Sprite "FCH4J0",1,1{} +Sprite "FCH4K0",1,1{} +Sprite "FSLGA0",1,1{} +Sprite "FLKSA0",1,1{} +Sprite "FLKSB0",1,1{} +Sprite "FLKSC0",1,1{} +Sprite "FLKSD0",1,1{} +Sprite "FLKSE0",1,1{} +Sprite "FLKSF0",1,1{} +Sprite "FLKSG0",1,1{} +Sprite "FLKSH0",1,1{} +Sprite "FLKSI0",1,1{} +Sprite "FLKSJ0",1,1{} +Sprite "FLKSK0",1,1{} +Sprite "FLKSL0",1,1{} +Sprite "FLKSM0",1,1{} +Sprite "FLKSN0",1,1{} +Sprite "FLKSO0",1,1{} +Sprite "FLKSP0",1,1{} +Sprite "FLKSQ0",1,1{} +Sprite "FLKSR0",1,1{} +Sprite "FLKSS0",1,1{} +Sprite "FLKST0",1,1{} +Sprite "FLKSU0",1,1{} +Sprite "FLKSV0",1,1{} +Sprite "FLKSW0",1,1{} +Sprite "FLKSX0",1,1{} +Sprite "FLKSY0",1,1{} +Sprite "FLKSZ0",1,1{} +Sprite "FKS2A0",1,1{} +Sprite "FKS2B0",1,1{} +Sprite "FKS2C0",1,1{} +Sprite "FKS2D0",1,1{} +Sprite "FLKLA0",1,1{} +Sprite "FLKLB0",1,1{} +Sprite "FLKLC0",1,1{} +Sprite "FLKLD0",1,1{} +Sprite "FLKLE0",1,1{} +Sprite "FLKLF0",1,1{} +Sprite "FLKLG0",1,1{} +Sprite "FLKLH0",1,1{} +Sprite "FLKLI0",1,1{} +Sprite "FLKLJ0",1,1{} +Sprite "FLKLK0",1,1{} +Sprite "FLKLL0",1,1{} +Sprite "FLKLM0",1,1{} +Sprite "FLKLN0",1,1{} +Sprite "FLKLO0",1,1{} +Sprite "FLKIA0",1,1{} +Sprite "FLKFA0",1,1{} +Sprite "FLKFB0",1,1{} +Sprite "FLKFC0",1,1{} +Sprite "FLKFD0",1,1{} +Sprite "FLKFE0",1,1{} +Sprite "FLKFF0",1,1{} +Sprite "FLKFH0",1,1{} +Sprite "FLKFI0",1,1{} +Sprite "FLKFJ0",1,1{} +Sprite "FLKAA0",1,1{} +Sprite "FLKAB0",1,1{} +Sprite "FLKAC0",1,1{} +Sprite "FLKAD0",1,1{} +Sprite "FLKAE0",1,1{} +Sprite "FLKAF0",1,1{} +Sprite "FLKAG0",1,1{} +Sprite "FLKAH0",1,1{} +Sprite "FLKAI0",1,1{} +Sprite "FLKAJ0",1,1{} +Sprite "FLKAK0",1,1{} +Sprite "FLKDA0",1,1{} +Sprite "FLKDB0",1,1{} +Sprite "FLKDC0",1,1{} +Sprite "FLKDD0",1,1{} +Sprite "FLKDE0",1,1{} +Sprite "FLKDF0",1,1{} +Sprite "FLKDG0",1,1{} +Sprite "FLKDH0",1,1{} +Sprite "FLKDI0",1,1{} +Sprite "FLKDJ0",1,1{} diff --git a/textures.shock b/textures.shock new file mode 100644 index 0000000..c83c117 --- /dev/null +++ b/textures.shock @@ -0,0 +1,56 @@ +Sprite "SWAVA0",1,1{} +Sprite "SWAVB0",1,1{} +Sprite "SRNGA0",1,1{} +Sprite "SRNGB0",1,1{} +Sprite "SRNGC0",1,1{} +Sprite "SRNGD0",1,1{} +Sprite "SRNGE0",1,1{} +Sprite "SRNGF0",1,1{} +Sprite "SRNGG0",1,1{} +Sprite "SRNGH0",1,1{} +Sprite "SRNGI0",1,1{} +Sprite "ASMPA0",1,1{} +Sprite "ASMPB0",1,1{} +Sprite "ASMSA0",1,1{} +Sprite "ASMSB0",1,1{} +Sprite "ASMSC0",1,1{} +Sprite "ASMSD0",1,1{} +Sprite "ASMSE0",1,1{} +Sprite "ASMSF0",1,1{} +Sprite "ASMSG0",1,1{} +Sprite "ASMSH0",1,1{} +Sprite "ASMSI0",1,1{} +Sprite "ASMSJ0",1,1{} +Sprite "ASMSK0",1,1{} +Sprite "ASMSL0",1,1{} +Sprite "ASMSM0",1,1{} +Sprite "ASMSN0",1,1{} +Sprite "ASMSO0",1,1{} +Sprite "ASMIA0",1,1{} +Sprite "ASMDA0",1,1{} +Sprite "ASMDB0",1,1{} +Sprite "ASMDC0",1,1{} +Sprite "ASMDD0",1,1{} +Sprite "ASMDE0",1,1{} +Sprite "ASMDF0",1,1{} +Sprite "ASMDG0",1,1{} +Sprite "ASMFA0",1,1{} +Sprite "ASMFB0",1,1{} +Sprite "ASMFC0",1,1{} +Sprite "ASMFD0",1,1{} +Sprite "ASMFE0",1,1{} +Sprite "ASMFF0",1,1{} +Sprite "ASMFG0",1,1{} +Sprite "ASMFH0",1,1{} +Sprite "ASMFI0",1,1{} +Sprite "ASMFJ0",1,1{} +Sprite "ASMAA0",1,1{} +Sprite "ASMAB0",1,1{} +Sprite "ASMAC0",1,1{} +Sprite "ASMAD0",1,1{} +Sprite "ASMAE0",1,1{} +Sprite "ASMAF0",1,1{} +Sprite "ASMAG0",1,1{} +Sprite "ASMAH0",1,1{} +Sprite "ASMAI0",1,1{} +Sprite "ASMAJ0",1,1{} diff --git a/textures.warhead b/textures.warhead new file mode 100644 index 0000000..52a51c3 --- /dev/null +++ b/textures.warhead @@ -0,0 +1,39 @@ +Sprite "WMISA0",1,1{} +Sprite "RDMPA0",1,1{} +Sprite "RDMPB0",1,1{} +Sprite "RWAVA0",1,1{} +Sprite "RWAVB0",1,1{} +Sprite "WARSA0",1,1{} +Sprite "WARSB0",1,1{} +Sprite "WARSC0",1,1{} +Sprite "WARSD0",1,1{} +Sprite "WARSE0",1,1{} +Sprite "WARSF0",1,1{} +Sprite "WARSG0",1,1{} +Sprite "WARSH0",1,1{} +Sprite "WARSI0",1,1{} +Sprite "WARSJ0",1,1{} +Sprite "WARSK0",1,1{} +Sprite "WARSL0",1,1{} +Sprite "WARSM0",1,1{} +Sprite "WARSN0",1,1{} +Sprite "WARSO0",1,1{} +Sprite "WARIA0",1,1{} +Sprite "WARIB0",1,1{} +Sprite "WARIC0",1,1{} +Sprite "WARID0",1,1{} +Sprite "WARIE0",1,1{} +Sprite "WARDA0",1,1{} +Sprite "WARDB0",1,1{} +Sprite "WARDC0",1,1{} +Sprite "WARDD0",1,1{} +Sprite "WARDE0",1,1{} +Sprite "WARDF0",1,1{} +Sprite "WARDG0",1,1{} +Sprite "WARFA0",1,1{} +Sprite "WARFB0",1,1{} +Sprite "WARFC0",1,1{} +Sprite "WARFD0",1,1{} +Sprite "WARFE0",1,1{} +Sprite "WARFF0",1,1{} +Sprite "WARFG0",1,1{} diff --git a/textures/UTLogo1.png b/textures/UTLogo1.png new file mode 100644 index 0000000..b301dc3 Binary files /dev/null and b/textures/UTLogo1.png differ diff --git a/textures/UTLogo2.png b/textures/UTLogo2.png new file mode 100644 index 0000000..6a6ea13 Binary files /dev/null and b/textures/UTLogo2.png differ diff --git a/textures/UTLogo3.png b/textures/UTLogo3.png new file mode 100644 index 0000000..07231be Binary files /dev/null and b/textures/UTLogo3.png differ diff --git a/textures/static1.png b/textures/static1.png new file mode 100644 index 0000000..8276332 Binary files /dev/null and b/textures/static1.png differ diff --git a/textures/static2.png b/textures/static2.png new file mode 100644 index 0000000..edbd648 Binary files /dev/null and b/textures/static2.png differ diff --git a/textures/static3.png b/textures/static3.png new file mode 100644 index 0000000..7b4db27 Binary files /dev/null and b/textures/static3.png differ diff --git a/textures/static4.png b/textures/static4.png new file mode 100644 index 0000000..b3eec47 Binary files /dev/null and b/textures/static4.png differ diff --git a/zmapinfo.txt b/zmapinfo.txt new file mode 100644 index 0000000..094b365 --- /dev/null +++ b/zmapinfo.txt @@ -0,0 +1,4 @@ +GameInfo +{ + AddEventHandlers = "RedeemerHUDHandler", "UTMenuHandler" +} diff --git a/zscript.txt b/zscript.txt new file mode 100644 index 0000000..439459d --- /dev/null +++ b/zscript.txt @@ -0,0 +1,8 @@ +version "3.3" + +#include "zscript/mk_matrix.zsc" +#include "zscript/mk_coordutil.zsc" +#include "zscript/utcommon.zsc" +#include "zscript/shockrifle.zsc" +#include "zscript/flakcannon.zsc" +#include "zscript/warheadlauncher.zsc" diff --git a/zscript/LGPL3.txt b/zscript/LGPL3.txt new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/zscript/LGPL3.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/zscript/flakcannon.zsc b/zscript/flakcannon.zsc new file mode 100644 index 0000000..1ec60be --- /dev/null +++ b/zscript/flakcannon.zsc @@ -0,0 +1,539 @@ +Class FlakAmmo : Ammo +{ + Default + { + Tag "Flak Shells"; + Inventory.Icon "I_FLAK"; + Inventory.PickupMessage "You picked up 10 Flak Shells."; + Inventory.PickupSound "ut/ammo"; + Inventory.Amount 10; + Inventory.MaxAmount 50; + Ammo.BackpackAmount 50; + Ammo.BackpackMaxAmount 100; + Ammo.DropAmount 10; + } + States + { + Spawn: + FAMO A -1; + Stop; + } +} + +Class FlakAmmo2 : FlakAmmo +{ + Default + { + Tag "Flak Shell"; + Inventory.PickupMessage "You picked up a Flak Shell."; + Inventory.Amount 1; + Ammo.DropAmount 1; + } + States + { + Spawn: + FSLG A -1; + Stop; + } +} + +Class ChunkLight : DynamicLight +{ + Default + { + DynamicLight.Type "Point"; + Args 255,224,8; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + } + override void Tick() + { + Super.Tick(); + if ( !target ) + { + Destroy(); + return; + } + args[LIGHT_RED] = 255*target.alpha; + args[LIGHT_GREEN] = 224*target.alpha; + args[LIGHT_BLUE] = 128*target.alpha; + } +} + +Class ChunkTrail : Actor +{ + Default + { + RenderStyle "Add"; + Radius 0.1; + Height 0; + +NOBLOCKMAP; + +NOGRAVITY; + +DONTSPLASH; + +FORCEXYBILLBOARD; + +INVISIBLE; // temporarily until clipping screwery is fixed + Scale 0.2; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + let l = Spawn("ChunkLight",pos); + l.target = self; + } + override void Tick() + { + Super.Tick(); + A_SpawnParticle("FFFF00",SPF_FULLBRIGHT,1,8,startalphaf:alpha); + A_SpawnParticle("E0A000",SPF_FULLBRIGHT,1,16,startalphaf:alpha*0.6); + A_SpawnParticle("804000",SPF_FULLBRIGHT,1,32,startalphaf:alpha*0.3); + if ( InStateSequence(CurState,FindState("Death")) ) return; + if ( !target ) + { + SetStateLabel("Death"); + return; + } + SetOrigin(target.pos+(0,0,speed),true); + } + States + { + Spawn: + FGLO A 1 Bright; + Wait; + Death: + FGLO A 1 Bright A_FadeOut(0.1); + Wait; + } + +} + +Class FlakChunk : Actor +{ + Actor lasthit; + ChunkTrail trail; + double rollvel, pitchvel; + double lifetime, lifespeed; + int lifetics; + Default + { + Obituary "%o was ripped to shreds by %k's Flak Cannon."; + Radius 2; + Height 2; + Speed 80; + DamageFunction Random[Flak](12,18); + DamageType 'Shredded'; + BounceType "Doom"; + BounceFactor 0.8; + PROJECTILE; + +USEBOUNCESTATE + -BOUNCEAUTOOFF + Scale 0.5; + } + override bool CanCollideWith( Actor other, bool passive ) + { + return (vel.length()>4.0); + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + lifetime = 0; + lifespeed = FRandom[Flak](0.004,0.008); + trail = ChunkTrail(Spawn("ChunkTrail",pos)); + trail.target = self; + trail.speed = 0.5; + rollvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1); + scale *= Frandom[Flak](0.8,1.2); + SetState(ResolveState("Spawn")+Random[Flak](0,3)); + } + override void Tick() + { + Super.Tick(); + lifetics++; + if ( lifetics > 3 ) + { + lifetics = 0; + if ( frame < 11 ) frame++; + } + lifetime += lifespeed; + if ( (waterlevel <= 0) && (frame < 10) ) A_SpawnParticle("AAAAAA",0,35,2.0,velx:FRandom[Flak](-0.1,0.1),vely:FRandom[Flak](-0.1,0.1),velz:FRandom[Flak](-0.1,0.1),accelz:0.02,startalphaf:scale.x/0.5,sizestep:0.2); + if ( trail ) trail.alpha = max(0,11-frame)/11.; + if ( InStateSequence(CurState,FindState("Death")) ) return; + A_SetRoll(roll+rollvel,SPF_INTERPOLATE); + A_SetPitch(pitch+pitchvel,SPF_INTERPOLATE); + } + action void A_HandleBounce() + { + A_SprayDecal("WallCrack",-8); + A_Gravity(); + invoker.rollvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1)*(vel.length()/speed); + invoker.pitchvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1)*(vel.length()/speed); + vel = (vel.unit()+(FRandom[Flak](-0.4,0.4),FRandom[Flak](-0.4,0.4),FRandom[Flak](-0.4,0.4))).unit()*vel.length(); + A_PlaySound("flak/bounce",volume:0.3); + if ( vel.length() < 4.0 ) ExplodeMissile(); + } + override int DoSpecialDamage( Actor target, int damage, Name damagetype ) + { + if ( !target.bNOBLOOD ) + { + if ( target != lasthit ) target.SpawnBlood(pos,AngleTo(target),damage); + A_PlaySound("flak/meat",volume:0.3); + } + lasthit = target; + return damage; + } + States + { + Spawn: + FCH1 A 0; + Goto Idle; + FCH2 A 0; + Goto Idle; + FCH3 A 0; + Goto Idle; + FCH4 A 0; + Goto Idle; + Idle: + #### # -1; + Stop; + Bounce: + #### # 0 A_HandleBounce(); + Goto Idle; + Death: + #### # 0 + { + bMOVEWITHSECTOR = true; + A_SetTics(Random[Flak](30,50)); + } + #### # 1 + { + A_SetScale(scale.x-0.002); + if ( scale.x <= 0.0 ) Destroy(); + } + Wait; + Crash: + TNT1 A 0 + { + Spawn("BulletPuff",pos); + A_PlaySound("flak/hit",volume:0.3); + A_AlertMonsters(); + } + XDeath: + TNT1 A 1; + Stop; + Dummy: + FCH1 ABCDEFGHIJKL -1; + FCH2 ABCDEFGHIJKL -1; + FCH3 ABCDEFGHIJKL -1; + FCH4 ABCDEFGHIJKL -1; + Stop; + } +} + +Class SlugSmoke : Actor +{ + double lifetime, lifespeed; + Default + { + Radius 0.1; + Height 0; + +NOBLOCKMAP; + +NOGRAVITY; + +DONTSPLASH; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + lifetime = 0; + lifespeed = FRandom[Flak](0.004,0.008); + } + override void Tick() + { + Super.Tick(); + lifetime += lifespeed; + if ( waterlevel <= 0 ) A_SpawnParticle("AAAAAA",0,50,16.0,velx:FRandom[Flak](-0.5,0.5),vely:FRandom[Flak](-0.5,0.5),velz:FRandom[Flak](-0.5,0.5),accelz:0.05,startalphaf:scale.x,sizestep:1.0); + scale.x = max(0,1-lifetime); + if ( scale.x <= 0 ) Destroy(); + } + States + { + Spawn: + TNT1 A -1; + Stop; + } +} + +Class SlugLight : DynamicLight +{ + double lifetime; + Default + { + DynamicLight.Type "Point"; + Args 255,224,128,80; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + lifetime = 1.0; + } + override void Tick() + { + Super.Tick(); + args[LIGHT_RED] = 255*lifetime; + args[LIGHT_GREEN] = 224*lifetime; + args[LIGHT_BLUE] = 128*lifetime; + lifetime -= 0.05; + if ( lifetime <= 0 ) Destroy(); + } +} + +Class FlakSlug : Actor +{ + ChunkTrail trail; + Default + { + Obituary "%o was ripped to shreds by %k's Flak Cannon."; + DamageType 'FlakDeath'; + Radius 2; + Height 2; + Speed 40; + PROJECTILE; + -NOGRAVITY; + +SKYEXPLODE; + +FORCERADIUSDMG; + +HITTRACER; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + trail = ChunkTrail(Spawn("ChunkTrail",pos)); + trail.target = self; + trail.speed = 1; + vel.z += 5; + } + action void A_FlakExplode() + { + bForceXYBillboard = true; + A_SetRenderStyle(1.0,STYLE_Add); + A_SprayDecal("RocketBlast",150); + A_NoGravity(); + A_SetScale(1.2); + A_Explode(Random[Flak](60,80),150); + A_QuakeEx(4,4,4,8,0,200,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.2); + A_PlaySound("flak/explode",CHAN_VOICE); + if ( !Tracer ) Spawn("SlugSmoke",pos); + Spawn("SlugLight",pos); + Vector3 x, y, z; + double a, s; + [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); + Actor p; + for ( int i=0; i<5; i++ ) + { + p = Spawn("FlakChunk",pos); + a = FRandom[Flak](0,360); + s = FRandom[Flak](0,0.2); + Vector3 dir = (x+y*cos(a)*s+z*sin(a)*s).unit(); + p.angle = atan2(dir.y,dir.x); + p.pitch = -asin(dir.z); + p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed*FRandom[Flak](0.5,1.5); + p.target = target; + } + } + States + { + Spawn: + FSLG A 1 + { + for ( int i=0; i<6; i++ ) + A_SpawnParticle("AAAAAA",0,50,12.0,velx:FRandom[Flak](-0.5,0.5),vely:FRandom[Flak](-0.5,0.5),velz:FRandom[Flak](-0.5,0.5),accelz:0.02,startalphaf:0.5,sizestep:1.0); + } + Wait; + Death: + EXP2 A 0 A_FlakExplode(); + EXP2 ABCDEFGHIJKLMNOPQR 1 BRIGHT; + Stop; + } +} + +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; + } + override void Tick() + { + Super.Tick(); + if ( !target ) + { + Destroy(); + return; + } + SetOrigin(target.pos,true); + } +} + +Class FlakMuzzle : Actor +{ + Vector3 ofs; + + override void PostBeginPlay() + { + Super.PostBeginPlay(); + let l = Spawn("FlakLight",pos); + l.target = self; + if ( target ) ofs = target.Vec3To(self); + else ofs = (0,0,0); + } + override void Tick() + { + Super.Tick(); + if ( !target ) + { + Destroy(); + return; + } + bInvisible = (target != players[consoleplayer].camera); + SetOrigin(target.Vec3Offset(ofs.x-target.vel.x,ofs.y-target.vel.y,ofs.z-target.vel.z),true); + } + Default + { + RenderStyle "Add"; + Radius 0.1; + Height 0; + Scale 0.08; + +NOGRAVITY; + +NOBLOCKMAP; + +DONTSPLASH; + } + States + { + Spawn: + FMUZ A 3 Bright; + Stop; + } +} + +Class FlakCannon : UTWeapon +{ + action void A_Selecting() + { + A_PlaySound("flak/select",CHAN_WEAPON); + } + action void A_Loading( bool first = false ) + { + if ( first ) A_PlaySound("flak/load",CHAN_WEAPON); + else A_PlaySound("flak/reload",CHAN_WEAPON); + } + action void A_FireChunks() + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; + A_PlaySound("flak/fire",CHAN_WEAPON); + A_QuakeEx(1,1,1,3,0,64,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.05); + Vector3 x, y, z; + double a, s; + [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); + Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+2.0*y-3.0*z; + let m = Spawn("FlakMuzzle",pos+(0,0,player.viewheight)+20.0*x+5.0*y-3.0*z); + m.target = self; + [x, y, z] = Matrix4.GetAxes(BulletSlope(),angle,roll); + Actor p; + for ( int i=0; i<8; i++ ) + { + p = Spawn("FlakChunk",origin); + a = FRandom[Flak](0,360); + s = FRandom[Flak](0,0.2); + Vector3 dir = (x+y*cos(a)*s+z*sin(a)*s).unit(); + p.angle = atan2(dir.y,dir.x); + p.pitch = -asin(dir.z); + p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed; + p.target = self; + } + } + action void A_FireSlug() + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; + A_PlaySound("flak/altfire",CHAN_WEAPON); + A_QuakeEx(2,2,2,10,0,64,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); + Vector3 x, y, z; + double a, s; + [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); + Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+2.0*y-3.0*z; + let m = Spawn("FlakMuzzle",pos+(0,0,player.viewheight)+20.0*x+5.0*y-3.0*z); + m.target = self; + Actor p = Spawn("FlakSlug",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; + } + + Default + { + Tag "Flak Cannon"; + Inventory.PickupMessage "You got the Flak Cannon."; + Weapon.SlotNumber 8; + Weapon.AmmoType "FlakAmmo"; + Weapon.AmmoUse 1; + Weapon.AmmoType2 "FlakAmmo"; + Weapon.AmmoUse2 1; + Weapon.AmmoGive 10; + } + States + { + Spawn: + FPCK A -1; + Stop; + FPCK B -1; + Stop; + Ready: + FLKS A 1 A_Selecting(); + FLKS BCDEFGHIJKLMNOPQRSTUVWXYZ 1; + FKS2 ABC 1; + FLKL A 1 A_Loading(true); + FLKL BCDEFGHIJKLMNO 1; + Goto Idle; + Loading: + FLKL A 1 + { + A_CheckReload(); + if ( invoker.Ammo1.Amount > 0 ) A_Loading(); + } + FLKL BCDEFGHIJKLMNO 1; + Idle: + FLKI A 10; + FLKI A 1 A_WeaponReady(); + Wait; + Fire: + FLKF A 1 A_FireChunks(); + FLKF BCDEFGHIJ 1; + FLKF JJ 4; + Goto Loading; + AltFire: + FLKA A 1 A_FireSlug(); + FLKA BCDEFGHIJK 2; + FLKA KKK 4; + Goto Loading; + Select: + FLKS A 1 A_Raise(int.max); + Wait; + Deselect: + FLKD ABCDEFGHIJ 2; + FLKD J 1 A_Lower(int.max); + Wait; + } +} diff --git a/zscript/mk_coordutil.zsc b/zscript/mk_coordutil.zsc new file mode 100644 index 0000000..299feed --- /dev/null +++ b/zscript/mk_coordutil.zsc @@ -0,0 +1,72 @@ +/* + Coordinate Utility helper class. + (C)2018 Marisa Kirisame, UnSX Team. + Released under the GNU Lesser General Public License version 3 (or later). + See https://www.gnu.org/licenses/lgpl-3.0.txt for its terms. +*/ + +Class mkCoordUtil +{ + // projects a world point onto screen + // view matrix setup mostly pulled from gutawer's code + static Vector3 WorldToScreen( Vector3 vect, Vector3 eye, double pitch, double yaw, double roll, double vfov ) + { + double ar = Screen.getWidth()/double(Screen.getHeight()); + double fovr = (ar>=1.3)?1.333333:ar; + double fov = 2*atan(tan(clamp(vfov,5,170)*0.5)/fovr); + float pr = level.pixelstretch; + double angx = cos(pitch); + double angy = sin(pitch)*pr; + double alen = sqrt(angx*angx+angy*angy); + double apitch = asin(angy/alen); + double ayaw = yaw-90; + // rotations + Matrix4 mRoll = Matrix4.rotate((0,0,1),roll); + Matrix4 mPitch = Matrix4.rotate((1,0,0),apitch); + Matrix4 mYaw = Matrix4.rotate((0,-1,0),ayaw); + // scaling + Matrix4 mScale = Matrix4.identity(); + mScale.set(1,1,pr); + // YZ swap + Matrix4 mYZ = Matrix4.create(); + mYZ.set(0,0,1); + mYZ.set(2,1,1); + mYZ.set(1,2,-1); + mYZ.set(3,3,1); + // translation + Matrix4 mMove = Matrix4.identity(); + mMove.set(3,0,-eye.x); + mMove.set(3,1,-eye.y); + mMove.set(3,2,-eye.z); + // perspective + Matrix4 mPerspective = Matrix4.perspective(fov,ar,5,65535); + // full matrix + Matrix4 mView = mRoll.mul(mPitch); + mView = mView.mul(mYaw); + mView = mView.mul(mScale); + mView = mView.mul(mYZ); + mView = mView.mul(mMove); + Matrix4 mWorldToScreen = mPerspective.mul(mView); + return mWorldToScreen.vmat(vect); + } + + // converts a projected screen position to 2D canvas coords + // thanks once again to gutawer for making this thing screenblocks-aware + // [NEW] added second return value: true if the point has valid depth (i.e.: it's not behind view) + // [TODO] handle forced aspect ratio (e.g.: 320x200 scaling) + static Vector2, bool ToViewport( Vector3 screenpos, bool scrblocks = true ) + { + if ( scrblocks ) + { + int winx, winy, winw, winh; + [winx,winy,winw,winh] = Screen.getViewWindow(); + int sh = Screen.getHeight(); + int ht = sh; + int screenblocks = CVar.GetCVar("screenblocks",players[consoleplayer]).getInt(); + if ( screenblocks < 10 ) ht = (screenblocks*sh/10)&~7; + int bt = sh-(ht+winy-((ht-winh)/2)); + return (winx,sh-bt-ht)+((screenpos.x+1)*winw,(-screenpos.y+1)*ht)*0.5, (screenpos.z<=1.0); + } + else return ((screenpos.x+1)*Screen.getWidth(),(-screenpos.y+1)*Screen.getHeight())*0.5, (screenpos.z<=1.0); + } +} diff --git a/zscript/mk_matrix.zsc b/zscript/mk_matrix.zsc new file mode 100644 index 0000000..37ddf69 --- /dev/null +++ b/zscript/mk_matrix.zsc @@ -0,0 +1,123 @@ +/* + Matrix Math helper class. + (C)2018 Marisa Kirisame, UnSX Team. + Released under the GNU Lesser General Public License version 3 (or later). + See https://www.gnu.org/licenses/lgpl-3.0.txt for its terms. +*/ + +Class Matrix4 +{ + private double m[16]; + + Matrix4 init() + { + int i; + for ( i=0; i<16; i++ ) m[i] = 0; + return self; + } + + static Matrix4 create() + { + return new("Matrix4").init(); + } + + static Matrix4 identity() + { + Matrix4 o = Matrix4.create(); + for ( int i=0; i<4; i++ ) o.set(i,i,1); + return o; + } + + double get( int c, int r ) + { + return m[r*4+c]; + } + + void set( int c, int r, double v ) + { + m[r*4+c] = v; + } + + Matrix4 add( Matrix4 o ) + { + Matrix4 r = Matrix4.create(); + int i, j; + for ( i=0; i<4; i++ ) for ( j=0; j<4; j++ ) + r.set(j,i,get(j,i)+o.get(j,i)); + return r; + } + + Matrix4 scale( double s ) + { + Matrix4 r = Matrix4.create(); + int i, j; + for ( i=0; i<4; i++ ) for ( j=0; j<4; j++ ) + r.set(j,i,get(j,i)*s); + return r; + } + + Matrix4 mul( Matrix4 o ) + { + Matrix4 r = Matrix4.create(); + int i, j; + for ( i=0; i<4; i++ ) for ( j=0; j<4; j++ ) + r.set(j,i,get(0,i)*o.get(j,0)+get(1,i)*o.get(j,1)+get(2,i)*o.get(j,2)+get(3,i)*o.get(j,3)); + return r; + } + + Vector3 vmat( Vector3 o ) + { + double x, y, z, w; + x = get(0,0)*o.x+get(1,0)*o.y+get(2,0)*o.z+get(3,0); + y = get(0,1)*o.x+get(1,1)*o.y+get(2,1)*o.z+get(3,1); + z = get(0,2)*o.x+get(1,2)*o.y+get(2,2)*o.z+get(3,2); + w = get(0,3)*o.x+get(1,3)*o.y+get(2,3)*o.z+get(3,3); + return (x,y,z)/w; + } + + static Matrix4 rotate( Vector3 axis, double theta ) + { + Matrix4 r = Matrix4.identity(); + double s, c, oc; + s = sin(theta); + c = cos(theta); + oc = 1.0-c; + r.set(0,0,oc*axis.x*axis.x+c); + r.set(1,0,oc*axis.x*axis.y-axis.z*s); + r.set(2,0,oc*axis.x*axis.z+axis.y*s); + r.set(0,1,oc*axis.y*axis.x+axis.z*s); + r.set(1,1,oc*axis.y*axis.y+c); + r.set(2,1,oc*axis.y*axis.z-axis.x*s); + r.set(0,2,oc*axis.z*axis.x-axis.y*s); + r.set(1,2,oc*axis.z*axis.y+axis.x*s); + r.set(2,2,oc*axis.z*axis.z+c); + return r; + } + + static Matrix4 perspective( double fov, double ar, double znear, double zfar ) + { + Matrix4 r = Matrix4.create(); + double f = 1/tan(fov*0.5); + r.set(0,0,f/ar); + r.set(1,1,f); + r.set(2,2,(zfar+znear)/(znear-zfar)); + r.set(3,2,(2*zfar*znear)/(znear-zfar)); + r.set(2,3,-1); + return r; + } + + // UE-like axes from rotation + static Vector3, Vector3, Vector3 getaxes( double pitch, double yaw, double roll ) + { + Vector3 x = (1,0,0), y = (0,-1,0), z = (0,0,1); // y inverted for left-handed result + Matrix4 mRoll = Matrix4.rotate((1,0,0),roll); + Matrix4 mPitch = Matrix4.rotate((0,1,0),pitch); + Matrix4 mYaw = Matrix4.rotate((0,0,1),yaw); + Matrix4 mRot = mRoll.mul(mYaw); + mRot = mRot.mul(mPitch); + x = mRot.vmat(x); + y = mRot.vmat(y); + z = mRot.vmat(z); + return x, y, z; + } +} diff --git a/zscript/shockrifle.zsc b/zscript/shockrifle.zsc new file mode 100644 index 0000000..4131b2e --- /dev/null +++ b/zscript/shockrifle.zsc @@ -0,0 +1,486 @@ +Class ShockAmmo : Ammo +{ + Default + { + Tag "Flak Shells"; + Inventory.Icon "I_ASMD"; + Inventory.PickupMessage "You picked up a Shock Core."; + Inventory.PickupSound "ut/ammo"; + Inventory.Amount 10; + Inventory.MaxAmount 50; + Ammo.BackpackAmount 50; + Ammo.BackpackMaxAmount 100; + Ammo.DropAmount 10; + } + States + { + Spawn: + SHOA A -1; + Stop; + } +} + +Class ShockBeamTracer : LineTracer +{ + Actor owner, ignore; + + override ETraceStatus TraceCallback() + { + if ( Results.HitType == TRACE_HitActor ) + { + if ( (Results.HitActor == owner) || (Results.HitActor == ignore) ) return TRACE_Skip; + if ( Results.HitActor.bSHOOTABLE || Results.HitActor is 'ShockHitbox' ) return TRACE_Stop; + return TRACE_Skip; + } + else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) + { + if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&Line.ML_BlockHitscan) ) + return TRACE_Stop; + return TRACE_Skip; + } + return TRACE_Stop; + } +} + +Class ShockRifleWave : Actor +{ + Default + { + RenderStyle "Add"; + Radius 0.1; + Height 0; + Scale 0.7; + +NOBLOCKMAP; + +NOGRAVITY; + +DONTSPLASH; + } + override void Tick() + { + Super.Tick(); + alpha -= 1/50.; + } + States + { + Spawn: + SWAV A 50 Bright; + SWAV B 0 Bright; + Stop; + } +} + +Class ShockBeamRing : Actor +{ + Default + { + RenderStyle "Add"; + Radius 0.1; + Height 0; + Scale 0.5; + ReactionTime 18; + +NOBLOCKMAP; + +NOGRAVITY; + +DONTSPLASH; + } + override void Tick() + { + Super.Tick(); + alpha -= 1./ReactionTime; + } + States + { + Spawn: + SRNG ABCDEFGHI 2 Bright; + Stop; + } +} + +Class ShockBlastRing : ShockBeamRing +{ + Default + { + Scale 3.0; + ReactionTime 45; + } + States + { + Spawn: + SRNG ABCDEFGHI 5 Bright; + Stop; + } +} + +Class ShockBeam : Actor +{ + ShockBeamTracer t; + Vector3 tracedir; + bool moving; + double totaldist; + + Default + { + Obituary "%k inflicted mortal damage upon %o with the Shock Rifle"; + RenderStyle "Add"; + Radius 0.1; + Height 0; + Scale 0.4; + DamageFunction Random[ASMD](30,45); + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +FORCEXYBILLBOARD; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + t = new("ShockBeamTracer"); + t.owner = target; + t.ignore = self; + moving = true; + } + override void Tick() + { + Super.Tick(); + if ( !moving ) return; + // step trace + tracedir = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + t.Trace(pos,cursector,tracedir,1000,0); + totaldist += t.Results.Distance; + // spawn particles + for ( int i=0; i= 10000.0 ) + { + // reposition and explode on air + SetOrigin(t.Results.HitPos-t.Results.HitVector*4,true); + A_SprayDecal("ShockMark",16); + ExplodeMissile(t.Results.HitLine,null); + moving = false; + let r = Spawn("ShockBeamRing",pos); + r.angle = atan2(t.Results.HitVector.y,t.Results.HitVector.x); + r.pitch = asin(-t.Results.HitVector.z); + } + else if ( t.Results.HitType == TRACE_HitNone ) + { + // reposition + SetOrigin(t.Results.HitPos+t.Results.HitVector,true); + angle = atan2(t.Results.HitVector.y,t.Results.HitVector.x); + pitch = asin(-t.Results.HitVector.z); + } + else if ( t.Results.HitType == TRACE_HitActor ) + { + // reposition and explode on actor + SetOrigin(t.Results.HitPos-t.Results.HitVector*4,true); + ExplodeMissile(null,t.Results.HitActor); + if ( t.Results.HitActor is 'ShockHitbox' ) + { + if ( target ) target.TakeInventory('ShockAmmo',2); + let b = t.Results.HitActor.target; + b.ExplodeMissile(null,self); + b.A_Explode(Random[ASMD](150,160),250); + b.A_QuakeEx(6,6,6,60,0,1200,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.2); + b.A_SprayDecal("BigShockMark1",100); + b.A_SprayDecal("BigShockMark2",100); + Spawn("ShockRifleWave",b.pos); + Spawn("ShockBlastLight",b.pos); + let r = Spawn("ShockBlastRing",b.pos); + r.angle = atan2(t.Results.HitVector.y,t.Results.HitVector.x); + r.pitch = asin(-t.Results.HitVector.z); + A_PlaySound("shock/blast",CHAN_WEAPON,attenuation:0.5); + } + else + { + t.Results.HitActor.DamageMobj(self,target,Random[ASMD](35,50),'jolted'); + let r = Spawn("ShockBeamRing",pos); + r.angle = atan2(t.Results.HitVector.y,t.Results.HitVector.x); + r.pitch = asin(-t.Results.HitVector.z); + } + moving = false; + } + else + { + // reposition and explode on wall + SetOrigin(t.Results.HitPos-t.Results.HitVector*4,true); + A_SprayDecal("ShockMark",16); + ExplodeMissile(t.Results.HitLine,null); + moving = false; + Vector3 HitNormal = t.Results.HitVector; + if ( t.Results.HitType == TRACE_HitWall ) + { + t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,pos); + // calculate normal + HitNormal = (-t.Results.HitLine.delta.y,t.Results.HitLine.delta.x,0).unit(); + if ( t.Results.Side == 1 ) HitNormal *= -1; + } + else if ( t.Results.HitType == TRACE_HitFloor ) + HitNormal = t.Results.HitSector.floorplane.Normal; + else if ( t.Results.HitType == TRACE_HitCeiling ) + HitNormal = t.Results.HitSector.ceilingplane.Normal; + let r = Spawn("ShockBeamRing",pos); + r.angle = atan2(HitNormal.y,HitNormal.x); + r.pitch = asin(-HitNormal.z); + } + } + action void A_BeamExplode() + { + Spawn("ShockBeamLight",pos); + A_QuakeEx(2,2,2,5,0,120,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); + A_PlaySound("shock/hit",CHAN_VOICE); + } + States + { + Spawn: + TNT1 A 1; + Wait; + Death: + TNT1 A 0 A_BeamExplode(); + AEXP ABCDEFGHIJKL 1 Bright; + TNT1 A 100; + Stop; + } +} + +Class ShockBallLight : DynamicLight +{ + Default + { + DynamicLight.Type "Point"; + Args 160,128,255,120; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + } + override void Tick() + { + Super.Tick(); + if ( !target || target.InStateSequence(target.CurState,target.ResolveState("Death")) ) + { + Destroy(); + return; + } + SetOrigin(target.pos,true); + args[LIGHT_INTENSITY] = Random[ASMD](10,14)*10; + } +} + +Class ShockBeamLight : ShockExplLight +{ + Default + { + ReactionTime 15; + Args 0,0,0,80; + } +} + +Class ShockBeamHitLight : ShockExplLight +{ + Default + { + ReactionTime 24; + Args 0,0,0,120; + } +} + +Class ShockBlastLight : ShockExplLight +{ + Default + { + ReactionTime 50; + Args 0,0,0,300; + } +} + +Class ShockExplLight : DynamicLight +{ + double lifetime; + Default + { + DynamicLight.Type "Point"; + ReactionTime 30; + Args 160,128,255,150; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + lifetime = 1.0; + } + override void Tick() + { + Super.Tick(); + args[LIGHT_RED] = 160*lifetime; + args[LIGHT_GREEN] = 128*lifetime; + args[LIGHT_BLUE] = 255*lifetime; + lifetime -= 1./ReactionTime; + if ( lifetime <= 0 ) Destroy(); + } +} + +Class ShockHitbox : Actor +{ + Default + { + Radius 16; + Height 16; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + } + override void Tick() + { + Super.Tick(); + if ( !target || target.InStateSequence(target.CurState,target.ResolveState("Death")) ) + { + Destroy(); + return; + } + SetOrigin(target.pos-(0,0,height*0.5),true); + } +} + +Class ShockBall : Actor +{ + Actor l, b; + + override void PostBeginPlay() + { + Super.PostBeginPlay(); + l = Spawn("ShockBallLight",pos); + l.target = self; + b = Spawn("ShockHitbox",pos); + b.target = self; + } + action void A_BallExplode() + { + A_Explode(Random[ASMD](50,60),70); + A_SprayDecal("ShockMarkBig",16); + Spawn("ShockExplLight",pos); + A_SetScale(1.0); + let r = Spawn("ShockBeamRing",pos); + r.angle = angle; + r.pitch = pitch; + r.scale *= 1.5; + A_PlaySound("shock/hit",CHAN_VOICE); + A_PlaySound("shock/ball",CHAN_WEAPON); + A_QuakeEx(4,4,4,30,0,200,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.15); + } + Default + { + Obituary "%k inflicted mortal damage upon %o with the Shock Rifle"; + RenderStyle "Add"; + DamageType 'jolted'; + Radius 4; + Height 4; + Scale 0.4; + Speed 20; + PROJECTILE; + +FORCEXYBILLBOARD; + +SKYEXPLODE; + +FORCERADIUSDMG; + } + States + { + Spawn: + ABAL ABCD 2 Bright; + Loop; + Death: + TNT1 A 0 A_BallExplode(); + AEXP ABCDEFGHIJKL 2 Bright; + TNT1 A 300; + Stop; + } +} + +Class ShockRifle : UTWeapon +{ + action void A_Selecting() + { + A_PlaySound("shock/select",CHAN_WEAPON); + } + action void A_ShockFire() + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; + A_PlaySound("shock/fire",CHAN_WEAPON); + A_QuakeEx(3,3,3,4,0,64,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); + Vector3 x, y, z; + double a, s; + [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); + Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+3.0*y-4.0*z; + Actor p = Spawn("ShockBeam",origin); + p.angle = angle; + p.pitch = BulletSlope(); + p.target = self; + } + action void A_ShockAlt() + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; + A_PlaySound("shock/altfire",CHAN_WEAPON); + A_QuakeEx(3,3,3,8,0,64,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); + Vector3 x, y, z; + double a, s; + [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); + Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+3.0*y-4.0*z; + Actor p = Spawn("ShockBall",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; + } + + Default + { + Tag "Shock Rifle"; + Inventory.PickupMessage "You got the ASMD Shock Rifle."; + Weapon.SlotNumber 4; + Weapon.AmmoType "ShockAmmo"; + Weapon.AmmoUse 1; + Weapon.AmmoType2 "ShockAmmo"; + Weapon.AmmoUse2 1; + Weapon.AmmoGive 20; + } + States + { + Spawn: + ASMP A -1; + Stop; + ASMP B -1; + Stop; + Ready: + ASMS A 1 A_Selecting(); + ASMS BCDEFGHIJKLMNO 1; + Idle: + ASMI A 1 + { + A_CheckReload(); + A_WeaponReady(); + } + Wait; + Fire: + ASMF A 1 A_ShockFire(); + ASMF BCDEFGHIJ 2; + Goto Idle; + AltFire: + ASMA A 1 A_ShockAlt(); + ASMA BCDEFGHIJ 2; + Goto Idle; + Deselect: + ASMD ABCDEFG 1; + ASMD G 1 A_Lower(int.max); + Wait; + Select: + ASMS A 1 A_Raise(int.max); + Wait; + } +} diff --git a/zscript/utcommon.zsc b/zscript/utcommon.zsc new file mode 100644 index 0000000..ffebb93 --- /dev/null +++ b/zscript/utcommon.zsc @@ -0,0 +1,64 @@ +Class UTWeapon : Weapon +{ + override Inventory CreateTossable( int amt ) + { + Inventory d = Super.CreateTossable(amt); + if ( d && (d.GetClass() == GetClass()) ) + d.SetState(d.ResolveState("Spawn")+1); + return d; + } + + override void Tick() + { + Super.Tick(); + if ( !Owner || !Owner.player || (Owner.player.ReadyWeapon != self) ) return; + Owner.player.WeaponState |= WF_WEAPONBOBBING; // UT weapons always bob + } + + Default + { + Inventory.PickupSound "ut/weapon"; + Weapon.BobStyle "Smooth"; + Weapon.BobSpeed 1.5; + Weapon.BobRangeX 0.2; + Weapon.BobRangeY 0.4; + } +} + +Class UTMenuHandler : StaticEventHandler +{ + ui TextureID tex; + + ui void StartMenu() + { + if ( gamestate != GS_TITLELEVEL ) return; + if ( CVar.GetCVar('flak_protomenu',players[consoleplayer]).GetBool() ) + { + S_ChangeMusic("xyzdMenu"); + tex = TexMan.CheckForTexture("protobg",TexMan.Type_Any); + } + else + { + S_ChangeMusic("utmenu23"); + tex = TexMan.CheckForTexture("finalbg",TexMan.Type_Any); + } + } + + override void ConsoleProcess( ConsoleEvent e ) + { + if ( e.Name ~== "refreshmenu" ) StartMenu(); + } + + override void PostUiTick() + { + if ( gametic <= 0 ) StartMenu(); + } + + override void RenderOverlay( RenderEvent e ) + { + if ( gamestate != GS_TITLELEVEL ) return; + if ( tex.IsNull() || !tex.IsValid() ) return; + Screen.Dim("Black",1.0,0,0,Screen.GetWidth(),Screen.GetHeight()); + Screen.DrawTexture(tex,true,0,0,DTA_VirtualWidth,1024,DTA_VirtualHeight,768); + } +} \ No newline at end of file diff --git a/zscript/warheadlauncher.zsc b/zscript/warheadlauncher.zsc new file mode 100644 index 0000000..d244313 --- /dev/null +++ b/zscript/warheadlauncher.zsc @@ -0,0 +1,574 @@ +// shouldn't be placed in the world (it wasn't in UT99) +Class WarheadAmmo : Ammo +{ + Default + { + Tag "Redeemer Missile"; + Inventory.Icon "I_WARH"; + Inventory.PickupMessage "You picked up a Redeemer Missile."; + Inventory.PickupSound "ut/ammo"; + Inventory.Amount 1; + Inventory.MaxAmount 2; + Ammo.BackpackAmount 0; + Ammo.BackpackMaxAmount 2; + Ammo.DropAmount 1; + } + States + { + Spawn: + WMIS A -1; + Stop; + } +} + +Class ShockWave : Actor +{ + double shocksize, olddmgradius; + double lifespan; + int icount; + ThinkerIterator t; + Default + { + Obituary "%o was vaporized by %k's Redeemer!!"; + RenderStyle "Add"; + Radius 0.1; + Height 0; + Scale 1.0; + ReactionTime 60; + +NOBLOCKMAP; + +NOGRAVITY; + +DONTSPLASH; + } + override void PostBeginPlay() + { + lifespan = ReactionTime; + A_PlaySound("warhead/explode",CHAN_VOICE,attenuation:ATTN_NONE); + A_QuakeEx(9,9,9,100,0,12000,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.5); + t = ThinkerIterator.Create("Actor"); + } + override void Tick() + { + Super.Tick(); + if ( alpha <= 0 ) return; + icount++; + if ( icount == 4 ) Spawn("WarheadSubExplosion",pos); + lifespan--; + alpha -= 1./ReactionTime; + shocksize = 13*(ReactionTime-lifespan)+3.5/(lifespan/ReactionTime+0.05); + A_SetScale(shocksize*0.25); + double dmgradius = shocksize*1.5; + Actor a; + t.Reinit(); + while ( a = Actor(t.Next()) ) + { + if ( !a.bShootable || !CheckSight(a) || (Distance3D(a) > dmgradius) ) continue; + Vector3 dir = Vec3To(a); + double dist = max(1,dir.length()); + dir = dir/dist+(0,0,0.3); + double moscale = max(0,1100-0.22*dist); + if ( (dist > olddmgradius) || (dir dot a.vel < 0) ) + { + a.vel += dir*(moscale/a.mass+20); + a.DamageMobj(self,target,moscale,'RedeemerDeath'); + } + } + olddmgradius = dmgradius; + } + States + { + Spawn: + RWAV A 100 Bright; + Stop; + } +} + +Class WarheadSubExplosion : Actor +{ + Default + { + Renderstyle "Add"; + Scale 2.8; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +FORCEXYBILLBOARD; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + Spawn("WarheadExplodLight",pos); + } + States + { + Spawn: + WE__ ABCDEFGHIJKLMNOPR 3 Bright; + Stop; + } +} + +Class WarheadHitbox : Actor +{ + Default + { + Radius 8; + Height 8; + +SHOOTABLE; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +NOBLOOD; + } + override int DamageMobj( Actor inflictor, Actor source, int damage, Name mod, int flags, double angle ) + { + if ( (damage > 5) && target ) + { + target.bAMBUSH = true; + target.ExplodeMissile(null,inflictor); + } + return 0; + } + override void Tick() + { + Super.Tick(); + if ( !target ) + { + Destroy(); + return; + } + SetOrigin(target.pos-(0,0,height*0.5),true); + } +} + +Class WarheadExplodLight : DynamicLight +{ + double lifetime; + Default + { + DynamicLight.Type "Point"; + ReactionTime 50; + Args 255,192,128,300; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + lifetime = 1.0; + } + override void Tick() + { + Super.Tick(); + args[LIGHT_RED] = 255*lifetime; + args[LIGHT_GREEN] = 192*lifetime; + args[LIGHT_BLUE] = 128*lifetime; + lifetime -= 1./ReactionTime; + if ( lifetime <= 0 ) Destroy(); + } +} + +Class WarheadLight : DynamicLight +{ + Default + { + DynamicLight.Type "Point"; + Args 255,224,192,70; + } + override void Tick() + { + Super.Tick(); + if ( !target ) + { + Destroy(); + return; + } + Vector3 taildir = -(cos(target.angle)*cos(target.pitch),sin(target.angle)*cos(target.pitch),-sin(target.pitch)); + SetOrigin(target.Vec3Offset(taildir.x*20,taildir.y*20,taildir.z*20),true); + args[LIGHT_INTENSITY] = Random[Warhead](6,8)*10; + } +} + +Class WarShell : Actor +{ + double destangle, destpitch; + Actor l, b; + + Default + { + Obituary "%o was vaporized by %k's Redeemer!!"; + Radius 2; + Height 2; + Speed 5; + DamageType 'RedeemerDeath'; + PROJECTILE; + +FORCEXYBILLBOARD; + +SKYEXPLODE; + +FORCERADIUSDMG; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + l = Spawn("Warheadlight",pos); + l.target = self; + b = Spawn("WarheadHitbox",pos); + b.target = self; + A_PlaySound("warhead/fly",CHAN_VOICE,1.0,true); + } + override int SpecialMissileHit( Actor victim ) + { + if ( victim == b ) return 1; + return -1; + } + override void Tick() + { + Super.Tick(); + if ( vel.length() > 0 ) + { + Vector3 dir = vel.unit(); + destangle = atan2(dir.y,dir.x); + destpitch = asin(-dir.z); + A_SetAngle(angle*0.9+destangle*0.1,SPF_INTERPOLATE); + A_SetPitch(pitch*0.9+destpitch*0.1,SPF_INTERPOLATE); + if ( vel.length() < 10 ) + { + Vector3 dir = vel.unit(); + vel += dir*1; + } + } + } + action void A_Trail() + { + Vector3 taildir = -(cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + for ( int i=0; i<8; i++ ) + A_SpawnParticle("404040",0,20,2,0,taildir.x*32,taildir.y*32,taildir.z*32,taildir.x*2+FRandom[Warhead](-.5,.5),taildir.y*2+FRandom[Warhead](-.5,.5),taildir.z*2+FRandom[Warhead](-.5,.5),accelz:0.1,sizestep:1); + for ( int i=0; i<8; i++ ) + { + A_SpawnParticle("FFA020",SPF_FULLBRIGHT,10,6,0,taildir.x*35+FRandom[Warhead](-1,1),taildir.y*35+FRandom[Warhead](-1,1),taildir.z*35+FRandom[Warhead](-1,1),taildir.x*4+FRandom[Warhead](-.25,.25),taildir.y*4+FRandom[Warhead](-.25,.25),taildir.z*4+FRandom[Warhead](-.25,.25)); + } + } + action void A_Vaporize() + { + if ( invoker.l ) invoker.l.Destroy(); + if ( invoker.b ) invoker.b.Destroy(); + A_SetScale(2.0); + A_Explode(1000,300); + A_SprayDecal("BigBlast"); + A_QuakeEx(8,8,8,20,0,300,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.35); + A_PlaySound("shock/hit",CHAN_VOICE,attenuation:0.5); + A_SetRenderStyle(1.0,STYLE_Add); + Spawn("WarheadExplodLight",pos); + let s = Spawn("ShockWave",pos); + s.target = target; + } + action void A_Intercepted() + { + if ( invoker.l ) invoker.l.Destroy(); + if ( invoker.b ) invoker.b.Destroy(); + A_Explode(1000,350); + A_SprayDecal("BigBlast"); + A_QuakeEx(8,8,8,20,0,300,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.35); + A_PlaySound("shock/hit",CHAN_VOICE,attenuation:0.5); + A_SetRenderStyle(1.0,STYLE_Add); + Spawn("WarheadExplodLight",pos); + } + States + { + Spawn: + WMIS A 1 A_Trail(); + Wait; + Death: + TNT1 A 0 A_JumpIf(bAMBUSH,"Death.Intercept"); + TNT1 A 0 A_Vaporize(); + NE__ ABCDEFGHIJKLMNOPR 3 Bright; + Stop; + Death.Intercept: + TNT1 A 0 A_Intercepted(); + WE__ ABCDEFGHIJKLMNOPR 3 Bright; + Stop; + } +} + +Class GuidedWarShell : WarShell +{ + double lagangle, lagpitch, lagangle2, lagpitch2; + double guideangle, guidepitch, lastguideroll; + + override void PostBeginPlay() + { + Super.PostBeginPlay(); + if ( target && target.player ) target.player.camera = self; + guideangle = angle; + guidepitch = pitch; + } + override void Tick() + { + Actor.Tick(); + if ( !bMISSILE ) return; + if ( !target || !target.player || (target.Health <= 0) ) + { + bAMBUSH = true; + ExplodeMissile(); + return; + } + if ( target.player.cmd.buttons&BT_ATTACK ) + { + ExplodeMissile(); + return; + } + if ( vel.length() > 0 ) + { + lagangle = target.player.cmd.yaw/128.; + lagpitch = -target.player.cmd.pitch/128.; + guideangle += lagangle2*0.95+lagangle*0.05; + guidepitch += lagpitch2*0.95+lagpitch*0.05; + guidepitch = Clamp(guidepitch,-89,89); + double guideroll = -lagangle2*15; + Vector3 dir = (cos(guideangle)*cos(guidepitch),sin(guideangle)*cos(guidepitch),-sin(guidepitch)); + destangle = atan2(dir.y,dir.x); + destpitch = asin(-dir.z); + double destroll = lastguideroll*0.9+guideroll*0.1; + A_SetAngle(destangle,SPF_INTERPOLATE); + A_SetPitch(destpitch,SPF_INTERPOLATE); + A_SetRoll(destroll,SPF_INTERPOLATE); + vel = vel.length()*(cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + if ( vel.length() < 10 ) + { + Vector3 dir = vel.unit(); + vel += dir*1; + } + } + lagangle2 = lagangle2*0.95+lagangle*0.05; + lagpitch2 = lagpitch2*0.95+lagpitch*0.05; + lastguideroll = roll*0.98; + } + States + { + Death: + TNT1 A 0 + { + if ( WarheadLauncher(master) ) + WarheadLauncher(master).Guided = null; + if ( target && target.player && target.player.camera == self ) target.player.camera = target; + } + Goto Super::Death; + } +} + +Class MidTracer : LineTracer +{ + override ETraceStatus TraceCallback() + { + if ( Results.HitType == TRACE_HitActor ) return TRACE_Skip; + else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) + { + if ( !Results.HitLine.sidedef[1] ) return TRACE_Stop; + return TRACE_Skip; + } + return TRACE_Stop; + } +} + +Class RedeemerHUD : HUDMessageBase +{ + Actor Camera; + Vector3 ViewPos; + double ViewAngle, ViewPitch, ViewRoll; + TextureID reticle, mark, readout; + Font whfont; + ThinkerIterator t; + MidTracer tr; + + RedeemerHUD Init() + { + reticle = TexMan.CheckForTexture("GuidedX",TexMan.Type_Any); + mark = TexMan.CheckForTexture("Crosshr6",TexMan.Type_Any); + readout = TexMan.CheckForTexture("Readout",TexMan.Type_Any); + whfont = Font.GetFont('WHFONT'); + t = ThinkerIterator.Create("Actor"); + tr = new("MidTracer"); + return self; + } + override bool Tick() + { + return !Camera; + } + override void Draw( int bottom, int visibility ) + { + if ( visibility != StatusBar.HUDMSGLayer_UnderHUD ) return; + Screen.Dim("Red",0.5,0,0,Screen.GetWidth(),Screen.GetHeight()); + // shootable targetting + t.Reinit(); + Actor a; + while ( a = Actor(t.Next()) ) + { + Vector3 tdir = Level.Vec3Diff(ViewPos,a.Pos+(0,0,a.Height*0.5)); + if ( !a.bSHOOTABLE || (a.Health <= 0) || ((Camera is 'GuidedWarShell') && (a == GuidedWarShell(Camera).b)) || tr.Trace(ViewPos,Camera.CurSector,tdir.unit(),tdir.length(),0) ) continue; + Vector3 wpos = ViewPos+tdir; + Vector3 spos = mkCoordUtil.WorldToScreen(wpos,ViewPos,ViewPitch,ViewAngle,ViewRoll,players[consoleplayer].FOV); + if ( spos.z > 1.0 ) continue; + Vector2 vpos = mkCoordUtil.ToViewport(spos); + Screen.DrawTexture(mark,false,vpos.x,vpos.y); + String diststr = String.Format("%f",tdir.length()); + diststr.Replace(".",""); + Screen.DrawText(whfont,Font.CR_UNTRANSLATED,(vpos.x-whfont.StringWidth(diststr)/2)-12,vpos.y+8,diststr); + } + // other stuff + Screen.DrawTexture(reticle,false,320,240,DTA_VirtualWidth,640,DTA_VirtualHeight,480); + int numreadouts = Screen.GetHeight()/128+2; + for ( int i=0; i15); + } + override void Draw( int bottom, int visibility ) + { + if ( visibility != StatusBar.HUDMSGLayer_UnderHUD ) return; + double sw, sh; + sw = 256.; + sh = sw*(Screen.GetHeight()/double(Screen.GetWidth())); + Screen.DrawTexture(tx,true,0,0,DTA_VirtualWidthF,sw,DTA_VirtualHeightF,sh,DTA_KeepRatio,true); + } +} + +Class RedeemerHUDHandler : EventHandler +{ + ui RedeemerHUD rhud; + + override void RenderOverlay( RenderEvent e ) + { + if ( e.Camera is 'GuidedWarShell' ) + { + if ( !rhud ) + { + rhud = new("RedeemerHUD").Init(); + StatusBar.AttachMessage(rhud,0,StatusBar.HUDMSGLayer_UnderHUD); + } + rhud.Camera = e.Camera; + rhud.ViewPos = e.ViewPos; + rhud.ViewAngle = e.ViewAngle; + rhud.ViewPitch = e.ViewPitch; + rhud.ViewRoll = e.ViewRoll; + } + else if ( rhud ) + { + StatusBar.DetachMessage(rhud); + rhud.Destroy(); + StatusBar.AttachMessage(new("RedeemerHUDStatic").Init(),0,StatusBar.HUDMSGLayer_UnderHUD); + } + } +} + +Class WarheadLauncher : UTWeapon +{ + Actor guided; + action void A_Selecting() + { + A_PlaySound("warhead/select",CHAN_WEAPON); + } + action void A_WarheadFire() + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; + A_PlaySound("warhead/fire",CHAN_WEAPON); + A_QuakeEx(6,6,6,20,0,100,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.2); + Vector3 x, y, z; + double a, s; + [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); + vel -= x*10; + Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+2.0*y-2.0*z; + Actor p = Spawn("WarShell",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; + } + action void A_WarheadAlt() + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; + A_PlaySound("warhead/fire",CHAN_WEAPON); + A_QuakeEx(6,6,6,20,0,100,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.2); + Vector3 x, y, z; + double a, s; + [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); + vel -= x*10; + Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+2.0*y-2.0*z; + Actor p = Spawn("GuidedWarShell",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.master = invoker; + invoker.guided = p; + } + + Default + { + Tag "Redeemer"; + Inventory.PickupMessage "You got the Redeemer."; + Weapon.SlotNumber 0; + Weapon.AmmoType "WarheadAmmo"; + Weapon.AmmoUse 1; + Weapon.AmmoType2 "WarheadAmmo"; + Weapon.AmmoUse2 1; + Weapon.AmmoGive 1; + } + States + { + Spawn: + RDMP A -1; + Stop; + RDMP B -1; + Stop; + Ready: + WARS A 1 A_Selecting(); + WARS BCDEFGHIJKLMNO 1; + Idle: + WARI A 1 + { + A_CheckReload(); + A_WeaponReady(); + } + Wait; + Fire: + WARI A 3; + WARF A 3 A_WarheadFire(); + WARF BCDEFG 3; + WARI A 5; + Goto Idle; + AltFire: + WARI A 3; + WARF A 3 A_WarheadAlt(); + WARF BCDEFG 3; + WARI A 1 A_JumpIf(!invoker.Guided,1); + Wait; + WARI A 30; + Goto Idle; + Select: + WARS A 1 A_Raise(int.max); + Wait; + Deselect: + WARD ABCDEFG 2; + WARD G 1 A_Lower(int.max); + Wait; + } +}