1.0.1 Release:

- Greatly improved responsiveness of Eightball.
 - Increase Betamag melee damage (15 → 25).
 - Reduce Demolisher visual sway.
 - Increase Razorclaw primary damage (6 → 10) and decrease interval (5 → 4).
 - Add random chance of forcing pain to each hit of Razorclaw primary (1/6 for bosses, 1/4 for normal enemies), making it a more viable melee weapon.
 - Razorclaw now propels you when fully submerged.
 - Fix Flame Gun not checking for the correct minimum ammo for secondary fire.
 - Replacements respect IsFinal.
 - HUD will display BasicArmor if available, for compatibility.
 - Fix alignment for non-standard item/ammo icons.
 - Fix Teleport Capsules having a choppy twiddle animation.
This commit is contained in:
Marisa the Magician 2019-10-28 10:54:51 +01:00
commit 08361babe6
10 changed files with 111 additions and 26 deletions

View file

@ -176,7 +176,7 @@ Class Betamag : UnrealWeapon
{
if ( d.HitType == TRACE_HitActor )
{
int dmg = 15;
int dmg = 25;
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'Melee',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
UTMainHandler.DoKnockback(d.HitActor,d.HitDir,35000);
if ( d.HitActor.player ) d.HitActor.A_QuakeEx(2,2,2,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.25);

View file

@ -484,20 +484,20 @@ Class BigGun : UnrealWeapon
Twiddle1:
BIGW A 3
{
UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.2,-0.3),FRandom[BigGun](0.2,0.3)),2,0,12,SWING_Spring,5,2);
UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.1,-0.15),FRandom[BigGun](0.2,0.3)),2,0,12,SWING_Spring,5,2);
}
BIGW BCDEFGHIJKLMNO 3;
Goto Idle;
Twiddle2:
BIGT A 2
{
UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.2,-0.3),FRandom[BigGun](0.2,0.3)),3,0,6,SWING_Spring,5,2);
UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.2,-0.3),FRandom[BigGun](-0.4,-0.6)),4,0,12,SWING_Spring,6,1.4);
UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.1,-0.15),FRandom[BigGun](0.2,0.3)),3,0,6,SWING_Spring,5,2);
UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.1,-0.15),FRandom[BigGun](-0.4,-0.6)),4,0,12,SWING_Spring,6,1.4);
}
BIGT BCDEFGHIJKLMNOP 2;
BIGT Q 2
{
UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.3,-0.2),FRandom[BigGun](0.4,0.5)),3,0.5,6,SWING_Spring,2,1.5);
UTMainHandler.DoSwing(self,(FRandom[BigGun](-0.15,-0.1),FRandom[BigGun](0.4,0.5)),3,0.5,6,SWING_Spring,2,1.5);
}
BIGT RSTUVWXY 2;
Goto Idle;

View file

@ -60,6 +60,7 @@ Class Bonesaw : UnrealWeapon
{
if ( d.HitType == TRACE_HitActor )
{
invoker.bFORCEPAIN = !Random[Bonesaw](0,d.HitActor.bBOSS?5:2);
if ( d.HitLocation.z >= (d.HitActor.pos.z+d.HitActor.height*0.8) )
dmg = d.HitActor.DamageMobj(invoker,self,dmg*2,'Decapitated',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
else dmg = d.HitActor.DamageMobj(invoker,self,dmg,'slashed',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
@ -83,7 +84,6 @@ Class Bonesaw : UnrealWeapon
p.pitch = asin(-d.HitDir.z);
}
else A_PlaySound("ripper/flesh",CHAN_6);
A_AlertMonsters();
if ( invoker.bAltFire ) A_QuakeEx(3,3,3,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.13);
else A_QuakeEx(1,1,1,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.06);
return true;
@ -94,14 +94,42 @@ Class Bonesaw : UnrealWeapon
{
UTMainHandler.DoSwing(self,(FRandom[Bonesaw](-1,1),FRandom[Bonesaw](-1,1)),0.3,-0.2,2,SWING_Spring,0,2);
invoker.special1++;
if ( invoker.special1 < 5 ) return;
Vector3 x, y, z, origin;
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),x*15+y*4-z*4);
if ( waterlevel >= 3 )
{
UTMainHandler.DoKnockback(self,x,5000);
for ( int i=0; i<3; i++ )
{
let b = Spawn("UTBubble",level.Vec3Offset(origin,FRandom[Bonesaw](-4,4)*y+FRandom[Bonesaw](-4,4)*z));
b.scale *= .5;
b.vel += vel*.5;
}
}
if ( invoker.special1 < 4 ) return;
invoker.special1 = 0;
invoker.FireEffect();
for ( int i=0; i<8; i++ ) if ( TryHit(angle+i*(45./16),6) || TryHit(angle-i*(45./16),6) ) return;
A_AlertMonsters();
for ( int i=0; i<8; i++ ) if ( TryHit(angle+i*(45./16),10) || TryHit(angle-i*(45./16),10) ) return;
}
action void A_Clamp()
{
invoker.FireEffect();
A_AlertMonsters();
Vector3 x, y, z, origin;
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),x*15+y*4-z*4);
if ( waterlevel >= 3 )
{
UTMainHandler.DoKnockback(self,x,20000);
for ( int i=0; i<12; i++ )
{
let b = Spawn("UTBubble",level.Vec3Offset(origin,FRandom[Bonesaw](-4,4)*y+FRandom[Bonesaw](-4,4)*z));
b.scale *= .5;
b.vel += vel*.5;
}
}
for ( int i=0; i<8; i++ ) if ( TryHit(angle+i*(45./16),30) || TryHit(angle-i*(45./16),30) ) return;
}
Default

View file

@ -430,7 +430,7 @@ Class FlameGun : UnrealWeapon
{
A_CheckReload();
int flags = (waterlevel>=2)?WRF_NOFIRE:0;
if ( invoker.Ammo1.Amount < 30 )
if ( invoker.Ammo1.Amount < invoker.AmmoUse2 )
flags |= WRF_NOSECONDARY;
A_WeaponReady(flags);
}
@ -483,6 +483,7 @@ Class FlameGun : UnrealWeapon
#### # 1 A_Overlay(-9999,"Null");
FGNF A 1
{
invoker.special1 = 0;
A_PlaySound("flamegun/charge",CHAN_WEAPON,Dampener.Active(self)?.1:1.);
if ( !Dampener.Active(self) ) A_AlertMonsters();
}

View file

@ -401,6 +401,7 @@ Class Eightball : UnrealWeapon
{
Weapon weap = Weapon(invoker);
if ( !weap ) return;
A_Overlay(-9999,"Null");
invoker.special1 = 0;
if ( weap.bAltFire )
{
@ -592,28 +593,35 @@ Class Eightball : UnrealWeapon
#### # 5
{
A_Overlay(-9999,"Null");
A_PlaySound("utrl/load",CHAN_6,Dampener.Active(self)?.03:.3);
A_PlaySound("utrl/load",CHAN_WEAPON,Dampener.Active(self)?.03:.3);
if ( invoker.bSingleRocket = !invoker.bSingleRocket )
A_Print(StringTable.Localize("$M_SINGLEROCKETON"));
else A_Print(StringTable.Localize("$M_SINGLEROCKETOFF"));
}
Goto Idle;
Dummy2:
TNT1 A 1
{
if ( !(player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK)) )
player.SetPSprite(PSP_WEAPON,ResolveState("Release"));
}
Wait;
Fire:
AltFire:
// one is loaded already
#### # 1
{
A_Overlay(-9999,"Null");
A_Overlay(-9999,"Dummy2");
A_LoadRocket(false);
}
#### # 3 A_JumpIf(!invoker.bAltFire&&invoker.bSingleRocket,"Release");
#### # 0 A_JumpIf(!invoker.bAltFire&&invoker.bSingleRocket,"Release");
#### # 0 A_LoadedRefire(1);
Goto Release;
Loading:
EBLI A 0;
EBLL A 0 A_LoadRocket();
EBLL A 0 A_PlaySound("utrl/load",CHAN_6,Dampener.Active(self)?.1:1.);
EBLL A 0 A_PlaySound("utrl/load",CHAN_WEAPON,Dampener.Active(self)?.1:1.);
EBLL ABCDEFGHIJK 1;
EBLL L 0 A_LoadRocket();
EBLL L 0 A_PlaySound("utrl/rotate",CHAN_ITEM,Dampener.Active(self)?.01:.1);
EBLL LMNOPQRSTUVWXYZ[ 1;
EBLL Z 0;

View file

@ -963,6 +963,7 @@ Class UnrealMainHandler : EventHandler
}
override void CheckReplacement( ReplaceEvent e )
{
if ( e.IsFinal ) return;
if ( (e.Replacee == 'Chainsaw') || (e.Replacee == 'Gauntlets') )
{
if ( ((sting_proto && sting_dubious) || sting_olsmp) && !Random[Replacements](0,sting_proto?3:1) ) e.Replacement = 'WeaponPowerUp';

View file

@ -228,7 +228,7 @@ Class UnrealHUD : BaseStatusBar
Vector2 scl = TexMan.GetScaledSize(i.Icon);
double mscl = 32./max(scl.x,scl.y);
double dw = (ClipX/mscl), dh = (ClipY/mscl);
double dx = CurX/mscl, dy = CurY/mscl;
double dx = (CurX+(32-scl.x*mscl)/2)/mscl, dy = (CurY+(32-scl.y*mscl)/2)/mscl;
if ( bRed )
{
Screen.DrawTexture(IconBase,false,CurX,CurY,DTA_VirtualWidthF,ClipX,DTA_VirtualHeightF,ClipY,DTA_KeepRatio,true,DTA_TranslationIndex,RedIcon);
@ -429,14 +429,40 @@ Class UnrealHUD : BaseStatusBar
BestArmor = Inv;
}
}
if ( bDrawOne && BestArmor )
let ba = CPlayer.mo.FindInventory("BasicArmor");
if ( ba && (ba.Amount > 0) )
{
hasdrawn = true;
if ( !bCheckOnly ) DrawHudIcon(CurX,Y,BestArmor,false);
CurX += 32;
CurY += HudMode?29:27;
if ( !bCheckOnly ) DrawIconValue(BestArmor.Amount);
CurY -= HudMode?29:27;
ArmorAmount += ba.Amount;
if ( !bDrawOne )
{
hasdrawn = true;
if ( !bCheckOnly ) DrawHudIcon(CurX,y,ba,false);
CurX += 32;
CurY += HudMode?29:27;
if ( !bCheckOnly ) DrawIconValue(ba.Amount);
CurY -= HudMode?29:27;
}
}
if ( bDrawOne )
{
if ( BestArmor )
{
hasdrawn = true;
if ( !bCheckOnly ) DrawHudIcon(CurX,Y,BestArmor,false);
CurX += 32;
CurY += HudMode?29:27;
if ( !bCheckOnly ) DrawIconValue(BestArmor.Amount);
CurY -= HudMode?29:27;
}
else if ( ba && (ba.Amount > 0) )
{
hasdrawn = true;
if ( !bCheckOnly ) DrawHudIcon(CurX,Y,ba,false);
CurX += 32;
CurY += HudMode?29:27;
if ( !bCheckOnly ) DrawIconValue(ba.Amount);
CurY -= HudMode?29:27;
}
}
if ( (ArmorAmount > 0) && !HudMode )
{
@ -479,7 +505,7 @@ Class UnrealHUD : BaseStatusBar
Vector2 scl = TexMan.GetScaledSize(icon);
double mscl = 32./max(scl.x,scl.y);
double dw = (ClipX/mscl), dh = (ClipY/mscl);
double dx = CurX/mscl, dy = CurY/mscl;
double dx = (CurX+(32-scl.x*mscl)/2)/mscl, dy = (CurY+(32-scl.y*mscl)/2)/mscl;
Screen.DrawTexture(icon,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_TopOffset,0,DTA_LeftOffset,0);
CurX += 32;
CurY += 29;
@ -683,18 +709,25 @@ Class UnrealHUD : BaseStatusBar
BestArmor = Inv;
}
}
let ba = CPlayer.mo.FindInventory("BasicArmor");
if ( ba ) ArmorAmount += ba.amount;
bool drawnarmor = false;
for ( int i=0; i<6; i++ )
{
if ( !(BestArmor is OldArmorType[i]) ) continue;
DrawImage(OldArmor[i],(4,340),DI_ITEM_OFFSETS);
drawnarmor = true;
break;
}
if ( !drawnarmor && ba && (ba.Amount > 0) )
DrawInventoryIcon(ba,(40,366),DI_ITEM_CENTER,1.,(-1,-1),(2.,2.));
if ( ArmorAmount ) DrawString(mOldDigits,FormatNumber(ArmorAmount,3),(167,366),DI_TEXT_ALIGN_RIGHT);
Inventory Ammo1, Ammo2;
[Ammo1, Ammo2] = GetCurrentAmmo();
if ( Ammo1 )
{
if ( Ammo1.Amount ) DrawString(mOldDigits,FormatNumber(Ammo1.Amount,3),(549,366),DI_TEXT_ALIGN_RIGHT);
bool drawn = false;
for ( int i=0; i<19; i++ )
{
// match by ammo
@ -702,8 +735,11 @@ Class UnrealHUD : BaseStatusBar
// match by weapon
if ( (OldAmmoType[i] is 'Weapon') && !(CPlayer.ReadyWeapon is OldAmmoType[i]) ) continue;
DrawImage(OldAmmo[i],(560,336),DI_ITEM_OFFSETS);
drawn = true;
break;
}
if ( !drawn )
DrawInventoryIcon(Ammo1,(600,366),DI_ITEM_CENTER,1.,(-1,-1),(2.,2.));
}
int sec = -1, sec2 = -1;
if ( CPlayer.ReadyWeapon && (CPlayer.ReadyWeapon is 'UnrealWeapon') )

View file

@ -276,8 +276,19 @@ Class UTranslocator : UnrealWeapon
TLCI ABCDEFG 20 A_Jump(16,"Twiddle");
Goto Idle+1;
Twiddle:
#### # 6 { invoker.special1 = Random[TeleHand](2,5); }
TLCT ABCDEFGHI 3 A_SetTics(invoker.special1);
#### # 6;
TLCT A 0 A_Jump(256,"Twiddle2","Twiddle3","Twiddle4","Twiddle5");
Twiddle2:
TLCT ABCDEFGHI 2;
Goto Idle+1;
Twiddle3:
TLCT ABCDEFGHI 3;
Goto Idle+1;
Twiddle4:
TLCT ABCDEFGHI 4;
Goto Idle+1;
Twiddle5:
TLCT ABCDEFGHI 5;
Goto Idle+1;
Fire:
TLCF A 0 A_Overlay(-9999,"Null");