flak_m/zscript/utgore.zsc
Marisa Kirisame 2a9eb0e1b1 Various changes to feel closer to vanilla UT, mainly in terms of projectile gravity and velocity.
Reduced the smoke on the minigun and casings for better performance.
Corrected the number of chunks (was 6, should be 8) fired by the flak cannon.
Reduced flak chunk spread (should be ~5.5 degrees, was double of that) on the weapon and slugs.
Reduced the size of the shock rifle combo shockwave mesh to be closer to vanilla UT.
Misc. tweaks to health item textures.
Reduced the blur in the Redeemer view shader, it was too strong.
Fix expiration messages on powerups appearing on level changes.
Address complaints about how I change Kinsie's test map. Shouldn't be too dark now.
2019-01-24 22:33:09 +01:00

402 lines
7.8 KiB
Text

// Blood
Class UTBlood : Actor
{
Default
{
RenderStyle "Add";
Scale 1.1;
+NOBLOCKMAP;
+NOGRAVITY;
+NOTELEPORT;
+DONTSPLASH;
+FORCEXYBILLBOARD;
+PUFFGETSOWNER;
}
void A_Bleed( int str = 1 )
{
Scale *= 0.7+0.3*str;
vel *= 0;
let b = Spawn("UTBloodSpurt",pos);
b.angle = angle+FRandom[Blud](-15,15);
b.pitch = pitch+FRandom[Blud](-15,15);
b.translation = translation;
b.args[0] = str;
// transfer blood color for decals
if ( target && target.bloodcolor ) b.SetShade(target.bloodcolor);
else b.SetShade(gameinfo.defaultbloodcolor);
}
States
{
Spawn:
TNT1 A 0 NoDelay A_Bleed(3);
Goto Puff;
TNT1 A 0 A_Bleed(2);
Goto Puff;
TNT1 A 0 A_Bleed(1);
Goto Puff;
Puff:
TNT1 A 0
{
int dec = Random[Blod](0,2);
if ( dec == 1 )
return ResolveState("Puff1");
if ( dec == 2 )
return ResolveState("Puff2");
return ResolveState("Puff3");
}
Puff1:
BPF1 ABCDEFGHIJK 1;
Stop;
Puff2:
BPF2 ABCDEFGH 1;
Stop;
Puff3:
BPF3 ABCDEFGHIJ 1;
Stop;
}
}
// single drop of blod
Class UTBloodDrop : Actor
{
Default
{
Scale 0.24;
Gravity 0.8;
Mass 1;
Radius 2;
Height 2;
RenderStyle "Translucent";
+MISSILE;
+NOTELEPORT;
+THRUACTORS;
+FORCEXYBILLBOARD;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
SetState(FindState("Spawn")+Random[Blod](0,4));
Scale *= FRandom[Blod](0.6,1.4);
}
void A_BloodDie()
{
// TODO
}
States
{
Spawn:
BDRP ABCDE -1;
Stop;
Death:
TNT1 A 0 A_BloodDie();
Stop;
}
}
// a burst of blod
Class UTBloodSpurt : Actor
{
double str;
Default
{
+NOBLOCKMAP;
+NOGRAVITY;
+DONTSPLASH;
+NOTELEPORT;
+THRUACTORS;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
str = FRandom[Blood](2.0,3.2)*args[0];
int sz = 7*args[0];
double ang, pt;
for ( int i=0; i<sz; i++ )
{
let d = Spawn("UTBloodDrop",pos);
d.translation = translation;
d.SetShade(fillcolor);
ang = angle+FRandom[Blood](-3,3)*str;
pt = pitch+FRandom[Blood](-3,3)*str;
Vector3 dir = (cos(pt)*cos(ang),cos(pt)*sin(ang),-sin(pt));
d.vel = dir*str*FRandom[Blood](0.4,0.8);
d.vel.z += str*0.5;
d.scale *= str*0.15*FRandom[Blood](0.6,1.4);
}
Destroy();
}
}
// for chunks
Class UTBloodTrail : Actor
{
double str;
Default
{
+NOBLOCKMAP;
+NOGRAVITY;
+NOTELEPORT;
+DONTSPLASH;
+THRUACTORS;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
if ( !target ) return;
str = FRandom[Blood](2.0,4.0);
}
private bool IsTargetFlying()
{
if ( !target ) return false;
if ( target.InStateSequence(target.CurState,target.FindState("Spawn")) ) return true;
return false;
}
override void Tick()
{
Super.Tick();
if ( level.frozen || globalfreeze ) return;
if ( !target ) return;
SetOrigin(target.pos,true);
double ang, pt;
for ( int i=0; i<3; i++ )
{
let d = Spawn("UTBloodDrop",pos);
d.translation = translation;
d.SetShade(fillcolor);
ang = FRandom[Blood](0,360);
pt = FRandom[Blood](-90,90);
Vector3 dir = -target.vel*0.2;
dir += (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*0.8;
d.vel = dir*str*FRandom[Blood](0.8,1.2);
d.scale *= str*0.15*FRandom[Blood](0.6,1.4);
}
bool flying = IsTargetFlying();
if ( !flying ) Destroy();
}
}
// Poof
Class UTBloodPuff : Actor
{
Default
{
RenderStyle "Add";
Scale 1.1;
Alpha 0.4;
+NOBLOCKMAP;
+NOGRAVITY;
+NOTELEPORT;
+DONTSPLASH;
+FORCEXYBILLBOARD;
}
States
{
Spawn:
TNT1 A 0 NoDelay
{
int dec = Random[Blod](0,2);
if ( dec == 1 )
return ResolveState("Puff1");
if ( dec == 2 )
return ResolveState("Puff2");
return ResolveState("Puff3");
}
Puff1:
BPF1 ABCDEFGHIJK 2;
Stop;
Puff2:
BPF2 ABCDEFGH 2;
Stop;
Puff3:
BPF3 ABCDEFGHIJ 2;
Stop;
}
}
// Chunkers
Class UTGibber : Actor
{
Actor Gibbed;
int gibcount, gibsize;
color shadecol;
Vector3 rvel;
virtual void BurstGibs()
{
static const class<Actor> gibcls[] = {"UTGenericGib1","UTGenericGib2","UTGenericGib3","UTGenericGib4"};
Actor a;
double ang, pt;
Vector3 dir;
bool dummy;
for ( int i=0; i<gibsize; i++ )
{
let a = Spawn(gibcls[Random[Blod](0,3)],pos+(FRandom[Blod](-0.5,0.5)*radius,FRandom[Blod](-0.5,0.5)*radius,FRandom[Blod](0.2,0.8)*height));
a.translation = translation;
a.SetShade(fillcolor);
a.scale *= FRandom[Blod](1.7,2.3)*scale.x;
ang = FRandom[Blod](0,360);
pt = FRandom[Blod](-90,90);
dir = (cos(pt)*cos(ang),cos(pt)*sin(ang),sin(-pt));
a.vel = rvel*0.6+dir*FRandom[Blod](8.0,12.0);
}
for ( int i=0; i<gibsize; i++ )
{
let a = Spawn("UTBloodPuff",pos+(FRandom[Blod](-0.8,0.8)*radius,FRandom[Blod](-0.8,0.8)*radius,FRandom[Blod](0.1,0.9)*height));
a.translation = translation;
a.SetShade(fillcolor);
a.scale *= FRandom[Blod](1.8,2.3)*scale.x;
ang = FRandom[Blod](0,360);
pt = FRandom[Blod](-90,90);
dir = (cos(pt)*cos(ang),cos(pt)*sin(ang),sin(-pt));
a.vel = rvel*0.2+dir*FRandom[Blod](1.5,3.0);
}
A_CountDown();
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
gibsize = int(min(max(radius,height)/24,3));
reactiontime = int(min(max(radius,height)/10,4));
rvel = vel;
vel *= 0;
}
Default
{
+NOCLIP;
+NOGRAVITY;
Radius 32;
Height 16;
}
States
{
Spawn:
TNT1 A 0 NoDelay A_PlaySound("misc/gibbed");
TNT1 A 1 BurstGibs();
Wait;
}
}
// Chunks
Class UTGib : Actor
{
double rollvel, anglevel, pitchvel;
Default
{
Radius 4;
Height 4;
BounceType "Hexen";
BounceFactor 0.8;
WallBounceFactor 0.8;
Gravity 0.6;
+ROLLSPRITE;
+ROLLCENTER;
+INTERPOLATEANGLES;
+CANBOUNCEWATER;
+MISSILE;
+THRUACTORS;
+USEBOUNCESTATE;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
tracer = Spawn("UTBloodTrail",pos);
tracer.target = self;
if ( bloodcolor ) tracer.SetShade(bloodcolor);
else tracer.SetShade(gameinfo.defaultbloodcolor);
tracer.translation = bloodtranslation;
rollvel = FRandom[Blod](5,15)*RandomPick[Blod](-1,1);
anglevel = FRandom[Blod](5,15)*RandomPick[Blod](-1,1);
pitchvel = FRandom[Blod](5,15)*RandomPick[Blod](-1,1);
}
void A_HandleBounce()
{
double spd = vel.length();
if ( spd > double.epsilon )
vel = (vel.unit()+(FRandom[Blod](-0.2,0.2),FRandom[Blod](-0.2,0.2),FRandom[Blod](-0.2,0.2))).unit()*spd;
if ( BlockingFloor && (vel.xy.length() < 1) )
{
ClearBounce();
ExplodeMissile();
}
if ( spd < 10 )
{
if ( tracer ) tracer.Destroy();
}
else if ( spd > 20 ) vel *= 0.8;
A_PlaySound("misc/gibp");
double ang, pt;
for ( int i=0; i<6; i++ )
{
let d = Spawn("UTBloodDrop",pos);
d.translation = bloodtranslation;
if ( bloodcolor ) d.SetShade(bloodcolor);
else d.SetShade(gameinfo.defaultbloodcolor);
ang = FRandom[Blood](0,360);
pt = FRandom[Blood](-90,90);
Vector3 dir = -vel*0.4;
dir += (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*1.3;
d.vel = dir*FRandom[Blood](0.8,1.2);
d.scale *= 0.75*FRandom[Blood](0.6,1.4);
}
rollvel = FRandom[Blod](5,15)*RandomPick[Blod](-1,1);
anglevel = FRandom[Blod](5,15)*RandomPick[Blod](-1,1);
pitchvel = FRandom[Blod](5,15)*RandomPick[Blod](-1,1);
}
States
{
Spawn:
UGIB A 1
{
roll += rollvel;
angle += anglevel;
pitch += pitchvel;
}
Wait;
Bounce:
UGIB A 0 A_HandleBounce();
Goto Spawn;
Death:
UGIB A 1 A_SetTics(Random[Blod](12,18)*15);
UGIB A 1 A_FadeOut(0.05);
Wait;
}
}
Class UTGenericGib1 : UTGib {}
Class UTGenericGib2 : UTGib {}
Class UTGenericGib3 : UTGib {}
Class UTGenericGib4 : UTGib {}
Class UTThigh : UTGib {}
Class UTFemaleArm : UTGib {}
Class UTFemaleFoot : UTGib {}
Class UTFemaleTorso : UTGib {}
Class UTMaleArm : UTGib {}
Class UTMaleFoot : UTGib {}
Class UTMaleTorso : UTGib {}
Class UTHeart : UTGib
{
States
{
Spawn:
UGIB ABCDEF 2;
Loop;
Bounce:
UGIB A 0;
Goto Spawn;
Death:
UGIB ABCDEFABCDEFABCDEF 2;
UGIB ABCDEFABCDEF 4;
UGIB ABCDEF 8;
UGIB A -1;
Stop;
}
}
Class UTLiver : UTGib {}
Class UTStomach : UTGib {}
Class UTHeadFemale : UTGib {}
Class UTHeadMale : UTGib {}