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:
parent
28d0912eda
commit
08361babe6
10 changed files with 111 additions and 26 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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') )
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue