Quadravol reload functionality.

This commit is contained in:
Mari the Deer 2022-08-16 23:17:12 +02:00
commit 311b06f2d6
6 changed files with 122 additions and 8 deletions

View file

@ -59,6 +59,7 @@ Class Quadravol : SWWMWeapon
override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount )
{
if ( sv_infiniteammo || Owner.FindInventory('PowerInfiniteAmmo',true) ) return true;
if ( (firemode == PrimaryFire) || (firemode == EitherFire) )
{
if ( (chargelevel > 0) || (chambered && !charged) || (clipcount > 0) || (Ammo1.Amount > 0) ) return true;
@ -88,6 +89,21 @@ Class Quadravol : SWWMWeapon
}
}
action void A_LoadOverlay()
{
A_StartSound("demolitionist/handsdown",CHAN_WEAPON,CHANF_OVERLAP,.8);
A_ChangeModel("",2,"","",5,"models","QuadCell.png",CMDL_USESURFACESKIN,-1);
A_Overlay(PSP_WEAPON+1,"LoadOverlay");
}
action void A_Load()
{
A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP,.3);
invoker.clipcount = min(invoker.default.clipcount,invoker.clipcount+1);
if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) )
invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1);
}
action bool A_Fill()
{
if ( !invoker.chambered || invoker.charged || (invoker.chargelevel >= 5) ) return false;
@ -98,8 +114,31 @@ Class Quadravol : SWWMWeapon
action void A_DropCasing()
{
if ( invoker.wascharged ) Console.Printf("\cg// TODO - Drop Casing\c-");
else Console.Printf("\cg// TODO - Drop Ammo\c-");
Vector3 x, y, z;
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),-8*x+8*y-16*z);
if ( invoker.wascharged )
{
Console.Printf("\cg// TODO - Drop Casing\c-");
return;
}
if ( invoker.Ammo1.Amount >= invoker.Ammo1.MaxAmount )
{
let a = Inventory(Spawn("QuadravolAmmo",origin));
a.bDROPPED = true;
a.DropTime = 30;
a.bSpecial = a.bSolid = false;
a.Angle = Angle+190;
a.VelFromAngle(5.);
a.Vel.Z = -1.;
a.Vel += Vel;
a.bNoGravity = false;
a.ClearCounters();
a.OnDrop(self);
a.vel += (RotateVector((FRandom[Junk](-1.5,.5),FRandom[Junk](-1.5,1.5)),a.angle),FRandom[Junk](-1.5,1.5));
return;
}
invoker.Ammo1.Amount++;
}
Default
@ -139,11 +178,23 @@ Class Quadravol : SWWMWeapon
XZW2 A 1
{
A_Fill(); // just in case
A_WeaponReady();
int flg = WRF_ALLOWUSER1|WRF_ALLOWZOOM;
if ( invoker.clipcount < invoker.default.clipcount ) flg |= WRF_ALLOWRELOAD;
if ( (invoker.chargelevel <= 0) && (invoker.Ammo1.Amount <= 0) && (invoker.clipcount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) flg |= WRF_NOPRIMARY;
A_WeaponReady(flg);
}
Wait;
Fire:
XZW2 A 1;
// TODO firing
XZW2 A 1
{
if ( invoker.chargelevel <= 0 )
{
if ( invoker.clipcount > 0 ) return ResolveState("AltFire");
return ResolveState("Reload");
}
return ResolveState(null);
}
Goto Ready;
AltFire:
XZW2 A 2;
@ -155,7 +206,7 @@ Class Quadravol : SWWMWeapon
XZW5 I 2;
XZW5 J 2 A_Fill();
XZW5 K 2;
XZW5 L 3;
XZW5 L 2;
Goto Ready;
DropCasing:
XZWZ ABCDEF 2;
@ -163,12 +214,38 @@ Class Quadravol : SWWMWeapon
TNT1 A 1 A_DropCasing();
Stop;
Reload:
XZW2 A 1;
// TODO idle animation on full load
XZW2 A 2 A_StartSound("quadshot/onehand",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 MNO 3;
Goto ReloadHold;
ReloadHold:
XZW5 P 2 A_LoadOverlay();
XZW5 QRS 2;
XZW5 T 2 A_StartSound("quadshot/load",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 UV 2;
XZW5 W 2 A_Load();
XZW5 XYZ 2;
XZW6 A 2;
XZW5 P 2
{
if ( (invoker.clipcount >= invoker.default.clipcount) || ((invoker.Ammo1.Amount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true)) )
return ResolveState(null);
return A_JumpIf(player.cmd.buttons&BT_RELOAD,"ReloadHold");
}
XZW6 B 2 A_StartSound("quadshot/twohand",CHAN_WEAPON,CHANF_OVERLAP);
XZW6 CDEF 2;
XZW6 GHIJK 3;
Goto Ready;
LoadOverlay:
XZWZ HIJKLMN 2;
XZWZ O 0;
Stop;
Zoom:
// TODO stance switch
XZW2 A 1;
Goto Ready;
User1:
// TODO melee
XZW2 A 1;
Goto Ready;
Deselect: