stinger_m/zscript/dispersionpistol.zsc
Marisa Kirisame 225ffcc1e9 Overhaul to how reloading works, not much else has happened.
Addition to HUD for showing clip counts (kinda cheap-looking, but still better than what Oldskool did).
Charge for some weapons and loaded rockets for eightball also use the clipcount display, like in Doom Tournament.
Small fixups for dual wielding logic.
2019-09-17 02:47:13 +02:00

944 lines
20 KiB
Text

Class WeaponPowerUp : Inventory
{
Default
{
Tag "$T_WPOWERUP";
Inventory.PickupMessage "$I_WPOWERUP";
Inventory.PickupSound "misc/p_pkup";
+COUNTITEM;
+INVENTORY.BIGPOWERUP;
}
override bool TryPickup( in out Actor toucher )
{
if ( !toucher.FindInventory("DispersionPistol") ) return false;
let damo = DefaultAmmo(toucher.FindInventory("DefaultAmmo"));
if ( damo )
{
damo.BackpackMaxAmount = damo.MaxAmount = min(90,damo.MaxAmount+10);
damo.Amount = min(damo.MaxAmount,damo.Amount+10);
}
let dpis = DispersionPistol(toucher.FindInventory("DispersionPistol"));
if ( dpis && (dpis.pendingupgrade < 4) )
{
dpis.pendingupgrade++;
if ( toucher.player && (toucher.player.ReadyWeapon == dpis) && (toucher.player.PendingWeapon == WP_NOCHANGE) )
{
let psp = toucher.player.FindPSprite(PSP_Weapon);
if ( toucher.player.WeaponState&WF_WEAPONREADY )
psp.SetState(dpis.FindState("Upgrade"));
}
else ScriptUtil.SetWeapon(toucher,"DispersionPistol");
}
GoAwayAndDie();
return true;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
tracer = Spawn("WeaponPowerUpX",pos);
tracer.angle = angle;
tracer.target = self;
}
States
{
Spawn:
WPOW A -1;
Stop;
}
}
Class WeaponPowerUpX : ASMDAmmoX
{
States
{
Spawn:
WPOW ABCDEFGHIJKLMNOPQRST 3 Bright;
Loop;
}
}
Class DefaultAmmo : Ammo
{
double rechargephase, rechargespeed;
Default
{
Inventory.Icon "I_Disper";
Inventory.Amount 10;
Inventory.MaxAmount 50;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 50;
}
override void Tick()
{
Super.Tick();
if ( !Owner ) return;
rechargespeed = max(1.1,0.11*Amount);
rechargephase += 1./rechargespeed;
if ( rechargephase < 35 ) return;
rechargephase = 0;
Amount = min(Amount+1,MaxAmount);
}
}
Class DispExLight1 : PaletteLight
{
Default
{
Tag "DBlue";
Args 0,0,0,80;
ReactionTime 25;
}
}
Class DispExLight2 : PaletteLight
{
Default
{
Tag "DGreen";
Args 0,0,0,80;
ReactionTime 25;
}
}
Class DispExLight3 : PaletteLight
{
Default
{
Tag "DYellow";
Args 0,0,0,80;
ReactionTime 25;
}
}
Class DispExLight4 : PaletteLight
{
Default
{
Tag "DOrange";
Args 0,0,0,80;
ReactionTime 25;
}
}
Class DispExLight5 : PaletteLight
{
Default
{
Tag "DRed";
Args 0,0,0,80;
ReactionTime 25;
}
}
Class DispBurst1 : ASMDSpark
{
States
{
Spawn:
DEFB ABCDEFG 1 Bright
{
A_FadeOut(FRandom[ASMD](0.0,0.3));
vel *= 0.95;
}
Loop;
}
}
Class DispBurst2 : DispBurst1
{
States
{
Spawn:
DEFG ABCDEFG 1 Bright
{
A_FadeOut(FRandom[ASMD](0.0,0.3));
vel *= 0.95;
}
Loop;
}
}
Class DispBurst3 : DispBurst1
{
States
{
Spawn:
DEFY ABCDEFG 1 Bright
{
A_FadeOut(FRandom[ASMD](0.0,0.3));
vel *= 0.95;
}
Loop;
}
}
Class DispBurst4 : DispBurst1
{
States
{
Spawn:
DEFO ABCDEFG 1 Bright
{
A_FadeOut(FRandom[ASMD](0.0,0.3));
vel *= 0.95;
}
Loop;
}
}
Class DispBurst5 : DispBurst1
{
States
{
Spawn:
DEFR ABCDEFG 1 Bright
{
A_FadeOut(FRandom[ASMD](0.0,0.3));
vel *= 0.95;
}
Loop;
}
}
Class ViewDispBurst1 : ViewASMDSpark
{
States
{
Spawn:
DEFB ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3));
Loop;
}
}
Class ViewDispBurst2 : ViewDispBurst1
{
States
{
Spawn:
DEFG ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3));
Loop;
}
}
Class ViewDispBurst3 : ViewDispBurst1
{
States
{
Spawn:
DEFY ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3));
Loop;
}
}
Class ViewDispBurst4 : ViewDispBurst1
{
States
{
Spawn:
DEFO ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3));
Loop;
}
}
Class ViewDispBurst5 : ViewDispBurst1
{
States
{
Spawn:
DEFR ABCDEFG 1 Bright A_FadeOut(FRandom[ASMD](0.0,0.3));
Loop;
}
}
Class DispExplo1 : Actor
{
Default
{
RenderStyle "Add";
Scale 0.4;
+NOGRAVITY;
+NOBLOCKMAP;
Radius 0.1;
Height 0;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
Scale.x *= RandomPick[DPistol](-1,1);
Scale.y *= RandomPick[DPistol](-1,1);
}
States
{
Spawn:
DSEB ABCDEFGHIJ 2 Bright;
Stop;
}
}
Class DispExplo2 : DispExplo1
{
States
{
Spawn:
DISE ABCDEFGHIJ 2 Bright;
Stop;
}
}
Class DispExplo3 : DispExplo1
{
States
{
Spawn:
DSEY ABCDEFGHIJ 2 Bright;
Stop;
}
}
Class DispExplo4 : DispExplo1
{
States
{
Spawn:
DSEO ABCDEFGHIJ 2 Bright;
Stop;
}
}
Class DispExplo5 : DispExplo1
{
States
{
Spawn:
DSER ABCDEFGHIJ 2 Bright;
Stop;
}
}
// yes this is the projectile class name, blame Epic
Class DispersionAmmo : Actor
{
Class<Actor> LightClass, BurstClass, ExploClass;
double mult;
Property LightClass : LightClass;
Property BurstClass : BurstClass;
Property ExploClass : ExploClass;
action void A_DispTrail()
{
Vector3 x, y, z, dir;
double a, s;
Actor p;
[x,y,z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
for ( int i=0; i<3; i++ )
{
a = FRandom[DPistol](0,360);
s = FRandom[ASMD](0,0.35);
dir = (-x+y*cos(a)*s+z*sin(a)*s).unit();
p = Spawn(invoker.BurstClass,level.Vec3Offset(pos,scale.x*(dir*16.+x*32.)));
p.A_SetScale(0.1*min(0.8+invoker.mult*0.75,1.5));
p.vel = vel*0.5+dir*FRandom[DPistol](3,8);
}
}
action void A_DispExpl()
{
UTMainHandler.DoKnockback(tracer,(cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)),6000);
A_AlertMonsters();
A_SprayDecal("RazorBlast",20);
Spawn(invoker.LightClass,pos);
Actor a;
double ang, pt;
int numpt = int(Random[DPistol](12,18)*invoker.mult);
for ( int i=0; i<numpt; i++ )
{
a = Spawn(invoker.BurstClass,pos);
a.A_SetScale(0.2*min(0.8+invoker.mult*0.75,1.5));
ang = FRandom[DPistol](0,360);
pt = FRandom[DPistol](-90,90);
a.vel = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*FRandom[DPistol](6,16);
a.alpha *= 2.;
}
a = Spawn(invoker.ExploClass,pos);
a.A_SetScale(min(0.8+invoker.mult*0.8,2.5));
if ( !bAMBUSH ) return;
UTMainHandler.DoBlast(self,120,6000);
A_Explode(GetMissileDamage(0,0),120);
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
A_PlaySound("dpistol/fly",CHAN_VOICE,.9,true,2.);
mult = max(1.,mult);
}
Default
{
Obituary "$O_DPISTOL";
DamageFunction (15*mult);
DamageType 'DAmmo1';
Scale 0.8;
Radius 4;
Height 4;
Speed 25;
RenderStyle "Add";
PROJECTILE;
+FORCEXYBILLBOARD;
+SKYEXPLODE;
+EXPLODEONWATER;
+FORCERADIUSDMG;
+NODAMAGETHRUST;
+INTERPOLATEANGLES;
+HITTRACER;
DispersionAmmo.LightClass "DispExLight1";
DispersionAmmo.BurstClass "DispBurst1";
DispersionAmmo.ExploClass "DispExplo1";
}
States
{
Spawn:
DISM AABBCCDDEEFFGGHH 1 Bright A_DispTrail();
Loop;
Death:
TNT1 A 1
{
A_PlaySound("dpistol/hit",CHAN_VOICE);
A_DispExpl();
}
Stop;
}
}
Class DAmmo2 : DispersionAmmo
{
Default
{
DamageFunction (25*mult);
DamageType 'DAmmo2';
DispersionAmmo.LightClass "DispExLight2";
DispersionAmmo.BurstClass "DispBurst2";
DispersionAmmo.ExploClass "DispExplo2";
}
}
Class DAmmo3 : DispersionAmmo
{
Default
{
DamageFunction (40*mult);
DamageType 'DAmmo3';
DispersionAmmo.LightClass "DispExLight3";
DispersionAmmo.BurstClass "DispBurst3";
DispersionAmmo.ExploClass "DispExplo3";
}
}
Class DAmmo4 : DispersionAmmo
{
Default
{
DamageFunction (55*mult);
DamageType 'DAmmo4';
DispersionAmmo.LightClass "DispExLight4";
DispersionAmmo.BurstClass "DispBurst4";
DispersionAmmo.ExploClass "DispExplo4";
}
}
Class DAmmo5 : DispersionAmmo
{
Default
{
DamageFunction (75*mult);
DamageType 'DAmmo5';
DispersionAmmo.LightClass "DispExLight5";
DispersionAmmo.BurstClass "DispBurst5";
DispersionAmmo.ExploClass "DispExplo5";
}
}
Class DispLight1 : EnforcerLight
{
Default
{
args 96,64,255,80;
}
}
Class DispLight2 : EnforcerLight
{
Default
{
args 64,255,96,80;
}
}
Class DispLight3 : EnforcerLight
{
Default
{
args 255,255,96,80;
}
}
Class DispLight4 : EnforcerLight
{
Default
{
args 255,160,64,80;
}
}
Class DispLight5 : EnforcerLight
{
Default
{
args 255,96,64,80;
}
}
Class DispersionPistol : UnrealWeapon
{
int upgradelevel, pendingupgrade;
double chargesize, count;
bool bCharging;
int MainUse, ChargeUse;
override int, int, bool, bool GetClipAmount()
{
return bCharging?min(5,int(chargesize+0.1)):-1, -1, false, false;
}
override void Tick()
{
Super.Tick();
if ( MainUse < 1 ) MainUse = 1;
if ( sting_dpistol ) ChargeUse = 1;
else ChargeUse = max(1,MainUse/2);
}
action void A_DispFire()
{
Weapon weap = Weapon(invoker);
if ( !weap ) return;
if ( weap.Ammo1.Amount <= 0 ) return;
DefaultAmmo(weap.Ammo1).rechargephase = 0;
A_PlaySound("dpistol/fire",CHAN_WEAPON,Dampener.Active(self)?.4:1.,pitch:1.2);
double mult = Amplifier.GetMult(self,80);
invoker.FireEffect();
Class<Actor> proj, part;
int ulevel = invoker.upgradelevel;
if ( !(sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true)) )
{
if ( weap.Ammo1.Amount < max(10,invoker.MainUse) )
{
weap.Ammo1.Amount -= 1;
ulevel = 0;
}
else weap.Ammo1.Amount -= invoker.MainUse;
}
switch ( ulevel )
{
case 0:
proj = "DispersionAmmo";
part = "ViewDispBurst1";
UTMainHandler.DoFlash(self,Color(80,96,64,255),1);
A_Overlay(PSP_FLASH,"Flash1");
break;
case 1:
proj = "DAmmo2";
part = "ViewDispBurst2";
UTMainHandler.DoFlash(self,Color(80,64,255,96),1);
A_Overlay(PSP_FLASH,"Flash2");
break;
case 2:
proj = "DAmmo3";
part = "ViewDispBurst3";
UTMainHandler.DoFlash(self,Color(80,255,255,96),1);
A_Overlay(PSP_FLASH,"Flash3");
break;
case 3:
proj = "DAmmo4";
part = "ViewDispBurst4";
UTMainHandler.DoFlash(self,Color(80,255,160,64),1);
A_Overlay(PSP_FLASH,"Flash4");
break;
default:
proj = "DAmmo5";
part = "ViewDispBurst5";
UTMainHandler.DoFlash(self,Color(80,255,96,64),1);
A_Overlay(PSP_FLASH,"Flash5");
break;
}
A_OverlayFlags(PSP_FLASH,PSPF_RenderStyle,true);
A_OverlayRenderstyle(PSP_FLASH,STYLE_Add);
UTMainHandler.DoSwing(self,(FRandom[DPistol](-0.1,-0.3),FRandom[DPistol](-0.1,0.3)),2,-0.3,3,SWING_Spring,0,3);
if ( !Dampener.Active(self) ) A_AlertMonsters();
A_QuakeEx(2,2,2,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
Vector3 x, y, z;
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
Vector3 origin = (pos.x,pos.y,player.viewz)+10*x+3*y-3*z;
Actor p = Spawn(proj,origin);
p.angle = angle;
p.pitch = BulletSlope();
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
p.target = self;
DispersionAmmo(p).mult = mult;
int numpt = Random[DPistol](10,20);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn(part,origin);
ViewASMDSpark(s).ofs = (10,3,-3);
s.target = self;
ViewASMDSpark(s).vvel += (FRandom[ASMD](0.5,2.0),FRandom[ASMD](-1.5,1.5),FRandom[ASMD](-1.5,1.5));
}
}
action void A_DispAltFire()
{
Weapon weap = Weapon(invoker);
if ( !weap ) return;
A_WeaponOffset(0,32);
invoker.bCharging = false;
if ( self is 'UTPlayer' )
UTPlayer(self).PlayAttacking3();
DefaultAmmo(weap.Ammo1).rechargephase = 0;
A_PlaySound("dpistol/fire",CHAN_WEAPON,Dampener.Active(self)?.4:1.);
double mult = Amplifier.GetMult(self,int(invoker.ChargeSize*50)+50);
invoker.FireEffect();
int ulevel = sting_dpistol?0:invoker.upgradelevel;
Class<Actor> proj, part;
switch ( ulevel )
{
case 0:
proj = "DispersionAmmo";
part = "ViewDispBurst1";
UTMainHandler.DoFlash(self,Color(80,96,64,255),1);
A_Overlay(PSP_FLASH,"Flash1");
break;
case 1:
proj = "DAmmo2";
part = "ViewDispBurst2";
UTMainHandler.DoFlash(self,Color(80,64,255,96),1);
A_Overlay(PSP_FLASH,"Flash2");
break;
case 2:
proj = "DAmmo3";
part = "ViewDispBurst3";
UTMainHandler.DoFlash(self,Color(80,255,255,96),1);
A_Overlay(PSP_FLASH,"Flash3");
break;
case 3:
proj = "DAmmo4";
part = "ViewDispBurst4";
UTMainHandler.DoFlash(self,Color(80,255,160,64),1);
A_Overlay(PSP_FLASH,"Flash4");
break;
default:
proj = "DAmmo5";
part = "ViewDispBurst5";
UTMainHandler.DoFlash(self,Color(80,255,96,64),1);
A_Overlay(PSP_FLASH,"Flash5");
break;
}
A_OverlayFlags(PSP_FLASH,PSPF_RenderStyle,true);
A_OverlayRenderstyle(PSP_FLASH,STYLE_Add);
double ss = 0.5+invoker.chargesize*0.3;
UTMainHandler.DoSwing(self,(FRandom[DPistol](-0.1,-0.3)*ss,FRandom[DPistol](-0.1,0.3))*ss,2,-0.3,3,SWING_Spring,0,3);
if ( !Dampener.Active(self) ) A_AlertMonsters();
int qs = int(1+invoker.chargesize*0.3);
A_QuakeEx(qs,qs,qs,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
Vector3 x, y, z;
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
Vector3 origin = (pos.x,pos.y,player.viewz)+10*x+3*y-3*z;
Actor p = Spawn(proj,origin);
p.angle = angle;
p.pitch = BulletSlope();
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
p.target = self;
p.bAMBUSH = true;
double scl = 0.5+invoker.chargesize*0.6;
p.scale *= scl;
DispersionAmmo(p).mult = scl*mult*1.1;
int numpt = Random[DPistol](10,20);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn(part,origin);
ViewASMDSpark(s).ofs = (10,3,-3);
s.target = self;
ViewASMDSpark(s).vvel += (FRandom[ASMD](0.5,2.0),FRandom[ASMD](-1.5,1.5),FRandom[ASMD](-1.5,1.5));
}
}
action bool A_DispCharge()
{
Weapon weap = Weapon(invoker);
if ( !weap ) return false;
DefaultAmmo(weap.Ammo1).rechargephase = 0;
UTMainHandler.DoSwing(self,(FRandom[DPistol](-1,1),FRandom[DPistol](-1,1)),0.02*invoker.chargesize,0,2,SWING_Spring);
A_WeaponOffset(FRandom[DPistol](-1,1)*1.2*invoker.chargesize,32+FRandom[DPistol](-1,1)*1.2*invoker.chargesize);
if ( !Dampener.Active(self) ) A_AlertMonsters();
invoker.chargesize += (2.-invoker.upgradelevel*0.15)/35.;
invoker.count += 1./35.;
if ( invoker.count < 0.3 ) return false;
invoker.count = 0;
if ( invoker.chargesize >= 5. ) return true;
if ( !(sv_infiniteammo || (FindInventory('PowerInfiniteAmmo',true))) )
{
if ( weap.Ammo1.Amount < invoker.ChargeUse ) return true;
weap.Ammo1.Amount -= invoker.ChargeUse;
}
return false;
}
Default
{
Tag "$T_DPISTOL";
Inventory.PickupMessage "$I_DPISTOL";
Weapon.UpSound "dpistol/select";
Weapon.SlotNumber 1;
Weapon.SelectionOrder 2;
Weapon.SlotPriority 1;
Weapon.AmmoType "DefaultAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "DefaultAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 50;
UTWeapon.DropAmmo 25;
+WEAPON.WIMPY_WEAPON;
}
States
{
Spawn:
DPIP A -1;
Stop;
DPIP B -1;
Stop;
Ready:
DPS1 A 0
{
if ( invoker.upgradelevel == 0 ) return ResolveState("Ready1");
else if ( invoker.upgradelevel == 1 ) return ResolveState("Ready2");
else if ( invoker.upgradelevel == 2 ) return ResolveState("Ready3");
else if ( invoker.upgradelevel == 3 ) return ResolveState("Ready4");
return ResolveState("Ready5");
}
Ready1:
DPS1 ABCDEFGHIJK 2;
DPI1 A 5;
Goto Idle;
Ready2:
DPS2 ABCDEFGHIJK 2;
DPI2 A 5;
Goto Idle;
Ready3:
DPS3 ABCDEFGHIJK 2;
DPI3 A 5;
Goto Idle;
Ready4:
DPS4 ABCDEFGHIJK 2;
DPI4 A 5;
Goto Idle;
Ready5:
DPS5 ABCDEFGHIJK 2;
DPI5 A 5;
Goto Idle;
Dummy:
TNT1 A 1
{
A_CheckReload();
let weap = Weapon(invoker);
if ( invoker.pendingupgrade > invoker.upgradelevel )
player.SetPSprite(PSP_WEAPON,ResolveState("Upgrade"));
else if ( weap && weap.Ammo1.Amount > 0 ) A_WeaponReady();
else A_WeaponReady(WRF_NOFIRE);
}
Wait;
Idle:
#### # 0
{
A_Overlay(-9999,"Dummy");
if ( invoker.upgradelevel == 0 ) return ResolveState("Idle1");
else if ( invoker.upgradelevel == 1 ) return ResolveState("Idle2");
else if ( invoker.upgradelevel == 2 ) return ResolveState("Idle3");
else if ( invoker.upgradelevel == 3 ) return ResolveState("Idle4");
return ResolveState("Idle5");
}
Idle1:
DPI1 AB 30;
Goto Idle1;
Idle2:
DPI2 AB 30;
Goto Idle2;
Idle3:
DPI3 AB 30;
Goto Idle3;
Idle4:
DPI4 AB 30;
Goto Idle4;
Idle5:
DPI5 AB 30;
Goto Idle5;
Fire:
#### # 0
{
A_Overlay(-9999,"Null");
if ( invoker.upgradelevel == 0 ) return ResolveState("Fire1");
else if ( invoker.upgradelevel == 1 ) return ResolveState("Fire2");
else if ( invoker.upgradelevel == 2 ) return ResolveState("Fire3");
else if ( invoker.upgradelevel == 3 ) return ResolveState("Fire4");
return ResolveState("Fire5");
}
Fire1:
#### # 3 A_DispFire();
DPF1 ABC 5;
DPI1 A 5 A_Refire("Fire1");
Goto Idle;
Fire2:
#### # 3 A_DispFire();
DPF2 ABC 5;
DPI2 A 5 A_Refire("Fire2");
Goto Idle;
Fire3:
#### # 3 A_DispFire();
DPF3 ABC 5;
DPI3 A 5 A_Refire("Fire3");
Goto Idle;
Fire4:
#### # 3 A_DispFire();
DPF4 ABC 5;
DPI4 A 5 A_Refire("Fire4");
Goto Idle;
Fire5:
#### # 3 A_DispFire();
DPF5 ABC 5;
DPI5 A 5 A_Refire("Fire5");
Goto Idle;
AltFire:
#### # 0
{
invoker.chargesize = invoker.count = 0.;
invoker.bCharging = true;
// need to make sure player does the repeat fire anim
if ( self is 'UPlayer' )
UPlayer(self).PlayAttacking();
A_PlaySound("dpistol/charge",CHAN_WEAPON,Dampener.Active(self)?.4:1.);
A_Overlay(-9999,"Null");
if ( invoker.upgradelevel == 0 ) return ResolveState("AltFire1");
else if ( invoker.upgradelevel == 1 ) return ResolveState("AltFire2");
else if ( invoker.upgradelevel == 2 ) return ResolveState("AltFire3");
else if ( invoker.upgradelevel == 3 ) return ResolveState("AltFire4");
return ResolveState("AltFire5");
}
AltFire1:
#### # 1 A_JumpIf(A_DispCharge(),2);
#### # 0 A_ReFire("AltFire1");
AltRelease1:
#### # 3 A_DispAltFire();
DPF1 ABC 8;
DPI1 A 6;
Goto Idle;
AltFire2:
#### # 1 A_JumpIf(A_DispCharge(),2);
#### # 0 A_ReFire("AltFire2");
AltRelease2:
#### # 3 A_DispAltFire();
DPF2 ABC 8;
DPI2 A 6;
Goto Idle;
AltFire3:
#### # 1 A_JumpIf(A_DispCharge(),2);
#### # 0 A_ReFire("AltFire3");
AltRelease3:
#### # 3 A_DispAltFire();
DPF3 ABC 8;
DPI3 A 6;
Goto Idle;
AltFire4:
#### # 1 A_JumpIf(A_DispCharge(),2);
#### # 0 A_ReFire("AltFire4");
AltRelease4:
#### # 3 A_DispAltFire();
DPF4 ABC 8;
DPI4 A 6;
Goto Idle;
AltFire5:
#### # 1 A_JumpIf(A_DispCharge(),2);
#### # 0 A_ReFire("AltFire5");
AltRelease5:
#### # 3 A_DispAltFire();
DPF5 ABC 8;
DPI5 A 6;
Goto Idle;
Upgrade:
#### # 1
{
A_Overlay(-9999,"Null");
invoker.MainUse = min(6,invoker.upgradelevel+1);
invoker.upgradelevel++;
if ( invoker.upgradelevel == 0 ) return ResolveState("Idle");
else if ( invoker.upgradelevel == 1 ) return ResolveState("Upgrade1");
else if ( invoker.upgradelevel == 2 ) return ResolveState("Upgrade2");
else if ( invoker.upgradelevel == 3 ) return ResolveState("Upgrade3");
return ResolveState("Upgrade4");
}
Upgrade1:
#### # 0 A_PlaySound("dpistol/up1",CHAN_6,Dampener.Active(self)?.2:1.);
DPU1 ABCD 9;
DPI2 A 4 A_JumpIf(invoker.pendingupgrade>invoker.upgradelevel,"Upgrade");
Goto Idle;
Upgrade2:
#### # 0 A_PlaySound("dpistol/up2",CHAN_6,Dampener.Active(self)?.2:1.);
DPU2 ABCDEFGHI 9;
DPI3 A 4 A_JumpIf(invoker.pendingupgrade>invoker.upgradelevel,"Upgrade");
Goto Idle;
Upgrade3:
#### # 0 A_PlaySound("dpistol/up3",CHAN_6,Dampener.Active(self)?.2:1.);
DPU3 ABCDEFGHI 9;
DPI4 A 4 A_JumpIf(invoker.pendingupgrade>invoker.upgradelevel,"Upgrade");
Goto Idle;
Upgrade4:
#### # 0 A_PlaySound("dpistol/up4",CHAN_6,Dampener.Active(self)?.2:1.);
DPU4 ABCDEFGHI 9;
DPI5 A 4 A_JumpIf(invoker.pendingupgrade>invoker.upgradelevel,"Upgrade");
Goto Idle;
Select:
DPS1 A 1 A_Raise(int.max);
Wait;
Deselect:
#### # 0
{
A_Overlay(-9999,"Null");
if ( invoker.upgradelevel == 0 ) return ResolveState("Deselect1");
else if ( invoker.upgradelevel == 1 ) return ResolveState("Deselect2");
else if ( invoker.upgradelevel == 2 ) return ResolveState("Deselect3");
else if ( invoker.upgradelevel == 3 ) return ResolveState("Deselect4");
return ResolveState("Deselect5");
}
Deselect1:
DPD1 ABCDE 2;
DPD1 E 1 A_Lower(int.max);
Wait;
Deselect2:
DPD2 ABCDE 2;
DPD2 E 1 A_Lower(int.max);
Wait;
Deselect3:
DPD3 ABCDE 2;
DPD3 E 1 A_Lower(int.max);
Wait;
Deselect4:
DPD4 ABCDE 2;
DPD4 E 1 A_Lower(int.max);
Wait;
Deselect5:
DPD5 ABCDE 2;
DPD5 E 1 A_Lower(int.max);
Wait;
Flash1:
DPFF A 2 Bright
{
let l = Spawn("DispLight1",pos);
l.target = self;
}
Stop;
Flash2:
DPFF B 2 Bright
{
let l = Spawn("DispLight2",pos);
l.target = self;
}
Stop;
Flash3:
DPFF C 2 Bright
{
let l = Spawn("DispLight3",pos);
l.target = self;
}
Stop;
Flash4:
DPFF D 2 Bright
{
let l = Spawn("DispLight4",pos);
l.target = self;
}
Stop;
Flash5:
DPFF E 2 Bright
{
let l = Spawn("DispLight5",pos);
l.target = self;
}
Stop;
}
}