The Pusher is gone.

This commit is contained in:
Mari the Deer 2022-05-16 16:39:11 +02:00
commit 984b2c39ba
70 changed files with 77 additions and 1270 deletions

View file

@ -1,8 +1,7 @@
Demolitionist
{
include "PusherWeapon";
//include "ItamexHammer";
include "DeepImpact";
//include "ItamexHammer";
include "ExplodiumGun";
//include "PlasmaBlast";
include "Spreadgun";

View file

@ -68,7 +68,7 @@ All weapons also have a quick melee attack using the **Weapon State 1** button,
If a weapon has no actions on either the reload or zoom buttons, it may be replaced with some special idle action, such as spinning or fiddling around with it.
Do note that *(with the exception of the **Deep Impact**)*, you can only have one of each weapon per slot. Make sure you think things through with how to set up your loadout, 'cause you can't carry everything *(that is, unless you toggle the option to do so, which completely defeats this attempt at balance)*.
Keep in mind you can only have one of each weapon per slot *(with the exception of slot 1)*, so make sure you think things through with how to set up your loadout, 'cause you can't carry everything *(that is, unless you toggle the option to do so, which completely defeats this attempt at balance)*.
### Deep Impact (slot 1) ~ Replaces Fist, Staff, Hexen starting weapons
![](docimg/deepimpact.png)
@ -83,15 +83,6 @@ The signature **SWWM** melee weapon, an **Impact Hammer** on steroids.
Equipped by default on spawned players.
### Pusher (slot 1) ~ Replaces Chainsaw, Gauntlets, Timon's Axe
![](docimg/pusher.png)
What was going to be the new melee weapon in **Ultra Suite 2**, but it never happened. A pimped up jackhammer.
**Primary fire:** Drill at whatever you're facing.
**Secondary fire:** Pull the drill bit back all the way in, then on button release push it back out with immense force. This will pretty much pierce a hole through anything, but if you miss there's a chance you'll lose grip on the weapon and it'll go flying until it hits something.
### Combat Hammer (slot 1) ~ Replaces Chainsaw, Gauntlets, Timon's Axe
![](docimg/hammer.png)

View file

@ -113,7 +113,6 @@ stomp,40,yes,any
sunny,15,yes,any
#tbd,0,no,doom
tele,0,no,any
tender,100,yes,any
#tennis,0,no,any
thicc,100,yes,any
thruwall,20,yes,any

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

View file

@ -118,10 +118,6 @@ HardwareShader Texture "graphics/M_DEMOCHAN_YNYKRON.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/M_DEMOCHAN_PUSHER.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/M_DEMOCHAN_DAB.png"
{
Shader "shaders/glsl/Bilinear.fp"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 709 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 MiB

View file

@ -1,8 +1,6 @@
[default]
// tags, pickups
T_DEMOLITIONIST = "Demolitionist";
T_PUSHER = "Pusher";
I_PUSHER = "\"Pusher\" Microfusion Rotary Hammer";
T_DEEPIMPACT = "Deep Impact";
I_DEEPIMPACT = "\"Deep Impact\" Airblaster";
T_EXPLODIUM = "Explodium Gun";
@ -480,7 +478,6 @@ FN_ELITEZOMBIE_FUN1 = "Fastzomb";
FN_ELITEZOMBIE_FUN2 = "He Schutt";
FN_ELITEZOMBIE_FUN3 = "Blondie Boy";
// obituaries
O_PUSHER = "%k carefully removed %o's cavities.";
O_DEEPIMPACT = "%o was impacted deeply by %k.";
O_DEEPIMPACT_WEAK = "%k coughed in %o's general direction.";
O_EXPLODIUM = "%k inflicted severe knee explosions onto %o.";
@ -721,9 +718,6 @@ SWWM_PLACE3 = "3rd";
SWWM_PAUSE = "PAUSED";
// weapon tooltips
SWWM_TTNOTE = "Note: Weapon tooltips can be deactivated in DEMOLITIONIST Options.";
TT_PUSHER =
"\cfFire:\c- Drill.\n"
"\cfAltfire:\c- Charged attack.";
TT_DEEPIMPACT =
"\cfFire:\c- Air push.\n"
"\cfAltfire:\c- Charged shot.\n"
@ -918,7 +912,7 @@ SWWM_INTERTIP = "Tip #%d:";
SWWM_INTERTIP1 = "The Demolitionist is immune to drowning, poison and even fall damage (excluding instant kill pits).";
SWWM_INTERTIP2 = "The Explodium Gun's altfire has an explosive yield proportional to the bullets left in the mag.";
SWWM_INTERTIP3 = "Your fuel regenerates over time, but the more you use the impulsor, the longer this will take.";
SWWM_INTERTIP4 = "The Pusher has a chance to slip off your hands on altfire if it doesn't land a hit, however as a ranged attack it may still be effective.";
SWWM_INTERTIP4 = "The Deep Impact may look like a toy, but it's really useful for making some distance from enemies, and it can even blow away incoming barrages of projectiles.";
SWWM_INTERTIP5 = "Spare copies of items will be stashed away in your inventory if they can't be immediately used, this even includes health and armor.";
SWWM_INTERTIP6 = "The Omnisight makes it easy to track down keys and secret exits in maps.";
SWWM_INTERTIP7 = "True to its name, the Wallbuster can be used to completely obliterate doors and other obstacles, depending on their size and how many barrels you shoot.";
@ -1279,8 +1273,6 @@ SWWM_ACHIEVEMENT_SUNNY_TAG = "Sunny D";
SWWM_ACHIEVEMENT_SUNNY_TXT = "Use %d Invinciballs";
SWWM_ACHIEVEMENT_TELE_TAG = "A Soldier's Pastime";
SWWM_ACHIEVEMENT_TELE_TXT = "Teleport some bread (a sandwich works too)";
SWWM_ACHIEVEMENT_TENDER_TAG = "Thorough Tenderizing";
SWWM_ACHIEVEMENT_TENDER_TXT = "Kill %d enemies with the Pusher";
SWWM_ACHIEVEMENT_THICC_TAG = "The Ass was Fat";
SWWM_ACHIEVEMENT_THICC_TXT = "Kill %d enemies by ground pounding";
SWWM_ACHIEVEMENT_THRUWALL_TAG = "Knock Knock";

View file

@ -3069,29 +3069,6 @@ SWWM_LORETXT_PUNTZERGAMMA =
"\cfBy the way I just realized something: SMW bullets are 6.9mm.\c-\n"
"\n"
"\cfNice.\c-";
SWWM_LORETAG_PUSHERWEAPON = "Pusher";
SWWM_LORETAB_PUSHERWEAPON = "Item";
SWWM_LOREREL_PUSHERWEAPON = "EngineTech;Mixom;UAC";
SWWM_LORETXT_PUSHERWEAPON =
"\cxDesignation:\c-\n"
"\cf \"Pusher\" Microfusion Rotary Hammer\c-\n"
"\cxManufacturer:\c-\n"
"\cf Tach-Engine Technology Institute\c-\n"
"\cxClassification:\c-\n"
"\cf Mining Tool\c-\n"
"\n"
"The \cfPusher\c- is a somewhat portable rotary hammer meant for mining and construction work. Its portability comes in part from the usage of an internal microfusion battery, also courtesy of \cfTach-Engine Technologies\c-, providing enough power for 300 hours of constant use. Tach-Engine Technologies does not hold itself responsible for any misuse of this tool.\n"
"\n"
"\cfPrimary Fire:\c- Normal operation. Aim the drill bit at whatever you need to break, and hold the upper trigger.\n"
"\n"
"\cfSecondary Fire:\c- For those cases where you find some real tough material that's hard to crack. Twist the side handle until the drill bit has receded to what you feel is the adequate distance, then tap the primary trigger for it to strike at the target, with full force.\n"
"\n"
"\cfWARNING:\c- Inadequate grip during secondary operation may cause the tool to slip off, always keep the area clear to prevent collateral damages.\n"
"\n"
"\cxSaya's Notes:\c-\n"
"\cfYeah, chainsaws are a staple of \"tool turned weapon\", we all know this, but what about goddamn jackhammers?\c-\n"
"\n"
"\cfYou know actually, that reminded me of this one bigass blunder from Mixom. Those UAC nerds had requested a shipment of jackhammers to be sent to Mars City once, and these idiots go and send chainsaws instead. That's one hell of a mixup, don't ya think?\c-";
SWWM_LORETAG_QUADRAVOL = "Quadravol";
SWWM_LORETAB_QUADRAVOL = "Item";
SWWM_LOREREL_QUADRAVOL = "Kmonn;Xekke";

View file

@ -423,7 +423,7 @@ TOOLTIP_NETEVENT_SWWMUPDATEGLOWS = "Adds/Removes item glows at runtime, without
TOOLTIP_NETEVENT_SWWMUPDATEHITBOXES = "Removes extended item hitboxes at runtime. Due to implementation quirks, they can't be added without a map restart.";
TOOLTIP_NETEVENT_SWWMUPDATETRACKERS = "Adds/Removes combat trackers at runtime. This command has the potential to cause severe performance issues in certain situations.";
// main menu poses (do not localize)
SWWM_NMENUPOSE = "21";
SWWM_NMENUPOSE = "20";
SWWM_MENUPOSE1 = "graphics/M_DEMOCHAN_DEEPIMPACT.png";
SWWM_MENUPOSE2 = "graphics/M_DEMOCHAN_EXPLOGUN.png";
SWWM_MENUPOSE3 = "graphics/M_DEMOCHAN_SPREADGUN.png";
@ -434,17 +434,16 @@ SWWM_MENUPOSE7 = "graphics/M_DEMOCHAN_BIOSPARK.png";
SWWM_MENUPOSE8 = "graphics/M_DEMOCHAN_SILVERBULLET.png";
SWWM_MENUPOSE9 = "graphics/M_DEMOCHAN_CANDYGUN.png";
SWWM_MENUPOSE10 = "graphics/M_DEMOCHAN_YNYKRON.png";
SWWM_MENUPOSE11 = "graphics/M_DEMOCHAN_PUSHER.png";
SWWM_MENUPOSE12 = "graphics/M_DEMOCHAN_DAB.png";
SWWM_MENUPOSE13 = "graphics/M_DEMOCHAN_DOUBLEV.png";
SWWM_MENUPOSE14 = "graphics/M_DEMOCHAN_HEALTH.png";
SWWM_MENUPOSE15 = "graphics/M_DEMOCHAN_LOVE.png";
SWWM_MENUPOSE16 = "graphics/M_DEMOCHAN_RAGEKIT.png";
SWWM_MENUPOSE17 = "graphics/M_DEMOCHAN_SANDWICH.png";
SWWM_MENUPOSE18 = "graphics/M_DEMOCHAN_SHELLS.png";
SWWM_MENUPOSE19 = "graphics/M_DEMOCHAN_SKULL.png";
SWWM_MENUPOSE20 = "graphics/M_DEMOCHAN_THONK.png";
SWWM_MENUPOSE21 = "graphics/M_DEMOCHAN_THUMBUP.png";
SWWM_MENUPOSE11 = "graphics/M_DEMOCHAN_DAB.png";
SWWM_MENUPOSE12 = "graphics/M_DEMOCHAN_DOUBLEV.png";
SWWM_MENUPOSE13 = "graphics/M_DEMOCHAN_HEALTH.png";
SWWM_MENUPOSE14 = "graphics/M_DEMOCHAN_LOVE.png";
SWWM_MENUPOSE15 = "graphics/M_DEMOCHAN_RAGEKIT.png";
SWWM_MENUPOSE16 = "graphics/M_DEMOCHAN_SANDWICH.png";
SWWM_MENUPOSE17 = "graphics/M_DEMOCHAN_SHELLS.png";
SWWM_MENUPOSE18 = "graphics/M_DEMOCHAN_SKULL.png";
SWWM_MENUPOSE19 = "graphics/M_DEMOCHAN_THONK.png";
SWWM_MENUPOSE20 = "graphics/M_DEMOCHAN_THUMBUP.png";
// credits
SWWM_MCREDS = "DEMOLITIONIST Credits";
SWWM_CSTITLE = "UnSX Side Story: Demolitionist";

View file

@ -281,7 +281,6 @@ SWWM_SUBS_DEFAULT_KORAXMASTERS9 = "Urgh... Please just shut the fuck up.";
/// Extra lines that wouldn't be possible without original voice acting
// per-weapon lines (alternative)
SWWM_SUBS_DEFAULT_GETDEEPIMPACT = "I'll huff and I'll puff... and I'll blow your house in.";
SWWM_SUBS_DEFAULT_GETPUSHERWEAPON = "Anyone wants their cavities removed?";
SWWM_SUBS_DEFAULT_GETEXPLODIUMGUN1 = "Ah, my trusty old friend.";
SWWM_SUBS_DEFAULT_GETEXPLODIUMGUN2 = "Twice the knee-exploding power.";
SWWM_SUBS_DEFAULT_GETSPREADGUN = "Look at this pocket shotty.";

View file

@ -1,7 +1,6 @@
[es]
// tags, pickups
T_DEMOLITIONIST = "Demolicionista";
I_PUSHER = "Taladro Percutor de Microfusión \"Pusher\"";
I_DEEPIMPACT = "Pistola de Aire \"Deep Impact\"";
T_EXPLODIUM = "Pistola de Explodium";
T_EXPLODIUM2 = "Pistolas de Explodium";
@ -379,7 +378,6 @@ FN_ELITEZOMBIE_FUN1 = "Zomborápido";
FN_ELITEZOMBIE_FUN2 = "Te Dispara";
FN_ELITEZOMBIE_FUN3 = "Rubiales";
// obituaries
O_PUSHER = "%k le quitó cuidadosamente las caries a %o.";
O_DEEPIMPACT = "%o fue impactad@[ao_esp] profundamente por %k.";
O_DEEPIMPACT_WEAK = "%k tosió en la dirección general de %o.";
O_EXPLODIUM = "%k infligió explosiones de rodilla severas a %o.";
@ -607,9 +605,6 @@ SWWM_PLACE3_GENDER1 = "3ª";
SWWM_PAUSE = "PAUSA";
// weapon tooltips
SWWM_TTNOTE = "Nota: La ayuda de armas se puede desactivar en Opciones de DEMOLITIONIST.";
TT_PUSHER =
"\cfPrimario:\c- Taladrar.\n"
"\cfSecundario:\c- Ataque cargado.";
TT_DEEPIMPACT =
"\cfPrimario:\c- Impulso de aire.\n"
"\cfSecundario:\c- Disparo cargado.\n"
@ -800,7 +795,7 @@ SWWM_INTERTIP = "Consejo #%d:";
SWWM_INTERTIP1 = "La Demolicionista es inmune al ahogamiento, veneno e incluso daño por caída (excluyendo hoyos de muerte instantánea).";
SWWM_INTERTIP2 = "El fuego secundario de la Pistola de Explodium tiene una carga explosiva proporcional al número de balas restantes en el cargador.";
SWWM_INTERTIP3 = "Tu combustible se regenera con el tiempo, pero cuanto más uses el propulsor, más tardará.";
SWWM_INTERTIP4 = "El Pusher puede resbalarse de tus manos con el fuego secundario si no le da a nada, sin embargo esto puede ser efectivo como ataque a distancia.";
SWWM_INTERTIP4 = "El Deep Impact parecerá un juguete, pero es muy útil para mantener la distancia con los enemigos, y puede hasta librarte de bombardeos de proyectiles de un soplido.";
SWWM_INTERTIP5 = "Se guardarán copias extra de ítems en tu inventario si no pueden ser usados inmediatamente, esto incluye hasta salud y armadura.";
SWWM_INTERTIP6 = "La Omnivisión facilita encontrar llaves y salidas secretas en los mapas.";
SWWM_INTERTIP7 = "Tal como su nombre indica, la Wallbuster puede cargarse paredes y otros obstáculos, dependiendo de su tamaño y el número de cañones que dispares.";
@ -1122,8 +1117,6 @@ SWWM_ACHIEVEMENT_STOMP_TXT = "Mata %d enemigos saltando encima";
SWWM_ACHIEVEMENT_SUNNY_TXT = "Usa %d Invincibolas";
SWWM_ACHIEVEMENT_TELE_TAG = "Pasatiempo de Soldado";
SWWM_ACHIEVEMENT_TELE_TXT = "Teletransporta pan (un sandwich también vale)";
SWWM_ACHIEVEMENT_TENDER_TAG = "Eficiente Enternecido";
SWWM_ACHIEVEMENT_TENDER_TXT = "Mata %d enemigos con el Pusher";
SWWM_ACHIEVEMENT_THICC_TAG = "El Culo era Gordo";
SWWM_ACHIEVEMENT_THICC_TXT = "Mata %d enemigos a base de estampidas en el suelo";
SWWM_ACHIEVEMENT_THRUWALL_TAG = "Toc Toc";

View file

@ -2849,26 +2849,6 @@ SWWM_LORETXT_PUNTZERGAMMA =
"\cfPor cierto me acabo de dar cuenta de algo: Las balas SMW son de 6.9mm.\c-\n"
"\n"
"\cfNice.\c-";
SWWM_LORETXT_PUSHERWEAPON =
"\cxDesignación:\c-\n"
"\cf Taladro Percutor de Microfusión \"Pusher\"\c-\n"
"\cxFabricante:\c-\n"
"\cf Instituto Tecnológico Tach-Engine\c-\n"
"\cxClasificación:\c-\n"
"\cf Herramienta de Minería\c-\n"
"\n"
"El \cfPusher\c- es un taladro percutor relativamente portátil hecho para tareas de minería y construcción. Su portabilidad viene en parte por el uso de una batería interna de microfusión, también cortesía de \cfTecnologías Tach-Engine\c-, ofreciendo suficiente potencia para 300 horas de uso constante. Tecnologías Tach-Engine no se hace responsable por el uso indebido de esta herramienta.\n"
"\n"
"\cfFuego Primario:\c- Operación normal. Apunta la broca hacia lo que necesites romper, y mantén pulsado el gatillo superior.\n"
"\n"
"\cfFuego Secundario:\c- Para aquellos casos en los que encuentres un material realmente duro y difícil de romper. Gira el mango lateral hasta que la broca haya retrocedido hasta una distancia que consideres adecuada, y luego pulsa el gatillo principal para golpear el objetivo, con la fuerza cargada.\n"
"\n"
"\cfADVERTENCIA:\c- La sujeción indebida durante la operación secundaria puede causar que la herramienta se resbale, mantén siempre el área libre para evitar daños colaterales.\n"
"\n"
"\cxNotas de Saya:\c-\n"
"\cfSí, las motosierras son lo típico en cuanto a \"herramienta hecha arma\", todos lo sabemos, pero, ¿y un puto martillo neumático?\c-\n"
"\n"
"\cfAhora que lo pienso, eso me recuerda a aquella metedura de pata tremenda de Mixom. Los frikis de la UAC pidieron un monte de martillos neumáticos para Mars City una vez, y los burros esos van y mandan motosierras. Pues vaya lío ese, ¿no crees?\c-";
SWWM_LORETXT_QUADRAVOL =
"\cxDesignación:\c-\n"
"\cf Quadravol (\"Cruz Ardiente\")\c-\n"

View file

@ -253,7 +253,6 @@ SWWM_SUBS_DEFAULT_KORAXMASTERS9 = "Urgh... Por favor cállate la puta boca ya.";
/// Extra lines that wouldn't be possible without original voice acting
// per-weapon lines (alternative)
SWWM_SUBS_DEFAULT_GETDEEPIMPACT = "Soplaré y soplaré... y vuestra casa derribaré.";
SWWM_SUBS_DEFAULT_GETPUSHERWEAPON = "¿Alguien quiere que le quite las caries?";
SWWM_SUBS_DEFAULT_GETEXPLODIUMGUN1 = "Ah, mi fiel amigo.";
SWWM_SUBS_DEFAULT_GETEXPLODIUMGUN2 = "Doble poder revienta-rodillas.";
SWWM_SUBS_DEFAULT_GETSPREADGUN = "Mira que escopetita.";

View file

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r65 \cu(Fri 13 May 18:29:45 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r65 \cu(2022-05-13 18:29:45)\c-";
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r66 \cu(Mon 16 May 16:39:11 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r66 \cu(2022-05-16 16:39:11)\c-";

View file

@ -1,26 +0,0 @@
TAG
Pusher
TAB
Item
REL
EngineTech;Mixom;UAC
TXT
\cxDesignation:\c-
\cf "Pusher" Microfusion Rotary Hammer\c-
\cxManufacturer:\c-
\cf Tach-Engine Technology Institute\c-
\cxClassification:\c-
\cf Mining Tool\c-
The **Pusher** is a somewhat portable rotary hammer meant for mining and construction work. Its portability comes in part from the usage of an internal microfusion battery, also courtesy of **Tach-Engine Technologies**, providing enough power for 300 hours of constant use. Tach-Engine Technologies does not hold itself responsible for any misuse of this tool.
\cfPrimary Fire:\c- Normal operation. Aim the drill bit at whatever you need to break, and hold the upper trigger.
\cfSecondary Fire:\c- For those cases where you find some real tough material that's hard to crack. Twist the side handle until the drill bit has receded to what you feel is the adequate distance, then tap the primary trigger for it to strike at the target, with full force.
\cfWARNING:\c- Inadequate grip during secondary operation may cause the tool to slip off, always keep the area clear to prevent collateral damages.
\cxSaya's Notes:\c-
\cfYeah, chainsaws are a staple of "tool turned weapon", we all know this, but what about goddamn jackhammers?\c-
\cfYou know actually, that reminded me of this one bigass blunder from Mixom. Those UAC nerds had requested a shipment of jackhammers to be sent to Mars City once, and these idiots go and send chainsaws instead. That's one hell of a mixup, don't ya think?\c-

View file

@ -1,20 +0,0 @@
TXT
\cxDesignación:\c-
\cf Taladro Percutor de Microfusión "Pusher"\c-
\cxFabricante:\c-
\cf Instituto Tecnológico Tach-Engine\c-
\cxClasificación:\c-
\cf Herramienta de Minería\c-
El **Pusher** es un taladro percutor relativamente portátil hecho para tareas de minería y construcción. Su portabilidad viene en parte por el uso de una batería interna de microfusión, también cortesía de **Tecnologías Tach-Engine**, ofreciendo suficiente potencia para 300 horas de uso constante. Tecnologías Tach-Engine no se hace responsable por el uso indebido de esta herramienta.
\cfFuego Primario:\c- Operación normal. Apunta la broca hacia lo que necesites romper, y mantén pulsado el gatillo superior.
\cfFuego Secundario:\c- Para aquellos casos en los que encuentres un material realmente duro y difícil de romper. Gira el mango lateral hasta que la broca haya retrocedido hasta una distancia que consideres adecuada, y luego pulsa el gatillo principal para golpear el objetivo, con la fuerza cargada.
\cfADVERTENCIA:\c- La sujeción indebida durante la operación secundaria puede causar que la herramienta se resbale, mantén siempre el área libre para evitar daños colaterales.
\cxNotas de Saya:\c-
\cfSí, las motosierras son lo típico en cuanto a "herramienta hecha arma", todos lo sabemos, pero, ¿y un puto martillo neumático?\c-
\cfAhora que lo pienso, eso me recuerda a aquella metedura de pata tremenda de Mixom. Los frikis de la UAC pidieron un monte de martillos neumáticos para Mars City una vez, y los burros esos van y mandan motosierras. Pues vaya lío ese, ¿no crees?\c-

View file

@ -1,151 +0,0 @@
Model "PusherProjectile"
{
Path "models"
Model 0 "PusherPickup_d.3d"
Skin 0 "Pusher.png"
Scale 0.15 0.15 0.15
ZOffset 5
USEACTORPITCH
USEACTORROLL
FrameIndex XZW1 A 0 0
}
Model "PusherWeapon"
{
Path "models"
Model 0 "PusherPickup_d.3d"
Skin 0 "Pusher.png"
Scale 0.15 0.15 0.15
AngleOffset 180
ZOffset 20
ROTATING
FrameIndex XZW1 A 0 0
}
Model "PusherWeapon"
{
Path "models"
Model 1 "Pusher1st_d.3d"
SurfaceSkin 1 0 "DemoTags.png"
SurfaceSkin 1 1 "DemoArms.png"
SurfaceSkin 1 2 "DemoSoft.png"
SurfaceSkin 1 3 "Pusher.png"
AngleOffset -90
Scale -0.005 0.0025 0.005
Offset 2 0 1
// Still / Deselect
FrameIndex XZW2 A 1 0
FrameIndex XZW2 B 1 1
FrameIndex XZW2 C 1 2
FrameIndex XZW2 D 1 3
FrameIndex XZW2 E 1 4
FrameIndex XZW2 F 1 5
// DeselectEnd / Select
FrameIndex XZW2 G 1 6
FrameIndex XZW2 H 1 7
FrameIndex XZW2 I 1 8
FrameIndex XZW2 J 1 9
FrameIndex XZW2 K 1 10
FrameIndex XZW2 L 1 11
// FireStart
FrameIndex XZW2 M 1 13
// Fire
FrameIndex XZW2 N 1 14
FrameIndex XZW2 O 1 15
FrameIndex XZW2 P 1 16
FrameIndex XZW2 Q 1 17
FrameIndex XZW2 R 1 18
FrameIndex XZW2 S 1 19
// FireEnd
FrameIndex XZW2 T 1 21
// AltFire
FrameIndex XZW2 U 1 23
FrameIndex XZW2 V 1 24
FrameIndex XZW2 W 1 25
FrameIndex XZW2 X 1 26
FrameIndex XZW2 Y 1 27
FrameIndex XZW2 Z 1 28
FrameIndex XZW3 A 1 29
FrameIndex XZW3 B 1 30
FrameIndex XZW3 C 1 31
FrameIndex XZW3 D 1 32
FrameIndex XZW3 E 1 33
FrameIndex XZW3 F 1 34
FrameIndex XZW3 G 1 35
FrameIndex XZW3 H 1 36
// AltFireRelease
FrameIndex XZW5 R 1 37 // oops, forgot this frame
FrameIndex XZW3 I 1 38
FrameIndex XZW3 J 1 39
FrameIndex XZW3 K 1 40
FrameIndex XZW3 L 1 41
FrameIndex XZW3 M 1 42
FrameIndex XZW3 N 1 43
FrameIndex XZW3 O 1 44
FrameIndex XZW3 P 1 45
// AltFireMiss
SurfaceSkin 1 3 ""
FrameIndex XZW3 Q 1 47
FrameIndex XZW3 R 1 48
FrameIndex XZW3 S 1 49
FrameIndex XZW3 T 1 50
FrameIndex XZW3 U 1 51
FrameIndex XZW3 V 1 52
FrameIndex XZW3 W 1 53
SurfaceSkin 1 3 "Pusher.png"
// Idle
FrameIndex XZW3 X 1 55
FrameIndex XZW3 Y 1 56
FrameIndex XZW3 Z 1 57
FrameIndex XZW4 A 1 58
FrameIndex XZW4 B 1 59
FrameIndex XZW4 C 1 60
FrameIndex XZW4 D 1 61
FrameIndex XZW4 E 1 62
FrameIndex XZW4 F 1 63
FrameIndex XZW4 G 1 64
FrameIndex XZW4 H 1 65
FrameIndex XZW4 I 1 66
FrameIndex XZW4 J 1 67
FrameIndex XZW4 K 1 68
FrameIndex XZW4 L 1 69
FrameIndex XZW4 M 1 70
FrameIndex XZW4 N 1 71
FrameIndex XZW4 O 1 72
FrameIndex XZW4 P 1 73
FrameIndex XZW4 Q 1 74
FrameIndex XZW4 R 1 75
FrameIndex XZW4 S 1 76
FrameIndex XZW4 T 1 77
FrameIndex XZW4 U 1 78
FrameIndex XZW4 V 1 79
FrameIndex XZW4 W 1 80
FrameIndex XZW4 X 1 81
FrameIndex XZW4 Y 1 82
FrameIndex XZW4 Z 1 83
// Melee
FrameIndex XZW5 A 1 85
FrameIndex XZW5 B 1 86
FrameIndex XZW5 C 1 87
FrameIndex XZW5 D 1 88
FrameIndex XZW5 E 1 89
FrameIndex XZW5 F 1 90
FrameIndex XZW5 G 1 91
FrameIndex XZW5 H 1 92
FrameIndex XZW5 I 1 93
FrameIndex XZW5 J 1 94
FrameIndex XZW5 K 1 95
FrameIndex XZW5 L 1 96
FrameIndex XZW5 M 1 97
FrameIndex XZW5 N 1 98
FrameIndex XZW5 O 1 99
FrameIndex XZW5 P 1 100
FrameIndex XZW5 Q 1 101
}

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -41,6 +41,24 @@ Ammo models:
Collectible models:
- Saya's Mug
# Misc
Gib models:
x Steak
x Breast
x Drumstick
- Sausage
- Pork Chop
- Bone
- Heart
- Eyeball
- Fish
- Half-Eaten Sandwich
- Cookie
- Tomato
- Rubber Duck
- Shoe
# Final Update
Character models:

View file

@ -15,16 +15,15 @@ Index of contents:
2. Inventory
2.1. Weaponry
2.1.1. Deep Impact
2.1.2. Pusher
2.1.3. Explodium Gun
2.1.4. Spreadgun
2.1.5. Wallbuster
2.1.6. Eviscerator
2.1.7. Hellblazer
2.1.8. Biospark Carbine
2.1.9. Silver Bullet JET
2.1.A. Candy Gun
2.1.B. Ynykron Artifact
2.1.2. Explodium Gun
2.1.3. Spreadgun
2.1.4. Wallbuster
2.1.5. Eviscerator
2.1.6. Hellblazer
2.1.7. Biospark Carbine
2.1.8. Silver Bullet JET
2.1.9. Candy Gun
2.1.A. Ynykron Artifact
2.2. Powerups
2.2.1. Grilled Cheese Sandwich
2.2.2. Elemental Coating
@ -119,15 +118,7 @@ Secondary fire charges up a big thicc air bullet that rips hard.
Remember to keep this puppy recharged by pumping more air, especially for that
altfire, which requires 100% charge.
2.1.2. Pusher
Slot 1. Melee weapon.
What was going to be Ultra Suite 2's flagship melee weapon.
Primary fire drills around.
Secondary fire charges up a nice impaling action. The weapon will fly off if
there's nothing to hit, however, so be careful (unless you want it to).
2.1.3. Explodium Gun
2.1.2. Explodium Gun
Slot 2. Pistol. Available at start.
Another SWWM staple, the pocket exploder.
@ -136,7 +127,7 @@ Secondary fire arms the mag and throws it as a grenade. Stronger the more
bullets you have left in it.
You can have two of them, by the way.
2.1.4. Spreadgun
2.1.3. Spreadgun
Slot 3. Shotgun.
Coming from Instant Action 3, of all places, here's this thing.
@ -147,7 +138,7 @@ want to use it on the other shotgun weapon.
Reload does what you'd expect it to do.
This thing may be unwieldy, but boy does it let you use some fun ammo types.
2.1.5. Wallbuster
2.1.4. Wallbuster
Slot 4. Revolver shotgun.
A slight readjustment of a weapon from Total Destruction (cancelled).
@ -158,7 +149,7 @@ Reload opens the reload menu. The instructions provided are self-explanatory.
Shooting multiple barrels may allow you to bust doors, bars, and other
structures, quite handy.
2.1.6. Eviscerator
2.1.5. Eviscerator
Slot 5. Flak cannon.
It's back, and it's still pure unadulterated danmaku.
@ -168,7 +159,7 @@ Tertiary fire toggles between wide and tight spread.
A rare case of a weapon that doesn't need to reload, as it pulls in ammo from
your inventory directly.
2.1.7. Hellblazer
2.1.6. Hellblazer
Slot 6. Rocket launcher.
We've seen its predecessors before, but now it's time for the new cool kid, the
@ -181,7 +172,7 @@ rockets, it will instead select targets for seeking.
Reload does what you'd expect. But when holding rockets, it clears any selected
seek targets. That's pretty much all.
2.1.8. Biospark Carbine
2.1.7. Biospark Carbine
Slot 7. Energy weapon.
The Sparkster is back, but not in pog form however.
@ -191,7 +182,7 @@ Tertiary fire ejects the ammo core turning it into a heatseeking orb of death.
Reload reloads. You can stack two mags together if you want, for more shoots,
at the price of some slight unstability (you might hurt yourself with it).
2.1.9. Silver Bullet JET
2.1.8. Silver Bullet JET
Slot 8. Sniper rifle.
The big and bulky brother of that unwieldy thing from Ultra Suite.
@ -203,7 +194,7 @@ Tertiary fire is a zoom. Hold to keep increasing the zoom factor, up to 16x.
Crouching with this weapon braces it and disengages the recoil compensator,
which can definitely cause some self-hurt from how hot the jet gas can get.
2.1.A. Candy Gun
2.1.9. Candy Gun
Slot 9. Pistol (but very strong).
A tasty treat of sweetness and DEATH. From the lost forever™ Weirdweapons pack.
@ -213,7 +204,7 @@ Holding secondary and primary fire (in that order) will switch to yeeting the
entire damn gun, for some absurd reason. It's very effective, though.
Considering that you can dispose of it like that, you can hold some spares.
2.1.B. Ynykron Artifact
2.1.A. Ynykron Artifact
Slot 0. Divine WMD (replica).
The good ol' Mortal Cannon, now in all its unadulterated glory.
@ -336,9 +327,9 @@ very valuable.
- - - - - - - - - -
An additional set of 10 weapons to spice things up. Note that you can only have
one of each in every slot, so make sure you pick the right options for the
battles ahead (or you could just disable that mechanic entirely, if you're the
kinda person who prefers to carry EVERYTHING).
one of each in every slot (excluding slot 1), so make sure you pick the right
options for the battles ahead (or you could just disable that mechanic
entirely, if you're the kinda person who prefers to carry EVERYTHING).
2.6.1. Itamex Hammer

View file

@ -321,7 +321,6 @@ voice/default/koraxmasters7 sounds/voice/default/va/demokoraxmasters7.ogg
voice/default/koraxmasters8 sounds/voice/default/va/demokoraxmasters8.ogg
voice/default/koraxmasters9 sounds/voice/default/va/demokoraxmasters9.ogg
voice/default/getdeepimpact sounds/voice/default/va/demogetdeepimpact.ogg
voice/default/getpusherweapon sounds/voice/default/va/demogetpusherweapon.ogg
voice/default/getexplodiumgun1 sounds/voice/default/va/demogetexplodiumgun1.ogg
voice/default/getexplodiumgun2 sounds/voice/default/va/demogetexplodiumgun2.ogg
voice/default/getspreadgun sounds/voice/default/va/demogetspreadgun.ogg
@ -776,6 +775,12 @@ demolitionist/punchf1 sounds/demolitionist/demopunchf1.ogg
demolitionist/punchf2 sounds/demolitionist/demopunchf2.ogg
demolitionist/punchf3 sounds/demolitionist/demopunchf3.ogg
$random demolitionist/punchf { demolitionist/punchf1 demolitionist/punchf2 demolitionist/punchf3 }
demolitionist/xpunch1 sounds/demolitionist/demoxpunch1.ogg
demolitionist/xpunch2 sounds/demolitionist/demoxpunch1.ogg
$random demolitionist/xpunch { demolitionist/xpunch1 demolitionist/xpunch2 }
demolitionist/xpunchf1 sounds/demolitionist/demoxpunchf1.ogg
demolitionist/xpunchf2 sounds/demolitionist/demoxpunchf1.ogg
$random demolitionist/xpunchf { demolitionist/xpunchf1 demolitionist/xpunchf2 }
demolitionist/bump1 sounds/demolitionist/demobump1.ogg
demolitionist/bump2 sounds/demolitionist/demobump2.ogg
demolitionist/bump3 sounds/demolitionist/demobump3.ogg
@ -892,41 +897,6 @@ explodium/throwmag sounds/explodiumgun/expl_throwmag.ogg
$limit explodium/hit 32
$limit explodium/maghit 32
pusher/select sounds/pusher/push_select.ogg
pusher/deselect sounds/pusher/push_deselect.ogg
pusher/motor sounds/pusher/push_motor.ogg
pusher/motorend sounds/pusher/push_motorend.ogg
pusher/start sounds/pusher/push_start.ogg
pusher/drill sounds/pusher/push_drill.ogg
pusher/hit1 sounds/pusher/push_hitw1.ogg
pusher/hit2 sounds/pusher/push_hitw2.ogg
pusher/hit3 sounds/pusher/push_hitw3.ogg
$random pusher/hit { pusher/hit1 pusher/hit2 pusher/hit3 }
$limit pusher/hit 32
pusher/meat1 sounds/pusher/push_hitf1.ogg
pusher/meat2 sounds/pusher/push_hitf2.ogg
pusher/meat3 sounds/pusher/push_hitf3.ogg
$random pusher/meat { pusher/meat1 pusher/meat2 pusher/meat3 }
$limit pusher/meat 32
pusher/end sounds/pusher/push_end.ogg
pusher/checkout sounds/pusher/push_idle.ogg
pusher/pullback sounds/pusher/push_altcharge.ogg
pusher/altfire1 sounds/pusher/push_altfire1.ogg
pusher/altfire2 sounds/pusher/push_altfire2.ogg
$random pusher/altfire { pusher/altfire1 pusher/altfire2 }
pusher/miss sounds/pusher/push_miss.ogg
pusher/althit1 sounds/pusher/push_slam1.ogg
pusher/althit2 sounds/pusher/push_slam2.ogg
$random pusher/althit { pusher/althit1 pusher/althit2 }
pusher/altmeat1 sounds/pusher/push_slamf1.ogg
pusher/altmeat2 sounds/pusher/push_slamf2.ogg
$random pusher/altmeat { pusher/altmeat1 pusher/altmeat2 }
pusher/fly sounds/pusher/push_fly.ogg
pusher/bounce1 sounds/pusher/push_bounce1.ogg
pusher/bounce2 sounds/pusher/push_bounce2.ogg
pusher/bounce3 sounds/pusher/push_bounce3.ogg
$random pusher/bounce { pusher/bounce1 pusher/bounce2 pusher/bounce3 }
spreadgun/open sounds/spreadgun/spread_open.ogg
spreadgun/hammer sounds/spreadgun/spread_hammer.ogg
spreadgun/close sounds/spreadgun/spread_close.ogg
@ -1007,6 +977,7 @@ spreadgun/ballf1 sounds/spreadgun/spread_ballf1.ogg
spreadgun/ballf2 sounds/spreadgun/spread_ballf2.ogg
spreadgun/ballf3 sounds/spreadgun/spread_ballf3.ogg
$random spreadgun/ballf { spreadgun/ballf1 spreadgun/ballf2 spreadgun/ballf3 }
spreadgun/ballfly sounds/spreadgun/spread_ballfly.ogg
spreadgun/salt1 sounds/spreadgun/spread_salt1.ogg
spreadgun/salt2 sounds/spreadgun/spread_salt2.ogg
spreadgun/salt3 sounds/spreadgun/spread_salt3.ogg

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -43,7 +43,6 @@ GameInfo
PrecacheClasses = "Demolitionist", // player
// weapons
"DeepImpact",
"PusherWeapon",
"ItamexHammer",
"ExplodiumGun",
"DualExplodiumGun",
@ -135,7 +134,6 @@ GameInfo
"graphics/M_DEMOCHAN_EVISCERATOR.png",
"graphics/M_DEMOCHAN_EXPLOGUN.png",
"graphics/M_DEMOCHAN_HELLBLAZER.png",
"graphics/M_DEMOCHAN_PUSHER.png",
"graphics/M_DEMOCHAN_SILVERBULLET.png",
"graphics/M_DEMOCHAN_SPREADGUN.png",
"graphics/M_DEMOCHAN_WALLBUSTER.png",

View file

@ -100,8 +100,6 @@ version "4.8"
#include "zscript/weapons/swwm_baseweapon_fx.zsc"
#include "zscript/weapons/swwm_baseweapon_melee.zsc"
#include "zscript/weapons/swwm_baseweapon_precisechair.zsc"
#include "zscript/weapons/swwm_jackhammer.zsc"
#include "zscript/weapons/swwm_jackhammer_fx.zsc"
#include "zscript/weapons/swwm_deepdarkimpact.zsc"
#include "zscript/weapons/swwm_deepdarkimpact_fx.zsc"
#include "zscript/weapons/swwm_splode.zsc"

View file

@ -1,5 +1,5 @@
// Itamex Reinforced Combat Hammer (from UnSX 5)
// Slot 1, spawns shared with Pusher
// Slot 1, spawns shared with Deep Impact
Class ItamexHammer : SWWMWeapon
{
@ -16,7 +16,7 @@ Class ItamexHammer : SWWMWeapon
SWWMWeapon.GetLine "getitamexhammer";
Inventory.Icon "graphics/HUD/Icons/W_ItamexHammer.png";
Weapon.SlotNumber 1;
Weapon.SlotPriority 3.;
Weapon.SlotPriority 2.;
Weapon.SelectionOrder 1200;
Stamina 9000;
+WEAPON.MELEEWEAPON;

View file

@ -217,8 +217,6 @@ extend Class SWWMHandler
if ( (e.Thing is 'Cyberdemon') && (e.Inflictor is 'Rocket') && (buff.tracer == e.Thing) )
SWWMUtility.MarkAchievement("cybully",src.player);
}
if ( (e.Inflictor is 'PusherWeapon') || (e.Inflictor is 'PusherProjectile') )
SWWMUtility.AchievementProgressInc("tender",1,src.player);
Inventory tk;
if ( (tk = e.Thing.FindInventory("DeepImpactOnlyToken")) && (tk.special1 == 1) )
SWWMUtility.MarkAchievement("shame",src.player);

View file

@ -321,106 +321,6 @@ extend Class SWWMHandler
Console.Printf("%d effects cleared.",n);
return;
}
else if ( e.Name ~== "swwmdebugdumprng" )
{
if ( multiplayer && (e.player != Net_Arbitrator) )
{
if ( e.player == consoleplayer )
Console.Printf("Only the net arbitrator can call this event.");
return;
}
// dump the values of all mod RNGs (might help someday to track down what desyncs)
String msg = String.Format("\cxRNG dump for player %d (\c-%s\cx):\c-",consoleplayer,players[consoleplayer].GetUserName());
msg.AppendFormat("\n\n\cfPlay RNG (will cause desyncs if mismatched):\c-\n");
msg.AppendFormat("\nBlood: %08x",Random2[Blood]());
msg.AppendFormat("\nBoolet: %08x",Random2[Boolet]());
msg.AppendFormat("\nBundle: %08x",Random2[Bundle]());
msg.AppendFormat("\nCandy: %08x",Random2[Candy]());
msg.AppendFormat("\nChancebox: %08x",Random2[Chancebox]());
msg.AppendFormat("\nCorrode: %08x",Random2[Corrode]());
msg.AppendFormat("\nDemolitionist: %08x",Random2[Demolitionist]());
msg.AppendFormat("\nDoBlast: %08x",Random2[DoBlast]());
msg.AppendFormat("\nDropChance: %08x",Random2[DropChance]());
msg.AppendFormat("\nEviscerator: %08x",Random2[Eviscerator]());
msg.AppendFormat("\nExplodium: %08x",Random2[Explodium]());
msg.AppendFormat("\nExploS: %08x",Random2[ExploS]());
msg.AppendFormat("\nExtraMissiles: %08x",Random2[ExtraMissiles]());
msg.AppendFormat("\nFlameT: %08x",Random2[FlameT]());
msg.AppendFormat("\nFlicker: %08x",Random2[Flicker]());
msg.AppendFormat("\nGesture: %08x",Random2[Gesture]());
msg.AppendFormat("\nGibs: %08x",Random2[Gibs]());
msg.AppendFormat("\nGoldDrop: %08x",Random2[GoldDrop]());
msg.AppendFormat("\nGoldy: %08x",Random2[Goldy]());
msg.AppendFormat("\nGunFlash: %08x",Random2[GunFlash]());
msg.AppendFormat("\nHellblazer: %08x",Random2[Hellblazer]());
msg.AppendFormat("\nImpact: %08x",Random2[Impact]());
msg.AppendFormat("\nInvinciball: %08x",Random2[Invinciball]());
msg.AppendFormat("\nJunk: %08x",Random2[Junk]());
msg.AppendFormat("\nMoth: %08x",Random2[Moth]());
msg.AppendFormat("\nMykradvo: %08x",Random2[Mykradvo]());
msg.AppendFormat("\nNugget: %08x",Random2[Nugget]());
msg.AppendFormat("\nParry: %08x",Random2[Parry]());
msg.AppendFormat("\nPonch: %08x",Random2[Ponch]());
msg.AppendFormat("\nPuff: %08x",Random2[Puff]());
msg.AppendFormat("\nPusher: %08x",Random2[Pusher]());
msg.AppendFormat("\nRage: %08x",Random2[Rage]());
msg.AppendFormat("\nReplacements: %08x",Random2[Replacements]());
msg.AppendFormat("\nShellDrop: %08x",Random2[ShellDrop]());
msg.AppendFormat("\nShivers: %08x",Random2[Shivers]());
msg.AppendFormat("\nSilverbullet: %08x",Random2[Silverbullet]());
msg.AppendFormat("\nSpareShells: %08x",Random2[SpareShells]());
msg.AppendFormat("\nSparkster: %08x",Random2[Sparkster]());
msg.AppendFormat("\nSpread: %08x",Random2[Spread]());
msg.AppendFormat("\nSpreadgun: %08x",Random2[Spreadgun]());
msg.AppendFormat("\nWallbuster: %08x",Random2[Wallbuster]());
msg.AppendFormat("\nYnykron: %08x",Random2[Ynykron]());
msg.AppendFormat("\n\n\cfUI RNG (should not cause desyncs if mismatched):\c-\n");
msg.AppendFormat("\nbdscreen: %08x",Random2[bdscreen]());
msg.AppendFormat("\nClientSparkles: %08x",Random2[ClientSparkles]());
msg.AppendFormat("\nDemoLines: %08x",Random2[DemoLines]());
msg.AppendFormat("\nFInTheChat: %08x",Random2[FInTheChat]());
msg.AppendFormat("\nFunTags: %08x",Random2[FunTags]());
msg.AppendFormat("\nhdscreen: %08x",Random2[hdscreen]());
msg.AppendFormat("\nHudStuff: %08x",Random2[HudStuff]());
msg.AppendFormat("\nInterArt: %08x",Random2[InterArt]());
msg.AppendFormat("\nScoreBits: %08x",Random2[ScoreBits]());
msg.AppendFormat("\nTUID: %08x",Random2[TUID]());
msg.AppendFormat("\nUIStuff: %08x",Random2[UIStuff]());
msg.AppendFormat("\nWallbusterMenu: %08x",Random2[WallbusterMenu]());
Console.Printf(msg);
return;
}
else if ( e.Name ~== "swwmdebugdlglines" )
{
if ( multiplayer && (e.player != Net_Arbitrator) )
{
if ( e.player == consoleplayer )
Console.Printf("Only the net arbitrator can call this event.");
return;
}
// checks that ALL dialogue text fits in 3 lines
String alldlg_pack = "SWWM_SAYAPHOBOS1:SWWM_SAYAPHOBOS2:SWWM_SAYAPHOBOS3:SWWM_SAYAPHOBOS4:SWWM_SAYADEIMOS1:SWWM_SAYADEIMOS2:SWWM_SAYADEIMOS3:SWWM_SAYADEIMOS4:SWWM_SAYADIS1:SWWM_SAYADIS2:SWWM_SAYADIS3:SWWM_SAYADIS4:SWWM_SAYATHY1:SWWM_SAYATHY2:SWWM_SAYATHY3:SWWM_SAYATHY4:SWWM_CYTHOSIGIL1:SWWM_CYTHOSIGIL2:SWWM_CYTHOSIGIL3:SWWM_CYTHOSIGIL4:SWWM_SAYADIMPLE1:SWWM_SAYADIMPLE2:SWWM_SAYADIMPLE3:SWWM_SAYADIMPLE4:SWWM_SAYADIMPLE5:SWWM_SAYACIRCLE1:SWWM_SAYACIRCLE2:SWWM_SAYACIRCLE3:SWWM_SAYACIRCLE4:SWWM_SAYACIRCLE5:SWWM_SAYAGOTCHA1:SWWM_SAYAGOTCHA2:SWWM_SAYAGOTCHA3:SWWM_SAYAGOTCHA4:SWWM_SAYAGOTCHA5:SWWM_SAYAGOTCHAEND1:SWWM_SAYAGOTCHAEND2:SWWM_SAYAGOTCHAEND3:SWWM_SAYAGOTCHAEND4:SWWM_SAYAGOTCHAEND5:SWWM_SAYAIOS1:SWWM_SAYAIOS2:SWWM_SAYAIOS3:SWWM_SAYAIOS4:SWWM_SAYAIOS5:SWWM_SAYARAMPANCY1:SWWM_SAYARAMPANCY2:SWWM_SAYARAMPANCY3:SWWM_SAYARAMPANCY4:SWWM_CYTHONERVE1:SWWM_CYTHONERVE2:SWWM_CYTHONERVE3:SWWM_CYTHONERVE4:SWWM_CYTHONERVE5:SWWM_SAYAEVIA1:SWWM_SAYAEVIA2:SWWM_SAYAEVIA3:SWWM_SAYAEVIA4:SWWM_SAYAEVIB1:SWWM_SAYAEVIB2:SWWM_SAYAMAW1:SWWM_SAYAMAW2:SWWM_SAYAMAW3:SWWM_SAYAMAW4:SWWM_SAYAMAW5:SWWM_SAYAMASTERS1:SWWM_SAYAMASTERS2:SWWM_SAYAMASTERS3:SWWM_SAYAMASTERS4:SWWM_SAYAMASTERS5:SWWM_SAYADSPARIL1:SWWM_SAYADSPARIL2:SWWM_SAYADSPARIL3:SWWM_SAYADSPARIL4:SWWM_SAYADSPARIL5:SWWM_SAYAHEADS1:SWWM_SAYAHEADS2:SWWM_SAYAHEADS3:SWWM_SAYAHEADS4:SWWM_SAYAHEADS5:SWWM_SAYAHEADS6:SWWM_SAYABULLS1:SWWM_SAYABULLS2:SWWM_SAYABULLS3:SWWM_SAYABULLS4:SWWM_SAYABULLS5:SWWM_SAYAGREETA1:SWWM_SAYAGREETA2:SWWM_SAYAGREETA3:SWWM_SAYAGREETB1:SWWM_SAYAGREETC1:SWWM_SAYAGREETD1:SWWM_SAYAGREETE1:SWWM_SAYAGREETF1:SWWM_SAYABLOODA1:SWWM_SAYABLOODA2:SWWM_SAYABLOODB1:SWWM_SAYABLOODC1:SWWM_SAYABLOODD1:SWWM_SAYAHYPO1:SWWM_SAYAHYPO2:SWWM_SAYAHYPO3:SWWM_SAYAHYPO4:SWWM_KIRINWORSHIPA1:SWWM_KIRINWORSHIPB1:SWWM_KIRINWORSHIPC1:SWWM_KIRINWORSHIPD1:SWWM_KIRINWORSHIPD2:SWWM_SAYAGAMEA1:SWWM_SAYAGAMEA2:SWWM_SAYAGAMEB1:SWWM_SAYAGAMEC1:SWWM_SAYAMASTERSA1:SWWM_SAYAMASTERSA2:SWWM_SAYAMASTERSB1:SWWM_SAYAMASTERSC1:SWWM_SAYAMASTERSD1:SWWM_SAYAMASTERSE1:SWWM_SAYAMASTERSF1:SWWM_SAYAFIGHTER1:SWWM_SAYAFIGHTER2:SWWM_SAYACLERICA1:SWWM_SAYACLERICA2:SWWM_SAYACLERICB1:SWWM_SAYACLERICC1:SWWM_SAYACLERICC2:SWWM_SAYAMAGE1:SWWM_SAYAMAGE2:SWWM_SAYAMAGE3:SWWM_SAYAMAGE4:SWWM_SAYAKORAXA1:SWWM_SAYAKORAXB1:SWWM_SAYAKORAXC1:SWWM_SAYAKORAXD1:SWWM_SAYAKORAXE1:SWWM_SAYABLIGHTA1:SWWM_SAYABLIGHTB1:SWWM_SAYABLIGHTC1:SWWM_SAYABLIGHTC2:SWWM_SAYACONSTABLEA1:SWWM_SAYACONSTABLEA2:SWWM_SAYACONSTABLEB1:SWWM_SAYACONSTABLEC1:SWWM_SAYACONSTABLED1:SWWM_SAYANAVEA1:SWWM_SAYANAVEA2:SWWM_SAYANAVEB1:SWWM_SAYANAVEC1:SWWM_SAYANAVED1:SWWM_SAYANAVEE1:SWWM_SAYANAVEF1:SWWM_SAYADEATHKINGS1:SWWM_KIRINPUZZLEA1:SWWM_KIRINPUZZLEA2:SWWM_KIRINPUZZLEB1:SWWM_KIRINPUZZLEC1:SWWM_KIRINPUZZLEC2:SWWM_KIRINPUZZLED1:SWWM_KIRINPUZZLED2:SWWM_KIRINPUZZLEE1:SWWM_KIRINPUZZLEE2:SWWM_KIRINPUZZLEF1:SWWM_KIRINPUZZLEF2:SWWM_KIRINPUZZLEF3:SWWM_KIRINPUZZLEG1:SWWM_KIRINPUZZLEH1:SWWM_KIRINPUZZLEI1:SWWM_KIRINPUZZLEI2:SWWM_KIRINPUZZLEJ1:SWWM_KIRINPUZZLEJ2:SWWM_KIRINPUZZLEK1:SWWM_KIRINPUZZLEL1:SWWM_KIRINPUZZLEM1:SWWM_KIRINPUZZLEN1:SWWM_KIRINPUZZLEO1:SWWM_KIRINPUZZLEP1:SWWM_KIRINPUZZLEQ1:SWWM_KIRINPUZZLER1:SWWM_KIRINPUZZLER2:SWWM_KIRINPUZZLER3:SWWM_KIRINPUZZLES1:SWWM_KIRINPUZZLET1:SWWM_KIRINPUZZLEU1:SWWM_ZNVTXT1:SWWM_ZNVTXT2:SWWM_ZNVTXT3:SWWM_ZNVTXT4:SWWM_ZNVTXT5";
Array<String> alldlg;
alldlg_pack.Split(alldlg,":");
let mSmallFont = Font.GetFont('TewiFont');
for ( int i=0; i<alldlg.Size(); i++ )
{
let l = mSmallFont.BreakLines(StringTable.Localize(alldlg[i],false),220);
if ( l.Count() > 3 ) Console.Printf("\cg%s exceeds line limit (%d > 3)\c-",alldlg[i],l.Count());
else
{
if ( !e.Args[0] )
{
l.Destroy();
continue;
}
Console.Printf("\cd%s is within line limit (%d <= 3)\c-",alldlg[i],l.Count());
}
for ( int j=0; j<l.Count(); j++ ) Console.Printf("> %s",l.StringAt(j));
l.Destroy();
}
return;
}
else if ( e.Name ~== "swwmprofilehandler" )
{
if ( multiplayer && (e.player != Net_Arbitrator) )

View file

@ -164,7 +164,6 @@ Class SWWMStats : SWWMStaticThinker
if ( inflictor && inflictor.FindInventory("ParriedBuff") ) which = 'DoomWeapon'; // gross hack
// properly credit some projectiles to their respective gun
else if ( inflictor is 'AirBullet' ) which = 'DeepImpact';
else if ( inflictor is 'PusherProjectile' ) which = 'PusherWeapon';
else if ( (inflictor is 'ExplodiumMagArm') || (inflictor is 'ExplodiumMagProj') || (inflictor is 'ExplodiumBulletImpact') ) which = 'ExplodiumGun';
else if ( (inflictor is 'DragonBreathArm') || ((inflictor is 'SaltImpact') && !inflictor.Args[0]) || ((inflictor is 'SaltBeam') && !inflictor.Args[1]) || (inflictor is 'CorrodeDebuff') || (inflictor is 'CorrosiveFlechette') || ((inflictor is 'TheBall') && !inflictor.special1) || (inflictor is 'GoldenImpact') || (inflictor is 'GoldenSubImpact') || (inflictor is 'GoldenSubSubImpact') ) which = 'Spreadgun';
else if ( ((inflictor is 'SaltImpact') && inflictor.Args[0]) || ((inflictor is 'SaltBeam') && inflictor.Args[1]) || ((inflictor is 'TheBall') && inflictor.special1) ) which = 'Wallbuster';

View file

@ -1356,7 +1356,6 @@ Class SWWMUtility
{
if ( !a.bMISSILE ) return false;
if ( a is 'AirBullet' ) return true;
if ( a is 'PusherProjectile' ) return true;
if ( a is 'ExplodiumMagProj' ) return true;
if ( a is 'CorrosiveFlechette' ) return true;
if ( a is 'TheBall' ) return true;
@ -2112,19 +2111,13 @@ Class SWWMUtility
return Random[Replacements](0,1)?a:b;
}
// melee weapons + extra slot 2 guns (50% chance)
// melee weapon + extra slot 2 guns
static Class<Weapon> PickSWWMSlot1()
{
// so the player can recover it if they decided to drop it in a previous map, or they didn't start with it
if ( CheckNeedsItem('DeepImpact') ) return 'DeepImpact';
bool hasmelee = (!CheckNeedsItem('PusherWeapon')||!CheckNeedsItem('ItamexHammer'));
bool hasallmelee = (!CheckNeedsItem('PusherWeapon')&&!CheckNeedsItem('ItamexHammer'));
bool gunexists = ItemExists('ExplodiumGun',worldonly:true)||ItemExists('PlasmaBlast',worldonly:true);
// if the player already has a melee weapon, 50% chance to spawn either slot 2 weapon as long as one doesn't exist in the map already
// if the player has ALL melee weapons (somehow), that chance becomes 100%
if ( hasmelee && !gunexists && (hasallmelee || Random[Replacements](0,1)) )
return PickSWWMSlot2();
return PickPair('PusherWeapon','ItamexHammer');
if ( CheckNeedsItem('ItamexHammer') ) return 'ItamexHammer';
return PickSWWMSlot2();
}
// pistol spawn, pretty simple
static Class<Weapon> PickSWWMSlot2()
@ -2164,7 +2157,7 @@ Class SWWMUtility
// second plasma rifle spawn
static Class<Weapon> PickSWWMSlot8()
{
return PickPair('SilverBullet','MisterRifle');
return PickPair('SilverBullet','RayKhom');
}
// first bfg spawn
static Class<Weapon> PickSWWMSlot9()
@ -2172,7 +2165,7 @@ Class SWWMUtility
// 33% chance to still drop another candy gun if it's not at max capacity
if ( !Random[Replacements](0,2) && ItemExists('CandyGun') && CheckNeedsItem('CandyGunSpares',true) )
return 'CandyGun';
return PickPair('CandyGun','RayKhom');
return PickPair('CandyGun','MisterRifle');
}
// second bfg spawn (each weapon can only exist once)
static Class<Weapon> PickSWWMSlot0( bool fallback = true )
@ -2191,7 +2184,7 @@ Class SWWMUtility
static Class<Weapon> PickDoomSlot6()
{
bool hasslot7 = (!CheckNeedsItem('Sparkster')||!CheckNeedsItem('ModernSparkster'));
bool hasslot8 = (!CheckNeedsItem('SilverBullet')||!CheckNeedsItem('MisterRifle'));
bool hasslot8 = (!CheckNeedsItem('SilverBullet')||!CheckNeedsItem('RayKhom'));
// if the player already has a slot 7 weapon...
if ( hasslot7 )
{
@ -2206,7 +2199,7 @@ Class SWWMUtility
// either bfg spawn
static Class<Weapon> PickDoomSlot7()
{
bool hasslot9 = (!CheckNeedsItem('CandyGun')||!CheckNeedsItem('RayKhom'));
bool hasslot9 = (!CheckNeedsItem('CandyGun')||!CheckNeedsItem('MisterRifle'));
bool hasslot0 = (!CheckNeedsItem('Ynykron')||!CheckNeedsItem('RafanKos'));
let rep = PickSWWMSlot0(false);
// if the player already has a slot 9 weapon (and a slot 0 weapon can still spawn)...

View file

@ -258,7 +258,7 @@ Class BigPunchImpact : Actor
{
Super.PostBeginPlay();
A_QuakeEx(8,8,8,18,0,600,"",QF_RELATIVE|QF_SCALEDOWN,falloff:200,rollIntensity:.9);
A_StartSound("pusher/althit",CHAN_VOICE,CHANF_DEFAULT,bAMBUSH?.6:1.);
A_StartSound("demolitionist/xpunch",CHAN_VOICE,CHANF_DEFAULT,bAMBUSH?.6:1.);
A_SprayDecal("BigWallCrack",-20);
int numpt = Random[Ponch](9,16);
if ( bAMBUSH ) numpt /= 3;

View file

@ -457,8 +457,8 @@ extend Class SWWMWeapon
A_QuakeEx(quakin/2,quakin/2,quakin/2,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.06*quakin);
if ( raging && !(flags&MELEE_ForceSound) )
{
if ( blooded ) A_StartSound("pusher/altmeat",CHAN_WEAPON,CHANF_OVERLAP);
if ( bloodless ) A_StartSound("pusher/althit",CHAN_WEAPON,CHANF_OVERLAP);
if ( blooded ) A_StartSound("demolitionist/xpunchf",CHAN_WEAPON,CHANF_OVERLAP);
if ( bloodless ) A_StartSound("demolitionist/xpunch",CHAN_WEAPON,CHANF_OVERLAP);
}
else if ( hitsound == "" )
{
@ -546,7 +546,7 @@ extend Class SWWMWeapon
int quakin = raging?4:1;
A_QuakeEx(quakin,quakin,quakin,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.12*quakin);
A_BumpFOV(.98);
A_StartSound((raging&&!(flags&MELEE_ForceSound))?"pusher/althit":(hitsound!="")?hitsound:"demolitionist/punch",CHAN_WEAPON,CHANF_OVERLAP);
A_StartSound((raging&&!(flags&MELEE_ForceSound))?"demolitionist/xpunch":(hitsound!="")?hitsound:"demolitionist/punch",CHAN_WEAPON,CHANF_OVERLAP);
A_AlertMonsters(swwm_uncapalert?0:100);
if ( raging ) raging.DoHitFX();
if ( (flags&MELEE_ForceBust) || swwm_omnibust ) BusterWall.BustLinetrace(d,raging?(dmg*8):dmg,self,d.HitDir,d.HitLocation.z);

View file

@ -1,410 +0,0 @@
// Tach-Engine Technologies Microfusion Rotary Hammer aka "Pusher" (planned for unreleased Zanaveth Ultra Suite 2)
// Slot 1, replaces Chainsaw, Gauntlets, Timon's Axe
Class PusherWeapon : SWWMWeapon
{
double chargelevel, vibe;
int hitcnt;
transient ui TextureID WeaponBox, ChargeBar;
transient ui DynamicValueInterpolator ChargeInter;
override void DrawWeapon( double TicFrac, double bx, double by, double hs, Vector2 ss )
{
if ( !WeaponBox ) WeaponBox = TexMan.CheckForTexture("graphics/HUD/PusherDisplay.png",TexMan.Type_Any);
if ( !ChargeBar ) ChargeBar = TexMan.CheckForTexture("graphics/HUD/PusherBar.png",TexMan.Type_Any);
Screen.DrawTexture(WeaponBox,false,bx-60,by-9,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
int chg = clamp(ChargeInter?ChargeInter.GetValue():int(chargelevel*100),0,100);
double cw = chg*56./100.;
Screen.DrawTexture(ChargeBar,false,bx-58,by-7,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_WindowRightF,cw);
}
override void HudTick()
{
Super.HudTick();
if ( !ChargeInter ) ChargeInter = DynamicValueInterpolator.Create(int(chargelevel*100),.5,1,50);
ChargeInter.Update(int(chargelevel*100));
}
override bool ReportHUDAmmo()
{
return true;
}
override Vector3 GetTraceOffset()
{
return (10.,2.,-3.5);
}
action void A_PusherDrill()
{
invoker.chargelevel = clamp(invoker.chargelevel+FRandom[Pusher](-.04,.08),.3,1.);
A_QuakeEx(1,1,1,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.5);
A_WeaponOffset(FRandom[Pusher](-1,1)*2,32+FRandom[Pusher](-1,1)*2);
A_BumpFOV(1.01);
A_Recoil(-cos(pitch));
Vector3 x, y, z;
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+2*y-3.5*z);
FLineTraceData d;
LineTrace(angle,60,pitch,TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
SWWMBulletTrail.DoTrail(self,origin,x,60,0);
if ( d.HitType != TRACE_HitNone )
{
A_QuakeEx(2,2,2,7,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.8);
A_AlertMonsters(swwm_uncapalert?0:1200);
int dmg = int(4+invoker.chargelevel*8);
if ( invoker.chargelevel > .4 ) invoker.chargelevel -= FRandom[Pusher](.01,.03);
if ( d.HitType == TRACE_HitActor )
{
double diff = deltaangle(self.angle,AngleTo(d.HitActor));
self.angle += clamp(diff,-5.,5.);
SWWMUtility.DoKnockback(d.HitActor,d.HitDir,8500);
d.HitActor.A_QuakeEx(3,3,3,10,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.1);
let p = SWWMPuff.Setup(d.HitLocation,d.HitDir,invoker,self,d.HitActor);
dmg = d.HitActor.DamageMobj(p,self,dmg,'Tenderize',DMG_THRUSTLESS|DMG_INFLICTOR_IS_PUFF);
if ( d.HitActor.bNOBLOOD || d.HitActor.bDORMANT || d.HitActor.bINVULNERABLE )
{
let p = Spawn("PusherImpact",d.HitLocation-d.HitDir*4);
p.angle = atan2(-d.HitDir.y,-d.HitDir.x);
p.pitch = asin(d.HitDir.z);
}
else
{
d.HitActor.TraceBleed(dmg,invoker);
d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg);
d.HitActor.A_StartSound("pusher/meat",CHAN_DAMAGE,CHANF_OVERLAP);
}
// move towards target (unless we're standing on it)
if ( !(self is 'Demolitionist') || (Demolitionist(self).oldencroached != d.HitActor) )
bJUSTATTACKED = true;
}
else
{
Vector3 HitNormal = -d.HitDir;
if ( d.HitType == TRACE_HitFloor )
{
if ( d.Hit3DFloor ) HitNormal = -d.Hit3DFloor.top.Normal;
else HitNormal = d.HitSector.floorplane.Normal;
}
else if ( d.HitType == TRACE_HitCeiling )
{
if ( d.Hit3DFloor ) HitNormal = -d.Hit3DFloor.bottom.Normal;
else HitNormal = d.HitSector.ceilingplane.Normal;
}
else if ( d.HitType == TRACE_HitWall )
{
HitNormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit();
if ( !d.LineSide ) HitNormal *= -1;
d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation+HitNormal*4);
}
let p = Spawn("PusherImpact",d.HitLocation+HitNormal*4);
p.angle = atan2(HitNormal.y,HitNormal.x);
p.pitch = asin(-HitNormal.z);
if ( d.HitType == TRACE_HitFloor ) p.CheckSplash(40);
if ( waterlevel > 2 ) SWWMUtility.DoKnockback(self,-x,30000);
}
if ( swwm_omnibust ) BusterWall.BustLinetrace(d,dmg,self,d.HitDir,d.HitLocation.z);
}
else if ( waterlevel > 2 ) SWWMUtility.DoKnockback(self,-x,50000);
if ( swwm_extraalert || !(invoker.hitcnt%20) ) A_AlertMonsters(swwm_uncapalert?0:500);
invoker.hitcnt++;
}
action void A_PusherAlt()
{
A_StopSound(CHAN_WEAPON);
if ( IsActorPlayingSound(CHAN_WEAPONEXTRA,"pusher/motor") )
A_StartSound("pusher/motorend",CHAN_WEAPONEXTRA,CHANF_DEFAULT,pitch:1.5);
A_StartSound("pusher/stop",CHAN_WEAPON,CHANF_OVERLAP);
A_StartSound("pusher/altfire",CHAN_WEAPON,CHANF_OVERLAP);
A_BumpFOV(1.+invoker.chargelevel*.2);
A_Recoil(-(2.+4.*invoker.chargelevel)*cos(pitch));
A_QuakeEx(2+int(invoker.chargelevel*2),2+int(invoker.chargelevel*2),2+int(invoker.chargelevel*2),3+int(invoker.chargelevel*6),0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.3+invoker.chargelevel*.7);
A_WeaponOffset(0,32);
A_Overlay(-9999,null);
A_PlayerFire();
Vector3 x, y, z;
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+2*y-3.5*z);
FLineTraceData d;
LineTrace(angle,80,pitch,TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
SWWMBulletTrail.DoTrail(self,origin,x,80,0);
bool gone = false;
if ( d.HitType != TRACE_HitNone )
{
A_QuakeEx(8,8,8,12,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.8);
A_AlertMonsters(swwm_uncapalert?0:1600);
int dmg = int(240*invoker.chargelevel);
if ( d.HitType == TRACE_HitActor )
{
double diff = deltaangle(self.angle,AngleTo(d.HitActor));
self.angle += clamp(diff,-5.,5.);
SWWMUtility.DoKnockback(d.HitActor,d.HitDir,85000);
d.HitActor.A_QuakeEx(9,9,9,15,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.1);
let p = SWWMPuff.Setup(d.HitLocation,d.HitDir,invoker,self,d.HitActor);
dmg = d.HitActor.DamageMobj(p,self,dmg,'Tenderize',DMG_THRUSTLESS|DMG_INFLICTOR_IS_PUFF);
if ( d.HitActor.bNOBLOOD || d.HitActor.bDORMANT || d.HitActor.bINVULNERABLE )
{
let p = Spawn("BigPusherImpact",d.HitLocation-d.HitDir*4);
p.angle = atan2(-d.HitDir.y,-d.HitDir.x);
p.pitch = asin(d.HitDir.z);
}
else
{
d.HitActor.TraceBleed(dmg,invoker);
d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg);
d.HitActor.A_StartSound("pusher/altmeat",CHAN_DAMAGE,CHANF_OVERLAP);
}
}
else
{
Vector3 HitNormal = -d.HitDir;
if ( d.HitType == TRACE_HitFloor )
{
if ( d.Hit3DFloor ) HitNormal = -d.Hit3DFloor.top.Normal;
else HitNormal = d.HitSector.floorplane.Normal;
}
else if ( d.HitType == TRACE_HitCeiling )
{
if ( d.Hit3DFloor ) HitNormal = -d.Hit3DFloor.bottom.Normal;
else HitNormal = d.HitSector.ceilingplane.Normal;
}
else if ( d.HitType == TRACE_HitWall )
{
HitNormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit();
if ( !d.LineSide ) HitNormal *= -1;
d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation+HitNormal*4);
}
let p = Spawn("BigPusherImpact",d.HitLocation+HitNormal*4);
p.angle = atan2(HitNormal.y,HitNormal.x);
p.pitch = asin(-HitNormal.z);
if ( d.HitType == TRACE_HitFloor ) p.CheckSplash(40);
}
if ( swwm_omnibust ) BusterWall.BustLinetrace(d,dmg,self,d.HitDir,d.HitLocation.z);
}
else if ( !Random[Pusher](0,3-int(invoker.chargelevel*3)) )
{
// didn't hit anything, randomly slip off
player.SetPSprite(PSP_WEAPON,ResolveState("AltMiss"));
invoker.bNODEATHDESELECT = true; // prevent any glitching that could happen if the sequence is interrupted
A_StopSound(CHAN_WEAPON);
A_StopSound(CHAN_WEAPONEXTRA);
A_StartSound("pusher/miss",CHAN_WEAPON,CHANF_OVERLAP);
let p = Spawn("PusherProjectile",origin);
p.angle = angle;
p.pitch = pitch;
p.vel = x*p.speed*invoker.chargelevel;
p.target = self;
SWWMUtility.DoKnockback(self,x,85000.);
}
A_AlertMonsters(swwm_uncapalert?0:1200);
invoker.chargelevel = 0.;
}
action void A_BeginCharge()
{
invoker.chargelevel = invoker.vibe = 0.;
A_WeaponOffset(0,32);
A_QuakeEx(1,1,1,33,0,1,"",QF_RELATIVE|QF_SCALEUP,rollIntensity:.5);
A_Overlay(-9999,"Dummy");
}
action void A_ChargeUp()
{
invoker.chargelevel = min(1.,invoker.chargelevel+.025);
if ( invoker.chargelevel >= .5 ) invoker.vibe = min(1.,invoker.vibe+.02);
A_WeaponOffset(FRandom[Pusher](-1,1)*(invoker.chargelevel-invoker.vibe),32+FRandom[Pusher](-1,1)*(invoker.chargelevel-invoker.vibe));
if ( !(player.cmd.buttons&BT_ALTATTACK) && (invoker.chargelevel > .3) )
player.SetPSprite(PSP_WEAPON,ResolveState("AltRelease"));
}
override void MarkPrecacheSounds()
{
Super.MarkPrecacheSounds();
MarkSound("pusher/select");
MarkSound("pusher/deselect");
MarkSound("pusher/motor");
MarkSound("pusher/motorend");
MarkSound("pusher/start");
MarkSound("pusher/drill");
MarkSound("pusher/hit1");
MarkSound("pusher/hit2");
MarkSound("pusher/hit3");
MarkSound("pusher/meat1");
MarkSound("pusher/meat2");
MarkSound("pusher/meat3");
MarkSound("pusher/end");
MarkSound("pusher/checkout");
MarkSound("pusher/pullback");
MarkSound("pusher/altfire1");
MarkSound("pusher/altfire2");
MarkSound("pusher/miss");
MarkSound("pusher/althit1");
MarkSound("pusher/althit2");
MarkSound("pusher/altmeat1");
MarkSound("pusher/altmeat2");
MarkSound("pusher/fly");
MarkSound("pusher/bounce1");
MarkSound("pusher/bounce2");
MarkSound("pusher/bounce3");
}
Default
{
//$Title Pusher
//$Group Weapons
//$Sprite graphics/HUD/Icons/W_Pusher.png
//$Icon weapon
Tag "$T_PUSHER";
Inventory.PickupMessage "$I_PUSHER";
Obituary "$O_PUSHER";
SWWMWeapon.Tooltip "$TT_PUSHER";
SWWMWeapon.GetLine "getpusherweapon";
Inventory.Icon "graphics/HUD/Icons/W_Pusher.png";
Weapon.UpSound "pusher/select";
Weapon.SlotNumber 1;
Weapon.SlotPriority 2.;
Weapon.SelectionOrder 1500;
Stamina 10000;
+WEAPON.MELEEWEAPON;
//+WEAPON.NOAUTOSWITCHTO;
Radius 20;
Height 32;
}
States
{
Spawn:
XZW1 A -1;
Stop;
Select:
XZW2 G 2 A_FullRaise();
XZW2 HIJKL 2;
Goto Ready;
Ready:
XZW2 A 1 A_WeaponReady(WRF_ALLOWRELOAD|WRF_ALLOWZOOM|WRF_ALLOWUSER1);
Wait;
Fire:
XZW2 A 2
{
A_WeaponOffset(0,32);
invoker.chargelevel = .2;
invoker.hitcnt = 0;
A_StartSound("pusher/start",CHAN_WEAPON,CHANF_OVERLAP);
A_StartSound("pusher/motor",CHAN_WEAPONEXTRA,CHANF_LOOP,pitch:1.5);
}
XZW2 M 2;
XZW2 N 0 A_StartSound("pusher/drill",CHAN_WEAPONEXTRA2,CHANF_LOOP);
Hold:
XZW2 N 1
{
A_WeaponOffset(FRandom[Pusher](-1,1),32+FRandom[Pusher](-1,1));
A_Recoil(cos(pitch));
}
XZW2 O 1 A_PusherDrill();
XZW2 P 1
{
A_WeaponOffset(FRandom[Pusher](-1,1),32+FRandom[Pusher](-1,1));
A_Recoil(cos(pitch));
}
XZW2 Q 1 A_PusherDrill();
XZW2 R 1
{
A_WeaponOffset(FRandom[Pusher](-1,1),32+FRandom[Pusher](-1,1));
A_Recoil(cos(pitch));
}
XZW2 S 1 A_PusherDrill();
XZW2 N 2
{
if ( player.cmd.buttons&BT_ATTACK )
return ResolveState("Hold");
invoker.chargelevel *= .4;
A_Recoil(.5*cos(pitch));
A_ClearRefire();
A_WeaponOffset(0,32);
A_StopSound(CHAN_WEAPONEXTRA2);
A_StartSound("pusher/stop",CHAN_WEAPON,CHANF_OVERLAP);
A_StartSound("pusher/motorend",CHAN_WEAPONEXTRA,CHANF_DEFAULT,pitch:1.5);
return ResolveState(null);
}
XZW2 T 2 { invoker.chargelevel = 0.; }
Goto Ready;
Dummy:
TNT1 A 1 A_ChargeUp();
Wait;
AltFire:
XZW2 A 2
{
A_StartSound("pusher/start",CHAN_WEAPON,CHANF_OVERLAP);
A_StartSound("pusher/motor",CHAN_WEAPONEXTRA,CHANF_LOOP,pitch:1.5);
A_StartSound("pusher/pullback",CHAN_WEAPON,CHANF_OVERLAP);
}
XZW2 UVW 2;
XZW2 X 0 A_BeginCharge();
XZW2 XYZ 3;
XZW3 ABCDEFG 3;
XZW3 H 0
{
A_QuakeEx(1,1,1,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.5);
A_StartSound("pusher/motorend",CHAN_WEAPONEXTRA,CHANF_DEFAULT,pitch:1.5);
}
XZW3 H 3;
Wait;
AltRelease:
#### # 1 A_PusherAlt();
XZW5 R 2;
XZW3 IJKL 2;
XZW3 MNOP 3;
Goto Ready;
AltMiss:
XZW3 QRSTUVW 1;
TNT1 A -1
{
invoker.bNODEATHDESELECT = false;
let nw = player.mo.PickNextWeapon();
// gross hack (don't prioritize Deep Impact if we have something better than it)
if ( nw is 'DeepImpact' )
{
player.ReadyWeapon = nw;
nw = player.mo.PickNextWeapon();
player.ReadyWeapon = invoker;
}
if ( nw != invoker ) player.PendingWeapon = nw;
RemoveInventory(invoker);
invoker.Destroy();
}
Stop;
Reload:
Zoom:
XZW2 A 2
{
A_StartSound("pusher/checkout",CHAN_WEAPON,CHANF_OVERLAP);
A_PlayerCheckGun();
}
XZW3 XYZ 2;
XZW4 ABCDEFGHIJKLMNOPQR 2;
XZW4 STUVWXYZ 3;
Goto Ready;
User1:
XZW2 A 2
{
A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
A_PlayerMelee();
}
XZW5 ABC 2;
XZW5 D 1 A_Parry(9);
XZW5 EFGH 1;
XZW5 I 0 A_Melee(70,"demolitionist/whitl",1.1,1.2,1.2);
XZW5 IJ 2;
XZW5 K 2 { invoker.PlayUpSound(self); }
XZW5 LM 2;
XZW5 NOPQ 3;
Goto Ready;
Deselect:
XZW2 B 2 A_StartSound("pusher/deselect",CHAN_WEAPON,CHANF_OVERLAP);
XZW2 CDEF 2;
XZW2 F -1 A_FullLower();
Stop;
}
}

View file

@ -1,376 +0,0 @@
// Pusher projectiles and effects
Class PusherImpact : Actor
{
Default
{
Radius 0.1;
Height 0;
+NOGRAVITY;
+NOCLIP;
+NOTELEPORT;
+NOINTERACTION;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
A_QuakeEx(2,2,2,12,0,200,"",QF_RELATIVE|QF_SCALEDOWN,falloff:100,rollIntensity:.3);
A_StartSound("pusher/hit",CHAN_VOICE);
A_SprayDecal("WallCrack",-20);
int numpt = Random[Pusher](1,3);
Vector3 x = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch));
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (x+(FRandom[Pusher](-.8,.8),FRandom[Pusher](-.8,.8),FRandom[Pusher](-.8,.8))).unit()*FRandom[Pusher](.1,1.2);
let s = Spawn("SWWMSmoke",pos);
s.vel = pvel;
s.SetShade(Color(1,1,1)*Random[Pusher](128,192));
}
numpt = Random[Pusher](0,2);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[Pusher](-1,1),FRandom[Pusher](-1,1),FRandom[Pusher](-1,1)).unit()*FRandom[Pusher](2,8);
let s = Spawn("SWWMSpark",pos);
s.vel = pvel;
}
numpt = Random[Pusher](1,3);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[Pusher](-1,1),FRandom[Pusher](-1,1),FRandom[Pusher](-1,1)).unit()*FRandom[Pusher](2,8);
let s = Spawn("SWWMChip",pos);
s.vel = pvel;
}
Destroy();
}
}
Class BigPusherImpact : Actor
{
Default
{
Radius 0.1;
Height 0;
+NOGRAVITY;
+NOCLIP;
+NOTELEPORT;
+NOINTERACTION;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
A_QuakeEx(5,5,5,15,0,300,"",QF_RELATIVE|QF_SCALEDOWN,falloff:200,rollIntensity:.8);
A_StartSound("pusher/althit",CHAN_VOICE);
A_SprayDecal("ImpactMark",-20);
int numpt = Random[Pusher](8,16);
Vector3 x = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch));
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (x+(FRandom[Pusher](-.8,.8),FRandom[Pusher](-.8,.8),FRandom[Pusher](-.8,.8))).unit()*FRandom[Pusher](.8,2.6);
let s = Spawn("SWWMSmoke",pos);
s.vel = pvel;
s.SetShade(Color(1,1,1)*Random[Pusher](128,192));
}
numpt = Random[Pusher](4,10);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[Pusher](-1,1),FRandom[Pusher](-1,1),FRandom[Pusher](-1,1)).unit()*FRandom[Pusher](2,12);
let s = Spawn("SWWMSpark",pos);
s.vel = pvel;
}
numpt = Random[Pusher](8,20);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[Pusher](-1,1),FRandom[Pusher](-1,1),FRandom[Pusher](-1,1)).unit()*FRandom[Pusher](2,16);
let s = Spawn("SWWMChip",pos);
s.vel = pvel;
}
Destroy();
}
}
Class PusherProjectile : Actor
{
Vector3 oldvel;
double oldangle, oldpitch;
Actor lasthit;
int hittics;
bool bUsePickup;
Default
{
Obituary "$O_PUSHER";
Speed 50;
Radius 10;
Height 10;
DamageFunction clamp(int(4*vel.length()),0,200);
DamageType 'Tenderize';
BounceType "Hexen";
BounceFactor 1.0;
WallBounceFactor 1.0;
Gravity 0.3;
PROJECTILE;
+USEBOUNCESTATE;
+CANBOUNCEWATER;
+INTERPOLATEANGLES;
+DONTBOUNCEONSHOOTABLES;
-BOUNCEAUTOOFF;
+NODAMAGETHRUST;
-BOUNCEONUNRIPPABLES;
-ALLOWBOUNCEONACTORS;
+RIPPER;
-NOGRAVITY;
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
A_StartSound("pusher/fly",CHAN_BODY,CHANF_LOOP,1.,2.);
A_StartSound("pusher/altfire",CHAN_VOICE);
oldvel = vel;
oldangle = angle;
oldpitch = pitch;
}
void A_Reorient()
{
oldvel = vel;
oldangle = angle;
oldpitch = pitch;
if ( vel.length() <= 0. ) return;
Vector3 dir = vel.unit();
angle += clamp(deltaangle(angle,atan2(dir.y,dir.x)),-2,2);
pitch += clamp(deltaangle(pitch,asin(-dir.z)),-2,2);
// cancel if we hit a wall dead-on
FLineTraceData d;
LineTrace(oldangle,30,oldpitch,TRF_THRUACTORS|TRF_NOSKY,5,data:d);
if ( d.HitType != TRACE_HitNone )
{
angle = oldangle;
pitch = oldpitch;
ClearBounce();
special1 = 1;
ExplodeMissile(BlockingLine,BlockingMobj);
}
}
private bool HitSkyLine( Line l, int hitside )
{
if ( !l ) return false;
// if it's onesided, check if it's a Line_Horizon
if ( !l.sidedef[1] ) return (l.special == Line_Horizon);
Sector outs, ins;
if ( hitside )
{
ins = l.backsector;
outs = l.frontsector;
}
else
{
ins = l.frontsector;
outs = l.backsector;
}
// return true if we're in a sector with sky and we hit the upper part of the line
if ( ins.GetTexture(1) != skyflatnum ) return false;
return (outs.ceilingplane.ZAtPoint(pos.xy) <= pos.z);
}
void A_HandleBounce()
{
Vector3 HitNormal = -vel.unit();
F3DFloor ff;
int lineside = 1;
if ( BlockingFloor )
{
// find closest 3d floor for its normal
for ( int i=0; i<BlockingFloor.Get3DFloorCount(); i++ )
{
if ( !(BlockingFloor.Get3DFloor(i).flags&F3DFloor.FF_SOLID) ) continue;
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
for ( int i=0; i<BlockingCeiling.Get3DFloorCount(); i++ )
{
if ( !(BlockingCeiling.Get3DFloor(i).flags&F3DFloor.FF_SOLID) ) continue;
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;
}
else if ( BlockingLine )
{
HitNormal = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit();
if ( !SWWMUtility.PointOnLineSide(pos.xy,BlockingLine) )
{
lineside = 0;
HitNormal *= -1;
}
}
else if ( BlockingMobj )
{
Vector3 diff = level.Vec3Diff(pos,BlockingMobj.pos);
if ( (pos.x+radius) <= (BlockingMobj.pos.x-BlockingMobj.radius) )
HitNormal = (-1,0,0);
else if ( (pos.x-radius) >= (BlockingMobj.pos.x+BlockingMobj.radius) )
HitNormal = (1,0,0);
else if ( (pos.y+radius) <= (BlockingMobj.pos.y-BlockingMobj.radius) )
HitNormal = (0,-1,0);
else if ( (pos.y-radius) >= (BlockingMobj.pos.y+BlockingMobj.radius) )
HitNormal = (0,1,0);
else if ( pos.z >= (BlockingMobj.pos.z+BlockingMobj.height) )
HitNormal = (0,0,1);
else if ( (pos.z+height) <= BlockingMobj.pos.z )
HitNormal = (0,0,-1);
}
// undo the bounce, we need to hook in our own
angle = oldangle;
pitch = oldpitch;
vel = oldvel;
// try to guess if we hit the sky
if ( HitSkyLine(BlockingLine,lineside) || (BlockingCeiling && (ceilingpic == skyflatnum)) || (BlockingFloor && (floorpic == skyflatnum)) )
{
special1 = 0;
ExplodeMissile();
return;
}
// re-do the bounce with our formula
vel = .8*((vel dot HitNormal)*HitNormal*(-1.8+FRandom[Pusher](.0,.8))+vel);
A_StartSound("pusher/bounce",volume:.3);
A_AlertMonsters(swwm_uncapalert?0:300);
if ( vel.length() < 5 )
{
special1 = 0;
ExplodeMissile();
}
}
void A_BecomePickup()
{
if ( special1 )
{
// stuff from direct hit
FLineTraceData d;
LineTrace(angle,40,pitch,0,5,data:d);
Vector3 HitNormal = -d.HitDir;
if ( d.HitType == TRACE_HitFloor )
{
if ( d.Hit3DFloor ) HitNormal = -d.Hit3DFloor.top.Normal;
else HitNormal = d.HitSector.floorplane.Normal;
}
else if ( d.HitType == TRACE_HitCeiling )
{
if ( d.Hit3DFloor ) HitNormal = -d.Hit3DFloor.bottom.Normal;
else HitNormal = d.HitSector.ceilingplane.Normal;
}
else if ( d.HitType == TRACE_HitWall )
{
HitNormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit();
if ( !d.LineSide ) HitNormal *= -1;
}
let p = Spawn("BigPusherImpact",d.HitLocation+HitNormal*4);
p.angle = atan2(HitNormal.y,HitNormal.x);
p.pitch = asin(-HitNormal.z);
bool busted = false;
if ( swwm_omnibust )
{
if ( BusterWall.BustLinetrace(d,100,target,d.HitDir,d.HitLocation.z) )
busted = true;
}
if ( busted ) pitch = 0.;
else bNOGRAVITY = true;
}
else pitch = 0;
gravity = 1.;
ClearBounce();
bSPECIAL = true;
A_SetSize(20,16);
A_ChangeLinkFlags(0);
A_StopSound(CHAN_BODY);
}
override int DoSpecialDamage( Actor target, int damage, Name damagetype )
{
if ( target == lasthit ) return 0;
lasthit = target;
if ( target.bNOBLOOD || target.bDORMANT || target.bINVULNERABLE ) A_StartSound("pusher/althit",CHAN_WEAPON,CHANF_OVERLAP);
else A_StartSound("pusher/altmeat",CHAN_WEAPON,CHANF_OVERLAP);
target.A_QuakeEx(6,6,6,10,0,200,"",QF_RELATIVE|QF_SCALEDOWN,falloff:100,rollIntensity:.7);
SWWMUtility.DoKnockback(target,vel.unit(),85000);
return damage;
}
override void Touch( Actor toucher )
{
if ( toucher.player && swwm_usetopickup && !bUsePickup )
return;
// cannot pick up swapweapon unless explicitly pressing use
let pw = GetDefaultByType("PusherWeapon");
SWWMWeapon sw;
if ( swwm_swapweapons && (sw = pw.HasSwapWeapon(toucher)) )
{
if ( toucher.CheckLocalView() )
Console.MidPrint(SmallFont,String.Format(StringTable.Localize("$SWWM_SWAPWEAPON"),sw.GetTag(),StringTable.Localize("$T_PUSHER")));
return;
}
let w = toucher.FindInventory("PusherWeapon");
if ( toucher.player && w )
{
let psp = toucher.player.GetPSPrite(PSP_WEAPON);
if ( psp && psp.CurState.InStateSequence(w.FindState("AltMiss")) )
return;
}
if ( !toucher.player || !toucher.GiveInventory("PusherWeapon",1) ) return;
if ( toucher.CheckLocalView() )
{
toucher.A_StartSound("misc/w_pkup",CHAN_ITEM,CHANF_NOPAUSE|CHANF_MAYBE_LOCAL);
let w = toucher.FindInventory("PusherWeapon");
if ( w ) w.PrintPickupMessage(true,w.PickupMessage());
}
else toucher.A_StartSound("misc/w_pkup",CHAN_ITEM,CHANF_MAYBE_LOCAL);
toucher.A_SelectWeapon("PusherWeapon");
Spawn("SWWMRedPickupFlash",pos);
Destroy();
}
override bool Used( Actor user )
{
// test vertical range
Vector3 diff = level.Vec3Diff(user.Vec3Offset(0,0,user.Height/2),Vec3Offset(0,0,Height/2));
double rang = user.player?PlayerPawn(user.player.mo).UseRange:(user.Height/2);
if ( abs(diff.z) > rang ) return false;
// if the toucher owns our SwapWeapon, drop it before picking us up
let pw = GetDefaultByType("PusherWeapon");
SWWMWeapon sw;
if ( swwm_swapweapons && (sw = pw.HasSwapWeapon(user)) )
{
bool swapto = false;
if ( sw == user.player.ReadyWeapon ) swapto = true;
user.DropInventory(sw);
// don't autoswitch just yet (hacky)
if ( swapto )
{
user.player.ReadyWeapon = null;
user.player.PendingWeapon = WP_NOCHANGE;
}
}
bUsePickup = true;
Touch(user);
bUsePickup = false;
return bDestroyed;
}
States
{
Spawn:
XZW1 A 1 A_Reorient();
Wait;
Bounce:
XZW1 A 0 A_HandleBounce();
Goto Spawn;
Death:
XZW1 A 0 A_BecomePickup();
XZW1 A 1 A_JumpIf(pos.z<=floorz,1);
Wait;
XZW1 A -1 A_StartSound("pusher/bounce");
Stop;
}
}

View file

@ -1242,7 +1242,7 @@ Class TheBall : Actor
override void PostBeginPlay()
{
Super.PostBeginPlay();
A_StartSound("pusher/fly",CHAN_WEAPON,CHANF_LOOP,.6,3.,2.);
A_StartSound("spreadgun/ballfly",CHAN_WEAPON,CHANF_LOOP,.6,3.,2.);
heat = 1.;
}
override void Tick()