- Very noticeable changes to the Automag and Protomag firing speeds.
   This is going to make dual wielding even more OP than it already was. Just
   so you know, dual wielding is NOT "canon" here, and if it breaks balance I
   really can't do much about it.
 - Automag and Protomag now start firing as soon as the trigger is held.
 - Protomag damage reduced back to 10 now that it has a much faster altfire.
   Believe it or not, the new altfire speed is actually true to the original.
 - Propagate the AmbientGlow changes from DT.
This commit is contained in:
Marisa the Magician 2019-10-29 21:28:49 +01:00
commit 71fc572952
5 changed files with 83 additions and 61 deletions

View file

@ -218,8 +218,9 @@ no need to reload. An experimental entanglement unit inside the gun's internal
mag locates spare ammunition carried by the user and automatically loads it. mag locates spare ammunition carried by the user and automatically loads it.
Both of its fire modes work exactly like the Automag, although due to Both of its fire modes work exactly like the Automag, although due to
internal differences, it's a bit weaker in terms of speed and damage. However internal differences, it's a bit weaker in terms of damage, however it
it compensates by being much more accurate, even when rapid firing. compensates by having pinpoint accuracy on its primary fire (unless dual
wielded) and having a much faster alternate fire.
Pressing the reload button makes use of the gun's weight to beat the crap out Pressing the reload button makes use of the gun's weight to beat the crap out
of your enemies up close. of your enemies up close.

View file

@ -73,7 +73,7 @@ This mod requires GZDoom 4.2.3 or later, and runs on top of Doom Tournament.
## In progress ## In progress
- N/A, this is the 1.0.3 release. - N/A, this is the 1.0.4 release.
## Planned ## Planned

View file

@ -1,12 +1,12 @@
// imitation of the Unreal Engine 1.x ambient glow effect, timing may be off // imitation of the Unreal Engine 1.x ambient glow effect
#define PI 3.14159265
vec4 ProcessLight( vec4 color ) vec4 ProcessLight( vec4 color )
{ {
float glow = (1.0+sin(timer*2*PI))*0.25; float glow = 0.25+0.2*sin(timer*8);
return vec4(min(color.rgb+vec3(glow),1.0),color.a); return vec4(min(color.rgb+vec3(glow),1.0),color.a);
} }
// imitation of the Unreal Engine 1.x bMeshEnviroMap effect, not 1:1 but gets close // imitation of the Unreal Engine 1.x bMeshEnviroMap effect, not 1:1 but gets close
// with the addition of a mask for blending the environment map with the base texture
vec4 ProcessTexel() vec4 ProcessTexel()
{ {
vec4 base = getTexel(vTexCoord.st); vec4 base = getTexel(vTexCoord.st);

View file

@ -195,6 +195,7 @@ Class Automag : UnrealWeapon
if ( alt ) origin = level.Vec3Offset(origin,-z*3+ydir*y); if ( alt ) origin = level.Vec3Offset(origin,-z*3+ydir*y);
else origin = level.Vec3Offset(origin,-z+ydir*y*4); else origin = level.Vec3Offset(origin,-z+ydir*y*4);
double a = FRandom[Automag](0,360), s = FRandom[Automag](0,alt?invoker.altaccuracy:0.01); double a = FRandom[Automag](0,360), s = FRandom[Automag](0,alt?invoker.altaccuracy:0.01);
if ( invoker.Amount > 1 ) s *= 1.6;
[x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll); [x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll);
Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
FLineTraceData d; FLineTraceData d;
@ -341,6 +342,7 @@ Class Automag : UnrealWeapon
Stop; Stop;
Select: Select:
AUTS A 1 A_Raise(int.max); AUTS A 1 A_Raise(int.max);
Wait;
Ready: Ready:
AUTS A 0 AUTS A 0
{ {
@ -403,27 +405,33 @@ Class Automag : UnrealWeapon
} }
Wait; Wait;
Fire: Fire:
AUTF A 1 A_Overlay(-9999,null); AUTF A 1
{
A_Overlay(-9999,null);
A_AutomagFire();
}
AUTF BCD 1; AUTF BCD 1;
AUTF LM 3;
AUTF N 0 A_AutomagRefire(1);
Goto Release;
Hold: Hold:
AUTF E 2 A_AutomagFire(); AUTF N 1;
AUTF FG 2; AUTF E 3 A_AutomagFire();
AUTF FG 3;
AUTF N 0 A_AutomagRefire(1); AUTF N 0 A_AutomagRefire(1);
Goto Release; Goto Release;
AUTF NN 2; AUTF N 1;
AUTF H 2 A_AutomagFire(); AUTF H 3 A_AutomagFire();
AUTF IJ 2; AUTF IJ 3;
AUTF N 0 A_AutomagRefire(1); AUTF N 0 A_AutomagRefire(1);
Goto Release; Goto Release;
AUTF NN 2; AUTF N 1;
AUTF K 2 A_AutomagFire(); AUTF K 3 A_AutomagFire();
AUTF LM 2; AUTF LM 3;
AUTF N 0 A_AutomagRefire(1); AUTF N 0 A_AutomagRefire("Hold");
Goto Release; Goto Release;
AUTF NN 2;
Goto Hold;
Release: Release:
AUTF NN 2; AUTF N 1;
AUTF OPQRST 1; AUTF OPQRST 1;
AUTI A 0; AUTI A 0;
Goto Idle; Goto Idle;
@ -431,26 +439,29 @@ Class Automag : UnrealWeapon
2UTI A 5 A_Overlay(-9998,null); 2UTI A 5 A_Overlay(-9998,null);
2UTI A 0 A_AutomagRefire(1,true); 2UTI A 0 A_AutomagRefire(1,true);
Goto LeftIdle; Goto LeftIdle;
2UTF A 1 A_AutomagFire(false,true);
2UTF BCD 1;
2UTF LM 3;
2UTF N 0 A_AutomagRefire(1,true);
Goto LeftRelease;
LeftHold: LeftHold:
2UTF ABCD 1; 2UTF N 1;
2UTF E 2 A_AutomagFire(false,true); 2UTF E 3 A_AutomagFire(false,true);
2UTF FG 2; 2UTF FG 3;
2UTF N 0 A_AutomagRefire(1,true); 2UTF N 0 A_AutomagRefire(1,true);
Goto LeftRelease; Goto LeftRelease;
2UTF NN 2; 2UTF N 1;
2UTF H 2 A_AutomagFire(false,true); 2UTF H 3 A_AutomagFire(false,true);
2UTF IJ 2; 2UTF IJ 3;
2UTF N 0 A_AutomagRefire(1,true); 2UTF N 0 A_AutomagRefire(1,true);
Goto LeftRelease; Goto LeftRelease;
2UTF NN 2; 2UTF N 1;
2UTF K 2 A_AutomagFire(false,true); 2UTF K 3 A_AutomagFire(false,true);
2UTF LM 2; 2UTF LM 3;
2UTF N 0 A_AutomagRefire(1,true); 2UTF N 0 A_AutomagRefire("LeftHold",true);
Goto LeftRelease; Goto LeftRelease;
2UTF NN 2;
Goto LeftHold+4;
LeftRelease: LeftRelease:
2UTF NN 2; 2UTF N 1;
2UTF OPQRST 1; 2UTF OPQRST 1;
2UTI A 0; 2UTI A 0;
Goto LeftIdle; Goto LeftIdle;
@ -466,17 +477,17 @@ Class Automag : UnrealWeapon
AUTA LM 2; AUTA LM 2;
AUTA T 0 A_AutomagRefire(1); AUTA T 0 A_AutomagRefire(1);
Goto AltRelease; Goto AltRelease;
AUTA T 1; AUTA T 2;
AUTA N 2 A_AutomagFire(true); AUTA N 2 A_AutomagFire(true);
AUTA OP 2; AUTA OP 2;
AUTA T 0 A_AutomagRefire(1); AUTA T 0 A_AutomagRefire(1);
Goto AltRelease; Goto AltRelease;
AUTA T 1; AUTA T 2;
AUTA Q 2 A_AutomagFire(true); AUTA Q 2 A_AutomagFire(true);
AUTA RS 2; AUTA RS 2;
AUTA T 0 A_AutomagRefire(1); AUTA T 0 A_AutomagRefire(1);
Goto AltRelease; Goto AltRelease;
AUTA T 1; AUTA T 2;
Goto AltHold; Goto AltHold;
AltRelease: AltRelease:
AUTA TUVWXYZ 1; AUTA TUVWXYZ 1;
@ -491,17 +502,17 @@ Class Automag : UnrealWeapon
2UTA LM 2; 2UTA LM 2;
2UTA T 0 A_AutomagRefire(1,true); 2UTA T 0 A_AutomagRefire(1,true);
Goto LeftAltRelease; Goto LeftAltRelease;
2UTA T 1; 2UTA T 2;
2UTA N 2 A_AutomagFire(true,true); 2UTA N 2 A_AutomagFire(true,true);
2UTA OP 2; 2UTA OP 2;
2UTA T 0 A_AutomagRefire(1,true); 2UTA T 0 A_AutomagRefire(1,true);
Goto LeftAltRelease; Goto LeftAltRelease;
2UTA T 1; 2UTA T 2;
2UTA Q 2 A_AutomagFire(true,true); 2UTA Q 2 A_AutomagFire(true,true);
2UTA RS 2; 2UTA RS 2;
2UTA T 0 A_AutomagRefire(1,true); 2UTA T 0 A_AutomagRefire(1,true);
Goto LeftAltRelease; Goto LeftAltRelease;
2UTA T 1; 2UTA T 2;
Goto LeftAltHold+10; Goto LeftAltHold+10;
LeftAltRelease: LeftAltRelease:
2UTA TUVWXYZ 1; 2UTA TUVWXYZ 1;

View file

@ -111,7 +111,7 @@ Class Betamag : UnrealWeapon
{ {
Weapon weap = Weapon(invoker); Weapon weap = Weapon(invoker);
if ( !weap || !player ) return; if ( !weap || !player ) return;
if ( invoker.altaccuracy < 0.05 ) invoker.altaccuracy += 0.01; if ( invoker.altaccuracy < 0.06 ) invoker.altaccuracy += 0.01;
if ( slave ) if ( slave )
{ {
if ( weap.Ammo1.Amount <= 0 ) if ( weap.Ammo1.Amount <= 0 )
@ -234,6 +234,7 @@ Class Betamag : UnrealWeapon
if ( alt ) origin = level.Vec3Offset(origin,-z*2.5+ydir*y*1.5); if ( alt ) origin = level.Vec3Offset(origin,-z*2.5+ydir*y*1.5);
else origin = level.Vec3Offset(origin,-z*1.5+ydir*y*2); else origin = level.Vec3Offset(origin,-z*1.5+ydir*y*2);
double a = FRandom[Betamag](0,360), s = FRandom[Betamag](0,alt?invoker.altaccuracy:0.); double a = FRandom[Betamag](0,360), s = FRandom[Betamag](0,alt?invoker.altaccuracy:0.);
if ( invoker.Amount > 1 ) s = s*2.+FRandom[Betamag](0,0.01);
[x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll); [x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll);
Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
FLineTraceData d; FLineTraceData d;
@ -241,7 +242,7 @@ Class Betamag : UnrealWeapon
UTBulletTrail.DoTrail(self,origin,dir,10000,int((invoker.Amount+alt)**2)); UTBulletTrail.DoTrail(self,origin,dir,10000,int((invoker.Amount+alt)**2));
if ( d.HitType == TRACE_HitActor ) if ( d.HitType == TRACE_HitActor )
{ {
int dmg = 14; int dmg = 10;
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x)); dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
double mm = 3000; double mm = 3000;
if ( FRandom[Betamag](0,1) < 0.2 ) mm *= 5; if ( FRandom[Betamag](0,1) < 0.2 ) mm *= 5;
@ -284,7 +285,7 @@ Class Betamag : UnrealWeapon
for ( int i=0; i<3; i++ ) for ( int i=0; i<3; i++ )
{ {
let s = Spawn("UTViewSmoke",origin); let s = Spawn("UTViewSmoke",origin);
if ( alt ) UTViewSmoke(s).ofs = (10,ydir,-3); if ( alt ) UTViewSmoke(s).ofs = (10,1.5*ydir,-3);
else UTViewSmoke(s).ofs = (10,4*ydir,-1); else UTViewSmoke(s).ofs = (10,4*ydir,-1);
s.target = self; s.target = self;
s.alpha *= 0.5; s.alpha *= 0.5;
@ -421,63 +422,72 @@ Class Betamag : UnrealWeapon
} }
Wait; Wait;
Fire: Fire:
AUTF A 2 AUTF A 1
{ {
if ( invoker.Ammo1.Amount <= 0 )
return ResolveState("Reload");
A_BetamagFire();
A_Overlay(-9999,null); A_Overlay(-9999,null);
return A_JumpIfNoAmmo("Reload"); return ResolveState(null);
} }
AUTF B 2; AUTF BCD 1;
Hold: AUTF E 2;
AUTF C 2 A_BetamagFire();
AUTF DE 2;
AUTF F 0 A_PlaySound("betamag/slide",CHAN_ITEM,!Dampener.Active(self)?.3:.03); AUTF F 0 A_PlaySound("betamag/slide",CHAN_ITEM,!Dampener.Active(self)?.3:.03);
AUTF FGHI 2; AUTF FGHI 2;
AUTF J 0 A_BetamagRefire("Hold"); AUTF J 0 A_BetamagRefire("Hold");
AUTF J 2; AUTF J 2;
AUTI A 0; AUTI A 0;
Goto Idle; Goto Idle;
Hold:
AUTF C 2 A_BetamagFire();
AUTF D 2;
Goto Fire+4;
LeftFire: LeftFire:
#### # 10 A_Overlay(-9998,null); #### # 9 A_Overlay(-9998,null);
2UTI A 0 A_BetamagRefire(1,true); 2UTI A 0 A_BetamagRefire(1,true);
Goto LeftIdle; Goto LeftIdle;
2UTF AB 1; 2UTF A 1 A_BetamagFire(false,true);
LeftHold: 2UTF BCD 1;
2UTF C 2 A_BetamagFire(false,true); 2UTF E 2;
2UTF DE 2;
2UTF F 0 A_PlaySound("betamag/slide",CHAN_7,!Dampener.Active(self)?.3:.03); 2UTF F 0 A_PlaySound("betamag/slide",CHAN_7,!Dampener.Active(self)?.3:.03);
2UTF FGHI 2; 2UTF FGHI 2;
2UTF J 0 A_BetamagRefire("LeftHold",true); 2UTF J 0 A_BetamagRefire("LeftHold",true);
2UTF J 2; 2UTF J 2;
2UTI A 0; 2UTI A 0;
Goto LeftIdle; Goto LeftIdle;
LeftHold:
2UTF C 2 A_BetamagFire(false,true);
2UTF D 2;
Goto LeftFire+6;
AltFire: AltFire:
AUTA A 0 AUTA A 0
{ {
if ( invoker.Ammo1.Amount <= 0 )
return ResolveState("Reload");
invoker.altaccuracy = 0.08; invoker.altaccuracy = 0.08;
A_Overlay(-9999,null); A_Overlay(-9999,null);
return A_JumpIfNoAmmo("Reload"); return ResolveState(null);
} }
AUTA ABCDEFG 2; AUTA ABCDEFG 2;
AltHold: AltHold:
AUTA H 2 A_BetamagFire(true); AUTA H 1 A_BetamagFire(true);
AUTA I 2; AUTA I 1;
AUTA J 0 A_PlaySound("betamag/slide",CHAN_ITEM,!Dampener.Active(self)?.3:.03); AUTA J 0 A_PlaySound("betamag/slide",CHAN_ITEM,!Dampener.Active(self)?.3:.03);
AUTA JKLM 2; AUTA JKLM 1;
AUTA N 0 A_BetamagRefire("AltHold"); AUTA N 0 A_BetamagRefire("AltHold");
AltRelease:
AUTA NOPQ 2; AUTA NOPQ 2;
AUTI A 2; AUTI A 2;
Goto Idle; Goto Idle;
LeftAltFire: LeftAltFire:
#### # 6 A_Overlay(-9998,null); #### # 4 A_Overlay(-9998,null);
2UTI A 0 A_BetamagRefire(1,true); 2UTI A 0 A_BetamagRefire(1,true);
Goto LeftIdle; Goto LeftIdle;
2UTA ABCDEFG 2; 2UTA ABCDEFG 2;
LeftAltHold: LeftAltHold:
2UTA H 2 A_BetamagFire(true,true); 2UTA H 1 A_BetamagFire(true,true);
2UTA I 2; 2UTA I 1;
2UTA J 0 A_PlaySound("betamag/slide",CHAN_7,!Dampener.Active(self)?.3:.03); 2UTA J 0 A_PlaySound("betamag/slide",CHAN_7,!Dampener.Active(self)?.3:.03);
2UTA JKLM 2; 2UTA JKLM 1;
2UTA N 0 A_BetamagRefire("LeftAltHold",true); 2UTA N 0 A_BetamagRefire("LeftAltHold",true);
2UTA NOPQ 2; 2UTA NOPQ 2;
2UTI A 2; 2UTI A 2;