Rebalances across the board once again.

Fix the incorrect SPAC_PCross behaviour in other spots.
Redo swap weapon implementation. Should now theoretically allow for not just two, but many more swap weapons per slot.
Minor fixups.
This commit is contained in:
Mari the Deer 2020-12-31 13:47:29 +01:00
commit 0156af8431
25 changed files with 125 additions and 131 deletions

View file

@ -1,2 +1,2 @@
[default]
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r720 \cu(Thu 31 Dec 08:27:55 CET 2020)";
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r722 \cu(Thu 31 Dec 13:58:11 CET 2020)";

View file

@ -20,7 +20,6 @@ Class BlackfireIgniter : SWWMWeapon
Weapon.SelectionOrder 550;
Weapon.AmmoType1 "DarkCanister";
Weapon.AmmoGive1 1;
SWWMWeapon.SwapWeapon "Sparkster";
SWWMWeapon.DropAmmoType "DarkCanister";
BlackfireIgniter.ClipCount 100;
Stamina 220000;

View file

@ -13,7 +13,6 @@ Class ItamexHammer : SWWMWeapon
Weapon.SlotPriority 3.;
Weapon.SelectionOrder 1200;
Stamina 9000;
SWWMWeapon.SwapWeapon "PusherWeapon";
+WEAPON.MELEEWEAPON;
}
States

View file

@ -14,7 +14,6 @@ Class HeavyMahSheenGun : SWWMWeapon
Weapon.SelectionOrder 100;
Weapon.AmmoType1 "SheenAmmo";
Weapon.AmmoGive1 200;
SWWMWeapon.SwapWeapon "Eviscerator";
SWWMWeapon.DropAmmoType "SheenAmmo";
Stamina 100000;
+SWWMWEAPON.NOFIRSTGIVE;

View file

@ -22,7 +22,6 @@ Class GrandLance : SWWMWeapon
Weapon.AmmoGive1 1;
Weapon.AmmoType2 "RayBattery";
Weapon.AmmoGive2 0;
SWWMWeapon.SwapWeapon "Ynykron";
SWWMWeapon.DropAmmoType "GrandAmmo";
GrandLance.ClipCount 5;
GrandLance.ClipCount2 500;

View file

@ -19,7 +19,6 @@ Class Quadravol : SWWMWeapon
Weapon.SelectionOrder 650;
Weapon.AmmoType1 "QuadAmmo";
Weapon.AmmoGive1 1;
SWWMWeapon.SwapWeapon "Hellblazer";
SWWMWeapon.DropAmmoType "QuadAmmo";
Quadravol.ClipCount 4;
Stamina 80000;

View file

@ -18,7 +18,6 @@ Class PuntzerBeta : SWWMWeapon
Weapon.SelectionOrder 450;
Weapon.AmmoType1 "SMW05Ammo";
Weapon.AmmoGive1 6;
SWWMWeapon.SwapWeapon "Spreadgun";
SWWMWeapon.DropAmmoType "SMW05Ammo";
Stamina 10000;
+SWWMWEAPON.NOFIRSTGIVE;

View file

@ -20,7 +20,6 @@ Class PuntzerGamma : SWWMWeapon
PuntzerGamma.ClipCount 30;
Weapon.AmmoType1 "SMW05Ammo";
Weapon.AmmoGive1 30;
SWWMWeapon.SwapWeapon "Wallbuster";
SWWMWeapon.DropAmmoType "SMW05Ammo";
Stamina 30000;
+SWWMWEAPON.NOFIRSTGIVE;

View file

@ -22,7 +22,6 @@ Class RayKhom : SWWMWeapon
Weapon.AmmoGive1 1;
Weapon.AmmoType2 "RayBattery";
Weapon.AmmoGive2 0;
SWWMWeapon.SwapWeapon "CandyGun";
SWWMWeapon.DropAmmoType "RayAmmo";
RayKhom.ClipCount 20;
RayKhom.ClipCount2 500;

View file

@ -20,7 +20,6 @@ Class EMPCarbine : SWWMWeapon
Weapon.SelectionOrder 850;
Weapon.AmmoType1 "EMPCore";
Weapon.AmmoGive1 1;
SWWMWeapon.SwapWeapon "SilverBullet";
SWWMWeapon.DropAmmoType "EMPCore";
EMPCarbine.ClipCount 4;
Stamina 500000;

View file

@ -814,6 +814,7 @@ Class EvisceratorSixPack : EvisceratorShell
{
Default
{
Tag "$I_EVISHELLPAK";
Inventory.PickupMessage "$I_EVISHELLPAK";
Inventory.Amount 6;
Radius 20;
@ -885,6 +886,7 @@ Class HellblazerMissileMag : HellblazerMissiles
{
Default
{
Tag "$T_HELLMISSILEMAG";
Inventory.PickupMessage "$T_HELLMISSILEMAG";
Inventory.Amount 6;
Radius 12;
@ -951,6 +953,7 @@ Class HellblazerCrackshotMag : HellblazerCrackshots
{
Default
{
Tag "$T_HELLCLUSTERMAG";
Inventory.PickupMessage "$T_HELLCLUSTERMAG";
Inventory.Amount 3;
Radius 12;
@ -996,6 +999,7 @@ Class HellblazerRavagerMag : HellblazerRavagers
{
Default
{
Tag "$T_HELLBURNINATORMAG";
Inventory.PickupMessage "$T_HELLBURNINATORMAG";
Inventory.Amount 3;
Radius 12;
@ -1041,6 +1045,7 @@ Class HellblazerWarheadMag : HellblazerWarheads
{
Default
{
Tag "$T_HELLNUKEMAG";
Inventory.PickupMessage "$T_HELLNUKEMAG";
Inventory.Amount 2;
Radius 12;

View file

@ -240,6 +240,7 @@ Class HellblazerMissile : Actor
+EXPLODEONWATER;
+FORCERADIUSDMG;
+NODAMAGETHRUST;
+HITTRACER;
}
override void PostBeginPlay()
@ -285,6 +286,7 @@ Class HellblazerMissile : Actor
let t = bt.Thing;
if ( !t || !t.bSHOOTABLE || (!t.bISMONSTER && !(t is 'BossBrain') && !t.player) || (t.Health <= 0) || (target && t.IsFriend(target)) || !SWWMUtility.SphereIntersect(t,level.Vec3Offset(pos,vel),bNOGRAVITY?50:90) || !CheckSight(t,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue;
deto++;
tracer = t;
break;
}
}
@ -393,7 +395,7 @@ Class HellblazerCrackshot : HellblazerMissile
A_SetRenderStyle(1.0,STYLE_Add);
A_SprayDecal("BigRocketBlast",50);
A_SetScale(6.);
SWWMUtility.DoExplosion(self,150,320000,250,100);
SWWMUtility.DoExplosion(self,200,320000,250,100);
A_NoGravity();
A_QuakeEx(6,6,6,20,0,2000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:800,rollIntensity:1.);
A_StopSound(CHAN_BODY);
@ -438,6 +440,7 @@ Class HellblazerCrackshot : HellblazerMissile
c.vel = (cos(ang)*cos(pt),sin(ang)*cos(pt),sin(-pt))*c.speed*FRandom[Hellblazer](.8,1.2);
c.target = target;
c.ReactionTime += Random[Hellblazer](-10,10);
HellblazerClusterMini(c).A_Steer(tracer);
}
if ( swwm_omnibust ) BusterWall.ProjectileBust(self,300,(cos(angle)*cos(pitch),sin(angle)*cos(pitch),sin(-pitch)));
}
@ -463,7 +466,7 @@ Class HellblazerRavager : HellblazerMissile
A_SetRenderStyle(1.0,STYLE_Add);
A_SprayDecal("HugeRocketBlast",50);
A_SetScale(8.);
SWWMUtility.DoExplosion(self,250,320000,300,120);
SWWMUtility.DoExplosion(self,350,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);
@ -907,9 +910,8 @@ Class HellblazerClusterMini : HellblazerMissile2
p.alpha *= 1-special1*.1;
}
}
override void A_HandleBounce()
void A_Steer( Actor ignoreme = null )
{
Super.A_HandleBounce();
if ( !bMISSILE ) return;
// try to steer towards a target
let bt = BlockThingsIterator.Create(self,800);
@ -918,7 +920,7 @@ Class HellblazerClusterMini : HellblazerMissile2
while ( bt.Next() )
{
let t = bt.Thing;
if ( !t || !t.bSHOOTABLE || (!t.bISMONSTER && !(t is 'BossBrain')) || (t.Health <= 0) || (target && t.IsFriend(target)) || !SWWMUtility.SphereIntersect(t,level.Vec3Offset(pos,vel),800) || !CheckSight(t,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue;
if ( !t || (ignoreme && (t == ignoreme)) || !t.bSHOOTABLE || (!t.bISMONSTER && !(t is 'BossBrain')) || (t.Health <= 0) || (target && t.IsFriend(target)) || !SWWMUtility.SphereIntersect(t,level.Vec3Offset(pos,vel),800) || !CheckSight(t,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue;
double dist = Distance3D(t);
if ( dist > closest ) continue;
closest = dist;
@ -932,7 +934,11 @@ Class HellblazerClusterMini : HellblazerMissile2
vel /= spd;
vel = (vel*.3+dirto*.7)*spd;
}
override void A_HandleBounce()
{
Super.A_HandleBounce();
A_Steer();
}
States
{
Spawn:
@ -1101,13 +1107,13 @@ Class HellblazerRavagerArm : Actor
{
if ( waterlevel > 0 ) ReactionTime -= 2;
let p = Spawn("RavagerPuff",pos);
p.alpha *= .6+.4*(ReactionTime/20.);
p.scale *= 2.5-1.5*(ReactionTime/20.);
p.alpha *= .4+.6*(ReactionTime/25.);
p.scale *= 2.5-1.5*(ReactionTime/25.);
if ( !(ReactionTime%3) )
{
let l = Spawn("RavagerLight",pos);
l.Args[3] = int(90+50*(ReactionTime/20.));
l.ReactionTime = int(2+8*(ReactionTime/20.));
l.Args[3] = int(90+50*(ReactionTime/25.));
l.ReactionTime = int(2+8*(ReactionTime/25.));
l.target = p;
}
SWWMUtility.DoExplosion(self,15+reactiontime/2,2000+400*reactiontime,300-4*reactiontime,100);
@ -1119,7 +1125,7 @@ Class HellblazerRavagerArm : Actor
s.SetShade(Color(4,2,1)*Random[ExploS](48,63));
s.special1 = Random[ExploS](4,8);
s.scale *= 4.;
s.alpha *= .2+.3*(ReactionTime/20.);
s.alpha *= .2+.3*(ReactionTime/25.);
if ( !(ReactionTime%2) )
{
int numpt = Random[Hellblazer](-2,4);
@ -1205,14 +1211,14 @@ Class HellblazerWarheadArm : Actor
TNT1 A 1
{
Spawn("HellblazerWarheadTrail",pos);
SWWMUtility.DoExplosion(self,20+reactiontime*4,3000+500*reactiontime,120+3*reactiontime);
SWWMUtility.DoExplosion(self,20+reactiontime*4,3000+500*reactiontime,120+4*reactiontime);
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5);
let s = Spawn("SWWMHalfSmoke",pos);
s.vel = pvel+vel*.2;
s.SetShade(Color(4,2,1)*Random[ExploS](48,63));
s.special1 = Random[ExploS](1,3);
s.scale *= 6.;
s.alpha *= 0.1+.4*(ReactionTime/15.);
s.alpha *= 0.1+.4*(ReactionTime/25.);
A_CountDown();
}
Wait;
@ -1693,7 +1699,6 @@ Class Hellblazer : SWWMWeapon
Stamina 90000;
Weapon.AmmoType1 "HellblazerMissiles";
Weapon.AmmoGive1 3;
//SWWMWeapon.SwapWeapon "Quadravol";
SWWMWeapon.DropAmmoType "RocketAmmo";
Hellblazer.ClipCount 6;
+SWWMWEAPON.NOFIRSTGIVE;

View file

@ -1122,8 +1122,7 @@ Class Wallbuster : SWWMWeapon
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(self,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
t.ShootThroughList[i].Activate(self,0,SPAC_Impact);
}
for ( int i=0; i<t.WaterHitList.Size(); i++ )
{
@ -1325,7 +1324,7 @@ Class Wallbuster : SWWMWeapon
// slug
if ( !sst ) sst = new("SpreadSlugTracer");
sst.ignoreme = self;
sst.penetration = 150.;
sst.penetration = 200.;
a = FRandom[Wallbuster](0,360);
s = FRandom[Wallbuster](0,.002);
dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
@ -1440,7 +1439,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 = 120;
int expecteddmg = 150;
int numshot = max(21-howmany,5);
int individualdmg = int(ceil(expecteddmg/double(numshot)));
for ( int j=0; j<numshot; j++ )
@ -1632,7 +1631,6 @@ Class Wallbuster : SWWMWeapon
Weapon.UpSound "wallbuster/select";
Weapon.AmmoType1 "RedShell";
Weapon.AmmoGive1 5;
//SWWMWeapon.SwapWeapon "PuntzerGamma";
SWWMWeapon.DropAmmoType "Shell";
Stamina 35000;
+SWWMWEAPON.NOFIRSTGIVE;

View file

@ -119,7 +119,7 @@ Class EvisceratorChunk : Actor
Radius 2;
Height 2;
Speed 50;
DamageFunction int(clamp((vel.length()-5)*.12+max(0,1.-lifetime)*2.,0,8));
DamageFunction int(clamp((vel.length()-5)*.12+max(0,1.-lifetime)*2.,0,10));
DamageType 'shot';
BounceFactor 1.0;
WallBounceFactor 1.0;
@ -711,7 +711,7 @@ Class Eviscerator : SWWMWeapon
p.angle = atan2(dir.y,dir.x);
p.pitch = asin(-dir.z);
p.vel = dir*p.speed*FRandom[Eviscerator](.9,1.1);
if ( invoker.extended ) p.vel *= 1.25;
if ( invoker.extended ) p.vel *= 1.4;
}
for ( int i=0; i<4; i++ )
{
@ -830,7 +830,6 @@ Class Eviscerator : SWWMWeapon
Stamina 50000;
Weapon.AmmoType1 "EvisceratorShell";
Weapon.AmmoGive1 4;
//SWWMWeapon.SwapWeapon "HeavyMahSheenGun";
SWWMWeapon.DropAmmoType "EvisceratorShell";
+WEAPON.EXPLOSIVE;
Radius 20;

View file

@ -577,8 +577,7 @@ Class YnykronBeam : Actor
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(target,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
}
for ( int i=0; i<t.WaterHitList.Size(); i++ )
{
@ -889,8 +888,7 @@ Class DelayedWallBeam : Actor
if ( at.Results.HitLine.sidedef[1] )
{
at.Results.HitLine.Activate(target,0,SPAC_PCross);
if ( at.Results.HitLine.special == GlassBreak ) // fuck glass
at.Results.HitLine.Activate(target,0,SPAC_Impact);
at.Results.HitLine.Activate(target,0,SPAC_Impact);
}
else at.Results.HitLine.Activate(tracer,at.Results.Side,SPAC_Impact);
}
@ -1355,8 +1353,7 @@ Class YnykronVoidBeam : Actor
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(target,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
}
for ( int i=0; i<t.HitList.Size(); i++ )
{
@ -1494,8 +1491,7 @@ Class YnykronLightningArc : Actor
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(target,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
}
for ( int i=0; i<t.hitlist.Size(); i++ )
{
@ -2498,8 +2494,7 @@ Class YnykronAltBeam : Actor
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(target,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
}
for ( int i=0; i<t.WaterHitList.Size(); i++ )
{
@ -2883,7 +2878,6 @@ Class Ynykron : SWWMWeapon
Stamina 5000000;
Weapon.AmmoType1 "YnykronAmmo";
Weapon.AmmoGive1 1;
//SWWMWeapon.SwapWeapon "GrandLance";
SWWMWeapon.DropAmmoType "YnykronAmmo";
+SWWMWEAPON.NOFIRSTGIVE;
Ynykron.ClipCount 1;

View file

@ -473,6 +473,7 @@ Class DeepImpact : SWWMWeapon
DeepImpact.ClipCount 100;
+WEAPON.MELEEWEAPON;
+WEAPON.WIMPY_WEAPON;
+SWWMWEAPON.NOSWAPWEAPON;
}
States

View file

@ -2474,23 +2474,20 @@ Class SWWMHandler : EventHandler
if ( !item ) return;
if ( SWWMCredits.Take(players[e.Args[0]],e.Args[1]) )
{
// drop the swapweapon if we own it first
let def = GetDefaultByType(item);
if ( swwm_swapweapons && (item is 'SWWMWeapon') && SWWMWeapon(def).SwapWeapon )
SWWMWeapon sw;
// drop the swapweapon if we own it first
if ( swwm_swapweapons && (item is 'SWWMWeapon') && (sw = SWWMWeapon(def).HasSwapWeapon(players[e.Args[0]].mo)) )
{
let sw = Weapon(players[e.Args[0]].mo.FindInventory(SWWMWeapon(def).SwapWeapon));
if ( sw )
bool swapto = (sw == players[e.Args[0]].ReadyWeapon);
let drop = players[e.Args[0]].mo.DropInventory(sw);
// add some random velocity so multiple drops don't get bunched together
if ( drop ) drop.vel += (Actor.RotateVector((FRandom[Junk](-1.5,.5),FRandom[Junk](-2.5,2.5)),players[e.Args[0]].mo.angle),FRandom[Junk](2.,5.));
// don't autoswitch just yet (hacky)
if ( swapto )
{
bool swapto = (sw == players[e.Args[0]].ReadyWeapon);
let drop = players[e.Args[0]].mo.DropInventory(sw);
// add some random velocity so multiple drops don't get bunched together
if ( drop ) drop.vel += (Actor.RotateVector((FRandom[Junk](-1.5,.5),FRandom[Junk](-2.5,2.5)),players[e.Args[0]].mo.angle),FRandom[Junk](2.,5.));
// don't autoswitch just yet (hacky)
if ( swapto )
{
players[e.Args[0]].ReadyWeapon = null;
players[e.Args[0]].PendingWeapon = WP_NOCHANGE;
}
players[e.Args[0]].ReadyWeapon = null;
players[e.Args[0]].PendingWeapon = WP_NOCHANGE;
}
}
if ( (item is 'ArmorNuggetItem') || (item is 'HealthNuggetItem') )

View file

@ -985,13 +985,12 @@ Class SWWMWeapon : Weapon abstract
bool wallponch; // is punching a wall (for activation checks)
Class<Ammo> dropammotype;
Class<Weapon> SwapWeapon; // player can only own either this weapon or the SwapWeapon, if defined
Property DropAmmoType : dropammotype;
Property SwapWeapon : SwapWeapon;
FlagDef NoFirstGive : SWeaponFlags, 0; // don't give ammo on first pickup (for weapons with a clip count)
FlagDef HideInMenu : SWeaponFlags, 1; // don't show in inventory menu (usually for sister weapons)
FlagDef NoSwapWeapon : SWeaponFlags, 2; // weapon is not affected by slot swapping
transient CVar phair; // use custom precise crosshair
transient ui CVar ch_img, ch_siz, ch_grow, ch_col, ch_hp, ch_on, ch_force;
@ -1000,16 +999,34 @@ Class SWWMWeapon : Weapon abstract
ui Color ccol;
ui Vector2 lagvpos;
bool IsSwapWeapon( Inventory i ) const
{
if ( bNoSwapWeapon || (i.GetClass() == GetClass()) ) return false;
let w = SWWMWeapon(i);
if ( w && !w.bNoSwapWeapon && (SlotNumber != -1) && (w.SlotNumber == SlotNumber) )
return true;
return false;
}
SWWMWeapon HasSwapWeapon( Actor other ) const
{
if ( bNoSwapWeapon ) return null;
for ( Inventory i=other.inv; i; i=i.inv )
{
if ( IsSwapWeapon(i) )
return SWWMWeapon(i);
}
return null;
}
override void Touch( Actor toucher )
{
// cannot pick up swapweapon unless explicitly pressing use
if ( swwm_swapweapons && SwapWeapon && toucher.FindInventory(SwapWeapon) )
SWWMWeapon sw;
if ( swwm_swapweapons && (sw = HasSwapWeapon(toucher)) )
{
if ( toucher.CheckLocalView() )
{
String t2 = GetDefaultByType(SwapWeapon).GetTag();
Console.MidPrint(SmallFont,String.Format(StringTable.Localize("$SWWM_SWAPWEAPON"),t2,GetTag()));
}
Console.MidPrint(SmallFont,String.Format(StringTable.Localize("$SWWM_SWAPWEAPON"),sw.GetTag(),GetTag()));
return;
}
Super.Touch(toucher);
@ -1025,20 +1042,16 @@ Class SWWMWeapon : Weapon abstract
if ( abs(diff.z) > rang ) return false;
// if the toucher owns our SwapWeapon, drop it before picking us up
bool swapto = false;
if ( swwm_swapweapons && SwapWeapon )
SWWMWeapon sw;
if ( swwm_swapweapons && (sw = HasSwapWeapon(user)) )
{
let sw = user.FindInventory(SwapWeapon);
if ( sw )
if ( sw == user.player.ReadyWeapon ) swapto = true;
user.DropInventory(sw);
// don't autoswitch just yet (hacky)
if ( swapto )
{
if ( Weapon(sw) == user.player.ReadyWeapon )
swapto = true;
user.DropInventory(sw);
// don't autoswitch just yet (hacky)
if ( swapto )
{
user.player.ReadyWeapon = null;
user.player.PendingWeapon = WP_NOCHANGE;
}
user.player.ReadyWeapon = null;
user.player.PendingWeapon = WP_NOCHANGE;
}
}
Touch(user);
@ -1071,7 +1084,7 @@ Class SWWMWeapon : Weapon abstract
override bool HandlePickup( Inventory item )
{
// can't hold both weapons at once
if ( swwm_swapweapons && SwapWeapon && (item.GetClass() == SwapWeapon) )
if ( swwm_swapweapons && IsSwapWeapon(item) )
return true;
if ( (GetClass() == item.GetClass()) && !item.ShouldStay() )
{

View file

@ -303,14 +303,12 @@ Class PusherProjectile : Actor
override void Touch( Actor toucher )
{
// cannot pick up swapweapon unless explicitly pressing use
let swc = GetDefaultByType("PusherWeapon").SwapWeapon;
if ( swwm_swapweapons && swc && toucher.FindInventory(swc) )
let pw = GetDefaultByType("PusherWeapon");
SWWMWeapon sw;
if ( swwm_swapweapons && (sw = pw.HasSwapWeapon(toucher)) )
{
if ( toucher.CheckLocalView() )
{
String t2 = GetDefaultByType(swc).GetTag();
Console.MidPrint(SmallFont,String.Format(StringTable.Localize("$SWWM_SWAPWEAPON"),t2,StringTable.Localize("$T_PUSHER")));
}
Console.MidPrint(SmallFont,String.Format(StringTable.Localize("$SWWM_SWAPWEAPON"),sw.GetTag(),StringTable.Localize("$T_PUSHER")));
return;
}
let w = toucher.FindInventory("PusherWeapon");
@ -339,21 +337,18 @@ Class PusherProjectile : Actor
double rang = user.player?PlayerPawn(user.player.mo).UseRange:(user.Height/2);
if ( abs(diff.z) > rang ) return false;
// if the toucher owns our SwapWeapon, drop it before picking us up
let swc = GetDefaultByType("PusherWeapon").SwapWeapon;
if ( swwm_swapweapons && swc )
let pw = GetDefaultByType("PusherWeapon");
SWWMWeapon sw;
if ( swwm_swapweapons && (sw = pw.HasSwapWeapon(user)) )
{
let sw = user.FindInventory(swc);
bool swapto = false;
if ( sw )
if ( sw == user.player.ReadyWeapon ) swapto = true;
user.DropInventory(sw);
// don't autoswitch just yet (hacky)
if ( swapto )
{
if ( sw == user.player.ReadyWeapon ) swapto = true;
user.DropInventory(sw);
// don't autoswitch just yet (hacky)
if ( swapto )
{
user.player.ReadyWeapon = null;
user.player.PendingWeapon = WP_NOCHANGE;
}
user.player.ReadyWeapon = null;
user.player.PendingWeapon = WP_NOCHANGE;
}
}
Touch(user);
@ -429,7 +424,8 @@ Class PusherWeapon : SWWMWeapon
{
A_QuakeEx(2,2,2,7,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.8);
A_AlertMonsters(swwm_uncapalert?0:1200);
int dmg = int(3+invoker.chargelevel*3);
int dmg = int(3+invoker.chargelevel*7);
if ( invoker.chargelevel > .4 ) invoker.chargelevel -= FRandom[Pusher](.01,.04);
if ( d.HitType == TRACE_HitActor )
{
double diff = deltaangle(self.angle,AngleTo(d.HitActor));
@ -602,7 +598,6 @@ Class PusherWeapon : SWWMWeapon
Weapon.SlotPriority 2.;
Weapon.SelectionOrder 1500;
Stamina 10000;
//SWWMWeapon.SwapWeapon "ItamexHammer";
+WEAPON.MELEEWEAPON;
Radius 20;
Height 32;

View file

@ -378,7 +378,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,1+(reactiontime/2),1000+200*reactiontime,150-6*reactiontime,flags:DE_HOWL,ignoreme:bHITOWNER?null:target);
SWWMUtility.DoExplosion(self,2+(reactiontime/2),1000+200*reactiontime,150-6*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);
@ -495,7 +495,7 @@ Class SaltImpact : Actor
{
Super.PostBeginPlay();
A_AlertMonsters(swwm_uncapalert?0:6000);
SWWMUtility.DoExplosion(self,12+special2*4,15000,100,40);
SWWMUtility.DoExplosion(self,25+special2*4,15000,100,40);
A_QuakeEx(3,3,3,10,0,250,"",QF_RELATIVE|QF_SCALEDOWN,falloff:150,rollintensity:0.2);
A_StartSound("spreadgun/salt",CHAN_VOICE,attenuation:.35);
A_SprayDecal("ShockMarkSmall",-172);
@ -593,8 +593,7 @@ Class SaltBeam : Actor
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(target,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
}
for ( int i=0; i<t.WaterHitList.Size(); i++ )
{
@ -613,11 +612,11 @@ Class SaltBeam : Actor
}
if ( t.Results.HitType != TRACE_HitNone )
{
if ( (args[1] == 2) || swwm_omnibust ) BusterWall.Bust(t.Results,85+Accuracy*10,target,x,t.Results.HitPos.z);
if ( (args[1] == 2) || swwm_omnibust ) BusterWall.Bust(t.Results,60+Accuracy*10,target,x,t.Results.HitPos.z);
if ( t.Results.HitType == TRACE_HitActor )
{
SWWMUtility.DoKnockback(t.Results.HitActor,x,25000);
t.Results.HitActor.DamageMobj(self,target,20+Accuracy*4,'Salt',DMG_THRUSTLESS);
t.Results.HitActor.DamageMobj(self,target,35+Accuracy*5,'Salt',DMG_THRUSTLESS);
if ( t.Results.HitActor && t.Results.HitActor.bIsMonster && !Random[Spreadgun](0,3) )
t.Results.HitActor.Howl();
}
@ -688,7 +687,7 @@ Class SaltBeam : Actor
if ( isFrozen() ) return;
A_FadeOut(.04);
if ( Random[Spreadgun](-2,args[2]/10) == 0 )
SWWMUtility.DoExplosion(self,4+Accuracy,5000,32,flags:DE_HOWL,ignoreme:target);
SWWMUtility.DoExplosion(self,5+Accuracy,5000,32,flags:DE_HOWL,ignoreme:target);
if ( ((special2%4) || args[2]) && !special1 ) SpreadOut();
args[2]++;
if ( !CheckNoDelay() || (tics == -1) ) return;
@ -2083,8 +2082,7 @@ Class Spreadgun : SWWMWeapon
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(self,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
t.ShootThroughList[i].Activate(self,0,SPAC_Impact);
}
for ( int i=0; i<t.WaterHitList.Size(); i++ )
{
@ -2180,7 +2178,7 @@ Class Spreadgun : SWWMWeapon
case 1:
sst = new("SpreadSlugTracer");
sst.ignoreme = self;
sst.penetration = 120.;
sst.penetration = 150.;
a = FRandom[Spreadgun](0,360);
s = FRandom[Spreadgun](0,.01);
dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
@ -2436,7 +2434,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,5,7000,bc:5);
ProcessTraceHit(st,origin,dir,6,7000,bc:5);
}
for ( int i=0; i<9; i++ )
{
@ -2575,8 +2573,7 @@ Class Spreadgun : SWWMWeapon
Weapon.SelectionOrder 500;
Weapon.AmmoType1 "RedShell";
Weapon.AmmoGive1 1;
//SWWMWeapon.SwapWeapon "PuntzerBeta";
SWWMWeapon.DropAmmoType "Clip";
SWWMWeapon.DropAmmoType "Shell";
Stamina 15000;
+SWWMWEAPON.NOFIRSTGIVE;
Radius 10;

View file

@ -1107,8 +1107,7 @@ Class BiosparkBeam : Actor
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(target,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
}
for ( int i=0; i<t.hitlist.Size(); i++ )
{
@ -1459,8 +1458,7 @@ Class BiosparkArc : Actor
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(target,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
}
for ( int i=0; i<t.hitlist.Size(); i++ )
{
@ -2132,7 +2130,6 @@ Class Sparkster : SWWMWeapon
Stamina 200000;
Weapon.AmmoType1 "SparkUnit";
Weapon.AmmoGive1 1;
//SWWMWeapon.SwapWeapon "BlackfireIgniter";
SWWMWeapon.DropAmmoType "SparkUnit";
Sparkster.ClipCount 8;
+SWWMWEAPON.NOFIRSTGIVE;

View file

@ -64,7 +64,7 @@ Class ExplodiumMagArm : Actor
{
Spawn("ExplodiumMagTrail",pos);
if ( !(ReactionTime%2) )
SWWMUtility.DoExplosion(self,1+reactiontime/4,3000+500*reactiontime,40+3*reactiontime,20);
SWWMUtility.DoExplosion(self,2+reactiontime/2,3000+500*reactiontime,40+3*reactiontime,20);
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5);
let s = Spawn("SWWMHalfSmoke",pos);
s.vel = pvel+vel*.2;
@ -145,7 +145,7 @@ Class ExplodiumMagProj : Actor
A_SetRenderStyle(1.,STYLE_Add);
Scale *= 2.+.2*special1;
A_AlertMonsters(swwm_uncapalert?0:6000);
SWWMUtility.DoExplosion(self,25+20*special1,80000+8000*special1,90+10*special1,60,DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,15+25*special1,80000+8000*special1,90+10*special1,60,DE_EXTRAZTHRUST);
A_QuakeEx(9,9,9,30,0,400+80*special1,"",QF_RELATIVE|QF_SCALEDOWN,falloff:300,rollintensity:2.);
A_StartSound("explodium/maghit",CHAN_VOICE,attenuation:.35);
A_StartSound("explodium/maghit",CHAN_WEAPON,attenuation:.2);
@ -396,7 +396,7 @@ Class ExplodiumGun : SWWMWeapon
SWWMBulletTrail.DoTrail(self,origin,dir,10000,2);
if ( d.HitType == TRACE_HitActor )
{
int dmg = 15;
int dmg = 20;
// might as well apply explosion on top
if ( dmg >= d.HitActor.Health ) dmg += 25;
SWWMUtility.DoKnockback(d.HitActor,d.HitDir,48000);
@ -558,6 +558,7 @@ Class ExplodiumGun : SWWMWeapon
Stamina 8000;
ExplodiumGun.ClipCount 7;
+WEAPON.EXPLOSIVE;
+SWWMWEAPON.NOSWAPWEAPON;
Radius 12;
Height 24;
}
@ -818,7 +819,7 @@ Class DualExplodiumGun : SWWMWeapon
SWWMBulletTrail.DoTrail(self,origin,dir,10000,2);
if ( d.HitType == TRACE_HitActor )
{
int dmg = 15;
int dmg = 20;
// might as well apply explosion on top
if ( dmg >= d.HitActor.Health ) dmg += 25;
SWWMUtility.DoKnockback(d.HitActor,d.HitDir,48000);
@ -934,6 +935,7 @@ Class DualExplodiumGun : SWWMWeapon
DualExplodiumGun.ClipCount 7;
+WEAPON.EXPLOSIVE;
+SWWMWEAPON.HIDEINMENU;
+SWWMWEAPON.NOSWAPWEAPON;
}
States
{

View file

@ -106,8 +106,7 @@ Class CandyBeam : Actor
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(target,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
}
for ( int i=0; i<t.hitlist.Size(); i++ )
{
@ -1162,7 +1161,6 @@ Class CandyGun : SWWMWeapon
Weapon.AmmoGive1 1;
Weapon.AmmoGive2 1;
Weapon.AmmoUse2 0;
//SWWMWeapon.SwapWeapon "RayKhom";
SWWMWeapon.DropAmmoType "CandyGunAmmo";
CandyGun.ClipCount 7;
+SWWMWEAPON.NOFIRSTGIVE;

View file

@ -768,9 +768,8 @@ Class SilverBullet : SWWMWeapon
{
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(self,0,SPAC_Impact);
t.ShootThroughList[i].Activate(self,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
}
for ( int i=0; i<t.WaterHitList.Size(); i++ )
{
@ -869,8 +868,7 @@ Class SilverBullet : SWWMWeapon
for ( int i=0; i<t.ShootThroughList.Size(); i++ )
{
t.ShootThroughList[i].Activate(self,0,SPAC_PCross);
if ( t.ShootThroughList[i].special == GlassBreak ) // fuck glass
t.ShootThroughList[i].Activate(target,0,SPAC_Impact);
t.ShootThroughList[i].Activate(self,0,SPAC_Impact);
}
for ( int i=0; i<t.WaterHitList.Size(); i++ )
{
@ -1162,7 +1160,6 @@ Class SilverBullet : SWWMWeapon
Weapon.AmmoGive1 1;
Weapon.AmmoType2 "SilverBulletAmmo2";
Weapon.AmmoGive2 0;
//SWWMWeapon.SwapWeapon "EMPCarbine";
SWWMWeapon.DropAmmoType "SilverBulletAmmo";
SilverBullet.ClipCount 5;
+SWWMWEAPON.NOFIRSTGIVE;

View file

@ -763,9 +763,8 @@ Class SWWMItemSense : Thinker
if ( (item is 'RedShell') || (item is 'GreenShell')
|| (item is 'WhiteShell') || (item is 'BlueShell')
|| (item is 'BlackShell') || (item is 'PurpleShell')
|| (item is 'GoldShell') || (item is 'EvisceratorShell')
|| (item is 'HellblazerMissiles')|| (item is 'HellblazerCrackshots')
|| (item is 'HellblazerRavagers')|| (item is 'HellblazerWarheads') )
|| (item is 'GoldShell')/* || (item is 'SMW05Ammo')
|| (item is 'SheenAmmo')*/ )
tag = item.PickupMessage();
else tag = item.GetTag();
}
@ -873,7 +872,13 @@ Class SWWMCombatTracker : Thinker
t.next = hnd.trackers;
t.bBOSS = target.bBOSS;
t.bFRIENDLY = target.bFRIENDLY;
if ( hnd.trackers ) hnd.trackers.prev = t;
if ( hnd.trackers )
{
hnd.trackers.prev = t;
// propagate cvar values
t.mxdist = hnd.trackers.mxdist;
t.dbar = hnd.trackers.dbar;
}
hnd.trackers = t;
hnd.trackers_cnt++;
return t;