Some more progress here:

- Added all armor and health items.
 - Added Grilled Cheese Sandwich and Ghost Artifact.
 - Started work on Chanceboxes, just need to finish adding the drop lists.
 - Fixed Ammo division.
 - Reduced backpack amounts of some ammo types.
 - Added inventory box/bar to HUD, plus armor and powerup display.
 - Fix jumps still alerting monsters even if not boosting.
 - Added "future plans" document.
This commit is contained in:
Mari the Deer 2020-02-03 22:16:06 +01:00
commit 0fa6207cb6
41 changed files with 2031 additions and 52 deletions

25
FuturePlans.md Normal file
View file

@ -0,0 +1,25 @@
This is just a bit of "future planning" for stuff that I *might* add
after the first release.
* DLC Weapon Set:
- Itamex Reinforced Hammer (UnSX 5)
- Gravity Gun (Ultra Suite)
- Splatter (SWWM)
- Skull Launcher (Weirdweapons)
- Blackfire Igniter (UnSX 5, Ultra Suite 3)
- Puntzer Gamma (Ultra Suite 2)
- Rail Carbine ("Tesla Beamer" in Ultra Suite 2 & 3)
- PROWEL & TADEL (Ultra Suite 2 & 3)
- Super Happy Fun Ball (SWWM Z)
* Additional Demolitionist Menu features
- Per-monster kill tracker in stats tab
- Music player with a selection of Saya's favourite tracks
- Pong minigame
* Additional HUD stuff
- Minimap with radar like in SWWM Z
* Character and item images for the library
* Full Mashiro model for Lämp easter egg
* Option to hear other players' voice lines
* Localization
- Spanish
- Japanese???

View file

@ -129,7 +129,7 @@ re-added to their respective ammo type pool.
The Spreadgun uses 10 gauge ammunition (like the Quadshot).
### 10Ga shells, replaces Clip / Shells, Wand Crystal / Ethereal Arrows, Flechette, Chaos Device
### 10Ga shells, replaces Clip / Shells, Wand Crystal / Ethereal Arrows, Flechette, Chaos Device/Banishment Device
Available in the following types, with varying chances of appearing depending
on replaced item, may also come in bundles:
@ -151,8 +151,8 @@ on replaced item, may also come in bundles:
designed by someone completely insane, and definitely guaranteed to not
fail catastrophically and blow up your gun, your hands, your arms, and the
rest of your upper body. Unlike the others, this one is only available as a
rare drop from boss monsters, and as a rare spawn for chaos devices in
Heretic and Hexen.
rare drop from boss monsters, and as a rare spawn for chaos/banishment
devices in Heretic and Hexen.
The two first standard types will also pop up in Hammerspace Embiggeners and
Ammo Fabricators.
@ -349,7 +349,7 @@ have a spare. Most powerups can be toggled, unless specified otherwise.
Health nuggets increase health by 5% up to a cap of 200.
### Health Tetrahedron, replaces Stimpak, Crystal Vial (Heretic)
### Health Tetrahedron, replaces Stimpak, Quartz Flask
Health tetrahedrons provide a 15% health boost up to a cap of 100.
@ -373,14 +373,14 @@ The upper cap for these is 200%.
Protection decreases by a 10% of absorbed damage.
### Blast Suit, replaces Green Armor, Silver Shield, Platinum Helm, Mesh Armor
### Blast Suit, replaces Green Armor, Silver Shield, Mesh Armor
The blast suit is a nice little light armor which provides a 75% reduction to
damage and an additional 50% to splash damage.
Can handle a total of 500 damage before breaking.
### War Armor, replaces Blue Armor, Enchanged Shield, Falcon Shield
### War Armor, replaces Blue Armor, Enchanted Shield, Falcon Shield
Decent armor, protects very well against all damage. Reduction factors are as
follows:
@ -390,7 +390,7 @@ follows:
The armor can eat up a total of 1000 damage before breaking.
### Grilled Cheese Sandwich, replaces Megasphere, Morph Ovum, Banishment Device
### Grilled Cheese Sandwich, replaces Megasphere, Morph Ovum, Platinum Helm
The ultimate meal. Grants a full 1000 health and magically gives you a full
stack of armor nuggets, a blast suit and a war armor. In addition it prevents

53
gldefs.chancebox Normal file
View file

@ -0,0 +1,53 @@
HardwareShader Texture "models/Chancebox.png"
{
Shader "shaders/glsl/Shinemask_bright.fp"
Texture "masktex" "models/Chancebox_mask.png"
Texture "envtex" "models/silvermap.png"
Texture "brighttex" "models/Chancebox_bright.png"
}
HardwareShader Texture "models/Chancebox_Tier2.png"
{
Shader "shaders/glsl/Shinemask_bright.fp"
Texture "masktex" "models/Chancebox_mask.png"
Texture "envtex" "models/silvermap.png"
Texture "brighttex" "models/Chancebox_bright.png"
}
HardwareShader Texture "models/Chancebox_Tier3.png"
{
Shader "shaders/glsl/Shinemask_bright.fp"
Texture "masktex" "models/Chancebox_mask.png"
Texture "envtex" "models/silvermap.png"
Texture "brighttex" "models/Chancebox_bright.png"
}
HardwareShader Texture "models/Chancebox_Tier4.png"
{
Shader "shaders/glsl/Shinemask_bright.fp"
Texture "masktex" "models/Chancebox_mask.png"
Texture "envtex" "models/goldmap.png"
Texture "brighttex" "models/Chancebox_bright.png"
}
PointLight CHANCELIGHT
{
Color 1.0 0.7 0.2
Size 50
Offset 0 16 0
Attenuate 1
}
Object DroppedChanceboxTier1
{
Frame "XZW2" { light "CHANCELIGHT" }
}
Object DroppedChanceboxTier2
{
Frame "XZW2" { light "CHANCELIGHT" }
}
Object DroppedChanceboxTier3
{
Frame "XZW2" { light "CHANCELIGHT" }
}
Object DroppedChanceboxTier4
{
Frame "XZW2" { light "CHANCELIGHT" }
}

102
gldefs.pickups Normal file
View file

@ -0,0 +1,102 @@
HardwareShader Texture "models/Nugget_Armor.png"
{
Shader "shaders/glsl/Shinemask_bright.fp"
Texture "masktex" "models/Nugget_mask.png"
Texture "envtex" "models/greenmap.png"
Texture "brighttex" "models/Nugget_mask.png"
}
HardwareShader Texture "models/Nugget.png"
{
Shader "shaders/glsl/Shinemask_bright.fp"
Texture "masktex" "models/Nugget_mask.png"
Texture "envtex" "models/blumap.png"
Texture "brighttex" "models/Nugget_mask.png"
}
HardwareShader Texture "models/TetraHealth.png"
{
Shader "shaders/glsl/Shinemask_bright.fp"
Texture "masktex" "models/TetraHealth_mask.png"
Texture "envtex" "models/blumap.png"
Texture "brighttex" "models/TetraHealth_mask.png"
}
HardwareShader Texture "models/CubeHealth.png"
{
Shader "shaders/glsl/Shinemask_bright.fp"
Texture "masktex" "models/CubeHealth_mask.png"
Texture "envtex" "models/blumap.png"
Texture "brighttex" "models/CubeHealth_mask.png"
}
HardwareShader Texture "models/Refresher.png"
{
Shader "shaders/glsl/Shinemask_bright.fp"
Texture "masktex" "models/Refresher_mask.png"
Texture "envtex" "models/purpmap.png"
Texture "brighttex" "models/Refresher_mask.png"
}
Brightmap Texture "models/GhostArtifact.png"
{
Map "models/GhostArtifact_bright.png"
}
PointLight ARMORNUGGETLIGHT
{
Color 0.4 0.7 0.2
Size 12
Offset 0 16 0
Attenuate 1
}
Object ArmorNuggetItem
{
Frame "XZW1" { light "ARMORNUGGETLIGHT" }
}
PointLight HEALTHNUGGETLIGHT
{
Color 0.1 0.3 0.7
Size 12
Offset 0 16 0
Attenuate 1
}
Object HealthNuggetItem
{
Frame "XZW1" { light "HEALTHNUGGETLIGHT" }
}
PointLight GEOMHEALTHLIGHT
{
Color 0.2 0.4 1.0
Size 30
Offset 0 16 0
Attenuate 1
}
Object TetraHealthItem
{
Frame "XZW1" { light "GEOMHEALTHLIGHT" }
}
Object CubeHealthItem
{
Frame "XZW1" { light "GEOMHEALTHLIGHT" }
}
PointLight REFRESHERLIGHT
{
Color 0.7 0.2 1.0
Size 40
Offset 0 16 0
Attenuate 1
}
Object RefresherItem
{
Frame "XZW1" { light "REFRESHERLIGHT" }
}
PointLight GHOSTARTILIGHT
{
Color 0.8 0.6 1.0
Size 40
Offset 0 16 0
Attenuate 1
}
Object GhostArtifact
{
Frame "XZW1" { light "GHOSTARTILIGHT" }
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 B

After

Width:  |  Height:  |  Size: 115 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

After

Width:  |  Height:  |  Size: 146 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 824 B

After

Width:  |  Height:  |  Size: 126 B

Before After
Before After

View file

@ -160,7 +160,7 @@ SWWM_LORETXT_BLASTSUIT =
" - 75% reduction to all types of damage.\n"
" - Additional 50% reduction to explosions.\n"
"\n"
"Durability: Can absorb a total of 5,000 units of damage before breaking.\n"
"Durability: Can absorb a total of 500 units of damage before breaking.\n"
"\n"
"Addendum: The blast suit can be worn under other armor.";
SWWM_LORETAG_COLLAR = "Lucky Collar";
@ -518,11 +518,11 @@ SWWM_LORETXT_WARARMOR =
"Summary: Very robust, durable plate armor. Made of the finest almasteel in Devanikna. Originally commissioned for the third entry in Zanaveth's Instant Action arena events.\n"
"\n"
"Protection:\n"
" - 90% reduction to heat, cold and electricity.\n"
" - 90% reduction to heat, cold, electricity, slime and other elemental types.\n"
" - 80% reduction to all other types of damage.\n"
" - Additional 70% reduction to explosions.\n"
"\n"
"Durability: Can absorb a total of 10,000 units of damage before breaking.\n"
"Durability: Can absorb a total of 1000 units of damage before breaking.\n"
"\n"
"Addendum: Worn over a blast suit, you're pretty much ready for anything that could be thrown at you.";
SWWM_LORETAG_BIGSHOT = "Mr. BIG SHOT";

321
modeldef.chancebox Normal file
View file

@ -0,0 +1,321 @@
Model "FancyConfetti"
{
Model 0 "models/extra/Flat_d.3d"
Scale 0.003 0.003 0.003
ZOffset 1
USEACTORPITCH
USEACTORROLL
Skin 0 "models/goldmap.png"
FrameIndex XZW1 A 0 0
Skin 0 "models/blumap.png"
FrameIndex XZW1 B 0 0
Skin 0 "models/darkmap.png"
FrameIndex XZW1 C 0 0
Skin 0 "models/greenmap.png"
FrameIndex XZW1 D 0 0
Skin 0 "models/invincimap.png"
FrameIndex XZW1 E 0 0
Skin 0 "models/pinkmap.png"
FrameIndex XZW1 F 0 0
Skin 0 "models/purpmap.png"
FrameIndex XZW1 G 0 0
Skin 0 "models/ragemap.png"
FrameIndex XZW1 H 0 0
Skin 0 "models/redmap.png"
FrameIndex XZW1 I 0 0
Skin 0 "models/silvermap.png"
FrameIndex XZW1 J 0 0
}
Model "ChanceboxTier1"
{
Path "models"
Model 0 "Chancebox_d.3d"
Skin 0 "Chancebox.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 24
ROTATING
FrameIndex XZW1 A 0 0
}
Model "ChanceboxTier2"
{
Path "models"
Model 0 "Chancebox_d.3d"
Skin 0 "Chancebox_Tier2.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 24
ROTATING
FrameIndex XZW1 A 0 0
}
Model "ChanceboxTier3"
{
Path "models"
Model 0 "Chancebox_d.3d"
Skin 0 "Chancebox_Tier3.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 24
ROTATING
FrameIndex XZW1 A 0 0
}
Model "ChanceboxTier4"
{
Path "models"
Model 0 "Chancebox_d.3d"
Skin 0 "Chancebox_Tier4.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 24
ROTATING
FrameIndex XZW1 A 0 0
}
Model "ChanceTopTier1"
{
Path "models"
Model 0 "Chancebox_Top_d.3d"
Skin 0 "Chancebox.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 4
FrameIndex XZW1 A 0 0
}
Model "ChanceTopTier2"
{
Path "models"
Model 0 "Chancebox_Top_d.3d"
Skin 0 "Chancebox.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 4
FrameIndex XZW1 A 0 0
}
Model "ChanceTopTier3"
{
Path "models"
Model 0 "Chancebox_Top_d.3d"
Skin 0 "Chancebox_Tier3.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 4
FrameIndex XZW1 A 0 0
}
Model "ChanceTopTier4"
{
Path "models"
Model 0 "Chancebox_Top_d.3d"
Skin 0 "Chancebox_Tier4.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 4
FrameIndex XZW1 A 0 0
}
Model "ChanceSideTier1"
{
Path "models"
Model 0 "Chancebox_Side_d.3d"
Skin 0 "Chancebox.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 16
FrameIndex XZW1 A 0 0
}
Model "ChanceSideTier2"
{
Path "models"
Model 0 "Chancebox_Side_d.3d"
Skin 0 "Chancebox.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 16
FrameIndex XZW1 A 0 0
}
Model "ChanceSideTier3"
{
Path "models"
Model 0 "Chancebox_Side_d.3d"
Skin 0 "Chancebox_Tier3.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 16
FrameIndex XZW1 A 0 0
}
Model "ChanceSideTier4"
{
Path "models"
Model 0 "Chancebox_Side_d.3d"
Skin 0 "Chancebox_Tier4.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 16
FrameIndex XZW1 A 0 0
}
Model "DroppedChanceboxTier1"
{
Path "models"
Model 0 "Chancebox_d.3d"
Skin 0 "Chancebox.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 16
USEACTORPITCH
USEACTORROLL
FrameIndex XZW1 A 0 0
// shake
FrameIndex XZW1 B 0 1
FrameIndex XZW1 C 0 2
FrameIndex XZW1 D 0 3
FrameIndex XZW1 E 0 4
FrameIndex XZW1 F 0 5
FrameIndex XZW1 G 0 6
// deploy
FrameIndex XZW2 A 0 8
FrameIndex XZW2 B 0 9
FrameIndex XZW2 C 0 10
FrameIndex XZW2 D 0 11
FrameIndex XZW2 E 0 12
FrameIndex XZW2 F 0 13
FrameIndex XZW2 G 0 14
FrameIndex XZW2 H 0 15
FrameIndex XZW2 I 0 16
FrameIndex XZW2 J 0 17
FrameIndex XZW2 K 0 18
FrameIndex XZW2 L 0 19
FrameIndex XZW2 M 0 20
FrameIndex XZW2 N 0 21
FrameIndex XZW2 O 0 22
FrameIndex XZW2 P 0 23
FrameIndex XZW2 Q 0 24
}
Model "DroppedChanceboxTier2"
{
Path "models"
Model 0 "Chancebox_d.3d"
Skin 0 "Chancebox_Tier2.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 16
USEACTORPITCH
USEACTORROLL
FrameIndex XZW1 A 0 0
// shake
FrameIndex XZW1 B 0 1
FrameIndex XZW1 C 0 2
FrameIndex XZW1 D 0 3
FrameIndex XZW1 E 0 4
FrameIndex XZW1 F 0 5
FrameIndex XZW1 G 0 6
// deploy
FrameIndex XZW2 A 0 8
FrameIndex XZW2 B 0 9
FrameIndex XZW2 C 0 10
FrameIndex XZW2 D 0 11
FrameIndex XZW2 E 0 12
FrameIndex XZW2 F 0 13
FrameIndex XZW2 G 0 14
FrameIndex XZW2 H 0 15
FrameIndex XZW2 I 0 16
FrameIndex XZW2 J 0 17
FrameIndex XZW2 K 0 18
FrameIndex XZW2 L 0 19
FrameIndex XZW2 M 0 20
FrameIndex XZW2 N 0 21
FrameIndex XZW2 O 0 22
FrameIndex XZW2 P 0 23
FrameIndex XZW2 Q 0 24
}
Model "DroppedChanceboxTier3"
{
Path "models"
Model 0 "Chancebox_d.3d"
Skin 0 "Chancebox_Tier3.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 16
USEACTORPITCH
USEACTORROLL
FrameIndex XZW1 A 0 0
// shake
FrameIndex XZW1 B 0 1
FrameIndex XZW1 C 0 2
FrameIndex XZW1 D 0 3
FrameIndex XZW1 E 0 4
FrameIndex XZW1 F 0 5
FrameIndex XZW1 G 0 6
// deploy
FrameIndex XZW2 A 0 8
FrameIndex XZW2 B 0 9
FrameIndex XZW2 C 0 10
FrameIndex XZW2 D 0 11
FrameIndex XZW2 E 0 12
FrameIndex XZW2 F 0 13
FrameIndex XZW2 G 0 14
FrameIndex XZW2 H 0 15
FrameIndex XZW2 I 0 16
FrameIndex XZW2 J 0 17
FrameIndex XZW2 K 0 18
FrameIndex XZW2 L 0 19
FrameIndex XZW2 M 0 20
FrameIndex XZW2 N 0 21
FrameIndex XZW2 O 0 22
FrameIndex XZW2 P 0 23
FrameIndex XZW2 Q 0 24
}
Model "DroppedChanceboxTier4"
{
Path "models"
Model 0 "Chancebox_d.3d"
Skin 0 "Chancebox_Tier4.png"
Scale 0.25 0.25 0.25
AngleOffset -90
ZOffset 16
USEACTORPITCH
USEACTORROLL
FrameIndex XZW1 A 0 0
// shake
FrameIndex XZW1 B 0 1
FrameIndex XZW1 C 0 2
FrameIndex XZW1 D 0 3
FrameIndex XZW1 E 0 4
FrameIndex XZW1 F 0 5
FrameIndex XZW1 G 0 6
// deploy
FrameIndex XZW2 A 0 8
FrameIndex XZW2 B 0 9
FrameIndex XZW2 C 0 10
FrameIndex XZW2 D 0 11
FrameIndex XZW2 E 0 12
FrameIndex XZW2 F 0 13
FrameIndex XZW2 G 0 14
FrameIndex XZW2 H 0 15
FrameIndex XZW2 I 0 16
FrameIndex XZW2 J 0 17
FrameIndex XZW2 K 0 18
FrameIndex XZW2 L 0 19
FrameIndex XZW2 M 0 20
FrameIndex XZW2 N 0 21
FrameIndex XZW2 O 0 22
FrameIndex XZW2 P 0 23
FrameIndex XZW2 Q 0 24
}

View file

@ -1 +1,134 @@
Model "ArmorNuggetItem"
{
Path "models"
Model 0 "Nugget_d.3d"
Skin 0 "Nugget_Armor.png"
Scale 0.03 0.03 0.03
ZOffset 16
ROTATING
FrameIndex XZW1 A 0 0
FrameIndex XZW1 B 0 1
FrameIndex XZW1 C 0 2
FrameIndex XZW1 D 0 3
FrameIndex XZW1 E 0 4
FrameIndex XZW1 F 0 5
FrameIndex XZW1 G 0 6
FrameIndex XZW1 H 0 7
}
Model "HealthNuggetItem"
{
Path "models"
Model 0 "Nugget_d.3d"
Skin 0 "Nugget.png"
Scale 0.03 0.03 0.03
ZOffset 16
ROTATING
FrameIndex XZW1 A 0 0
FrameIndex XZW1 B 0 1
FrameIndex XZW1 C 0 2
FrameIndex XZW1 D 0 3
FrameIndex XZW1 E 0 4
FrameIndex XZW1 F 0 5
FrameIndex XZW1 G 0 6
FrameIndex XZW1 H 0 7
}
Model "TetraHealthItem"
{
Path "models"
Model 0 "TetraHealth_d.3d"
Skin 0 "TetraHealth.png"
Scale 0.05 0.05 0.05
ZOffset 16
ROTATING
FrameIndex XZW1 A 0 0
}
Model "CubeHealthItem"
{
Path "models"
Model 0 "CubeHealth_d.3d"
Skin 0 "CubeHealth.png"
Scale 0.05 0.05 0.05
ZOffset 16
ROTATING
FrameIndex XZW1 A 0 0
}
Model "RefresherItem"
{
Path "models"
Model 0 "Refresher_d.3d"
Skin 0 "Refresher.png"
Scale 0.05 0.05 0.05
ZOffset 16
RollOffset 30
ROTATING
FrameIndex XZW1 A 0 0
}
Model "BlastSuitItem"
{
Path "models"
Model 0 "BlastSuit_d.3d"
Skin 0 "BlastSuit.png"
Scale 0.05 0.05 0.05
ZOffset 20
ROTATING
FrameIndex XZW1 A 0 0
}
Model "WarArmorItem"
{
Path "models"
Model 0 "WarArmor_d.3d"
Skin 0 "WarArmor.png"
Scale 0.07 0.07 0.07
ZOffset 20
ROTATING
FrameIndex XZW1 A 0 0
}
Model "GrilledCheeseSandwich"
{
Path "models"
Model 0 "Sandwich_d.3d"
SurfaceSkin 0 0 "goldmap.png"
SurfaceSkin 0 1 "Sandwich.png"
Scale 0.05 0.05 0.05
PitchOffset -45
ZOffset 16
ROTATING
FrameIndex XZW1 A 0 0
}
Model "GhostArtifact"
{
Path "models"
Model 0 "GhostArtifact_d.3d"
SurfaceSkin 0 1 "GhostArtifact.png"
Scale 0.05 0.05 0.05
ZOffset 16
ROTATING
FrameIndex XZW1 A 0 0
}
Model "GhostArtifactX"
{
Path "models"
Model 0 "GhostArtifact_d.3d"
SurfaceSkin 0 0 "darkmap.png"
Scale 0.05 0.05 0.05
ZOffset 16
ROTATING
FrameIndex XZW1 A 0 0
}

View file

@ -309,6 +309,20 @@ demolitionist/bump2 sounds/demolitionist/demobump2.ogg
demolitionist/bump3 sounds/demolitionist/demobump3.ogg
$random demolitionist/bump { demolitionist/bump1 demolitionist/bump2 demolitionist/bump3 }
$playersound demolitionist neutral *grunt DSEMPTY
$playeralias demolitionist neutral *pain100 demolitionist/lopain
$playeralias demolitionist neutral *pain75 demolitionist/pain
$playeralias demolitionist neutral *pain50 demolitionist/pain
$playeralias demolitionist neutral *pain25 demolitionist/hipain
$playersound demolitionist neutral *usefail sounds/menu/failuse.ogg
$playeralias demolitionist neutral *death demolitionist/death
$playeralias demolitionist neutral *xdeath demolitionist/xdeath
$playeralias demolitionist neutral *gibbed demolitionist/xdeath
$playeralias demolitionist neutral *wimpydeath demolitionist/wdeath
$playersound demolitionist neutral *land DSEMPTY
$playersound demolitionist neutral *falling DSEMPTY
$playersound demolitionist neutral *puzzfail sounds/menu/failuse.ogg
explodium/casing1 sounds/explodiumgun/expl_case1.ogg
explodium/casing2 sounds/explodiumgun/expl_case2.ogg
explodium/casing3 sounds/explodiumgun/expl_case3.ogg
@ -361,19 +375,16 @@ $limit candygun/hit 32
$limit candygun/maghit 32
$limit candygun/gunhit 32
$playersound demolitionist neutral *grunt DSEMPTY
$playeralias demolitionist neutral *pain100 demolitionist/lopain
$playeralias demolitionist neutral *pain75 demolitionist/pain
$playeralias demolitionist neutral *pain50 demolitionist/pain
$playeralias demolitionist neutral *pain25 demolitionist/hipain
$playersound demolitionist neutral *usefail sounds/menu/failuse.ogg
$playeralias demolitionist neutral *death demolitionist/death
$playeralias demolitionist neutral *xdeath demolitionist/xdeath
$playeralias demolitionist neutral *gibbed demolitionist/xdeath
$playeralias demolitionist neutral *wimpydeath demolitionist/wdeath
$playersound demolitionist neutral *land DSEMPTY
$playersound demolitionist neutral *falling DSEMPTY
$playersound demolitionist neutral *puzzfail sounds/menu/failuse.ogg
chancebox/explode1 sounds/items/lootexpl1.ogg
chancebox/explode2 sounds/items/lootexpl2.ogg
chancebox/explode3 sounds/items/lootexpl3.ogg
$random chancebox/explode { chancebox/explode1 chancebox/explode2 chancebox/explode3 }
chancebox/land1 sounds/items/lootland1.ogg
chancebox/land2 sounds/items/lootland2.ogg
chancebox/land3 sounds/items/lootland3.ogg
$random chancebox/land { chancebox/land1 chancebox/land2 chancebox/land3 }
chancebox/drumroll sounds/DRUMROLL.ogg
chancebox/tada sounds/TADA.ogg
misc/secret sounds/menu/findsecret.ogg
misc/keytry sounds/menu/failuse.ogg
@ -389,6 +400,15 @@ misc/teleport sounds/general/teleport.ogg
misc/chat sounds/menu/chatsnd.ogg
misc/chat2 sounds/menu/chatsnd.ogg
armor/blastsuit sounds/items/blastsuit.ogg
armor/wararmor sounds/items/wararmor.ogg
powerup/refresher sounds/items/refresh.ogg
powerup/sandwich sounds/CORK.ogg
powerup/ghost sounds/items/CloakOn.ogg
powerup/ghostact sounds/items/CloakLoop3.ogg
powerup/ghostend sounds/items/CloakOff.ogg
menu/activate sounds/hmenu/hmenu1.ogg
menu/backup sounds/hmenu/hmenu2.ogg
menu/prompt sounds/hmenu/hmenu1.ogg
@ -405,5 +425,4 @@ menu/demosel sounds/menu/menuset.ogg
menu/demoscroll sounds/menu/menuscroll.ogg
menu/democlose sounds/menu/menuclose.ogg
menu/invsel sounds/menu/invsel.ogg
menu/noinvuse sounds/menu/failinv.ogg

BIN
sounds/DRUMROLL.ogg Normal file

Binary file not shown.

BIN
sounds/TADA.ogg Normal file

Binary file not shown.

BIN
sounds/items/CloakLoop3.ogg Normal file

Binary file not shown.

BIN
sounds/items/CloakOff.ogg Normal file

Binary file not shown.

BIN
sounds/items/CloakOn.ogg Normal file

Binary file not shown.

BIN
sounds/items/blastsuit.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
sounds/items/lootexpl1.ogg Normal file

Binary file not shown.

BIN
sounds/items/lootexpl2.ogg Normal file

Binary file not shown.

BIN
sounds/items/lootexpl3.ogg Normal file

Binary file not shown.

BIN
sounds/items/lootland1.ogg Normal file

Binary file not shown.

BIN
sounds/items/lootland2.ogg Normal file

Binary file not shown.

BIN
sounds/items/lootland3.ogg Normal file

Binary file not shown.

BIN
sounds/items/refresh.ogg Normal file

Binary file not shown.

BIN
sounds/items/wararmor.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -3,7 +3,8 @@
# file in the root of the zip/pk3/whatever, wads are not supported
# list the names of your voice types here and don't forget to define your voice
# lines using a similar format to the base game's:
# voice/<name>/<group><#> for the sndinfo entries
# SWWM_SUBS_<NAME>_<GROUP><#> for the language strings
# with the exception of pain/death/grunt sounds, all lines you may want to
# register require a subtitle language string so they can be properly detected,
# but you can set them to an empty string if you don't want text to display.

View file

@ -18,6 +18,7 @@ version "4.3"
#include "zscript/swwm_armor.zsc"
#include "zscript/swwm_powerup.zsc"
#include "zscript/swwm_ammo.zsc"
#include "zscript/swwm_chancebox.zsc"
#include "zscript/swwm_jackhammer.zsc"
#include "zscript/swwm_deepdarkimpact.zsc"
#include "zscript/swwm_splode.zsc"

View file

@ -7,7 +7,6 @@ Mixin Class SWWMAmmo
{
let copy = Inventory(Spawn(type,Owner.Pos,NO_REPLACE));
if ( !copy ) return null;
copy.MaxAmount = MaxAmount;
copy.DropTime = 30;
copy.bSpecial = copy.bSolid = false;
copy.SetOrigin(Owner.Vec3Offset(0,0,10.),false);
@ -137,8 +136,8 @@ Mixin Class SWWMAmmo
double ang = FRandom[Junk](0,360);
last = DoDrop(ammotypes[i]);
last.SetOrigin(item.pos,false);
last.vel.xy = (cos(ang),sin(ang))*FRandom[Junk](.2,.5);
excess -= 16;
last.vel.xy = (cos(ang),sin(ang))*FRandom[Junk](2,5);
excess -= def.Amount;
break;
}
}
@ -492,7 +491,7 @@ Class EvisceratorShell : Ammo
Stamina 2500;
Inventory.Amount 1;
Inventory.MaxAmount 30;
Ammo.BackpackAmount 6;
Ammo.BackpackAmount 3;
Ammo.DropAmount 3;
+FLOATBOB;
FloatBobStrength 0.25;
@ -529,7 +528,7 @@ Class HellblazerMissiles : Ammo
Stamina 6000;
Inventory.Amount 1;
Inventory.MaxAmount 60;
Ammo.BackpackAmount 18;
Ammo.BackpackAmount 3;
Ammo.DropAmount 3;
+FLOATBOB;
FloatBobStrength 0.25;
@ -561,7 +560,7 @@ Class HellblazerCrackshots : Ammo
Stamina 8000;
Inventory.Amount 1;
Inventory.MaxAmount 24;
Ammo.BackpackAmount 6;
Ammo.BackpackAmount 2;
Ammo.DropAmount 2;
+FLOATBOB;
FloatBobStrength 0.25;
@ -593,7 +592,7 @@ Class HellblazerRavagers : Ammo
Stamina 12000;
Inventory.Amount 1;
Inventory.MaxAmount 9;
Ammo.BackpackAmount 3;
Ammo.BackpackAmount 1;
Ammo.DropAmount 1;
+FLOATBOB;
FloatBobStrength 0.25;
@ -784,6 +783,8 @@ Class AmmoFabricator : Inventory abstract
{
+INVENTORY.INVBAR;
+FLOATBOB;
Inventory.MaxAmount 32;
Inventory.InterHubAmount 32;
FloatBobStrength 0.25;
}
States

View file

@ -1 +1,146 @@
// All the armor items go here
Class ArmorNugget : SWWMArmor
{
Default
{
Inventory.Icon "graphics/HUD/Icons/I_ArmorNugget.png";
Inventory.Amount 5;
Inventory.MaxAmount 200;
Inventory.InterHubAmount 200;
SWWMArmor.ArmorPriority 10;
SWWMArmor.DrainFactor .1;
SWWMArmor.GiverArmor "ArmorNuggetItem";
}
override int HandleDamage( int damage, Name damageType, int flags )
{
double factor = amount*.01;
return int(ceil(damage*factor));
}
}
Class ArmorNuggetItem : SWWMSpareArmor
{
override Inventory CreateCopy( Actor other )
{
// additional lore
SWWMLoreLibrary.Add(other.player,"Nugget");
return Super.CreateCopy(other);
}
Default
{
Tag "$T_NUGGETA";
Inventory.Icon "graphics/HUD/Icons/I_ArmorNugget.png";
Inventory.PickupMessage "$T_NUGGETA";
Inventory.MaxAmount int.max;
Inventory.InterHubAmount int.max;
Inventory.UseSound "misc/armor_pkup";
SWWMSpareArmor.GiveArmor "ArmorNugget";
+INVENTORY.ALWAYSPICKUP;
+COUNTITEM;
}
States
{
Spawn:
XZW1 # -1 NoDelay
{
frame = Random[Nugget](0,7);
}
Stop;
Dummy:
XZW1 ABCDEFGH -1;
Stop;
}
}
Class BlastSuit : SWWMArmor
{
Default
{
Inventory.Icon "graphics/HUD/Icons/I_BlastSuit.png";
Inventory.Amount 500;
Inventory.MaxAmount 500;
Inventory.InterHubAmount 500;
SWWMArmor.ArmorPriority 2;
SWWMArmor.DrainFactor 1.;
SWWMArmor.DrainMessage "$D_BLASTSUIT";
SWWMArmor.GiverArmor "BlastSuitItem";
}
override int HandleDamage( int damage, Name damageType, int flags )
{
double factor = .75;
if ( flags&DMG_EXPLOSION ) factor = 1.-(1.-factor)*.5;
return int(ceil(damage*factor));
}
}
Class BlastSuitItem : SWWMSpareArmor
{
override Inventory CreateCopy( Actor other )
{
// additional lore
SWWMLoreLibrary.Add(other.player,"BlastSuit");
return Super.CreateCopy(other);
}
Default
{
Tag "$T_BLASTSUIT";
Inventory.Icon "graphics/HUD/Icons/I_BlastSuit.png";
Inventory.PickupMessage "$T_BLASTSUIT";
Inventory.UseSound "armor/blastsuit";
SWWMSpareArmor.GiveArmor "BlastSuit";
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
Class WarArmor : SWWMArmor
{
Default
{
Inventory.Icon "graphics/HUD/Icons/I_WarArmor.png";
Inventory.Amount 1000;
Inventory.MaxAmount 1000;
Inventory.InterHubAmount 1000;
SWWMArmor.ArmorPriority 6;
SWWMArmor.DrainFactor 1.0;
SWWMArmor.DrainMessage "$D_WARARMOR";
SWWMArmor.GiverArmor "WarArmorItem";
}
override int HandleDamage( int damage, Name damageType, int flags )
{
double factor;
// should be enough "elemental" damage types I guess
if ( (damageType == 'Fire') || (damageType == 'Ice') || (damageType == 'Slime') || (damageType == 'Lightning') || (damageType == 'Wind') || (damageType == 'Water') ) factor = .9;
else factor = .8;
if ( flags&DMG_EXPLOSION ) factor = 1.-(1.-factor)*.7;
return int(ceil(damage*factor));
}
}
Class WarArmorItem : SWWMSpareArmor
{
override Inventory CreateCopy( Actor other )
{
// additional lore
SWWMLoreLibrary.Add(other.player,"WarArmor");
return Super.CreateCopy(other);
}
Default
{
Tag "$T_WARARMOR";
Inventory.Icon "graphics/HUD/Icons/I_WarArmor.png";
Inventory.PickupMessage "$T_WARARMOR";
Inventory.UseSound "armor/wararmor";
SWWMSpareArmor.GiveArmor "WarArmor";
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}

516
zscript/swwm_chancebox.zsc Normal file
View file

@ -0,0 +1,516 @@
// gacha nonsense
Class Chancebox : Inventory abstract
{
Class<Actor> dropclass;
Property DropClass : dropclass;
override Inventory CreateCopy( Actor other )
{
// additional lore
SWWMLoreLibrary.Add(other.player,"Lootbox");
return Super.CreateCopy(other);
}
override bool Use( bool pickup )
{
if ( pickup ) return false;
Vector3 x, y, z;
[x, y, z] = swwm_CoordUtil.GetAxes(Owner.pitch,Owner.angle,Owner.roll);
Vector3 origin = level.Vec3Offset(Owner.Vec2OffsetZ(0,0,Owner.player.viewz),x*20-z*8);
if ( !level.IsPointInLevel(origin) ) return false;
let b = Spawn(dropclass,origin);
if ( !b ) return false;
if ( !b.TestMobjLocation() )
{
b.Destroy();
return false;
}
b.angle = Owner.angle-180;
b.vel = x*10;
b.vel.z += 2.;
return true;
}
Default
{
+INVENTORY.INVBAR;
+FLOATBOB;
Inventory.MaxAmount 32;
Inventory.InterHubAmount 32;
FloatBobStrength 0.25;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
// top side of chancebox, shoots upwards
Class ChanceTop : Actor abstract
{
Default
{
Radius 16;
Height 4;
+MISSILE;
+THRUACTORS;
+NOGRAVITY;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
vel = (0,0,20);
}
States
{
Spawn:
XZW1 A 1
{
double magvel = vel.length();
if ( magvel > 0. )
{
magvel = min(60,magvel*1.2);
vel = vel.unit()*magvel;
}
}
Wait;
Death:
TNT1 A 1 A_SpawnItemEx("ExplodiumBulletImpact");
Stop;
}
}
// left/right side of chancebox, shoots forward
Class ChanceSide : Actor abstract
{
Default
{
Radius 16;
Height 32;
+MISSILE;
+THRUACTORS;
+NOGRAVITY;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
vel = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch))*20;
}
States
{
Spawn:
XZW1 A 1
{
double magvel = vel.length();
if ( magvel > 0. )
{
magvel = min(60,magvel*1.2);
vel = vel.unit()*magvel;
}
}
Wait;
Death:
TNT1 A 1 A_SpawnItemEx("ExplodiumBulletImpact");
Stop;
}
}
Class ChanceTopTier1 : ChanceTop {}
Class ChanceTopTier2 : ChanceTop {}
Class ChanceTopTier3 : ChanceTop {}
Class ChanceTopTier4 : ChanceTop {}
Class ChanceSideTier1 : ChanceSide {}
Class ChanceSideTier2 : ChanceSide {}
Class ChanceSideTier3 : ChanceSide {}
Class ChanceSideTier4 : ChanceSide {}
Class DroppedChancebox : Actor abstract
{
Class<Actor> topclass, sideclass;
Property TopClass : topclass;
Property SideClass : sideclass;
double rang;
action void A_DropSomething()
{
int num = 0;
// first pass, count up the max rng number
for ( DropItem d=GetDropItems(); d; d=d.Next )
num += d.Probability;
// second pass, pick the item
int choice = Random[Chancebox](0,num);
int num2 = 0;
for ( DropItem d=GetDropItems(); d; d=d.Next )
{
num2 += d.Probability;
if ( num2 < choice ) continue;
let thedrop = Spawn(d.Name,pos);
thedrop.angle = angle;
break;
}
int numpt = Random[ExploS](16,32);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](.3,8);
let s = Spawn("SWWMSmoke",Vec3Offset(0,0,16));
s.vel = pvel;
s.SetShade(FillColor*Random[ExploS](64,85));
s.special1 = Random[ExploS](1,4);
s.alpha *= .4;
s.scale *= 2.4;
}
}
action void A_Confetti()
{
A_StartSound("chancebox/tada",CHAN_ITEM);
double ang, pt;
int numpt = Random[ExploS](64,128);
for ( int i=0; i<numpt; i++ )
{
ang = FRandom[ExploS](0,360);
pt = FRandom[ExploS](-90,30);
let c = Spawn("FancyConfetti",Vec3Offset(0,0,16));
c.vel = (cos(pt)*cos(ang),cos(pt)*sin(ang),-sin(pt))*FRandom[ExploS](2,8);
}
}
Default
{
Radius 16;
Height 32;
Gravity .7;
+CANNOTPUSH;
+MOVEWITHSECTOR;
+BLOCKASPLAYER;
+ROLLSPRITE;
}
States
{
Spawn:
XZW1 A 1 A_JumpIf(pos.z<=floorz,1);
Wait;
XZW1 A 35
{
A_Stop();
A_StartSound("chancebox/land",CHAN_BODY);
rang = angle;
}
XZW1 A 0 A_StartSound("chancebox/drumroll",CHAN_WEAPON);
XZW1 A 1
{
angle = rang+FRandom[Chancebox](-5,5);
pitch = FRandom[Chancebox](-5,5);
roll = FRandom[Chancebox](-5,5);
special1++;
return A_JumpIf(special1>40,"BlowUp");
}
Wait;
BlowUp:
XZW2 A 1
{
A_QuakeEx(2,2,2,9,0,500,"",QF_RELATIVE|QF_SCALEDOWN,falloff:200,rollIntensity:.2);
A_StartSound("chancebox/explode",CHAN_VOICE);
angle = rang;
pitch = roll = 0;
let t = Spawn(TopClass,Vec3Offset(0,0,32));
t.angle = angle;
let s1 = Spawn(SideClass,level.Vec3Offset(pos,(RotateVector((16,0),angle+90),0)));
s1.angle = angle+90;
let s2 = Spawn(SideClass,level.Vec3Offset(pos,(RotateVector((16,0),angle-90),0)));
s2.angle = angle-90;
A_DropSomething();
}
XZW2 BCDEFGHIJKLMNO 1;
XZW2 P -1 A_Confetti();
Stop;
Dummy:
XZW1 BCDEFG -1; // these won't actually be used, found a better way
Stop;
}
}
Class DroppedChanceboxTier1 : DroppedChancebox
{
Default
{
DroppedChancebox.TopClass "ChanceTopTier1";
DroppedChancebox.SideClass "ChanceSideTier1";
StencilColor "01 01 03";
DropItem "ChanceDropShells1", 6;
DropItem "ChanceDropShells2", 6;
DropItem "ChanceDropShells3", 5;
DropItem "ChanceDropShells4", 4;
DropItem "ChanceDropShells5", 3;
DropItem "ChanceDropShells6", 2;
}
}
Class DroppedChanceboxTier2 : DroppedChancebox
{
Default
{
DroppedChancebox.TopClass "ChanceTopTier2";
DroppedChancebox.SideClass "ChanceSideTier2";
StencilColor "01 03 01";
}
}
Class DroppedChanceboxTier3 : DroppedChancebox
{
Default
{
DroppedChancebox.TopClass "ChanceTopTier3";
DroppedChancebox.SideClass "ChanceSideTier3";
StencilColor "03 01 01";
}
}
Class DroppedChanceboxTier4 : DroppedChancebox
{
Default
{
DroppedChancebox.TopClass "ChanceTopTier4";
DroppedChancebox.SideClass "ChanceSideTier4";
StencilColor "03 03 01";
}
}
Class ChanceboxTier1 : Chancebox
{
Default
{
Tag "$T_LOOTBOX1";
Inventory.PickupMessage "$T_LOOTBOX1";
Inventory.Icon "graphics/HUD/Icons/I_Chancebox1.png";
Stamina 1000;
Chancebox.DropClass "DroppedChanceboxTier1";
}
}
Class ChanceboxTier2 : Chancebox
{
Default
{
Tag "$T_LOOTBOX2";
Inventory.PickupMessage "$T_LOOTBOX2";
Inventory.Icon "graphics/HUD/Icons/I_Chancebox2.png";
Stamina 10000;
Chancebox.DropClass "DroppedChanceboxTier2";
}
}
Class ChanceboxTier3 : Chancebox
{
Default
{
Tag "$T_LOOTBOX3";
Inventory.PickupMessage "$T_LOOTBOX3";
Inventory.Icon "graphics/HUD/Icons/I_Chancebox3.png";
Stamina 100000;
Chancebox.DropClass "DroppedChanceboxTier3";
}
}
Class ChanceboxTier4 : Chancebox
{
Default
{
Tag "$T_LOOTBOX4";
Inventory.PickupMessage "$T_LOOTBOX4";
Inventory.Icon "graphics/HUD/Icons/I_Chancebox4.png";
Stamina 1000000;
Chancebox.DropClass "DroppedChanceboxTier4";
}
}
Class FancyConfetti : Actor
{
int deadtimer;
double anglevel, pitchvel, rollvel;
Default
{
Radius 2;
Height 2;
+NOBLOCKMAP;
+MISSILE;
+MOVEWITHSECTOR;
+THRUACTORS;
+NOTELEPORT;
+DONTSPLASH;
+INTERPOLATEANGLES;
+ROLLSPRITE;
+ROLLCENTER;
Gravity 0.05;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
deadtimer = 0;
anglevel = FRandom[Junk](3,12)*RandomPick[Junk](-1,1);
pitchvel = FRandom[Junk](3,12)*RandomPick[Junk](-1,1);
rollvel = FRandom[Junk](3,12)*RandomPick[Junk](-1,1);
if ( bAMBUSH ) frame = 0;
else frame = Random[Junk](0,9);
scale *= Frandom[Junk](0.8,1.2);
}
override void Tick()
{
Super.Tick();
if ( isFrozen() ) return;
vel.xy *= 0.98;
if ( vel.z > 0 ) vel.z *= 0.98;
if ( InStateSequence(CurState,ResolveState("Death")) )
{
deadtimer++;
if ( deadtimer > 300 ) A_FadeOut(0.05);
return;
}
}
States
{
Spawn:
XZW1 # 1
{
angle += anglevel;
pitch += pitchvel;
roll += rollvel;
}
Loop;
Death:
XZW1 # -1
{
pitch = roll = 0;
}
Stop;
Dummy:
XZW1 ABCDEFGHIJ -1;
Stop;
}
}
// Chancebox drops
Class ChanceDrop : Actor abstract
{
Default
{
StencilColor "03 03 03";
+NOBLOCKMAP;
+NOGRAVITY;
}
action void A_DropTheGoods()
{
int num = 0;
for ( DropItem d=GetDropItems(); d; d=d.Next )
{
if ( Random[Chancebox](0,255) > d.Probability ) continue;
Actor i = Spawn(d.Name,pos);
i.bDROPPED = true;
i.bNOGRAVITY = false;
i.vel.z = FRandom[Chancebox](2,4);
switch ( num )
{
case 0:
i.vel.xy = (0,0);
break;
case 1:
i.vel.xy = RotateVector((FRandom[Chancebox](3,6),0),angle);
break;
case 2:
i.vel.xy = RotateVector((FRandom[Chancebox](3,6),0),angle+90);
break;
case 3:
i.vel.xy = RotateVector((FRandom[Chancebox](3,6),0),angle-90);
break;
case 4:
i.vel.xy = RotateVector((FRandom[Chancebox](3,6),0),angle+180);
break;
default:
i.vel.xy = RotateVector((FRandom[Chancebox](3,6),0),FRandom[Chancebox](0,360));
break;
}
num++;
if ( i is 'Inventory' ) Inventory(i).bTOSSED = true;
}
}
States
{
Spawn:
TNT1 A 1 NoDelay A_DropTheGoods();
Stop;
}
}
Class ChanceDropShells1 : ChanceDrop
{
Default
{
DropItem "RedShell2", 256;
DropItem "RedShell4", 224;
DropItem "RedShell4", 224;
DropItem "RedShell8", 192;
DropItem "RedShell8", 192;
}
}
Class ChanceDropShells2 : ChanceDrop
{
Default
{
DropItem "GreenShell2", 256;
DropItem "GreenShell4", 192;
DropItem "GreenShell4", 192;
DropItem "GreenShell8", 160;
DropItem "GreenShell8", 160;
}
}
Class ChanceDropShells3 : ChanceDrop
{
Default
{
DropItem "BlueShell2", 256;
DropItem "BlueShell4", 160;
DropItem "BlueShell4", 160;
DropItem "BlueShell8", 128;
DropItem "BlueShell8", 128;
}
}
Class ChanceDropShells4 : ChanceDrop
{
Default
{
DropItem "PurpleShell2", 256;
DropItem "PurpleShell2", 128;
DropItem "PurpleShell2", 128;
DropItem "PurpleShell4", 96;
DropItem "PurpleShell4", 96;
}
}
Class ChanceDropShells5 : ChanceDrop
{
Default
{
DropItem "WhiteShell", 256;
DropItem "WhiteShell", 128;
DropItem "WhiteShell", 128;
DropItem "WhiteShell2", 96;
DropItem "WhiteShell2", 96;
}
}
Class ChanceDropShells6 : ChanceDrop
{
Default
{
DropItem "BlackShell", 256;
DropItem "BlackShell", 64;
DropItem "BlackShell", 64;
}
}
Class ChanceDropShells7 : ChanceDrop
{
Default
{
DropItem "GoldShell", 256;
}
}

View file

@ -1277,7 +1277,8 @@ Class SWWMHandler : EventHandler
static const Class<Actor> purplepool[] = {"PurpleShell","PurpleShell2","PurpleShell4"};
static const Class<Actor> bluepool[] = {"BlueShell","BlueShell2","BlueShell4","BlueShell8"};
static const Class<Actor> blackpool[] = {"BlackShell","BlackShell2","BlackShell4"};
if ( (e.Replacee is 'ItemFog') ) e.Replacement = 'SWWMItemFog';
if ( e.Replacee is 'ItemFog' ) e.Replacement = 'SWWMItemFog';
if ( e.Replacee is 'TeleportFog' ) e.Replacement = 'SWWMTeleportFog';
else if ( (e.Replacee is 'Chainsaw') || (e.Replacee is 'Gauntlets') || (e.Replacee is 'FWeapAxe') ) e.Replacement = 'PusherWeapon';
else if ( (e.Replacee is 'Fist') || (e.Replacee is 'Staff') ) e.Replacement = 'DeepImpact';
else if ( (e.Replacee is 'Pistol') || (e.Replacee is 'GoldWand') || (e.Replacee is 'FWeapFist') || (e.Replacee is 'CWeapMace') || (e.Replacee is 'MWeapWand') ) e.Replacement = 'ExplodiumGun';
@ -1447,7 +1448,7 @@ Class SWWMHandler : EventHandler
if ( Random[Replacements](0,3) ) e.Replacement = 'SparkUnit';
else e.Replacement = 'SilverBulletAmmo';
}
else if ( e.Replacee == 'ArtiTeleport' )
else if ( (e.Replacee == 'ArtiTeleport') || (e.Replacee == 'ArtiTeleportOther') )
{
if ( Random[Replacements](0,2) ) e.Replacement = 'SWWMNothing';
else e.Replacement = 'GoldShell';
@ -1465,6 +1466,20 @@ Class SWWMHandler : EventHandler
else if ( (e.Replacee == 'FWeaponPiece1') || (e.Replacee == 'FWeaponPiece2')
|| (e.Replacee == 'CWeaponPiece1') || (e.Replacee == 'CWeaponPiece3')
|| (e.Replacee == 'MWeaponPiece2') || (e.Replacee == 'MWeaponPiece3') ) e.Replacement = 'SWWMNothing';
else if ( (e.Replacee == 'ArmorBonus') || (e.Replacee == 'ArtiTimeBomb') || (e.Replacee == 'ArtiBlastRadius') ) e.Replacement = 'ArmorNuggetItem';
else if ( (e.Replacee == 'HealthBonus') || (e.Replacee == 'CrystalVial') ) e.Replacement = 'HealthNuggetItem';
else if ( e.Replacee == 'Stimpack' ) e.Replacement = 'TetraHealthItem';
else if ( e.Replacee == 'Medikit' ) e.Replacement = 'CubeHealthItem';
else if ( e.Replacee == 'ArtiHealth' )
{
if ( Random[Replacements](0,1) ) e.Replacement = 'CubeHealthItem';
else e.Replacement = 'TetraHealthItem';
}
else if ( (e.Replacee == 'Soulsphere') || (e.Replacee == 'ArtiSuperHealth') ) e.Replacement = 'RefresherItem';
else if ( (e.Replacee == 'Megasphere') || (e.Replacee == 'ArtiEgg') || (e.Replacee == 'PlatinumHelm') ) e.Replacement = 'GrilledCheeseSandwich';
else if ( (e.Replacee == 'Blursphere') || (e.Replacee == 'ArtiInvisibility') || (e.Replacee == 'AmuletOfWarding') ) e.Replacement = 'GhostArtifact';
else if ( (e.Replacee == 'GreenArmor') || (e.Replacee == 'SilverShield') || (e.Replacee == 'MeshArmor') ) e.Replacement = 'BlastSuitItem';
else if ( (e.Replacee == 'BlueArmor') || (e.Replacee == 'FalconShield') || (e.Replacee == 'EnchantedShield') ) e.Replacement = 'WarArmorItem';
}
override void NetworkProcess( ConsoleEvent e )

View file

@ -1 +1,197 @@
// all the healing items go here
Class HealthNugget : Health
{
Default
{
Inventory.Amount 5;
Inventory.MaxAmount 200;
}
}
Class TetraHealth : Health
{
Default
{
Inventory.Amount 15;
Inventory.MaxAmount 100;
}
}
Class CubeHealth : Health
{
Default
{
Inventory.Amount 30;
Inventory.MaxAmount 100;
}
}
Class RefresherHealth : Health
{
Default
{
Inventory.Amount 500;
Inventory.MaxAmount 500;
}
override bool TryPickup( in out Actor other )
{
PrevHealth = other.player?other.player.health:other.health;
if ( other.GiveBody(Amount,MaxAmount) )
{
GoAwayAndDie();
let p = Powerup(other.FindInventory("RefresherRegen"));
if ( p ) p.EffectTics = p.default.EffectTics;
else other.GiveInventory("RefresherRegen",1);
return true;
}
return false;
}
}
Class RefresherRegen : Powerup
{
Default
{
Inventory.Icon "graphics/HUD/Icons/I_Refresher.png";
Powerup.Duration -60;
Powerup.Strength 10;
}
override void EndEffect()
{
Super.EndEffect();
if ( (EffectTics <= 0) && Owner && Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_REFRESHER"));
}
override void DoEffect()
{
Super.DoEffect();
if ( Owner && (Owner.health > 0) && !(EffectTics%175) )
{
if ( Owner.GiveBody(int(Strength),500) )
{
SWWMHandler.DoFlash(Owner,Color(32,224,128,255),10);
Owner.A_StartSound("powerup/refresher",CHAN_ITEM,CHANF_LOCAL,.4);
}
}
}
}
Class HealthNuggetItem : SWWMHealth
{
override Inventory CreateCopy( Actor other )
{
// additional lore
SWWMLoreLibrary.Add(other.player,"Nugget");
return Super.CreateCopy(other);
}
Default
{
Tag "$T_NUGGETH";
Inventory.Icon "graphics/HUD/Icons/I_HealthNugget.png";
Inventory.PickupMessage "$T_NUGGETH";
Inventory.MaxAmount int.max;
Inventory.InterHubAmount int.max;
SWWMHealth.GiveHealth "HealthNugget";
+INVENTORY.ALWAYSPICKUP;
+COUNTITEM;
}
States
{
Spawn:
XZW1 # -1 NoDelay
{
frame = Random[Nugget](0,7);
}
Stop;
Dummy:
XZW1 ABCDEFGH -1;
Stop;
}
}
Class TetraHealthItem : SWWMHealth
{
override Inventory CreateCopy( Actor other )
{
// additional lore
SWWMLoreLibrary.Add(other.player,"HealthGeom");
return Super.CreateCopy(other);
}
Default
{
Tag "$T_TETRAHEALTH";
Inventory.Icon "graphics/HUD/Icons/I_HealthTetra.png";
Inventory.PickupMessage "$T_TETRAHEALTH";
Inventory.MaxAmount 20;
Inventory.InterHubAmount 20;
SWWMHealth.GiveHealth "TetraHealth";
}
States
{
Spawn:
XZW1 # -1;
Stop;
}
}
Class CubeHealthItem : SWWMHealth
{
override Inventory CreateCopy( Actor other )
{
// additional lore
SWWMLoreLibrary.Add(other.player,"HealthGeom");
return Super.CreateCopy(other);
}
Default
{
Tag "$T_CUBEHEALTH";
Inventory.Icon "graphics/HUD/Icons/I_HealthCube.png";
Inventory.PickupMessage "$T_CUBEHEALTH";
Inventory.MaxAmount 10;
Inventory.InterHubAmount 10;
SWWMHealth.GiveHealth "CubeHealth";
}
States
{
Spawn:
XZW1 # -1;
Stop;
}
}
Class RefresherItem : SWWMHealth
{
override Inventory CreateCopy( Actor other )
{
// additional lore
SWWMLoreLibrary.Add(other.player,"Refresher");
return Super.CreateCopy(other);
}
override void AutoUseExtra()
{
let p = Powerup(Owner.FindInventory("RefresherRegen"));
if ( p ) p.EffectTics = p.default.EffectTics;
else Owner.GiveInventory("RefresherRegen",1);
}
override bool Use( bool pickup )
{
if ( pickup && !deathmatch ) return false;
return Super.Use(pickup);
}
Default
{
Tag "$T_REFRESHER";
Inventory.Icon "graphics/HUD/Icons/I_Refresher.png";
Inventory.PickupMessage "$T_REFRESHER";
Inventory.PickupSound "misc/p_pkup";
Inventory.MaxAmount 5;
Inventory.InterHubAmount 5;
SWWMHealth.GiveHealth "RefresherHealth";
+COUNTITEM;
+INVENTORY.BIGPOWERUP;
}
States
{
Spawn:
XZW1 # -1;
Stop;
}
}

View file

@ -27,6 +27,8 @@ Class SWWMStatusBar : BaseStatusBar
double FracTic;
int chatopen;
bool justselected;
DynamicValueInterpolator HealthInter, ScoreInter, FuelInter, DashInter;
override void FlushNotify()
@ -100,10 +102,22 @@ Class SWWMStatusBar : BaseStatusBar
override void Tick()
{
Super.Tick();
if ( CPlayer.inventorytics >= (5*Thinker.TICRATE)-1 )
{
if ( CPlayer.mo.InvSel )
S_StartSound("menu/demoscroll",CHAN_BODY,CHANF_UI|CHANF_MAYBE_LOCAL);
}
if ( CPlayer.inventorytics > 0 ) justselected = false;
else
{
if ( !justselected && CPlayer.mo.InvSel )
S_StartSound("menu/democlose",CHAN_BODY,CHANF_UI|CHANF_MAYBE_LOCAL);
justselected = true;
}
if ( !chatduration ) chatduration = CVar.GetCVar('swwm_chatduration',players[consoleplayer]);
if ( !msgduration ) msgduration = CVar.GetCVar('swwm_msgduration',players[consoleplayer]);
if ( !pickduration ) pickduration = CVar.GetCVar('swwm_pickduration',players[consoleplayer]);
Super.Tick();
// prune old messages
for ( int i=0; i<PickupQueue.Size(); i++ )
{
@ -157,6 +171,7 @@ Class SWWMStatusBar : BaseStatusBar
ChatTex[3] = TexMan.CheckForTexture("graphics/HUD/ChatBoxTop_Smol.png",TexMan.Type_Any);
ChatTex[4] = TexMan.CheckForTexture("graphics/HUD/ChatBoxLine_Smol.png",TexMan.Type_Any);
ChatTex[5] = TexMan.CheckForTexture("graphics/HUD/ChatBoxBottom_Smol.png",TexMan.Type_Any);
InventoryTex = TexMan.CheckForTexture("graphics/HUD/InventoryBox.png",TexMan.Type_Any);
mTewiFont = HUDFont.Create("TewiShaded");
HealthInter = DynamicValueInterpolator.Create(100,.1,1,100);
ScoreInter = DynamicValueInterpolator.Create(0,.1,1,1000);
@ -178,10 +193,90 @@ Class SWWMStatusBar : BaseStatusBar
Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,ss.x-(margin+58),margin+1,String.Format("%09d",clamp(ScoreInter.GetValue(),0,999999999)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
private void DrawInvIcon( Inventory i, double xx, double yy, double alpha = 1., bool forceamt = false )
{
if ( !i ) return;
Vector2 scl = TexMan.GetScaledSize(i.Icon);
double mscl = 30./max(scl.x,scl.y);
double dw = (ss.x/mscl), dh = (ss.y/mscl);
double dx = (xx+(30-scl.x*mscl)/2)/mscl, dy = (yy+(30-scl.y*mscl)/2)/mscl;
if ( i is 'Powerup' )
{
Screen.DrawTexture(i.Icon,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_Alpha,Powerup(i).IsBlinking()?alpha*.5:alpha,DTA_TopOffset,0,DTA_LeftOffset,0);
String nstr = String.Format("%ds",Powerup(i).EffectTics/Thinker.TICRATE);
int len = mTewiFont.mFont.StringWidth(nstr);
Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,(xx+30)-len,(yy+30)-11,nstr,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_Alpha,Powerup(i).IsBlinking()?alpha*.5:alpha);
return;
}
Screen.DrawTexture(i.Icon,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_Alpha,alpha,DTA_TopOffset,0,DTA_LeftOffset,0);
if ( (i.Amount > 1) || forceamt )
{
String nstr;
if ( (i.Amount > 99999) && !forceamt ) nstr = "99999";
else nstr = String.Format("%d",i.Amount);
int len = mTewiFont.mFont.StringWidth(nstr);
Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,(xx+30)-len,(yy+30)-11,nstr,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_Alpha,alpha);
}
}
private void DrawInventory()
{
// active items (armor / powerups)
double xx = margin;
double yy = ss.y-(margin+60);
if ( CPlayer.mo.InvSel && !isInventoryBarVisible() ) yy -= 34;
bool drewarmor = false;
for ( Inventory i=CPlayer.mo.Inv; i; i=i.Inv )
{
if ( (i.Amount <= 0) || (!(i is 'SWWMArmor') && !(i is 'BasicArmor')) ) continue;
DrawInvIcon(i,xx,yy,forceamt:true);
yy -= 34;
drewarmor = true;
}
yy = ss.y-(margin+60);
if ( drewarmor ) xx += 40;
else if ( CPlayer.mo.InvSel && !isInventoryBarVisible() ) yy -= 34;
for ( Inventory i=CPlayer.mo.Inv; i; i=i.Inv )
{
if ( !(i is 'Powerup') || (Powerup(i).EffectTics <= 0) || !(Powerup(i).Icon) ) continue;
DrawInvIcon(i,xx,yy);
yy -= 34;
}
// inventory box / bar
if ( !CPlayer.mo.InvSel ) return;
if ( isInventoryBarVisible() )
{
Array<Inventory> bar;
bar.Clear();
for ( Inventory i=CPlayer.mo.FirstInv(); i; i=i.NextInv() ) bar.Push(i);
int ps = bar.Find(CPlayer.mo.InvSel);
Inventory prev[2], next[2];
if ( bar.Size() > 1 )
{
if ( ps+1 >= bar.Size() ) next[0] = bar[0];
else next[0] = bar[ps+1];
if ( ps-1 < 0 ) prev[0] = bar[bar.Size()-1];
else prev[0] = bar[ps-1];
}
if ( bar.Size() > 2 )
{
if ( ps+2 >= bar.Size() ) next[1] = bar[(ps+2)-bar.Size()];
else next[1] = bar[ps+2];
if ( ps-2 < 0 ) prev[1] = bar[bar.Size()+(ps-2)];
else prev[1] = bar[ps-2];
}
xx = (ss.x-34)/2;
yy = (ss.y+64)/2;
Screen.DrawTexture(InventoryTex,false,xx,yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
DrawInvIcon(CPlayer.mo.InvSel,xx+2,yy+2);
DrawInvIcon(prev[0],xx-32,yy+2,2./3.);
DrawInvIcon(prev[1],xx-66,yy+2,1./3.);
DrawInvIcon(next[0],xx+36,yy+2,2./3.);
DrawInvIcon(next[1],xx+70,yy+2,1./3.);
return;
}
Screen.DrawTexture(InventoryTex,false,margin,ss.y-(margin+61),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
DrawInvIcon(CPlayer.mo.InvSel,margin+2,ss.y-(margin+59));
}
private void DrawWeapon()
@ -369,6 +464,11 @@ Class SWWMStatusBar : BaseStatusBar
return true;
}
override void DrawPowerups()
{
// don't do anything
}
override void Draw( int state, double TicFrac )
{
Super.Draw(state,TicFrac);

View file

@ -2,8 +2,14 @@
Class SWWMArmor : Armor abstract
{
int priority;
double reduction;
String drainmsg;
Class<SWWMSpareArmor> parent;
Property ArmorPriority : priority;
Property DrainFactor : reduction;
Property DrainMessage : drainmsg;
Property GiverArmor : parent;
Default
{
@ -31,24 +37,36 @@ Class SWWMArmor : Armor abstract
Inv = saved;
}
// for subclasses
virtual int HandleDamage( int damage, Name damageType )
virtual int HandleDamage( int damage, Name damageType, int flags )
{
return damage;
}
override void AbsorbDamage( int damage, Name damageType, out int newdamage )
override void ModifyDamage( int damage, Name damageType, out int newdamage, bool passive, Actor inflictor, Actor source, int flags )
{
if ( !passive ) return;
int saved;
if ( (amount > 0) && !DamageTypeDefinition.IgnoreArmor(damageType) )
if ( (amount > 0) && !DamageTypeDefinition.IgnoreArmor(damageType) && (damage > 0) )
{
saved = HandleDamage(damage,damageType);
if ( amount <= saved ) saved = amount;
saved = HandleDamage(damage,damageType,flags);
if ( amount <= int(ceil(saved*reduction)) ) saved = amount;
newdamage -= saved;
amount -= saved;
if ( newdamage < 0 ) Owner.GiveBody(abs(newdamage));
amount -= int(ceil(saved*reduction));
damage = newdamage;
if ( amount <= 0 )
{
if ( damage > 0 ) newdamage = ApplyDamageFactors(GetClass(),damageType,damage,damage);
DepleteOrDestroy();
if ( Owner.CountInv(parent) > 0 )
{
Amount = default.Amount;
if ( GetDefaultByType(parent).UseSound ) Owner.A_StartSound(GetDefaultByType(parent).UseSound,CHAN_ITEM,CHANF_DEFAULT,.6);
Owner.TakeInventory(parent,1);
}
else
{
if ( Owner.CheckLocalView() && (drainmsg != "") ) Console.Printf(StringTable.Localize(drainmsg));
DepleteOrDestroy();
}
return;
}
}
@ -59,6 +77,83 @@ Class SWWMArmor : Armor abstract
// gives armor when used
Class SWWMSpareArmor : Inventory abstract
{
Class<SWWMArmor> giveme;
Property GiveArmor : giveme;
override bool Use( bool pickup )
{
let cur = Owner.FindInventory(giveme);
if ( !cur || (cur.Amount < cur.MaxAmount) )
{
Owner.GiveInventory(giveme,GetDefaultByType(giveme).Amount);
if ( UseSound ) Owner.A_StartSound(UseSound,CHAN_ITEM,CHANF_DEFAULT,.6);
SWWMHandler.DoFlash(Owner,Color(48,96,255,64),5);
return true;
}
return false;
}
Default
{
+INVENTORY.INVBAR;
+INVENTORY.ISARMOR;
+INVENTORY.AUTOACTIVATE;
Inventory.MaxAmount 5;
Inventory.InterHubAmount 5;
+FLOATBOB;
FloatBobStrength 0.25;
}
}
Class SWWMHealth : Inventory abstract
{
// can't use the Health class for whatever reason
// nice parser you got there I guess?
Class<Inventory> giveme;
Property GiveHealth : giveme;
override bool Use( bool pickup )
{
if ( Owner.Health >= GetDefaultByType(giveme).MaxAmount ) return false;
if ( UseSound ) Owner.A_StartSound(UseSound,CHAN_ITEM,CHANF_DEFAULT,.6);
SWWMHandler.DoFlash(Owner,Color(48,64,128,255),5);
Owner.GiveInventory(giveme,GetDefaultByType(giveme).Amount);
return true;
}
virtual void AutoUseExtra()
{
}
override void ModifyDamage( int damage, Name damageType, out int newdamage, bool passive, Actor inflictor, Actor source, int flags )
{
if ( passive && (Owner.Health-damage <= 0) )
{
if ( UseSound ) Owner.A_StartSound(UseSound,CHAN_ITEM,CHANF_DEFAULT,.6);
while ( (Amount > 0) && (newdamage > 0) )
{
newdamage = max(0,damage-GetDefaultByType(giveme).Amount);
AutoUseExtra();
Amount--;
if ( Amount <= 0 ) DepleteOrDestroy();
}
}
else newdamage = damage;
}
Default
{
+INVENTORY.INVBAR;
+INVENTORY.ISHEALTH;
+INVENTORY.AUTOACTIVATE;
Inventory.MaxAmount 5;
Inventory.InterHubAmount 5;
Inventory.UseSound "misc/health_pkup";
+FLOATBOB;
FloatBobStrength 0.25;
}
}
// Base casing classes

View file

@ -196,7 +196,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
invlist.Clear();
for ( Inventory inv=players[consoleplayer].mo.Inv; inv; inv=inv.Inv )
{
if ( (inv.Amount <= 0) || !inv.SpawnState.ValidateSpriteFrame() || (inv is 'Key') || (inv is 'BasicArmor') || (inv is 'HexenArmor') || (inv is 'Powerup') ) continue;
if ( (inv.Amount <= 0) || !inv.SpawnState.ValidateSpriteFrame() || (inv is 'Key') || (inv is 'BasicArmor') || (inv is 'HexenArmor') || (inv is 'Powerup') || (inv is 'SWWMArmor') ) continue;
String tag = inv.GetTag();
bool greater = false;
for ( int i=0; i<invlist.Size(); i++ )
@ -446,10 +446,10 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
int clscol = (i==sel0)?Font.CR_WHITE:Font.CR_DARKGRAY;
if ( invlist[i] is 'Weapon' ) clscol = (i==sel0)?Font.CR_YELLOW:Font.FindFontColor('DarkYellow');
else if ( invlist[i] is 'Ammo' ) clscol = (i==sel0)?Font.CR_ORANGE:Font.FindFontColor('DarkOrange');
else if ( (invlist[i] is 'Health') || (invlist[i] is 'HealthPickup') ) clscol = (i==sel0)?Font.CR_RED:Font.CR_DARKRED;
else if ( (invlist[i] is 'PowerupGiver') || invlist[i].bBIGPOWERUP ) clscol = (i==sel0)?Font.CR_PURPLE:Font.FindFontColor('DarkPurple');
else if ( (invlist[i] is 'Health') || (invlist[i] is 'HealthPickup') || (invlist[i] is 'SWWMHealth') ) clscol = (i==sel0)?Font.CR_RED:Font.CR_DARKRED;
else if ( (invlist[i] is 'Armor') || (invlist[i] is 'SWWMSpareArmor') ) clscol = (i==sel0)?Font.CR_GREEN:Font.CR_DARKGREEN;
else if ( invlist[i] is 'PuzzleItem' ) clscol = (i==sel0)?Font.CR_LIGHTBLUE:Font.CR_BLUE;
else if ( invlist[i] is 'PowerupGiver' ) clscol = (i==sel0)?Font.CR_PURPLE:Font.FindFontColor('DarkPurple');
Screen.DrawText(TewiFont,clscol,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += 16;
if ( yy >= 369 )

View file

@ -124,6 +124,19 @@ Class Demolitionist : PlayerPawn
if ( !item.CallTryPickup(self) ) item.Destroy();
}
}
// Also give spares
for ( int i=0; i<AllActorClasses.Size(); i++ )
{
let type = (Class<SWWMSpareArmor>)(AllActorClasses[i]);
if ( !type || (type == 'SWWMSpareArmor') ) continue;
if ( GetReplacement(type) == type )
{
let item = Inventory(Spawn(type));
item.ClearCounters(); // don't increase item counts
item.Amount = item.MaxAmount;
if ( !item.CallTryPickup(self) ) item.Destroy();
}
}
if ( !giveall ) return;
}
if ( giveall || (name ~== "keys") )
@ -225,11 +238,14 @@ Class Demolitionist : PlayerPawn
}
void A_Dash()
{
A_AlertMonsters(800);
vel += dashdir*dashboost;
player.vel = vel.xy;
if ( dashboost < 0.1 ) dashboost = 0.;
else dashboost *= .5;
else
{
A_AlertMonsters(800);
dashboost *= .5;
}
mystats.fuelusage += dashfuel-max(0.,dashfuel-dashboost);
dashfuel = max(0.,dashfuel-dashboost);
dashcooldown = 40;
@ -239,12 +255,12 @@ Class Demolitionist : PlayerPawn
}
void A_BoostUp( bool initial = false )
{
A_AlertMonsters(800);
vel += (0,0,1)*dashboost;
player.vel = vel.xy;
if ( dashboost < 0.1 ) dashboost = 0.;
else
{
A_AlertMonsters(800);
dashboost *= (player.cmd.buttons&BT_JUMP)?.9:.4;
}
mystats.fuelusage += dashfuel-max(0.,dashfuel-dashboost);
@ -739,11 +755,16 @@ Class Demolitionist : PlayerPawn
{
if ( !player ) return Super.UseInventory(item);
if ( !mute ) mute = CVar.GetCVar('swwm_mutevoice',player);
if ( !(item is 'PuzzleItem') || (mute.GetInt() >= 2) )
return Super.UseInventory(item);
bool res = Super.UseInventory(item);
if ( res ) SWWMHandler.AddOneliner("puzzsucc",10);
else SWWMHandler.AddOneliner("puzzfail",20);
if ( CheckLocalView() )
{
if ( !res && !(item is 'Weapon') ) A_StartSound("menu/noinvuse",CHAN_ITEM);
if ( (item is 'PuzzleItem') && (mute.GetInt() < 2) )
{
if ( res ) SWWMHandler.AddOneliner("puzzsucc",10);
else SWWMHandler.AddOneliner("puzzfail",20);
}
}
return res;
}
void A_Footstep( double yofs, bool run = false, double vol = .3 )

View file

@ -1 +1,236 @@
// Powerups go here
Class GrilledCheeseSandwich : Inventory
{
override Inventory CreateCopy( Actor other )
{
// additional lore
SWWMLoreLibrary.Add(other.player,"GCSandwich");
return Super.CreateCopy(other);
}
private void DoTheThing()
{
SWWMHandler.DoFlash(Owner,Color(64,255,255,64),10);
Owner.A_QuakeEx(9,9,9,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.);
Owner.A_StartSound(UseSound,CHAN_ITEM);
Owner.GiveBody(1000,1000);
let n = Owner.FindInventory("ArmorNugget");
if ( !n ) Owner.GiveInventory("ArmorNugget",GetDefaultByType("ArmorNugget").MaxAmount);
else n.Amount = n.MaxAmount;
let b = Owner.FindInventory("BlastSuit");
if ( !b ) Owner.GiveInventory("BlastSuit",GetDefaultByType("BlastSuit").MaxAmount);
else b.Amount = b.MaxAmount;
let w = Owner.FindInventory("WarArmor");
if ( !w ) Owner.GiveInventory("WarArmor",GetDefaultByType("WarArmor").MaxAmount);
else w.Amount = w.MaxAmount;
SWWMLoreLibrary.Add(Owner.player,"Nugget");
SWWMLoreLibrary.Add(Owner.player,"BlastSuit");
SWWMLoreLibrary.Add(Owner.player,"WarArmor");
}
override bool Use( bool pickup )
{
if ( pickup && !deathmatch ) return false;
if ( Owner.Health >= 1000 ) return false;
DoTheThing();
return true;
}
override void ModifyDamage( int damage, Name damageType, out int newdamage, bool passive, Actor inflictor, Actor source, int flags )
{
if ( passive && (Owner.Health-damage <= 0) )
{
newdamage = 0;
DoTheThing();
if ( Amount <= 0 ) DepleteOrDestroy();
}
}
Default
{
Tag "$T_SANDWICH";
Inventory.Icon "graphics/HUD/Icons/I_Sandwich.png";
Inventory.PickupSound "misc/p_pkup";
Inventory.UseSound "powerup/sandwich";
Inventory.PickupMessage "$T_SANDWICH";
Inventory.MaxAmount 5;
Inventory.InterHubAmount 5;
+INVENTORY.ALWAYSPICKUP;
+INVENTORY.AUTOACTIVATE;
+INVENTORY.INVBAR;
+COUNTITEM;
+INVENTORY.BIGPOWERUP;
+FLOATBOB;
FloatBobStrength 0.25;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
Class GhostSnd : Actor
{
Default
{
+NOBLOCKMAP;
+NOGRAVITY;
}
override void Tick()
{
Super.Tick();
if ( !target || !master )
{
Destroy();
return;
}
SetOrigin(target.pos,true);
if ( players[consoleplayer].Camera == target )
{
A_SoundVolume(CHAN_VOICE,0.);
A_SoundVolume(CHAN_7,.4);
}
else
{
A_SoundVolume(CHAN_VOICE,.1);
A_SoundVolume(CHAN_7,0.);
}
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
A_StartSound("powerup/ghostact",CHAN_VOICE,CHANF_LOOPING,.1,1.5);
A_StartSound("powerup/ghostact",CHAN_7,CHANF_LOOPING,.4,ATTN_NONE);
}
override void OnDestroy()
{
Super.OnDestroy();
A_StopSound(CHAN_VOICE);
A_StopSound(CHAN_7);
}
}
Class GhostPower : PowerInvisibility
{
Actor snd;
Default
{
Inventory.Icon "graphics/HUD/Icons/I_Ghost.png";
Powerup.Duration -60;
Powerup.Strength 100;
Powerup.Mode "Translucent";
Powerup.Color "F0E0FF", 0.1;
}
override void InitEffect()
{
Super.InitEffect();
if ( !Owner ) return;
Owner.bNOTARGET = true;
}
override void EndEffect()
{
Super.EndEffect();
if ( !Owner ) return;
Owner.bNOTARGET = false;
Owner.A_StartSound("powerup/ghostend",CHAN_ITEM);
if ( (EffectTics <= 0) && Owner && Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_GHOSTARTI"));
}
override void DoEffect()
{
Super.DoEffect();
if ( !Owner ) return;
if ( !snd ) snd = Spawn("GhostSnd",Owner.pos);
snd.target = Owner;
snd.master = self;
}
override void AlterWeaponSprite( VisStyle vis, in out int changed )
{
// leave weapons alone
vis.RenderStyle = STYLE_Normal;
vis.Alpha = 1.f;
changed = 1;
}
}
Class GhostArtifactX : Actor
{
Default
{
RenderStyle "Add";
+NOGRAVITY;
+NOCLIP;
+DONTSPLASH;
Radius 0.1;
Height 0;
+FLOATBOB;
FloatBobStrength 0.25;
}
override void Tick()
{
Super.Tick();
if ( !target )
{
Destroy();
return;
}
Warp(target,flags:WARPF_COPYINTERPOLATION|WARPF_NOCHECKPOSITION);
bInvisible = target.bInvisible||!target.InStateSequence(target.CurState,target.FindState("Spawn"));
}
States
{
Spawn:
XZW1 A -1 Bright;
Stop;
}
}
Class GhostArtifact : Inventory
{
Default
{
Tag "$T_GHOSTARTI";
Inventory.Icon "graphics/HUD/Icons/I_Ghost.png";
Inventory.PickupSound "misc/p_pkup";
Inventory.UseSound "powerup/ghost";
Inventory.PickupMessage "$T_GHOSTARTI";
Inventory.MaxAmount 5;
Inventory.InterHubAmount 5;
+INVENTORY.ALWAYSPICKUP;
+INVENTORY.AUTOACTIVATE;
+INVENTORY.INVBAR;
+COUNTITEM;
+INVENTORY.BIGPOWERUP;
+FLOATBOB;
FloatBobStrength 0.25;
}
override bool Use( bool pickup )
{
if ( pickup && !deathmatch ) return false;
A_StartSound(UseSound,CHAN_ITEM);
let g = GhostPower(Owner.FindInventory("GhostPower"));
if ( g ) g.EffectTics = g.default.EffectTics;
else Owner.GiveInventory("GhostPower",1);
return true;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
tracer = Spawn("GhostArtifactX",pos);
tracer.angle = angle;
tracer.target = self;
tracer.FloatBobPhase = FloatBobPhase;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}