Fireblaster (Flame Gun) added.
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
34
gldefs.txt
|
|
@ -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"
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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
14
sndinfo.txt
|
|
@ -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
|
After Width: | Height: | Size: 380 B |
BIN
sprites/flameg/FGEXB0.png
Normal file
|
After Width: | Height: | Size: 500 B |
BIN
sprites/flameg/FGEXC0.png
Normal file
|
After Width: | Height: | Size: 991 B |
BIN
sprites/flameg/FGEXD0.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
sprites/flameg/FGEXE0.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
sprites/flameg/FGEXF0.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
sprites/flameg/FGEXG0.png
Normal file
|
After Width: | Height: | Size: 959 B |
BIN
sprites/flameg/FGEXH0.png
Normal file
|
After Width: | Height: | Size: 409 B |
BIN
sprites/flameg/FGFLA0.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
|
|
@ -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]"
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,8 @@ Class UNapalm : Actor
|
||||||
|
|
||||||
Class UFlamethrower : UnrealWeapon
|
Class UFlamethrower : UnrealWeapon
|
||||||
{
|
{
|
||||||
|
bool bCharging;
|
||||||
|
|
||||||
Default
|
Default
|
||||||
{
|
{
|
||||||
Tag "$T_FLAMETHROWER";
|
Tag "$T_FLAMETHROWER";
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
|
|
||||||