Hellblazer burst fire + lock-on.
This commit is contained in:
parent
c343de8746
commit
9bd7670ce0
19 changed files with 528 additions and 47 deletions
|
|
@ -62,7 +62,6 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after
|
|||
* **Official Sunder support *(when the WAD is complete)***
|
||||
* ***(Maybe)* Fake livestream chat overlay, with dynamic reactions to all sorts of stuff**
|
||||
* **Replace all hitscan with *"light projectiles"***
|
||||
* **Leaning and a lot of other stuff involving ViewAngles and ViewPos**
|
||||
* **Customized cluster text stuff if that ever gets scriptified**
|
||||
* **Crouch sliding *(+ proper crouch dashing)***
|
||||
* **More items:**
|
||||
|
|
@ -70,23 +69,10 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after
|
|||
- Angel of Death *(Total Destruction / SWWM Platinum Ep2)*
|
||||
- Black Matter Armor *(SWWM / UnSX 3)*
|
||||
- Satellite *(Total Destruction)*
|
||||
* **Additional grenades *(replaces clips)*:**
|
||||
- Cyrus POW Grenades *(UnSX 4)*
|
||||
- Z-Bomb *(UnSX 3)*
|
||||
- Dr. Locke's Burrow Bombs *(SWWM Platinum Ep2 / UnSX 5)*
|
||||
- Vacuum Bomb *(SWWM Platinum)*
|
||||
- Cryptek Blast Charge *(Ultra Suite)*
|
||||
- U-Bomb *(UnSX 4)*
|
||||
* **Additional ammo types:**
|
||||
- Yellow shell - Dyratin charge *(Plasma slug)*
|
||||
- Pink shell - Micro-grenade *(What it says on the tin)*
|
||||
- Blue rocket - Hellblazer Torturer *(Nail bomb)*
|
||||
- White rocket - Hellblazer Subjugator *(Stun bomb)*
|
||||
* **Expand third person animations**
|
||||
- 4-directional movement variants
|
||||
- Height-dependent headpats (current animation was designed for dogs on same floor)
|
||||
* **Additional gestures + gesture menu**
|
||||
- Dab (loud and bassy, alerts monsters)
|
||||
- Airhorn (unlimited range A_AlertMonsters, to unbreak vanilla teleport closets)
|
||||
- Clap
|
||||
- The Bird
|
||||
|
|
@ -95,7 +81,6 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after
|
|||
- Heart
|
||||
- Shrug
|
||||
- Beckon
|
||||
- Facepalm
|
||||
* **DLC Gameset:**
|
||||
- Tetris
|
||||
- Pong
|
||||
|
|
|
|||
|
|
@ -172,9 +172,9 @@ Little bundles of fun (in hot lead form) found either as single units (sometimes
|
|||
|
||||
Another signature weapon of the **SWWM** series. This time in its third and far more improved revision.
|
||||
|
||||
**Primary fire:** Shoot a hot flaming rocket straight ahead.
|
||||
**Primary fire:** Shoot a hot flaming rocket straight ahead. Hold to load up to 2 additional rockets, then release for burst fire.
|
||||
|
||||
**Secondary fire:** Lob the rocket as a grenade that will bounce around.
|
||||
**Secondary fire:** Lob the rocket as a grenade that will bounce around. Hold to load up to 2 additional grenades, then release for burst fire.
|
||||
|
||||
**Tertiary fire (Zoom):** Change the ammo type, there are four options (see ammo section below).
|
||||
|
||||
|
|
|
|||
BIN
graphics/HUD/HellblazerCrackshotLock.png
Normal file
BIN
graphics/HUD/HellblazerCrackshotLock.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 196 B |
BIN
graphics/HUD/HellblazerMissileLock.png
Normal file
BIN
graphics/HUD/HellblazerMissileLock.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 188 B |
BIN
graphics/HUD/HellblazerRavagerLock.png
Normal file
BIN
graphics/HUD/HellblazerRavagerLock.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 188 B |
BIN
graphics/HUD/HellblazerWarheadLock.png
Normal file
BIN
graphics/HUD/HellblazerWarheadLock.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 188 B |
|
|
@ -211,7 +211,7 @@ SWWM_LORETXT_HELL4 = "\cxName:\c-\n\cf Hell\c-\n\cxClassification:\c-\n\cf Nethe
|
|||
SWWM_LORETAG_HELLBLAZER = "Hellblazer";
|
||||
SWWM_LORETAB_HELLBLAZER = "Item";
|
||||
SWWM_LOREREL_HELLBLAZER = "Imanaki;UAC;Hell;Hammerspace";
|
||||
SWWM_LORETXT_HELLBLAZER = "\cxDesignation:\c-\n\cf Hellfire Cannon Mk3 (\"Hellblazer\")\c-\n\cxManufacturer:\c-\n\cf Imanaki Research Corporation (former)\c-\n\cf Tach-Engine Technology Institute (current)\c-\n\cxClassification:\c-\n\cf Mini-Missile Launcher\c-\n\nThe \cfHellblazer\c- is the third incarnation of the \cfHellfire Cannon\c-, one of the many weapons that \cfImanaki Corp\c- had constructed based on their experiments with harnessing what they called \cfArdent Energy\c-, a power source from the depths of \cfHell\c- itself. It is a direct improvement of the Mark 2 model, the \cfHellrazer\c-, being much easier to reload thanks to its simple drum magazine system. It also features many more types of ammunition this time:\n\n\cf\"Blazer\" grenades:\c- The standard ammunition. Highly explosive despite their small size, thanks to the highly condensed Ardent Energy contained within.\n\n\cf\"Crackshot\" cluster grenades:\c- These burst into smaller grenades which will spread on impact, bouncing around for a short time before detonating.\n\n\cf\"Ravager\" incendiary grenades:\c- Ravagers release a wave of unrefined Ardent Energy on detonation, covering a very wide area around themselves. Quite useful in tight spaces, where this scorching hot plasma won't dissipate as quickly, thoroughly roasting any targets within.\n\n\cf\"Slayer\" warheads:\c- A returning favorite from the previous series. These miniature nukes contain within themselves highly enriched Ardent Energy that will cause total devastation in a large radius, bringing swift death to even the highest ranked demons in Hell's armies.\n\nThe Hellblazer was discontinued following the destruction of the Imanaki Corp headquarters in 2009, but the \cfTach-Engine Technology Institute\c- had managed to reproduce this weapon following their demise. Replicated models do not actually employ this \"Ardent Energy\" however, so they are not as destructive as they were meant to be. Rather, they are powered by the highly volatile \cfNokron\c-, one of the two exotic elements involved in the process of Microfusion, as its potential for use in explosives is quite notable.\n\n\cfPrimary Fire:\c- Shoots the loaded ammunition with its propulsion armed and ready.\n\n\cfSecondary Fire:\c- Lobs the loaded ammunition unarmed, as a bouncing grenade.\n\n\cfTertiary Fire:\c- Cycles the ammo type for the next reload.\n\n\cfReloading:\c- During a reload, you may either refill the current mag (quite easy through the \cfHammerspace™\c- container), or swap it out for a different ammo type.\n\n\cfTechniques:\c- The grenades will automatically detonate on proximity to hostile targets, so you may still land the shot even if you merely grazed them. It is unclear how exactly they detect the targets, or know that they are hostile.\n\n\cxSaya's Notes:\c-\n\cf\"Ardent Energy\"? What's that? Energy extracted from a demon's ass after it ate too much curry? Whatever, anything coming from Hell is best left untouched, y'know. Just look at what happened to the fucking UAC, going around sticking their paws where they shouldn't.\c-\n\n\cfActually, making the replicas use Nokron was a pretty clever thing. I had no idea that shit exploded. Really makes you think about all the safety mechanisms that go into Microfusion engines, definitely justified if THAT can happen.\c-";
|
||||
SWWM_LORETXT_HELLBLAZER = "\cxDesignation:\c-\n\cf Hellfire Cannon Mk3 (\"Hellblazer\")\c-\n\cxManufacturer:\c-\n\cf Imanaki Research Corporation (former)\c-\n\cf Tach-Engine Technology Institute (current)\c-\n\cxClassification:\c-\n\cf Mini-Missile Launcher\c-\n\nThe \cfHellblazer\c- is the third incarnation of the \cfHellfire Cannon\c-, one of the many weapons that \cfImanaki Corp\c- had constructed based on their experiments with harnessing what they called \cfArdent Energy\c-, a power source from the depths of \cfHell\c- itself. It is a direct improvement of the Mark 2 model, the \cfHellrazer\c-, sporting burst-fire capabilities and a simple drum magazine system for easier reloads. It also features many more types of ammunition this time:\n\n\cf\"Blazer\" grenades:\c- The standard ammunition. Highly explosive despite their small size, thanks to the highly condensed Ardent Energy contained within.\n\n\cf\"Crackshot\" cluster grenades:\c- These burst into smaller grenades which will spread on impact, bouncing around for a short time before detonating.\n\n\cf\"Ravager\" incendiary grenades:\c- Ravagers release a wave of unrefined Ardent Energy on detonation, covering a very wide area around themselves. Quite useful in tight spaces, where this scorching hot plasma won't dissipate as quickly, thoroughly roasting any targets within. For safety reasons this ammunition type cannot be employed in burst-fire.\n\n\cf\"Slayer\" warheads:\c- A returning favorite from the previous series. These miniature nukes contain within themselves highly enriched Ardent Energy that will cause total devastation in a large radius, bringing swift death to even the highest ranked demons in Hell's armies. Cannot operate in burst-fire mode either.\n\nThe Hellblazer was discontinued following the destruction of the Imanaki Corp headquarters in 2009, but the \cfTach-Engine Technology Institute\c- had managed to reproduce this weapon following their demise. Replicated models do not actually employ this \"Ardent Energy\" however, so they are not as destructive as they were meant to be. Rather, they are powered by the highly volatile \cfNokron\c-, one of the two exotic elements involved in the process of Microfusion, as its potential for use in explosives is quite notable.\n\nUnlike its predecessor, which relied on simple proximity detection, this model can instead interface with targeting arrays in order to provide more precise selective target seeking.\n\n\cfPrimary Fire:\c- Shoots the loaded ammunition with its propulsion armed and ready. Tap to fire one missile, hold to preload up to 2 additional missiles (secondary fire cancels this process). While held, the weapon will pick one target for each loaded missile with each tap of tertiary fire. Tapping reload clears all marked targets.\n\n\cfSecondary Fire:\c- Lobs the loaded ammunition unarmed, as a bouncing grenade. Tap to fire one grenade, hold to preload up to 2 additional grenades (primary Fire cancels this process). Target seeking also affects grenades, as they will attempt to steer themselves towards the target on bounce.\n\n\cfTertiary Fire:\c- Cycles the ammo type for the next reload.\n\n\cfReloading:\c- During a reload, you may either refill the current mag (quite easy through the \cfHammerspace™\c- container), or swap it out for a different ammo type.\n\n\cfTechniques:\c- The grenades will automatically detonate on proximity to any hostile targets (unless explicitly seeking one), so you may still land the shot even if you merely grazed them. It is unclear how exactly they detect the targets, or know that they are hostile.\n\n\cxSaya's Notes:\c-\n\cf\"Ardent Energy\"? What's that? Energy extracted from a demon's ass after it ate too much curry? Whatever, anything coming from Hell is best left untouched, y'know. Just look at what happened to the fucking UAC, going around sticking their paws where they shouldn't.\c-\n\n\cfActually, making the replicas use Nokron was a pretty clever thing. I had no idea that shit exploded. Really makes you think about all the safety mechanisms that go into Microfusion engines, definitely justified if THAT can happen.\c-";
|
||||
SWWM_LORETAG_IBUKI = "Miyamoto, Ibuki";
|
||||
SWWM_LORETAB_IBUKI = "People";
|
||||
SWWM_LOREREL_IBUKI = "AkariLabs;WhiteScar;Taro;Saya";
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -1,3 +1,3 @@
|
|||
[default]
|
||||
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r464 \cu(Sat 8 May 19:26:59 CEST 2021)\c-";
|
||||
SWWM_SHORTVER="\cw0.9.11b-pre r464 \cu(2021-05-08 19:26:59)\c-";
|
||||
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r465 \cu(Sun 9 May 02:39:34 CEST 2021)\c-";
|
||||
SWWM_SHORTVER="\cw0.9.11b-pre r465 \cu(2021-05-09 02:39:34)\c-";
|
||||
|
|
|
|||
|
|
@ -13,27 +13,29 @@ TXT
|
|||
\cxClassification:\c-
|
||||
\cf Mini-Missile Launcher\c-
|
||||
|
||||
The **Hellblazer** is the third incarnation of the **Hellfire Cannon**, one of the many weapons that **Imanaki Corp** had constructed based on their experiments with harnessing what they called **Ardent Energy**, a power source from the depths of **Hell** itself. It is a direct improvement of the Mark 2 model, the **Hellrazer**, being much easier to reload thanks to its simple drum magazine system. It also features many more types of ammunition this time:
|
||||
The **Hellblazer** is the third incarnation of the **Hellfire Cannon**, one of the many weapons that **Imanaki Corp** had constructed based on their experiments with harnessing what they called **Ardent Energy**, a power source from the depths of **Hell** itself. It is a direct improvement of the Mark 2 model, the **Hellrazer**, sporting burst-fire capabilities and a simple drum magazine system for easier reloads. It also features many more types of ammunition this time:
|
||||
|
||||
\cf"Blazer" grenades:\c- The standard ammunition. Highly explosive despite their small size, thanks to the highly condensed Ardent Energy contained within.
|
||||
|
||||
\cf"Crackshot" cluster grenades:\c- These burst into smaller grenades which will spread on impact, bouncing around for a short time before detonating.
|
||||
|
||||
\cf"Ravager" incendiary grenades:\c- Ravagers release a wave of unrefined Ardent Energy on detonation, covering a very wide area around themselves. Quite useful in tight spaces, where this scorching hot plasma won't dissipate as quickly, thoroughly roasting any targets within.
|
||||
\cf"Ravager" incendiary grenades:\c- Ravagers release a wave of unrefined Ardent Energy on detonation, covering a very wide area around themselves. Quite useful in tight spaces, where this scorching hot plasma won't dissipate as quickly, thoroughly roasting any targets within. For safety reasons this ammunition type cannot be employed in burst-fire.
|
||||
|
||||
\cf"Slayer" warheads:\c- A returning favorite from the previous series. These miniature nukes contain within themselves highly enriched Ardent Energy that will cause total devastation in a large radius, bringing swift death to even the highest ranked demons in Hell's armies.
|
||||
\cf"Slayer" warheads:\c- A returning favorite from the previous series. These miniature nukes contain within themselves highly enriched Ardent Energy that will cause total devastation in a large radius, bringing swift death to even the highest ranked demons in Hell's armies. Cannot operate in burst-fire mode either.
|
||||
|
||||
The Hellblazer was discontinued following the destruction of the Imanaki Corp headquarters in 2009, but the **Tach-Engine Technology Institute** had managed to reproduce this weapon following their demise. Replicated models do not actually employ this "Ardent Energy" however, so they are not as destructive as they were meant to be. Rather, they are powered by the highly volatile **Nokron**, one of the two exotic elements involved in the process of Microfusion, as its potential for use in explosives is quite notable.
|
||||
|
||||
\cfPrimary Fire:\c- Shoots the loaded ammunition with its propulsion armed and ready.
|
||||
Unlike its predecessor, which relied on simple proximity detection, this model can instead interface with targeting arrays in order to provide more precise selective target seeking.
|
||||
|
||||
\cfSecondary Fire:\c- Lobs the loaded ammunition unarmed, as a bouncing grenade.
|
||||
\cfPrimary Fire:\c- Shoots the loaded ammunition with its propulsion armed and ready. Tap to fire one missile, hold to preload up to 2 additional missiles (secondary fire cancels this process). While held, the weapon will pick one target for each loaded missile with each tap of tertiary fire. Tapping reload clears all marked targets.
|
||||
|
||||
\cfSecondary Fire:\c- Lobs the loaded ammunition unarmed, as a bouncing grenade. Tap to fire one grenade, hold to preload up to 2 additional grenades (primary Fire cancels this process). Target seeking also affects grenades, as they will attempt to steer themselves towards the target on bounce.
|
||||
|
||||
\cfTertiary Fire:\c- Cycles the ammo type for the next reload.
|
||||
|
||||
\cfReloading:\c- During a reload, you may either refill the current mag (quite easy through the **Hammerspace™** container), or swap it out for a different ammo type.
|
||||
|
||||
\cfTechniques:\c- The grenades will automatically detonate on proximity to hostile targets, so you may still land the shot even if you merely grazed them. It is unclear how exactly they detect the targets, or know that they are hostile.
|
||||
\cfTechniques:\c- The grenades will automatically detonate on proximity to any hostile targets (unless explicitly seeking one), so you may still land the shot even if you merely grazed them. It is unclear how exactly they detect the targets, or know that they are hostile.
|
||||
|
||||
\cxSaya's Notes:\c-
|
||||
\cf"Ardent Energy"? What's that? Energy extracted from a demon's ass after it ate too much curry? Whatever, anything coming from Hell is best left untouched, y'know. Just look at what happened to the fucking UAC, going around sticking their paws where they shouldn't.\c-
|
||||
|
|
|
|||
|
|
@ -7,21 +7,23 @@ TXT
|
|||
\cxClasificación:\c-
|
||||
\cf Lanzador de Minimisiles\c-
|
||||
|
||||
El **Hellblazer** es la tercera encarnación del **Cañón de Fuego Infernal**, una de las muchas armas que **Imanaki Corp** había construido basándose en sus experimentos explotando lo que llamaron **Energía Ardiente**, una fuente de poder de las profundidades del mismo **Infierno**. Es una mejora directa del modelo Mark 2, el **Hellrazer**, siendo mucho más fácil de recargar gracias a su sistema de simples cargadores en barril. También posee más tipos de munición esta vez:
|
||||
El **Hellblazer** es la tercera encarnación del **Cañón de Fuego Infernal**, una de las muchas armas que **Imanaki Corp** había construido basándose en sus experimentos explotando lo que llamaron **Energía Ardiente**, una fuente de poder de las profundidades del mismo **Infierno**. Es una mejora directa del modelo Mark 2, el **Hellrazer**, poseyendo capacidades de fuego en ráfaga y un simple sistema de cargador en barril para facilitar recargas. También posee más tipos de munición esta vez:
|
||||
|
||||
\cfGranadas "Blazer":\c- La munición estándar. Altamente explosivas a pesar de su diminuto tamaño, gracias a la Energía Ardiente superconcentrada que contienen.
|
||||
|
||||
\cfGranadas en clúster "Crackshot":\c- Éstas explotan en granadas más pequeñas que se dispersan en el impacto, rebotando durante un tiempo antes de detonar.
|
||||
|
||||
\cfGranadas incendiarias "Ravager":\c- Las Ravagers liberan una onda de Energía Ardiente sin refinar cuando detonan, cubriendo una zona amplia a su alrededor. Muy útiles en espacios cerrados, donde su plasma abrasador no se disipará tan fácilmente, tostando a conciencia todos los objetivos encontrados.
|
||||
\cfGranadas incendiarias "Ravager":\c- Las Ravagers liberan una onda de Energía Ardiente sin refinar cuando detonan, cubriendo una zona amplia a su alrededor. Muy útiles en espacios cerrados, donde su plasma abrasador no se disipará tan fácilmente, tostando a conciencia todos los objetivos encontrados. Por razones de seguridad este tipo de munición no se puede usar en ráfaga.
|
||||
|
||||
\cfCabezas nucleares "Slayer":\c- Un favorito de la anterior serie. Estas bombas nucleares en miniatura contienen en su interior Energía Ardiente altamente enriquecida que causará una devastación total en un radio masivo, causando la muerte segura de incluso los demonios de mayor rango en los ejércitos del Infierno.
|
||||
\cfCabezas nucleares "Slayer":\c- Un favorito de la anterior serie. Estas bombas nucleares en miniatura contienen en su interior Energía Ardiente altamente enriquecida que causará una devastación total en un radio masivo, causando la muerte segura de incluso los demonios de mayor rango en los ejércitos del Infierno. Tampoco pueden usarse en ráfaga.
|
||||
|
||||
El Hellblazer fue descontinuado tras la destrucción de las oficinas de Imanaki Corp en 2009, pero el **Instituto Tecnológico Tach-Engine** ha conseguido reproducir el arma tras su caída. Sin embargo, los modelos replicados no emplean esta "Energía Ardiente", así que no son tan destructivos como debían ser. En su lugar, usan el altamente volátil **Nokron**, uno de los dos elementos exóticos empleados en el proceso de Microfusión, ya que su potencial para el uso en explosivos es bastante notable.
|
||||
|
||||
\cfFuego Primario:\c- Dispara la munición cargada con su propulsión armada y lista.
|
||||
A diferencia de su predecesor, el cual se basaba en simple detección de proximidad, este modelo en su lugar puede comunicarse con matrices de objetivos para proveer de una búsqueda selectiva de objetivos de mayor precisión.
|
||||
|
||||
\cfFuego Secundario:\c- Lanza la munición cargada sin armar, como una granada.
|
||||
\cfFuego Primario:\c- Dispara la munición cargada con su propulsión armada y lista. Pulsa para disparar un misil, mantén para precargar 2 misiles adicionales (el fuego secundario cancela este proceso). Mientras se mantenga, el arma podrá marcar un objetivo por cada misil cargado con cada pulsación de fuego terciario. Pulsar recarga borra todos los objetivos marcados.
|
||||
|
||||
\cfFuego Secundario:\c- Lanza la munición cargada sin armar, como una granada. Pulsa para disparar una granada, mantén para precargar 2 granadas adicionales (el fuego primario cancela este proceso). La búsqueda de objetivos también afecta a las granadas, ya que intentarán guiarse hacia el objetivo con cada rebote.
|
||||
|
||||
\cfFuego Terciario:\c- Alterna entre las municiones a usar en la próxima recarga.
|
||||
|
||||
|
|
|
|||
|
|
@ -728,6 +728,9 @@ $random hellblazer/hitw { hellblazer/hitw1 hellblazer/hitw2 }
|
|||
$limit hellblazer/hitw 32
|
||||
hellblazer/bounce sounds/hellblazer/blaze_bounce.ogg
|
||||
hellblazer/fly sounds/hellblazer/blaze_fly.ogg
|
||||
hellblazer/preload sounds/hellblazer/blaze_preload.ogg
|
||||
hellblazer/lock sounds/hellblazer/blaze_lock.ogg
|
||||
hellblazer/clear sounds/hellblazer/blaze_clear.ogg
|
||||
|
||||
biospark/select sounds/sparkster/spark_select.ogg
|
||||
biospark/deselect sounds/sparkster/spark_deselect.ogg
|
||||
|
|
|
|||
BIN
sounds/hellblazer/blaze_clear.ogg
Normal file
BIN
sounds/hellblazer/blaze_clear.ogg
Normal file
Binary file not shown.
BIN
sounds/hellblazer/blaze_lock.ogg
Normal file
BIN
sounds/hellblazer/blaze_lock.ogg
Normal file
Binary file not shown.
BIN
sounds/hellblazer/blaze_preload.ogg
Normal file
BIN
sounds/hellblazer/blaze_preload.ogg
Normal file
Binary file not shown.
|
|
@ -95,11 +95,52 @@ Class Hellblazer : SWWMWeapon
|
|||
ui Class<Ammo> lastammo;
|
||||
int spinskipped;
|
||||
HellblazerXSub pickuprockets[6];
|
||||
int preload; // additional loaded missiles (up to 2)
|
||||
Actor seektarget[3];
|
||||
int seekcnt;
|
||||
int preloadcnt;
|
||||
|
||||
Property ClipCount : clipcount;
|
||||
|
||||
transient ui TextureID WeaponBox, AmmoIcon[4], LoadedIcon[4];
|
||||
transient ui TextureID WeaponBox, AmmoIcon[4], LoadedIcon[4], LockIcon[4];
|
||||
transient ui Font TewiFont;
|
||||
transient ui SWWMProjectionData projdata;
|
||||
|
||||
override void RenderUnderlay( RenderEvent e )
|
||||
{
|
||||
static const Class<Ammo> types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"};
|
||||
if ( !LockIcon[0] )
|
||||
{
|
||||
LockIcon[0] = TexMan.CheckForTexture("graphics/HUD/HellblazerMissileLock.png",TexMan.Type_Any);
|
||||
LockIcon[1] = TexMan.CheckForTexture("graphics/HUD/HellblazerCrackshotLock.png",TexMan.Type_Any);
|
||||
LockIcon[2] = TexMan.CheckForTexture("graphics/HUD/HellblazerRavagerLock.png",TexMan.Type_Any);
|
||||
LockIcon[3] = TexMan.CheckForTexture("graphics/HUD/HellblazerWarheadLock.png",TexMan.Type_Any);
|
||||
}
|
||||
int curtype = 0;
|
||||
for ( int i=0; i<4; i++ )
|
||||
{
|
||||
if ( loadammo != types[i] ) continue;
|
||||
curtype = i;
|
||||
break;
|
||||
}
|
||||
SWWMUtility.PrepareProjData(projdata,e.ViewPos,e.ViewAngle,e.ViewPitch,e.ViewRoll,players[consoleplayer].fov);
|
||||
int cliptop = projdata.viewy, clipbottom = projdata.viewy+projdata.viewh,
|
||||
clipleft = projdata.viewx, clipright = projdata.viewx+projdata.vieww;
|
||||
Vector2 hs;
|
||||
if ( swwm_hudscale <= 0 ) hs = StatusBar.GetHUDScale();
|
||||
else hs.x = swwm_hudscale;
|
||||
hs.y = hs.x;
|
||||
Vector2 ss = (Screen.GetWidth()/hs.x,Screen.GetHeight()/hs.y);
|
||||
for ( int i=0; i<3; i++ )
|
||||
{
|
||||
if ( !seektarget[i] ) continue;
|
||||
Vector3 tpos = seektarget[i].prev*(1.-e.FracTic)+seektarget[i].pos*e.FracTic;
|
||||
Vector3 ndc = SWWMUtility.ProjectPoint(projdata,e.viewpos+level.Vec3Diff(e.viewpos,tpos+(0,0,seektarget[i].Height/2)));
|
||||
if ( ndc.z > 1. ) continue;
|
||||
Vector2 vpos = SWWMUtility.NDCToViewport(projdata,ndc);
|
||||
Screen.DrawTexture(LockIcon[curtype],false,vpos.x/hs.x,vpos.y/hs.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_CenterOffset,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
|
||||
}
|
||||
}
|
||||
|
||||
override void DrawWeapon( double TicFrac, double bx, double by, Vector2 hs, Vector2 ss )
|
||||
{
|
||||
|
|
@ -148,7 +189,7 @@ Class Hellblazer : SWWMWeapon
|
|||
xx = -54;
|
||||
for ( int i=0; i<6; i++ )
|
||||
{
|
||||
Screen.DrawTexture(LoadedIcon[0],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0);
|
||||
Screen.DrawTexture(LoadedIcon[0],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0);
|
||||
xx += 9;
|
||||
}
|
||||
break;
|
||||
|
|
@ -156,7 +197,7 @@ Class Hellblazer : SWWMWeapon
|
|||
xx = -49;
|
||||
for ( int i=0; i<3; i++ )
|
||||
{
|
||||
Screen.DrawTexture(LoadedIcon[1],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0);
|
||||
Screen.DrawTexture(LoadedIcon[1],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0);
|
||||
xx += 18;
|
||||
}
|
||||
break;
|
||||
|
|
@ -164,7 +205,7 @@ Class Hellblazer : SWWMWeapon
|
|||
xx = -49;
|
||||
for ( int i=0; i<3; i++ )
|
||||
{
|
||||
Screen.DrawTexture(LoadedIcon[2],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0);
|
||||
Screen.DrawTexture(LoadedIcon[2],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0);
|
||||
xx += 18;
|
||||
}
|
||||
break;
|
||||
|
|
@ -172,7 +213,7 @@ Class Hellblazer : SWWMWeapon
|
|||
xx = -45;
|
||||
for ( int i=0; i<2; i++ )
|
||||
{
|
||||
Screen.DrawTexture(LoadedIcon[3],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0);
|
||||
Screen.DrawTexture(LoadedIcon[3],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0);
|
||||
xx += 27;
|
||||
}
|
||||
break;
|
||||
|
|
@ -213,7 +254,7 @@ Class Hellblazer : SWWMWeapon
|
|||
A_BumpFOV(bAlt?.96:.93);
|
||||
A_PlayerFire();
|
||||
invoker.clipcount = max(0,invoker.clipcount-1);
|
||||
invoker.magstate[invoker.magpos] = true;
|
||||
invoker.magstate[invoker.magpos-invoker.preload] = true;
|
||||
invoker.spinskipped++;
|
||||
Vector3 x, y, z, x2, y2, z2, dir, origin;
|
||||
double a, s;
|
||||
|
|
@ -226,6 +267,9 @@ Class Hellblazer : SWWMWeapon
|
|||
dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
|
||||
let p = Spawn(projs[type+4*bAlt],origin);
|
||||
p.target = self;
|
||||
int tidx = max(0,invoker.seekcnt-(invoker.preload+1));
|
||||
if ( invoker.seektarget[tidx] ) HellblazerMissile(p).seektarget = invoker.seektarget[tidx];
|
||||
if ( invoker.preload <= 0 ) for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null;
|
||||
p.angle = atan2(dir.y,dir.x);
|
||||
p.pitch = asin(-dir.z);
|
||||
p.vel = dir*p.speed;
|
||||
|
|
@ -373,7 +417,7 @@ Class Hellblazer : SWWMWeapon
|
|||
|
||||
action void A_ZoomHold()
|
||||
{
|
||||
A_WeaponReady(WRF_NOFIRE);
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
if ( player.cmd.buttons&BT_ZOOM ) return;
|
||||
player.SetPSPrite(PSP_WEAPON,invoker.FindState("Ready"));
|
||||
}
|
||||
|
|
@ -435,9 +479,14 @@ Class Hellblazer : SWWMWeapon
|
|||
{
|
||||
static const Class<Ammo> types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"};
|
||||
static const int magcap[] = {6,3,3,2};
|
||||
for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null;
|
||||
for ( int i=0; i<4; i++ )
|
||||
{
|
||||
if ( invoker.loadammo != types[i] ) continue;
|
||||
// check preloaded rockets first (note, this theoretically would never go below zero)
|
||||
invoker.magpos = max(0,invoker.magpos-invoker.preload);
|
||||
invoker.preload = 0;
|
||||
// do the spin
|
||||
invoker.magpos = (invoker.magpos+invoker.spinskipped)%magcap[i];
|
||||
invoker.spinskipped = 0;
|
||||
break;
|
||||
|
|
@ -470,6 +519,70 @@ Class Hellblazer : SWWMWeapon
|
|||
SetState(SpawnState+curtype+1);
|
||||
}
|
||||
|
||||
action void A_CheckLockOn()
|
||||
{
|
||||
if ( invoker.seekcnt > invoker.preload ) 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);
|
||||
// try to catch target in cone of vision
|
||||
[x2, y2, z2] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
|
||||
Array<HHitList> hits;
|
||||
hits.Clear();
|
||||
int rings = 1;
|
||||
FLineTraceData d;
|
||||
for ( double i=0; i<.1; 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;
|
||||
if ( (d.HitActor == invoker.seektarget[0])
|
||||
|| (d.HitActor == invoker.seektarget[1])
|
||||
|| (d.HitActor == invoker.seektarget[2]) ) continue;
|
||||
if ( !d.HitActor.bISMONSTER && !(d.HitActor is 'BossBrain') && !d.HitActor.player )
|
||||
continue;
|
||||
if ( d.HitActor.IsFriend(self) ) 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 )
|
||||
{
|
||||
if ( invoker.seekcnt == 0 )
|
||||
{
|
||||
for ( int i=0; i<3; i++ )
|
||||
invoker.seektarget[i] = hits[closest].a;
|
||||
}
|
||||
else invoker.seektarget[invoker.seekcnt] = hits[closest].a;
|
||||
invoker.seekcnt++;
|
||||
A_StartSound("hellblazer/lock",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
}
|
||||
}
|
||||
|
||||
override void Travelled()
|
||||
{
|
||||
Super.Travelled();
|
||||
|
|
@ -584,22 +697,62 @@ Class Hellblazer : SWWMWeapon
|
|||
XZWL S 1;
|
||||
Wait;
|
||||
Fire:
|
||||
XZW2 A 0
|
||||
#### # 0
|
||||
{
|
||||
invoker.preloadcnt = 0;
|
||||
invoker.preload = 0;
|
||||
}
|
||||
#### # 1
|
||||
{
|
||||
if ( invoker.clipcount <= 0 )
|
||||
{
|
||||
if ( CountInv(invoker.nextammo) <= 0 ) A_PickNextAmmo();
|
||||
return A_JumpByAmmoType("Unload_1","Unload_2","Unload_3","Unload_4","Unload_G");
|
||||
}
|
||||
if ( player.cmd.buttons&BT_ATTACK )
|
||||
{
|
||||
if ( (player.cmd.buttons&BT_ALTATTACK) || (invoker.clipcount < 2) )
|
||||
return A_JumpByAmmoType("PreFire_1","PreFire_2","PreFire_3","PreFire_4","Ready_G");
|
||||
invoker.preloadcnt++;
|
||||
if ( invoker.preloadcnt >= 10 )
|
||||
{
|
||||
invoker.preloadcnt = 0;
|
||||
return A_JumpByAmmoType("PreLoad_1","PreLoad_2","PreFire_3","PreFire_4","Ready_G");
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G");
|
||||
}
|
||||
Wait;
|
||||
Fire_1:
|
||||
XZW2 A 1 A_HellblazerFire(0);
|
||||
XZW2 QRSTUVW 2;
|
||||
XZW2 A 0
|
||||
{
|
||||
// chain-fire
|
||||
if ( invoker.preload > 0 )
|
||||
{
|
||||
invoker.preload--;
|
||||
invoker.spinskipped--;
|
||||
return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G");
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Goto Cycle_1;
|
||||
Fire_2:
|
||||
XZW6 V 1 A_HellblazerFire(1);
|
||||
XZW7 LMNOPQR 2;
|
||||
XZW6 V 0
|
||||
{
|
||||
// chain-fire
|
||||
if ( invoker.preload > 0 )
|
||||
{
|
||||
invoker.preload--;
|
||||
invoker.spinskipped--;
|
||||
return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G");
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Goto Cycle_2;
|
||||
Fire_3:
|
||||
XZWB T 1 A_HellblazerFire(2);
|
||||
|
|
@ -614,23 +767,63 @@ Class Hellblazer : SWWMWeapon
|
|||
XZWM IJKLMNO 2;
|
||||
Goto Ready_G; // state jump to cycling is done elsewhere
|
||||
AltFire:
|
||||
XZW2 A 0
|
||||
#### # 0
|
||||
{
|
||||
invoker.preloadcnt = 0;
|
||||
invoker.preload = 0;
|
||||
}
|
||||
#### # 1
|
||||
{
|
||||
if ( invoker.clipcount <= 0 )
|
||||
{
|
||||
if ( CountInv(invoker.nextammo) <= 0 ) A_PickNextAmmo();
|
||||
return A_JumpByAmmoType("Unload_1","Unload_2","Unload_3","Unload_4","Unload_G");
|
||||
}
|
||||
if ( player.cmd.buttons&BT_ALTATTACK )
|
||||
{
|
||||
if ( (player.cmd.buttons&BT_ATTACK) || (invoker.clipcount < 2) )
|
||||
return A_JumpByAmmoType("PreAltFire_1","PreAltFire_2","PreAltFire_3","PreAltFire_4","Ready_G");
|
||||
invoker.preloadcnt++;
|
||||
if ( invoker.preloadcnt >= 10 )
|
||||
{
|
||||
invoker.preloadcnt = 0;
|
||||
return A_JumpByAmmoType("PreAltLoad_1","PreAltLoad_2","PreAltFire_3","PreAltFire_4","Ready_G");
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G");
|
||||
}
|
||||
Wait;
|
||||
AltFire_1:
|
||||
XZW2 A 1 A_HellblazerFire(0,true);
|
||||
XZW2 XYZ 2;
|
||||
XZW3 ABCD 2;
|
||||
XZW2 A 0
|
||||
{
|
||||
// chain-fire
|
||||
if ( invoker.preload > 0 )
|
||||
{
|
||||
invoker.preload--;
|
||||
invoker.spinskipped--;
|
||||
return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G");
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Goto Cycle_1;
|
||||
AltFire_2:
|
||||
XZW6 V 1 A_HellblazerFire(1,true);
|
||||
XZW7 STUVWXY 2;
|
||||
XZW6 V 0
|
||||
{
|
||||
// chain-fire
|
||||
if ( invoker.preload > 0 )
|
||||
{
|
||||
invoker.preload--;
|
||||
invoker.spinskipped--;
|
||||
return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G");
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Goto Cycle_2;
|
||||
AltFire_3:
|
||||
XZWB T 1 A_HellblazerFire(2,true);
|
||||
|
|
@ -644,6 +837,264 @@ Class Hellblazer : SWWMWeapon
|
|||
XZWL S 1;
|
||||
XZWM PQRSTUV 2;
|
||||
Goto Ready_G; // state jump to cycling is done elsewhere
|
||||
PreLoad_1:
|
||||
XZW2 A 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW2 A 2
|
||||
{
|
||||
invoker.spinskipped--;
|
||||
invoker.magpos = (invoker.magpos+1)%6;
|
||||
invoker.preload++;
|
||||
A_GlassOverlay("Cycle_G1");
|
||||
}
|
||||
XZW3 E 2;
|
||||
XZW3 FGHI 2;
|
||||
XZW3 I 0;
|
||||
XZW3 FE 2;
|
||||
XZW2 A 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ATTACK) )
|
||||
return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G");
|
||||
if ( (player.cmd.buttons&BT_ALTATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) )
|
||||
return A_JumpByAmmoType("PreFire_1","PreFire_2","PreFire_3","PreFire_4","Ready_G");
|
||||
return ResolveState("PreLoad_1");
|
||||
}
|
||||
Wait;
|
||||
PreLoad_2:
|
||||
XZW6 V 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW6 V 2
|
||||
{
|
||||
invoker.spinskipped--;
|
||||
invoker.magpos = (invoker.magpos+1)%3;
|
||||
invoker.preload++;
|
||||
A_GlassOverlay("Cycle_G2");
|
||||
}
|
||||
XZW7 Z 2;
|
||||
XZW8 ABCDEFG 2;
|
||||
XZW8 G 0;
|
||||
XZW8 A 2;
|
||||
XZW7 Z 2;
|
||||
XZW6 V 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ATTACK) )
|
||||
return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G");
|
||||
if ( (player.cmd.buttons&BT_ALTATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) )
|
||||
return A_JumpByAmmoType("PreFire_1","PreFire_2","PreFire_3","PreFire_4","Ready_G");
|
||||
return ResolveState("PreLoad_2");
|
||||
}
|
||||
Wait;
|
||||
PreAltLoad_1:
|
||||
XZW2 A 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW2 A 2
|
||||
{
|
||||
invoker.spinskipped--;
|
||||
invoker.magpos = (invoker.magpos+1)%6;
|
||||
invoker.preload++;
|
||||
A_GlassOverlay("Cycle_G1");
|
||||
}
|
||||
XZW3 E 2;
|
||||
XZW3 FGHI 2;
|
||||
XZW3 I 0;
|
||||
XZW3 FE 2;
|
||||
XZW2 A 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ALTATTACK) )
|
||||
return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G");
|
||||
if ( (player.cmd.buttons&BT_ATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) )
|
||||
return A_JumpByAmmoType("PreAltFire_1","PreAltFire_2","PreAltFire_3","PreAltFire_4","Ready_G");
|
||||
return ResolveState("PreAltLoad_1");
|
||||
}
|
||||
Wait;
|
||||
PreAltLoad_2:
|
||||
XZW6 V 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
XZW6 V 2
|
||||
{
|
||||
invoker.spinskipped--;
|
||||
invoker.magpos = (invoker.magpos+1)%3;
|
||||
invoker.preload++;
|
||||
A_GlassOverlay("Cycle_G2");
|
||||
}
|
||||
XZW7 Z 2;
|
||||
XZW8 ABCDEFG 2;
|
||||
XZW8 G 0;
|
||||
XZW8 A 2;
|
||||
XZW7 Z 2;
|
||||
XZW6 V 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ALTATTACK) )
|
||||
return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G");
|
||||
if ( (player.cmd.buttons&BT_ATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) )
|
||||
return A_JumpByAmmoType("PreAltFire_1","PreAltFire_2","PreAltFire_3","PreAltFire_4","Ready_G");
|
||||
return ResolveState("PreAltLoad_2");
|
||||
}
|
||||
Wait;
|
||||
PreFire_1:
|
||||
XZW2 A 0
|
||||
{
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
XZW2 A 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ATTACK) )
|
||||
return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G");
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) )
|
||||
A_CheckLockOn();
|
||||
if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) )
|
||||
{
|
||||
for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null;
|
||||
if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Wait;
|
||||
PreFire_2:
|
||||
XZW6 V 0
|
||||
{
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
XZW6 V 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ATTACK) )
|
||||
return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G");
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) )
|
||||
A_CheckLockOn();
|
||||
if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) )
|
||||
{
|
||||
for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null;
|
||||
if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Wait;
|
||||
PreFire_3:
|
||||
XZWB T 0
|
||||
{
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
XZWB T 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ATTACK) )
|
||||
return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G");
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) )
|
||||
A_CheckLockOn();
|
||||
if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) )
|
||||
{
|
||||
for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null;
|
||||
if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Wait;
|
||||
PreFire_4:
|
||||
XZWG R 0
|
||||
{
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
XZWG R 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ATTACK) )
|
||||
return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G");
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) )
|
||||
A_CheckLockOn();
|
||||
if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) )
|
||||
{
|
||||
for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null;
|
||||
if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Wait;
|
||||
PreAltFire_1:
|
||||
XZW2 A 0
|
||||
{
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
XZW2 A 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ALTATTACK) )
|
||||
return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G");
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) )
|
||||
A_CheckLockOn();
|
||||
if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) )
|
||||
{
|
||||
for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null;
|
||||
if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Wait;
|
||||
PreAltFire_2:
|
||||
XZW6 V 0
|
||||
{
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
XZW6 V 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ALTATTACK) )
|
||||
return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G");
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) )
|
||||
A_CheckLockOn();
|
||||
if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) )
|
||||
{
|
||||
for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null;
|
||||
if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Wait;
|
||||
PreAltFire_3:
|
||||
XZWB T 0
|
||||
{
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
XZWB T 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ALTATTACK) )
|
||||
return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G");
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) )
|
||||
A_CheckLockOn();
|
||||
if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) )
|
||||
{
|
||||
for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null;
|
||||
if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Wait;
|
||||
PreAltFire_4:
|
||||
XZWG R 0
|
||||
{
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
XZWG R 1
|
||||
{
|
||||
if ( !(player.cmd.buttons&BT_ALTATTACK) )
|
||||
return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G");
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) )
|
||||
A_CheckLockOn();
|
||||
if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) )
|
||||
{
|
||||
for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null;
|
||||
if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP);
|
||||
invoker.seekcnt = 0;
|
||||
}
|
||||
return ResolveState(null);
|
||||
}
|
||||
Wait;
|
||||
Cycle_1:
|
||||
XZW2 A 2
|
||||
{
|
||||
|
|
@ -849,7 +1300,7 @@ Class Hellblazer : SWWMWeapon
|
|||
#### # 1
|
||||
{
|
||||
A_PickNextAmmo();
|
||||
A_WeaponReady(WRF_NOFIRE);
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
}
|
||||
#### # 1 A_ZoomHold();
|
||||
Wait;
|
||||
|
|
|
|||
|
|
@ -236,6 +236,8 @@ Class HellblazerFlare : Actor
|
|||
Class HellblazerMissile : Actor
|
||||
{
|
||||
int deto;
|
||||
Actor seektarget;
|
||||
Vector3 InitialDir, Acceleration;
|
||||
|
||||
Default
|
||||
{
|
||||
|
|
@ -281,12 +283,38 @@ Class HellblazerMissile : Actor
|
|||
let t = Spawn("HellblazerTrail",level.Vec3Offset(pos,-vel.unit()*i+traildir*3));
|
||||
t.vel = traildir*4.;
|
||||
}
|
||||
if ( InitialDir.length() < double.epsilon ) InitialDir = vel.unit();
|
||||
vel += Acceleration/GameTicRate;
|
||||
Vector3 dir = vel.unit();
|
||||
if ( vel.length() > 50. ) vel = dir*50.;
|
||||
}
|
||||
if ( deto > 1 )
|
||||
{
|
||||
ExplodeMissile();
|
||||
return;
|
||||
}
|
||||
if ( seektarget )
|
||||
{
|
||||
// seek tracer
|
||||
if ( SWWMUtility.SphereIntersect(seektarget,level.Vec3Offset(pos,vel),bNOGRAVITY?50:90) )
|
||||
{
|
||||
deto++;
|
||||
tracer = seektarget;
|
||||
return;
|
||||
}
|
||||
if ( bNOGRAVITY )
|
||||
{
|
||||
Vector3 SeekingDir = level.Vec3Diff(pos,seektarget.Vec3Offset(0,0,seektarget.height/2)).unit();
|
||||
if ( SeekingDir dot InitialDir > -1 )
|
||||
{
|
||||
double MagnitudeVel = Vel.length();
|
||||
SeekingDir = (SeekingDir*.25*MagnitudeVel+Vel).unit();
|
||||
Vel = MagnitudeVel*SeekingDir;
|
||||
Acceleration = 25*SeekingDir;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
// proximity check
|
||||
let bt = BlockThingsIterator.Create(self,200);
|
||||
while ( bt.Next() )
|
||||
|
|
@ -781,6 +809,16 @@ Mixin Class HellblazerGrenade
|
|||
rollvel = FRandom[Hellblazer](-16,16);
|
||||
anglevel = FRandom[Hellblazer](-16,16);
|
||||
pitchvel = FRandom[Hellblazer](-16,16);
|
||||
// steer towards seek target
|
||||
if ( seektarget )
|
||||
{
|
||||
Vector3 dirto = level.Vec3Diff(pos,seektarget.Vec3Offset(0,0,seektarget.Height/2));
|
||||
dirto /= dirto.length();
|
||||
dirto.z += .1;
|
||||
double spd = vel.length();
|
||||
vel /= spd;
|
||||
vel = (vel*.3+dirto*.7)*spd;
|
||||
}
|
||||
}
|
||||
States
|
||||
{
|
||||
|
|
@ -950,7 +988,7 @@ Class HellblazerClusterMini : HellblazerMissile2
|
|||
if ( !whomst ) return;
|
||||
Vector3 dirto = level.Vec3Diff(pos,whomst.Vec3Offset(0,0,whomst.Height/2));
|
||||
dirto /= dirto.length();
|
||||
dirto.z += .3;
|
||||
dirto.z += .1;
|
||||
double spd = vel.length();
|
||||
vel /= spd;
|
||||
vel = (vel*.3+dirto*.7)*spd;
|
||||
|
|
|
|||
|
|
@ -761,12 +761,12 @@ Class Spreadgun : SWWMWeapon
|
|||
}
|
||||
if ( invoker.nextammo != types[next] ) A_StartSound("misc/invchange",CHAN_WEAPONEXTRA,CHANF_UI|CHANF_LOCAL);
|
||||
invoker.nextammo = types[next];
|
||||
A_WeaponReady(WRF_NOFIRE);
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
}
|
||||
|
||||
action void A_AltHold()
|
||||
{
|
||||
A_WeaponReady(WRF_NOFIRE);
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
// tap fire to unload round
|
||||
if ( invoker.chambered && (player.cmd.buttons&BT_ATTACK) )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -828,11 +828,11 @@ Class SilverBullet : SWWMWeapon
|
|||
else if ( !invoker.fcbselected && ((invoker.Ammo2.Amount > 0) || (CountInv("SilverBullets2") > 0)) )
|
||||
invoker.fcbselected = (ifempty&&((invoker.Ammo1.Amount>0)||(CountInv("SilverBullets")>0)))?false:true;
|
||||
if ( oldsel != invoker.fcbselected ) A_StartSound("misc/invchange",CHAN_WEAPONEXTRA,CHANF_UI|CHANF_LOCAL);
|
||||
A_WeaponReady(WRF_NOFIRE);
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
}
|
||||
action void A_AltHold()
|
||||
{
|
||||
A_WeaponReady(WRF_NOFIRE);
|
||||
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
|
||||
// tap fire to unload round
|
||||
if ( player.cmd.buttons&BT_ATTACK )
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue