Release Candidate 4 (may be final):

- Spent mags for Automag, Flak Cannon and Demolisher (needs updated DT).
- Betamag defaults to both having the 0.83 skin, other options put on add-ons.
- Adjustments to bullet casings.
- Fixed flames producing water splashes.
- Fixed female models having male gibs.
- Corrected ASMD ball hit behavior to match Unreal.
- Added bubble trail to Stinger when underwater.
This commit is contained in:
Marisa the Magician 2019-10-16 18:09:43 +02:00
commit ff01ab2146
25 changed files with 182 additions and 21 deletions

View file

@ -26,6 +26,21 @@ Model "UCasing"
FrameIndex PCAS A 0 0 FrameIndex PCAS A 0 0
} }
Model "AutomagMag"
{
Path "models"
Model 0 "AutoMagSpentClip_d.3d"
Skin 0 "Automa1.png"
Scale 0.06 0.06 0.072
ZOffset 1
USEACTORPITCH
USEACTORROLL
USEROTATIONCENTER
Rotation-Center 0 0 1
FrameIndex PCAS A 0 0
}
Model "Automag" Model "Automag"
{ {
Path "models" Path "models"

View file

@ -30,6 +30,7 @@ Model "BCasing"
FrameIndex PCAS A 0 0 FrameIndex PCAS A 0 0
} }
Model "BCasing2" Model "BCasing2"
{ {
Path "models" Path "models"

View file

@ -83,6 +83,22 @@ Model "BigCasing"
FrameIndex PCAS A 0 0 FrameIndex PCAS A 0 0
} }
Model "BigMag"
{
Path "models"
Model 0 "BigGMag_d.3d"
Skin 0 "JBigGun1.png"
Scale 0.1 0.1 0.12
AngleOffset 90
ZOffset 2.5
USEACTORPITCH
USEACTORROLL
USEROTATIONCENTER
Rotation-Center 0 0 2.5
FrameIndex PCAS A 0 0
}
Model "BigGun" Model "BigGun"
{ {
Path "models" Path "models"

View file

@ -53,6 +53,21 @@ Model "OLSMP"
FrameIndex AMUZ I 2 0 FrameIndex AMUZ I 2 0
} }
Model "OLSMPMag"
{
Path "models"
Model 0 "OLSMPSpentClip_d.3d"
Skin 0 "OLSMP.png"
Scale 0.06 0.06 0.072
ZOffset 1
USEACTORPITCH
USEACTORROLL
USEROTATIONCENTER
Rotation-Center 0 0 1
FrameIndex PCAS A 0 0
}
Model "OLSMP" Model "OLSMP"
{ {
Path "models" Path "models"

View file

@ -52,6 +52,22 @@ Model "UFlakSlug"
FrameIndex FSLG A 0 0 FrameIndex FSLG A 0 0
} }
Model "UFlakMag"
{
Path "models"
Model 0 "FlakShSpent_d.3d"
Skin 0 "Jflakshel1.png"
Scale 0.2 0.2 0.24
AngleOffset 90
ZOffset 1
USEACTORPITCH
USEACTORROLL
USEROTATIONCENTER
Rotation-Center 0 0 1
FrameIndex PCAS A 0 0
}
Model "UFlakCannon" Model "UFlakCannon"
{ {
Path "models" Path "models"

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Before After
Before After

BIN
models/FlakShSpent_a.3d Normal file

Binary file not shown.

BIN
models/FlakShSpent_d.3d Normal file

Binary file not shown.

View file

@ -257,6 +257,7 @@ quadshot/shell4 qshell4
quadshot/shell5 qshell5 quadshot/shell5 qshell5
quadshot/shell6 qshell6 quadshot/shell6 qshell6
$random quadshot/shell { quadshot/shell1 quadshot/shell2 quadshot/shell3 quadshot/shell4 quadshot/shell5 quadshot/shell6 } $random quadshot/shell { quadshot/shell1 quadshot/shell2 quadshot/shell3 quadshot/shell4 quadshot/shell5 quadshot/shell6 }
$attenuation quadshot/shell 2
betamag/select oldasel betamag/select oldasel
betamag/fire oldmag betamag/fire oldmag
@ -301,8 +302,12 @@ big/dry bigmdryf
big/punch bigmejct big/punch bigmejct
big/reload bigmrelo big/reload bigmrelo
big/shell bigmshel big/shell bigmshel
$attenuation big/shell 2
big/blast bigmhit big/blast bigmhit
$limit big/blast 16 $limit big/blast 16
big/bounce bigmagb
$volume big/bounce 0.5
$attenuation big/bounce 3
smini/select sminisel smini/select sminisel
smini/fire sminione smini/fire sminione

BIN
sounds/BigMagB.ogg Normal file

Binary file not shown.

View file

@ -290,30 +290,27 @@ Class ViewASMDSpark : ShockSpark
Class ASMDHitbox : ShockHitbox Class ASMDHitbox : ShockHitbox
{ {
override void Tick() override int DamageMobj( Actor inflictor, Actor source, int damage, Name mod, int flags, double angle )
{ {
Super.Tick(); if ( mod == 'jolted' )
if ( !target ) return; return 0;
let t = ThinkerIterator.Create("ASMDHitbox"); if ( !bAMBUSH )
Actor a;
while ( a = Actor(t.Next()) )
{ {
if ( (a == self) || !(a is 'ASMDHitbox') || a.bAMBUSH || (Distance3D(a) > radius*2) ) continue; bAMBUSH = true;
a.bAMBUSH = true; if ( target && target.InStateSequence(target.CurState,target.FindState("Spawn")) )
if ( a.target && a.target.InStateSequence(a.target.CurState,a.target.FindState("Spawn")) ) target.ExplodeMissile();
a.target.ExplodeMissile();
if ( !bAMBUSH )
{
bAMBUSH = true;
if ( target && target.InStateSequence(target.CurState,target.FindState("Spawn")) )
target.ExplodeMissile();
}
} }
return 0;
}
override bool CanCollideWith( Actor other, bool passive )
{
return true;
} }
Default Default
{ {
Radius 6; Radius 6;
Height 12; Height 12;
+SHOOTABLE;
} }
} }
@ -325,7 +322,7 @@ Class ASMDBall : Actor
override int SpecialMissileHit( Actor victim ) override int SpecialMissileHit( Actor victim )
{ {
if ( victim == b ) return 1; if ( victim is 'ASMDHitbox' ) return 1;
return -1; return -1;
} }
override void PostBeginPlay() override void PostBeginPlay()

View file

@ -19,6 +19,10 @@ Class UCasing : UTCasing
{ {
} }
Class AutomagMag : EnforcerMag
{
}
Class Automag : UnrealWeapon Class Automag : UnrealWeapon
{ {
int ClipCount, SlaveClipCount; int ClipCount, SlaveClipCount;
@ -248,6 +252,8 @@ Class Automag : UnrealWeapon
} }
origin = level.Vec3Offset(origin,x*8+ydir*y*6-z*2); origin = level.Vec3Offset(origin,x*8+ydir*y*6-z*2);
let c = Spawn("UCasing",origin); let c = Spawn("UCasing",origin);
c.angle = angle;
c.pitch = pitch;
c.vel = x*FRandom[Junk](-1.5,1.5)+y*ydir*FRandom[Junk](2,4)+z*FRandom[Junk](2,3); c.vel = x*FRandom[Junk](-1.5,1.5)+y*ydir*FRandom[Junk](2,4)+z*FRandom[Junk](2,3);
} }
override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack )
@ -529,6 +535,13 @@ Class Automag : UnrealWeapon
if ( self is 'UTPlayer' ) if ( self is 'UTPlayer' )
UTPlayer(self).PlayReloading(); UTPlayer(self).PlayReloading();
invoker.slavereload = (invoker.slaveactive&&(invoker.slaveclipcount<invoker.default.slaveclipcount)&&(invoker.Ammo1.Amount>0)); invoker.slavereload = (invoker.slaveactive&&(invoker.slaveclipcount<invoker.default.slaveclipcount)&&(invoker.Ammo1.Amount>0));
Vector3 x, y, z, origin;
[x,y,z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),x*4.+y*4.-z*8.);
let c = Spawn("AutomagMag",origin);
c.angle = angle;
c.pitch = pitch;
c.vel = vel*.5+x*FRandom[Junk](-.5,.5)+y*FRandom[Junk](-.5,.5)-z*FRandom[Junk](1,2);
} }
AUTS A 0 A_PlaySound("automag/select",CHAN_WEAPON,!Dampener.Active(self)?1.:.1); AUTS A 0 A_PlaySound("automag/select",CHAN_WEAPON,!Dampener.Active(self)?1.:.1);
Goto Ready; Goto Ready;
@ -557,6 +570,13 @@ Class Automag : UnrealWeapon
if ( self is 'UTPlayer' ) if ( self is 'UTPlayer' )
UTPlayer(self).PlayReloading(); UTPlayer(self).PlayReloading();
invoker.slavereload = false; invoker.slavereload = false;
Vector3 x, y, z, origin;
[x,y,z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),x*4.-y*4.-z*8.);
let c = Spawn("AutomagMag",origin);
c.angle = angle;
c.pitch = pitch;
c.vel = vel*.5+x*FRandom[Junk](-.5,.5)+y*FRandom[Junk](-.5,.5)-z*FRandom[Junk](1,2);
} }
2UTS A 0 A_PlaySound("automag/select",CHAN_6,!Dampener.Active(self)?1.:.1); 2UTS A 0 A_PlaySound("automag/select",CHAN_6,!Dampener.Active(self)?1.:.1);
Goto LeftReady; Goto LeftReady;

View file

@ -291,6 +291,8 @@ Class Betamag : UnrealWeapon
} }
origin = level.Vec3Offset(origin,x*5+ydir*y*8-z*2); origin = level.Vec3Offset(origin,x*5+ydir*y*8-z*2);
let c = Spawn(slave?"BCasing2":"BCasing",origin); let c = Spawn(slave?"BCasing2":"BCasing",origin);
c.angle = angle;
c.pitch = pitch;
c.vel = x*FRandom[Junk](-1.5,1.5)+y*ydir*FRandom[Junk](2,4)+z*FRandom[Junk](2,3); c.vel = x*FRandom[Junk](-1.5,1.5)+y*ydir*FRandom[Junk](2,4)+z*FRandom[Junk](2,3);
} }
override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack )

View file

@ -229,6 +229,30 @@ Class BigCasing : UTCasing
} }
} }
// hambagah?
Class BigMag : UTCasing
{
Default
{
BounceSound "big/bounce"; // much heavier sound
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
heat = 0.;
}
States
{
Death:
PCAS A -1
{
pitch = clamp(Normalize180(pitch),-5,5);
angle = FRandom[Junk](0,360);
}
Stop;
}
}
Class BigGun : UnrealWeapon Class BigGun : UnrealWeapon
{ {
int ClipCount; int ClipCount;
@ -536,7 +560,18 @@ Class BigGun : UnrealWeapon
A_PlaySound("big/punch",CHAN_WEAPON,Dampener.Active(self)?.3:1.); A_PlaySound("big/punch",CHAN_WEAPON,Dampener.Active(self)?.3:1.);
if ( self is 'UTPlayer' ) UTPlayer(self).PlayReloading(); if ( self is 'UTPlayer' ) UTPlayer(self).PlayReloading();
} }
BIGR NOPQRSTUVWXYZ[\] 2; BIGR NOPQRSTUVW 2;
BIGR X 2
{
Vector3 x, y, z, origin;
[x,y,z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),x*5.-z*9.);
let c = Spawn("BigMag",origin);
c.angle = angle;
c.pitch = pitch;
c.vel = vel*.5+x*FRandom[Junk](-.5,.5)+y*FRandom[Junk](-.5,.5)-z*FRandom[Junk](1,2);
}
BIGR YZ[\] 2;
BIR2 ABCDEF 2; BIR2 ABCDEF 2;
BIR2 G 2 BIR2 G 2
{ {

View file

@ -63,6 +63,7 @@ Class UFireball : Actor
+FORCERADIUSDMG; +FORCERADIUSDMG;
+NODAMAGETHRUST; +NODAMAGETHRUST;
+FORCEXYBILLBOARD; +FORCEXYBILLBOARD;
+DONTSPLASH;
UFireball.SpreadFactor 0.2; UFireball.SpreadFactor 0.2;
UFireball.NumSmokes 1; UFireball.NumSmokes 1;
UFireball.NumSparks 2; UFireball.NumSparks 2;

View file

@ -295,6 +295,7 @@ Class UFlame : Actor
+FORCEXYBILLBOARD; +FORCEXYBILLBOARD;
+DROPOFF; +DROPOFF;
+NOBLOCKMONST; +NOBLOCKMONST;
+DONTSPLASH;
//+THRUIMPASSABLE; // gonna have to implement this //+THRUIMPASSABLE; // gonna have to implement this
} }
States States

View file

@ -61,6 +61,10 @@ Class OLSMPAmmo : Ammo
} }
} }
Class OLSMPMag : EnforcerMag
{
}
Class OLSMP : UnrealWeapon Class OLSMP : UnrealWeapon
{ {
int ClipCount; int ClipCount;
@ -217,6 +221,8 @@ Class OLSMP : UnrealWeapon
} }
origin = level.Vec3Offset(origin,x*8+y*6-z*2); origin = level.Vec3Offset(origin,x*8+y*6-z*2);
let c = Spawn("UCasing",origin); let c = Spawn("UCasing",origin);
c.angle = angle;
c.pitch = pitch;
c.vel = x*FRandom[Junk](-1.5,1.5)+y*FRandom[Junk](2,4)+z*FRandom[Junk](2,3); c.vel = x*FRandom[Junk](-1.5,1.5)+y*FRandom[Junk](2,4)+z*FRandom[Junk](2,3);
} }
override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount ) override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount )
@ -346,6 +352,13 @@ Class OLSMP : UnrealWeapon
A_PlaySound("automag/reload",CHAN_WEAPON,!Dampener.Active(self)?1.:.1,pitch:0.8); A_PlaySound("automag/reload",CHAN_WEAPON,!Dampener.Active(self)?1.:.1,pitch:0.8);
if ( self is 'UTPlayer' ) if ( self is 'UTPlayer' )
UTPlayer(self).PlayReloading(); UTPlayer(self).PlayReloading();
Vector3 x, y, z, origin;
[x,y,z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),x*4.+y*4.-z*18.);
let c = Spawn("OLSMPMag",origin);
c.angle = angle;
c.pitch = pitch;
c.vel = vel*.5+x*FRandom[Junk](-.5,.5)+y*FRandom[Junk](-.5,.5)-z*FRandom[Junk](1,2);
} }
AUTS A 0 A_PlaySound("automag/select",CHAN_WEAPON,!Dampener.Active(self)?1.:.1,pitch:0.8); AUTS A 0 A_PlaySound("automag/select",CHAN_WEAPON,!Dampener.Active(self)?1.:.1,pitch:0.8);
Goto Ready; Goto Ready;

View file

@ -333,6 +333,8 @@ Class QuadShot : UnrealWeapon
{ {
let c = Spawn("QCasing",origin); let c = Spawn("QCasing",origin);
c.vel = x*FRandom[Junk](-1.5,0.25)-y*FRandom[Junk](1,4)-z*FRandom[Junk](1,4); c.vel = x*FRandom[Junk](-1.5,0.25)-y*FRandom[Junk](1,4)-z*FRandom[Junk](1,4);
c.angle = angle;
c.pitch = pitch;
} }
} }
action bool A_QuadshotCheckForReload( bool bDryFire = false ) action bool A_QuadshotCheckForReload( bool bDryFire = false )

View file

@ -211,6 +211,8 @@ Class URifle : UnrealWeapon
origin = level.Vec3Offset(origin,x*4+y*6-z*10); origin = level.Vec3Offset(origin,x*4+y*6-z*10);
let c = Spawn("UCasing",origin); let c = Spawn("UCasing",origin);
c.scale *= 1.25; c.scale *= 1.25;
c.angle = angle;
c.pitch = pitch;
c.vel = x*FRandom[Junk](-1.5,1.5)+y*FRandom[Junk](2,4)+z*FRandom[Junk](2,3); c.vel = x*FRandom[Junk](-1.5,1.5)+y*FRandom[Junk](2,4)+z*FRandom[Junk](2,3);
} }
override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack )

View file

@ -493,8 +493,12 @@ Class StingerProjectile : Actor
States States
{ {
Spawn: Spawn:
TPRJ A -1 Bright; TPRJ A 1 Bright
Stop; {
if ( waterlevel > 0 )
Spawn("UTBubble",pos);
}
Wait;
Bounce: Bounce:
TPRJ A 0 Bright A_HandleBounce(); TPRJ A 0 Bright A_HandleBounce();
Goto Spawn; Goto Spawn;

View file

@ -176,6 +176,10 @@ Class UFlakSlug : FlakSlug
} }
} }
Class UFlakMag : FlakMag
{
}
Class UFlakCannon : UnrealWeapon Class UFlakCannon : UnrealWeapon
{ {
action void A_Loading( bool first = false ) action void A_Loading( bool first = false )
@ -332,7 +336,16 @@ Class UFlakCannon : UnrealWeapon
FLKF J 5; FLKF J 5;
FLKE A 1 A_PlaySound("flak/click",CHAN_6,Dampener.Active(self)?.05:.5); FLKE A 1 A_PlaySound("flak/click",CHAN_6,Dampener.Active(self)?.05:.5);
FLKE BCDEFGHIJKLMN 1; FLKE BCDEFGHIJKLMN 1;
FLKE S 4; FLKE S 4
{
Vector3 x, y, z, origin;
[x,y,z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),x*4.+y*3.-z*8.);
let c = Spawn("UFlakMag",origin);
c.angle = angle;
c.pitch = pitch;
c.vel = vel*.5+x*FRandom[Junk](-.8,.1)+y*FRandom[Junk](-.2,.2)-z*FRandom[Junk](1,2);
}
Goto Loading; Goto Loading;
AltFire: AltFire:
FLKA A 1 A_FireSlug(); FLKA A 1 A_FireSlug();

View file

@ -128,6 +128,8 @@ Class UMinigun : UnrealWeapon
} }
origin = level.Vec3Offset(origin,x*4+y*3-z*12); origin = level.Vec3Offset(origin,x*4+y*3-z*12);
let c = Spawn("UCasing",origin); let c = Spawn("UCasing",origin);
c.angle = angle;
c.pitch = pitch;
c.vel = x*FRandom[Junk](-1.5,1.5)-y*FRandom[Junk](2,4)+z*FRandom[Junk](-2,1); c.vel = x*FRandom[Junk](-1.5,1.5)-y*FRandom[Junk](2,4)+z*FRandom[Junk](-2,1);
} }

View file

@ -352,6 +352,7 @@ Class UPlayerFemale : UPlayer
{ {
Player.SoundClass "ufemale"; Player.SoundClass "ufemale";
UTPlayer.VoiceType VOICE_FemaleOne; UTPlayer.VoiceType VOICE_FemaleOne;
UTPlayer.DollType DOLL_Female;
} }
void A_ArmPop() void A_ArmPop()