Dispersion Pistol fully implemented.

Jump boots (mostly) implemented (replacement feature not done yet).
Various adjustments.
DamNums coloring support.
This commit is contained in:
Marisa the Magician 2019-09-02 21:17:03 +02:00
commit ce68db4b36
22 changed files with 822 additions and 36 deletions

View file

@ -11,7 +11,7 @@ Class WeaponPowerUp : Inventory
override bool TryPickup( in out Actor toucher )
{
if ( !toucher.FindInventory("DispersionPistol") ) return false;
let damo = DispersionAmmo(toucher.FindInventory("DispersionAmmo"));
let damo = DefaultAmmo(toucher.FindInventory("DefaultAmmo"));
if ( damo )
{
damo.BackpackMaxAmount = damo.MaxAmount = min(90,damo.MaxAmount+10);
@ -60,7 +60,7 @@ Class WeaponPowerUpX : ASMDAmmoX
}
}
Class DispersionAmmo : Ammo
Class DefaultAmmo : Ammo
{
double rechargephase, rechargespeed;
@ -85,6 +85,361 @@ Class DispersionAmmo : Ammo
}
}
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
@ -127,42 +482,64 @@ Class DispersionPistol : UnrealWeapon
bool pendingupgrade;
double chargesize, count;
bool bCharging;
int MainUse, ChargeUse;
override void Tick()
{
Super.Tick();
if ( sting_dpistol ) AmmoUse2 = 1;
else AmmoUse2 = AmmoUse1/2;
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;
if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return;
DispersionAmmo(weap.Ammo1).rechargephase = 0;
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();
switch ( invoker.upgradelevel )
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;
@ -172,6 +549,23 @@ Class DispersionPistol : UnrealWeapon
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()
{
@ -181,30 +575,41 @@ Class DispersionPistol : UnrealWeapon
invoker.bCharging = false;
if ( self is 'UTPlayer' )
UTPlayer(self).PlayAttacking();
DispersionAmmo(weap.Ammo1).rechargephase = 0;
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;
@ -216,12 +621,32 @@ Class DispersionPistol : UnrealWeapon
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;
DispersionAmmo(weap.Ammo1).rechargephase = 0;
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();
@ -229,16 +654,14 @@ Class DispersionPistol : UnrealWeapon
invoker.count += 1./35.;
if ( invoker.count < 0.3 ) return false;
invoker.count = 0;
weap.DepleteAmmo(weap.bAltFire,true,1);
if ( (weap.Ammo1.Amount <= 0) || (invoker.chargesize >= 5.) )
return true;
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;
}
override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount )
{
if ( bCharging ) return true;
return Super.CheckAmmo(fireMode,autoSwitch,requireAmmo,ammocount);
}
Default
{
Tag "$T_DPISTOL";
@ -246,9 +669,9 @@ Class DispersionPistol : UnrealWeapon
Weapon.UpSound "dpistol/select";
Weapon.SlotNumber 1;
Weapon.SelectionOrder 1;
Weapon.AmmoType "DispersionAmmo";
Weapon.AmmoType "DefaultAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "DispersionAmmo";
Weapon.AmmoType2 "DefaultAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 50;
UTWeapon.DropAmmo 25;
@ -294,7 +717,9 @@ Class DispersionPistol : UnrealWeapon
TNT1 A 1
{
A_CheckReload();
A_WeaponReady();
let weap = Weapon(invoker);
if ( weap && weap.Ammo1.Amount > 0 ) A_WeaponReady();
else A_WeaponReady(WRF_NOFIRE);
}
Wait;
Idle:
@ -423,7 +848,7 @@ Class DispersionPistol : UnrealWeapon
#### # 0
{
A_Overlay(-9999,"Null");
invoker.AmmoUse1 = min(6,invoker.upgradelevel+1);
invoker.MainUse = min(6,invoker.upgradelevel+1);
if ( invoker.upgradelevel == 0 ) return ResolveState("Idle");
else if ( invoker.upgradelevel == 1 ) return ResolveState("Upgrade1");
else if ( invoker.upgradelevel == 2 ) return ResolveState("Upgrade2");