stinger_m/zscript/dispersionpistol.zsc
Marisa Kirisame 862dd7f81a Beta 2 Hotfix 1:
- Ammo regeneration check for Dispersion Pistol was performed in the wrong spot.
- Fixed one of the shaders using "double" instead of "float", oops.
2019-09-27 23:06:06 +02:00

971 lines
21 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)) )
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 DoEffect()
{
Super.Tick();
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,80,6000);
A_Explode(GetMissileDamage(0,0),80);
}
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 DoEffect()
{
Super.DoEffect();
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;
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;
}
DefaultAmmo(weap.Ammo1).rechargephase = ((weap.Ammo1.Amount>0)?0:30);
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 = ((weap.Ammo1.Amount>0)?0:30);
A_PlaySound("dpistol/altfire",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));
}
}
void UpdateSelectionOrder()
{
switch ( pendingupgrade )
{
case 0:
SelectionOrder = default.SelectionOrder;
break;
case 1:
SelectionOrder = 6400;
break;
case 2:
SelectionOrder = 5000;
break;
case 3:
SelectionOrder = 2700;
break;
case 4:
default:
SelectionOrder = 1800;
break;
}
}
action State A_DispCharge( statelabel next )
{
Weapon weap = Weapon(invoker);
if ( !weap ) return ResolveState(null);
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 ResolveState(null);
invoker.count = 0;
if ( invoker.chargesize >= 5. ) return ResolveState(next);
if ( !(sv_infiniteammo || (FindInventory('PowerInfiniteAmmo',true))) )
{
if ( weap.Ammo1.Amount < invoker.ChargeUse ) return ResolveState(next);
weap.Ammo1.Amount -= invoker.ChargeUse;
}
return ResolveState(null);
}
Default
{
Tag "$T_DPISTOL";
Inventory.PickupMessage "$I_DPISTOL";
Weapon.UpSound "dpistol/select";
Weapon.SlotNumber 1;
Weapon.SelectionOrder 7700;
Weapon.SlotPriority 1;
Weapon.AmmoType "DefaultAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "DefaultAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 50;
Weapon.MinSelectionAmmo1 10;
Weapon.MinSelectionAmmo2 10;
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 A_WeaponReady(WRF_NOFIRE);
DPI1 A 5 A_WeaponReady(WRF_NOFIRE);
Goto Idle;
Ready2:
DPS2 ABCDEFGHIJK 2 A_WeaponReady(WRF_NOFIRE);
DPI2 A 5 A_WeaponReady(WRF_NOFIRE);
Goto Idle;
Ready3:
DPS3 ABCDEFGHIJK 2 A_WeaponReady(WRF_NOFIRE);
DPI3 A 5 A_WeaponReady(WRF_NOFIRE);
Goto Idle;
Ready4:
DPS4 ABCDEFGHIJK 2 A_WeaponReady(WRF_NOFIRE);
DPI4 A 5 A_WeaponReady(WRF_NOFIRE);
Goto Idle;
Ready5:
DPS5 ABCDEFGHIJK 2 A_WeaponReady(WRF_NOFIRE);
DPI5 A 5 A_WeaponReady(WRF_NOFIRE);
Goto Idle;
Dummy:
TNT1 A 1
{
A_CheckReload();
let weap = Weapon(invoker);
if ( weap && weap.Ammo1.Amount > 0 ) A_WeaponReady();
else A_WeaponReady(WRF_NOFIRE);
}
TNT1 A 1
{
A_CheckReload();
let weap = Weapon(invoker);
// doing this on the first tic breaks the whole animation for some unexplainable reason
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_DispCharge(1);
Wait;
AltRelease1:
#### # 3 A_DispAltFire();
DPF1 ABC 8;
DPI1 A 6;
Goto Idle;
AltFire2:
#### # 1 A_DispCharge(1);
Wait;
AltRelease2:
#### # 3 A_DispAltFire();
DPF2 ABC 8;
DPI2 A 6;
Goto Idle;
AltFire3:
#### # 1 A_DispCharge(1);
Wait;
AltRelease3:
#### # 3 A_DispAltFire();
DPF3 ABC 8;
DPI3 A 6;
Goto Idle;
AltFire4:
#### # 1 A_DispCharge(1);
Wait;
AltRelease4:
#### # 3 A_DispAltFire();
DPF4 ABC 8;
DPI4 A 6;
Goto Idle;
AltFire5:
#### # 1 A_DispCharge(1);
Wait;
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.UpdateSelectionOrder();
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;
}
}