diff --git a/README.md b/README.md index 1c478c767..88eb97d0b 100644 --- a/README.md +++ b/README.md @@ -470,16 +470,16 @@ with a multiplier suffix. Current score. The scoring system is pretty straightforward. Each thing you kill (even if not -an enemy) will give you points according to half of its base health, rounded up -to the nearest multiple of 10 and capped to 2000, plus these bonuses (in order -of application): +an enemy) will give you points according to a quarter of its base health, +rounded up to the nearest multiple of 10 and capped to 1000, plus these bonuses +(in order of application): * x1.25 for an overkill (enemy was gibbed or killed in one shot). * x1.5 for each combo level, up to x8 in steps of x0.5. Kills are considered combos if multiple enemies are killed within 5 seconds of each other. * +100 for killing an enemy without having taken damage since last spawn, with - extra +50 boosts for consecutive kills. - * +10000 if the enemy killed is a boss. - * +5000 if you've killed the last enemy in the map. + extra +10 boosts for consecutive kills (extra boosts taper off after 10x). + * +5000 if the enemy killed is a boss. + * +2000 if you've killed the last enemy in the map. You are also given +500 points for each secret found, +5000 if it's the final secret. Countable items give +25 points each or +2500 if it's the final item. diff --git a/gldefs.sparkster b/gldefs.sparkster new file mode 100644 index 000000000..a9ee11fb1 --- /dev/null +++ b/gldefs.sparkster @@ -0,0 +1,26 @@ +FlickerLight2 SPARKLIGHT +{ + Color 0.8 1.0 0.4 + Size 70 + SecondarySize 80 + Attenuate 1 + Interval 0.4 +} + +FlickerLight2 HUGESPARKLIGHT +{ + Color 0.8 1.0 0.4 + Size 150 + SecondarySize 160 + Attenuate 1 + Interval 0.4 +} + +Object BiosparkBall +{ + Frame "BSPK" { light "SPARKLIGHT" } +} +Object BigBiospark +{ + Frame "HSPK" { light "HUGESPARKLIGHT" } +} diff --git a/graphics/HUD/BiosparkBar.png b/graphics/HUD/BiosparkBar.png new file mode 100644 index 000000000..e995ad14c Binary files /dev/null and b/graphics/HUD/BiosparkBar.png differ diff --git a/graphics/HUD/BiosparkBarGray.png b/graphics/HUD/BiosparkBarGray.png new file mode 100644 index 000000000..9dc623728 Binary files /dev/null and b/graphics/HUD/BiosparkBarGray.png differ diff --git a/graphics/HUD/BiosparkBarRed.png b/graphics/HUD/BiosparkBarRed.png new file mode 100644 index 000000000..eec873682 Binary files /dev/null and b/graphics/HUD/BiosparkBarRed.png differ diff --git a/graphics/HUD/BiosparkDisplay.png b/graphics/HUD/BiosparkDisplay.png new file mode 100644 index 000000000..3f54d0c8b Binary files /dev/null and b/graphics/HUD/BiosparkDisplay.png differ diff --git a/modeldef.sparkster b/modeldef.sparkster index b93186da1..d25662de6 100644 --- a/modeldef.sparkster +++ b/modeldef.sparkster @@ -1,3 +1,93 @@ +Model "SparksterMag" +{ + Path "models" + + Model 0 "SparksterAmmo_d.3d" + Skin 0 "SparksterAmmo.png" + Scale 0.07 0.07 0.07 + ZOffset 1.6 + USEACTORPITCH + USEACTORROLL + + FrameIndex XZW1 A 0 0 +} + +Model "BiosparkArc" +{ + Path "models/extra" + + Model 0 "WarpBeam_d.3d" + Skin 0 "SparksterBeam.png" + Scale 0.0625 0.16 0.16 + Offset 8 0 0 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + FrameIndex XZW1 A 0 1 + FrameIndex XZW1 B 0 2 + FrameIndex XZW1 C 0 3 + FrameIndex XZW1 D 0 4 + FrameIndex XZW1 E 0 5 + FrameIndex XZW1 F 0 6 + FrameIndex XZW1 G 0 7 + FrameIndex XZW1 H 0 8 + FrameIndex XZW1 I 0 9 + FrameIndex XZW1 J 0 10 + FrameIndex XZW1 K 0 11 + FrameIndex XZW1 L 0 12 +} +Model "BiosparkArcSmall" +{ + Path "models/extra" + + Model 0 "WarpBeam_d.3d" + Skin 0 "SparksterBeam.png" + Scale 0.03125 0.08 0.08 + Offset 2 0 0 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + FrameIndex XZW1 A 0 1 + FrameIndex XZW1 B 0 2 + FrameIndex XZW1 C 0 3 + FrameIndex XZW1 D 0 4 + FrameIndex XZW1 E 0 5 + FrameIndex XZW1 F 0 6 + FrameIndex XZW1 G 0 7 + FrameIndex XZW1 H 0 8 + FrameIndex XZW1 I 0 9 + FrameIndex XZW1 J 0 10 + FrameIndex XZW1 K 0 11 + FrameIndex XZW1 L 0 12 +} +Model "BiosparkArcBig" +{ + Path "models/extra" + + Model 0 "WarpBeam_d.3d" + Skin 0 "SparksterBeam.png" + Scale 0.125 0.32 0.32 + Offset 16 0 0 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + FrameIndex XZW1 A 0 1 + FrameIndex XZW1 B 0 2 + FrameIndex XZW1 C 0 3 + FrameIndex XZW1 D 0 4 + FrameIndex XZW1 E 0 5 + FrameIndex XZW1 F 0 6 + FrameIndex XZW1 G 0 7 + FrameIndex XZW1 H 0 8 + FrameIndex XZW1 I 0 9 + FrameIndex XZW1 J 0 10 + FrameIndex XZW1 K 0 11 + FrameIndex XZW1 L 0 12 +} + Model "Sparkster" { Path "models" @@ -12,3 +102,115 @@ Model "Sparkster" FrameIndex XZW1 A 0 0 } + +Model "Sparkster" +{ + Path "models/extra" + + Model 2 "Flat_d.3d" + Scale 0.3 0.15 0.15 + Offset 15 -60 -25 + RollOffset 90 + AngleOffset 90 + + Skin 2 "SparksterMuz.png" + FrameIndex XZWZ A 2 0 +} + +Model "Sparkster" +{ + Path "models" + + Model 1 "Sparkster1st_d.3d" + SurfaceSkin 1 0 "DemoTags.png" + SurfaceSkin 1 1 "DemoArms.png" + SurfaceSkin 1 2 "DemoSoft.png" + SurfaceSkin 1 3 "Sparkster.png" + SurfaceSkin 1 4 "SparksterAmmo.png" + + AngleOffset -90 + Scale -0.005 0.0025 0.005 + + // Still / Deselect + FrameIndex XZW2 A 1 0 + FrameIndex XZW2 B 1 1 + FrameIndex XZW2 C 1 2 + FrameIndex XZW2 D 1 3 + FrameIndex XZW2 E 1 4 + FrameIndex XZW2 F 1 5 + FrameIndex XZW2 G 1 6 // Select + FrameIndex XZW2 H 1 7 + FrameIndex XZW2 I 1 8 + FrameIndex XZW2 J 1 9 + FrameIndex XZW2 K 1 10 + FrameIndex XZW2 L 1 11 + FrameIndex XZW2 M 1 12 + // Fire + FrameIndex XZW2 N 1 14 + FrameIndex XZW2 O 1 15 + FrameIndex XZW2 P 1 16 + FrameIndex XZW2 Q 1 17 + // AltFire + FrameIndex XZW2 R 1 19 + FrameIndex XZW2 S 1 20 + FrameIndex XZW2 T 1 21 + FrameIndex XZW2 U 1 22 + // ThirdFire + FrameIndex XZW2 V 1 24 + FrameIndex XZW2 W 1 25 + FrameIndex XZW2 X 1 26 + FrameIndex XZW2 Y 1 27 + FrameIndex XZW2 Z 1 28 + // Reload + FrameIndex XZW3 A 1 30 + FrameIndex XZW3 B 1 31 + FrameIndex XZW3 C 1 32 + FrameIndex XZW3 D 1 33 + FrameIndex XZW3 E 1 34 + FrameIndex XZW3 F 1 35 // MagOut + FrameIndex XZW3 G 1 36 + FrameIndex XZW3 H 1 37 + FrameIndex XZW3 I 1 38 + FrameIndex XZW3 J 1 39 + FrameIndex XZW3 K 1 40 + FrameIndex XZW3 L 1 41 + FrameIndex XZW3 M 1 42 + FrameIndex XZW3 N 1 43 + FrameIndex XZW3 O 1 44 + FrameIndex XZW3 P 1 45 + FrameIndex XZW3 Q 1 46 + FrameIndex XZW3 R 1 47 + FrameIndex XZW3 S 1 48 // MagIn + FrameIndex XZW3 T 1 49 + FrameIndex XZW3 U 1 50 + FrameIndex XZW3 V 1 51 + FrameIndex XZW3 W 1 52 + FrameIndex XZW3 X 1 53 + FrameIndex XZW3 Y 1 54 + FrameIndex XZW3 Z 1 55 + FrameIndex XZW4 A 1 56 + FrameIndex XZW4 B 1 57 + FrameIndex XZW4 C 1 58 + FrameIndex XZW4 D 1 59 + // Melee + FrameIndex XZW4 E 1 61 + FrameIndex XZW4 F 1 62 + FrameIndex XZW4 G 1 63 + FrameIndex XZW4 H 1 64 + FrameIndex XZW4 I 1 65 + FrameIndex XZW4 J 1 66 + FrameIndex XZW4 K 1 67 // Melee + FrameIndex XZW4 L 1 68 + FrameIndex XZW4 M 1 69 + FrameIndex XZW4 N 1 70 + FrameIndex XZW4 O 1 71 + FrameIndex XZW4 P 1 72 + FrameIndex XZW4 Q 1 73 + FrameIndex XZW4 R 1 74 + FrameIndex XZW4 S 1 75 + FrameIndex XZW4 T 1 76 + FrameIndex XZW4 U 1 77 + FrameIndex XZW4 V 1 78 + FrameIndex XZW4 W 1 79 + FrameIndex XZW4 X 1 80 +} diff --git a/modeldef.spreadgun b/modeldef.spreadgun index af796d69f..f5a084892 100644 --- a/modeldef.spreadgun +++ b/modeldef.spreadgun @@ -148,8 +148,8 @@ Model "TheBall" { Model 0 "models/extra/BaseSphere_d.3d" Skin 0 "models/leadmap.png" - Scale 0.008 0.008 0.008 - ZOffset 2 + Scale 0.003 0.003 0.003 + ZOffset 1 FrameIndex XZW1 A 0 0 } diff --git a/palettes/SparkArc.pal b/palettes/SparkArc.pal new file mode 100644 index 000000000..dba6a7df7 Binary files /dev/null and b/palettes/SparkArc.pal differ diff --git a/sndinfo.txt b/sndinfo.txt index 566b6c3cc..0fc15aac9 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -582,24 +582,89 @@ hellblazer/hitm1 sounds/hellblazer/blaze_hitm1.ogg hellblazer/hitm2 sounds/hellblazer/blaze_hitm2.ogg hellblazer/hitm3 sounds/hellblazer/blaze_hitm3.ogg $random hellblazer/hitm { hellblazer/hitm1 hellblazer/hitm2 hellblazer/hitm3 } +$limit hellblazer/hitm 32 hellblazer/hitc1 sounds/hellblazer/blaze_hitc1.ogg hellblazer/hitc2 sounds/hellblazer/blaze_hitc2.ogg hellblazer/hitc3 sounds/hellblazer/blaze_hitc3.ogg $random hellblazer/hitc { hellblazer/hitc1 hellblazer/hitc2 hellblazer/hitc3 } +$limit hellblazer/hitc 32 hellblazer/hitcs1 sounds/hellblazer/blaze_hitcs1.ogg hellblazer/hitcs2 sounds/hellblazer/blaze_hitcs2.ogg hellblazer/hitcs3 sounds/hellblazer/blaze_hitcs3.ogg $random hellblazer/hitcs { hellblazer/hitcs1 hellblazer/hitcs2 hellblazer/hitcs3 } +$limit hellblazer/hitcs 32 hellblazer/hitr1 sounds/hellblazer/blaze_hitr1.ogg hellblazer/hitr2 sounds/hellblazer/blaze_hitr2.ogg hellblazer/hitr3 sounds/hellblazer/blaze_hitr3.ogg $random hellblazer/hitr { hellblazer/hitr1 hellblazer/hitr2 hellblazer/hitr3 } +$limit hellblazer/hitr 32 hellblazer/hitw1 sounds/hellblazer/blaze_hitw1.ogg hellblazer/hitw2 sounds/hellblazer/blaze_hitw2.ogg $random hellblazer/hitw { hellblazer/hitw1 hellblazer/hitw2 } +$limit hellblazer/hitw 32 hellblazer/bounce sounds/hellblazer/blaze_bounce.ogg hellblazer/fly sounds/hellblazer/blaze_fly.ogg +biospark/select sounds/sparkster/spark_select.ogg +biospark/deselect sounds/sparkster/spark_deselect.ogg +biospark/fire1 sounds/sparkster/spark_fire1.ogg +biospark/fire2 sounds/sparkster/spark_fire2.ogg +biospark/fire3 sounds/sparkster/spark_fire3.ogg +$random biospark/fire { biospark/fire1 biospark/fire2 biospark/fire3 } +biospark/altfire1 sounds/sparkster/spark_altfire1.ogg +biospark/altfire2 sounds/sparkster/spark_altfire2.ogg +biospark/altfire3 sounds/sparkster/spark_altfire3.ogg +$random biospark/altfire { biospark/altfire1 biospark/altfire2 biospark/altfire3 } +biospark/thirdfire sounds/sparkster/spark_third.ogg +biospark/meleestart sounds/sparkster/spark_meleestart.ogg +biospark/meleeend sounds/sparkster/spark_meleeend.ogg +biospark/idle sounds/sparkster/spark_idle.ogg +biospark/magout sounds/sparkster/spark_magout.ogg +biospark/magin sounds/sparkster/spark_magin.ogg +biospark/spark sounds/sparkster/spark_spark.ogg +biospark/hit1 sounds/sparkster/spark_hit1.ogg +biospark/hit2 sounds/sparkster/spark_hit2.ogg +biospark/hit3 sounds/sparkster/spark_hit3.ogg +$random biospark/hit { biospark/hit1 biospark/hit2 biospark/hit3 } +$limit biospark/hit 32 +biospark/beamhit1 sounds/sparkster/spark_beamhit1.ogg +biospark/beamhit2 sounds/sparkster/spark_beamhit2.ogg +$random biospark/beamhit { biospark/beamhit1 biospark/beamhit2 } +$limit biospark/beamhit 32 +biospark/deploy1 sounds/sparkster/spark_deploy1.ogg +biospark/deploy2 sounds/sparkster/spark_deploy2.ogg +biospark/deploy3 sounds/sparkster/spark_deploy3.ogg +$random biospark/deploy { biospark/deploy1 biospark/deploy2 biospark/deploy3 } +$limit biospark/deploy 32 +biospark/bighit1 sounds/sparkster/spark_bigexpl1.ogg +biospark/bighit2 sounds/sparkster/spark_bigexpl2.ogg +$random biospark/bighit { biospark/bighit1 biospark/bighit2 } +$limit biospark/bighit 32 +biospark/bigspark sounds/sparkster/spark_bigspark.ogg +biospark/arc1 sounds/sparkster/spark_arc1.ogg +biospark/arc2 sounds/sparkster/spark_arc2.ogg +biospark/arc3 sounds/sparkster/spark_arc3.ogg +biospark/arc4 sounds/sparkster/spark_arc4.ogg +$random biospark/arc { biospark/arc1 biospark/arc2 biospark/arc3 biospark/arc4 } +$limit biospark/arc 64 +biospark/bigarc1 sounds/sparkster/spark_arcb1.ogg +biospark/bigarc2 sounds/sparkster/spark_arcb2.ogg +biospark/bigarc3 sounds/sparkster/spark_arcb3.ogg +biospark/bigarc4 sounds/sparkster/spark_arcb4.ogg +$random biospark/bigarc { biospark/bigarc1 biospark/bigarc2 biospark/bigarc3 biospark/bigarc4 } +$limit biospark/bigarc 64 +biospark/zap1 sounds/sparkster/spark_zap1.ogg +biospark/zap2 sounds/sparkster/spark_zap2.ogg +biospark/zap3 sounds/sparkster/spark_zap3.ogg +biospark/zap4 sounds/sparkster/spark_zap4.ogg +biospark/zap5 sounds/sparkster/spark_zap5.ogg +biospark/zap6 sounds/sparkster/spark_zap6.ogg +$random biospark/zap { biospark/zap1 biospark/zap2 biospark/zap3 biospark/zap4 biospark/zap5 biospark/zap6 } +$limit biospark/zap 64 +biospark/prefire sounds/sparkster/spark_prefire.ogg +biospark/prethird sounds/sparkster/spark_prethird.ogg +biospark/hiss sounds/sparkster/spark_hiss.ogg + candygun/fire1 sounds/candygun/candy_fire1.ogg candygun/fire2 sounds/candygun/candy_fire2.ogg candygun/fire3 sounds/candygun/candy_fire3.ogg diff --git a/sounds/sparkster/spark_altfire1.ogg b/sounds/sparkster/spark_altfire1.ogg new file mode 100644 index 000000000..93ab5e117 Binary files /dev/null and b/sounds/sparkster/spark_altfire1.ogg differ diff --git a/sounds/sparkster/spark_altfire2.ogg b/sounds/sparkster/spark_altfire2.ogg new file mode 100644 index 000000000..c75ad7b65 Binary files /dev/null and b/sounds/sparkster/spark_altfire2.ogg differ diff --git a/sounds/sparkster/spark_altfire3.ogg b/sounds/sparkster/spark_altfire3.ogg new file mode 100644 index 000000000..9836b2519 Binary files /dev/null and b/sounds/sparkster/spark_altfire3.ogg differ diff --git a/sounds/sparkster/spark_arc1.ogg b/sounds/sparkster/spark_arc1.ogg new file mode 100644 index 000000000..5108a4593 Binary files /dev/null and b/sounds/sparkster/spark_arc1.ogg differ diff --git a/sounds/sparkster/spark_arc2.ogg b/sounds/sparkster/spark_arc2.ogg new file mode 100644 index 000000000..cb6a660f9 Binary files /dev/null and b/sounds/sparkster/spark_arc2.ogg differ diff --git a/sounds/sparkster/spark_arc3.ogg b/sounds/sparkster/spark_arc3.ogg new file mode 100644 index 000000000..e46033959 Binary files /dev/null and b/sounds/sparkster/spark_arc3.ogg differ diff --git a/sounds/sparkster/spark_arc4.ogg b/sounds/sparkster/spark_arc4.ogg new file mode 100644 index 000000000..58ad0b9ab Binary files /dev/null and b/sounds/sparkster/spark_arc4.ogg differ diff --git a/sounds/sparkster/spark_arcb1.ogg b/sounds/sparkster/spark_arcb1.ogg new file mode 100644 index 000000000..b0243fc4b Binary files /dev/null and b/sounds/sparkster/spark_arcb1.ogg differ diff --git a/sounds/sparkster/spark_arcb2.ogg b/sounds/sparkster/spark_arcb2.ogg new file mode 100644 index 000000000..c35925ce7 Binary files /dev/null and b/sounds/sparkster/spark_arcb2.ogg differ diff --git a/sounds/sparkster/spark_arcb3.ogg b/sounds/sparkster/spark_arcb3.ogg new file mode 100644 index 000000000..d21e9d959 Binary files /dev/null and b/sounds/sparkster/spark_arcb3.ogg differ diff --git a/sounds/sparkster/spark_arcb4.ogg b/sounds/sparkster/spark_arcb4.ogg new file mode 100644 index 000000000..4f3d4b997 Binary files /dev/null and b/sounds/sparkster/spark_arcb4.ogg differ diff --git a/sounds/sparkster/spark_beamhit1.ogg b/sounds/sparkster/spark_beamhit1.ogg new file mode 100644 index 000000000..53d067cb6 Binary files /dev/null and b/sounds/sparkster/spark_beamhit1.ogg differ diff --git a/sounds/sparkster/spark_beamhit2.ogg b/sounds/sparkster/spark_beamhit2.ogg new file mode 100644 index 000000000..cee13e47e Binary files /dev/null and b/sounds/sparkster/spark_beamhit2.ogg differ diff --git a/sounds/sparkster/spark_bigexpl1.ogg b/sounds/sparkster/spark_bigexpl1.ogg new file mode 100644 index 000000000..90ed73613 Binary files /dev/null and b/sounds/sparkster/spark_bigexpl1.ogg differ diff --git a/sounds/sparkster/spark_bigexpl2.ogg b/sounds/sparkster/spark_bigexpl2.ogg new file mode 100644 index 000000000..c0e5582f8 Binary files /dev/null and b/sounds/sparkster/spark_bigexpl2.ogg differ diff --git a/sounds/sparkster/spark_bigspark.ogg b/sounds/sparkster/spark_bigspark.ogg new file mode 100644 index 000000000..7dc09305e Binary files /dev/null and b/sounds/sparkster/spark_bigspark.ogg differ diff --git a/sounds/sparkster/spark_deploy1.ogg b/sounds/sparkster/spark_deploy1.ogg new file mode 100644 index 000000000..081e17174 Binary files /dev/null and b/sounds/sparkster/spark_deploy1.ogg differ diff --git a/sounds/sparkster/spark_deploy2.ogg b/sounds/sparkster/spark_deploy2.ogg new file mode 100644 index 000000000..5ca0b39bb Binary files /dev/null and b/sounds/sparkster/spark_deploy2.ogg differ diff --git a/sounds/sparkster/spark_deploy3.ogg b/sounds/sparkster/spark_deploy3.ogg new file mode 100644 index 000000000..b7cc45c10 Binary files /dev/null and b/sounds/sparkster/spark_deploy3.ogg differ diff --git a/sounds/sparkster/spark_fire1.ogg b/sounds/sparkster/spark_fire1.ogg new file mode 100644 index 000000000..e64884fcc Binary files /dev/null and b/sounds/sparkster/spark_fire1.ogg differ diff --git a/sounds/sparkster/spark_fire2.ogg b/sounds/sparkster/spark_fire2.ogg new file mode 100644 index 000000000..8918f49b1 Binary files /dev/null and b/sounds/sparkster/spark_fire2.ogg differ diff --git a/sounds/sparkster/spark_fire3.ogg b/sounds/sparkster/spark_fire3.ogg new file mode 100644 index 000000000..0907c58bf Binary files /dev/null and b/sounds/sparkster/spark_fire3.ogg differ diff --git a/sounds/sparkster/spark_hiss.ogg b/sounds/sparkster/spark_hiss.ogg new file mode 100644 index 000000000..d506854d4 Binary files /dev/null and b/sounds/sparkster/spark_hiss.ogg differ diff --git a/sounds/sparkster/spark_hit1.ogg b/sounds/sparkster/spark_hit1.ogg new file mode 100644 index 000000000..4ffe029d0 Binary files /dev/null and b/sounds/sparkster/spark_hit1.ogg differ diff --git a/sounds/sparkster/spark_hit2.ogg b/sounds/sparkster/spark_hit2.ogg new file mode 100644 index 000000000..c5029ebb9 Binary files /dev/null and b/sounds/sparkster/spark_hit2.ogg differ diff --git a/sounds/sparkster/spark_hit3.ogg b/sounds/sparkster/spark_hit3.ogg new file mode 100644 index 000000000..9e8e84b25 Binary files /dev/null and b/sounds/sparkster/spark_hit3.ogg differ diff --git a/sounds/sparkster/spark_idle.ogg b/sounds/sparkster/spark_idle.ogg new file mode 100644 index 000000000..7661fe686 Binary files /dev/null and b/sounds/sparkster/spark_idle.ogg differ diff --git a/sounds/sparkster/spark_magin.ogg b/sounds/sparkster/spark_magin.ogg new file mode 100644 index 000000000..fb2c27117 Binary files /dev/null and b/sounds/sparkster/spark_magin.ogg differ diff --git a/sounds/sparkster/spark_magout.ogg b/sounds/sparkster/spark_magout.ogg new file mode 100644 index 000000000..a74fccc4f Binary files /dev/null and b/sounds/sparkster/spark_magout.ogg differ diff --git a/sounds/sparkster/spark_meleeend.ogg b/sounds/sparkster/spark_meleeend.ogg new file mode 100644 index 000000000..86695d106 Binary files /dev/null and b/sounds/sparkster/spark_meleeend.ogg differ diff --git a/sounds/sparkster/spark_meleestart.ogg b/sounds/sparkster/spark_meleestart.ogg new file mode 100644 index 000000000..488198fc2 Binary files /dev/null and b/sounds/sparkster/spark_meleestart.ogg differ diff --git a/sounds/sparkster/spark_prefire.ogg b/sounds/sparkster/spark_prefire.ogg new file mode 100644 index 000000000..627278ff1 Binary files /dev/null and b/sounds/sparkster/spark_prefire.ogg differ diff --git a/sounds/sparkster/spark_prethird.ogg b/sounds/sparkster/spark_prethird.ogg new file mode 100644 index 000000000..467369f10 Binary files /dev/null and b/sounds/sparkster/spark_prethird.ogg differ diff --git a/sounds/sparkster/spark_spark.ogg b/sounds/sparkster/spark_spark.ogg new file mode 100644 index 000000000..064c26c67 Binary files /dev/null and b/sounds/sparkster/spark_spark.ogg differ diff --git a/sounds/sparkster/spark_third.ogg b/sounds/sparkster/spark_third.ogg new file mode 100644 index 000000000..94d945535 Binary files /dev/null and b/sounds/sparkster/spark_third.ogg differ diff --git a/sounds/sparkster/spark_zap1.ogg b/sounds/sparkster/spark_zap1.ogg new file mode 100644 index 000000000..dc60a64ae Binary files /dev/null and b/sounds/sparkster/spark_zap1.ogg differ diff --git a/sounds/sparkster/spark_zap2.ogg b/sounds/sparkster/spark_zap2.ogg new file mode 100644 index 000000000..b3a5984e5 Binary files /dev/null and b/sounds/sparkster/spark_zap2.ogg differ diff --git a/sounds/sparkster/spark_zap3.ogg b/sounds/sparkster/spark_zap3.ogg new file mode 100644 index 000000000..a13977ab1 Binary files /dev/null and b/sounds/sparkster/spark_zap3.ogg differ diff --git a/sounds/sparkster/spark_zap4.ogg b/sounds/sparkster/spark_zap4.ogg new file mode 100644 index 000000000..75adc5d24 Binary files /dev/null and b/sounds/sparkster/spark_zap4.ogg differ diff --git a/sounds/sparkster/spark_zap5.ogg b/sounds/sparkster/spark_zap5.ogg new file mode 100644 index 000000000..9680ba4f8 Binary files /dev/null and b/sounds/sparkster/spark_zap5.ogg differ diff --git a/sounds/sparkster/spark_zap6.ogg b/sounds/sparkster/spark_zap6.ogg new file mode 100644 index 000000000..bb29fcd1a Binary files /dev/null and b/sounds/sparkster/spark_zap6.ogg differ diff --git a/zscript/swwm_blazeit.zsc b/zscript/swwm_blazeit.zsc index 7afff83c3..40b00a517 100644 --- a/zscript/swwm_blazeit.zsc +++ b/zscript/swwm_blazeit.zsc @@ -1280,7 +1280,7 @@ Class Hellblazer : SWWMWeapon xx = -55; for ( int i=0; i<6; i++ ) { - Screen.DrawTexture(LoadedIcon[0],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0)); + Screen.DrawTexture(LoadedIcon[0],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); xx += 9; } break; @@ -1288,7 +1288,7 @@ Class Hellblazer : SWWMWeapon xx = -50; for ( int i=0; i<3; i++ ) { - Screen.DrawTexture(LoadedIcon[1],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0)); + Screen.DrawTexture(LoadedIcon[1],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); xx += 18; } break; @@ -1296,7 +1296,7 @@ Class Hellblazer : SWWMWeapon xx = -50; for ( int i=0; i<3; i++ ) { - Screen.DrawTexture(LoadedIcon[2],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0)); + Screen.DrawTexture(LoadedIcon[2],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); xx += 18; } break; @@ -1304,7 +1304,7 @@ Class Hellblazer : SWWMWeapon xx = -46; for ( int i=0; i<2; i++ ) { - Screen.DrawTexture(LoadedIcon[3],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0)); + Screen.DrawTexture(LoadedIcon[3],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); xx += 27; } break; diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index d2532f4d3..a24030335 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -2059,7 +2059,7 @@ Class SWWMHandler : EventHandler s.mkill = multilevel[pnum]+1; lastkill[pnum] = level.maptime; // scoring - int score = min(2000,int(ceil(e.Thing.SpawnHealth()*.5)*10)); + int score = min(1000,int(ceil(e.Thing.SpawnHealth()*.25)*10)); int ofs = 0; if ( ((e.Thing.Health <= e.Thing.GetGibHealth()) || (e.DamageSource.bEXTREMEDEATH) || (e.Inflictor && e.Inflictor.bEXTREMEDEATH)) && !e.DamageSource.bNOEXTREMEDEATH && !(e.Inflictor && e.Inflictor.bNOEXTREMEDEATH) ) { @@ -2072,13 +2072,16 @@ Class SWWMHandler : EventHandler SWWMScoreObj.Spawn((multilevel[pnum]>=16)?int.max:(multilevel[pnum]+1),e.Thing.Vec3Offset(0,0,e.Thing.Height/2),Font.CR_FIRE,"$SWWM_MULTIKILL",++ofs); if ( !tookdamage[pnum] ) { - score += 100+50*spreecount[pnum]; + int spreebonus = 10*spreecount[pnum]; + // taper off after 10x (some people go really far with these, holy fuck) + if ( spreecount[pnum] > 10 ) spreebonus = int(spreebonus*((spreecount[pnum]/10.)**.25)); + score += 100+spreebonus; if ( (spreecount[pnum] > 0) && (e.DamageSource.player == players[consoleplayer]) ) SWWMScoreObj.Spawn(spreecount[pnum]+1,e.Thing.Vec3Offset(0,0,e.Thing.Height/2),Font.CR_FIRE,"$SWWM_SPREEKILL",++ofs); } if ( e.Thing.bBOSS ) { - score += 10000; + score += 5000; if ( e.DamageSource.player == players[consoleplayer] ) SWWMScoreObj.Spawn(0,e.Thing.Vec3Offset(0,0,e.Thing.Height/2),Font.CR_FIRE,"$SWWM_BOSSKILL",++ofs); } @@ -2088,8 +2091,8 @@ Class SWWMHandler : EventHandler if ( (level.killed_monsters+1 == level.total_monsters) && !allkills ) { allkills = true; - SWWMCredits.Give(e.DamageSource.player,5000); - Console.Printf(StringTable.Localize("$SWWM_LASTMONSTER"),e.DamageSource.player.GetUserName(),5000); + SWWMCredits.Give(e.DamageSource.player,2000); + Console.Printf(StringTable.Localize("$SWWM_LASTMONSTER"),e.DamageSource.player.GetUserName(),2000); } spreecount[pnum]++; if ( s && spreecount[pnum] > s.skill ) diff --git a/zscript/swwm_inventory.zsc b/zscript/swwm_inventory.zsc index 948d18fcd..41e4333a6 100644 --- a/zscript/swwm_inventory.zsc +++ b/zscript/swwm_inventory.zsc @@ -733,6 +733,51 @@ Class ParryField : Actor } } +Class UseList +{ + Line hitline; + int hitside; + Actor hitactor; + Vector3 pos; +} + +Class UseLineTracer : LineTracer +{ + Array uses; + + override ETraceStatus TraceCallback() + { + if ( Results.HitType == TRACE_HitActor ) + { + let u = new("UseList"); + u.hitline = null; + u.hitactor = Results.HitActor; + u.pos = Results.HitPos; + uses.Push(u); + return TRACE_Skip; + } + if ( Results.HitType == TRACE_HitWall ) + { + if ( Results.HitLine.Activation&(SPAC_Use|SPAC_UseThrough) ) + { + let u = new("UseList"); + u.hitline = Results.HitLine; + u.hitside = Results.Side; + u.hitactor = null; + u.pos = Results.HitPos; + uses.Push(u); + } + if ( Results.Tier == TIER_Middle ) + { + if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&(Line.ML_BlockHitscan|Line.ML_BlockEverything|Line.ML_BlockUse)) ) + return TRACE_Stop; + return TRACE_Skip; + } + } + return TRACE_Stop; + } +} + // Base class for all SWWM Weapons Class SWWMWeapon : Weapon abstract { @@ -855,7 +900,8 @@ Class SWWMWeapon : Weapon abstract invoker.bEXTREMEDEATH = false; invoker.bNOEXTREMEDEATH = true; } - d.HitActor.DaggerAlert(self); + if ( !d.HitActor.bDORMANT ) // lol oops + d.HitActor.DaggerAlert(self); int flg = DMG_USEANGLE|DMG_THRUSTLESS; if ( raging ) flg |= DMG_FOILINVUL; dmg = d.HitActor.DamageMobj(invoker,self,dmg,'Melee',flg,atan2(d.HitDir.y,d.HitDir.x)); @@ -896,12 +942,31 @@ Class SWWMWeapon : Weapon abstract return; } } + // check for usables + let ut = new("UseLineTracer"); + ut.uses.Clear(); + ut.Trace(Vec3Offset(0,0,player.viewheight),CurSector,(cos(angle)*cos(pitch),sin(angle)*cos(pitch),sin(-pitch)),DEFMELEERANGE,0); + if ( invoker.pfield ) invoker.pfield.bSHOOTABLE = true; + for ( int i=0; i 50. ) magvel = 50.; + Vector3 dir = vel.unit(); + dir = (dir+(FRandom[Sparkster](-1,1),FRandom[Sparkster](-1,1),FRandom[Sparkster](-1,1))*FRandom[Sparkster](.002,.003)).unit(); + // check targets at an interval, to save on performance + if ( !(GetAge()%5) ) + { + double closest = double.infinity; + let bt = BlockThingsIterator.Create(self,500); + while ( bt.Next() ) + { + let t = bt.Thing; + double dist; + if ( !t || !t.bSHOOTABLE || (!t.bISMONSTER && !(t is 'BossBrain')) || (t.Health <= 0) || t.IsFriend(target) || ((dist=Distance3D(t)) > 500) || !CheckSight(t,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; + Vector3 dirto = level.Vec3Diff(pos,t.Vec3Offset(0,0,t.height/2)).unit(); + if ( dir dot dirto < .5 ) continue; // don't seek stuff that's behind us + if ( dist > closest ) continue; + closest = dist; + tracer = t; + } + } + if ( tracer && (tracer.Health > 0) && CheckSight(tracer,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) + { + Vector3 dirto = level.Vec3Diff(pos,tracer.Vec3Offset(0,0,tracer.height/2)); + double dist = dirto.length(); + if ( dist > 4 ) + { + dirto /= dist; + dir = (dir+.1*dirto*(clamp(1.-(dist/500.),0.,1.)**3.)).unit(); + } + } + vel = magvel*dir; + angle = atan2(dir.y,dir.x); + pitch = asin(-dir.z); + if ( deto > 1 ) + { + ExplodeMissile(); + return; + } + // proximity check + let bt = BlockThingsIterator.Create(self,200); + while ( bt.Next() ) + { + let t = bt.Thing; + if ( !t || !t.bSHOOTABLE || (!t.bISMONSTER && !(t is 'BossBrain')) || (t.Health <= 0) || t.IsFriend(target) || !SWWMUtility.SphereIntersect(t,level.Vec3Offset(pos,vel),50) || !CheckSight(t,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; + deto++; + break; + } + } + void A_SparkExplode() + { + A_StopSound(CHAN_VOICE); + A_AlertMonsters(5000); + SWWMHandler.DoBlast(self,150,120000); + A_Explode(50,150); + A_QuakeEx(6,6,6,16,0,800,"",QF_RELATIVE|QF_SCALEDOWN,falloff:300,rollIntensity:.8); + A_StartSound("biospark/hit",CHAN_ITEM,attenuation:.8); + A_StartSound("biospark/hit",CHAN_WEAPON,attenuation:.6); + A_SprayDecal("ShockMark",172); + Scale *= FRandom[ExploS](0.8,1.1); + Scale.x *= RandomPick[ExploS](-1,1); + Scale.y *= RandomPick[ExploS](-1,1); + int numpt = Random[ExploS](16,32); + for ( int i=0; i 30 ) return; + double factor = (30-special1)/30.; + double invfct = 1.-factor; + SWWMHandler.DoBlast(self,300*invfct,-5000*factor); + A_Explode(int(30*factor),int(150*invfct)); + int numpt = int(Random[ExploS](16,32)*factor); + for ( int i=0; i 10 ) + { + dirto /= dist; + dir = (dir+.5*dirto*(clamp(1.-(dist/3000.),0.,1.)**1.5)).unit(); + } + } + else + { + double closest = double.infinity; + let bt = BlockThingsIterator.Create(self,1500); + while ( bt.Next() ) + { + let t = bt.Thing; + double dist; + if ( !t || !t.bSHOOTABLE || (!t.bISMONSTER && !(t is 'BossBrain')) || (t.Health <= 0) || t.IsFriend(target) || ((dist=Distance3D(t)) > 1500) || !CheckSight(t,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; + Vector3 dirto = level.Vec3Diff(invoker.nextpos,t.Vec3Offset(0,0,t.height/2)); + if ( dir dot dirto < .2 ) continue; + if ( dist > closest ) continue; + closest = dist; + tracer = t; + } + if ( tracer ) + { + Vector3 dirto = level.Vec3Diff(invoker.nextpos,tracer.Vec3Offset(0,0,tracer.height/2)); + double dist = dirto.length(); + if ( dist > 10 ) + { + dirto /= dist; + dir = (dir+.5*dirto*(clamp(1.-(dist/1500.),0.,1.)**3.)).unit(); + } + } + } + invoker.nextdir = dir; + } + action void A_Spread( Sound arcsnd = "", double attn = 1. ) + { + if ( special1 > ReactionTime ) return; + Vector3 tdir = level.Vec3Diff(pos,invoker.nextpos); + let b = Spawn(GetClass(),invoker.nextpos); + b.angle = atan2(invoker.nextdir.y,invoker.nextdir.x); + b.pitch = asin(-invoker.nextdir.z); + b.target = target; + b.master = master; + b.tracer = tracer; + b.special1 = special1+1; + b.special2 = special2; + if ( (arcsnd != "") && !((special1+special2)%3) && !Random[Sparkster](0,5) ) A_StartSound(arcsnd,CHAN_WEAPON,attenuation:attn); + if ( !((special1+special2)%8) && !Random[Sparkster](0,1) ) + { + let p = Spawn("SparkArcLight",level.Vec3Offset(pos,tdir/2)); + p.args[3] = int(speed*8); + } + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + frame = Random[Sparkster](0,11); + special2 = Random[Sparkster](-4,4); + } + Default + { + RenderStyle "Add"; + DamageFunction 5; + ReactionTime 20; + Speed 16; + Radius .1; + Height 0; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +INTERPOLATEANGLES; + +NOTELEPORT; + +FOILINVUL; + } + States + { + Spawn: + XZW1 # 1 Bright; + XZW1 # 1 Bright A_Trace(); + XZW1 # 1 Bright A_Spread("biospark/bigarc",.6); + XZW1 # 1 Bright A_FadeOut(.05); + Wait; + } +} + +Class BiosparkArcSmall : BiosparkArc +{ + Default + { + ReactionTime 15; + DamageFunction 2; + Speed 8; + } + States + { + Spawn: + XZW1 # 1 Bright; + XZW1 # 1 Bright A_Trace(); + XZW1 # 1 Bright A_Spread("biospark/arc",2.); + XZW1 # 1 Bright A_FadeOut(.1); + Wait; + } +} + +Class BiosparkArcBig : BiosparkArc +{ + Default + { + ReactionTime 40; + DamageFunction 20; + Speed 32; + } + States + { + Spawn: + XZW1 # 1 Bright; + XZW1 # 1 Bright A_Trace(); + XZW1 # 1 Bright A_Spread("biospark/zap",.4); + XZW1 # 1 Bright A_FadeOut(.025); + Wait; + } +} + +Class BiosparkSpark : Actor +{ + Default + { + RenderStyle "Add"; + Scale .8; + Radius .1; + Height 0; + +NOGRAVITY; + +NOBLOCKMAP; + +DONTSPLASH; + +ROLLSPRITE; + +ROLLCENTER; + +FORCEXYBILLBOARD; + } + States + { + Spawn: + SSPK A 1 Bright + { + A_SetScale(scale.x*specialf1); + A_FadeOut(specialf2); + } + Wait; + } +} + +Class BiosparkCore : Actor +{ +} + +Class SparksterMag : SWWMCasing +{ + Default + { + Mass 10; + BounceFactor 0.4; + WallBounceFactor 0.4; + BounceSound "explodium/mag"; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + heat = 0; + } + States + { + Death: + #### # -1 + { + pitch = 0; + angle = FRandom[Junk](0,360); + roll = 0; + } + Stop; + } +} + Class Sparkster : SWWMWeapon { int clipcount; Property ClipCount : clipcount; + transient ui TextureID WeaponBox, AmmoBar[3]; + transient ui Font TewiFont; + transient ui DynamicValueInterpolator iclip; + + override void DrawWeapon( double TicFrac, double bx, double by, Vector2 hs, Vector2 ss ) + { + if ( !TewiFont ) TewiFont = Font.GetFont('TewiShaded'); + if ( !WeaponBox ) + { + WeaponBox = TexMan.CheckForTexture("graphics/HUD/BiosparkDisplay.png",TexMan.Type_Any); + AmmoBar[0] = TexMan.CheckForTexture("graphics/HUD/BiosparkBar.png",TexMan.Type_Any); + AmmoBar[1] = TexMan.CheckForTexture("graphics/HUD/BiosparkBarRed.png",TexMan.Type_Any); + AmmoBar[2] = TexMan.CheckForTexture("graphics/HUD/BiosparkBarGray.png",TexMan.Type_Any); + } + Screen.DrawTexture(WeaponBox,false,bx-29,by-29,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + Screen.DrawText(TewiFont,Font.CR_FIRE,bx-27,by-27,String.Format("%2d",Ammo1.Amount),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + Screen.DrawTexture(AmmoBar[2],false,bx-27,by-9,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + Screen.DrawTexture(AmmoBar[clipcount<4],false,bx-27,by-9,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_WindowRight,iclip?(iclip.GetValue()/10):0); + } + + override void HudTick() + { + if ( !iclip ) iclip = DynamicValueInterpolator.Create(clipcount*30,.25,1,10); + else iclip.Update(clipcount*30); + } + + override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount ) + { + if ( sv_infiniteammo || Owner.FindInventory('PowerInfiniteAmmo',true) ) return true; + if ( (fireMode == PrimaryFire) || (fireMode == AltFire) ) return ((clipcount > 0) || (Ammo1.Amount > 0)); + return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount); + } + + override bool ReportHUDAmmo() + { + if ( clipcount > 0 ) return true; + return Super.ReportHUDAmmo(); + } + + action void A_FireSpark( int mode ) + { + if ( mode == 2 ) invoker.clipcount = 0; + else invoker.clipcount = max(0,invoker.clipcount-1); + Vector3 x, y, z, x2, y2, z2, dir; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+5*y-5*z); + double a, s; + Actor p; + switch ( mode ) + { + case 0: + // spark + A_StartSound("biospark/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.7); + A_QuakeEx(2,2,2,5,0,8,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.2); + A_ZoomFactor(.96,ZOOM_INSTANT); + A_ZoomFactor(1.); + A_SWWMFlash(); + SWWMHandler.DoFlash(self,Color(64,192,255,96),3); + A_AlertMonsters(5000); + a = FRandom[Spread](0,360); + s = FRandom[Spread](0,.007); + [x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll); + dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); + p = Spawn("BiosparkBall",origin); + p.target = self; + p.angle = atan2(dir.y,dir.x); + p.pitch = asin(-dir.z); + p.vel = dir*p.speed; + break; + case 1: + // beam + A_StartSound("biospark/altfire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.8); + A_QuakeEx(3,3,3,5,0,8,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.3); + A_ZoomFactor(.95,ZOOM_INSTANT); + A_ZoomFactor(1.); + A_SWWMFlash(); + SWWMHandler.DoFlash(self,Color(64,192,255,96),3); + A_AlertMonsters(4000); + a = FRandom[Spread](0,360); + s = FRandom[Spread](0,.003); + [x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll); + dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); + p = Spawn("BiosparkBeam",origin); + p.target = self; + p.angle = atan2(dir.y,dir.x); + p.pitch = asin(-dir.z); + p.vel = dir*p.speed; + break; + case 2: + // big spark + A_StartSound("biospark/thirdfire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:1.5); + A_QuakeEx(5,5,5,10,0,8,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.6); + A_ZoomFactor(.94,ZOOM_INSTANT); + A_ZoomFactor(1.); + A_AlertMonsters(1200); + A_Recoil(.6); + a = FRandom[Spread](0,360); + s = FRandom[Spread](0,.012); + [x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll); + dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); + p = Spawn("BiosparkCore",origin); + p.target = self; + p.angle = atan2(dir.y,dir.x); + p.pitch = asin(-dir.z); + p.vel = dir*p.speed; + p.vel.z += 3.5; + break; + } + } + + action void A_DropMag() + { + Vector3 x, y, z; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x-2*y-10*z); + let c = Spawn("SparksterMag",origin); + c.angle = angle; + c.pitch = pitch; + c.vel = x*FRandom[Junk](-.5,.5)+y*FRandom[Junk](-1.2,.3)-(0,0,FRandom[Junk](2,3)); + c.vel += vel*.5; + } + + override void Travelled() + { + Super.Travelled(); + if ( Owner.player && (Owner.player.Readyweapon == self) ) + Owner.A_StartSound("biospark/idle",CHAN_WEAPONEXTRA,CHANF_LOOPING,.4,4.); + } + Default { Tag "$T_SPARKSTER"; Inventory.PickupMessage "$I_SPARKSTER"; Obituary "$O_SPARKSTER"; Weapon.SlotNumber 7; + Weapon.UpSound "biospark/select"; Weapon.SelectionOrder 1600; Stamina 150000; Weapon.AmmoType1 "SparkUnit"; @@ -25,5 +640,98 @@ Class Sparkster : SWWMWeapon Spawn: XZW1 A -1; Stop; + Select: + XZW2 G 2 + { + A_FullRaise(); + A_StartSound("biospark/idle",CHAN_WEAPONEXTRA,CHANF_LOOPING,.4,4.); + } + XZW2 HIJKLM 2; + Goto Ready; + Deselect: + XZW2 A 2 A_StartSound("biospark/deselect",CHAN_WEAPON,CHANF_OVERLAP); + XZW2 BCDEFG 2; + XZW2 G -1 + { + A_StopSound(CHAN_WEAPONEXTRA); + A_FullLower(); + } + Stop; + Ready: + XZW2 A 1 + { + int flg = WRF_ALLOWUSER1|WRF_NOSECONDARY; // temp while the two other fire modes are unimplemented + //int flg = WRF_ALLOWZOOM|WRF_ALLOWUSER1; + if ( (invoker.ClipCount < invoker.default.ClipCount) && (invoker.Ammo1.Amount > 0) ) flg |= WRF_ALLOWRELOAD; + A_WeaponReady(flg); + if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK|BT_ZOOM) ) + invoker.CheckAmmo(EitherFire,true); + } + Wait; + Fire: + XZW2 A 0 A_JumpIf(invoker.ClipCount<=0,"Reload"); + XZW2 A 12 A_StartSound("biospark/prefire",CHAN_WEAPON,CHANF_OVERLAP); + XZW2 A 1 A_FireSpark(0); + XZW2 NOPQ 2; + Goto Ready; + AltFire: + XZW2 A 0 A_JumpIf(invoker.ClipCount<=0,"Reload"); + XZW2 A 12 A_StartSound("biospark/prefire",CHAN_WEAPON,CHANF_OVERLAP); + XZW2 A 1 A_FireSpark(1); + XZW2 RSTU 2; + Goto Ready; + Zoom: + XZW2 A 0 A_JumpIf(invoker.ClipCount<4,"Reload"); + XZW2 A 12 A_StartSound("biospark/prethird",CHAN_WEAPON,CHANF_OVERLAP); + XZW2 A 1 A_FireSpark(2); + XZW2 VWXYZ 2; + Goto Ready; + Reload: + XZW2 A 2 A_StartSound("biospark/meleestart",CHAN_WEAPON,CHANF_OVERLAP); + XZW3 ABCDE 2; + XZW3 F 2 + { + invoker.clipcount = 0; + A_StartSound("biospark/magout",CHAN_WEAPON,CHANF_OVERLAP); + } + XZW3 GHIJKL 2; + XZW3 M 2 A_DropMag(); + XZW3 NOPQR 2; + XZW3 S 2 + { + if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1); + invoker.clipcount = invoker.default.clipcount; + A_StartSound("biospark/magin",CHAN_WEAPON,CHANF_OVERLAP); + } + XZW3 UVW 2; + XZW3 X 2 A_StartSound("biospark/meleeend",CHAN_WEAPON,CHANF_OVERLAP); + XZW3 YZ 2; + XZW4 ABCD 2; + Goto Ready; + User1: + XZW2 A 2 + { + A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); + A_StartSound("biospark/meleestart",CHAN_WEAPON,CHANF_OVERLAP); + } + XZW4 EFG 2; + XZW4 H 1 A_Parry(9); + XZW4 IJ 1; + XZW4 K 2 A_Melee(60); + XZW4 LMNOPQ 2; + XZW4 R 2 A_StartSound("biospark/meleeend",CHAN_WEAPON,CHANF_OVERLAP); + XZW4 STUVWX 2; + Goto Ready; + Flash: + XZWZ A 2 Bright + { + let l = Spawn("SWWMWeaponLight",pos); + l.args[0] = 192; + l.args[1] = 255; + l.args[2] = 96; + l.target = self; + } + Stop; } } diff --git a/zscript/swwm_splode.zsc b/zscript/swwm_splode.zsc index b8a024adf..fa01bce0c 100644 --- a/zscript/swwm_splode.zsc +++ b/zscript/swwm_splode.zsc @@ -134,7 +134,7 @@ Class ExplodiumMagProj : Actor bNOGRAVITY = true; A_SetRenderStyle(1.,STYLE_Add); Scale *= 2.+.2*special1; - A_AlertMonsters(); + A_AlertMonsters(6000); SWWMHandler.DoBlast(self,120+30*special1,80000+8000*special1); A_Explode(20+15*special1,120+30*special1); A_QuakeEx(9,9,9,30,0,400+80*special1,"",QF_RELATIVE|QF_SCALEDOWN,falloff:300,rollintensity:2.); @@ -227,7 +227,7 @@ Class ExplodiumBulletImpact : Actor override void PostBeginPlay() { Super.PostBeginPlay(); - A_AlertMonsters(); + A_AlertMonsters(3000); SWWMHandler.DoBlast(self,120,80000); A_Explode(25,120); A_QuakeEx(4,4,4,10,0,250,"",QF_RELATIVE|QF_SCALEDOWN,falloff:150,rollintensity:0.2); @@ -302,7 +302,7 @@ Class ExplodiumGun : SWWMWeapon A_ZoomFactor(1.); A_SWWMFlash(); SWWMHandler.DoFlash(self,Color(64,255,224,64),3); - A_AlertMonsters(); + A_AlertMonsters(5000); A_Recoil(1.2); Vector3 x, y, z, x2, y2, z2; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);