Corrected various backface culling issues on weapons (rifle, peacemaker, autocannon). Fixed crash with dispersion pistol powerups due to typo. Fixed razorclaw and impaler not temporarily disabling invisibility on melee attack. Fixed rifle being visible with low zoom.
947 lines
21 KiB
Text
947 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 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 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_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;
|
|
}
|
|
}
|