Dakka progress continues. More tomorrow.

This commit is contained in:
Mari the Deer 2022-07-22 01:34:12 +02:00
commit 4ec3a595c4
8 changed files with 497 additions and 16 deletions

View file

@ -20,15 +20,38 @@ extend Class HeavyMahSheenGun
else if ( firespeed == 1 ) for ( int i=0; i<3; i++ ) Screen.DrawTexture(SpeedTex,false,bx-21,(by-14)+i*4,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
else if ( firespeed == 2 ) for ( int i=0; i<5; i++ ) Screen.DrawTexture(SpeedTex,false,bx-21,(by-14)+i*2,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
// TODO heat bar
if ( fired )
Screen.DrawText(NewConsoleFont,Font.CR_RED,64,64,String.Format("heat: %g\nshake: %g\nspread: %g\ntimer: %d",barrelheat,vibrate,aimerror,firetimer?((gametic-firetimer)/GameTicRate):0));
bool isfired = !!fired;
double firefact = 0.;
if ( firespeed == 0 )
{
Screen.DrawTexture(BulletTex[1],false,bx-15,(by-10)-4*TicFrac,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
if ( Ammo1.Amount <= 0 ) return;
Screen.DrawTexture(BulletTex[0],false,bx-15,(by-14)-4*TicFrac,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
isfired = isfired&&((fired+7)>=gametic);
firefact = clamp((gametic+TicFrac)-fired,0.,7.)/7.;
}
else for ( int i=0; i<2; i++ )
else if ( firespeed == 1 )
{
if ( Ammo1.Amount <= i ) break;
isfired = isfired&&((fired+3)>=gametic);
firefact = clamp((gametic+TicFrac)-fired,0.,3.)/3.;
}
else if ( firespeed == 2 )
{
isfired = isfired&&((fired+1)>=gametic);
firefact = TicFrac;
}
bool infammo = (sv_infiniteammo||Owner.FindInventory('PowerInfiniteAmmo',true));
if ( isfired )
{
Screen.DrawTexture(BulletTex[1],false,bx-15,(by-10)-4*firefact,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,1.-firefact);
for ( int i=0; i<2; i++ )
{
if ( !infammo && (Ammo1.Amount <= i) ) break;
Screen.DrawTexture(BulletTex[0],false,bx-15,(by-6)-4*firefact+i*4,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ClipBottom,int((by-2)*hs),DTA_Alpha,(i==0)?1.:firefact);
}
return;
}
for ( int i=0; i<2; i++ )
{
if ( !infammo && (Ammo1.Amount <= i) ) break;
Screen.DrawTexture(BulletTex[0],false,bx-15,(by-10)+i*4,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
}

View file

@ -3,10 +3,90 @@
Class HeavyMahSheenGun : SWWMWeapon
{
bool fired;
int fired;
int firespeed;
double barrelheat;
bool incooldown;
double barrelheat, aimerror, vibrate;
bool incooldown, stopfire, firstshot;
int firetimer;
action void A_SheenFire()
{
invoker.stopfire = ((invoker.Ammo1.Amount<=1)||!(player.cmd.buttons&BT_ATTACK)||(player.Health<=0));
invoker.barrelheat = invoker.barrelheat*(1.025-invoker.firespeed*.008)+3.-(invoker.firespeed**.8)*1.35;
invoker.aimerror = min(1.,invoker.aimerror*1.01+.01+invoker.firespeed*.01);
if ( invoker.firespeed == 1 )
{
A_StartSound("sheen/700rpm",CHAN_WEAPONEXTRA,CHANF_LOOPING,attenuation:.5);
invoker.vibrate = .25;
A_Overlay(-9999,"EjectRound3");
SWWMUtility.AchievementProgress("dakka",(gametic-invoker.firetimer)/GameTicRate,player);
}
else if ( invoker.firespeed == 2 )
{
A_StartSound("sheen/2100rpm",CHAN_WEAPONEXTRA,CHANF_LOOPING,attenuation:.4);
invoker.vibrate = min(1.,invoker.vibrate*1.05+.05);
A_Overlay(-9999,"EjectRound1");
}
else if ( invoker.firespeed == 0 )
{
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6);
A_Overlay(-9999,"EjectRound7");
}
if ( invoker.barrelheat > 100. ) invoker.stopfire = invoker.incooldown = true;
invoker.firstshot = true;
if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) )
invoker.Ammo1.Amount--;
invoker.fired = gametic;
// TODO the actual firing itself
}
action void A_CheckContinueFire()
{
if ( invoker.incooldown || (invoker.Ammo1.Amount <= 0) || (player.Health <= 0) ) return;
invoker.stopfire = !(player.cmd.buttons&BT_ATTACK);
}
override void OwnerDied()
{
if ( Owner.IsActorPlayingSound(CHAN_WEAPONEXTRA) )
{
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2);
}
Super.OwnerDied();
aimerror = 0.;
vibrate = 0.;
}
override void Travelled()
{
Super.Travelled();
aimerror = 0.;
vibrate = 0.;
}
override void DoEffect()
{
Super.DoEffect();
barrelheat = max(0.,barrelheat*.99-.15);
if ( barrelheat <= 0. ) incooldown = false;
if ( !Owner || !Owner.player || (Owner.player.ReadyWeapon != self) )
{
aimerror = 0.;
vibrate = 0.;
return;
}
let pspm = Owner.player.FindPSprite(PSP_WEAPON);
if ( pspm )
{
pspm.x = FRandom[Shivers](-1.,1.)*vibrate*4.;
pspm.y = 32+FRandom[Shivers](-1.,1.)*vibrate*4.;
}
aimerror *= .95;
}
override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount )
{
if ( sv_infiniteammo || Owner.FindInventory('PowerInfiniteAmmo',true) ) return true;
if ( (fireMode == PrimaryFire) || (fireMode == AltFire) )
return (Ammo1.Amount > 0);
return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount);
}
Default
{
@ -54,10 +134,271 @@ Class HeavyMahSheenGun : SWWMWeapon
XZW2 WX 3;
Goto Ready;
Ready:
XZW2 A 1 A_WeaponReady();
XZW2 A 1
{
invoker.firetimer = gametic;
invoker.aimerror = 0.;
invoker.vibrate = 0.;
int flg = WRF_ALLOWRELOAD|WRF_ALLOWUSER1;
if ( invoker.firespeed > 0 ) flg |= WRF_ALLOWZOOM;
if ( invoker.firespeed >= 2 ) flg |= WRF_NOSECONDARY;
if ( (invoker.Ammo1.Amount <= 0) || invoker.incooldown ) flg |= WRF_NOPRIMARY;
A_WeaponReady(flg);
if ( player.cmd.buttons&BT_ATTACK )
invoker.CheckAmmo(EitherFire,true);
}
Wait;
Fire:
XZW2 A 1;
XZW2 Z 1
{
invoker.firstshot = false;
if ( (invoker.firespeed == 0) || (invoker.Ammo1.Amount <= 1) && !(player.cmd.buttons&BT_ATTACK) )
return A_Jump(256,"SlowFire1","SlowFire2","SlowFire3");
if ( invoker.firespeed == 1 )
return A_Jump(256,"FastFire1","FastFire2","FastFire3");
if ( invoker.firespeed == 2 )
return ResolveState("VeryFastFire");
return ResolveState(null);
}
Goto Ready;
SlowFire1:
XZW2 Z 1 A_SheenFire();
XZW3 ABCDEF 1;
XZW3 G 0;
XZW2 Z 0
{
if ( !invoker.incooldown && (invoker.Ammo1.Amount > 0) && (player.cmd.buttons&BT_ATTACK) )
return A_Jump(256,"SlowFire2","SlowFire3");
return ResolveState(null);
}
Goto StopFire;
SlowFire2:
XZW2 Z 1 A_SheenFire();
XZW3 HIJKLM 1;
XZW3 N 0;
XZW2 Z 0
{
if ( !invoker.incooldown &&(invoker.Ammo1.Amount > 0) && (player.cmd.buttons&BT_ATTACK) )
return A_Jump(256,"SlowFire1","SlowFire3");
return ResolveState(null);
}
Goto StopFire;
SlowFire3:
XZW2 Z 1 A_SheenFire();
XZW3 OPQRST 1;
XZW3 U 0
{
if ( !invoker.incooldown &&(invoker.Ammo1.Amount > 0) && (player.cmd.buttons&BT_ATTACK) )
return A_Jump(256,"SlowFire1","SlowFire2");
return ResolveState(null);
}
Goto StopFire;
FastFire1:
XZW2 Z 1 A_SheenFire();
XZW3 VW 1 A_CheckContinueFire();
XZW3 X 0
{
A_CheckContinueFire();
if ( !invoker.stopfire ) return A_Jump(256,"FastFire2","FastFire3");
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2);
return ResolveState(null);
}
Goto StopFire;
FastFire2:
XZW2 Z 1 A_SheenFire();
XZW3 YZ 1 A_CheckContinueFire();
XZW4 A 0
{
A_CheckContinueFire();
if ( !invoker.stopfire ) return A_Jump(256,"FastFire1","FastFire3");
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2);
return ResolveState(null);
}
Goto StopFire;
FastFire3:
XZW2 Z 1 A_SheenFire();
XZW4 BC 1 A_CheckContinueFire();
XZW4 D 0
{
A_CheckContinueFire();
if ( !invoker.stopfire ) return A_Jump(256,"FastFire1","FastFire2");
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2);
return ResolveState(null);
}
Goto StopFire;
VeryFastFire:
XZW2 Z 1 A_SheenFire();
XZW4 E 1
{
A_CheckContinueFire();
if ( invoker.stopfire )
{
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2);
return ResolveState("EndFireFast1");
}
A_SheenFire();
return ResolveState(null);
}
XZW4 F 1
{
A_CheckContinueFire();
if ( invoker.stopfire )
{
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2);
return ResolveState("EndFireFast2");
}
A_SheenFire();
return ResolveState(null);
}
XZW4 G 1
{
A_CheckContinueFire();
if ( invoker.stopfire )
{
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2);
return ResolveState("EndFireFast3");
}
A_SheenFire();
return ResolveState(null);
}
XZW4 H 1
{
A_CheckContinueFire();
if ( invoker.stopfire )
{
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2);
return ResolveState("EndFireFast4");
}
A_SheenFire();
return ResolveState(null);
}
XZW4 I 1
{
A_CheckContinueFire();
if ( invoker.stopfire )
{
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2);
return ResolveState("EndFireFast5");
}
A_SheenFire();
return ResolveState(null);
}
XZW4 J 1
{
A_CheckContinueFire();
if ( invoker.stopfire )
{
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2);
return ResolveState("EndFireFast6");
}
A_SheenFire();
return ResolveState(null);
}
VeryFastFireHold:
XZW4 K 1
{
A_CheckContinueFire();
if ( invoker.stopfire )
{
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2);
return ResolveState("EndFireFast7");
}
A_SheenFire();
return ResolveState(null);
}
XZW4 L 0;
Goto VeryFastFireHold;
EndFireFast7:
XZW4 MNO 1 { invoker.vibrate *= .25; }
Goto Ready;
EndFireFast6:
XZW4 PQR 1 { invoker.vibrate *= .25; }
Goto Ready;
EndFireFast5:
XZW4 STU 1 { invoker.vibrate *= .25; }
Goto Ready;
EndFireFast4:
XZW4 VWX 1 { invoker.vibrate *= .25; }
Goto Ready;
EndFireFast3:
XZW4 YZ 1 { invoker.vibrate *= .25; }
XZW5 A 1 { invoker.vibrate *= .25; }
Goto Ready;
EndFireFast2:
XZW5 BCD 1 { invoker.vibrate *= .25; }
Goto Ready;
EndFireFast1:
XZW5 EFG 1 { invoker.vibrate *= .25; }
Goto Ready;
StopFire:
XZW2 Z 1 A_StopSound(CHAN_WEAPONEXTRA); // just in case
Goto Ready;
EjectRound7:
TNT1 A 7;
Goto EjectRound;
EjectRound3:
TNT1 A 3;
Goto EjectRound;
EjectRound1:
TNT1 A 7;
Goto EjectRound;
EjectRound:
TNT1 A 1; // TODO
Stop;
AltFire:
XZW2 A 3 A_StartSound("sheen/crankin",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 IJ 2;
XZW5 K 3 { invoker.firespeed = min(2,invoker.firespeed+1); }
XZW5 L 4 A_StartSound("sheen/crankout",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 M 5;
Goto Ready;
Zoom:
XZW2 A 3 A_StartSound("sheen/crankin",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 NO 2;
XZW5 P 3 { invoker.firespeed = max(0,invoker.firespeed-1); }
XZW5 Q 4 A_StartSound("sheen/crankout",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 R 5;
Goto Ready;
Reload:
XZW2 A 3
{
A_StartSound("sheen/deselect",CHAN_WEAPON,CHANF_OVERLAP);
A_PlayerCheckGun();
}
XZW5 TUVW 3;
XZW5 XYZ 4;
XZW6 A 4;
XZW6 B 3 A_StartSound("sheen/meleeend",CHAN_WEAPON,CHANF_OVERLAP);
XZW6 CDE 3;
XZW6 FGHIJKL 2;
Goto Ready;
User1:
XZW2 A 3 A_StartSound("sheen/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
XZW6 MNOPQR 3;
XZW6 S 3 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
XZW6 T 3;
XZW6 U 2
{
A_Parry(9);
A_PlayerMelee();
}
XZW6 V 2;
XZW6 W 2 A_Melee(70,"demolitionist/whitl",1.25,1.3,1.2);
XZW6 XYZ 3;
XZW7 AB 4;
XZW7 C 4 A_StartSound("sheen/meleeend",CHAN_WEAPON,CHANF_OVERLAP);
XZW7 DEFGHIJKL 2;
Goto Ready;
Deselect:
XZW2 A 2 A_StartSound("sheen/deselect",CHAN_WEAPON,CHANF_OVERLAP);