Backported some changes from 1.1 devel.

This commit is contained in:
Mari the Deer 2021-09-07 11:52:18 +02:00
commit aeabf9272d
154 changed files with 2083 additions and 349 deletions

View file

@ -455,7 +455,7 @@ Class GrandAmmo : Ammo
//$Icon ammo
Tag "$T_GRANDAMMO";
Inventory.PickupMessage "$T_GRANDAMMO";
Stamina 1200000;
Stamina -1200000;
Inventory.Icon "graphics/HUD/Icons/A_GrandAmmo.png";
Inventory.Amount 1;
Inventory.MaxAmount 1;

View file

@ -29,7 +29,7 @@ Class GrandLance : SWWMWeapon
SWWMWeapon.DropAmmoType "GrandAmmo";
GrandLance.ClipCount 5;
GrandLance.ClipCount2 500;
Stamina 4200000;
Stamina -4200000;
+SWWMWEAPON.NOFIRSTGIVE;
+WEAPON.PRIMARY_USES_BOTH;
+WEAPON.EXPLOSIVE;

View file

@ -0,0 +1,306 @@
// All DLC weapon ammo pickups
Class SparksterBAmmo : Ammo
{
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
//$Title Sparkster Blue Ammo
//$Group Ammo
//$Sprite graphics/HUD/Icons/A_SparkBAmmo.png
//$Icon ammo
Tag "$T_SPARKBAMMO";
Inventory.PickupMessage "$T_SPARKBAMMO";
Stamina 16000;
Inventory.Icon "graphics/HUD/Icons/A_SparkBAmmo.png";
Inventory.Amount 1;
Inventory.MaxAmount 8;
Ammo.BackpackAmount 1;
Ammo.BackpackMaxAmount 24;
Ammo.DropAmount 1;
+FLOATBOB;
FloatBobStrength 0.25;
Accuracy 70;
}
override void ModifyDropAmount( int dropamount )
{
Super.ModifyDropAmount(dropamount);
Amount = min(Amount,1);
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
Class SparksterRAmmo : Ammo
{
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
//$Title Sparkster Red Ammo
//$Group Ammo
//$Sprite graphics/HUD/Icons/A_SparkRAmmo.png
//$Icon ammo
Tag "$T_SPARKRAMMO";
Inventory.PickupMessage "$T_SPARKRAMMO";
Stamina 18000;
Inventory.Icon "graphics/HUD/Icons/A_SparkRAmmo.png";
Inventory.Amount 1;
Inventory.MaxAmount 8;
Ammo.BackpackAmount 1;
Ammo.BackpackMaxAmount 24;
Ammo.DropAmount 1;
+FLOATBOB;
FloatBobStrength 0.25;
Accuracy 75;
}
override void ModifyDropAmount( int dropamount )
{
Super.ModifyDropAmount(dropamount);
Amount = min(Amount,1);
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
Class SparksterAmmoBundleSpawn : SWWMAmmoSpawner
{
override void SpawnAmmo()
{
int bnd = Random[Bundle](2,3);
for ( int i=0; i<bnd; i++ )
{
let a = Spawn(Random[Bundle](0,2)?"SparksterBAmmo":"SparksterRAmmo",Vec3Angle(6,i*(360/bnd)));
a.angle = i*(360/bnd);
SWWMUtility.TransferItemProp(self,a,true);
}
}
}
Class SparksterBigAmmoBundleSpawn : SWWMAmmoSpawner
{
override void SpawnAmmo()
{
int bnd = Random[Bundle](3,6);
for ( int i=0; i<bnd; i++ )
{
let a = Spawn(Random[Bundle](0,2)?"SparksterBAmmo":"SparksterRAmmo",Vec3Angle(8,i*(360/bnd)));
a.angle = i*(360/bnd);
SWWMUtility.TransferItemProp(self,a,true);
}
let a = Spawn(Random[Bundle](0,2)?"SparksterBAmmo":"SparksterRAmmo",pos);
a.angle = angle;
SWWMUtility.TransferItemProp(self,a,true);
}
}
Class MisterRound : MagAmmo
{
Default
{
//$Title Mortal Rifle Round
//$Group Ammo
//$Sprite graphics/HUD/Icons/A_MRRound.png
//$Icon ammo
Tag "$T_MRROUND";
Inventory.PickupMessage "$T_MRROUND";
Inventory.Icon "graphics/HUD/Icons/A_MRRound.png";
MagAmmo.ParentAmmo "MisterAmmo";
MagAmmo.ClipSize 30;
Inventory.MaxAmount 40;
+FLOATBOB;
FloatBobStrength 0.25;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
Class MisterRoundBundleSpawn : SWWMAmmoSpawner
{
override void SpawnAmmo()
{
int bnd = Random[Bundle](5,10);
for ( int i=0; i<bnd; i++ )
{
let a = Spawn("MisterRound",Vec3Angle(6,i*(360/bnd)));
a.angle = i*(360/bnd);
SWWMUtility.TransferItemProp(self,a,true);
}
}
}
Class MisterAmmo : Ammo
{
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
//$Title Mortal Rifle Mag
//$Group Ammo
//$Sprite graphics/HUD/Icons/A_MRAmmo.png
//$Icon ammo
Tag "$T_MRAMMO";
Inventory.PickupMessage "$T_MRAMMO";
Stamina 120000;
Inventory.Icon "graphics/HUD/Icons/A_MRAmmo.png";
Inventory.Amount 1;
Inventory.MaxAmount 2;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 6;
Ammo.DropAmount 1;
+FLOATBOB;
FloatBobStrength 0.25;
Accuracy 90;
}
override void ModifyDropAmount( int dropamount )
{
Super.ModifyDropAmount(dropamount);
Amount = min(Amount,1);
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
Class MisterGAmmo : Ammo
{
Mixin SWWMShellAmmo;
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
//$Title Mortal Rifle Grenade
//$Group Ammo
//$Sprite graphics/HUD/Icons/A_MRGrenade.png
//$Icon ammo
Tag "$T_MRGRENADE";
Stamina 90000;
Inventory.Icon "graphics/HUD/Icons/A_MRGrenade.png";
Inventory.Amount 1;
Inventory.MaxAmount 3;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 9;
Ammo.DropAmount 1;
+FLOATBOB;
FloatBobStrength 0.25;
Accuracy 90;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
Class MisterGAmmo2 : MisterGAmmo
{
Default
{
//$Title 2x Mortal Rifle Grenades
//$Group Ammo
//$Sprite graphics/HUD/Icons/A_MRGrenade.png
//$Icon ammo
Inventory.Amount 2;
}
}
Class MisterGAmmo3 : MisterGAmmo
{
Default
{
//$Title 3x Mortal Rifle Grenades
//$Group Ammo
//$Sprite graphics/HUD/Icons/A_MRGrenade.png
//$Icon ammo
Inventory.Amount 3;
}
}
Class UltimatePod : MagAmmo
{
Default
{
//$Title Ultimate Pod
//$Group Ammo
//$Sprite graphics/HUD/Icons/A_UltimatePod.png
//$Icon ammo
Tag "$T_ULTIMATEPOD";
Inventory.PickupMessage "$T_ULTIMATEPOD";
Inventory.Icon "graphics/HUD/Icons/A_UltimatePod.png";
MagAmmo.ParentAmmo "UltimateAmmo";
MagAmmo.ClipSize 4;
Inventory.MaxAmount 6;
+FLOATBOB;
FloatBobStrength 0.25;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
Class UltimateAmmo : Ammo
{
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
//$Title Ultimate Mag
//$Group Ammo
//$Sprite graphics/HUD/Icons/A_UltimateAmmo.png
//$Icon ammo
Tag "$T_ULTIMATEAMMO";
Inventory.PickupMessage "$T_ULTIMATEAMMO";
Stamina -2000000;
Inventory.Icon "graphics/HUD/Icons/A_UltimateAmmo.png";
Inventory.Amount 1;
Inventory.MaxAmount 1;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 5;
Ammo.DropAmount 1;
+FLOATBOB;
FloatBobStrength 0.25;
}
override void ModifyDropAmount( int dropamount )
{
Super.ModifyDropAmount(dropamount);
Amount = min(Amount,1);
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}

View file

@ -0,0 +1,41 @@
// Tach-Engine & Nekuratek Sparkster x3 (from UnSX 2)
// Slot 6, spawns shared with Hellblazer
Class ModernSparkster : SWWMWeapon
{
int clipcount, clipcount2;
bool chambered, chambered2;
Property ClipCount : clipcount;
Property ClipCount2 : clipcount2;
Default
{
//$Title Sparkster x3
//$Group Weapons
//$Sprite graphics/HUD/Icons/W_NewSparkster.png
//$Icon weapon
Tag "$T_NEWSPARKSTER";
Inventory.PickupMessage "$I_NEWSPARKSTER";
Obituary "$O_NEWSPARKSTER";
Inventory.Icon "graphics/HUD/Icons/W_NewSparkster.png";
Weapon.SlotNumber 6;
Weapon.SlotPriority 3.;
Weapon.SelectionOrder 625;
Weapon.AmmoType1 "SparksterBAmmo";
Weapon.AmmoGive1 1;
Weapon.AmmoType2 "SparksterRAmmo";
Weapon.AmmoGive2 1;
SWWMWeapon.DropAmmoType "RocketAmmo";
ModernSparkster.ClipCount 3;
ModernSparkster.ClipCount2 3;
Stamina 160000;
+SWWMWEAPON.NOFIRSTGIVE;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}

View file

@ -0,0 +1 @@
// Sparkster Carbine projectiles and effects

View file

@ -0,0 +1,28 @@
// Unissix Crafts Hand Of Divine (from Total Madness, the reboot not the original)
// Slot 1, spawns shared with Pusher
Class FistGun : SWWMWeapon
{
Default
{
//$Title Hand of Divine
//$Group Weapons
//$Sprite graphics/HUD/Icons/W_FistGun.png
//$Icon weapon
Tag "$T_FISTGUN";
Inventory.PickupMessage "$T_FISTGUN";
Obituary "$O_FISTGUN";
Inventory.Icon "graphics/HUD/Icons/W_FistGun.png";
Weapon.SlotNumber 1;
Weapon.SlotPriority 4.;
Weapon.SelectionOrder 1150;
Stamina 15000;
+WEAPON.MELEEWEAPON;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}

View file

@ -0,0 +1 @@
// Hand of Divine projectiles and effects

View file

@ -0,0 +1,41 @@
// Plutoni Inc. Mortal Rifle (from UnSX 2)
// Slot 9, spawns shared with Candy Gun
Class MisterRifle : SWWMWeapon
{
int clipcount;
bool chambered, gchambered;
Property ClipCount : clipcount;
Default
{
//$Title Mortal Rifle
//$Group Weapons
//$Sprite graphics/HUD/Icons/W_MortalRifle.png
//$Icon weapon
Tag "$T_MORTALRIFLE";
Inventory.PickupMessage "$T_MORTALRIFLE";
Obituary "$O_MORTALRIFLE";
Inventory.Icon "graphics/HUD/Icons/W_MortalRifle.png";
Weapon.SlotNumber 9;
Weapon.SlotPriority 3.;
Weapon.SelectionOrder 725;
Weapon.AmmoType1 "MisterAmmo";
Weapon.AmmoGive1 1;
Weapon.AmmoType2 "MisterGAmmo";
Weapon.AmmoGive2 1;
SWWMWeapon.DropAmmoType "MisterAmmo";
MisterRifle.ClipCount 30;
Stamina 2100000;
+SWWMWEAPON.NOFIRSTGIVE;
+WEAPON.EXPLOSIVE;
+WEAPON.BFG;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}

View file

@ -0,0 +1 @@
// Mortal Rifle projectiles and effects

View file

@ -0,0 +1,39 @@
// Nekuratek Rafan-Kos aka "The Ultimate Weapon" (from UnSX 4)
// Slot 0, spawns shared with Ynykron Artifact
Class RafanKos : SWWMWeapon
{
int clipcount;
bool chambered;
Property ClipCount : clipcount;
Default
{
//$Title Rafan-Kos
//$Group Weapons
//$Sprite graphics/HUD/Icons/W_RafanKos.png
//$Icon weapon
Tag "$T_RAFANKOS";
Inventory.PickupMessage "$T_RAFANKOS";
Obituary "$O_RAFANKOS";
Inventory.Icon "graphics/HUD/Icons/W_RafanKos.png";
Weapon.SlotNumber 0;
Weapon.SlotPriority 3.;
Weapon.SelectionOrder 7975;
Weapon.AmmoType1 "UltimateAmmo";
Weapon.AmmoGive1 1;
SWWMWeapon.DropAmmoType "UltimateAmmo";
RafanKos.ClipCount 4;
Stamina -5000000;
+SWWMWEAPON.NOFIRSTGIVE;
+WEAPON.EXPLOSIVE;
+WEAPON.BFG;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}

View file

@ -0,0 +1 @@
// Rafan-Kos projectiles and effects

View file

@ -60,7 +60,7 @@ extend Class SWWMHandler
Vector3 safepos;
double safeangle;
[safepos, safeangle] = level.PickPlayerStart(e.Args[0]);
players[e.Args[0]].mo.Teleport(safepos,safeangle,TF_TELEFRAG|TF_FORCED|TF_USESPOTZ);
players[e.Args[0]].mo.Teleport(safepos,safeangle,0);
}
else if ( e.Name ~== "swwmweaponcheat" )
{

View file

@ -326,7 +326,7 @@ extend Class SWWMHandler
}
SWWMCredits.Give(src.player,score);
if ( scr ) scr.score = score; // update final score
if ( !deathmatch && (level.killed_monsters+1 == level.total_monsters) && !allkills )
if ( !deathmatch && !(gameinfo.gametype&GAME_Hexen) && (level.killed_monsters+1 == level.total_monsters) && !allkills )
{
allkills = true;
SWWMCredits.Give(src.player,1000);

View file

@ -132,6 +132,8 @@ extend Class SWWMHandler
if ( !SWWMWeapon(i) ) continue;
SWWMWeapon(i).hastravelled = false;
}
// cap health to 200
if ( p.Health > 200 ) p.Health = p.mo.Health = 200;
}
override void PlayerRespawned( PlayerEvent e )

View file

@ -693,29 +693,28 @@ extend Class SWWMHandler
else if ( e.Replacee is 'Mana2' ) e.Replacement = 'FabricatorTier2';
else if ( e.Replacee is 'Mana3' ) e.Replacement = 'FabricatorTier3';
else if ( e.Replacee is 'ArtiBoostMana' ) e.Replacement = 'FabricatorTier4';
else if ( (e.Replacee is 'Backpack') || (e.Replacee is 'BagOfHolding') || (e.Replacee is 'ArtiPork') ) e.Replacement = 'HammerspaceEmbiggener';
else if ( (e.Replacee is 'FWeaponPiece1') || (e.Replacee is 'FWeaponPiece2')
else if ( (e.Replacee is 'Backpack') || (e.Replacee is 'BagOfHolding')
|| (e.Replacee is 'FWeaponPiece1') || (e.Replacee is 'FWeaponPiece2')
|| (e.Replacee is 'CWeaponPiece1') || (e.Replacee is 'CWeaponPiece3')
|| (e.Replacee is 'MWeaponPiece2') || (e.Replacee is 'MWeaponPiece3') ) e.Replacement = 'SWWMNothing';
|| (e.Replacee is 'MWeaponPiece2') || (e.Replacee is 'MWeaponPiece3') ) e.Replacement = 'HammerspaceEmbiggener';
else if ( e.Replacee is 'ArmorBonus' ) e.Replacement = 'ArmorNuggetItem';
else if ( e.Replacee is 'HealthBonus' ) e.Replacement = 'HealthNuggetItem';
else if ( (e.Replacee is 'ArtiTimeBomb') || (e.Replacee is 'ArtiBlastRadius') || (e.Replacee is 'ArtiPoisonBag') || (e.Replacee is 'ArtiHealingRadius') ) e.Replacement = (nugflip=!nugflip)?'HealthNuggetBundleSpawn':'ArmorNuggetBundleSpawn';
else if ( (e.Replacee is 'HealthBonus') ) e.Replacement = 'HealthNuggetItem';
else if ( (e.Replacee is 'Stimpack') || (e.Replacee is 'CrystalVial') ) e.Replacement = 'TetraHealthItem';
else if ( (e.Replacee is 'Medikit') || (e.Replacee is 'ArtiHealth') ) e.Replacement = 'CubeHealthItem';
else if ( (e.Replacee is 'Soulsphere') || (e.Replacee is 'ArtiSuperHealth') ) e.Replacement = 'RefresherItem';
else if ( (e.Replacee is 'Megasphere') || (e.Replacee is 'ArtiEgg') || (e.Replacee is 'ArtiBoostArmor') ) e.Replacement = 'GrilledCheeseSandwich';
else if ( (e.Replacee is 'Blursphere') || (e.Replacee is 'ArtiInvisibility') ) e.Replacement = (deathmatch||Random[Replacements](0,2)||SWWMUtility.ItemExists('Mykradvo',worldonly:true))?'GhostArtifact':'Mykradvo';
else if ( (e.Replacee is 'Blursphere') || (e.Replacee is 'ArtiInvisibility') ) e.Replacement = (deathmatch||Random[Replacements](0,2)||SWWMUtility.ItemExists('Mykradvo',worldonly:true)||!SWWMUtility.CheckNeedsItem('Mykradvo',true))?'GhostArtifact':'Mykradvo';
else if ( e.Replacee is 'Radsuit' ) e.Replacement = 'EBarrier';
else if ( (e.Replacee is 'ArtiFly') ) e.Replacement = 'GravitySuppressor';
else if ( (e.Replacee is 'InvulnerabilitySphere') || (e.Replacee is 'ArtiInvulnerability') || (e.Replacee is 'ArtiInvulnerability2') ) e.Replacement = (deathmatch||Random[Replacements](0,3)||SWWMUtility.ItemExists('Mykradvo',worldonly:true))?'FuckingInvinciball':'Mykradvo';
else if ( (e.Replacee is 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') || (e.Replacee == 'ArtiSpeedBoots') ) e.Replacement = (deathmatch||Random[Replacements](0,2)||SWWMUtility.ItemExists('Mykradvo',worldonly:true))?'Ragekit':'Mykradvo';
else if ( (e.Replacee is 'InvulnerabilitySphere') || (e.Replacee is 'ArtiInvulnerability') || (e.Replacee is 'ArtiInvulnerability2') ) e.Replacement = (deathmatch||Random[Replacements](0,3)||SWWMUtility.ItemExists('Mykradvo',worldonly:true)||!SWWMUtility.CheckNeedsItem('Mykradvo',true))?'FuckingInvinciball':'Mykradvo';
else if ( (e.Replacee is 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') || (e.Replacee == 'ArtiSpeedBoots') ) e.Replacement = (deathmatch||Random[Replacements](0,2)||SWWMUtility.ItemExists('Mykradvo',worldonly:true)||!SWWMUtility.CheckNeedsItem('Mykradvo',true))?'Ragekit':'Mykradvo';
else if ( (e.Replacee is 'AllMap') || (e.Replacee is 'SuperMap') ) e.Replacement = 'Omnisight';
else if ( (e.Replacee is 'Infrared') || (e.Replacee is 'ArtiTorch') ) e.Replacement = 'SWWMLamp';
else if ( (e.Replacee is 'GreenArmor') || (e.Replacee is 'SilverShield') || (e.Replacee is 'PlatinumHelm') || (e.Replacee is 'AmuletOfWarding') ) e.Replacement = 'BlastSuitItem';
else if ( (e.Replacee is 'BlueArmor') || (e.Replacee is 'EnchantedShield') || (e.Replacee is 'MeshArmor') || (e.Replacee is 'FalconShield') ) e.Replacement = 'WarArmorItem';
else if ( (e.Replacee is 'ArtiDarkServant') || (e.Replacee == 'ArtiTeleportOther') ) e.Replacement = 'ChanceboxSpawner';
else if ( e.Replacee is 'ArtiTeleport' ) e.Replacement = (gameinfo.GameType&GAME_Hexen)?'ChanceboxSpawner':'SWWMNothing';
else if ( (e.Replacee is 'ArtiDarkServant') || (e.Replacee == 'ArtiTeleportOther') || (e.Replacee == 'ArtiPork') ) e.Replacement = 'ChanceboxSpawner';
else if ( e.Replacee is 'ArtiTeleport' ) e.Replacement = 'SWWMNothing';
else
{
if ( profiling ) checkreplacement_ms += MSTime()-curms;

View file

@ -2,18 +2,17 @@
extend Class SWWMHandler
{
static clearscope void ClearAllShaders( PlayerInfo p )
static clearscope void ClearAllShaders( PlayerInfo p, bool noscope = false )
{
Shader.SetEnabled(p,"WaterWarp",false);
Shader.SetEnabled(p,"LavaWarp",false);
Shader.SetEnabled(p,"SlimeWarp",false);
Shader.SetEnabled(p,"ZoomBlur",false);
Shader.SetEnabled(p,"SilverScope",false);
if ( !noscope ) Shader.SetEnabled(p,"SilverScope",false);
Shader.SetEnabled(p,"BarrierShader",false);
Shader.SetEnabled(p,"GhostShader",false);
Shader.SetEnabled(p,"InvinciShader",false);
Shader.SetEnabled(p,"RagekitShader",false);
Shader.SetEnabled(p,"RagekitAltShader",false);
Shader.SetEnabled(p,"Glitch",false);
Shader.SetEnabled(p,"Grain",false);
}
@ -22,38 +21,26 @@ extend Class SWWMHandler
{
PlayerInfo p = players[consoleplayer];
let mo = p.mo;
if ( !mo ) return;
bool pc = (p.camera == mo);
if ( !mo || !swwm_shaders || !pc )
{
if ( !swwm_shaders ) ClearAllShaders(p,true);
return;
}
let rage = RagekitPower(mo.FindInventory("RagekitPower"));
if ( pc && rage && swwm_shaders )
if ( rage )
{
if ( swwm_rageshader )
{
Shader.SetEnabled(p,"RagekitShader",false);
Shader.SetEnabled(p,"RagekitAltShader",true);
Shader.SetUniform1f(p,"RagekitAltShader","timer",(gametic+e.FracTic)/GameTicRate);
double xstrastr = 1.+max(0,rage.lastpulse-(gametic+e.Fractic))/35.;
Shader.SetUniform1f(p,"RagekitAltShader","xtrastr",xstrastr**2.);
}
else
{
Shader.SetEnabled(p,"RagekitAltShader",false);
Shader.SetEnabled(p,"RagekitShader",true);
Shader.SetUniform1f(p,"RagekitShader","timer",(gametic+e.FracTic)/GameTicRate);
double xstrastr = 1.+max(0,rage.lastpulse-(gametic+e.Fractic))/35.;
Shader.SetUniform1f(p,"RagekitShader","xtrastr",xstrastr**2.);
}
}
else
{
Shader.SetEnabled(p,"RagekitShader",false);
Shader.SetEnabled(p,"RagekitAltShader",false);
Shader.SetEnabled(p,"RagekitShader",true);
Shader.SetUniform1f(p,"RagekitShader","timer",(gametic+e.FracTic)/GameTicRate);
double xstrastr = 1.+max(0,rage.lastpulse-(gametic+e.Fractic))/35.;
Shader.SetUniform1f(p,"RagekitShader","xtrastr",xstrastr**2.);
}
else Shader.SetEnabled(p,"RagekitShader",false);
let ghost = GhostPower(mo.FindInventory("GhostPower"));
if ( pc && ghost && swwm_shaders ) Shader.SetEnabled(p,"GhostShader",true);
if ( ghost ) Shader.SetEnabled(p,"GhostShader",true);
else Shader.SetEnabled(p,"GhostShader",false);
let sunny = InvinciballPower(mo.FindInventory("InvinciballPower"));
if ( pc && sunny && swwm_shaders )
if ( sunny )
{
Shader.SetEnabled(p,"InvinciShader",true);
double str = max(0,sunny.lastpulse-(gametic+e.Fractic))/35.;
@ -61,82 +48,13 @@ extend Class SWWMHandler
}
else Shader.SetEnabled(p,"InvinciShader",false);
let coat = BarrierPower(mo.FindInventory("BarrierPower"));
if ( pc && coat && swwm_shaders )
if ( coat )
{
Shader.SetEnabled(p,"BarrierShader",true);
Shader.SetUniform1f(p,"BarrierShader","timer",(gametic+e.FracTic)/GameTicRate);
}
else Shader.SetEnabled(p,"BarrierShader",false);
if ( pc && (mo is 'Demolitionist') && swwm_shaders )
{
let demo = Demolitionist(mo);
if ( demo.lastunder == Demolitionist.UNDER_WATER )
{
Shader.SetEnabled(p,"WaterWarp",true);
Shader.SetUniform1f(p,"WaterWarp","timer",(gametic+e.FracTic)/GameTicRate);
Shader.SetUniform1f(p,"WaterWarp","dfact",coat?.25:1.);
Shader.SetUniform3f(p,"WaterWarp","lightcol",(demo.undercol.r/255.,demo.undercol.g/255.,demo.undercol.b/255.));
}
else Shader.SetEnabled(p,"WaterWarp",false);
if ( demo.lastunder == Demolitionist.UNDER_LAVA )
{
Shader.SetEnabled(p,"LavaWarp",true);
Shader.SetUniform1f(p,"LavaWarp","timer",(gametic+e.FracTic)/GameTicRate);
Shader.SetUniform1f(p,"LavaWarp","dfact",coat?.25:1.);
Shader.SetUniform3f(p,"LavaWarp","lightcol",(demo.undercol.r/255.,demo.undercol.g/255.,demo.undercol.b/255.));
}
else Shader.SetEnabled(p,"LavaWarp",false);
if ( demo.lastunder == Demolitionist.UNDER_SLIME )
{
Shader.SetEnabled(p,"SlimeWarp",true);
Shader.SetUniform1f(p,"SlimeWarp","timer",(gametic+e.FracTic)/GameTicRate);
Shader.SetUniform1f(p,"SlimeWarp","dfact",coat?.25:1.);
Shader.SetUniform3f(p,"SlimeWarp","lightcol",(demo.undercol.r/255.,demo.undercol.g/255.,demo.undercol.b/255.));
}
else Shader.SetEnabled(p,"SlimeWarp",false);
int lastdmg = (demo.Health>0)?demo.lastdamage:Random[Flicker](60,80);
int lastdmgtic = (demo.Health>0)?demo.lastdamagetic:(gametic+Random[Flicker](30,20));
double noiz = min(lastdmg*.09*max(0,(lastdmgtic-(gametic+e.Fractic))/35.),.5);
Shader.SetEnabled(p,"Glitch",noiz>0);
Shader.SetEnabled(p,"Grain",noiz>0);
if ( noiz > 0 )
{
Shader.SetUniform1f(p,"Glitch","Timer",(gametic+e.FracTic)/GameTicRate);
Shader.SetUniform1f(p,"Grain","Timer",(gametic+e.FracTic)/GameTicRate);
Shader.SetUniform1f(p,"Grain","ni",noiz);
noiz = min(lastdmg*.08*max(0,(lastdmgtic-(gametic+e.Fractic))/35.),.8);
Shader.SetUniform1f(p,"Glitch","str1",noiz);
noiz = min(lastdmg*.03*max(0,(lastdmgtic-(gametic+e.Fractic))/35.),3.5);
Shader.SetUniform1f(p,"Glitch","str2",noiz);
}
if ( !demo.InStateSequence(demo.CurState,demo.FindState("Dash")) )
{
Shader.SetEnabled(p,"ZoomBlur",false);
return;
}
Shader.SetEnabled(p,"ZoomBlur",true);
Vector3 vel = demo.vel+demo.dashdir*demo.dashboost;
double baumpu = max(0.,(demo.bumptic-(gametic+e.Fractic))/35.);
vel += demo.dashdir*baumpu;
double spd = vel.length();
Vector3 worlddir = vel/spd;
Shader.SetUniform1f(p,"ZoomBlur","Fade",clamp((spd-20.)/60.,0.,1.));
double str = min(spd/40.,15.);
Vector3 x, y, z;
[x, y, z] = swwm_CoordUtil.GetAxes(e.ViewPitch,e.ViewAngle,e.ViewRoll);
Vector3 reldir = (worlddir dot y, worlddir dot z, worlddir dot x);
Vector2 centerspot = (.5+reldir.x*.5,.5+reldir.y*.5);
if ( reldir.z < 0 )
{
centerspot.x = 1.-centerspot.x;
centerspot.y = 1.-centerspot.y;
str *= -1;
}
Shader.SetUniform1f(p,"ZoomBlur","Str",str);
Shader.SetUniform2f(p,"ZoomBlur","CenterSpot",centerspot);
}
else
if ( !(mo is 'Demolitionist') )
{
Shader.SetEnabled(p,"WaterWarp",false);
Shader.SetEnabled(p,"LavaWarp",false);
@ -144,6 +62,73 @@ extend Class SWWMHandler
Shader.SetEnabled(p,"Glitch",false);
Shader.SetEnabled(p,"Grain",false);
Shader.SetEnabled(p,"ZoomBlur",false);
return;
}
let demo = Demolitionist(mo);
if ( demo.lastunder == Demolitionist.UNDER_WATER )
{
Shader.SetEnabled(p,"WaterWarp",true);
Shader.SetUniform1f(p,"WaterWarp","timer",(gametic+e.FracTic)/GameTicRate);
Shader.SetUniform1f(p,"WaterWarp","dfact",coat?.25:1.);
Shader.SetUniform3f(p,"WaterWarp","lightcol",(demo.undercol.r/255.,demo.undercol.g/255.,demo.undercol.b/255.));
}
else Shader.SetEnabled(p,"WaterWarp",false);
if ( demo.lastunder == Demolitionist.UNDER_LAVA )
{
Shader.SetEnabled(p,"LavaWarp",true);
Shader.SetUniform1f(p,"LavaWarp","timer",(gametic+e.FracTic)/GameTicRate);
Shader.SetUniform1f(p,"LavaWarp","dfact",coat?.25:1.);
Shader.SetUniform3f(p,"LavaWarp","lightcol",(demo.undercol.r/255.,demo.undercol.g/255.,demo.undercol.b/255.));
}
else Shader.SetEnabled(p,"LavaWarp",false);
if ( demo.lastunder == Demolitionist.UNDER_SLIME )
{
Shader.SetEnabled(p,"SlimeWarp",true);
Shader.SetUniform1f(p,"SlimeWarp","timer",(gametic+e.FracTic)/GameTicRate);
Shader.SetUniform1f(p,"SlimeWarp","dfact",coat?.25:1.);
Shader.SetUniform3f(p,"SlimeWarp","lightcol",(demo.undercol.r/255.,demo.undercol.g/255.,demo.undercol.b/255.));
}
else Shader.SetEnabled(p,"SlimeWarp",false);
int lastdmg = (demo.Health>0)?demo.lastdamage:Random[Flicker](60,80);
int lastdmgtic = (demo.Health>0)?demo.lastdamagetic:(gametic+Random[Flicker](30,20));
double noiz = min(lastdmg*.09*max(0,(lastdmgtic-(gametic+e.Fractic))/35.),.5);
Shader.SetEnabled(p,"Glitch",noiz>0);
Shader.SetEnabled(p,"Grain",noiz>0);
if ( noiz > 0 )
{
Shader.SetUniform1f(p,"Glitch","Timer",(gametic+e.FracTic)/GameTicRate);
Shader.SetUniform1f(p,"Grain","Timer",(gametic+e.FracTic)/GameTicRate);
Shader.SetUniform1f(p,"Grain","ni",noiz);
noiz = min(lastdmg*.08*max(0,(lastdmgtic-(gametic+e.Fractic))/35.),.8);
Shader.SetUniform1f(p,"Glitch","str1",noiz);
noiz = min(lastdmg*.03*max(0,(lastdmgtic-(gametic+e.Fractic))/35.),3.5);
Shader.SetUniform1f(p,"Glitch","str2",noiz);
}
if ( !demo.InStateSequence(demo.CurState,demo.FindState("Dash")) )
{
Shader.SetEnabled(p,"ZoomBlur",false);
return;
}
Shader.SetEnabled(p,"ZoomBlur",true);
Vector3 vel = demo.vel+demo.dashdir*demo.dashboost;
double baumpu = max(0.,(demo.bumptic-(gametic+e.Fractic))/35.);
vel += demo.dashdir*baumpu;
double spd = vel.length();
Vector3 worlddir = vel/spd;
Shader.SetUniform1f(p,"ZoomBlur","Fade",clamp((spd-20.)/60.,0.,1.));
double str = min(spd/40.,15.);
Vector3 x, y, z;
[x, y, z] = swwm_CoordUtil.GetAxes(e.ViewPitch,e.ViewAngle,e.ViewRoll);
Vector3 reldir = (worlddir dot y, worlddir dot z, worlddir dot x);
Vector2 centerspot = (.5+reldir.x*.5,.5+reldir.y*.5);
if ( reldir.z < 0 )
{
centerspot.x = 1.-centerspot.x;
centerspot.y = 1.-centerspot.y;
str *= -1;
}
Shader.SetUniform1f(p,"ZoomBlur","Str",str);
Shader.SetUniform2f(p,"ZoomBlur","CenterSpot",centerspot);
}
}

View file

@ -51,7 +51,7 @@ extend Class SWWMHandler
if ( players[i].itemcount > lastitemcount[i] )
{
int score = 10*(players[i].itemcount-lastitemcount[i]);
if ( !deathmatch && (level.total_items == level.found_items) && !allitems )
if ( !deathmatch && !(gameinfo.gametype&GAME_Hexen) && (level.total_items == level.found_items) && !allitems )
{
allitems = true;
Console.Printf(StringTable.Localize("$SWWM_LASTITEM"),players[i].GetUserName(),500);
@ -128,6 +128,8 @@ extend Class SWWMHandler
{
// not in DM
if ( deathmatch ) return;
// not in Hexen, due to its fully hub-based nature
if ( gameinfo.gametype&GAME_Hexen ) return;
if ( !mapclear && (restartmus > 0) )
{
restartmus--;

View file

@ -21,14 +21,14 @@ Class RedShell : Ammo
Inventory.Icon "graphics/HUD/Icons/A_ShellsNormal.png";
Inventory.Amount 1;
Inventory.MaxAmount 30;
Ammo.BackpackAmount 3;
Ammo.BackpackAmount 2;
Ammo.BackpackMaxAmount 80;
Ammo.DropAmount 2;
+FLOATBOB;
FloatBobStrength 0.25;
Radius 4;
Height 20;
Accuracy 30;
Accuracy 50;
}
States
{
@ -88,7 +88,7 @@ Class GreenShell : Ammo
FloatBobStrength 0.25;
Radius 4;
Height 20;
Accuracy 35;
Accuracy 55;
}
States
{
@ -147,7 +147,7 @@ Class WhiteShell : Ammo
+FLOATBOB;
FloatBobStrength 0.25;
Radius 4;
Accuracy 50;
Accuracy 70;
}
States
{
@ -207,7 +207,7 @@ Class BlueShell : Ammo
FloatBobStrength 0.25;
Radius 4;
Height 20;
Accuracy 45;
Accuracy 65;
}
States
{
@ -267,7 +267,7 @@ Class BlackShell : Ammo
FloatBobStrength 0.25;
Radius 4;
Height 20;
Accuracy 60;
Accuracy 75;
}
States
{
@ -327,7 +327,7 @@ Class PurpleShell : Ammo
FloatBobStrength 0.25;
Radius 4;
Height 20;
Accuracy 40;
Accuracy 60;
}
States
{
@ -484,14 +484,14 @@ Class EvisceratorShell : Ammo
Inventory.Icon "graphics/HUD/Icons/A_Eviscerator.png";
Inventory.Amount 1;
Inventory.MaxAmount 20;
Ammo.BackpackAmount 2;
Ammo.BackpackAmount 1;
Ammo.BackpackMaxAmount 60;
Ammo.DropAmount 1;
+FLOATBOB;
FloatBobStrength 0.25;
Radius 8;
Height 22;
Accuracy 40;
Accuracy 60;
}
override void ModifyDropAmount( int dropamount )
{
@ -566,7 +566,7 @@ Class HellblazerMissiles : Ammo
FloatBobStrength 0.25;
Radius 6;
Height 22;
Accuracy 60;
Accuracy 70;
}
override void ModifyDropAmount( int dropamount )
{
@ -635,7 +635,7 @@ Class HellblazerCrackshots : Ammo
FloatBobStrength 0.25;
Radius 6;
Height 22;
Accuracy 70;
Accuracy 75;
}
override void ModifyDropAmount( int dropamount )
{
@ -760,7 +760,7 @@ Class HellblazerWarheads : Ammo
FloatBobStrength 0.25;
Radius 6;
Height 22;
Accuracy 90;
Accuracy 85;
}
override void ModifyDropAmount( int dropamount )
{
@ -820,7 +820,7 @@ Class SparkUnit : Ammo
FloatBobStrength 0.25;
Radius 6;
Height 22;
Accuracy 50;
Accuracy 70;
}
override void ModifyDropAmount( int dropamount )
{
@ -879,7 +879,7 @@ Class SilverBulletAmmo : Ammo
FloatBobStrength 0.25;
Radius 10;
Height 26;
Accuracy 60;
Accuracy 75;
}
override void ModifyDropAmount( int dropamount )
{
@ -931,7 +931,7 @@ Class SilverBulletAmmo2 : Ammo
FloatBobStrength 0.25;
Radius 10;
Height 26;
Accuracy 70;
Accuracy 80;
}
override void ModifyDropAmount( int dropamount )
{
@ -1067,7 +1067,7 @@ Class CandyGunAmmo : Ammo
FloatBobStrength 0.25;
Radius 6;
Height 24;
Accuracy 80;
Accuracy 90;
}
override void ModifyDropAmount( int dropamount )
{
@ -1186,7 +1186,7 @@ Class YnykronAmmo : Ammo
//$Icon ammo
Tag "$T_YNYKRONAMMO";
Inventory.PickupMessage "$T_YNYKRONAMMO";
Stamina 3000000;
Stamina -3000000;
Inventory.Icon "graphics/HUD/Icons/A_Ynykron.png";
Inventory.Amount 1;
Inventory.MaxAmount 1;

View file

@ -18,22 +18,21 @@ Class SWWMShellAmmoSmall : SWWMAmmoSpawner
{
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('PuntzerBeta') || SWWMUtility.ItemExists('PuntzerGamma')) )
return Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05BundleSpawn';*/
switch( Random[Replacements](0,9) )
switch( Random[Replacements](0,8) )
{
case 0:
case 1:
case 2:
case 3:
return 'RedShell';
case 3:
case 4:
case 5:
case 6:
return 'GreenShell';
case 6:
case 7:
case 8:
return 'PurpleShell';
}
// case 9
// case 8
return 'BlueShell';
}
}
@ -44,11 +43,10 @@ Class SWWMShellAmmoBig : SWWMAmmoSpawner
static Class<Actor> PickAmmo( bool notondemand = false )
{
// shell types (sorted by rarity)
static const Class<Actor> redpool[] = {'RedShell','RedShell2','RedShell4'};
static const Class<Actor> greenpool[] = {'GreenShell','GreenShell2','GreenShell4'};
static const Class<Actor> whitepool[] = {'WhiteShell','WhiteShell2'};
static const Class<Actor> purplepool[] = {'PurpleShell','PurpleShell2','PurpleShell4'};
static const Class<Actor> bluepool[] = {'BlueShell','BlueShell2','BlueShell4'};
static const Class<Actor> redpool[] = {'RedShell','RedShell2'};
static const Class<Actor> greenpool[] = {'GreenShell','GreenShell2'};
static const Class<Actor> purplepool[] = {'PurpleShell','PurpleShell2'};
static const Class<Actor> bluepool[] = {'BlueShell','BlueShell2'};
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('PuntzerBeta') || SWWMUtility.ItemExists('PuntzerGamma')) )
return Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05BigAmmo';*/
switch( Random[Replacements](0,20) )
@ -58,28 +56,27 @@ Class SWWMShellAmmoBig : SWWMAmmoSpawner
case 2:
case 3:
case 4:
return redpool[Random[Replacements](0,1)];
case 5:
return redpool[Random[Replacements](0,2)];
case 6:
case 7:
case 8:
case 9:
return greenpool[Random[Replacements](0,1)];
case 10:
return greenpool[Random[Replacements](0,2)];
case 11:
case 12:
case 13:
return purplepool[Random[Replacements](0,1)];
case 14:
return purplepool[Random[Replacements](0,2)];
case 15:
case 16:
return bluepool[Random[Replacements](0,1)];
case 17:
return bluepool[Random[Replacements](0,2)];
case 18:
case 19:
return whitepool[Random[Replacements](0,1)];
return 'WhiteShell';
}
// case 20
// case 19-20
return 'BlackShell';
}
}
@ -91,7 +88,7 @@ Class SWWMClipAmmoBig : SWWMAmmoSpawner
{
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('HeavyMahsheenGun')) )
return Random[Replacements](0,2)?'SheenSmallAmmo':'SheenBigAmmo';*/
return Random[Replacements](0,3)?'EvisceratorShell':'EvisceratorBundleSpawn';
return Random[Replacements](0,5)?'EvisceratorShell':'EvisceratorBundleSpawn';
}
}
Class SWWMBlastAmmoSmall : SWWMAmmoSpawner
@ -113,7 +110,7 @@ Class SWWMBlastAmmoBig : SWWMAmmoSpawner
{
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('HeavyMahsheenGun')) )
return Random[Replacements](0,2)?'SheenBigAmmo':'SheenSmallAmmo';*/
return 'EvisceratorBundleSpawn';
return Random[Replacements](0,2)?'EvisceratorShell':'EvisceratorBundleSpawn';
}
}
Class SWWMRocketAmmoSmall : SWWMAmmoSpawner
@ -122,6 +119,7 @@ Class SWWMRocketAmmoSmall : SWWMAmmoSpawner
static Class<Actor> PickAmmo( bool notondemand = false )
{
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('ModernSparkster')) ) return Random[Replacements](0,2)?'SparksterBAmmo':'SparksterRAmmo';*/
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('Quadravol')) ) return 'QuadravolAmmo';*/
return Random[Replacements](0,2)?'HellblazerMissiles':'HellblazerCrackshots';
}
@ -132,6 +130,8 @@ Class SWWMRocketAmmoBig : SWWMAmmoSpawner
static Class<Actor> PickAmmo( bool notondemand = false )
{
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('ModernSparkster')) )
return Random[Replacements](0,2)?'SparksterAmmoBundleSpawn':'SparksterBigAmmoBundleSpawn';*/
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('Quadravol')) )
return Random[Replacements](0,2)?'QuadravolAmmo':'QuadravolAmmoBundleSpawn';*/
switch ( Random[Replacements](0,11) )
@ -141,12 +141,12 @@ Class SWWMRocketAmmoBig : SWWMAmmoSpawner
case 2:
case 3:
case 4:
return Random[Replacements](0,2)?'HellblazerMissiles':'HellblazerMissileBundleSpawn';
return Random[Replacements](0,4)?'HellblazerMissiles':'HellblazerMissileBundleSpawn';
case 5:
case 6:
case 7:
case 8:
return Random[Replacements](0,3)?'HellblazerCrackshots':'HellblazerCrackshotBundleSpawn';
return Random[Replacements](0,7)?'HellblazerCrackshots':'HellblazerCrackshotBundleSpawn';
case 9:
case 10:
return 'HellblazerRavagers';
@ -166,6 +166,7 @@ Class SWWMCellAmmoSmall : SWWMAmmoSpawner
{
if ( !Random[Replacements](0,3) )
{
/*if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('MisterRifle')) ) return 'MisterGAmmo';*/
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('RayKhom')) ) return 'RayBolt';*/
if ( notondemand || SWWMUtility.ItemExists('CandyGun') ) return 'CandyGunBullets';
}
@ -182,9 +183,19 @@ Class SWWMCellAmmoBig : SWWMAmmoSpawner
static Class<Actor> PickAmmo( bool notondemand = false )
{
if ( !Random[Replacements](0,3) )
{
//if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('GrandLance')) && SWWMUtility.CheckNeedsItem('GrandAmmo',true) && !SWWMUtility.ItemExists('GrandAmmo',worldonly:true) && !SWWMUtility.ItemExists('GrandLance',worldonly:true) )
// return 'GrandAmmo';
//if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('RafanKos')) && SWWMUtility.CheckNeedsItem('UltimateAmmo',true) && !SWWMUtility.ItemExists('UltimateAmmo',worldonly:true) && !SWWMUtility.ItemExists('RafanKos',worldonly:true) )
// return 'UltimateAmmo';
if ( (notondemand || SWWMUtility.ItemExists('Ynykron')) && SWWMUtility.CheckNeedsItem('YnykronAmmo',true) && !SWWMUtility.ItemExists('YnykronAmmo',worldonly:true) && !SWWMUtility.ItemExists('Ynykron',worldonly:true) )
return 'YnykronAmmo';
}
/*if ( Random[Replacements](0,1) )
{
if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('EMPCarbine')) ) return Random[Replacements](0,3)?'EMPCoreBundleSpawn':'EMPCore';
if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('MisterRifle')) ) return Random[Replacements](0,2)?'MisterRoundBundleSpawn':'MisterAmmo';
if ( notondemand || SWWMUtility.ItemExists('RayKhom') ) return Random[Replacements](0,2)?'RayBoltBundleSpawn':'RayAmmo';
}*/
if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('SilverBullet')) )
@ -192,8 +203,8 @@ Class SWWMCellAmmoBig : SWWMAmmoSpawner
if ( Random[Replacements](0,3) ) return Random[Replacements](0,2)?'SilverBulletsBundleSpawn':'SilverBullets2BundleSpawn';
return Random[Replacements](0,2)?'SilverBulletAmmo':'SilverBulletAmmo2';
}
if ( notondemand || SWWMUtility.ItemExists('CandyGun') ) return Random[Replacements](0,2)?'CandyGunBulletsBundleSpawn':'CandyGunAmmo';
if ( notondemand || SWWMUtility.ItemExists('CandyGun') ) return Random[Replacements](0,3)?'CandyGunBulletsBundleSpawn':'CandyGunAmmo';
/*if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('BlackfireIgniter')) ) return 'DarkCanister';*/
return Random[Replacements](0,2)?'SparkUnit':'SparkUnitBundleSpawn';
return Random[Replacements](0,3)?'SparkUnit':'SparkUnitBundleSpawn';
}
}

View file

@ -97,7 +97,7 @@ Class SWWMArmor : Armor abstract
if ( (amount <= 0) || DamageTypeDefinition.IgnoreArmor(damageType) || (damage <= 0) )
return;
SWWMHandler.DoFlash(Owner,Color(int(clamp(damage*.15,1,16)),255,224,192),3);
Owner.A_StartSound("armor/hit",CHAN_BODY,CHANF_DEFAULT,clamp(damage*.03,0.,1.),2.5);
Owner.A_StartSound("armor/hit",CHAN_DAMAGE,CHANF_OVERLAP,clamp(damage*.03,0.,1.),2.5);
saved = HandleDamage(damage,damageType,flags);
int healed = max(0,saved-damage);
saved = min(saved,damage);
@ -117,7 +117,7 @@ Class SWWMArmor : Armor abstract
else shouldautouse = CVar.GetCVar('swwm_autousearmor',Owner.player).GetBool();
if ( (amount <= (MaxAmount-default.Amount)) && (Owner.CountInv(parent) > 0) && shouldautouse )
{
if ( GetDefaultByType(parent).UseSound ) Owner.A_StartSound(GetDefaultByType(parent).UseSound,CHAN_ITEMEXTRA,CHANF_DEFAULT,.6);
if ( GetDefaultByType(parent).UseSound ) Owner.A_StartSound(GetDefaultByType(parent).UseSound,CHAN_ITEMEXTRA,CHANF_OVERLAP,.6);
int tgive = 0;
while ( (amount <= (MaxAmount-default.Amount)) && (Owner.CountInv(parent) > 0) )
{
@ -164,7 +164,7 @@ Class SWWMSpareArmor : Inventory abstract
let cur = Owner.FindInventory(giveme);
if ( !cur || (!pickup && (cur.Amount < cur.MaxAmount)) || (GetDefaultByType(giveme).Amount+cur.Amount <= cur.MaxAmount) )
{
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA,CHANF_OVERLAP);
Owner.GiveInventory(giveme,GetDefaultByType(giveme).Amount);
SWWMHandler.ArmorFlash(Owner.PlayerNumber());
SWWMScoreObj.Spawn(GetDefaultByType(giveme).Amount,Owner.Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+Owner.Height/2),ST_Armor);

View file

@ -128,7 +128,7 @@ Class SWWMHealth : Inventory abstract
let hnd = SWWMHandler(EventHandler.Find("SWWMHandler"));
if ( hnd ) hnd.tookdamage[Owner.PlayerNumber()] = true;
}
if ( ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
if ( ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA,CHANF_OVERLAP);
int tgive = 0;
bool morethanonce = false;
while ( (Amount > 0) && (newdamage > 0) )

View file

@ -723,13 +723,31 @@ Class ChanceboxSpawner : Actor
return;
}
int numbox = 0;
let ti = ThinkerIterator.Create("ChanceboxSpawner");
ThinkerIterator ti = ThinkerIterator.Create("Chancebox");
while ( ti.Next() ) numbox++;
ti = ThinkerIterator.Create("Chancebox");
while ( ti.Next() ) numbox++;
if ( numbox > 3 )
if ( numbox >= 3 )
{
// there's three boxes in the map already (plus ourselves)
// there's three boxes in the map already
Destroy();
return;
}
BlockLinesIterator bl = BlockLinesIterator.CreateFromPos(pos,32,32,CurSector);
double tbox[4];
// top, bottom, left, right
tbox[0] = pos.y+32;
tbox[1] = pos.y-32;
tbox[2] = pos.x-32;
tbox[3] = pos.x+32;
while ( bl.Next() )
{
Line l = bl.CurLine;
if ( !l ) continue;
if ( tbox[2] > l.bbox[3] ) continue;
if ( tbox[3] < l.bbox[2] ) continue;
if ( tbox[0] < l.bbox[1] ) continue;
if ( tbox[1] > l.bbox[0] ) continue;
if ( SWWMUtility.BoxOnLineSide(tbox[0],tbox[1],tbox[2],tbox[3],l) != -1 ) continue;
// there isn't enough space to spawn a box here
Destroy();
return;
}
@ -929,7 +947,15 @@ Class Chancebox : Actor
// no candidates? just burst into treats
if ( Random[Chancebox](0,1) )
{
let a = Spawn((!Random[Chancebox](0,2)&&SWWMUtility.ItemExists("Spreadgun"))?"GoldShell":(Random[Chancebox](0,1)&&SWWMUtility.ItemExists("Ynykron"))?"YnykronAmmo":"GrilledCheeseSandwich",pos);
Class<Inventory> vipammodrop = null;
if ( SWWMUtility.ItemExists("Ynykron") && Random[Chancebox](0,1) ) vipammodrop = "YnykronAmmo";
//if ( SWWMUtility.ItemExists("GrandLance") && Random[Chancebox](0,1) && !vipammodrop ) vipammodrop = "GrandAmmo";
//if ( SWWMUtility.ItemExists("RafanKos") && Random[Chancebox](0,1) && !vipammodrop ) vipammodrop = "UltimateAmmo";
if ( SWWMUtility.ItemExists("Spreadgun") && SWWMUtility.CheckNeedsItem("GoldShell",true) && !vipammodrop ) vipammodrop = "GoldShell";
Class<Inventory> vipitemdrop = null;
if ( SWWMUtility.CheckNeedsItem("Mykradvo",true) && !SWWMUtility.ItemExists("Mykradvo",worldonly:true) && Random[Chancebox](0,1) ) vipitemdrop = "Mykradvo";
if ( !vipitemdrop ) vipitemdrop = "GrilledCheeseSandwich";
let a = Spawn((!Random[Chancebox](0,2)&&vipammodrop)?vipammodrop:vipitemdrop,pos);
a.bDROPPED = false;
a.bNOGRAVITY = false;
a.vel.z = FRandom[Chancebox](2,4);

View file

@ -57,7 +57,7 @@ Class RefresherRegen : Powerup
if ( !Owner.GiveBody(int(Strength),500) ) return;
SWWMScoreObj.Spawn(int(Strength),Owner.Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+Owner.Height/2),ST_Health);
SWWMHandler.DoFlash(Owner,Color(32,224,128,255),10);
Owner.A_StartSound("powerup/refresher",CHAN_ITEM,CHANF_LOCAL,.4);
Owner.A_StartSound("powerup/refresher",CHAN_ITEMEXTRA,CHANF_LOCAL|CHANF_OVERLAP,.4);
if ( Owner is 'Demolitionist' )
Demolitionist(Owner).lastbump *= 0.99;
}

View file

@ -86,7 +86,7 @@ Class GrilledCheeseSandwich : Inventory
{
if ( pickup && !deathmatch ) return false;
if ( Owner.Health > 500 ) return false;
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA,CHANF_OVERLAP);
DoTheThing();
return true;
}
@ -115,7 +115,7 @@ Class GrilledCheeseSandwich : Inventory
if ( damageType == 'InstantDeath' )
SafeTeleport(); // get out of pits
newdamage = 0;
if ( (Owner.player == players[consoleplayer]) || bBigPowerup ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
if ( (Owner.player == players[consoleplayer]) || bBigPowerup ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA,CHANF_OVERLAP);
DoTheThing(true);
Amount--;
}
@ -135,7 +135,7 @@ Class GrilledCheeseSandwich : Inventory
safepos = lastsafepos[4];
safeangle = lastsafeangle[4];
}
Owner.Teleport(safepos,safeangle,TF_TELEFRAG|TF_FORCED|TF_USESPOTZ|TF_NOFOG);
Owner.Teleport(safepos,safeangle,0);
}
override void DoEffect()
{
@ -241,6 +241,15 @@ Class GrilledCheeseSandwich : Inventory
}
}
Mixin Class SWWMShadedPowerup
{
override Color GetBlend()
{
if ( swwm_shaders ) return 0;
return Super.GetBlend();
}
}
Class GhostSnd : Actor
{
Default
@ -334,6 +343,8 @@ Class GhostTarget : Actor
Class GhostPower : PowerInvisibility
{
Mixin SWWMShadedPowerup;
Actor snd;
Default
@ -360,7 +371,7 @@ Class GhostPower : PowerInvisibility
{
Super.EndEffect();
if ( !Owner ) return;
Owner.A_StartSound("powerup/ghostend",CHAN_ITEMEXTRA);
Owner.A_StartSound("powerup/ghostend",CHAN_ITEMEXTRA,CHANF_OVERLAP);
SWWMHandler.DoFlash(Owner,Color(96,224,192,255),20);
if ( Owner is 'Demolitionist' )
Demolitionist(Owner).lastbump *= 1.02;
@ -484,7 +495,7 @@ Class GhostArtifact : Inventory
override bool Use( bool pickup )
{
if ( pickup && !deathmatch ) return false;
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA,CHANF_OVERLAP);
let g = GhostPower(Owner.FindInventory("GhostPower"));
if ( g )
{
@ -569,6 +580,8 @@ Class GravSnd : Actor
Class GravityPower : Powerup
{
Mixin SWWMShadedPowerup;
Actor snd;
Default
@ -598,7 +611,7 @@ Class GravityPower : Powerup
Owner.bNOGRAVITY = false;
if ( Owner.pos.z > Owner.floorz ) Owner.player.centering = true;
}
Owner.A_StartSound("powerup/gravityend",CHAN_ITEMEXTRA);
Owner.A_StartSound("powerup/gravityend",CHAN_ITEMEXTRA,CHANF_OVERLAP);
if ( Owner is 'Demolitionist' )
Demolitionist(Owner).lastbump *= 1.02;
if ( (EffectTics <= 0) && Owner && Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_GRAVITYS"));
@ -636,7 +649,7 @@ Class GravitySuppressor : Inventory
override bool Use( bool pickup )
{
if ( pickup && !deathmatch ) return false;
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA,CHANF_OVERLAP);
let g = GravityPower(Owner.FindInventory("GravityPower"));
if ( g )
{
@ -765,6 +778,8 @@ Class InvinciSnd : Actor
Class InvinciballPower : Powerup
{
Mixin SWWMShadedPowerup;
Actor l, snd;
int lasteffect;
transient int lastpulse;
@ -804,7 +819,7 @@ Class InvinciballPower : Powerup
{
Super.EndEffect();
if ( !Owner ) return;
Owner.A_StartSound("powerup/invinciballend",CHAN_ITEMEXTRA);
Owner.A_StartSound("powerup/invinciballend",CHAN_ITEMEXTRA,CHANF_OVERLAP);
SWWMHandler.DoFlash(Owner,Color(96,255,64,0),20);
if ( Owner is 'Demolitionist' )
Demolitionist(Owner).lastbump *= 1.05;
@ -846,7 +861,7 @@ Class InvinciballPower : Powerup
if ( level.maptime > lasteffect+5 )
{
SWWMHandler.DoFlash(Owner,Color(64,255,64,0),15);
Owner.A_StartSound("powerup/invinciballhit",CHAN_POWERUP);
Owner.A_StartSound("powerup/invinciballhit",CHAN_POWERUP,CHANF_OVERLAP);
lasteffect = level.maptime;
lastpulse = max(lastpulse,gametic+20);
if ( Owner is 'Demolitionist' )
@ -881,7 +896,7 @@ Class FuckingInvinciball : Inventory
override bool Use( bool pickup )
{
if ( pickup && !deathmatch ) return false;
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA,CHANF_OVERLAP);
Owner.A_StartSound("misc/sundowner",CHAN_POWERUPEXTRA);
let i = InvinciballPower(Owner.FindInventory("InvinciballPower"));
if ( i )
@ -1014,6 +1029,8 @@ Class RageSnd : Actor
Class RagekitPower : Powerup
{
Mixin SWWMShadedPowerup;
Actor l, snd;
int lasteffect;
transient int lastpulse, lastrage;
@ -1071,7 +1088,7 @@ Class RagekitPower : Powerup
lastrage = SWWMHandler.AddOneliner("ragekit",2,5)+40;
Owner.A_QuakeEx(2,2,2,Random[Rage](1,2),0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.5);
lastpulse = max(lastpulse,gametic+10);
Demolitionist(Owner).lastbump *= .98;
Demolitionist(Owner).lastbump *= .995;
}
}
@ -1079,7 +1096,7 @@ Class RagekitPower : Powerup
{
Super.EndEffect();
if ( !Owner ) return;
Owner.A_StartSound("powerup/ragekitend",CHAN_ITEMEXTRA);
Owner.A_StartSound("powerup/ragekitend",CHAN_ITEMEXTRA,CHANF_OVERLAP);
SWWMHandler.DoFlash(Owner,Color(128,255,0,0),30);
Owner.A_QuakeEx(4,4,4,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.);
Owner.A_AlertMonsters(2000);
@ -1120,7 +1137,7 @@ Class RagekitPower : Powerup
Owner.A_QuakeEx(8,8,8,Random[Rage](3,8),0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.);
if ( (Owner.player == players[consoleplayer]) && (gametic > lastrage) && (swwm_mutevoice < 2) )
lastrage = SWWMHandler.AddOneliner("ragekit",2,5)+40;
Owner.A_StartSound("powerup/ragekithit",CHAN_POWERUP);
Owner.A_StartSound("powerup/ragekithit",CHAN_POWERUP,CHANF_OVERLAP);
lasteffect = level.maptime;
lastpulse = max(lastpulse,gametic+35);
Demolitionist(Owner).lastbump *= .9;
@ -1250,7 +1267,7 @@ Class Omnisight : Inventory
{
if ( Owner.player == players[consoleplayer] )
{
Owner.A_StartSound("powerup/omnisight",CHAN_ITEMEXTRA);
Owner.A_StartSound("powerup/omnisight",CHAN_ITEMEXTRA,CHANF_OVERLAP);
// automatically zoom out so the player can know how far this goes
CVar.FindCVar('swwm_mm_zoom').SetFloat(2.);
}
@ -1268,7 +1285,7 @@ Class Omnisight : Inventory
if ( i == consoleplayer )
{
Console.Printf(StringTable.Localize("$D_OMNISHARE"),Owner.player.GetUserName());
players[i].mo.A_StartSound("powerup/omnisight",CHAN_ITEMEXTRA);
players[i].mo.A_StartSound("powerup/omnisight",CHAN_ITEMEXTRA,CHANF_OVERLAP);
// automatically zoom out so the player can know how far this goes
CVar.FindCVar('swwm_mm_zoom').SetFloat(2.);
}
@ -1843,7 +1860,7 @@ Class CompanionLamp : Actor
{
if ( SWWMLamp(master) && SWWMLamp(master).bActive )
{
A_StartSound("lamp/on",CHAN_ITEMEXTRA);
A_StartSound("lamp/on",CHAN_ITEMEXTRA,CHANF_OVERLAP);
return ResolveState("Active");
}
return ResolveState(null);
@ -1855,7 +1872,7 @@ Class CompanionLamp : Actor
A_Moth();
if ( !SWWMLamp(master) || !SWWMLamp(master).bActive )
{
A_StartSound("lamp/off",CHAN_ITEMEXTRA);
A_StartSound("lamp/off",CHAN_ITEMEXTRA,CHANF_OVERLAP);
return ResolveState("Spawn");
}
return ResolveState(null);
@ -1970,7 +1987,7 @@ Class SWWMLamp : Inventory
bActive = false;
bActivated = false;
}
clearscope bool isBlinking()
clearscope bool isBlinking() const
{
return ( (Charge < 10) && (level.maptime&8) );
}
@ -2071,6 +2088,8 @@ Class BarrierSnd : Actor
Class BarrierPower : PowerIronFeet
{
Mixin SWWMShadedPowerup;
Actor snd, l;
Default
@ -2126,7 +2145,7 @@ Class BarrierPower : PowerIronFeet
{
Super.EndEffect();
if ( !Owner ) return;
Owner.A_StartSound("powerup/barrierend",CHAN_ITEMEXTRA);
Owner.A_StartSound("powerup/barrierend",CHAN_ITEMEXTRA,CHANF_OVERLAP);
if ( Owner is 'Demolitionist' )
Demolitionist(Owner).lastbump *= 0.95;
if ( (EffectTics <= 0) && Owner && Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_BARRIER"));
@ -2151,10 +2170,12 @@ Class EBarrier : Inventory
Mixin SWWMRespawn;
Mixin SWWMPickupGlow;
int terrainwait;
override bool Use( bool pickup )
{
if ( pickup && !deathmatch ) return false;
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA,CHANF_OVERLAP);
let b = BarrierPower(Owner.FindInventory("BarrierPower"));
if ( b )
{
@ -2185,6 +2206,52 @@ Class EBarrier : Inventory
tracer.target = self;
tracer.FloatBobPhase = FloatBobPhase;
}
override void DoEffect()
{
Super.DoEffect();
// check terrain for auto-use
let b = Powerup(Owner.FindInventory("BarrierPower"));
if ( b && (b.EffectTics > 5) )
{
terrainwait = 20;
return;
}
bool damageterrain = false;
// check any 3d floors first
for ( int i=0; i<Owner.CurSector.Get3DFloorCount(); i++ )
{
F3DFloor ff = Owner.CurSector.Get3DFloor(i);
if ( !(ff.flags&(F3DFloor.FF_EXISTS|F3DFloor.FF_SWIMMABLE)) ) continue;
if ( (ff.model.DamageAmount <= 0) || (ff.model.damageinterval <= 0) ) continue;
if ( ff.top.ZAtPoint(Owner.pos.xy) <= Owner.pos.z ) continue;
if ( ff.bottom.ZAtPoint(Owner.pos.xy) >= (Owner.pos.z+Owner.Height) ) continue;
damageterrain = true;
break;
}
if ( !damageterrain && (Owner.pos.z <= Owner.floorz) )
{
if ( (Owner.floorsector.damageamount > 0) && (Owner.floorsector.damageinterval > 0) ) damageterrain = true;
else
{
let t = Owner.GetFloorTerrain();
if ( t && (t.DamageAmount > 0) && (t.DamageTimeMask > 0) )
damageterrain = true;
}
}
if ( !damageterrain )
{
terrainwait = max(0,terrainwait-1);
return;
}
else terrainwait++;
if ( terrainwait <= 20 ) return;
terrainwait = 0;
bool shouldautouse = false;
if ( swwm_enforceautousebarrier == 1 ) shouldautouse = true;
else if ( swwm_enforceautousebarrier == -1 ) shouldautouse = false;
else shouldautouse = CVar.GetCVar('swwm_autousebarrier',Owner.player).GetBool();
if ( shouldautouse ) Owner.UseInventory(self);
}
Default
{
@ -2760,7 +2827,7 @@ Class Mykradvo : Inventory
override bool Use( bool pickup )
{
if ( pickup && !deathmatch ) return false;
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA,CHANF_OVERLAP);
Vector3 spawnpos = Owner.Vec3Angle(15,Owner.angle,Owner.Height*.7);
if ( !FindTargets(Owner) )
{
@ -2807,7 +2874,7 @@ Class Mykradvo : Inventory
s.pitch = pt;
s.ReactionTime += Random[ExploS](-2,2);
}
A_StartSound("mykradvo/smallarc",CHAN_WEAPON);
A_StartSound("mykradvo/smallarc",CHAN_WEAPON,CHANF_OVERLAP,attenuation:3.);
A_SetTics(Random[Mykradvo](10,50));
}
@ -2872,13 +2939,13 @@ Class Mykradvo : Inventory
//$Sprite graphics/HUD/Icons/I_Mykradvo.png
//$Icon powerup
Tag "$T_MYKRADVO";
Stamina 1200000;
Stamina -1200000;
Inventory.Icon "graphics/HUD/Icons/I_Mykradvo.png";
Inventory.PickupSound "misc/p_pkup";
Inventory.UseSound "mykradvo/arc";
Inventory.PickupMessage "$T_MYKRADVO";
Inventory.MaxAmount 5;
Inventory.InterHubAmount 5;
Inventory.MaxAmount 3;
Inventory.InterHubAmount 3;
Inventory.PickupFlash "SWWMPurplePickupFlash";
+INVENTORY.ALWAYSPICKUP;
+INVENTORY.AUTOACTIVATE;
@ -2908,7 +2975,7 @@ Class MykradvoX : GhostArtifactX
override void PostBeginPlay()
{
Super.PostBeginPlay();
A_StartSound("powerup/mykradvoamb",CHAN_VOICE,CHANF_LOOP);
A_StartSound("powerup/mykradvoamb",CHAN_VOICE,CHANF_LOOP,attenuation:2.);
}
override void Tick()
{

View file

@ -3203,15 +3203,14 @@ Class DemolitionistMenu : GenericMenu
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
int clscol = Font.CR_WHITE;
if ( invlist[i] is 'Weapon' ) clscol = Font.CR_GOLD;
else if ( invlist[i] is 'MagAmmo' ) clscol = Font.CR_TAN;
if ( invlist[i] is 'Weapon' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPGold'):Font.CR_GOLD;
else if ( invlist[i] is 'MagAmmo' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPTan'):Font.CR_TAN;
else if ( (invlist[i] is 'BackpackItem') || (invlist[i] is 'HammerspaceEmbiggener') ) clscol = Font.CR_DARKBROWN;
else if ( invlist[i] is 'Ammo' ) clscol = Font.CR_BROWN;
else if ( (invlist[i] is 'PowerupGiver') || (invlist[i] is 'AmmoFabricator') || invlist[i].bBIGPOWERUP ) clscol = Font.CR_PURPLE;
else if ( invlist[i] is 'Ammo' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPBrown'):Font.CR_BROWN;
else if ( (invlist[i] is 'PowerupGiver') || (invlist[i] is 'AmmoFabricator') || invlist[i].bBIGPOWERUP ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPPurple'):Font.CR_PURPLE;
else if ( (invlist[i] is 'Health') || (invlist[i] is 'HealthPickup') || (invlist[i] is 'SWWMHealth') ) clscol = Font.CR_RED;
else if ( (invlist[i] is 'Armor') || (invlist[i] is 'SWWMSpareArmor') ) clscol = Font.CR_GREEN;
else if ( invlist[i] is 'PuzzleItem' ) clscol = Font.CR_LIGHTBLUE;
else if ( invlist[i] is 'SWWMCollectible' ) clscol = Font.CR_FIRE;
Screen.DrawText(fnt,clscol,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i!=sel0)?Color(96,0,0,0):Color(0,0,0,0));
yy += 16;
if ( yy >= 370 )
@ -3263,15 +3262,14 @@ Class DemolitionistMenu : GenericMenu
else if ( (invlist[i].Amount > 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
else str = invlist[i].GetTag();
int clscol = Font.CR_WHITE;
if ( invlist[i] is 'Weapon' ) clscol = Font.CR_GOLD;
else if ( invlist[i] is 'MagAmmo' ) clscol = Font.CR_TAN;
if ( invlist[i] is 'Weapon' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPGold'):Font.CR_GOLD;
else if ( invlist[i] is 'MagAmmo' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPTan'):Font.CR_TAN;
else if ( (invlist[i] is 'BackpackItem') || (invlist[i] is 'HammerspaceEmbiggener') ) clscol = Font.CR_DARKBROWN;
else if ( invlist[i] is 'Ammo' ) clscol = Font.CR_BROWN;
else if ( (invlist[i] is 'PowerupGiver') || (invlist[i] is 'AmmoFabricator') || invlist[i].bBIGPOWERUP ) clscol = Font.CR_PURPLE;
else if ( invlist[i] is 'Ammo' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPBrown'):Font.CR_BROWN;
else if ( (invlist[i] is 'PowerupGiver') || (invlist[i] is 'AmmoFabricator') || invlist[i].bBIGPOWERUP ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPPurple'):Font.CR_PURPLE;
else if ( (invlist[i] is 'Health') || (invlist[i] is 'HealthPickup') || (invlist[i] is 'SWWMHealth') ) clscol = Font.CR_RED;
else if ( (invlist[i] is 'Armor') || (invlist[i] is 'SWWMSpareArmor') ) clscol = Font.CR_GREEN;
else if ( invlist[i] is 'PuzzleItem' ) clscol = Font.CR_LIGHTBLUE;
else if ( invlist[i] is 'SWWMCollectible' ) clscol = Font.CR_FIRE;
Screen.DrawText(fnt,clscol,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i!=sel1)?Color(96,0,0,0):Color(0,0,0,0));
yy += 16;
if ( yy >= 370 )
@ -3464,11 +3462,11 @@ Class DemolitionistMenu : GenericMenu
else if ( (storeunits[i] > 1) || (storelist[i] is 'Ammo') ) str = String.Format("%dx %s",storeunits[i],def.GetTag());
else str = def.GetTag();
int clscol = Font.CR_WHITE;
if ( storelist[i] is 'Weapon' ) clscol = Font.CR_GOLD;
else if ( storelist[i] is 'MagAmmo' ) clscol = Font.CR_TAN;
if ( storelist[i] is 'Weapon' ) clscol = SWWMUtility.IsVIPItemClass(storelist[i])?Font.FindFontColor('VIPGold'):Font.CR_GOLD;
else if ( storelist[i] is 'MagAmmo' ) clscol = SWWMUtility.IsVIPItemClass(storelist[i])?Font.FindFontColor('VIPTan'):Font.CR_TAN;
else if ( (storelist[i] is 'BackpackItem') || (storelist[i] is 'HammerspaceEmbiggener') ) clscol = Font.CR_DARKBROWN;
else if ( storelist[i] is 'Ammo' ) clscol = Font.CR_BROWN;
else if ( (storelist[i] is 'PowerupGiver') || (storelist[i] is 'AmmoFabricator') || def.bBIGPOWERUP ) clscol = Font.CR_PURPLE;
else if ( storelist[i] is 'Ammo' ) clscol = SWWMUtility.IsVIPItemClass(storelist[i])?Font.FindFontColor('VIPBrown'):Font.CR_BROWN;
else if ( (storelist[i] is 'PowerupGiver') || (storelist[i] is 'AmmoFabricator') || def.bBIGPOWERUP ) clscol = SWWMUtility.IsVIPItemClass(storelist[i])?Font.FindFontColor('VIPPurple'):Font.CR_PURPLE;
else if ( (storelist[i] is 'Health') || (storelist[i] is 'HealthPickup') || (storelist[i] is 'SWWMHealth') ) clscol = Font.CR_RED;
else if ( (storelist[i] is 'Armor') || (storelist[i] is 'SWWMSpareArmor') ) clscol = Font.CR_GREEN;
Screen.DrawText(fnt,clscol,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i!=sel0)?Color(96,0,0,0):Color(0,0,0,0));

View file

@ -121,10 +121,11 @@ Class SWWMStatScreen : StatusScreen abstract
{
// skip DLC tips for now
if ( (i >= 59) && (i <= 68) ) continue;
if ( (i >= 130) && (i <= 139) ) continue;
ents.Push(i);
}
// account for skipped dlc tips (important, will crash otherwise)
maxtip -= 10;
maxtip -= 20;
if ( pdata.lasttip.Size() >= maxtip )
{
// exclude last one, start over

View file

@ -612,6 +612,8 @@ Class mkFlyingGib : Actor
{
A_Bleed();
A_StartSound("misc/gibhit",CHAN_BODY,CHANF_OVERLAP);
// oops we got squished
if ( floorz >= ceilingz ) ExplodeMissile(null,null);
}
Goto Spawn;
Death:

View file

@ -173,7 +173,7 @@ Class Demolitionist : PlayerPawn
let type = (class<Ammo>)(AllActorClasses[i]);
if ( !type || (type.GetParentClass() != "Ammo") )
continue;
// Only give if it's for a valid weapon, unless using "give everything"
// Only give if it's for a valid weapon
bool isvalid = false;
for ( int j=0; j<validweapons.Size(); j++ )
{
@ -189,7 +189,7 @@ Class Demolitionist : PlayerPawn
break;
}
}
if ( !isvalid && (giveall != ALL_YESYES) ) continue;
if ( !isvalid ) continue;
let ammoitem = FindInventory(type);
if ( !ammoitem )
{
@ -207,19 +207,12 @@ Class Demolitionist : PlayerPawn
if ( !type || (type.GetParentClass() != "MagAmmo") )
continue;
let pamo = GetDefaultByType(type).ParentAmmo;
// Only give if it's for a valid weapon, unless using "give everything"
// Only give if it's for a valid weapon
bool isvalid = false;
for ( int j=0; j<AllActorClasses.Size(); j++ )
for ( int j=0; j<validweapons.Size(); j++ )
{
let type2 = (class<Weapon>)(AllActorClasses[j]);
if ( !type2 ) continue;
let rep = GetReplacement(type2);
if ( (rep != type2) && !(rep is "DehackedPickup") ) continue;
readonly<Weapon> weap = GetDefaultByType(type2);
if ( !player.weapons.LocateWeapon(type2) || weap.bCheatNotWeapon || !weap.CanPickup(self) ) continue;
let ready = weap.FindState("Ready");
if ( !ready || !ready.ValidateSpriteFrame() ) continue;
if ( (type2 is 'SWWMWeapon') && SWWMWeapon(weap).UsesAmmo(pamo) )
readonly<Weapon> weap = GetDefaultByType(validweapons[j]);
if ( (validweapons[j] is 'SWWMWeapon') && SWWMWeapon(weap).UsesAmmo(pamo) )
{
isvalid = true;
break;
@ -230,7 +223,7 @@ Class Demolitionist : PlayerPawn
break;
}
}
if ( !isvalid && (giveall != ALL_YESYES) ) continue;
if ( !isvalid ) continue;
let magitem = FindInventory(type);
if ( !magitem )
{
@ -341,6 +334,9 @@ Class Demolitionist : PlayerPawn
{
let type = (class<Inventory>)(AllActorClasses[i]);
if ( !type ) continue;
let rep = GetReplacement(type);
// don't give replaced items
if ( rep != type ) continue;
// no fabricators before hexen
if ( !(gameinfo.gametype&GAME_HEXEN) && (type is 'AmmoFabricator') ) continue;
// no barriers outside doom
@ -381,6 +377,7 @@ Class Demolitionist : PlayerPawn
SWWMCollectible(item).propagated = true; // no score or anims
if ( !item.CallTryPickup(self) ) item.Destroy();
}
if ( !giveall ) return;
}
if ( giveall ) return;
let type = name;
@ -882,6 +879,7 @@ Class Demolitionist : PlayerPawn
{
if ( !FindInventory("GrilledCheeseSafeguard") && !(healtimer%5) )
A_SetHealth(health-1);
if ( health <= 500 ) healcooldown = 20;
}
else if ( health > 200 )
{
@ -2515,7 +2513,7 @@ Class Demolitionist : PlayerPawn
int score = 100;
// last secret (this is called before counting it up, so have to subtract)
let hnd = SWWMHandler(EventHandler.Find("SWWMHandler"));
if ( !deathmatch && (level.found_secrets == level.total_secrets-1) && (!hnd || !hnd.allsecrets) )
if ( !deathmatch && !(gameinfo.gametype&GAME_Hexen) && (level.found_secrets == level.total_secrets-1) && (!hnd || !hnd.allsecrets) )
{
if ( hnd ) hnd.allsecrets = true;
score = 1000;

View file

@ -1538,6 +1538,7 @@ Class SWWMUtility
if ( StringTable.Localize("$SWWM_SELLEXTRA_FEM") == "SWWM_SELLEXTRA_FEM" )
return false;
if ( i is 'DeepImpact' ) return true;
if ( i is 'FistGun' ) return true;
if ( i is 'ExplodiumGun' ) return true;
if ( i is 'Wallbuster' ) return true;
if ( i is 'HeavyMahSheenGun' ) return true;
@ -1547,6 +1548,7 @@ Class SWWMUtility
if ( i is 'CandyGun' ) return true;
if ( i is 'RayKhom' ) return true;
if ( i is 'GrandLance' ) return true;
if ( i is 'RayKhom' ) return true;
if ( i is 'HealthNuggetItem' ) return true;
if ( i is 'ArmorNuggetItem' ) return true;
if ( i is 'WarArmor' ) return true;
@ -1651,9 +1653,9 @@ Class SWWMUtility
return true;
if ( target is 'SWWMCollectible' )
return true;
if ( (target is 'Ynykron') || (target is 'GrandLance') )
if ( (target is 'Ynykron') || (target is 'GrandLance') || (target is 'RayKhom') )
return true;
if ( (target is 'GoldShell') || (target is 'YnykronAmmo') || (target is 'GrandAmmo') || (target is 'GrandSpear') )
if ( (target is 'GoldShell') || (target is 'YnykronAmmo') || (target is 'GrandAmmo') || (target is 'GrandSpear') || (target is 'UltimatePod') || (target is 'UltimateAmmo') )
return true;
if ( target is 'Mykradvo' )
return true;
@ -1662,6 +1664,18 @@ Class SWWMUtility
return false;
}
// used by the store
static bool IsVipItemClass( Class<Actor> target )
{
if ( (target is 'Ynykron') || (target is 'GrandLance') || (target is 'RayKhom') )
return true;
if ( (target is 'GoldShell') || (target is 'YnykronAmmo') || (target is 'GrandAmmo') || (target is 'GrandSpear') || (target is 'UltimatePod') || (target is 'UltimateAmmo') )
return true;
if ( target is 'Mykradvo' )
return true;
return false;
}
static bool IsScoreItem( Actor target )
{
if ( target is 'Key' )
@ -1735,12 +1749,20 @@ Class SWWMUtility
if ( CheckNeedsItem(b) ) return b;
return Random[Replacements](weight,0)?a:b;
}
static private Class<Inventory> PickTrio( Class<Inventory> a, Class<Inventory> b, Class<Inventory> c, int weight1 = 1, int weight2 = 1 )
{
if ( CheckNeedsItem(a) ) return a;
if ( CheckNeedsItem(b) ) return b;
if ( CheckNeedsItem(c) ) return c;
return Random[Replacements](weight1,0)?a:Random[Replacements](weight2,0)?b:c;
}
static Class<Inventory> PickSWWMSlot1()
{
if ( CheckNeedsItem('ExplodiumGun',true) && Random[Replacements](0,1) ) return 'ExplodiumGun';
/*if ( CheckNeedsItem('PlasmaBlast',true) && Random[Replacements](0,1) ) return 'PlasmaBlast';
return PickPair('PusherWeapon','ItamexHammer');*/
//if ( CheckNeedsItem('PlasmaBlast',true) && Random[Replacements](0,1) ) return 'PlasmaBlast';
//return PickTrio('PusherWeapon','ItamexHammer','FistGun');
//return PickPair('PusherWeapon','ItamexHammer');
return 'PusherWeapon';
}
static Class<Inventory> PickSWWMSlot2()
@ -1765,6 +1787,7 @@ Class SWWMUtility
}
static Class<Inventory> PickSWWMSlot6()
{
//return PickTrip('Hellblazer','Quadravol','ModernSparkster');
//return PickPair('Hellblazer','Quadravol');
return 'Hellblazer';
}
@ -1780,23 +1803,41 @@ Class SWWMUtility
}
static Class<Inventory> PickSWWMSlot9()
{
//return PickTrio('CandyGun','RayKhom','MisterRifle');
//return PickPair('CandyGun','RayKhom');
return 'CandyGun';
}
static Class<Inventory> PickSWWMSlot0()
{
//return PickPair('Ynykron','GrandLance');
return 'Ynykron';
/*if ( !CheckNeedsItem('Ynykron') )
{
if ( !CheckNeedsItem('GrandLance') )
{
if ( !CheckNeedsItem('RafanKos') )
return PickSWWMSlot9();
return 'RafanKos';
}
if ( !CheckNeedsItem('RafanKos') )
return 'GrandLance';
return PickPair('GrandLance','RafanKos');
}
return PickTrio('Ynykron','GrandLance','RafanKos');*/
/*if ( !CheckNeedsItem('Ynykron') )
{
if ( !CheckNeedsItem('GrandLance') )
return PickSWWMSlot9();
return 'GrandLance';
}
return PickPair('Ynykron','GrandLance');*/
return !CheckNeedsItem('Ynykron')?'CandyGun':'Ynykron';
}
static Class<Inventory> PickDoomSlot6()
{
//return PickPair(PickSWWMSlot7(),PickSWWMSlot8(),2);
return PickPair('Sparkster','SilverBullet',2);
return PickPair(PickSWWMSlot7(),PickSWWMSlot8(),2);
}
static Class<Inventory> PickDoomSlot7()
{
//return PickPair(PickSWWMSlot9(),PickSWWMSlot0(),2);
return PickPair('CandyGun','Ynykron',2);
return PickPair(PickSWWMSlot9(),PickSWWMSlot0(),2);
}
static Class<Inventory> PickHereticSlot3() // also used for Doom 1
{

View file

@ -334,7 +334,7 @@ Class HellblazerMissile : Actor
A_SetRenderStyle(1.0,STYLE_Add);
A_SprayDecal("BigRocketBlast",50);
A_SetScale(4.5);
SWWMUtility.DoExplosion(self,250,320000,200,90);
SWWMUtility.DoExplosion(self,150,320000,200,90);
A_NoGravity();
A_QuakeEx(5,5,5,15,0,1500,"",QF_RELATIVE|QF_SCALEDOWN,falloff:500,rollIntensity:.8);
A_StopSound(CHAN_BODY);
@ -431,7 +431,7 @@ Class HellblazerCrackshot : HellblazerMissile
A_SetRenderStyle(1.0,STYLE_Add);
A_SprayDecal("BigRocketBlast",50);
A_SetScale(3.);
SWWMUtility.DoExplosion(self,200,320000,160,60);
SWWMUtility.DoExplosion(self,120,320000,160,60);
A_NoGravity();
A_QuakeEx(4,4,4,12,0,1200,"",QF_RELATIVE|QF_SCALEDOWN,falloff:400,rollIntensity:.6);
A_StopSound(CHAN_BODY);
@ -502,7 +502,7 @@ Class HellblazerRavager : HellblazerMissile
A_SetRenderStyle(1.0,STYLE_Add);
A_SprayDecal("HugeRocketBlast",50);
A_SetScale(8.);
SWWMUtility.DoExplosion(self,400,320000,300,120);
SWWMUtility.DoExplosion(self,250,320000,300,120);
A_NoGravity();
A_QuakeEx(6,6,6,30,0,2000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:800,rollIntensity:1.);
A_StopSound(CHAN_BODY);
@ -895,7 +895,7 @@ Class HellblazerClusterMini : HellblazerMissile2
A_SetRenderStyle(1.0,STYLE_Add);
A_SprayDecal("BigRocketBlast",50);
A_SetScale(2.5);
SWWMUtility.DoExplosion(self,50,200000,150,60);
SWWMUtility.DoExplosion(self,30,200000,150,60);
A_NoGravity();
A_QuakeEx(4,4,4,12,0,1000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:400,rollIntensity:.6);
A_StopSound(CHAN_BODY);

View file

@ -515,7 +515,7 @@ Class Wallbuster : SWWMWeapon
// slug
if ( !sst ) sst = new("SpreadSlugTracer");
sst.ignoreme = self;
sst.penetration = 200.;
sst.penetration = 150.;
a = FRandom[Wallbuster](0,360);
s = FRandom[Wallbuster](0,.002);
dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
@ -606,7 +606,7 @@ Class Wallbuster : SWWMWeapon
if ( !st ) st = new("SpreadgunTracer");
st.ignoreme = self;
// attempt to uniformize expected damage while reducing traces (mainly for performance)
int expecteddmg = 150;
int expecteddmg = 100;
int numshot = max(21-howmany,5);
int individualdmg = int(ceil(expecteddmg/double(numshot)));
for ( int j=0; j<numshot; j++ )

View file

@ -119,7 +119,7 @@ Class Eviscerator : SWWMWeapon
[x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll);
origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+4*y-5*z);
int trail = CVar.GetCVar('swwm_funtrails',player).GetInt();
for ( int i=0; i<40; i++ )
for ( int i=0; i<20; i++ )
{
a = FRandom[Eviscerator](0,360);
s = FRandom[Eviscerator](0,invoker.extended?.06:.3);

View file

@ -480,8 +480,8 @@ Class EvisceratorProj : Actor
A_SetRenderStyle(1.0,STYLE_Add);
A_SprayDecal("BigRocketBlast",50);
A_NoGravity();
A_SetScale(3.5);
SWWMUtility.DoExplosion(self,80,120000,200,80);
A_SetScale(3.);
SWWMUtility.DoExplosion(self,80,120000,150,80);
A_QuakeEx(6,6,6,20,0,1200,"",QF_RELATIVE|QF_SCALEDOWN,falloff:300,rollIntensity:.7);
A_StartSound("eviscerator/shell",CHAN_WEAPON,attenuation:.5);
A_StartSound("eviscerator/shell",CHAN_VOICE,attenuation:.3);
@ -504,7 +504,7 @@ Class EvisceratorProj : Actor
}
int trail = 0;
if ( target && target.player ) trail = CVar.GetCVar('swwm_funtrails',target.player).GetInt();
for ( int i=0; i<40; i++ )
for ( int i=0; i<20; i++ )
{
p = EvisceratorChunk(Spawn("EvisceratorChunk",level.Vec3Offset(pos,spawnofs)));
p.bHITOWNER = true;

View file

@ -241,7 +241,7 @@ Class Ynykron : SWWMWeapon
Weapon.SlotNumber 0;
Weapon.SelectionOrder 9000;
Weapon.UpSound "ynykron/select";
Stamina 5000000;
Stamina -5000000;
Weapon.AmmoType1 "YnykronAmmo";
Weapon.AmmoGive1 1;
SWWMWeapon.DropAmmoType "YnykronAmmo";

View file

@ -424,7 +424,7 @@ Class Spreadgun : SWWMWeapon
case 1:
sst = new("SpreadSlugTracer");
sst.ignoreme = self;
sst.penetration = 150.;
sst.penetration = 120.;
a = FRandom[Spreadgun](0,360);
s = FRandom[Spreadgun](0,.01);
dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
@ -632,7 +632,7 @@ Class Spreadgun : SWWMWeapon
st.shootthroughlist.Clear();
st.waterhitlist.Clear();
st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,TRACE_HitSky);
ProcessTraceHit(st,origin,dir,6,7000,bc:5);
ProcessTraceHit(st,origin,dir,4,7000,bc:5);
}
for ( int i=0; i<16; i++ )
{

View file

@ -265,7 +265,7 @@ Class DragonBreathArm : Actor
let p = Spawn("DragonBreathPuff",pos);
p.alpha *= .6+.4*(ReactionTime/20.);
p.scale *= 3.5-2.5*(ReactionTime/20.);
SWWMUtility.DoExplosion(self,4+(reactiontime/2),1000+200*reactiontime,120+5*reactiontime,flags:DE_HOWL,ignoreme:bHITOWNER?null:target);
SWWMUtility.DoExplosion(self,4+(reactiontime/2),1000+200*reactiontime,90+5*reactiontime,flags:DE_HOWL,ignoreme:bHITOWNER?null:target);
double spd = vel.length();
vel = (vel*.4+(FRandom[ExploS](-.2,.2),FRandom[ExploS](-.2,.2),FRandom[ExploS](-.2,.2))).unit()*spd;
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5);

View file

@ -545,7 +545,7 @@ Class BiosparkBall : Actor
{
A_StopSound(CHAN_VOICE);
A_AlertMonsters(swwm_uncapalert?0:5000);
SWWMUtility.DoExplosion(self,60,20000,150,80,flags:DE_HOWL);
SWWMUtility.DoExplosion(self,50,20000,150,80,flags:DE_HOWL);
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);
@ -598,7 +598,7 @@ Class BiosparkBall : Actor
if ( special1 > 30 ) return;
double factor = (30-special1)/30.;
double invfct = 1.-factor;
SWWMUtility.DoExplosion(self,20*factor,0.,150*invfct,flags:DE_HOWL);
SWWMUtility.DoExplosion(self,15*factor,0.,150*invfct,flags:DE_HOWL);
SWWMUtility.DoExplosion(self,0,-5000*factor,300*invfct);
int numpt = int(Random[ExploS](16,32)*factor);
for ( int i=0; i<numpt; i++ )
@ -709,7 +709,7 @@ Class BiosparkBeamImpact : Actor
{
Super.PostBeginPlay();
A_AlertMonsters(swwm_uncapalert?0:2000);
SWWMUtility.DoExplosion(self,50,20000,100,40,flags:DE_HOWL);
SWWMUtility.DoExplosion(self,40,20000,100,40,flags:DE_HOWL);
A_QuakeEx(3,3,3,12,0,800,"",QF_RELATIVE|QF_SCALEDOWN,falloff:300,rollIntensity:.4);
A_StartSound("biospark/beamhit",CHAN_ITEM,attenuation:1.1);
A_StartSound("biospark/beamhit",CHAN_WEAPON,attenuation:.8);
@ -762,7 +762,7 @@ Class BiosparkBeamImpact : Actor
if ( special1 > 30 ) return;
double factor = (30-special1)/30.;
double invfct = 1.-factor;
SWWMUtility.DoExplosion(self,15*factor,0.,50*invfct,flags:DE_HOWL);
SWWMUtility.DoExplosion(self,10*factor,0.,50*invfct,flags:DE_HOWL);
SWWMUtility.DoExplosion(self,0.,-5000*factor,100*invfct);
int numpt = int(Random[ExploS](8,16)*factor);
for ( int i=0; i<numpt; i++ )

View file

@ -498,7 +498,7 @@ Class ExplodiumBulletImpact : Actor
{
Super.PostBeginPlay();
A_AlertMonsters(swwm_uncapalert?0:3000);
SWWMUtility.DoExplosion(self,20,80000,90,40,DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,20,40000,70,40,DE_EXTRAZTHRUST);
A_QuakeEx(4,4,4,10,0,250,"",QF_RELATIVE|QF_SCALEDOWN,falloff:150,rollintensity:0.2);
A_StartSound("explodium/hit",CHAN_VOICE,attenuation:.6);
A_StartSound("explodium/hit",CHAN_WEAPON,attenuation:.3);

View file

@ -253,7 +253,7 @@ Class CandyPop : Actor
Spawn:
BLPF B 3 NoDelay
{
SWWMUtility.DoExplosion(self,500,60000,250,60);
SWWMUtility.DoExplosion(self,500,60000,180,60);
Scale *= FRandom[ExploS](0.6,1.8);
Scale.x *= RandomPick[ExploS](-1,1);
Scale.y *= RandomPick[ExploS](-1,1);
@ -318,7 +318,7 @@ Class TinyCandyPop : CandyPop
Spawn:
BLPF B 3 NoDelay
{
SWWMUtility.DoExplosion(self,200,32000,100,20);
SWWMUtility.DoExplosion(self,200,32000,60,20);
Scale *= FRandom[ExploS](0.6,1.8);
Scale.x *= RandomPick[ExploS](-1,1);
Scale.y *= RandomPick[ExploS](-1,1);
@ -801,7 +801,7 @@ Class CandyBulletImpact : Actor
{
Super.PostBeginPlay();
A_AlertMonsters(swwm_uncapalert?0:9000);
SWWMUtility.DoExplosion(self,900,48000,250,80,DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,900,48000,150,80,DE_EXTRAZTHRUST);
A_QuakeEx(6,6,6,15,0,300,"",QF_RELATIVE|QF_SCALEDOWN,falloff:200,rollintensity:0.2);
A_StartSound("candygun/hit",CHAN_VOICE,attenuation:.25);
A_StartSound("candygun/hit",CHAN_WEAPON,attenuation:.5);