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

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r330 \cu(Tue 16 Aug 21:31:38 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r330 \cu(2022-08-16 21:31:38)\c-";
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r331 \cu(Tue 16 Aug 23:17:12 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r331 \cu(2022-08-16 23:17:12)\c-";

View file

@ -30,6 +30,15 @@ Model "Quadravol"
FrameIndex XZWZ E 2 91
FrameIndex XZWZ F 2 92
FrameIndex XZWZ G 2 93 // Drop
// Load
FrameIndex XZWZ H 2 100
FrameIndex XZWZ I 2 101
FrameIndex XZWZ J 2 102
FrameIndex XZWZ K 2 103
FrameIndex XZWZ L 2 104
FrameIndex XZWZ M 2 105
FrameIndex XZWZ N 2 106
FrameIndex XZWZ O 2 107
}
Model "Quadravol"
@ -143,4 +152,32 @@ Model "Quadravol"
FrameIndex XZW5 J 1 93 // Chamber
FrameIndex XZW5 K 1 94
FrameIndex XZW5 L 1 95
// LoadStart
FrameIndex XZW5 M 1 97
FrameIndex XZW5 N 1 98
FrameIndex XZW5 O 1 99
// LoadLoop
FrameIndex XZW5 P 1 100 // LoadOverlay
FrameIndex XZW5 Q 1 101
FrameIndex XZW5 R 1 102
FrameIndex XZW5 S 1 103 // LoadSnd
FrameIndex XZW5 T 1 104
FrameIndex XZW5 U 1 105
FrameIndex XZW5 V 1 106
FrameIndex XZW5 W 1 107 // LoadCell
FrameIndex XZW5 X 1 108
FrameIndex XZW5 Y 1 109
FrameIndex XZW5 Z 1 110
FrameIndex XZW6 A 1 111
// LoadEnd
FrameIndex XZW6 B 1 113
FrameIndex XZW6 C 1 114
FrameIndex XZW6 D 1 115
FrameIndex XZW6 E 1 116
FrameIndex XZW6 F 1 117
FrameIndex XZW6 G 1 118
FrameIndex XZW6 H 1 119
FrameIndex XZW6 I 1 120
FrameIndex XZW6 J 1 121
FrameIndex XZW6 K 1 122
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

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: