Fireblaster (Flame Gun) added.

This commit is contained in:
Marisa the Magician 2019-09-21 23:20:38 +02:00
commit a95e4721f2
19 changed files with 581 additions and 8 deletions

View file

@ -296,12 +296,10 @@ The weapon is completely useless if the user or target are underwater.
Another Mercenary invention, and a direct evolution of the previously listed Another Mercenary invention, and a direct evolution of the previously listed
Flamethrower. Shoots green-ish fireballs stabilized by microgravity. Flamethrower. Shoots green-ish fireballs stabilized by microgravity.
Primary fire: A single, steady shot, followed by rapid three shot bursts in a Primary fire: Rapid, steady shots. Costs 10 units of napalm per projectile.
horizontal arc if you keep the trigger held. Costs 10 units of napalm per
projectile.
Secondary fire: A slowly charged fireball costing 20 units of napalm. Deals Secondary fire: A slowly charged fireball costing 20 units of napalm. Spreads
more splash damage. small embers on impact.
Like its predecessor, the Fireblaster is obviously completely useless when Like its predecessor, the Fireblaster is obviously completely useless when
water is involved. A very clever human scientist would eventually solve this, water is involved. A very clever human scientist would eventually solve this,

View file

@ -35,6 +35,7 @@ Doom Tournament (currently the devel branch is required).
- Protomag (slot 2) (replaces pistol) - Protomag (slot 2) (replaces pistol)
- Dual Protomags - Dual Protomags
- Quadshot (slot 3) (replaces shotguns) - Quadshot (slot 3) (replaces shotguns)
- Fireblaster (slot 5) (replaces rocket launcher)
- Peacemaker (slot 8) (rare spawn in backpacks) - Peacemaker (slot 8) (rare spawn in backpacks)
- Demolisher (slot 9) (replaces bfg9000) - Demolisher (slot 9) (replaces bfg9000)
- Autocannon (slot 0) (replaces bfg9000) - Autocannon (slot 0) (replaces bfg9000)
@ -71,7 +72,6 @@ Doom Tournament (currently the devel branch is required).
## In progress ## In progress
- Stunner (slot 4) (replaces chainsaw) - Stunner (slot 4) (replaces chainsaw)
- Fireblaster (slot 5) (replaces rocket launcher)
- Flamethrower (slot 6) (replaces plasma rifle) - Flamethrower (slot 6) (replaces plasma rifle)
- Impaler (slot 7) (replaces plasma rifle) - Impaler (slot 7) (replaces plasma rifle)

View file

@ -377,6 +377,40 @@ Object ForceField
Frame "FFPK" { light "FFIELDLIGHT" } Frame "FFPK" { light "FFIELDLIGHT" }
} }
FlickerLight2 UFLAMGLIGHT1
{
Color 0.3 1.0 0.2
Size 40
SecondarySize 48
Interval 0.1
}
FlickerLight2 UFLAMGLIGHT2
{
Color 0.5 1.0 0.2
Size 56
SecondarySize 60
Interval 0.1
}
FlickerLight2 UFLAMGLIGHT3
{
Color 0.4 1.0 0.2
Size 12
SecondarySize 16
Interval 0.1
}
Object UFireball
{
Frame "FIRB" { light "UFLAMGLIGHT1" }
}
Object UFireball2
{
Frame "FIRB" { light "UFLAMGLIGHT2" }
}
Object UFireballEmber
{
Frame "FIRB" { light "UFLAMGLIGHT3" }
}
// Shaders / Brightmaps // Shaders / Brightmaps
HardwareShader Texture "graphics/MenuBarr.png" HardwareShader Texture "graphics/MenuBarr.png"
{ {

View file

@ -1,3 +1,70 @@
Model "UFireball"
{
Path "models"
Model 0 "Flame_d.3d"
Skin 0 "JFlame2.png"
PitchOffset 90
Scale 0.048 0.04 0.04
Offset -4 0 0
PITCHFROMMOMENTUM
FrameIndex FIRB A 0 1
FrameIndex FIRB B 0 2
FrameIndex FIRB C 0 3
FrameIndex FIRB D 0 4
FrameIndex FIRB E 0 5
FrameIndex FIRB F 0 6
FrameIndex FIRB G 0 7
FrameIndex FIRB H 0 8
FrameIndex FIRB I 0 9
FrameIndex FIRB J 0 10
FrameIndex FIRB K 0 11
}
Model "UFireball2"
{
Path "models"
Model 0 "Flame_d.3d"
Skin 0 "JFlame3.png"
PitchOffset 90
Scale 0.06 0.05 0.05
Offset -5 0 0
PITCHFROMMOMENTUM
FrameIndex FIRB A 0 1
FrameIndex FIRB B 0 2
FrameIndex FIRB C 0 3
FrameIndex FIRB D 0 4
FrameIndex FIRB E 0 5
FrameIndex FIRB F 0 6
FrameIndex FIRB G 0 7
FrameIndex FIRB H 0 8
FrameIndex FIRB I 0 9
FrameIndex FIRB J 0 10
FrameIndex FIRB K 0 11
}
Model "UFireballEmber"
{
Path "models"
Model 0 "Flame_d.3d"
Skin 0 "JFlame3.png"
PitchOffset 90
Scale 0.024 0.02 0.02
Offset -2 0 0
PITCHFROMMOMENTUM
FrameIndex FIRB A 0 1
FrameIndex FIRB B 0 2
FrameIndex FIRB C 0 3
FrameIndex FIRB D 0 4
FrameIndex FIRB E 0 5
FrameIndex FIRB F 0 6
FrameIndex FIRB G 0 7
FrameIndex FIRB H 0 8
FrameIndex FIRB I 0 9
FrameIndex FIRB J 0 10
FrameIndex FIRB K 0 11
}
Model "FlameGun" Model "FlameGun"
{ {
Path "models" Path "models"
@ -12,3 +79,70 @@ Model "FlameGun"
ROTATING ROTATING
FrameIndex FGNP A 1 0 FrameIndex FGNP A 1 0
} }
Model "FlameGun"
{
Path "models"
Model 0 "FlameGun_d.3d"
SurfaceSkin 0 0 "JFlameG1.png"
SurfaceSkin 0 1 "Automa1.png"
AngleOffset -90
Scale 0.1 -0.07 0.1
Offset 9 -16 -10
// Down
FrameIndex FGND A 0 1
FrameIndex FGND B 0 2
FrameIndex FGND C 0 3
FrameIndex FGND D 0 4
FrameIndex FGND E 0 5
FrameIndex FGND F 0 6
FrameIndex FGND G 0 7
FrameIndex FGND H 0 8
FrameIndex FGND I 0 9
FrameIndex FGND J 0 10
// Select
FrameIndex FGNS A 0 10
FrameIndex FGNS B 0 11
FrameIndex FGNS C 0 12
FrameIndex FGNS D 0 13
FrameIndex FGNS E 0 14
FrameIndex FGNS F 0 15
FrameIndex FGNS G 0 16
FrameIndex FGNS H 0 17
FrameIndex FGNS I 0 18
FrameIndex FGNS J 0 19
// Idle
FrameIndex FGNI A 0 20
FrameIndex FGNI B 0 21
FrameIndex FGNI C 0 22
FrameIndex FGNI D 0 23
FrameIndex FGNI E 0 24
FrameIndex FGNI F 0 25
FrameIndex FGNI G 0 26
// Twiddle
FrameIndex FGNT A 0 27
FrameIndex FGNT B 0 28
FrameIndex FGNT C 0 29
FrameIndex FGNT D 0 30
FrameIndex FGNT E 0 31
FrameIndex FGNT F 0 32
FrameIndex FGNT G 0 33
FrameIndex FGNT H 0 34
FrameIndex FGNT I 0 35
FrameIndex FGNT J 0 36
FrameIndex FGNT K 0 37
FrameIndex FGNT L 0 38
FrameIndex FGNT M 0 39
// Fire
FrameIndex FGNF A 0 40
FrameIndex FGNF B 0 41
FrameIndex FGNF C 0 42
FrameIndex FGNF D 0 43
FrameIndex FGNF E 0 44
FrameIndex FGNF F 0 45
FrameIndex FGNF G 0 46
FrameIndex FGNF H 0 47
FrameIndex FGNF I 0 48
FrameIndex FGNF J 0 49
}

BIN
palettes/FlamG.pal Normal file

Binary file not shown.

View file

@ -171,6 +171,7 @@ stinger/altfire stingera
stinger/hit bladehit stinger/hit bladehit
stinger/hit2 ricochet stinger/hit2 ricochet
stinger/flesh chunkhit stinger/flesh chunkhit
$limit stinger/hit 16
flak/click click flak/click click
@ -197,6 +198,7 @@ dpistol/up3 number3
dpistol/up4 number4 dpistol/up4 number4
dpistol/fly dispfly dpistol/fly dispfly
dpistol/hit dispex1 dpistol/hit dispex1
$limit dpistol/hit 16
amplifier/act ampact amplifier/act ampact
amplifier/set health1 amplifier/set health1
@ -291,18 +293,30 @@ big/punch bigmejct
big/reload bigmrelo big/reload bigmrelo
big/shell bigmshel big/shell bigmshel
big/blast bigmhit big/blast bigmhit
$limit big/blast 16
smini/select sminisel smini/select sminisel
smini/fire sminione smini/fire sminione
smini/altfire sminialt smini/altfire sminialt
smini/endfire sminiend smini/endfire sminiend
smini/explode sminiexp smini/explode sminiexp
$limit smini/explode 16
bonesaw/select bsawsel bonesaw/select bsawsel
bonesaw/claw bsawstab bonesaw/claw bsawstab
bonesaw/spin bsawloop bonesaw/spin bsawloop
bonesaw/spinend bsawend bonesaw/spinend bsawend
flamegun/select flamgsel
flamegun/idle flamgidl
flamegun/start flamgbeg
flamegun/fire flamgfir
flamegun/end flamgend
flamegun/charge flamgabg
flamegun/alt flamgalt
flamegun/exp expl04
$limit flamegun/exp 16
translator/event transa3 translator/event transa3
detector/start detact detector/start detact

BIN
sprites/flameg/FGEXA0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

BIN
sprites/flameg/FGEXB0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

BIN
sprites/flameg/FGEXC0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 991 B

BIN
sprites/flameg/FGEXD0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
sprites/flameg/FGEXE0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
sprites/flameg/FGEXF0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
sprites/flameg/FGEXG0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 959 B

BIN
sprites/flameg/FGEXH0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 B

BIN
sprites/flameg/FGFLA0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

View file

@ -1,3 +1,4 @@
DamTeal="0:255=%[0,0,0]:[0.30,0.76,1.20]" DamTeal="0:255=%[0,0,0]:[0.30,0.76,1.20]"
DamMagenta="0:255=%[0,0,0]:[1.50,0.30,1.50]" DamMagenta="0:255=%[0,0,0]:[1.50,0.30,1.50]"
RedIcon="0:255=#[255,0,0]" RedIcon="0:255=#[255,0,0]"
FlamGSpark="0:255=%[0,0,0]:[0.75,1.00,0.00]"

View file

@ -1,13 +1,280 @@
Class UFireLight : PaletteLight
{
Default
{
Tag "FlamG";
Args 0,0,0,60;
}
}
Class UFireTrail : Actor
{
Default
{
RenderStyle "Add";
Radius 0.1;
Height 0;
+NOBLOCKMAP;
+NOGRAVITY;
+DONTSPLASH;
+FORCEXYBILLBOARD;
+NOTELEPORT;
Scale 0.5;
Alpha 0.2;
}
override void Tick()
{
Super.Tick();
if ( !target || !target.bMISSILE )
{
Destroy();
return;
}
SetOrigin(target.pos,true);
}
States
{
Spawn:
FGFL A -1 Bright;
Stop;
}
}
Class UFireball : Actor Class UFireball : Actor
{ {
Vector3 Acceleration;
double spreadf;
int ns, nsp;
property SpreadFactor : spreadf;
property NumSmokes : ns;
property NumSparks : nsp;
Default
{
DamageType 'Fire';
DamageFunction 30;
Radius 4;
Height 4;
Speed 15;
PROJECTILE;
+SKYEXPLODE;
+EXPLODEONWATER;
+FORCERADIUSDMG;
+NODAMAGETHRUST;
+FORCEXYBILLBOARD;
UFireball.SpreadFactor 0.2;
UFireball.NumSmokes 1;
UFireball.NumSparks 2;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
if ( bAMBUSH ) return;
let l = Spawn("UFireTrail",pos);
l.target = self;
Acceleration = vel.unit()*50;
A_PlaySound("eightball/fly",CHAN_VOICE,1.0,true,3.,pitch:1.5);
}
action void A_Spread()
{
vel += invoker.Acceleration/TICRATE;
vel += (FRandom[EWizFX](-1,1),FRandom[EWizFX](-1,1),FRandom[EWizFX](-1,1))*FRandom[EWizFX](.5,1.)*invoker.spreadf;
Vector3 dir = vel.unit();
if ( vel.length() > 30. ) vel = dir*30.;
angle = atan2(dir.y,dir.x);
pitch = asin(-dir.z);
if ( waterlevel > 0 )
{
int numpt = Random[ExploS](10,15);
if ( bAMBUSH ) numpt /= 3;
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (dir*3+(FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1))).unit()*FRandom[ExploS](1,4);
let s = Spawn("UTSmoke",pos);
s.vel = pvel;
s.alpha *= 0.6;
s.scale *= FRandom[ExploS](0.9,2.0);
s.SetShade(Color(1,1,1)*Random[ExploS](64,128));
}
Destroy();
return;
}
for ( int i=0; i<invoker.ns; i++ )
{
let s = Spawn("UTSmoke",pos);
s.vel = (FRandom[FlameGun](-0.2,0.2),FRandom[FlameGun](-0.2,0.2),FRandom[FlameGun](-0.2,0.2));
s.vel += vel*0.2;
s.scale *= 0.5;
}
for ( int i=0; i<invoker.nsp; i++ )
{
if ( Random[FlameGun](0,3) ) continue;
let s = Spawn("UTSpark",pos);
s.vel = (FRandom[FlameGun](-0.2,0.2),FRandom[FlameGun](-0.2,0.2),FRandom[FlameGun](-0.2,0.2));
s.ClearBounce();
s.gravity *= 0.1;
s.A_SetTranslation('FlamGSpark');
}
}
action void A_FireballExplo()
{
A_SetRenderStyle(1.,STYLE_Add);
A_NoGravity();
if ( !bAMBUSH )
{
A_PlaySound("flamegun/exp",CHAN_VOICE,pitch:1.2);
Spawn("UFireLight",pos);
A_Explode(GetMissileDamage(0,0),60,XF_HURTSOURCE);
UTMainHandler.DoBlast(self,60,9000);
}
A_SprayDecal("SmallRocketBlast");
Scale *= FRandom[ExploS](0.6,0.9);
Vector3 dir = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch));
int numpt = Random[ExploS](10,15);
if ( bAMBUSH ) numpt /= 3;
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (dir*3+(FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1))).unit()*FRandom[ExploS](2,8);
let s = Spawn("UTSmoke",pos);
s.vel = pvel;
s.scale *= FRandom[ExploS](0.9,1.5);
s.SetShade(Color(1,1,1)*Random[ExploS](64,128));
}
numpt = Random[ExploS](6,12);
if ( bAMBUSH ) numpt /= 3;
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](2,6);
let s = Spawn("UTSpark",pos);
s.vel = pvel;
}
numpt = Random[ExploS](10,20);
if ( bAMBUSH ) numpt /= 3;
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](2,12);
let s = Spawn("UTChip",pos);
s.vel = pvel;
s.scale *= FRandom[ExploS](0.9,1.3);
}
}
States
{
Spawn:
FIRB ABCDEFGHIJK 1 Bright A_Spread();
Loop;
Death:
TNT1 A 0 A_FireballExplo();
FGEX ABCDEFGH 2 Bright;
Stop;
}
} }
Class UFireball2 : UFireball Class UFireball2 : UFireball
{ {
Default
{
DamageFunction 50;
Speed 5;
UFireball.SpreadFactor 0.35;
UFireball.NumSmokes 2;
UFireball.NumSparks 4;
}
action void A_FireballExplo2()
{
scale *= 2.;
A_Explode(GetMissileDamage(0,0),90,XF_HURTSOURCE);
UTMainHandler.DoBlast(self,90,12000);
Vector3 dir = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch));
int numpt = Random[ExploS](10,15);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (dir*3+(FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1))).unit()*FRandom[ExploS](4,9);
let s = Spawn("UTSmoke",pos);
s.vel = pvel;
s.scale *= FRandom[ExploS](1.9,2.5);
s.SetShade(Color(1,1,1)*Random[ExploS](32,64));
}
Vector3 HitNormal = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch));
if ( BlockingLine )
{
HitNormal = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit();
if ( CurSector == BlockingLine.frontsector ) HitNormal *= -1;
}
else if ( BlockingFloor )
{
// find closest 3d floor for its normal
F3DFloor ff = null;
for ( int i=0; i<BlockingFloor.Get3DFloorCount(); i++ )
{
if ( !(BlockingFloor.Get3DFloor(i).top.ZAtPoint(pos.xy) ~== floorz) ) continue;
ff = BlockingFloor.Get3DFloor(i);
break;
}
if ( ff ) HitNormal = -ff.top.Normal;
else HitNormal = BlockingFloor.floorplane.Normal;
}
else if ( BlockingCeiling )
{
// find closest 3d floor for its normal
F3DFloor ff = null;
for ( int i=0; i<BlockingCeiling.Get3DFloorCount(); i++ )
{
if ( !(BlockingCeiling.Get3DFloor(i).bottom.ZAtPoint(pos.xy) ~== ceilingz) ) continue;
ff = BlockingCeiling.Get3DFloor(i);
break;
}
if ( ff ) HitNormal = -ff.bottom.Normal;
else HitNormal = BlockingCeiling.ceilingplane.Normal;
}
for ( int i=0; i<12; i++ )
{
dir = (HitNormal*1.2+(FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1))).unit();
let s = Spawn("UFireballEmber",level.Vec3Offset(pos,HitNormal*2));
s.vel = dir*s.speed*FRandom[ExploS](0.6,1.8);
s.angle = atan2(dir.y,dir.x);
s.pitch = asin(-dir.z);
s.target = target;
s.bHITOWNER = true;
}
}
States
{
Death:
TNT1 A 0 A_FireballExplo2();
Goto Super::Death;
}
}
Class UFireballEmber : UFireball
{
Default
{
DamageFunction 5;
+AMBUSH;
-NOGRAVITY;
Gravity 0.3;
Speed 8;
UFireball.SpreadFactor 0.5;
UFireball.NumSmokes 1;
UFireball.NumSparks 1;
}
States
{
Death:
TNT1 A 0
{
Scale *= 0.4;
}
Goto Super::Death;
}
} }
Class FlameGun : UnrealWeapon Class FlameGun : UnrealWeapon
{ {
bool bCharging;
Default Default
{ {
Tag "$T_FLAMEGUN"; Tag "$T_FLAMEGUN";
@ -21,7 +288,54 @@ Class FlameGun : UnrealWeapon
Weapon.AmmoType2 "FlameAmmo"; Weapon.AmmoType2 "FlameAmmo";
Weapon.AmmoUse2 20; Weapon.AmmoUse2 20;
Weapon.AmmoGive 100; Weapon.AmmoGive 100;
UTWeapon.DropAmmo 25; UTWeapon.DropAmmo 50;
}
action void A_FlameGunFire( bool bAlt = false )
{
Weapon weap = Weapon(invoker);
if ( !weap ) return;
if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return;
A_PlaySound(bAlt?"flamegun/alt":"flamegun/fire",CHAN_WEAPON,Dampener.Active(self)?.2:1.);
invoker.FireEffect();
UTMainHandler.DoFlash(self,Color(32,96,255,0),1);
if ( bAlt )
{
A_QuakeEx(2,2,2,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
UTMainHandler.DoSwing(self,(FRandom[FlameGun](-0.6,-0.5),FRandom[FlameGun](-0.3,0.3)),4,-1,5,SWING_Spring,3,2.5);
}
else
{
A_QuakeEx(1,1,1,2,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
UTMainHandler.DoSwing(self,(FRandom[FlameGun](-0.3,-0.2),FRandom[FlameGun](-0.2,0.2)),4,-1,3,SWING_Spring,2,2);
}
if ( !Dampener.Active(self) ) A_AlertMonsters();
Vector3 x, y, z;
double a, s;
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
Vector3 origin = (pos.x,pos.y,player.viewz)+10*x+3*y-z;
Actor p = Spawn(bAlt?"UFireball2":"UFireball",origin);
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;
p.target = self;
int numpt = Random[FlameGun](10,15);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("UTViewSpark",origin);
UTViewSpark(s).ofs = (10,3,-1);
UTViewSpark(s).vvel = (FRandom[FlameGun](3,12),FRandom[FlameGun](-2,2),FRandom[FFlameGun](-2,2));
s.target = self;
s.A_SetTranslation('FlamGSpark');
}
for ( int i=0; i<8; i++ )
{
let s = Spawn("UTViewSmoke",origin);
UTViewSmoke(s).ofs = (10,3,-1);
UTViewSmoke(s).vvel = (FRandom[FlameGun](0,1.2),FRandom[FlameGun](-.3,.3),FRandom[FlameGun](-.3,.3));
s.target = self;
s.scale *= 1.6;
s.alpha *= 0.5;
}
} }
States States
{ {
@ -30,5 +344,79 @@ Class FlameGun : UnrealWeapon
Stop; Stop;
FGNP B -1; FGNP B -1;
Stop; Stop;
Select:
FGNS A 1 A_Raise(int.max);
Wait;
Ready:
FGNS ABCDEFGHIJ 2 A_WeaponReady(WRF_NOFIRE);
Goto Idle;
Dummy:
TNT1 A 1
{
A_CheckReload();
A_WeaponReady();
}
Wait;
Idle:
FGNI A 0 A_Overlay(-9999,"Dummy");
FGNI ABCDEFG 12;
FGNI A 0 A_Jump(40,"Twiddle");
Goto Idle+1;
Twiddle:
#### # 2 A_PlaySound("flamegun/idle",CHAN_6,Dampener.Active(self)?.1:1.);
FGNT ABCDEFGHIJKLM 3;
Goto Idle+1;
Fire:
#### # 1 A_Overlay(-9999,"Null");
FGNF A 2
{
A_PlaySound("flamegun/start",CHAN_6,Dampener.Active(self)?.1:1.);
if ( !Dampener.Active(self) ) A_AlertMonsters();
}
Hold:
FGNF B 1 A_FlameGunFire();
FGNF CDEF 1;
FGNF G 0
{
if ( invoker.CheckAmmo(0,false,true) )
A_Refire("Refire");
}
FGNF G 0 A_ClearRefire();
FGNF GHIJ 2;
FGNT A 0 A_PlaySound("flamegun/end",CHAN_6,Dampener.Active(self)?.1:1.);
FGNT ABCDEFGHIJKLM 2;
Goto Idle;
Refire:
FGNF G 2 A_PlaySound("flamegun/start",CHAN_6,Dampener.Active(self)?.1:1.);
Goto Hold;
AltFire:
#### # 1 A_Overlay(-9999,"Null");
FGNF A 1
{
A_PlaySound("flamegun/charge",CHAN_WEAPON,Dampener.Active(self)?.1:1.);
if ( !Dampener.Active(self) ) A_AlertMonsters();
}
FGNF A 1
{
invoker.special1++;
A_WeaponOffset(FRandom[FlameGun](-.1,.1)*invoker.special1,32+FRandom[FlameGun](-.1,.1)*invoker.special1);
return A_JumpIf(invoker.special1>40,"AltRelease");
}
Wait;
AltRelease:
FGNF B 2
{
invoker.special1 = 0;
A_WeaponOffset(0,32);
A_FlameGunFire(true);
}
FGNF CDEFGHIJ 2;
FGNT ABCDEFGHIJKLM 2;
Goto Idle;
Deselect:
FGND A 1 A_Overlay(-9999,"Null");
FGND BCDEFGHIJ 1;
FGND J 1 A_Lower(int.max);
Wait;
} }
} }

View file

@ -29,6 +29,8 @@ Class UNapalm : Actor
Class UFlamethrower : UnrealWeapon Class UFlamethrower : UnrealWeapon
{ {
bool bCharging;
Default Default
{ {
Tag "$T_FLAMETHROWER"; Tag "$T_FLAMETHROWER";

View file

@ -264,7 +264,9 @@ Class UPlayer : UTPlayer
if ( (player.ReadyWeapon is 'Eightball') if ( (player.ReadyWeapon is 'Eightball')
|| ((player.ReadyWeapon is 'DispersionPistol') && DispersionPistol(player.ReadyWeapon).bCharging) || ((player.ReadyWeapon is 'DispersionPistol') && DispersionPistol(player.ReadyWeapon).bCharging)
|| ((player.ReadyWeapon is 'UBioRifle') && UBioRifle(player.ReadyWeapon).bCharging) || ((player.ReadyWeapon is 'UBioRifle') && UBioRifle(player.ReadyWeapon).bCharging)
|| (player.ReadyWeapon is 'Razorjack')|| (player.ReadyWeapon is 'Stunner') ) || ((player.ReadyWeapon is 'FlameGun') && FlameGun(player.ReadyWeapon).bCharging)
|| (player.ReadyWeapon is 'Razorjack') || (player.ReadyWeapon is 'Stunner')
|| ((player.ReadyWeapon is 'UFlamethrower') && UFlamethrower(player.ReadyWeapon).bCharging) )
{ {
if ( !InStateSequence(CurState,FindState("MissileRepStill")) ) if ( !InStateSequence(CurState,FindState("MissileRepStill")) )
SetStateLabel("MissileRepStill"); SetStateLabel("MissileRepStill");