Prep work for future DLC Weaponset.

DLC Weaponset: Slot 0 weapon added.
This commit is contained in:
Mari the Deer 2020-12-15 20:46:26 +01:00
commit 1f649790dd
38 changed files with 362 additions and 121 deletions

View file

@ -20,6 +20,7 @@ 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

@ -308,3 +308,53 @@ Class RayBattery : Ammo
Stop;
}
}
Class GrandSpear : MagAmmo
{
Default
{
Tag "$T_GRANDSPEAR";
Inventory.PickupMessage "$T_GRANDSPEAR";
Inventory.Icon "graphics/HUD/Icons/A_GrandSpear.png";
MagAmmo.ParentAmmo "GrandAmmo";
MagAmmo.ClipSize 5;
Inventory.MaxAmount 10;
Inventory.InterHubAmount 10;
+FLOATBOB;
FloatBobStrength 0.25;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
Class GrandAmmo : Ammo
{
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Default
{
Tag "$T_GRANDAMMO";
Inventory.PickupMessage "$T_GRANDAMMO";
Stamina 1200000;
Inventory.Icon "graphics/HUD/Icons/A_RayAmmo.png";
Inventory.Amount 1;
Inventory.MaxAmount 2;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 6;
Ammo.DropAmount 1;
+FLOATBOB;
FloatBobStrength 0.25;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}

View file

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

View file

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

View file

@ -0,0 +1,41 @@
// Kmonn Shuna Grand Lance (planned for unreleased SWWM Iridium)
// Slot 0, spawns shared with Ynykron Artifact
Class GrandLance : SWWMWeapon
{
int clipcount, clipcount2;
bool chambered;
Property ClipCount : clipcount;
Property ClipCount2 : clipcount2;
Default
{
Tag "$T_GRANDLANCE";
Inventory.PickupMessage "$T_GRANDLANCE";
Obituary "$O_GRANDLANCE";
Inventory.Icon "graphics/HUD/Icons/W_GrandLance.png";
Weapon.SlotNumber 0;
Weapon.SlotPriority 2.;
Weapon.SelectionOrder 8000;
Weapon.AmmoType1 "GrandAmmo";
Weapon.AmmoGive1 1;
Weapon.AmmoType2 "RayBattery";
Weapon.AmmoGive2 0;
SWWMWeapon.SwapWeapon "Ynykron";
SWWMWeapon.DropAmmoType "GrandAmmo";
GrandLance.ClipCount 5;
GrandLance.ClipCount2 500;
Stamina 4200000;
+SWWMWEAPON.NOFIRSTGIVE;
+WEAPON.PRIMARY_USES_BOTH;
+WEAPON.EXPLOSIVE;
+WEAPON.BFG;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}

View file

@ -19,6 +19,7 @@ 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,6 +18,7 @@ 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,6 +20,7 @@ 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,6 +22,7 @@ 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,6 +20,7 @@ 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

@ -1,85 +0,0 @@
// Kmonn Shuna Grand Lance (planned for unreleased SWWM Iridium)
// Slot 0, spawns shared with Ynykron Artifact
Class GrandSpear : MagAmmo
{
Default
{
Tag "$T_GRANDSPEAR";
Inventory.PickupMessage "$T_GRANDSPEAR";
Inventory.Icon "graphics/HUD/Icons/A_GrandSpear.png";
MagAmmo.ParentAmmo "GrandAmmo";
MagAmmo.ClipSize 5;
Inventory.MaxAmount 10;
Inventory.InterHubAmount 10;
+FLOATBOB;
FloatBobStrength 0.25;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
Class GrandAmmo : Ammo
{
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Default
{
Tag "$T_GRANDAMMO";
Inventory.PickupMessage "$T_GRANDAMMO";
Stamina 1200000;
Inventory.Icon "graphics/HUD/Icons/A_RayAmmo.png";
Inventory.Amount 1;
Inventory.MaxAmount 2;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 6;
Ammo.DropAmount 1;
+FLOATBOB;
FloatBobStrength 0.25;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}
Class GrandLance : SWWMWeapon
{
int clipcount;
Property ClipCount : clipcount;
Default
{
Tag "$T_GRANDLANCE";
Inventory.PickupMessage "$I_GRANDLANCE";
Obituary "$O_GRANDLANCE";
Inventory.Icon "graphics/HUD/Icons/W_GrandLance.png";
Weapon.SlotNumber 0;
Weapon.SlotPriority 2.;
Weapon.SelectionOrder 8000;
Weapon.AmmoType1 "GrandAmmo";
Weapon.AmmoGive1 1;
SWWMWeapon.DropAmmoType "GrandAmmo";
GrandLance.ClipCount 5;
Stamina 4200000;
+SWWMWEAPON.NOFIRSTGIVE;
+WEAPON.BFG;
+WEAPON.EXPLOSIVE;
}
States
{
Spawn:
XZW1 A -1;
Stop;
}
}

View file

@ -1680,6 +1680,7 @@ Class Hellblazer : SWWMWeapon
Stamina 90000;
Weapon.AmmoType1 "HellblazerMissiles";
Weapon.AmmoGive1 6;
//SWWMWeapon.SwapWeapon "Quadravol";
SWWMWeapon.DropAmmoType "RocketAmmo";
Hellblazer.ClipCount 6;
+SWWMWEAPON.NOFIRSTGIVE;

View file

@ -1629,6 +1629,7 @@ 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

@ -821,6 +821,7 @@ Class Eviscerator : SWWMWeapon
Stamina 50000;
Weapon.AmmoType1 "EvisceratorShell";
Weapon.AmmoGive1 4;
//SWWMWeapon.SwapWeapon "HeavyMahSheenGun";
SWWMWeapon.DropAmmoType "EvisceratorShell";
+WEAPON.EXPLOSIVE;
Radius 20;

View file

@ -2876,6 +2876,7 @@ Class Ynykron : SWWMWeapon
Stamina 5000000;
Weapon.AmmoType1 "YnykronAmmo";
Weapon.AmmoGive1 1;
//SWWMWeapon.SwapWeapon "GrandLance";
SWWMWeapon.DropAmmoType "YnykronAmmo";
+SWWMWEAPON.NOFIRSTGIVE;
Ynykron.ClipCount 1;

View file

@ -2468,6 +2468,25 @@ 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 )
{
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 )
{
players[e.Args[0]].ReadyWeapon = null;
players[e.Args[0]].PendingWeapon = WP_NOCHANGE;
}
}
}
if ( (item is 'ArmorNuggetItem') || (item is 'HealthNuggetItem') )
{
// these have to be given in a loop because fun reasons

View file

@ -117,11 +117,11 @@ Class SWWMStatScreen : StatusScreen abstract
for ( int i=1; i<=maxtip; i++ )
{
// skip DLC tips for now
if ( (i >= 61) && (i <= 68) ) continue;
if ( (i >= 60) && (i <= 68) ) continue;
ents.Push(i);
}
// account for skipped dlc tips (important, will crash otherwise)
maxtip -= 8;
maxtip -= 9;
if ( pdata.lasttip.Size() >= maxtip )
{
// exclude last one, start over

View file

@ -981,15 +981,17 @@ Class SWWMCrosshairTracer : LineTracer
Class SWWMWeapon : Weapon abstract
{
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
bool wasused;
private int SWeaponFlags;
Actor pfield; // instance of parry field for current melee attack
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)
@ -1001,6 +1003,66 @@ Class SWWMWeapon : Weapon abstract
ui Color ccol;
ui Vector2 lagvpos;
override void Touch( Actor toucher )
{
// cannot pick up swapweapon unless explicitly pressing use
if ( swwm_swapweapons && SwapWeapon && toucher.FindInventory(SwapWeapon) )
{
if ( toucher.CheckLocalView() )
{
String t2 = GetDefaultByType(SwapWeapon).GetTag();
Console.MidPrint(SmallFont,String.Format(StringTable.Localize("$SWWM_SWAPWEAPON"),t2,GetTag()));
}
return;
}
Super.Touch(toucher);
}
// allow pickup by use + swap weapon support
override bool Used( Actor user )
{
Vector3 itempos = Vec3Offset(0,0,Height/2),
userpos = user.Vec2OffsetZ(0,0,user.player.viewz);
// test vertical range
Vector3 diff = level.Vec3Diff(user.Vec3Offset(0,0,user.Height/2),Vec3Offset(0,0,Height/2));
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
bool swapto = false;
if ( swwm_swapweapons && SwapWeapon )
{
let sw = user.FindInventory(SwapWeapon);
if ( sw )
{
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;
}
}
}
Touch(user);
// we got picked up
if ( bDestroyed || Owner || !bSPECIAL )
{
// autoswitch to us if we got swapped
if ( swapto ) user.A_SelectWeapon(GetClass());
Vector3 tracedir = level.Vec3Diff(userpos,itempos);
double dist = tracedir.length();
tracedir /= dist;
let cf = new("CrossLineFinder");
cf.Trace(userpos,level.PointInSector(userpos.xy),tracedir,dist,0);
// trigger all player cross lines found between user and item
for ( int i=0; i<cf.clines.Size(); i++ )
cf.clines[i].Activate(user,cf.csides[i],SPAC_Cross);
return true;
}
return false;
}
override void DoEffect()
{
Super.DoEffect();
@ -1011,6 +1073,9 @@ Class SWWMWeapon : Weapon abstract
}
override bool HandlePickup( Inventory item )
{
// can't hold both weapons at once
if ( swwm_swapweapons && SwapWeapon && (item.GetClass() == SwapWeapon) )
return true;
if ( (GetClass() == item.GetClass()) && !item.ShouldStay() )
{
int oldammo1 = Ammo1?Ammo1.Amount:0;

View file

@ -304,6 +304,17 @@ 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) )
{
if ( toucher.CheckLocalView() )
{
String t2 = GetDefaultByType(swc).GetTag();
Console.MidPrint(SmallFont,String.Format(StringTable.Localize("$SWWM_SWAPWEAPON"),t2,StringTable.Localize("$T_PUSHER")));
}
return;
}
let w = toucher.FindInventory("PusherWeapon");
if ( toucher.player && w )
{
@ -329,6 +340,24 @@ Class PusherProjectile : Actor
Vector3 diff = level.Vec3Diff(user.Vec3Offset(0,0,user.Height/2),Vec3Offset(0,0,Height/2));
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 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 )
{
user.player.ReadyWeapon = null;
user.player.PendingWeapon = WP_NOCHANGE;
}
}
}
Touch(user);
return bDestroyed;
}
@ -569,6 +598,7 @@ Class PusherWeapon : SWWMWeapon
Weapon.SlotPriority 2.;
Weapon.SelectionOrder 1500;
Stamina 10000;
//SWWMWeapon.SwapWeapon "ItamexHammer";
+WEAPON.MELEEWEAPON;
Radius 20;
Height 32;

View file

@ -2579,6 +2579,7 @@ Class Spreadgun : SWWMWeapon
Weapon.SelectionOrder 500;
Weapon.AmmoType1 "RedShell";
Weapon.AmmoGive1 1;
//SWWMWeapon.SwapWeapon "PuntzerBeta";
SWWMWeapon.DropAmmoType "Clip";
Stamina 15000;
+SWWMWEAPON.NOFIRSTGIVE;

View file

@ -2129,6 +2129,7 @@ Class Sparkster : SWWMWeapon
Stamina 200000;
Weapon.AmmoType1 "SparkUnit";
Weapon.AmmoGive1 1;
//SWWMWeapon.SwapWeapon "BlackfireIgniter";
SWWMWeapon.DropAmmoType "SparkUnit";
Sparkster.ClipCount 8;
+SWWMWEAPON.NOFIRSTGIVE;

View file

@ -1160,6 +1160,7 @@ 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

@ -1147,6 +1147,7 @@ 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

@ -370,6 +370,7 @@ Class SWWMLoreLibrary : Thinker
if ( ref ~== "BlackfireIgniter" ) return true;
if ( ref ~== "EMPCarbine" ) return true;
if ( ref ~== "RayKhom" ) return true;
if ( ref ~== "GrandLance" ) return true;
// same for white lady
if ( ref ~== "WhiteLady" ) return true;
// check if entry is for a collectible