swwmgz_m/zscript/dlc1/swwm_mister.zsc

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;
}
}