Enhanced weapon bobbing.
Rebalanced Explodium Gun damages, more reasonable for a starter weapon. Fixed ammo checks for various weapons. Also fixes Eviscerator "one in the chamber" function not working.
This commit is contained in:
parent
0b3cc1b0f4
commit
9c06e76acd
6 changed files with 108 additions and 13 deletions
|
|
@ -390,6 +390,7 @@ Class EvisceratorProj : Actor
|
|||
s.vel = pvel;
|
||||
s.scale *= FRandom[Eviscerator](0.9,1.8);
|
||||
}
|
||||
Spawn("EvisceratorRing",pos);
|
||||
}
|
||||
action void A_SubExpl()
|
||||
{
|
||||
|
|
@ -470,6 +471,27 @@ Class EvisceratorSubExpl : Actor
|
|||
}
|
||||
}
|
||||
|
||||
Class EvisceratorRing : Actor
|
||||
{
|
||||
Default
|
||||
{
|
||||
RenderStyle "Add";
|
||||
Scale 4.;
|
||||
Radius 0.1;
|
||||
Height 0;
|
||||
+NOGRAVITY;
|
||||
+NOBLOCKMAP;
|
||||
+FORCEXYBILLBOARD;
|
||||
+NOTELEPORT;
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
XRG3 ABCDEFGHIJKLMNOPQRSTUVWX 1 Bright A_SetScale(scale.x*1.01);
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
Class EvisceratorCasing : SWWMCasing
|
||||
{
|
||||
Default
|
||||
|
|
@ -546,10 +568,13 @@ Class Eviscerator : SWWMWeapon
|
|||
if ( (loadtics == 9) && Owner && Owner.player && (Owner.player.ReadyWeapon == self) )
|
||||
{
|
||||
Owner.A_StartSound("eviscerator/load",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
}
|
||||
if ( loadtics > 20 )
|
||||
{
|
||||
pendingload = false;
|
||||
if ( !sv_infiniteammo && !Owner.FindInventory('PowerInfiniteAmmo',true) )
|
||||
Ammo1.Amount = max(0,Ammo1.Amount-1);
|
||||
}
|
||||
if ( loadtics > 20 ) pendingload = false;
|
||||
}
|
||||
|
||||
action void A_EvisceratorFire()
|
||||
|
|
@ -734,8 +759,9 @@ Class Eviscerator : SWWMWeapon
|
|||
invoker.isfiring = false;
|
||||
int flg = WRF_ALLOWRELOAD|WRF_ALLOWZOOM|WRF_ALLOWUSER1;
|
||||
if ( invoker.pendingload ) flg |= WRF_NOFIRE;
|
||||
A_CheckReload();
|
||||
A_WeaponReady(flg);
|
||||
if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) )
|
||||
invoker.CheckAmmo(EitherFire,true);
|
||||
}
|
||||
Wait;
|
||||
ReadyExt:
|
||||
|
|
@ -744,8 +770,9 @@ Class Eviscerator : SWWMWeapon
|
|||
invoker.isfiring = false;
|
||||
int flg = WRF_ALLOWRELOAD|WRF_ALLOWZOOM|WRF_ALLOWUSER1;
|
||||
if ( invoker.pendingload ) flg |= WRF_NOFIRE;
|
||||
A_CheckReload();
|
||||
A_WeaponReady(flg);
|
||||
if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) )
|
||||
invoker.CheckAmmo(EitherFire,true);
|
||||
}
|
||||
Wait;
|
||||
Fire:
|
||||
|
|
|
|||
|
|
@ -661,12 +661,6 @@ Class SWWMWeapon : Weapon abstract
|
|||
if ( (AmmoGive2 <= 0) && (default.AmmoGive2 > 0) )
|
||||
AmmoGive2 = 1;
|
||||
}
|
||||
override void DoEffect()
|
||||
{
|
||||
Super.DoEffect();
|
||||
if ( Owner && Owner.player && (Owner.player.ReadyWeapon == self) )
|
||||
Owner.player.WeaponState |= WF_WEAPONBOBBING; // always bob
|
||||
}
|
||||
Default
|
||||
{
|
||||
Weapon.BobStyle "Alpha";
|
||||
|
|
|
|||
|
|
@ -25,6 +25,15 @@ Class Demolitionist : PlayerPawn
|
|||
|
||||
double guideangle, guidepitch, guideroll;
|
||||
|
||||
// for weapon bobbing stuff
|
||||
bool bumpdown;
|
||||
double bumpvelz;
|
||||
double oldangle, oldpitch;
|
||||
double oldlagangle, oldlagpitch, oldlagready;
|
||||
Vector3 oldlagvel;
|
||||
double lagangle, lagpitch, lagready;
|
||||
Vector3 lagvel;
|
||||
|
||||
enum EUnderType
|
||||
{
|
||||
UNDER_NONE,
|
||||
|
|
@ -376,10 +385,62 @@ Class Demolitionist : PlayerPawn
|
|||
A_SoundVolume(CHAN_AMBEXTRA,(players[consoleplayer].Camera==self)?1.:0.);
|
||||
lastunder = curunder;
|
||||
}
|
||||
override Vector2 BobWeapon( double ticfrac )
|
||||
{
|
||||
bool oldbob = !!(player.WeaponState&WF_WEAPONBOBBING);
|
||||
player.WeaponState |= WF_WEAPONBOBBING; // always bob
|
||||
Vector2 cur = Super.BobWeapon(ticfrac);
|
||||
if ( !oldbob ) player.WeaponState &= ~WF_WEAPONBOBBING;
|
||||
double diffang = (oldangle*(1.-ticfrac)+angle*ticfrac)-(oldlagangle*(1.-ticfrac)+lagangle*ticfrac);
|
||||
double diffpitch = (oldpitch*(1.-ticfrac)+pitch*ticfrac)-(oldlagpitch*(1.-ticfrac)+lagpitch*ticfrac);
|
||||
if ( abs(diffang) > 1. )
|
||||
{
|
||||
int sgn = (diffang>0)?1:-1;
|
||||
diffang = abs(diffang)**.7*sgn;
|
||||
}
|
||||
if ( abs(diffpitch) > 1. )
|
||||
{
|
||||
int sgn = (diffpitch>0)?1:-1;
|
||||
diffpitch = abs(diffpitch)**.7*sgn;
|
||||
}
|
||||
cur.x += diffang;
|
||||
cur.y -= diffpitch;
|
||||
Vector3 diffvel = oldlagvel*(1.-ticfrac)+lagvel*ticfrac;
|
||||
double diffx = diffvel dot (cos(angle+90),sin(angle+90),0);
|
||||
double diffy = diffvel dot (0,0,1);
|
||||
if ( abs(diffx) > 1. )
|
||||
{
|
||||
int sgn = (diffx>0)?1:-1;
|
||||
diffx = abs(diffx)**.5*sgn;
|
||||
}
|
||||
if ( abs(diffy) > 1. )
|
||||
{
|
||||
int sgn = (diffy>0)?1:-1;
|
||||
diffy = abs(diffy)**.5*sgn;
|
||||
}
|
||||
cur.x += diffx*4.;
|
||||
cur.y += diffy*4.;
|
||||
return cur*(oldlagready*(1.-ticfrac)+lagready*ticfrac);
|
||||
}
|
||||
override void PlayerThink()
|
||||
{
|
||||
oldangle = angle;
|
||||
oldpitch = pitch;
|
||||
Super.PlayerThink();
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !player ) return;
|
||||
oldlagangle = lagangle;
|
||||
oldlagpitch = lagpitch;
|
||||
oldlagready = lagready;
|
||||
oldlagvel = lagvel;
|
||||
lagangle = lagangle*.8+angle*.2;
|
||||
lagpitch = lagpitch*.8+pitch*.2;
|
||||
if ( player.weaponstate&WF_WEAPONBOBBING ) lagready = lagready*.9+.1;
|
||||
else lagready = lagready*.4;
|
||||
lagvel = lagvel*.8+vel*.2;
|
||||
double traveldist = level.Vec3Diff(prev,pos).length();
|
||||
if ( waterlevel < 2 )
|
||||
{
|
||||
|
|
@ -401,6 +462,9 @@ Class Demolitionist : PlayerPawn
|
|||
if ( !mute ) mute = CVar.GetCVar('swwm_mutevoice',player);
|
||||
if ( player.onground && !bNoGravity && !lastground && (waterlevel < 2) && (health > 0) )
|
||||
{
|
||||
// bump down weapon
|
||||
bumpdown = true;
|
||||
bumpvelz = -lastvelz;
|
||||
if ( lastvelz < -30 )
|
||||
{
|
||||
let s = Spawn("DemolitionistShockwave",pos);
|
||||
|
|
@ -423,6 +487,12 @@ Class Demolitionist : PlayerPawn
|
|||
if ( lastvelz < -1 )
|
||||
A_Footstep(0,true,clamp(-lastvelz*0.05,0.0,1.0));
|
||||
}
|
||||
if ( bumpdown )
|
||||
{
|
||||
lagvel.z += bumpvelz*.2;
|
||||
bumpvelz *= .8;
|
||||
if ( bumpvelz < double.epsilon ) bumpdown = false;
|
||||
}
|
||||
lastground = player.onground;
|
||||
lastvelz = prevvelz;
|
||||
prevvelz = vel.z;
|
||||
|
|
|
|||
|
|
@ -2517,6 +2517,8 @@ Class Spreadgun : SWWMWeapon
|
|||
flg |= WRF_ALLOWRELOAD;
|
||||
else flg |= WRF_NOPRIMARY;
|
||||
A_WeaponReady(flg);
|
||||
if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) )
|
||||
invoker.CheckAmmo(EitherFire,true);
|
||||
}
|
||||
Wait;
|
||||
Fire:
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ Class ExplodiumMagProj : Actor
|
|||
Scale *= 2.+.2*special1;
|
||||
A_AlertMonsters();
|
||||
SWWMHandler.DoBlast(self,120+30*special1,80000+8000*special1);
|
||||
A_Explode(30+20*special1,120+30*special1);
|
||||
A_Explode(20+15*special1,120+30*special1);
|
||||
A_QuakeEx(9,9,9,30,0,400+80*special1,"",QF_RELATIVE|QF_SCALEDOWN,falloff:300,rollintensity:2.);
|
||||
A_StartSound("explodium/maghit",CHAN_VOICE,attenuation:.35);
|
||||
A_StartSound("explodium/maghit",CHAN_WEAPON,attenuation:.2);
|
||||
|
|
@ -229,7 +229,7 @@ Class ExplodiumBulletImpact : Actor
|
|||
Super.PostBeginPlay();
|
||||
A_AlertMonsters();
|
||||
SWWMHandler.DoBlast(self,120,80000);
|
||||
A_Explode(50,120);
|
||||
A_Explode(25,120);
|
||||
A_QuakeEx(4,4,4,10,0,250,"",QF_RELATIVE|QF_SCALEDOWN,falloff:150,rollintensity:0.2);
|
||||
A_StartSound("explodium/hit",CHAN_VOICE,attenuation:.6);
|
||||
A_StartSound("explodium/hit",CHAN_WEAPON,attenuation:.3);
|
||||
|
|
@ -315,7 +315,7 @@ Class ExplodiumGun : SWWMWeapon
|
|||
SWWMBulletTrail.DoTrail(self,origin,dir,10000,2);
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = 40;
|
||||
int dmg = 25;
|
||||
SWWMHandler.DoKnockback(d.HitActor,d.HitDir,48000);
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'Explodium',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
|
||||
if ( d.HitActor.bNOBLOOD || d.HitActor.bINVULNERABLE )
|
||||
|
|
|
|||
|
|
@ -974,6 +974,7 @@ Class CandyGun : SWWMWeapon
|
|||
Weapon.AmmoType2 "CandyGunSpares";
|
||||
Weapon.AmmoGive1 1;
|
||||
Weapon.AmmoGive2 1;
|
||||
Weapon.AmmoUse2 0;
|
||||
CandyGun.ClipCount 7;
|
||||
+SWWMWEAPON.NOFIRSTGIVE;
|
||||
}
|
||||
|
|
@ -989,7 +990,6 @@ Class CandyGun : SWWMWeapon
|
|||
Ready:
|
||||
XZW2 A 1
|
||||
{
|
||||
invoker.CheckAmmo(EitherFire,true);
|
||||
if ( (invoker.clipcount <= 0) && !invoker.chambered && (invoker.Ammo1.Amount > 0) ) player.SetPSprite(PSP_WEAPON,ResolveState("Reload"));
|
||||
else if ( (invoker.clipcount > 0) && !invoker.chambered ) player.SetPSprite(PSP_WEAPON,ResolveState("Slide"));
|
||||
else
|
||||
|
|
@ -998,6 +998,8 @@ Class CandyGun : SWWMWeapon
|
|||
if ( sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true) || (invoker.Ammo1.Amount > 0) || invoker.chambered ) flg |= WRF_ALLOWRELOAD;
|
||||
if ( (invoker.Ammo1.Amount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) flg |= WRF_NOSECONDARY;
|
||||
A_WeaponReady(flg);
|
||||
if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) )
|
||||
invoker.CheckAmmo(EitherFire,true);
|
||||
}
|
||||
}
|
||||
Wait;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue