0.9.7b release:
- Quick Grenade function added. - Blow Kiss gesture added (+score bonus). - Fix Hellblazer not autoswitching ammo on empty reload. - Fix Eviscerator chunk glows not dying with the chunk itself. - Fix give cheat giving excess powerups/weapons inflating your score. - Fix dashing over bridge actors. - Fix dual Explodium Guns not autoswitching to single when dropping one from the inventory menu. - Adjust manual reload priority for dual Explodium Guns (gun with less bullets left will be reloaded first). - Add default binds for all actions.
This commit is contained in:
parent
b0900e8462
commit
5e60973d1b
29 changed files with 519 additions and 47 deletions
|
|
@ -1771,6 +1771,7 @@ Class Hellblazer : SWWMWeapon
|
|||
Reload:
|
||||
XZW2 A 2
|
||||
{
|
||||
if ( (invoker.clipcount <= 0) && (CountInv(invoker.nextammo) <= 0) ) A_PickNextAmmo();
|
||||
if ( (invoker.clipcount >= invoker.LoadedCapacity()) && (invoker.loadammo == invoker.nextammo) )
|
||||
return A_JumpByAmmoType("Idle_1","Idle_2","Idle_3","Idle_4","Idle_G");
|
||||
return A_JumpByAmmoType("Unload_1","Unload_2","Unload_3","Unload_4","Unload_G");
|
||||
|
|
|
|||
|
|
@ -87,9 +87,10 @@ Class EvisceratorChunkGlow : Actor
|
|||
override void Tick()
|
||||
{
|
||||
if ( isFrozen() ) return;
|
||||
if ( !EvisceratorChunk(target) )
|
||||
if ( !EvisceratorChunk(target) || EvisceratorChunk(target).justdied )
|
||||
{
|
||||
Destroy();
|
||||
Scale *= .9;
|
||||
A_FadeOut();
|
||||
return;
|
||||
}
|
||||
SetOrigin(target.pos,true);
|
||||
|
|
|
|||
|
|
@ -994,6 +994,17 @@ Class SWWMHandler : EventHandler
|
|||
scr.xcnt = ++ofs;
|
||||
}
|
||||
}
|
||||
else if ( e.DamageType == 'Love' )
|
||||
{
|
||||
score += 600;
|
||||
if ( scr )
|
||||
{
|
||||
scr.xscore[ofs] = 0;
|
||||
scr.xtcolor[ofs] = Font.FindFontColor('BlushPink');
|
||||
scr.xstr[ofs] = StringTable.Localize("$SWWM_LOVED");
|
||||
scr.xcnt = ++ofs;
|
||||
}
|
||||
}
|
||||
if ( (e.Damage >= e.Thing.GetSpawnHealth()*2) || (((e.Thing.Health <= e.Thing.GetGibHealth()) || (e.DamageSource.bEXTREMEDEATH) || (e.Inflictor && e.Inflictor.bEXTREMEDEATH) || (e.DamageType == 'Extreme')) && !e.DamageSource.bNOEXTREMEDEATH && (!e.Inflictor || !e.Inflictor.bNOEXTREMEDEATH)) )
|
||||
{
|
||||
score *= 2;
|
||||
|
|
@ -1484,18 +1495,7 @@ Class SWWMHandler : EventHandler
|
|||
if ( (e.player == -1) || !playeringame[e.player] || !players[e.player].mo ) return;
|
||||
let mo = players[e.player].mo;
|
||||
if ( (mo.Health <= 0) || !(mo is 'Demolitionist') ) return;
|
||||
switch ( e.Args[0] )
|
||||
{
|
||||
case 1:
|
||||
SWWMGesture.SetGesture(mo,1);
|
||||
break;
|
||||
case 2:
|
||||
SWWMGesture.SetGesture(mo,2);
|
||||
break;
|
||||
default:
|
||||
SWWMGesture.SetGesture(mo,0);
|
||||
break;
|
||||
}
|
||||
SWWMGesture.SetGesture(mo,e.Args[0]);
|
||||
}
|
||||
if ( e.IsManual ) return;
|
||||
if ( e.Name.Left(14) ~== "swwmstoregive." )
|
||||
|
|
|
|||
|
|
@ -1932,6 +1932,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
|
|||
str = String.Format("\cx%s\c-",StringTable.Localize("$SWWM_STATFAVWEAP"));
|
||||
if ( stats.favweapon == -1 ) str = str.."N/A";
|
||||
else if ( stats.wstats[stats.favweapon].w == 'SWWMWeapon' ) str = str..StringTable.Localize("$SWWM_YOURSELF");
|
||||
else if ( stats.wstats[stats.favweapon].w == 'SWWMGesture' ) str = str..StringTable.Localize("$SWWM_DOKIDOKI");
|
||||
else
|
||||
{
|
||||
let def = GetDefaultByType(stats.wstats[stats.favweapon].w);
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ Class Demolitionist : PlayerPawn
|
|||
health = min(health+amount,1000);
|
||||
player.health = health;
|
||||
}
|
||||
else player.health = health = 1000;
|
||||
else player.health = health = 200;
|
||||
}
|
||||
if ( giveall || (name ~== "backpack") )
|
||||
{
|
||||
|
|
@ -210,6 +210,9 @@ Class Demolitionist : PlayerPawn
|
|||
{
|
||||
let type = (class<Weapon>)(AllActorClasses[i]);
|
||||
if ( !type || (type == "Weapon") ) continue;
|
||||
// Don't give already owned weapons
|
||||
let owned = FindInventory(type);
|
||||
if ( owned && (owned.Amount >= owned.MaxAmount) ) continue;
|
||||
// Don't give replaced weapons unless the replacement was done by Dehacked.
|
||||
let rep = GetReplacement(type);
|
||||
if ( (rep == type) || (rep is "DehackedPickup") )
|
||||
|
|
@ -231,6 +234,9 @@ Class Demolitionist : PlayerPawn
|
|||
let type = (class<Inventory>)(AllActorClasses[i]);
|
||||
if ( !type ) continue;
|
||||
if ( !(gameinfo.gametype&(GAME_Hexen|GAME_Strife)) && (type is 'AmmoFabricator') ) continue; // no fabricators before hexen
|
||||
// Don't give maxed items
|
||||
let owned = FindInventory(type);
|
||||
if ( owned && (owned.Amount >= owned.MaxAmount) ) continue;
|
||||
let def = GetDefaultByType (type);
|
||||
if ( def.Icon.isValid() &&
|
||||
!(type is "PuzzleItem") && !(type is "Powerup") && !(type is "Ammo") && !(type is "Armor") && !(type is "Key") )
|
||||
|
|
@ -495,6 +501,9 @@ Class Demolitionist : PlayerPawn
|
|||
if ( player.onground && (player.jumptics < -18) )
|
||||
player.jumptics = 0;
|
||||
}
|
||||
// quick grenade
|
||||
if ( (player.playerstate != PST_DEAD) && (player.cmd.buttons&BT_USER4) )
|
||||
SWWMGesture.SetGesture(self,-1);
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
|
|
@ -690,12 +699,13 @@ Class Demolitionist : PlayerPawn
|
|||
Vector3 diff = level.Vec3Diff(pos,a.pos);
|
||||
Vector3 dirto = diff.unit();
|
||||
if ( dir dot dirto < .1 ) continue;
|
||||
if ( a.bACTLIKEBRIDGE && (diff.z <= -a.Height) ) continue; // don't bump bridges if hit by above
|
||||
// large monsters will stop the player (unless hit from above if we're going at ground pound speed)
|
||||
A_QuakeEx(4,4,4,10,0,128,"",QF_RELATIVE|QF_SCALEDOWN);
|
||||
A_StartSound("demolitionist/bump",CHAN_DAMAGE,CHANF_OVERLAP);
|
||||
a.A_StartSound("demolitionist/bump",CHAN_DAMAGE,CHANF_OVERLAP);
|
||||
bumptic = gametic+int(20+spd/4.);
|
||||
if ( (diff.z < a.height) && (lastvelz >= -25) && (a.bDONTTHRUST || (a.Mass >= maxmass) || (!a.bSHOOTABLE && !a.bPUSHABLE && (a.Health > 0))) && a.bSOLID && (dir dot dirto > .65) )
|
||||
if ( (diff.z < a.height) && (lastvelz >= -25) && (a.bDONTTHRUST || a.bACTLIKEBRIDGE || (a.Mass >= maxmass) || (!a.bSHOOTABLE && !a.bPUSHABLE && (a.Health > 0))) && a.bSOLID && (dir dot dirto > .65) )
|
||||
{
|
||||
if ( bumped ) continue;
|
||||
bumped = true;
|
||||
|
|
@ -1970,6 +1980,10 @@ Class Demolitionist : PlayerPawn
|
|||
#### # 3;
|
||||
XZW6 EFGHIJKLMNOPQRSTUVW 3;
|
||||
Goto Spawn+1;
|
||||
BlowKiss:
|
||||
#### # 3;
|
||||
XZWD EFGHIJKLMNOPQRSTUVW 3;
|
||||
Goto Spawn+1;
|
||||
Missile:
|
||||
// attacking
|
||||
#### # 2;
|
||||
|
|
@ -2447,6 +2461,240 @@ Class CastDemolitionist : Actor
|
|||
}
|
||||
}
|
||||
|
||||
Class LoveHeartTrail : Actor
|
||||
{
|
||||
Default
|
||||
{
|
||||
RenderStyle "Add";
|
||||
Radius .1;
|
||||
Height 0.;
|
||||
Alpha .1;
|
||||
+NOGRAVITY;
|
||||
+NOBLOCKMAP;
|
||||
+NOINTERACTION;
|
||||
+DONTSPLASH;
|
||||
+NOTELEPORT;
|
||||
+FORCEXYBILLBOARD;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
if ( isFrozen() ) return;
|
||||
A_FadeOut(.01);
|
||||
scale *= .95;
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DOKI A -1 Bright;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
Class LoveHeartSparkle : Actor
|
||||
{
|
||||
Default
|
||||
{
|
||||
Radius .1;
|
||||
Height 0.;
|
||||
Scale .03;
|
||||
+NOGRAVITY;
|
||||
+NOBLOCKMAP;
|
||||
+NOINTERACTION;
|
||||
+DONTSPLASH;
|
||||
+NOTELEPORT;
|
||||
+FORCEXYBILLBOARD;
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Scale *= FRandom[ExploS](.75,1.5);
|
||||
specialf1 = FRandom[ExploS](.95,.98);
|
||||
specialf2 = FRandom[ExploS](.01,.03);
|
||||
vel = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),sin(-pitch))*FRandom[ExploS](2,8);
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
if ( isFrozen() ) return;
|
||||
A_SetScale(scale.x*specialf1);
|
||||
A_FadeOut(specialf2);
|
||||
Vector3 dir = vel;
|
||||
double magvel = dir.length();
|
||||
magvel *= .99;
|
||||
if ( magvel > 0. )
|
||||
{
|
||||
dir /= magvel;
|
||||
dir += .2*(FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1));
|
||||
vel = dir.unit()*magvel;
|
||||
}
|
||||
SetOrigin(level.Vec3Offset(pos,vel),true);
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DOKI A -1 Bright;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
Class LoveHeartBurstLight : PaletteLight
|
||||
{
|
||||
Default
|
||||
{
|
||||
Tag "LovePal";
|
||||
ReactionTime 15;
|
||||
Args 0,0,0,150;
|
||||
}
|
||||
}
|
||||
|
||||
Class LoveHeart : Actor
|
||||
{
|
||||
Default
|
||||
{
|
||||
Obituary "$O_DOKIDOKI";
|
||||
DamageType 'Love';
|
||||
DamageFunction (clamp(special2,5,15));
|
||||
Radius 4;
|
||||
Height 4;
|
||||
Speed 10;
|
||||
Scale .2;
|
||||
PROJECTILE;
|
||||
+BLOODLESSIMPACT;
|
||||
+FORCEXYBILLBOARD;
|
||||
+SEEKERMISSILE;
|
||||
+FOILINVUL;
|
||||
+PAINLESS;
|
||||
+NODAMAGETHRUST;
|
||||
}
|
||||
|
||||
override int DoSpecialDamage( Actor target, int damage, Name damagetype )
|
||||
{
|
||||
let raging = RagekitPower(self.target.FindInventory("RagekitPower"));
|
||||
if ( target.IsFriend(self.target) || (target is 'MBFHelperDog') )
|
||||
{
|
||||
int healamt = clamp(special2,5,15);
|
||||
if ( raging )
|
||||
{
|
||||
healamt *= 8;
|
||||
raging.DoHitFX();
|
||||
}
|
||||
if ( target.GiveBody(healamt,target.GetSpawnHealth()) )
|
||||
{
|
||||
SWWMScoreObj.Spawn(healamt,target.Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+target.Height/2),Font.CR_BLUE);
|
||||
SWWMHandler.DoFlash(target,Color(32,224,128,255),10);
|
||||
}
|
||||
if ( target is 'MBFHelperDog' )
|
||||
{
|
||||
// befriend good doggo
|
||||
target.bFRIENDLY = true;
|
||||
if ( deathmatch )
|
||||
target.SetFriendPlayer(self.target.player);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
let bread = target.FindState("Pain");
|
||||
if ( bread ) target.SetState(bread);
|
||||
if ( raging )
|
||||
{
|
||||
damage *= 8;
|
||||
raging.DoHitFX();
|
||||
}
|
||||
return damage;
|
||||
}
|
||||
|
||||
override int SpecialMissileHit( Actor victim )
|
||||
{
|
||||
if ( !victim.bSHOOTABLE && (victim != tracer) ) return 1;
|
||||
if ( tracer && (victim != tracer) ) return 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
action void A_HeartTick()
|
||||
{
|
||||
special1++;
|
||||
if ( !(special1%3) && (special2 > 0) ) special2--;
|
||||
A_SetScale(.2+.02*sin(special1*.25*TICRATE));
|
||||
double magvel = vel.length();
|
||||
if ( magvel > 0 )
|
||||
{
|
||||
Vector3 dir = vel/magvel;
|
||||
vel = dir*min(30,magvel*1.1);
|
||||
}
|
||||
double steppy = vel.length()/4.;
|
||||
for ( int i=2; i<6; i++ )
|
||||
{
|
||||
Vector3 dir2 = vel.unit();
|
||||
let t = Spawn("LoveHeartTrail",level.Vec3Offset(pos,-dir2*steppy*i));
|
||||
t.scale = scale;
|
||||
}
|
||||
int numpt = Random[ExploS](1,3);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
let s = Spawn("LoveHeartSparkle",pos);
|
||||
s.angle = FRandom[ExploS](0,360);
|
||||
s.pitch = FRandom[ExploS](-90,90);
|
||||
}
|
||||
if ( !tracer || (tracer.Health <= 0) ) return;
|
||||
double mag = vel.length();
|
||||
vel = mag*(level.Vec3Diff(pos,tracer.Vec3Offset(0,0,tracer.height/2)).unit()*mag*6./TICRATE+vel).unit();
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
A_StartSound("misc/heart",CHAN_WEAPON);
|
||||
A_AttachLight('LOVELIGHT',DynamicLight.PointLight,Color(255,176,208),80,80,DYNAMICLIGHT.LF_ATTENUATE);
|
||||
special2 = 25;
|
||||
}
|
||||
action void A_HeartBurst()
|
||||
{
|
||||
A_SetRenderStyle(1.,STYLE_Add);
|
||||
A_RemoveLight('LOVELIGHT');
|
||||
A_QuakeEx(2,2,2,8,0,300,"",QF_RELATIVE|QF_SCALEDOWN);
|
||||
A_StartSound("bestsound",CHAN_VOICE);
|
||||
Spawn("LoveHeartBurstLight",pos);
|
||||
int numpt = Random[ExploS](10,15);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](.5,4);
|
||||
let s = Spawn("SWWMSmoke",pos);
|
||||
s.vel = pvel;
|
||||
s.SetShade(Color(10,8,9)*Random[ExploS](20,25));
|
||||
s.special1 = Random[ExploS](1,3);
|
||||
s.scale *= 2.;
|
||||
s.alpha *= .6;
|
||||
}
|
||||
numpt = Random[ExploS](40,50);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
let s = Spawn("LoveHeartSparkle",pos);
|
||||
s.angle = FRandom[ExploS](0,360);
|
||||
s.pitch = FRandom[ExploS](-90,90);
|
||||
s.scale *= RandomPick[ExploS](1,3);
|
||||
s.alpha *= 2;
|
||||
}
|
||||
}
|
||||
action void A_HeartDie()
|
||||
{
|
||||
scale *= 1.2;
|
||||
A_FadeOut();
|
||||
}
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DOKI A 1 Bright A_HeartTick();
|
||||
Wait;
|
||||
Death:
|
||||
DOKI A 0 Bright A_HeartBurst();
|
||||
DOKI A 1 Bright A_HeartDie();
|
||||
Wait;
|
||||
}
|
||||
}
|
||||
|
||||
Class HHitList
|
||||
{
|
||||
Actor a;
|
||||
Vector3 dir;
|
||||
}
|
||||
|
||||
// First person gestures
|
||||
Class SWWMGesture : SWWMWeapon
|
||||
{
|
||||
|
|
@ -2480,9 +2728,13 @@ Class SWWMGesture : SWWMWeapon
|
|||
mo.player.PendingWeapon = w;
|
||||
}
|
||||
|
||||
action void A_CallPlayerGesture( statelabel st )
|
||||
action void A_CallPlayerGesture( statelabel st, statelabel cst )
|
||||
{
|
||||
if ( invoker.Owner.FindState(st) && (invoker.Owner.Health > 0) )
|
||||
if ( invoker.Owner.Health <= 0 ) return;
|
||||
// crouched gestures not yet added
|
||||
/*if ( (player.crouchdir == -1) && invoker.Owner.FindState(cst) )
|
||||
invoker.Owner.SetStateLabel(cst);
|
||||
else */if ( invoker.Owner.FindState(st) )
|
||||
invoker.Owner.SetStateLabel(st);
|
||||
}
|
||||
|
||||
|
|
@ -2492,6 +2744,88 @@ Class SWWMGesture : SWWMWeapon
|
|||
player.SetPSprite(PSP_WEAPON,ResolveState("Deselect"));
|
||||
}
|
||||
|
||||
action void A_ThrowMag()
|
||||
{
|
||||
let weap = Weapon(invoker);
|
||||
if ( !weap ) return;
|
||||
Vector3 x, y, z, x2, y2, z2;
|
||||
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
|
||||
Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x-2*y-3*z);
|
||||
double a = FRandom[Spread](0,360), s = FRandom[Spread](0,.005);
|
||||
[x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll);
|
||||
Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
|
||||
let p = Spawn("ExplodiumMagProj",origin);
|
||||
p.special1 = 7;
|
||||
p.target = self;
|
||||
p.angle = atan2(dir.y,dir.x);
|
||||
p.pitch = asin(-dir.z);
|
||||
p.vel = dir*p.speed;
|
||||
p.vel.z += 5.;
|
||||
p.vel += vel*.5;
|
||||
}
|
||||
|
||||
action void A_Smooch()
|
||||
{
|
||||
if ( (player == players[consoleplayer]) && (CVar.GetCVar('swwm_mutevoice',player).GetInt() < 4) )
|
||||
A_StartSound("demolitionist/smooch",CHAN_DEMOVOICE,CHANF_OVERLAP,.4);
|
||||
}
|
||||
|
||||
action void A_BlowKiss()
|
||||
{
|
||||
if ( (player == players[consoleplayer]) && (CVar.GetCVar('swwm_mutevoice',player).GetInt() < 4) )
|
||||
A_StartSound("demolitionist/blowkiss",CHAN_DEMOVOICE,CHANF_OVERLAP,.4);
|
||||
let weap = Weapon(invoker);
|
||||
if ( !weap ) return;
|
||||
Vector3 x, y, z, x2, y2, z2, dir;
|
||||
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
|
||||
Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x-1*z);
|
||||
let p = Spawn("LoveHeart",origin);
|
||||
p.target = self;
|
||||
p.angle = angle;
|
||||
p.pitch = BulletSlope();
|
||||
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
|
||||
// try to catch target in cone of vision
|
||||
[x2, y2, z2] = swwm_CoordUtil.GetAxes(p.pitch,p.angle,0);
|
||||
Array<HHitList> hits;
|
||||
hits.Clear();
|
||||
int rings = 1;
|
||||
FLineTraceData d;
|
||||
for ( double i=0; i<.2; i+=.02 )
|
||||
{
|
||||
for ( int j=0; j<360; j+=(360/rings) )
|
||||
{
|
||||
dir = (x2+y2*cos(j)*i+z2*sin(j)*i).unit();
|
||||
LineTrace(atan2(dir.y,dir.x),8000.,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( d.HitType != TRACE_HitActor ) continue;
|
||||
bool addme = true;
|
||||
for ( int k=0; k<hits.Size(); k++ )
|
||||
{
|
||||
if ( hits[k].a != d.HitActor ) continue;
|
||||
if ( (hits[k].dir dot x2) < (dir dot x2) )
|
||||
hits[k].dir = dir; // closer to centerpoint
|
||||
addme = false;
|
||||
break;
|
||||
}
|
||||
if ( !addme ) continue;
|
||||
let nhit = new("HHitList");
|
||||
nhit.a = d.HitActor;
|
||||
nhit.dir = dir;
|
||||
hits.Push(nhit);
|
||||
}
|
||||
rings += 5;
|
||||
}
|
||||
int closest = -1;
|
||||
double closestdot = -1;
|
||||
for ( int i=0; i<hits.Size(); i++ )
|
||||
{
|
||||
double thisdot = (hits[i].dir dot x2);
|
||||
if ( thisdot < closestdot ) continue;
|
||||
closest = i;
|
||||
closestdot = thisdot;
|
||||
}
|
||||
if ( closest != -1 ) p.tracer = hits[closest].a;
|
||||
}
|
||||
|
||||
Default
|
||||
{
|
||||
+WEAPON.CHEATNOTWEAPON;
|
||||
|
|
@ -2514,16 +2848,46 @@ Class SWWMGesture : SWWMWeapon
|
|||
Ready:
|
||||
TNT1 A 1
|
||||
{
|
||||
if ( invoker.whichgesture == 1 ) return ResolveState("Approve");
|
||||
if ( invoker.whichgesture == 2 ) return ResolveState("Victory");
|
||||
switch ( invoker.whichgesture )
|
||||
{
|
||||
case -1:
|
||||
return ResolveState("QuickGrenade");
|
||||
case 1:
|
||||
return ResolveState("Approve");
|
||||
case 2:
|
||||
return ResolveState("Victory");
|
||||
case 3:
|
||||
return ResolveState("BlowKiss");
|
||||
}
|
||||
return ResolveState("Wave");
|
||||
}
|
||||
Wait;
|
||||
Fire:
|
||||
TNT1 A 1;
|
||||
Goto Ready;
|
||||
QuickGrenade:
|
||||
TNT1 A 3;
|
||||
XZW3 S 3 A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW3 TU 3;
|
||||
XZW3 V 3 A_PlayerReload();
|
||||
XZW3 W 2 A_StartSound("explodium/magpin",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW3 XY 2;
|
||||
XZW3 Z 3;
|
||||
XZW4 A 2
|
||||
{
|
||||
A_StartSound("explodium/throwmag",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
A_PlayerMelee();
|
||||
}
|
||||
XZW4 BC 2;
|
||||
XZW4 DEFGH 2;
|
||||
XZW4 I 2 A_ThrowMag();
|
||||
XZW4 JKLM 3;
|
||||
TNT1 A 4;
|
||||
TNT1 A 0 A_JumpIf(player.cmd.buttons&BT_USER4,"QuickGrenade");
|
||||
TNT1 A -1 A_FinishGesture();
|
||||
Stop;
|
||||
Wave:
|
||||
TNT1 A 3 A_CallPlayerGesture("Wave");
|
||||
TNT1 A 3 A_CallPlayerGesture("Wave","CrouchWave");
|
||||
XZW1 AB 3;
|
||||
XZW1 C 3 A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW1 DEFGHIJ 3;
|
||||
|
|
@ -2532,7 +2896,7 @@ Class SWWMGesture : SWWMWeapon
|
|||
TNT1 A -1 A_FinishGesture();
|
||||
Stop;
|
||||
Approve:
|
||||
TNT1 A 3 A_CallPlayerGesture("Approve");
|
||||
TNT1 A 3 A_CallPlayerGesture("Approve","CrouchApprove");
|
||||
XZW1 PQ 3;
|
||||
XZW1 R 3 A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW1 STUVWX 3;
|
||||
|
|
@ -2542,7 +2906,7 @@ Class SWWMGesture : SWWMWeapon
|
|||
TNT1 A -1 A_FinishGesture();
|
||||
Stop;
|
||||
Victory:
|
||||
TNT1 A 3 A_CallPlayerGesture("Victory");
|
||||
TNT1 A 3 A_CallPlayerGesture("Victory","CrouchVictory");
|
||||
XZW2 GH 3;
|
||||
XZW2 I 3 A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW2 JKLMNOPQ 3;
|
||||
|
|
@ -2550,6 +2914,19 @@ Class SWWMGesture : SWWMWeapon
|
|||
XZW2 STUVWXY 3;
|
||||
TNT1 A -1 A_FinishGesture();
|
||||
Stop;
|
||||
BlowKiss:
|
||||
TNT1 A 3 A_CallPlayerGesture("BlowKiss","CrouchBlowKiss");
|
||||
XZW2 Z 3;
|
||||
XZW3 A 3;
|
||||
XZW3 B 3 A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW3 CD 3;
|
||||
XZW3 E 3 A_Smooch();
|
||||
XZW3 FGHI 3;
|
||||
XZW3 J 3 A_StartSound("demolitionist/handsdown",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW3 K 3 A_BlowKiss();
|
||||
XZW3 LMNOPQR 3;
|
||||
TNT1 A -1 A_FinishGesture();
|
||||
Stop;
|
||||
Deselect:
|
||||
TNT1 A -1 A_FullLower();
|
||||
Stop;
|
||||
|
|
|
|||
|
|
@ -503,6 +503,13 @@ Class ExplodiumGun : SWWMWeapon
|
|||
copy.chambered = DualExplodiumGun(SisterWeapon).chambered;
|
||||
copy.clipcount = DualExplodiumGun(SisterWeapon).clipcount;
|
||||
copy.preinit = true; // signal that this copy has preset info
|
||||
// forcibly switch back from sister weapon
|
||||
if ( Owner.player.ReadyWeapon == SisterWeapon )
|
||||
{
|
||||
Owner.player.ReadyWeapon = self;
|
||||
Owner.player.SetPSprite(PSP_WEAPON,FindState("Ready"));
|
||||
Owner.player.SetPSprite(PSP_WEAPON+1,null); // delete left weapon psprite
|
||||
}
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
|
@ -849,13 +856,6 @@ Class DualExplodiumGun : SWWMWeapon
|
|||
// disallow dropping if weapon isn't ready for switching
|
||||
if ( (Owner.player.ReadyWeapon == self) && (!(Owner.player.WeaponState&WF_WEAPONSWITCHOK) || (Owner.player.WeaponState&WF_DISABLESWITCH)) )
|
||||
return null;
|
||||
// forcibly switch back to sister weapon
|
||||
if ( Owner.player.ReadyWeapon == self )
|
||||
{
|
||||
Owner.player.ReadyWeapon = SisterWeapon;
|
||||
Owner.player.SetPSprite(PSP_WEAPON,SisterWeapon.FindState("Ready"));
|
||||
Owner.player.SetPSprite(PSP_WEAPON+1,null); // delete left weapon psprite
|
||||
}
|
||||
// call toss on sister
|
||||
return SisterWeapon.CreateTossable(amt);
|
||||
}
|
||||
|
|
@ -904,7 +904,8 @@ Class DualExplodiumGun : SWWMWeapon
|
|||
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftReload"));
|
||||
else if ( (invoker.clipcount > 0) && !invoker.chambered )
|
||||
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftPreSlide"));
|
||||
else if ( (player.cmd.buttons&BT_RELOAD) && (ExplodiumGun(invoker.SisterWeapon).clipcount < ExplodiumGun(invoker.SisterWeapon).default.clipcount) )
|
||||
else if ( (player.cmd.buttons&BT_RELOAD) && (ExplodiumGun(invoker.SisterWeapon).clipcount < ExplodiumGun(invoker.SisterWeapon).default.clipcount)
|
||||
&& (ExplodiumGun(invoker.SisterWeapon).clipcount <= invoker.clipcount) ) // give priority only if less than left hand
|
||||
player.SetPSprite(PSP_WEAPON,ResolveState("Reload"));
|
||||
else if ( (player.cmd.buttons&BT_RELOAD) && (invoker.clipcount < invoker.default.clipcount) )
|
||||
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftReload"));
|
||||
|
|
@ -993,7 +994,7 @@ Class DualExplodiumGun : SWWMWeapon
|
|||
}
|
||||
XZW4 STUV 1;
|
||||
XZW2 A 0 A_JumpIf(!ExplodiumGun(invoker.SisterWeapon).chambered,"Slide");
|
||||
XZW2 A 9 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise")); }
|
||||
XZW2 A 0 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise")); }
|
||||
Goto Ready;
|
||||
PreSlide:
|
||||
XZW2 A 9 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftLower")); }
|
||||
|
|
@ -1010,7 +1011,7 @@ Class DualExplodiumGun : SWWMWeapon
|
|||
XZW5 EFG 1;
|
||||
XZW5 H 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW5 IJKLM 1;
|
||||
XZW2 A 9 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise")); }
|
||||
XZW2 A 0 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftRaise")); }
|
||||
Goto Ready;
|
||||
LeftReload:
|
||||
XZWB A 9 { player.SetPSPrite(PSP_WEAPON,ResolveState("Lower")); }
|
||||
|
|
@ -1049,7 +1050,7 @@ Class DualExplodiumGun : SWWMWeapon
|
|||
}
|
||||
XZWD STUV 1;
|
||||
XZWB A 0 A_JumpIf(!invoker.chambered,"LeftSlide");
|
||||
XZWB A 9 { player.SetPSPrite(PSP_WEAPON,ResolveState("Raise")); }
|
||||
XZWB A 0 { player.SetPSPrite(PSP_WEAPON,ResolveState("Raise")); }
|
||||
Goto LeftReady;
|
||||
LeftPreSlide:
|
||||
XZWB A 9 { player.SetPSPrite(PSP_WEAPON,ResolveState("Lower")); }
|
||||
|
|
@ -1066,14 +1067,13 @@ Class DualExplodiumGun : SWWMWeapon
|
|||
XZWE EFG 1;
|
||||
XZWE H 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZWE IJKLM 1;
|
||||
XZWB A 9 { player.SetPSPrite(PSP_WEAPON,ResolveState("Raise")); }
|
||||
XZWB A 0 { player.SetPSPrite(PSP_WEAPON,ResolveState("Raise")); }
|
||||
Goto LeftReady;
|
||||
Zoom:
|
||||
XZW2 A 1 A_StartSound("explodium/speen",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW9 ABCDEFG 1;
|
||||
XZW9 H 1 { player.SetPSPrite(PSP_WEAPON+1,ResolveState("LeftZoom")); }
|
||||
XZW9 IJKLMNOPQRSTUVW 1;
|
||||
XZW2 A 9;
|
||||
Goto Ready;
|
||||
LeftZoom:
|
||||
XZWB A 1;
|
||||
|
|
|
|||
|
|
@ -119,6 +119,7 @@ Class SWWMStats : Thinker
|
|||
}
|
||||
Class<Weapon> which = myplayer.ReadyWeapon?myplayer.ReadyWeapon.GetClass():null;
|
||||
if ( inflictor is 'Weapon' ) which = Weapon(inflictor).GetClass();
|
||||
if ( which is 'DualExplodiumGun' ) which = 'ExplodiumGun'; // don't credit sister weapon
|
||||
// properly credit some projectiles to their respective gun
|
||||
if ( inflictor is 'AirBullet' ) which = 'DeepImpact';
|
||||
else if ( inflictor is 'PusherProjectile' ) which = 'PusherWeapon';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue