Changed Pulse Beam size to be the same as in UT99 (10 81-unit segments).
Tweaked Starter Bolt textures to look better in first person. Tweaked Pulse Beam model UVs to reduce seams. Switched Chainsaw alt-fire to damage in an arc. Rebalanced damages of Chainsaw, Enforcer, Biorifle, Pulsegun, Minigun, Flak Cannon. Adjusted Redeemer damage formula. Added view flash to Redeemer shockwave. Reduced Enforcer fire speed. Reduced delay of Minigun altfire. Should happen after exactly one cycle. Increased knockback of Impact Hammer.
|
|
@ -13,8 +13,8 @@ Model "PulseBolt"
|
||||||
{
|
{
|
||||||
Path "models"
|
Path "models"
|
||||||
Model 0 "PBolt_d.3d"
|
Model 0 "PBolt_d.3d"
|
||||||
Offset 20.25 0 0
|
Offset 40.5 0 0
|
||||||
Scale 0.2025 0.10125 0.1215
|
Scale 0.405 0.2025 0.243
|
||||||
AngleOffset 90
|
AngleOffset 90
|
||||||
DONTCULLBACKFACES
|
DONTCULLBACKFACES
|
||||||
USEACTORPITCH
|
USEACTORPITCH
|
||||||
|
|
@ -35,9 +35,9 @@ Model "PulseBolt"
|
||||||
Model "StarterBolt"
|
Model "StarterBolt"
|
||||||
{
|
{
|
||||||
Path "models"
|
Path "models"
|
||||||
Model 0 "PBolt_d.3d"
|
Model 0 "SBolt_d.3d"
|
||||||
Offset 20.25 0 0
|
Offset 40.5 0 0
|
||||||
Scale 0.2025 0.10125 0.1215
|
Scale 0.405 0.2025 0.243
|
||||||
AngleOffset 90
|
AngleOffset 90
|
||||||
DONTCULLBACKFACES
|
DONTCULLBACKFACES
|
||||||
USEACTORPITCH
|
USEACTORPITCH
|
||||||
|
|
|
||||||
BIN
models/SBolt_a.3d
Normal file
BIN
models/SBolt_d.3d
Normal file
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 4.5 KiB |
|
|
@ -409,7 +409,7 @@ Class BioGel : Actor
|
||||||
s.args[3] = int(s.args[3]*Scale.x);
|
s.args[3] = int(s.args[3]*Scale.x);
|
||||||
invoker.deadtimer = -2;
|
invoker.deadtimer = -2;
|
||||||
if ( invoker.atline ) invoker.atline.RemoteActivate(target,invoker.atside,SPAC_Impact,pos);
|
if ( invoker.atline ) invoker.atline.RemoteActivate(target,invoker.atside,SPAC_Impact,pos);
|
||||||
A_Explode(int(Random[GES](20,40)*Scale.x),Min(150,int(Scale.x*25)));
|
A_Explode(int(Random[GES](10,15)*max(1,(Scale.x-1)**2)),Min(150,int(Scale.x*25)));
|
||||||
A_PlaySound("ges/explode",CHAN_VOICE);
|
A_PlaySound("ges/explode",CHAN_VOICE);
|
||||||
int numpt = Min(300,int(Scale.x*30))+Random[GES](-10,10);
|
int numpt = Min(300,int(Scale.x*30))+Random[GES](-10,10);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
|
@ -435,13 +435,13 @@ Class BioGel : Actor
|
||||||
{
|
{
|
||||||
Obituary "%o drank a glass of %k's dripping green load.";
|
Obituary "%o drank a glass of %k's dripping green load.";
|
||||||
DamageType 'Slime';
|
DamageType 'Slime';
|
||||||
DamageFunction int(Random[GES](20,40)*Scale.x);
|
DamageFunction int(Random[GES](10,15)*max(1,(Scale.x-1)**2));
|
||||||
RenderStyle "Add";
|
RenderStyle "Add";
|
||||||
Radius 3;
|
Radius 3;
|
||||||
Height 3;
|
Height 3;
|
||||||
Scale 2;
|
Scale 2;
|
||||||
Speed 18;
|
Speed 18;
|
||||||
ProjectileKickback 220;
|
ProjectileKickback 120;
|
||||||
PROJECTILE;
|
PROJECTILE;
|
||||||
-NOGRAVITY;
|
-NOGRAVITY;
|
||||||
+SKYEXPLODE;
|
+SKYEXPLODE;
|
||||||
|
|
@ -529,7 +529,7 @@ Class BioGlob : BioGel
|
||||||
d.scale *= FRandom[GES](0.5,0.7);
|
d.scale *= FRandom[GES](0.5,0.7);
|
||||||
d.angle = atan2(dir.y,dir.x);
|
d.angle = atan2(dir.y,dir.x);
|
||||||
d.pitch = -asin(dir.z);
|
d.pitch = -asin(dir.z);
|
||||||
d.vel = (cos(d.angle)*cos(d.pitch),sin(d.angle)*cos(d.pitch),-sin(d.pitch))*d.speed*FRandom[GES](0.25,0.35);
|
d.vel = (cos(d.angle)*cos(d.pitch),sin(d.angle)*cos(d.pitch),-sin(d.pitch))*d.speed*FRandom[GES](0.3,0.4);
|
||||||
d.vel.z -= 3;
|
d.vel.z -= 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -572,7 +572,7 @@ Class BioRifle : UTWeapon
|
||||||
if ( alt )
|
if ( alt )
|
||||||
{
|
{
|
||||||
p = Spawn("BioGlob",origin);
|
p = Spawn("BioGlob",origin);
|
||||||
p.A_SetScale(1+0.8*invoker.charge);
|
p.A_SetScale(1.0+invoker.charge*0.8);
|
||||||
}
|
}
|
||||||
else p = Spawn("BioGel",origin);
|
else p = Spawn("BioGel",origin);
|
||||||
p.angle = angle;
|
p.angle = angle;
|
||||||
|
|
|
||||||
|
|
@ -101,10 +101,11 @@ Class UTChainsaw : UTWeapon
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x-2.0*z;
|
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x-2.0*z;
|
||||||
FLineTraceData d;
|
FLineTraceData d;
|
||||||
LineTrace(angle,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
double ang = (angle-45)+90*invoker.sawcnt;
|
||||||
|
LineTrace(ang,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||||
if ( d.HitType == TRACE_HitActor )
|
if ( d.HitType == TRACE_HitActor )
|
||||||
{
|
{
|
||||||
int dmg = Random[Chainsaw](50,60);
|
int dmg = Random[Chainsaw](20,30);
|
||||||
if ( d.HitLocation.z >= (d.HitActor.pos.z+d.HitActor.height*0.8) )
|
if ( d.HitLocation.z >= (d.HitActor.pos.z+d.HitActor.height*0.8) )
|
||||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg*2,'Decapitated',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
dmg = d.HitActor.DamageMobj(invoker,self,dmg*2,'Decapitated',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||||
else dmg = d.HitActor.DamageMobj(invoker,self,dmg,'slashed',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
else dmg = d.HitActor.DamageMobj(invoker,self,dmg,'slashed',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||||
|
|
@ -130,6 +131,7 @@ Class UTChainsaw : UTWeapon
|
||||||
p.pitch = asin(-d.HitDir.z);
|
p.pitch = asin(-d.HitDir.z);
|
||||||
if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation-d.HitDir*4);
|
if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation-d.HitDir*4);
|
||||||
}
|
}
|
||||||
|
invoker.sawcnt += 0.2;
|
||||||
}
|
}
|
||||||
override void DetachFromOwner()
|
override void DetachFromOwner()
|
||||||
{
|
{
|
||||||
|
|
@ -139,6 +141,7 @@ Class UTChainsaw : UTWeapon
|
||||||
}
|
}
|
||||||
action void A_Vibrate( bool bAlt = false )
|
action void A_Vibrate( bool bAlt = false )
|
||||||
{
|
{
|
||||||
|
invoker.sawcnt = 0;
|
||||||
A_AlertMonsters();
|
A_AlertMonsters();
|
||||||
if ( bAlt ) A_QuakeEx(1,1,1,3,0,1,"",QF_RELATIVE,rollIntensity:0.4);
|
if ( bAlt ) A_QuakeEx(1,1,1,3,0,1,"",QF_RELATIVE,rollIntensity:0.4);
|
||||||
else A_QuakeEx(0,0,0,2,0,1,"",QF_RELATIVE,rollIntensity:0.2);
|
else A_QuakeEx(0,0,0,2,0,1,"",QF_RELATIVE,rollIntensity:0.2);
|
||||||
|
|
@ -239,9 +242,9 @@ Class UTChainsaw : UTWeapon
|
||||||
Goto Idle;
|
Goto Idle;
|
||||||
AltFire:
|
AltFire:
|
||||||
CSWA A 0 A_PlaySound("chainsaw/fire",CHAN_6);
|
CSWA A 0 A_PlaySound("chainsaw/fire",CHAN_6);
|
||||||
CSWA ABCDEFG 2 A_Vibrate(true);
|
CSWA ABCDE 2 A_Vibrate(true);
|
||||||
CSWA H 2 A_SawSwipe();
|
CSWA FGHIJ 2 A_SawSwipe();
|
||||||
CSWA IJK 2 A_Vibrate(true);
|
CSWA K 2 A_Vibrate(true);
|
||||||
CSWA K 0 A_PlaySound("chainsaw/idle",CHAN_6,looping:true);
|
CSWA K 0 A_PlaySound("chainsaw/idle",CHAN_6,looping:true);
|
||||||
Goto Ready;
|
Goto Ready;
|
||||||
Deselect:
|
Deselect:
|
||||||
|
|
|
||||||
|
|
@ -312,7 +312,7 @@ Class Enforcer : UTWeapon replaces Pistol
|
||||||
LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||||
if ( d.HitType == TRACE_HitActor )
|
if ( d.HitType == TRACE_HitActor )
|
||||||
{
|
{
|
||||||
int dmg = Random[Enforcer](15,20);
|
int dmg = Random[Enforcer](12,17);
|
||||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||||
if ( d.HitActor.bNOBLOOD )
|
if ( d.HitActor.bNOBLOOD )
|
||||||
{
|
{
|
||||||
|
|
@ -458,18 +458,20 @@ Class Enforcer : UTWeapon replaces Pistol
|
||||||
Hold:
|
Hold:
|
||||||
ENFF A 0 A_EnforcerFire();
|
ENFF A 0 A_EnforcerFire();
|
||||||
ENFF ABCDEFGHIJ 1;
|
ENFF ABCDEFGHIJ 1;
|
||||||
|
ENFF J 5;
|
||||||
ENFF J 0 A_EnforcerRefire();
|
ENFF J 0 A_EnforcerRefire();
|
||||||
ENFF J 2;
|
ENFF J 2;
|
||||||
ENFI A 0;
|
ENFI A 0;
|
||||||
Goto Idle;
|
Goto Idle;
|
||||||
LeftFire:
|
LeftFire:
|
||||||
2NFI A 0 A_Overlay(-9998,"Null");
|
2NFI A 0 A_Overlay(-9998,"Null");
|
||||||
2NFI A 1 A_SetTics(Random[Enforcer](5,6));
|
2NFI A 8;
|
||||||
2NFI A 0 A_EnforcerRefire(1,true);
|
2NFI A 0 A_EnforcerRefire(1,true);
|
||||||
Goto LeftIdle;
|
Goto LeftIdle;
|
||||||
LeftHold:
|
LeftHold:
|
||||||
2NFF A 0 A_EnforcerFire(false,true);
|
2NFF A 0 A_EnforcerFire(false,true);
|
||||||
2NFF ABCDEFGHIJ 1;
|
2NFF ABCDEFGHIJ 1;
|
||||||
|
2NFF J 5;
|
||||||
2NFF J 0 A_EnforcerRefire("LeftHold",true);
|
2NFF J 0 A_EnforcerRefire("LeftHold",true);
|
||||||
2NFF J 2;
|
2NFF J 2;
|
||||||
2NFI A 0;
|
2NFI A 0;
|
||||||
|
|
@ -480,18 +482,20 @@ Class Enforcer : UTWeapon replaces Pistol
|
||||||
AltHold:
|
AltHold:
|
||||||
ENFA G 0 A_EnforcerFire(true);
|
ENFA G 0 A_EnforcerFire(true);
|
||||||
ENFA GHIJKLMN 1;
|
ENFA GHIJKLMN 1;
|
||||||
|
ENFA N 3;
|
||||||
ENFA G 0 A_EnforcerRefire();
|
ENFA G 0 A_EnforcerRefire();
|
||||||
ENFA OPQRSTU 1;
|
ENFA OPQRSTU 1;
|
||||||
Goto Idle;
|
Goto Idle;
|
||||||
LeftAltFire:
|
LeftAltFire:
|
||||||
2NFI A 0 A_Overlay(-9998,"Null");
|
2NFI A 0 A_Overlay(-9998,"Null");
|
||||||
2NFI A 1 A_SetTics(Random[Enforcer](5,6));
|
2NFI A 7;
|
||||||
2NFI A 0 A_EnforcerRefire(1,true);
|
2NFI A 0 A_EnforcerRefire(1,true);
|
||||||
Goto LeftIdle;
|
Goto LeftIdle;
|
||||||
2NFA ABCDEF 1;
|
2NFA ABCDEF 1;
|
||||||
LeftAltHold:
|
LeftAltHold:
|
||||||
2NFA G 0 A_EnforcerFire(true,true);
|
2NFA G 0 A_EnforcerFire(true,true);
|
||||||
2NFA GHIJKLMN 1;
|
2NFA GHIJKLMN 1;
|
||||||
|
2NFA N 3;
|
||||||
2NFA G 0 A_EnforcerRefire("LeftAltHold",true);
|
2NFA G 0 A_EnforcerRefire("LeftAltHold",true);
|
||||||
2NFA OPQRSTU 1;
|
2NFA OPQRSTU 1;
|
||||||
Goto LeftIdle;
|
Goto LeftIdle;
|
||||||
|
|
|
||||||
|
|
@ -140,7 +140,7 @@ Class FlakChunk : Actor
|
||||||
Radius 2;
|
Radius 2;
|
||||||
Height 2;
|
Height 2;
|
||||||
Speed 50;
|
Speed 50;
|
||||||
DamageFunction Random[Flak](25,35);
|
DamageFunction int(Random[Flak](15,20)*max(0.1,1.0-lifetime*4.1));
|
||||||
DamageType 'Shredded';
|
DamageType 'Shredded';
|
||||||
BounceType "Doom";
|
BounceType "Doom";
|
||||||
BounceFactor 0.8;
|
BounceFactor 0.8;
|
||||||
|
|
@ -189,7 +189,7 @@ Class FlakChunk : Actor
|
||||||
if ( frame < 11 ) frame++;
|
if ( frame < 11 ) frame++;
|
||||||
}
|
}
|
||||||
lifetime += lifespeed;
|
lifetime += lifespeed;
|
||||||
if ( (waterlevel <= 0) && (frame < 10) )
|
if ( (waterlevel <= 0) && (frame < 10) && !(lifetics%2) )
|
||||||
{
|
{
|
||||||
let s = Spawn("UTSmoke",pos);
|
let s = Spawn("UTSmoke",pos);
|
||||||
s.vel = (FRandom[Flak](-0.1,0.1),FRandom[Flak](-0.1,0.1),FRandom[Flak](-0.1,0.1));
|
s.vel = (FRandom[Flak](-0.1,0.1),FRandom[Flak](-0.1,0.1),FRandom[Flak](-0.1,0.1));
|
||||||
|
|
@ -212,7 +212,7 @@ Class FlakChunk : Actor
|
||||||
{
|
{
|
||||||
invoker.hasbounced = true;
|
invoker.hasbounced = true;
|
||||||
A_SprayDecal("WallCrack",-8);
|
A_SprayDecal("WallCrack",-8);
|
||||||
int numpt = Random[Flak](3,6);
|
int numpt = Random[Flak](2,3);
|
||||||
if ( frame < 10 )
|
if ( frame < 10 )
|
||||||
{
|
{
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
|
@ -359,7 +359,7 @@ Class FlakSlug : Actor
|
||||||
{
|
{
|
||||||
Obituary "%o was ripped to shreds by %k's Flak Cannon.";
|
Obituary "%o was ripped to shreds by %k's Flak Cannon.";
|
||||||
DamageType 'FlakDeath';
|
DamageType 'FlakDeath';
|
||||||
DamageFunction Random[Flak](80,90);
|
DamageFunction Random[Flak](100,110);
|
||||||
Radius 2;
|
Radius 2;
|
||||||
Height 2;
|
Height 2;
|
||||||
Speed 40;
|
Speed 40;
|
||||||
|
|
@ -397,7 +397,7 @@ Class FlakSlug : Actor
|
||||||
double a, s;
|
double a, s;
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Actor p;
|
Actor p;
|
||||||
for ( int i=0; i<8; i++ )
|
for ( int i=0; i<6; i++ )
|
||||||
{
|
{
|
||||||
p = Spawn("FlakChunk",pos);
|
p = Spawn("FlakChunk",pos);
|
||||||
a = FRandom[Flak](0,360);
|
a = FRandom[Flak](0,360);
|
||||||
|
|
@ -408,14 +408,14 @@ Class FlakSlug : Actor
|
||||||
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed*FRandom[Flak](0.5,1.5);
|
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed*FRandom[Flak](0.5,1.5);
|
||||||
p.target = target;
|
p.target = target;
|
||||||
}
|
}
|
||||||
int numpt = Random[Flak](10,20);
|
int numpt = Random[Flak](8,12);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
{
|
{
|
||||||
Vector3 pvel = (FRandom[Flak](-1,1),FRandom[Flak](-1,1),FRandom[Flak](-1,1)).unit()*FRandom[Flak](2,8);
|
Vector3 pvel = (FRandom[Flak](-1,1),FRandom[Flak](-1,1),FRandom[Flak](-1,1)).unit()*FRandom[Flak](2,8);
|
||||||
let s = Spawn("UTSpark",pos);
|
let s = Spawn("UTSpark",pos);
|
||||||
s.vel = pvel;
|
s.vel = pvel;
|
||||||
}
|
}
|
||||||
numpt = Random[Flak](40,80);
|
numpt = Random[Flak](15,30);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
{
|
{
|
||||||
Vector3 pvel = (FRandom[Flak](-1,1),FRandom[Flak](-1,1),FRandom[Flak](-1,1)).unit()*FRandom[Flak](6,16);
|
Vector3 pvel = (FRandom[Flak](-1,1),FRandom[Flak](-1,1),FRandom[Flak](-1,1)).unit()*FRandom[Flak](6,16);
|
||||||
|
|
@ -488,13 +488,13 @@ Class FlakCannon : UTWeapon
|
||||||
Vector3 x, y, z;
|
Vector3 x, y, z;
|
||||||
double a, s;
|
double a, s;
|
||||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||||
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-3.0*z;
|
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+4.0*y-3.0*z;
|
||||||
A_Overlay(-2,"MuzzleFlash");
|
A_Overlay(-2,"MuzzleFlash");
|
||||||
A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);
|
A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);
|
||||||
A_OverlayRenderstyle(-2,STYLE_Add);
|
A_OverlayRenderstyle(-2,STYLE_Add);
|
||||||
[x, y, z] = Matrix4.GetAxes(BulletSlope(),angle,roll);
|
[x, y, z] = Matrix4.GetAxes(BulletSlope(),angle,roll);
|
||||||
Actor p;
|
Actor p;
|
||||||
for ( int i=0; i<12; i++ )
|
for ( int i=0; i<10; i++ )
|
||||||
{
|
{
|
||||||
p = Spawn("FlakChunk",origin);
|
p = Spawn("FlakChunk",origin);
|
||||||
a = FRandom[Flak](0,360);
|
a = FRandom[Flak](0,360);
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ Class ImpactHammer : UTWeapon replaces Fist
|
||||||
{
|
{
|
||||||
int dmg = int(Random[Impact](90,120)*realcharge);
|
int dmg = int(Random[Impact](90,120)*realcharge);
|
||||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
||||||
d.HitActor.vel = x*(2000/d.HitActor.mass)*realcharge;
|
d.HitActor.vel = x*(8000/d.HitActor.mass)*realcharge;
|
||||||
if ( d.HitActor.bNOBLOOD )
|
if ( d.HitActor.bNOBLOOD )
|
||||||
{
|
{
|
||||||
let p = Spawn("HammerImpact",d.HitLocation-d.HitDir*4);
|
let p = Spawn("HammerImpact",d.HitLocation-d.HitDir*4);
|
||||||
|
|
@ -139,7 +139,7 @@ Class ImpactHammer : UTWeapon replaces Fist
|
||||||
{
|
{
|
||||||
int dmg = int(Random[Impact](25,35)*dscale);
|
int dmg = int(Random[Impact](25,35)*dscale);
|
||||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
||||||
d.HitActor.vel = x*(900/d.HitActor.mass)*dscale;
|
d.HitActor.vel = x*(4000/d.HitActor.mass)*dscale;
|
||||||
}
|
}
|
||||||
else if ( d.HitType != TRACE_HitNone )
|
else if ( d.HitType != TRACE_HitNone )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -123,7 +123,7 @@ Class Minigun : UTWeapon
|
||||||
LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||||
if ( d.HitType == TRACE_HitActor )
|
if ( d.HitType == TRACE_HitActor )
|
||||||
{
|
{
|
||||||
int dmg = Random[Minigun](12,18); // fun fact: the Minigun is one of the few weapons that has actual RNG damage in UT
|
int dmg = Random[Minigun](16,20); // fun fact: the Minigun is one of the few weapons that has actual RNG damage in UT
|
||||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||||
if ( d.HitActor.bNOBLOOD )
|
if ( d.HitActor.bNOBLOOD )
|
||||||
{
|
{
|
||||||
|
|
@ -161,11 +161,12 @@ Class Minigun : UTWeapon
|
||||||
t.pitch = asin(-dir.z);
|
t.pitch = asin(-dir.z);
|
||||||
MinigunTracer(t).dest = d.HitLocation;
|
MinigunTracer(t).dest = d.HitLocation;
|
||||||
}
|
}
|
||||||
for ( int i=0; i<8; i++ )
|
for ( int i=0; i<4; i++ )
|
||||||
{
|
{
|
||||||
let s = Spawn("UTViewSmoke",origin);
|
let s = Spawn("UTViewSmoke",origin);
|
||||||
UTViewSmoke(s).ofs = (10,2,-2);
|
UTViewSmoke(s).ofs = (10,2,-2);
|
||||||
s.scale *= 1.5;
|
s.scale *= 1.5;
|
||||||
|
s.alpha *= 0.6;
|
||||||
UTViewSmoke(s).vvel += (FRandom[Minigun](0.2,0.8),FRandom[Minigun](-0.3,0.3),FRandom[Minigun](-0.3,0.3));
|
UTViewSmoke(s).vvel += (FRandom[Minigun](0.2,0.8),FRandom[Minigun](-0.3,0.3),FRandom[Minigun](-0.3,0.3));
|
||||||
s.target = self;
|
s.target = self;
|
||||||
}
|
}
|
||||||
|
|
@ -306,64 +307,6 @@ Class Minigun : UTWeapon
|
||||||
else A_MinigunRefire("Hold");
|
else A_MinigunRefire("Hold");
|
||||||
}
|
}
|
||||||
Goto Unwind;
|
Goto Unwind;
|
||||||
AltFire2:
|
|
||||||
MGNF A 1 A_FireBullet();
|
|
||||||
MGNF B 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF B 1 A_FireBullet();
|
|
||||||
MGNF C 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF C 1 A_FireBullet();
|
|
||||||
MGNF D 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF D 1 A_FireBullet();
|
|
||||||
MGNF E 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF E 1 A_FireBullet();
|
|
||||||
MGNF F 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF F 1 A_FireBullet();
|
|
||||||
MGNF G 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF G 1 A_FireBullet();
|
|
||||||
MGNF H 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF H 1 A_FireBullet();
|
|
||||||
MGNF I 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF I 1 A_FireBullet();
|
|
||||||
MGNF J 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF J 1 A_FireBullet();
|
|
||||||
MGNF K 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF K 1 A_FireBullet();
|
|
||||||
MGNF L 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF L 1 A_FireBullet();
|
|
||||||
MGNF M 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF M 1 A_FireBullet();
|
|
||||||
MGNF N 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF N 1 A_FireBullet();
|
|
||||||
MGNF O 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF O 1 A_FireBullet();
|
|
||||||
MGNF P 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF P 1 A_FireBullet();
|
|
||||||
MGNF Q 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF Q 1 A_FireBullet();
|
|
||||||
MGNF R 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF R 1 A_FireBullet();
|
|
||||||
MGNF S 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
MGNF S 1 A_FireBullet();
|
|
||||||
MGNF A 0 A_MinigunRefire(1);
|
|
||||||
Goto Unwind;
|
|
||||||
AltHold:
|
AltHold:
|
||||||
MGNF A 1
|
MGNF A 1
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -241,7 +241,7 @@ Class PulseBoltLight : DynamicLight
|
||||||
Default
|
Default
|
||||||
{
|
{
|
||||||
DynamicLight.Type "Point";
|
DynamicLight.Type "Point";
|
||||||
Args 32,128,0,40;
|
Args 32,128,0,80;
|
||||||
}
|
}
|
||||||
override void Tick()
|
override void Tick()
|
||||||
{
|
{
|
||||||
|
|
@ -252,7 +252,7 @@ Class PulseBoltLight : DynamicLight
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SetOrigin(target.pos,true);
|
SetOrigin(target.pos,true);
|
||||||
args[LIGHT_INTENSITY] = Random[Pulse](30,50);
|
args[LIGHT_INTENSITY] = Random[Pulse](60,100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -307,7 +307,7 @@ Class PulseBoltCap : Actor
|
||||||
+NOCLIP;
|
+NOCLIP;
|
||||||
+DONTSPLASH;
|
+DONTSPLASH;
|
||||||
+FORCEXYBILLBOARD;
|
+FORCEXYBILLBOARD;
|
||||||
Scale 0.15;
|
Scale 0.3;
|
||||||
}
|
}
|
||||||
States
|
States
|
||||||
{
|
{
|
||||||
|
|
@ -345,7 +345,7 @@ Class PulseBoltHit : Actor
|
||||||
+NOCLIP;
|
+NOCLIP;
|
||||||
+DONTSPLASH;
|
+DONTSPLASH;
|
||||||
+FORCEXYBILLBOARD;
|
+FORCEXYBILLBOARD;
|
||||||
Scale 0.15;
|
Scale 0.3;
|
||||||
}
|
}
|
||||||
States
|
States
|
||||||
{
|
{
|
||||||
|
|
@ -357,7 +357,7 @@ Class PulseBoltHit : Actor
|
||||||
|
|
||||||
Class PulseBolt : Actor
|
Class PulseBolt : Actor
|
||||||
{
|
{
|
||||||
const beamsize = 40.5;
|
const beamsize = 81.0;
|
||||||
|
|
||||||
PulseBoltTracer t;
|
PulseBoltTracer t;
|
||||||
double accdamage;
|
double accdamage;
|
||||||
|
|
@ -391,20 +391,20 @@ Class PulseBolt : Actor
|
||||||
if ( !damagedactor )
|
if ( !damagedactor )
|
||||||
{
|
{
|
||||||
accdamage = min(0.5*(level.time-lasthit),0.1);
|
accdamage = min(0.5*(level.time-lasthit),0.1);
|
||||||
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](70,80)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](70,90)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||||
accdamage = 0;
|
accdamage = 0;
|
||||||
}
|
}
|
||||||
else if ( t.Results.HitActor != damagedactor )
|
else if ( t.Results.HitActor != damagedactor )
|
||||||
{
|
{
|
||||||
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](70,80)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](70,90)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||||
accdamage = 0;
|
accdamage = 0;
|
||||||
}
|
}
|
||||||
lasthit = level.time;
|
lasthit = level.time;
|
||||||
damagedactor = t.Results.HitActor;
|
damagedactor = t.Results.HitActor;
|
||||||
accdamage += 1./TICRATE;
|
accdamage += 1./TICRATE;
|
||||||
if ( accdamage > 0.16 )
|
if ( accdamage > 0.17 )
|
||||||
{
|
{
|
||||||
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](70,80)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](70,90)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||||
accdamage = 0;
|
accdamage = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -450,7 +450,7 @@ Class PulseBolt : Actor
|
||||||
accdamage = 0;
|
accdamage = 0;
|
||||||
damagedactor = null;
|
damagedactor = null;
|
||||||
}
|
}
|
||||||
if ( position >= 19 )
|
if ( position >= 9 )
|
||||||
{
|
{
|
||||||
int numpt = Random[Pulse](5,10)*!Random[Pulse](0,5);
|
int numpt = Random[Pulse](5,10)*!Random[Pulse](0,5);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
|
@ -534,7 +534,7 @@ Class StarterBolt : PulseBolt
|
||||||
if ( target.player )
|
if ( target.player )
|
||||||
{
|
{
|
||||||
[x, y, z] = Matrix4.GetAxes(target.pitch,target.angle,target.roll);
|
[x, y, z] = Matrix4.GetAxes(target.pitch,target.angle,target.roll);
|
||||||
origin = target.Vec2OffsetZ(0,0,target.player.viewz)+10.0*x+4.1*y-2.7*z;
|
origin = target.Vec2OffsetZ(0,0,target.player.viewz)+8.0*x+4.1*y-2.7*z;
|
||||||
}
|
}
|
||||||
else origin = target.Vec3Offset(0,0,target.missileheight);
|
else origin = target.Vec3Offset(0,0,target.missileheight);
|
||||||
SetOrigin(origin,true);
|
SetOrigin(origin,true);
|
||||||
|
|
|
||||||
|
|
@ -66,11 +66,12 @@ Class ShockWave : Actor
|
||||||
double dist = max(1,dir.length());
|
double dist = max(1,dir.length());
|
||||||
dir = dir/dist+(0,0,0.3);
|
dir = dir/dist+(0,0,0.3);
|
||||||
double moscale = max(0,1100-0.22*dist);
|
double moscale = max(0,1100-0.22*dist);
|
||||||
if ( (dist > olddmgradius) || (dir dot a.vel < 0) )
|
if ( (dist > olddmgradius-a.radius) || (dir dot a.vel <= 0) )
|
||||||
{
|
{
|
||||||
if ( !a.bDONTTHRUST ) a.vel += dir*((moscale+20)/a.mass);
|
if ( !a.bDONTTHRUST ) a.vel += dir*((moscale+20)/a.mass);
|
||||||
a.DamageMobj(self,target,int(moscale),'RedeemerDeath',DMG_THRUSTLESS);
|
a.DamageMobj(self,target,int(moscale),'RedeemerDeath',DMG_THRUSTLESS);
|
||||||
}
|
}
|
||||||
|
if ( a.player ) UTMainHandler.DoFlash(a,Color(32,255,255,255),80);
|
||||||
}
|
}
|
||||||
olddmgradius = dmgradius;
|
olddmgradius = dmgradius;
|
||||||
}
|
}
|
||||||
|
|
|
||||||