Dual Explodium guns can now reload independently.

This commit is contained in:
Mari the Deer 2022-02-10 13:38:58 +01:00
commit b36b2f808c
7 changed files with 283 additions and 404 deletions

View file

@ -832,35 +832,43 @@ Class DualExplodiumGun : SWWMWeapon
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftReady"));
sis = player.FindPSprite(PSP_WEAPON+1);
}
if ( sis.CurState.InStateSequence(ResolveState("LeftReady")) || sis.CurState.InStateSequence(ResolveState("LeftWaitLast")) )
if ( sis.CurState.InStateSequence(ResolveState("LeftReady")) )
{
if ( (ExplodiumGun(invoker.SisterWeapon).clipcount > 0) && !ExplodiumGun(invoker.SisterWeapon).chambered )
player.SetPSprite(PSP_WEAPON,ResolveState("PreSlide"));
else if ( (invoker.clipcount <= 0) && !invoker.chambered )
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftReloadLast"));
player.SetPSprite(PSP_WEAPON,ResolveState("Slide"));
else if ( (invoker.clipcount > 0) && !invoker.chambered )
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftPreSlide"));
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftSlide"));
else if ( (player.cmd.buttons&BT_RELOAD) && (ExplodiumGun(invoker.SisterWeapon).clipcount < ExplodiumGun(invoker.SisterWeapon).default.clipcount)
&& (ExplodiumGun(invoker.SisterWeapon).clipcount <= invoker.clipcount) ) // give priority only if less than left hand
player.SetPSprite(PSP_WEAPON,ResolveState("Reload"));
else if ( (player.cmd.buttons&BT_RELOAD) && (invoker.clipcount < invoker.default.clipcount) )
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftReload"));
else if ( !sis.CurState.InStateSequence(ResolveState("LeftWaitLast")) ) A_WeaponReady(WRF_ALLOWZOOM|WRF_ALLOWUSER1);
else A_WeaponReady();
else A_WeaponReady(WRF_ALLOWZOOM|WRF_ALLOWUSER1);
}
else
{
int flg = WRF_NOSWITCH|WRF_NOSECONDARY;
if ( !ExplodiumGun(invoker.SisterWeapon).chambered )
flg |= WRF_NOPRIMARY;
A_WeaponReady(flg);
// left weapon isn't ready, but we can still reload right weapon if needed
if ( (player.cmd.buttons&BT_RELOAD) && (ExplodiumGun(invoker.SisterWeapon).clipcount < ExplodiumGun(invoker.SisterWeapon).default.clipcount)
&& (ExplodiumGun(invoker.SisterWeapon).clipcount <= invoker.clipcount) ) // give priority only if less than left hand
player.SetPSprite(PSP_WEAPON,ResolveState("Reload"));
else
{
int flg = WRF_NOSWITCH|WRF_NOSECONDARY;
if ( !ExplodiumGun(invoker.SisterWeapon).chambered )
flg |= WRF_NOPRIMARY;
A_WeaponReady(flg);
}
}
}
Wait;
LeftReady:
XZWB A 1
{
if ( player.cmd.buttons&BT_ALTATTACK && invoker.chambered )
let sis = player.FindPSprite(PSP_WEAPON);
if ( (invoker.clipcount <= 0) && !invoker.chambered )
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftReloadLast"));
else if ( (player.cmd.buttons&BT_RELOAD) && (invoker.clipcount < invoker.default.clipcount)
&& (invoker.clipcount <= ExplodiumGun(invoker.SisterWeapon).clipcount) ) // give priority only if less than right hand
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftReload"));
else if ( player.cmd.buttons&BT_ALTATTACK && invoker.chambered )
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftFire"));
}
Wait;
@ -893,49 +901,35 @@ Class DualExplodiumGun : SWWMWeapon
XZWI N 1 A_StartSound("explodium/slidelock",CHAN_WEAPON,CHANF_OVERLAP);
XZWI OPQR 1;
XZWI S 2;
Goto WaitLast;
WaitLast:
Goto ReloadLast;
ReloadLast:
XZWI V 1
{
let sis = player.FindPSprite(PSP_WEAPON+1);
return A_JumpIf(sis.CurState.InStateSequence(ResolveState("LeftReady"))||sis.CurState.InStateSequence(ResolveState("LeftWaitLast")),"ReloadLast");
A_PlayerReload();
A_StartSound("explodium/deselect",CHAN_WEAPON,CHANF_OVERLAP);
}
Wait;
ReloadLast:
XZWI V 9
{
let sis = player.FindPSprite(PSP_WEAPON+1);
if ( sis.CurState.InStateSequence(ResolveState("LeftWaitLast")) )
player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLowerLast"));
else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLower"));
}
XZWI V 1 A_PlayerReload();
XZWI WXYZ 1;
XZWJ ABCD 1;
XZWI WXYZ 2;
XZWJ AB 2;
XZWJ CD 1;
XZWJ E 1 { ExplodiumGun(invoker.SisterWeapon).clipcount = 0; }
XZWJ F 1;
XZWJ G 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
XZWJ HIJK 1;
XZWJ L 1 A_DropMag();
XZWJ MNOPQR 1;
XZWJ S 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZWJ TUVWXYZ 1;
XZWK ABCD 1;
XZWK E 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); ExplodiumGun(invoker.SisterWeapon).clipcount = ExplodiumGun(invoker.SisterWeapon).default.clipcount; }
XZWK FGHI 1;
XZWK J 1
XZWJ HIJ 1;
XZWJ K 0 A_DropMag();
XZWJ LMN 3;
XZWJ O 2 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZWJ PQR 2;
XZWJ S 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); ExplodiumGun(invoker.SisterWeapon).clipcount = ExplodiumGun(invoker.SisterWeapon).default.clipcount; }
XZWJ TUVW 1;
XZWJ X 2 A_StartSound("explodium/select",CHAN_WEAPON,CHANF_OVERLAP);
XZWJ Y 2
{
A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP);
ExplodiumGun(invoker.SisterWeapon).clipcount--;
ExplodiumGun(invoker.SisterWeapon).chambered = true;
let sis = player.FindPSprite(PSP_WEAPON+1);
if ( sis.CurState.InStateSequence(ResolveState("LeftLowerLast")) )
player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaiseLast"));
else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise"));
}
XZWK K 1;
XZWK L 3;
XZWK MNOP 1;
XZWJ Z 2;
XZWK ABCD 2;
Goto Ready;
LeftFire:
XZWB A 1
@ -966,38 +960,41 @@ Class DualExplodiumGun : SWWMWeapon
XZWK T 1 A_StartSound("explodium/slidelock",CHAN_WEAPON,CHANF_OVERLAP);
XZWK UVWX 1;
XZWK Y 2;
Goto LeftWaitLast;
LeftWaitLast:
XZWK Z 1;
Wait;
Goto LeftReloadLast;
LeftReloadLast:
XZWK Z 9 { player.SetPSPrite(PSP_WEAPON,ResolveState("Lower")); }
XZWK Z 1 A_PlayerReload();
XZWL ABCDEFGH 1;
XZWK Z 4
{
let sis = player.FindPSprite(PSP_WEAPON);
if ( !sis.CurState.InStateSequence(ResolveState("Reload")) && !sis.CurState.InStateSequence(ResolveState("ReloadEmpty")) && !sis.CurState.InStateSequence(ResolveState("ReloadLast")) )
return ResolveState("LeftReloadLast")+1;
return ResolveState(null);
}
XZWK Z 1
{
A_PlayerReload();
A_StartSound("explodium/deselect",CHAN_WEAPON,CHANF_OVERLAP);
}
XZWL ABCDEF 2;
XZWL GH 1;
XZWL I 1 { invoker.clipcount = 0; }
XZWL J 1;
XZWL K 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
XZWL LMNO 1;
XZWL P 1 A_DropMag();
XZWL QRSTUV 1;
XZWL W 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZWL LMN 1;
XZWL O 0 A_DropMag();
XZWL PQR 3;
XZWL S 2 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZWL TUV 2;
XZWL W 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); invoker.clipcount = invoker.default.clipcount; }
XZWL XYZ 1;
XZWM ABCDEFGH 1;
XZWM I 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); invoker.clipcount = invoker.default.clipcount; }
XZWM JKLM 1;
XZWM N 1
XZWM A 1;
XZWM B 2 A_StartSound("explodium/select",CHAN_WEAPON,CHANF_OVERLAP);
XZWM C 2
{
A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP);
invoker.clipcount--;
invoker.chambered = true;
let sis = player.FindPSprite(PSP_WEAPON);
if ( sis.CurState.InStateSequence(ResolveState("LowerLast")) )
player.SetPSPrite(PSP_WEAPON,ResolveState("RaiseLast"));
else player.SetPSPrite(PSP_WEAPON,ResolveState("Raise"));
}
XZWM O 1;
XZWM P 3;
XZWM QRST 1;
XZWM DEFGH 2;
Goto LeftReady;
Casing:
XZWA A 1
@ -1039,84 +1036,42 @@ Class DualExplodiumGun : SWWMWeapon
XZWG VUT 2;
XZWB A 1;
Goto LeftReady;
LowerLast:
XZWI V 2;
XZWM UVW 2;
XZWM Y -1;
Stop;
LeftLowerLast:
XZWK Z 2;
XZWN FGH 2;
XZWN J -1;
Stop;
RaiseLast:
XZWM Y 2;
XZWN WVU 2;
XZWI V 1;
Goto WaitLast;
LeftRaiseLast:
XZWN JHGF 2;
XZWK Z 1;
Goto LeftWaitLast;
Reload:
XZW2 A 9
{
let sis = player.FindPSprite(PSP_WEAPON+1);
if ( sis.CurState.InStateSequence(ResolveState("LeftWaitLast")) )
player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLowerLast"));
else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLower"));
}
XZW2 A 1
{
A_PlayerReload();
A_StartSound("explodium/deselect",CHAN_WEAPON,CHANF_OVERLAP);
if ( ExplodiumGun(invoker.SisterWeapon).clipcount <= 0 ) return ResolveState("ReloadEmpty");
return ResolveState(null);
}
XZW2 TUVWXYZ 1;
XZW2 TUVWXY 2;
XZW2 Z 1;
XZW3 A 1;
XZW3 B 1 { ExplodiumGun(invoker.SisterWeapon).clipcount = 0; }
XZW3 C 1;
XZW3 D 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
XZW3 EFGH 1;
XZW3 I 1 A_DropMag();
XZW3 EFG 1;
XZW3 H 0 A_DropMag();
Goto ReloadEnd;
ReloadEmpty:
XZW2 A 1;
XZW3 JKLMNOPQRS 1;
XZW3 T 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
XZW3 UVWX 1;
XZW3 Y 1 A_DropMag();
XZW3 IJKLMN 2;
XZW3 OPQR 1;
XZW3 S 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
XZW3 TUV 1;
XZW3 W 0 A_DropMag();
Goto ReloadEnd;
ReloadEnd:
XZW3 Z 1;
XZW4 ABCDE 1;
XZW4 F 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZW4 GHIJKLMNOPQ 1;
XZW4 R 1
{
A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP);
ExplodiumGun(invoker.SisterWeapon).clipcount = ExplodiumGun(invoker.SisterWeapon).default.clipcount;
}
XZW4 STUV 1;
XZW2 A 0 A_JumpIf(!ExplodiumGun(invoker.SisterWeapon).chambered,"Slide");
XZW2 A 0
{
let sis = player.FindPSprite(PSP_WEAPON+1);
if ( sis.CurState.InStateSequence(ResolveState("LeftLowerLast")) )
player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaiseLast"));
else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise"));
}
XZW3 XYZ 3;
XZW4 A 2 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZW4 BCD 2;
XZW4 E 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); ExplodiumGun(invoker.SisterWeapon).clipcount = ExplodiumGun(invoker.SisterWeapon).default.clipcount; }
XZW4 FGHI 1;
XZW4 J 2 A_StartSound("explodium/select",CHAN_WEAPON,CHANF_OVERLAP);
XZW4 KLMNOP 2;
Goto Ready;
PreSlide:
XZW2 A 9
{
let sis = player.FindPSprite(PSP_WEAPON+1);
if ( sis.CurState.InStateSequence(ResolveState("LeftWaitLast")) )
player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLowerLast"));
else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLower"));
}
Slide:
XZW2 A 1;
XZW2 A 10 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLower")); }
XZW4 WXY 1;
XZW5 A 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 BC 1;
@ -1128,73 +1083,51 @@ Class DualExplodiumGun : SWWMWeapon
XZW5 EFG 1;
XZW5 H 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 IJKLM 1;
XZW2 A 0
{
let sis = player.FindPSprite(PSP_WEAPON+1);
if ( sis.CurState.InStateSequence(ResolveState("LeftLowerLast")) )
player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaiseLast"));
else player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise"));
}
XZW2 A 0 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise")); }
Goto Ready;
LeftReload:
XZWB A 9
XZWB A 4
{
let sis = player.FindPSprite(PSP_WEAPON);
if ( sis.CurState.InStateSequence(ResolveState("WaitLast")) )
player.SetPSPrite(PSP_WEAPON,ResolveState("LowerLast"));
else player.SetPSPrite(PSP_WEAPON,ResolveState("Lower"));
if ( !sis.CurState.InStateSequence(ResolveState("Reload")) && !sis.CurState.InStateSequence(ResolveState("ReloadEmpty")) && !sis.CurState.InStateSequence(ResolveState("ReloadLast")) )
return ResolveState("LeftReload")+1;
return ResolveState(null);
}
XZWB A 1
{
A_PlayerReload();
A_StartSound("explodium/deselect",CHAN_WEAPON,CHANF_OVERLAP);
if ( invoker.clipcount <= 0 ) return ResolveState("LeftReloadEmpty");
return ResolveState(null);
}
XZWB TUVWXYZ 1;
XZWB TUVWXY 2;
XZWB Z 1;
XZWC A 1;
XZWC B 1 { invoker.clipcount = 0; }
XZWC C 1;
XZWC D 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
XZWC EFGH 1;
XZWC I 1 A_DropMag(-1);
XZWC EFG 1;
XZWC H 0 A_DropMag();
Goto LeftReloadEnd;
LeftReloadEmpty:
XZWB A 1;
XZWC JKLMNOPQRS 1;
XZWC T 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
XZWC UVWX 1;
XZWC Y 1 A_DropMag(-1);
XZWC IJKLMN 2;
XZWC OPQR 1;
XZWC S 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
XZWC TUV 1;
XZWC W 0 A_DropMag();
Goto LeftReloadEnd;
LeftReloadEnd:
XZWC Z 1;
XZWD ABCDE 1;
XZWD F 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZWD GHIJKLMNOPQ 1;
XZWD R 1
{
A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP);
invoker.clipcount = invoker.default.clipcount;
}
XZWD STUV 1;
XZWB A 0 A_JumpIf(!invoker.chambered,"LeftSlide");
XZWB A 0
{
let sis = player.FindPSprite(PSP_WEAPON);
if ( sis.CurState.InStateSequence(ResolveState("LowerLast")) )
player.SetPSPrite(PSP_WEAPON,ResolveState("RaiseLast"));
else player.SetPSPrite(PSP_WEAPON,ResolveState("Raise"));
}
XZWC XYZ 3;
XZWD A 2 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZWD BCD 2;
XZWD E 1 { A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP); invoker.clipcount = invoker.default.clipcount; }
XZWD FGHI 1;
XZWD J 2 A_StartSound("explodium/select",CHAN_WEAPON,CHANF_OVERLAP);
XZWD KLMNOP 2;
Goto LeftReady;
LeftPreSlide:
XZWB A 9
{
let sis = player.FindPSprite(PSP_WEAPON);
if ( sis.CurState.InStateSequence(ResolveState("WaitLast")) )
player.SetPSPrite(PSP_WEAPON,ResolveState("LowerLast"));
else player.SetPSPrite(PSP_WEAPON,ResolveState("Lower"));
}
LeftSlide:
XZWB A 1;
XZWB A 10 { player.SetPSPrite(PSP_WEAPON,ResolveState("Lower")); }
XZWD WXY 1;
XZWE A 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP);
XZWE BC 1;
@ -1206,13 +1139,7 @@ Class DualExplodiumGun : SWWMWeapon
XZWE EFG 1;
XZWE H 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP);
XZWE IJKLM 1;
XZWB A 0
{
let sis = player.FindPSprite(PSP_WEAPON);
if ( sis.CurState.InStateSequence(ResolveState("LowerLast")) )
player.SetPSPrite(PSP_WEAPON,ResolveState("RaiseLast"));
else player.SetPSPrite(PSP_WEAPON,ResolveState("Raise"));
}
XZWB A 0 { player.SetPSPrite(PSP_WEAPON,ResolveState("Raise")); }
Goto LeftReady;
Zoom:
XZW2 A 1