272 lines
6.7 KiB
Text
272 lines
6.7 KiB
Text
// Plutoni Inc. Mortal Rifle (from UnSX 2)
|
|
// Slot 9, spawns shared with Candygun
|
|
|
|
Class MisterRifle : SWWMWeapon
|
|
{
|
|
int clipcount;
|
|
bool chambered, fired;
|
|
bool gchambered, gfired;
|
|
bool boltlock, initialized;
|
|
bool waschambered, wasfired;
|
|
bool wasgchambered, wasgfired;
|
|
int firemode;
|
|
ui int lastfiremode;
|
|
String serialnum;
|
|
|
|
Property ClipCount : clipcount;
|
|
|
|
override void AttachToOwner( Actor other )
|
|
{
|
|
if ( !initialized )
|
|
{
|
|
initialized = true;
|
|
chambered = false;
|
|
fired = false;
|
|
gchambered = true; // stat with one grenade
|
|
gfired = false;
|
|
boltlock = false;
|
|
// generate a serial number
|
|
serialnum = "00000";
|
|
SWWMUtility.ObscureText(serialnum,Random[MRifle](),true);
|
|
}
|
|
Super.AttachToOwner(other);
|
|
}
|
|
|
|
override void HudTick()
|
|
{
|
|
Super.HudTick();
|
|
if ( lastfiremode && (lastfiremode != firemode+1) && (Owner.player == players[consoleplayer]) )
|
|
{
|
|
let bar = SWWMStatusBar(statusbar);
|
|
if ( bar )
|
|
{
|
|
bar.ntagstr = StringTable.Localize("$SWWM_MRMODE"..(firemode+1));
|
|
bar.ntagtic = level.totaltime;
|
|
bar.ntagcol = nametagcolor;
|
|
}
|
|
}
|
|
lastfiremode = firemode+1;
|
|
}
|
|
|
|
override bool ReportHUDAmmo()
|
|
{
|
|
return (chambered&&!fired)||(clipcount>0)||(Ammo1.Amount>0)||(gchambered&&!gfired)||(Ammo2.Amount>0);
|
|
}
|
|
|
|
override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount )
|
|
{
|
|
if ( sv_infiniteammo || Owner.FindInventory('PowerInfiniteAmmo',true) ) return true;
|
|
if ( firemode == PrimaryFire ) return (chambered&&!fired)||(clipcount>0)||(Ammo1.Amount>0);
|
|
if ( firemode == AltFire ) return (gchambered&&!gfired)||(Ammo2.Amount>0);
|
|
return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount);
|
|
}
|
|
|
|
override bool PickupForAmmoSWWM( SWWMWeapon ownedWeapon )
|
|
{
|
|
bool good = Super.PickupForAmmoSWWM(ownedWeapon);
|
|
let Owner = ownedWeapon.Owner;
|
|
if ( AmmoGive1 == 0 )
|
|
{
|
|
// give bullets?
|
|
if ( (clipcount > 0) || (chambered && !fired) )
|
|
{
|
|
Inventory cur = Owner.FindInventory("MisterRound");
|
|
if ( !cur )
|
|
{
|
|
cur = Inventory(Spawn("MisterRound"));
|
|
cur.Amount = 0;
|
|
cur.AttachToOwner(Owner);
|
|
}
|
|
int ingun = clipcount+(chambered&&!fired);
|
|
int maxgiveamt = min(cur.MaxAmount-cur.Amount,ingun);
|
|
int dropamt = ingun-maxgiveamt;
|
|
if ( dropamt > 0 ) cur.CreateTossable(dropamt);
|
|
cur.Amount = min(cur.MaxAmount,cur.Amount+ingun);
|
|
good = true;
|
|
}
|
|
// give grenade?
|
|
if ( gchambered && !gfired )
|
|
{
|
|
Inventory cur = Owner.FindInventory("MisterGAmmo");
|
|
if ( !cur )
|
|
{
|
|
cur = Inventory(Spawn("MisterGAmmo"));
|
|
cur.Amount = 0;
|
|
cur.AttachToOwner(Owner);
|
|
}
|
|
int ingun = (gchambered&&!gfired);
|
|
int maxgiveamt = min(cur.MaxAmount-cur.Amount,ingun);
|
|
int dropamt = ingun-maxgiveamt;
|
|
if ( dropamt > 0 ) cur.CreateTossable(dropamt);
|
|
cur.Amount = min(cur.MaxAmount,cur.Amount+ingun);
|
|
good = true;
|
|
}
|
|
}
|
|
return good;
|
|
}
|
|
|
|
override void PlayUpSound( Actor origin )
|
|
{
|
|
if ( (clipcount > 0) && (!chambered || fired) ) origin.A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
|
|
else origin.A_StartSound(UpSound,CHAN_WEAPON,CHANF_OVERLAP);
|
|
}
|
|
|
|
action void A_BoltBack( bool bCasing = false )
|
|
{
|
|
A_StartSound("mister/boltback",CHAN_WEAPON,CHANF_OVERLAP);
|
|
if ( bCasing )
|
|
{
|
|
invoker.waschambered = invoker.chambered;
|
|
invoker.wasfired = invoker.fired;
|
|
A_ChangeModel("",1,"","",8,"models",invoker.wasfired?"MortalRound_Used.png":"MortalRound.png",CMDL_USESURFACESKIN,-1);
|
|
}
|
|
invoker.chambered = invoker.fired = false;
|
|
}
|
|
|
|
action void A_BoltForward()
|
|
{
|
|
A_StartSound("mister/boltforward",CHAN_WEAPON,CHANF_OVERLAP);
|
|
if ( invoker.ClipCount > 0 )
|
|
{
|
|
invoker.clipcount--;
|
|
invoker.chambered = true;
|
|
invoker.fired = false;
|
|
}
|
|
}
|
|
|
|
action void A_DropCasing()
|
|
{
|
|
// TODO
|
|
A_ChangeModel("",1,"","",8,"models","",CMDL_USESURFACESKIN,-1);
|
|
}
|
|
|
|
action void A_FireSelect()
|
|
{
|
|
A_StartSound("mister/fireselect",CHAN_WEAPON,CHANF_OVERLAP);
|
|
invoker.firemode = (invoker.firemode+1)%4;
|
|
}
|
|
|
|
Default
|
|
{
|
|
Tag "$T_MORTALRIFLE";
|
|
Inventory.PickupMessage "$T_MORTALRIFLE";
|
|
Obituary "$O_MORTALRIFLE";
|
|
SWWMWeapon.Tooltip "$TT_MORTALRIFLE";
|
|
SWWMWeapon.GetLine "getmortalrifle";
|
|
Weapon.SlotNumber 9;
|
|
Weapon.SlotPriority 2.;
|
|
Weapon.SelectionOrder 850;
|
|
Weapon.UpSound "mister/select";
|
|
Weapon.AmmoType1 "MisterAmmo";
|
|
Weapon.AmmoGive1 1;
|
|
Weapon.AmmoType2 "MisterGAmmo";
|
|
Weapon.AmmoGive2 1;
|
|
SWWMWeapon.DropAmmoType "SWWMCellAmmoBig";
|
|
MisterRifle.ClipCount 20;
|
|
Stamina 1600000;
|
|
+SWWMWEAPON.NOFIRSTGIVE;
|
|
+SWWMWEAPON.HASSCRTEX;
|
|
+WEAPON.BFG;
|
|
Radius 30;
|
|
Height 28;
|
|
}
|
|
States
|
|
{
|
|
Select:
|
|
XZW2 P 2
|
|
{
|
|
A_FullRaise();
|
|
if ( (invoker.clipcount > 0) && (!invoker.chambered || invoker.fired) )
|
|
return ResolveState("SelectCycle");
|
|
return ResolveState(null);
|
|
}
|
|
XZW2 QRSTUV 2;
|
|
XZW2 WXYZ 1;
|
|
XZW3 ABCD 2;
|
|
Goto Ready;
|
|
SelectCycle:
|
|
XZWI RSTUVWXYZ 2;
|
|
XZWJ A 2 A_BoltBack();
|
|
XZWJ B 2;
|
|
XZWJ C 4;
|
|
XZWJ D 2
|
|
{
|
|
A_BoltForward();
|
|
A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.15);
|
|
}
|
|
XZWJ EFG 2;
|
|
XZWJ HIJK 1;
|
|
XZWJ LMNO 2;
|
|
Goto Ready;
|
|
Ready:
|
|
XZW2 A 1 A_WeaponReady(WRF_ALLOWRELOAD|WRF_ALLOWZOOM|WRF_ALLOWUSER1);
|
|
Wait;
|
|
Fire:
|
|
XZW2 A 2;
|
|
Goto Ready;
|
|
AltFire:
|
|
XZW2 A 2;
|
|
Goto Ready;
|
|
Reload:
|
|
XZW2 A 2 A_Jump(256,"Idle"); // for now, directly jump to idle until reloading is implemented
|
|
Goto Ready;
|
|
Idle:
|
|
XZW2 A 2
|
|
{
|
|
A_StartSound("mister/deselect",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_PlayerCheckGun();
|
|
}
|
|
XZW7 JKLMNO 2;
|
|
XZW7 PQR 3;
|
|
XZW7 STU 4;
|
|
XZW7 V 2 A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW7 WXY 2;
|
|
XZW7 Z 3;
|
|
XZW8 AB 3;
|
|
XZW8 CDEF 4;
|
|
XZW8 G 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.2);
|
|
XZW8 HIJK 2;
|
|
XZW8 L 3;
|
|
Goto Ready;
|
|
Zoom:
|
|
XZW2 A 2 A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW6 PQRSTUVW 2;
|
|
XZW6 X 2 A_FireSelect();
|
|
XZW6 YZ 2;
|
|
XZW7 A 2;
|
|
XZW7 B 2 A_JumpIf(player.cmd.buttons&BT_ZOOM,"ReZoom");
|
|
XZW7 CD 2;
|
|
XZW7 E 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.35);
|
|
XZW7 FGHI 2;
|
|
Goto Ready;
|
|
ReZoom:
|
|
XZW7 B 4; // smoother tween
|
|
Goto Zoom+6;
|
|
User1:
|
|
XZW2 A 2 A_StartSound("mister/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW8 MN 2;
|
|
XZW8 O 2
|
|
{
|
|
A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_PlayerMelee();
|
|
}
|
|
XZW8 PQ 2;
|
|
XZW8 R 1;
|
|
XZW8 S 1 A_Parry(8);
|
|
XZW8 T 1;
|
|
XZW8 U 1 A_Melee(50,"demolitionist/whitm",1.25,1.2,1.2);
|
|
XZW8 VWXYZ 2;
|
|
XZW9 A 2 A_StartSound("mister/meleeend",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW9 BCDEFGHIJ 2;
|
|
Goto Ready;
|
|
Deselect:
|
|
XZW2 A 2 A_StartSound("mister/deselect",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW2 BCDE 2;
|
|
XZW2 FGHIJKLMNOP 1;
|
|
XZW2 P -1 A_FullLower();
|
|
Stop;
|
|
Spawn:
|
|
XZW1 A -1;
|
|
Stop;
|
|
}
|
|
}
|