More Quadravol progress. Document charge levels in library.

This commit is contained in:
Mari the Deer 2022-08-18 18:33:42 +02:00
commit c80c2f0e1b
14 changed files with 143 additions and 18 deletions

View file

@ -5,7 +5,7 @@ Class Quadravol : SWWMWeapon
{
int clipcount;
int chargelevel;
bool chambered, charged, waschambered, wascharged;
bool chambered, charged, waschambered, wascharged, fromfire;
bool onehand;
bool initialized;
@ -76,6 +76,37 @@ Class Quadravol : SWWMWeapon
else origin.A_StartSound(UpSound,CHAN_WEAPON,CHANF_OVERLAP);
}
action State A_QuadFire()
{
static const String BaseNum[] = {"one","two","three","four","five"};
static const StateLabel FireStates[] = {"FireOne","FireTwo","FireThree","FireFour","FireFive"};
int idx = clamp(invoker.chargelevel-1,0,4);
A_StartSound("quadshot/fire"..BaseNum[idx],CHAN_WEAPON,CHANF_OVERLAP);
A_PlayerFire();
switch ( idx )
{
case 0:
A_Log("\cg// TODO - Fire Level 1\c-");
break;
case 1:
A_Log("\cg// TODO - Fire Level 2\c-");
break;
case 2:
A_Log("\cg// TODO - Fire Level 3\c-");
break;
case 3:
A_Log("\cg// TODO - Fire Level 4\c-");
break;
case 4:
if ( !invoker.charged ) A_Log("\cg// TODO - Fire Level 5+\c-");
else A_Log("\cg// TODO - Fire Level 5\c-");
break;
}
invoker.chargelevel = 0;
invoker.charged = true; // eat it up
return ResolveState(FireStates[idx]);
}
action void A_Eject()
{
invoker.waschambered = invoker.chambered;
@ -182,7 +213,6 @@ Class Quadravol : SWWMWeapon
Super.AttachToOwner(other);
}
Default
{
Tag "$T_QUADRAVOL";
@ -220,23 +250,50 @@ Class Quadravol : SWWMWeapon
XZW2 A 1
{
A_Fill(); // just in case
int flg = WRF_ALLOWUSER1|WRF_ALLOWZOOM;
if ( invoker.clipcount < invoker.default.clipcount ) flg |= WRF_ALLOWRELOAD;
int flg = WRF_ALLOWRELOAD|WRF_ALLOWUSER1|WRF_ALLOWZOOM;
if ( (invoker.chargelevel <= 0) && (invoker.Ammo1.Amount <= 0) && (invoker.clipcount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) flg |= WRF_NOPRIMARY;
invoker.fromfire = false;
A_WeaponReady(flg);
if ( player.cmd.buttons&BT_ATTACK )
invoker.CheckAmmo(EitherFire,true);
}
Wait;
Fire:
// TODO firing
XZW2 A 1
{
if ( invoker.chargelevel <= 0 )
{
if ( invoker.clipcount > 0 ) return ResolveState("AltFire");
invoker.fromfire = true;
return ResolveState("Reload");
}
return ResolveState(null);
return A_QuadFire();
}
FireOne:
XZW2 A 1;
XZW3 OPQR 2;
XZW3 STUV 3;
Goto Ready;
FireTwo:
XZW2 A 1;
XZW3 WXYZ 2;
XZW4 ABCD 3;
Goto Ready;
FireThree:
XZW2 A 1;
XZW4 EFGH 2;
XZW4 IJKL 3;
Goto Ready;
FireFour:
XZW2 A 1;
XZW4 MNOP 2;
XZW4 QRST 3;
Goto Ready;
FireFive:
XZW2 A 1;
XZW4 UVWX 2;
XZW4 YZ 3;
XZW5 AB 3;
Goto Ready;
AltFire:
XZW2 A 2 A_PlayerCheckGun();
@ -256,8 +313,13 @@ Class Quadravol : SWWMWeapon
TNT1 A 1 A_DropCasing();
Stop;
Reload:
// TODO idle animation on full load
XZW2 A 2 A_StartSound("quadshot/onehand",CHAN_WEAPON,CHANF_OVERLAP);
XZW2 A 2
{
if ( (invoker.clipcount >= invoker.default.clipcount) || ((invoker.Ammo1.Amount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true)) )
return ResolveState("Idle");
A_StartSound("quadshot/onehand",CHAN_WEAPON,CHANF_OVERLAP);
return ResolveState(null);
}
XZW5 MNO 3;
Goto ReloadHold;
ReloadHold:
@ -272,6 +334,9 @@ Class Quadravol : SWWMWeapon
{
if ( (invoker.clipcount >= invoker.default.clipcount) || ((invoker.Ammo1.Amount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true)) )
return ResolveState(null);
if ( invoker.fromfire && (player.cmd.buttons&BT_ATTACK) )
return ResolveState("ReloadHold");
invoker.fromfire = false;
return A_JumpIf(player.cmd.buttons&BT_RELOAD,"ReloadHold");
}
XZW6 B 2 A_StartSound("quadshot/twohand",CHAN_WEAPON,CHANF_OVERLAP);
@ -282,18 +347,26 @@ Class Quadravol : SWWMWeapon
XZWZ HIJKLMN 2;
XZWZ O 0;
Stop;
Idle:
// TODO idle
XZW2 A 1 A_Log("\cg// TODO - Idle Animation\c-");
XZW2 A 1 A_JumpIf(!(player.cmd.buttons&BT_RELOAD),"Ready");
Wait;
Zoom:
// TODO stance switch
XZW2 A 1;
Goto Ready;
XZW2 A 1 A_Log("\cg// TODO - Stance Switch\c-");
XZW2 A 1 A_JumpIf(!(player.cmd.buttons&BT_ZOOM),"Ready");
Wait;
User1:
// TODO melee
XZW2 A 1;
Goto Ready;
XZW2 A 1 A_Log("\cg// TODO - Quick Melee\c-");
XZW2 A 1 A_JumpIf(!(player.cmd.buttons&BT_USER1),"Ready");
Wait;
Deselect:
XZW2 A 1 A_StartSound("quadshot/deselect",CHAN_WEAPON,CHANF_OVERLAP);
XZW2 BCDEFGHIJKLMNOPQR 1;
XZW2 R -1 A_FullLower();
Stop;
// TODO one-handed states
}
}

View file

@ -104,9 +104,7 @@ Class mkBloodSpray : Actor
return;
}
if ( isFrozen() ) return;
Vector3 setofs;
setofs.xy = RotateVector(attachofs.xy,target.angle);
setofs.z = attachofs.z;
Vector3 setofs = SWWMUtility.RotateVector3(attachofs,target.angle);
SetOrigin(level.Vec3Offset(target.pos,setofs),false);
int sz = max(1,args[0]/2);
double ang, pt;