diff --git a/keyconf.txt b/keyconf.txt index 3efa6e89e..33959906d 100644 --- a/keyconf.txt +++ b/keyconf.txt @@ -1,10 +1,14 @@ addkeysection "$SWWM_KEYS" "SWWM_GZ" +alias "+walk" "netevent swwmsetwalk 1" +alias "-walk" "netevent swwmsetwalk 0" addmenukey "$SWWM_PRIMARYFIRE" "+attack" addmenukey "$SWWM_SECONDARYFIRE" "+altattack" addmenukey "$SWWM_RELOADFIRE" "+reload" addmenukey "$SWWM_ZOOMFIRE" "+zoom" addmenukey "$SWWM_EXTRAFIRE" "+user4" addmenukey "$SWWM_MELEE" "+user1" +addmenukey "$SWWM_WALK" "+walk" +addmenukey "$SWWM_SPRINT" "+speed" addmenukey "$SWWM_DASH" "+user2" addmenukey "$SWWM_ITEMSENSE" "+user3" addmenukey "$SWWM_GESTURE1" "netevent swwmgesture 0" @@ -20,6 +24,8 @@ defaultbind "r" "+reload" defaultbind "e" "+zoom" defaultbind "g" "+user4" defaultbind "f" "+user1" +defaultbind "ctrl" "+walk" +defaultbind "shift" "+speed" defaultbind "alt" "+user2" defaultbind "i" "+user3" defaultbind "h" "netevent swwmgesture 0" diff --git a/language.def_base b/language.def_base index 40ac6ed72..58037e563 100644 --- a/language.def_base +++ b/language.def_base @@ -735,7 +735,7 @@ SWWM_INTERTIP15 = "The Ragekit will greatly increase the strength of your melee SWWM_INTERTIP16 = "You can share items with other players in multiplayer using the trading tab in your Demolitionist menu. Items that won't fit in the destination inventory will not be traded."; SWWM_INTERTIP17 = "The Demolitionist Menu is very helpful, do not forget to bind a key to open it."; SWWM_INTERTIP18 = "All weapons have a quick melee attack available through a dedicated button. With one-handed weapons you will perform a punch, and with two-handed ones a bash."; -SWWM_INTERTIP19 = "With the right combination of dashing, boosting and wall jumping, it is perfectly possible to remain in the air for extended periods of time."; +SWWM_INTERTIP19 = "With the right combination of boosting and wall jumping, it is perfectly possible to remain in the air for extended periods of time."; SWWM_INTERTIP20 = "In multiplayer, any keys you pick up will be immediately shared with other players."; SWWM_INTERTIP21 = "Aim for a high score! The more enemies you kill the better. Don't forget to put that cash to use at the in-game store when you can."; SWWM_INTERTIP22 = "With proper timing, you can use your quick melee attack to deflect projectiles. It is even possible to return these to the sender, with increased damage if you're under the effects of a Ragekit."; diff --git a/language.def_menu b/language.def_menu index 41b30c620..a245a8f1f 100644 --- a/language.def_menu +++ b/language.def_menu @@ -6,6 +6,8 @@ SWWM_SECONDARYFIRE = "Secondary Fire"; SWWM_RELOADFIRE = "Reload"; SWWM_ZOOMFIRE = "Tertiary Fire / Zoom"; SWWM_MELEE = "Melee Attack"; +SWWM_WALK = "Walk"; +SWWM_SPRINT = "Sprint"; SWWM_DASH = "Dash"; SWWM_ITEMSENSE = "Item Sense"; SWWM_EXTRAFIRE = "Quick Grenade"; diff --git a/language.es_base b/language.es_base index ad1d71377..3243db92b 100644 --- a/language.es_base +++ b/language.es_base @@ -635,12 +635,12 @@ SWWM_INTERTIP15 = "El Ragekit potenciará enormemente la fuerza de tus ataques a SWWM_INTERTIP16 = "Puedes compartir ítems con otros en multijugador en la pestaña de intercambio de tu Menú de Demolicionista. Los ítems que no quepan en su inventario no serán intercambiados."; SWWM_INTERTIP17 = "El Menú de Demolicionista es muy útil, no te olvides de asignar una tecla para abrirlo."; SWWM_INTERTIP18 = "Todas las armas tienen un ataque rápido a melé disponible a través de un botón dedicado. Con armas a una mano darás un puñetazo, con armas a dos manos golpearás con ellas."; -SWWM_INTERTIP19 = "Con la combinación adecuada de esprintar, impulsar, y saltar por las paredes, es perfectamente posible mantenerse en el aire durante largos periodos de tiempo."; +SWWM_INTERTIP19 = "Con la combinación adecuada de impulsar y saltar por las paredes, es perfectamente posible mantenerse en el aire durante largos periodos de tiempo."; SWWM_INTERTIP20 = "En multijugador, cualquier llave que recojas será compartida inmediatemente con otros jugadores."; SWWM_INTERTIP21 = "¡Aumenta tu puntuación! Cuantos más enemigos elimines, mejor. No te olvides de hacer uso de esos puntos en la tienda in-game cuando puedas."; SWWM_INTERTIP22 = "Con el ritmo adecuado, puedes usar el ataque rápido a melé para desviar proyectiles. Incluso es posible mandarlas de vuelta a su dueño, con daño incrementado si te encuentras bajo los efectos de un Ragekit."; SWWM_INTERTIP23 = "¿Sabías que Saya realmente odia la UAC?\n\n¿Que? ¿Ya sabías eso? Vaya, pues entonces ya no se me ocurre que otra cosa contarte."; -SWWM_INTERTIP24 = "Puedes esprintar contra enemigos para empujarlos fuera de tu camino. Los más débiles puede que mueran inmediatamente por el impacto y salgan volando."; +SWWM_INTERTIP24 = "Puedes embestir contra enemigos para empujarlos fuera de tu camino. Los más débiles puede que mueran inmediatamente por el impacto y salgan volando."; SWWM_INTERTIP25 = "Si haces un sprint en el aire apuntando directamente al suelo, puede que aterrices con la fuerza suficiente para causar una onda de choque, apartando a la mayoría de enemigos a tu alrededor."; SWWM_INTERTIP26 = "Puedes activar objetos y abrir puertas a puñetazos. Esto también se puede hacer con la munición de Bola de Plomo del Trabuco, a excepción de los botones de salida."; SWWM_INTERTIP27 = "Los efectos corrosivos de los Cartuchos Negros del Trabuco pueden acoplarse, hasta un grado letal si alcanzas un objetivo de lleno. Además de eso, otros objetivos cercanos puede que también noten cierto dolor extra de los humos nocivos que se desprenderán, y dispersen sus efectos incluso más allá."; @@ -649,8 +649,8 @@ SWWM_INTERTIP29 = "El amor es lo más poderoso que existe en el mundo. No odies SWWM_INTERTIP30 = "El Silver Bullet dispara con una fuerza tal que sus balas liberan ondas de choque al atravesar el aire (y los enemigos), causando daño adicional. También puede atravesar algunas paredes."; SWWM_INTERTIP31 = "Al tumbarte con el Silver Bullet se desacoplarán los compensadores de retroceso, librándote de su calor dañino, a costa de movilidad."; SWWM_INTERTIP32 = "Los maravillantes efectos del Sandwich de Queso a la Parrilla te permiten sobrevivir básicamente cualquier cosa al autoactivarse. ¡Incluyendo hasta la de otra forma inevitable destrucción del Artefacto Ynykron!"; -SWWM_INTERTIP33 = "Si puedes alinearte correctamente, esprintar hacia atrás hará que los enemigos reciban daño triple, debido a ciertas características de tu chasis.\n\n(Sí, me refiero a ese brillante y metálico trasero)"; -SWWM_INTERTIP34 = "Bajo los efectos de un Ragekit, tu daño al esprintar será amplificado hasta un nivel tal que puedes incluso atravesar limpiamente puertas y otros obstáculos por el camino."; +SWWM_INTERTIP33 = "Si puedes alinearte correctamente, embestir hacia atrás hará que los enemigos reciban daño triple, debido a ciertas características de tu chasis.\n\n(Sí, me refiero a ese brillante y metálico trasero)"; +SWWM_INTERTIP34 = "Bajo los efectos de un Ragekit, tu daño al embestir será amplificado hasta un nivel tal que puedes incluso atravesar limpiamente puertas y otros obstáculos por el camino."; SWWM_INTERTIP35 = "Vivimos en un mundo en el que muchos somos discriminados por nuestra propia identidad. Es una triste realidad, y algo que no hemos elegido. Más triste es sin embargo la existencia de aquellos que nos odian."; SWWM_INTERTIP36 = "El color favorito de Demo-chan es el verde."; SWWM_INTERTIP37 = "Los perdigones de sal de Kinylum son suficientemente potentes como para atravesar la invulnerabilidad de algunos enemigos. Esto es también cierto para todas las armas del puesto 7 en adelante."; @@ -669,7 +669,7 @@ SWWM_INTERTIP49 = "El botón de granada rápida te permitirá lanzar un Cargador SWWM_INTERTIP50 = "\"El capitalismo es una enfermedad, un cáncer que conducirá este mundo a la ruina si no lo eliminamos pronto.\" — Hynnykka la Gran Bruja"; SWWM_INTERTIP51 = "Si un ítem está casi a tu alcance pero no puedes tocarlo, puedes pulsar uso para recogerlo manualmente. Ten en cuenta que esto solo funciona con ítems de este mod. Ten también en cuenta que las trampas activadas por contacto se activarán igual, así que no vas a zafarte de ellas."; SWWM_INTERTIP52 = "Las Cajas Afortunadas pueden aparecer a veces en zonas secretas, recompensándote con varios regalos, incluyendo coleccionables exclusivos."; -SWWM_INTERTIP53 = "¿En medio de una recarga y tienes a un Pinky intentando comerte la jeta? No tienes más que esprintarle encima para quitarlo de en medio."; +SWWM_INTERTIP53 = "¿En medio de una recarga y tienes a un Pinky intentando comerte la jeta? No tienes más que embestirle encima para quitarlo de en medio."; SWWM_INTERTIP54 = "Puedes acariciar al perro.\n\nTambién puedes acariciar al Cacodemonio (pero eso es un poco más peligroso de hacer)."; SWWM_INTERTIP55 = "Las cosas divertidas son divertidas."; SWWM_INTERTIP56 = "Algunos de estos consejos no son realmente consejos, pero seguro que eso ya lo sabes."; @@ -770,15 +770,15 @@ SWWM_ACHIEVEMENT_BARRIER_TXT = "Usa %d Barreras Elementales"; SWWM_ACHIEVEMENT_BONK_TAG = "Resistente a Choques"; SWWM_ACHIEVEMENT_BONK_TXT = "Choca %d veces"; SWWM_ACHIEVEMENT_BOSSDASH_TAG = "Cabezonería"; -SWWM_ACHIEVEMENT_BOSSDASH_TXT = "Mata %d jefes esprintando contra ellos"; +SWWM_ACHIEVEMENT_BOSSDASH_TXT = "Mata %d jefes embistiendo contra ellos"; SWWM_ACHIEVEMENT_BRAKE_TAG = "Sin Frenos"; -SWWM_ACHIEVEMENT_BRAKE_TXT = "Consume toda tu capacidad de combustible en un solo esprint %d veces"; +SWWM_ACHIEVEMENT_BRAKE_TXT = "Consume toda tu capacidad de combustible en una sola embestida %d veces"; SWWM_ACHIEVEMENT_BUNE_TAG = "Lagomorfo Legendario"; SWWM_ACHIEVEMENT_BUNE_TXT = "Realiza %d bunnyhops"; SWWM_ACHIEVEMENT_BUSTIN_TAG = "Me Hace Sentir Bien"; SWWM_ACHIEVEMENT_BUSTIN_TXT = "Revienta %d paredes"; SWWM_ACHIEVEMENT_BUTTS_TAG = "Esos Glúteos Firmes"; -SWWM_ACHIEVEMENT_BUTTS_TXT = "Mata %d enemigos esprintando marcha atrás"; +SWWM_ACHIEVEMENT_BUTTS_TXT = "Mata %d enemigos embistiendo marcha atrás"; SWWM_ACHIEVEMENT_CANDY_TAG = "Oh un Caramelo"; SWWM_ACHIEVEMENT_CANDY_TXT = "Recoge %d pepitas"; SWWM_ACHIEVEMENT_CHEAT_TAG = "Astucia Mishe"; diff --git a/language.es_lore b/language.es_lore index 11e58278c..c66ab1f58 100644 --- a/language.es_lore +++ b/language.es_lore @@ -170,8 +170,8 @@ SWWM_LORETXT_PUNTZERBETA = "\cxDesignación:\c-\n\cf Revólver Puntzer \"Beta\"\ SWWM_LORETXT_PUNTZERGAMMA = "\cxDesignación:\c-\n\cf Carabina de Asalto Puntzer \"Gamma\"\c-\n\cxFabricante:\c-\n\cf Blackmann Arms S.L.\c-\n\cxClasificación:\c-\n\cf Subfusil\c-\n\nLa serie \cfPuntzer\c- de armas de \cfBlackmann Arms\c- son el principal ejemplo del potencial de su patentada munición perforadora \cfSpin Motion Wedge (SMW)\c-.\n\nEl \cfPuntzer Gamma\c- es un subfusil bullpup mayormente compacto con un sistema de cargador horizontal similar a clásicos del siglo 21 como el \cfBreakerTek P90\c-. El arma es adicionalmente capaz de ejecutar un modo \"Súper-Automático\" de disparo ultrarrápido, visto también en otras armas automáticas fabricadas por Blackmann Arms.\n\n\cfFuego Primario:\c- Dispara el arma.\n\n\cfFuego Secundario:\c- Alterna modos de disparo, entre simple, ráfaga de tres, automático y súper-automático.\n\n\cfRecarga:\c- Recarga, obviamente. Los autocargadores de tu \cfContenedor de Hammerspace™\c- te proveerán de un cargador nuevo en cada momento.\n\n\cxNotas de Saya:\c-\n\cfMis piernas están OK.\c-\n\n\cfAhora en serio, eso mola mucho. Arma rapidísima que dispara balas taladradoras giradísimas. ¿Que clase de licencia necesitas para usar algo así en cualquier situación que no sea una invasión demoníaca? No hay manera de que algo tan ridículo sea legal de otro modo.\c-\n\n\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\nEl \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\cxFabricante:\c-\n\cf Eushura Kmonn Jr.\c-\n\cxClasificación:\c-\n\cf Lanzadora de Proyectiles Ígneos\c-\n\nUna poderosa arma incendiaria proveniente de \cfKmonn Shuna\c-, preciada por comandantes \cfXekkian\c-. La \cfQuadravol\c- dispara bolas de fuego abrasador que explotan espectacularmente en contacto con cualquier cosa, liberando un intenso calor y fuerza cinética. Es considerada muy útil contra grupos ya que la fuerza de impacto es lo suficientemente potente para dispersarlos rápidamente. Un rasgo muy característico del arma es el hecho de que las llamas que salen de ella arderán con fuerza incluso bajo el agua.\n\nEl nombre del arma viene del idioma \cfXekkas\c-, y se traduce como \cfCruz Ardiente\c-. Este nombre fue tomado de un verso de la vieja leyenda del heroico general \cfAntikalapsus\c-, quien en el 17381 AC derrotó al \cfInshta Ereuma\c- y su \cfMinisterio de la Destrucción\c-. Tal como narra el verso:\n\n\cf\"Saida shuna hoskaxar ter quadravol sundara vostoshakera serai, doro ultirukoda bos naaxakka ter usosmodu bura tasaskil.\"\c-\n\n\cf(Así las llamas de la cruz ardiente se propagaron a través de la horda, y limpiaron esta tierra santa de la corrupción que trajeron consigo.)\c-\n\nLa Cruz Ardiente era el nombre de la espada del general la cual, al ser imbuida de magia, podía liberar mortíferos cortes cruzados de llamas fulminantes.\n\n\cfFuego Primario:\c- Disparo de gran bola de fuego. Desvío mucho menor, por lo que su rango efectivo es muy largo. Incendia objetivos cercanos al impactar.\n\n\cfFuego Secundario:\c- Disparo disperso de bolas de fuego menores. Desvío incrementado y rango efectivo menor, pero muy útil contra múltiples objetivos.\n\n\cfFuego Terciario:\c- Bombea combustible adicional, incrementando la potencia de tus disparos, pero también su desvío, haciéndolos menos precisos. La sobrecarga excesiva puede resultar en una imprecisa descarga accidental, pero incluso esto tiene sus usos. Forzar el bombeo mientras se usa el fuego primario o secundario realizará disparos en cadena rápidos de baja potencia.\n\n\cfRecarga:\c- Cada caja de combustible permite diez disparos (menos si potenciados), tras lo cual debe ser recargada. El arma mantiene la caja acoplada firmemente hasta que está completamente vacía, sin embargo.\n\n\cfTécnicas:\c- El arma tiene un cierto movimiento especial \"extra efectivo\" si te encuentras a poca distancia de tu objetivo. Hundiendo las cuatro bayonetas en el enemigo e inmediatamente después apretando el gatillo resultará en una potente explosión a bocajarro que lo enviará volando, cubierto en llamas.\n\n\cxNotas de Saya:\c-\n\cfTípicas ñoñerías superdramáticas de los Xekkian. La \"Cruz Ardiente\", en serio... Pero mola tanto como suena, al menos.\c-\n\n\cfY por supuesto es jodidamente enorme, también, aunque la empuñadura está supuestamente adaptada. En serio que se me hace rarísimo como puedes hacer eso de... agrandar las manos, pero al menos te permite usar cosas así fácilmente.\c-\n\n\cfEn fin, putas bolas de fuego, ¿¿¿que funcionan bajo el agua??? Voy a tener que echarle un ojo a la ciencia detrás de esto porque eso no tiene puto sentido y aun así... está ahí.\c-"; -SWWM_LORETXT_RAGEKIT = "\cxDesignación:\c-\n\cf Ragekit\c-\n\cxFabricante:\c-\n\cf Akari Labs\c-\n\cxClasificación:\c-\n\cf Esteroides para Robot\c-\n\nEl \cfRagekit\c- es un dispositivo de potenciado experimental para uso de \cfDemolicionistas\c-. Está parcialmente basado en materiales de investigación de la difunta \cfDecade Mechanics\c-, y permite estimular la velocidad, resistencia y habilidad de combate cuerpo a cuerpo de la unidad.\n\nHa de tenerse en cuenta que mientras esté bajo sus efectos, el potenciado de velocidad puede dificultar el movimiento en lugares cerrados al colisionar la unidad contra todas paredes por el camino. Adicionalmente, ya que incrementa la fuerza de impacto, es posible echar abajo puertas y otros obstáculos al esprintar.\n\nDebido a ciertos aspectos inestables del dispositivo, mientras duren sus efectos la unidad puede experimentar cierta incomodidad, y el deseo de gritar. Esto es completamente seguro, y es de notar que la unidad no siente ningún dolor, solo ira.\n\n\cxNotas de Saya:\c-\n\cfOK, a ver, no sé lo que causa los gritos. Es un efecto secundario completamente no intencionado que en serio no sé como puñetas arreglar. Perdón mucho por eso, Demo-chan. Por eso esta cosa está clasificada como \"experimental\", supongo.\c-\n\n\cfMira, sé que te preocupa, pero confía en mí, no pasa nada. Aunque vayas por ahí partiendo crismas mientras sueltas tacos cada medio segundo, para mí, sigues siendo Demo-chan, mi robotita bonita.\c-"; -SWWM_LORETXT_RAGEKIT2 = "\cxDesignación:\c-\n\cf Ragekit\c-\n\cxFabricante:\c-\n\cf Akari Labs\c-\n\cxClasificación:\c-\n\cf Esteroides para Robot\c-\n\nEl \cfRagekit\c- es un dispositivo de potenciado experimental para uso de \cfDemolicionistas\c-. Está parcialmente basado en materiales de investigación de la difunta \cfDecade Mechanics\c-, y permite estimular la velocidad, resistencia y habilidad de combate cuerpo a cuerpo de la unidad.\n\nHa de tenerse en cuenta que mientras esté bajo sus efectos, el potenciado de velocidad puede dificultar el movimiento en lugares cerrados al colisionar la unidad contra todas paredes por el camino. Adicionalmente, ya que incrementa la fuerza de impacto, es posible echar abajo puertas y otros obstáculos al esprintar.\n\nDebido a ciertos aspectos inestables del dispositivo, mientras duren sus efectos la unidad puede experimentar cierta incomodidad, y el deseo de gritar. Esto es completamente seguro, y es de notar que la unidad no siente ningún dolor, solo ira.\n\n\cxNotas de Saya:\c-\n\cfOK, a ver, no sé lo que causa los gritos. Es un efecto secundario completamente no intencionado que en serio no sé como puñetas arreglar. Perdón mucho por eso, Demo-chan. Por eso esta cosa está clasificada como \"experimental\", supongo.\c-\n\n\cfMira, sé que te preocupa, pero confía en mí, no pasa nada. Aunque vayas por ahí partiendo crismas mientras sueltas tacos cada medio segundo, para mí, sigues siendo Demo-chan, mi robotita bonita.\c-\n\n\cfAunque... Kirin-kun si que se preocupa mucho por esto. Le he dicho que no hay problema, que no sientes dolor ni nada, pero es que no puede soportar ver el directo cuando usas uno de estos. Pobrecito...\c-\n\n\cfJe... aun así, se queja de todos los tacos, como si él fuera mejor. He oído todo lo que suelta cuando se cabrea con un juego. Los tacos en Anarukonokxhaai suenan ridículamente violentos, y es jodidamente gracioso oír todo eso salir de su boca. Si es que es tan puñeteramente mono...\c-"; +SWWM_LORETXT_RAGEKIT = "\cxDesignación:\c-\n\cf Ragekit\c-\n\cxFabricante:\c-\n\cf Akari Labs\c-\n\cxClasificación:\c-\n\cf Esteroides para Robot\c-\n\nEl \cfRagekit\c- es un dispositivo de potenciado experimental para uso de \cfDemolicionistas\c-. Está parcialmente basado en materiales de investigación de la difunta \cfDecade Mechanics\c-, y permite estimular la velocidad, resistencia y habilidad de combate cuerpo a cuerpo de la unidad.\n\nHa de tenerse en cuenta que mientras esté bajo sus efectos, el potenciado de velocidad puede dificultar el movimiento en lugares cerrados al colisionar la unidad contra todas paredes por el camino. Adicionalmente, ya que incrementa la fuerza de impacto, es posible echar abajo puertas y otros obstáculos al embestir.\n\nDebido a ciertos aspectos inestables del dispositivo, mientras duren sus efectos la unidad puede experimentar cierta incomodidad, y el deseo de gritar. Esto es completamente seguro, y es de notar que la unidad no siente ningún dolor, solo ira.\n\n\cxNotas de Saya:\c-\n\cfOK, a ver, no sé lo que causa los gritos. Es un efecto secundario completamente no intencionado que en serio no sé como puñetas arreglar. Perdón mucho por eso, Demo-chan. Por eso esta cosa está clasificada como \"experimental\", supongo.\c-\n\n\cfMira, sé que te preocupa, pero confía en mí, no pasa nada. Aunque vayas por ahí partiendo crismas mientras sueltas tacos cada medio segundo, para mí, sigues siendo Demo-chan, mi robotita bonita.\c-"; +SWWM_LORETXT_RAGEKIT2 = "\cxDesignación:\c-\n\cf Ragekit\c-\n\cxFabricante:\c-\n\cf Akari Labs\c-\n\cxClasificación:\c-\n\cf Esteroides para Robot\c-\n\nEl \cfRagekit\c- es un dispositivo de potenciado experimental para uso de \cfDemolicionistas\c-. Está parcialmente basado en materiales de investigación de la difunta \cfDecade Mechanics\c-, y permite estimular la velocidad, resistencia y habilidad de combate cuerpo a cuerpo de la unidad.\n\nHa de tenerse en cuenta que mientras esté bajo sus efectos, el potenciado de velocidad puede dificultar el movimiento en lugares cerrados al colisionar la unidad contra todas paredes por el camino. Adicionalmente, ya que incrementa la fuerza de impacto, es posible echar abajo puertas y otros obstáculos al embestir.\n\nDebido a ciertos aspectos inestables del dispositivo, mientras duren sus efectos la unidad puede experimentar cierta incomodidad, y el deseo de gritar. Esto es completamente seguro, y es de notar que la unidad no siente ningún dolor, solo ira.\n\n\cxNotas de Saya:\c-\n\cfOK, a ver, no sé lo que causa los gritos. Es un efecto secundario completamente no intencionado que en serio no sé como puñetas arreglar. Perdón mucho por eso, Demo-chan. Por eso esta cosa está clasificada como \"experimental\", supongo.\c-\n\n\cfMira, sé que te preocupa, pero confía en mí, no pasa nada. Aunque vayas por ahí partiendo crismas mientras sueltas tacos cada medio segundo, para mí, sigues siendo Demo-chan, mi robotita bonita.\c-\n\n\cfAunque... Kirin-kun si que se preocupa mucho por esto. Le he dicho que no hay problema, que no sientes dolor ni nada, pero es que no puede soportar ver el directo cuando usas uno de estos. Pobrecito...\c-\n\n\cfJe... aun así, se queja de todos los tacos, como si él fuera mejor. He oído todo lo que suelta cuando se cabrea con un juego. Los tacos en Anarukonokxhaai suenan ridículamente violentos, y es jodidamente gracioso oír todo eso salir de su boca. Si es que es tan puñeteramente mono...\c-"; SWWM_LORETXT_RAYKHOM = "\cxDesignación:\c-\n\cf Ray-Khom (\"Arma de Plasma\")\c-\n\cxFabricante:\c-\n\cf Eushura Kmonn Jr.\c-\n\cxClasificación:\c-\n\cf Pistola de Bobina de Alta Reacción\c-\n\nDesde su creación por el \cfProfesor Eushura Kmonn Jr.\c-, la \cfRay-Khom\c- se ha quedado con un puesto permanente en el equipamiento de cada soldado \cfXekkian\c-. Fiable, eficiente, necesitando casi ningún mantenimiento al carecer de partes móviles a excepción de su mecanismo de carga. La munición es adicionalmente muy fácil de conseguir, al menos localmente, ya que la exportación lleva consigo severos impuestos.\n\nEl arma es potenciada en su totalidad por un compacto paquete de batería de cuatro celdas de Korberon-Eneiebium, fácil de reemplazar cuando se necesite. La munición viene en cargadores de 20. La munición en sí, proyectiles magnetizados sin casquillo de 40mm, incrustados de una carga de ignición hiperdensa de Dyratin, liberando potentes descargas de plasma ultracaliente, capaz de derretir rápidamente cualquier cosa a excepción de blindaje de Almacero de alta resonancia y causando potentes, urticantes quemaduras en piel Xekkian (o corrosión severa de tejido muscular y óseo en cualquier cosa más débil).\n\n\cfFuego Primario:\c- Fuego continuo, rápido y preciso. Retroceso mínimo dada la operación electromagnética, mayormente silencioso ya que los proyectiles son disparados a una velocidad poco menor que la del sonido. Tus enemigos tienen la garantía de no enterarse de tu ataque hasta ser demasiado tarde.\n\n\cfFuego Secundario:\c- Emplea los emisores de pulsos concentrados a lo largo de los filos del arma, emitiendo una potente descarga eléctrica delante del usuario, aturdiendo temporalmente todo lo que se acerque. Puede causar la muerte de objetivos débiles. Se recomienda usar con moderación, ya que consume rápidamente la batería.\n\n\cfRecarga Primaria:\c- Recarga el arma.\n\n\cfRecarga Secundaria:\c- Cambia la batería. Esta acción solo puede hacerse en cuanto la carga sea lo suficientemente baja, ya que sería un derroche de otro modo.\n\n\cfTécnicas:\c- El fuego secundario incrementa en letalidad al usarse en líquidos conductivos tales como el agua. Simplemente asegúrate de no estar en contacto con ella.\n\n\cfNotas de Saya:\c-\n\cf¡ES JODIDAMENTE ENORME, HOSTIA PUTA!\c-\n\n\cfAsí que según los Xekkian esto es un \"arma ligera\", ¿¿¿en serio??? Menos mal que tus manos se pueden adaptar no se como a la empuñadura de la cosa esta, porque hostia putísima...\c-\n\n\cfEsta mierda es como, no se por donde empezar. Es en serio un puto revientaculos, eso es lo que es. De todo lo que hay en tu arsenal, yo diría que esta es la segunda arma más fuerte que tenemos. Misa aparte la trajo ella misma entonces, y luego hablamos con el viejales de Tach-Engine para poder meterla en la tienda, ya que tiene el trato ese con Kmonn y tal (Estoy segura de que esos dos son algo mas que compañeros de negocios, si sabes a lo que me refiero).\c-\n\n\cfCuando entró por la puerta cargando a hombros con esa cosa supe entonces que tenía que ser nuestra.\c-"; SWWM_LORETAG_REFRESHER = "Refrescador"; SWWM_LORETXT_REFRESHER = "\cxDesignación:\c-\n\cf Refrescador\c-\n\cfFabricante:\c-\n\cf Desconocido\c-\n\cxClasificación:\c-\n\cf Artefacto Curativo\c-\n\nEstas antiguas reliquias fueron encontradas durante la exploración de las antiguas ruinas alienígenas de Sedna, cerca del portal al \cfSistema Xathar\c-. A diferencia de otros objetos encontrados en esta exploración, éstos en particular dieron una pista potencial sobre los orígenes de todo esto. La forma específica de estas reliquias, la del Ankh Egipcio, símbolo de vida, vino como una revelación para el fundador del \cfInstituto Tecnológico Tach-Engine\c-, quien lideraba la expedición. Su teoría era que estas ruinas podrían haber formado parte de un \"puesto intermedio\" que sus antepasados podrían haber usado cuando vinieron por primera vez a la Tierra, para fundar su colonia en Egipto.\n\nEste artefacto en específico, llamado \cfRefrescador\c-, tiene fuertes efectos rejuvenecedores, mucho más potentes que los de cualquier otro artefacto curativo anteriormente descubierto. Cualquier herida o enfermedad son curadas instantáneamente una vez se mantenga el artefacto sujeto con fuerza contra el pecho. Al igual que los otros, la naturaleza de estos efectos es completamente desconocida, y el mismo \cfJ.A. Tachmek-Smith\c- ha dedicado la mayoría de su tiempo a investigarlos.\n\nUna característica adicional e importante del Refrescador es el hecho de que de algún modo tiene la habilidad de \"activar automáticamente\" sus efectos curativos, en el caso de que quien lo porte esté en peligro inminente de morir. Incluso así, su efecto puede no ser lo suficientemente potente para prevenir tal desenlace en todos los casos.\n\n\cxNotas de Saya:\c-\n\cfAlienígenas Egipcios Antiguos™. Bien, mola, pues sí, cosa buena. Pero los chismes estos mira que son útiles, son casi como... ah, joder, voy a sonar como el friki ese pero sí, son como... vidas extra, ¿más o menos?\c-"; diff --git a/language.es_menu b/language.es_menu index 51700ac3c..c7af24a40 100644 --- a/language.es_menu +++ b/language.es_menu @@ -6,7 +6,9 @@ SWWM_SECONDARYFIRE = "Fuego Secundario"; SWWM_RELOADFIRE = "Recargar"; SWWM_ZOOMFIRE = "Fuego Terciario / Zoom"; SWWM_MELEE = "Ataque a Melé"; -SWWM_DASH = "Esprintar"; +SWWM_WALK = "Caminar"; +SWWM_SPRINT = "Esprintar"; +SWWM_DASH = "Embestir"; SWWM_ITEMSENSE = "Sensor de Ítems"; SWWM_EXTRAFIRE = "Granada Rápida"; SWWM_GESTURE1 = "Saludar"; @@ -411,7 +413,7 @@ SWWM_STATFLIGHT = "Distancia en Aire: "; SWWM_STATSWIM = "Distancia en Agua: "; SWWM_STATTELE = "Distancia por Teletransporte: "; SWWM_STATBOOST = "Veces Impulsado: "; -SWWM_STATDASH = "Veces Esprintado: "; +SWWM_STATDASH = "Veces Embestido: "; SWWM_STATSTOMP = "Veces Impactado: "; SWWM_STATFUEL = "Uso Total de Combustible: "; SWWM_STATSPEED = "Velocidad Punta: "; @@ -668,7 +670,7 @@ SWWM_HELP_TECHTXT = "Oh, y no olvides que tu peso es también una buena arma. No solo puedes embestir con facilidad enemigos menores al impulsarte, pero también si aterrizas con una velocidad considerable, puedes crear una onda expansiva que empuje a tus enemigos por los aires y aplaste todo bajo tus pies.\n"; SWWM_HELP_TIPS = "Consejos Adicionales"; SWWM_HELP_TIPSTXT = -"Ten en cuenta que puedes activar puertas y palancas a base de puñetazos o esprintar contra ellas. La opción está ahí, si realmente quieres, y sientes una especial intensidad.\n" +"Ten en cuenta que puedes activar puertas y palancas a base de puñetazos o embistiendo contra ellas. La opción está ahí, si realmente quieres, y sientes una especial intensidad.\n" "\n" "Otro tema a saber es que los ítems de este mod tienen colisiones un poco no-estándar, lo cual puede causar problemas al no poder recogerlos a pie. En casos como estos... simplemente usa las manos, obviamente. Puedes pulsar Usar para recoger cualquier cosa que tengas delante, siempre y cuando sea un ítem de este mod.\n" "\n" diff --git a/language.version b/language.version index 8f4f61860..74cf243de 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r516 \cu(Sun 30 May 21:27:55 CEST 2021)\c-"; -SWWM_SHORTVER="\cw0.9.11b-pre r516 \cu(2021-05-30 21:27:55)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r517 \cu(Mon 31 May 16:17:59 CEST 2021)\c-"; +SWWM_SHORTVER="\cw0.9.11b-pre r517 \cu(2021-05-31 16:17:59)\c-"; diff --git a/lore/es/ragekit.txt b/lore/es/ragekit.txt index d826320cd..453511d40 100644 --- a/lore/es/ragekit.txt +++ b/lore/es/ragekit.txt @@ -8,7 +8,7 @@ TXT El **Ragekit** es un dispositivo de potenciado experimental para uso de **Demolicionistas**. Está parcialmente basado en materiales de investigación de la difunta **Decade Mechanics**, y permite estimular la velocidad, resistencia y habilidad de combate cuerpo a cuerpo de la unidad. -Ha de tenerse en cuenta que mientras esté bajo sus efectos, el potenciado de velocidad puede dificultar el movimiento en lugares cerrados al colisionar la unidad contra todas paredes por el camino. Adicionalmente, ya que incrementa la fuerza de impacto, es posible echar abajo puertas y otros obstáculos al esprintar. +Ha de tenerse en cuenta que mientras esté bajo sus efectos, el potenciado de velocidad puede dificultar el movimiento en lugares cerrados al colisionar la unidad contra todas paredes por el camino. Adicionalmente, ya que incrementa la fuerza de impacto, es posible echar abajo puertas y otros obstáculos al embestir. Debido a ciertos aspectos inestables del dispositivo, mientras duren sus efectos la unidad puede experimentar cierta incomodidad, y el deseo de gritar. Esto es completamente seguro, y es de notar que la unidad no siente ningún dolor, solo ira. @@ -26,7 +26,7 @@ TXT El **Ragekit** es un dispositivo de potenciado experimental para uso de **Demolicionistas**. Está parcialmente basado en materiales de investigación de la difunta **Decade Mechanics**, y permite estimular la velocidad, resistencia y habilidad de combate cuerpo a cuerpo de la unidad. -Ha de tenerse en cuenta que mientras esté bajo sus efectos, el potenciado de velocidad puede dificultar el movimiento en lugares cerrados al colisionar la unidad contra todas paredes por el camino. Adicionalmente, ya que incrementa la fuerza de impacto, es posible echar abajo puertas y otros obstáculos al esprintar. +Ha de tenerse en cuenta que mientras esté bajo sus efectos, el potenciado de velocidad puede dificultar el movimiento en lugares cerrados al colisionar la unidad contra todas paredes por el camino. Adicionalmente, ya que incrementa la fuerza de impacto, es posible echar abajo puertas y otros obstáculos al embestir. Debido a ciertos aspectos inestables del dispositivo, mientras duren sus efectos la unidad puede experimentar cierta incomodidad, y el deseo de gritar. Esto es completamente seguro, y es de notar que la unidad no siente ningún dolor, solo ira. diff --git a/modeldef.demolitionist b/modeldef.demolitionist index 328725b29..d9a42de62 100644 --- a/modeldef.demolitionist +++ b/modeldef.demolitionist @@ -39,15 +39,15 @@ Model "Demolitionist" FrameIndex XZW1 S 0 20 // RunLoop FrameIndex XZW1 T 0 21 - FrameIndex XZW1 U 0 22 // rstep - FrameIndex XZW1 V 0 23 + FrameIndex XZW1 U 0 22 + FrameIndex XZW1 V 0 23 // rstep FrameIndex XZW1 W 0 24 FrameIndex XZW1 X 0 25 FrameIndex XZW1 Y 0 26 FrameIndex XZW1 Z 0 27 FrameIndex XZW2 A 0 28 - FrameIndex XZW2 B 0 29 // lstep - FrameIndex XZW2 C 0 30 + FrameIndex XZW2 B 0 29 + FrameIndex XZW2 C 0 30 // lstep FrameIndex XZW2 D 0 31 FrameIndex XZW2 E 0 32 FrameIndex XZW2 F 0 33 @@ -556,6 +556,25 @@ Model "Demolitionist" FrameIndex XZWI M 0 492 FrameIndex XZWI N 0 493 FrameIndex XZWI O 0 494 + // Jog + FrameIndex XZWI P 0 496 + FrameIndex XZWI Q 0 497 + FrameIndex XZWI R 0 498 + FrameIndex XZWI S 0 499 // rstep + FrameIndex XZWI T 0 500 + FrameIndex XZWI U 0 501 + FrameIndex XZWI V 0 502 + FrameIndex XZWI W 0 503 + FrameIndex XZWI X 0 504 + FrameIndex XZWI Y 0 505 // lstep + FrameIndex XZWI Z 0 506 + // Jump + FrameIndex XZWJ A 0 508 + FrameIndex XZWJ B 0 509 + FrameIndex XZWJ C 0 510 + FrameIndex XZWJ D 0 511 + FrameIndex XZWJ E 0 512 + FrameIndex XZWJ F 0 513 } // Voodoo Doll diff --git a/models/DemolitionistPlayer.blend b/models/DemolitionistPlayer.blend index a6f3e827a..f2a53dd9d 100644 Binary files a/models/DemolitionistPlayer.blend and b/models/DemolitionistPlayer.blend differ diff --git a/models/DemolitionistPlayer_a.3d b/models/DemolitionistPlayer_a.3d index 712d6ab41..7e6cd166b 100644 Binary files a/models/DemolitionistPlayer_a.3d and b/models/DemolitionistPlayer_a.3d differ diff --git a/models/DemolitionistPlayer_d.3d b/models/DemolitionistPlayer_d.3d index 6db33d39b..b6b0a5a0b 100644 Binary files a/models/DemolitionistPlayer_d.3d and b/models/DemolitionistPlayer_d.3d differ diff --git a/zscript/handler/swwm_handler_process.zsc b/zscript/handler/swwm_handler_process.zsc index 167615026..4d6c99865 100644 --- a/zscript/handler/swwm_handler_process.zsc +++ b/zscript/handler/swwm_handler_process.zsc @@ -54,6 +54,13 @@ extend Class SWWMHandler } return; } + else if ( e.Name ~== "swwmsetwalk" ) + { + if ( (e.player == -1) || !playeringame[e.player] || !players[e.player].mo ) return; + let mo = Demolitionist(players[e.player].mo); + if ( mo ) mo.bWalking = e.Args[0]; + return; + } else if ( e.Name ~== "swwmfixitemcaps" ) { // this command is only really needed when I update item max amounts mid-playthrough diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 221f7da15..f49a17c1f 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -72,6 +72,8 @@ Class Demolitionist : PlayerPawn transient SWWMItemTracer itrace; bool meleeuse; + transient bool bWalking; + Property DashFuel : dashfuel; Default @@ -93,8 +95,8 @@ Class Demolitionist : PlayerPawn Player.ViewHeight 52; Player.AirCapacity 0; Player.GruntSpeed 20; - Player.ForwardMove 1., 1.5; - Player.SideMove 1., 1.5; + Player.ForwardMove .4, 1.5; + Player.SideMove .4, 1.5; Player.SoundClass "demolitionist"; DamageFactor "Drowning", 0.; DamageFactor "Poison", 0.; @@ -113,14 +115,15 @@ Class Demolitionist : PlayerPawn { if ( !(player.cmd.forwardmove|player.cmd.sidemove) ) return (0,0); - Vector2 mvec = (player.cmd.forwardmove,-player.cmd.sidemove); - double maxmag = max(abs(mvec.x),abs(mvec.y)); - mvec /= mvec.length(); - return mvec*maxmag; + Vector2 mvec = (player.cmd.forwardmove,-player.cmd.sidemove/.96); + double maxval = max(abs(mvec.x),abs(mvec.y)); + // sorry, we don't use that here + if ( !(player.cmd.buttons&BT_RUN) ) maxval *= 2.; + return mvec.unit()*maxval; } double TweakSpeed() { - double fact = (player.cmd.buttons&BT_RUN)?ForwardMove2:ForwardMove1; + double fact = (player.cmd.buttons&BT_SPEED)?ForwardMove2:bWalking?(ForwardMove1*.2):ForwardMove1; for ( Inventory i=Inv; i; i=i.Inv ) fact *= i.GetSpeedFactor(); return fact; } @@ -932,7 +935,7 @@ Class Demolitionist : PlayerPawn if ( FindInventory("RagekitPower") ) { // stop for just a split second UNLESS bunnyhopping - if ( !(player.cmd.buttons&BT_RUN) || (level.maptime >= (lastairtic+10)) ) + if ( !(player.cmd.buttons&BT_SPEED) || (level.maptime >= (lastairtic+10)) ) ReactionTime = 6; } else @@ -959,7 +962,7 @@ Class Demolitionist : PlayerPawn if ( (lastvelz < -gruntspeed) && (swwm_mutevoice < 4) && (health > 0) ) A_StartSound(String.Format("voice/%s/grunt",myvoice.GetString()),CHAN_DEMOVOICE,CHANF_OVERLAP); if ( lastvelz < -1 ) - A_Footstep(0,false,clamp(-lastvelz*0.05,0.0,1.0)); + A_Footstep(0,1,clamp(-lastvelz*0.05,0.0,1.0)); // bounce off slopes if ( pos.z <= floorz ) { @@ -1053,7 +1056,7 @@ Class Demolitionist : PlayerPawn lastvelz = prevvelz; prevvelz = vel.z; bool isdashing = InStateSequence(CurState,FindState("Dash")); - bool isboosting = InStateSequence(CurState,FindState("Jump")); + bool isboosting = InStateSequence(CurState,FindState("Boost")); bNOFRICTION = (((waterlevel<2)&&(bFly&&!bFlyCheat&&!(player.cheats&CF_NOCLIP2)))||isdashing); fuelcooldown = max(0,fuelcooldown-1); dashcooldown = max(0,dashcooldown-1); @@ -1895,6 +1898,7 @@ Class Demolitionist : PlayerPawn double newp = min(90.,pitch+3.); bumppitch.Push(newp-pitch); A_SetPitch(newp,SPF_INTERPOLATE); + SetStateLabel("Boost"); } else { @@ -1906,13 +1910,13 @@ Class Demolitionist : PlayerPawn // bunnyhop time if ( !walljump && !wallclimb ) { - if ( (player.cmd.buttons&BT_RUN) && (level.maptime < (lastairtic+10)) ) + if ( !bWalking && (level.maptime < (lastairtic+10)) ) { SWWMUtility.AchievementProgressInc('swwm_progress_bune',1,player); // bhop, z vel relative to vel size if ( vel.z < 25. ) // don't ramp up too hard { - vel.z += jumpvelz*(1.2+vel.length()*.01); + vel.z += jumpvelz*(((player.cmd.buttons&BT_SPEED)?1.2:.65)+vel.length()*.01); // add part of last landing z velocity too vel.z += max(0,-landvelz*(raging?.45:.35)); } @@ -1924,17 +1928,17 @@ Class Demolitionist : PlayerPawn // first jump if ( vel.z < 10. ) // don't ramp up too hard { - vel.z += jumpvelz*((player.cmd.buttons&BT_RUN)?1.25:1.); + vel.z += jumpvelz*((player.cmd.buttons&BT_SPEED)?1.25:bWalking?.75:1.); // add part of last landing z velocity too vel.z += max(0,-landvelz*(raging?.35:.25)); } - // long jump if running - if ( !walljump && !wallclimb && (player.cmd.buttons&BT_RUN) ) - (vel.xy += RotateVector(NormalizedMove(),angle)/1500.)*(raging?2.:1.)*TweakSpeed(); + // long jump if running/sprinting + if ( !walljump && !wallclimb && !bWalking ) + vel.xy += (RotateVector(NormalizedMove(),angle)/1500.)*(raging?2.:1.)*TweakSpeed(); } } + SetStateLabel("Jump"); } - SetStateLabel("Jump"); } last_jump_held = level.maptime+1; } @@ -2037,25 +2041,33 @@ Class Demolitionist : PlayerPawn if ( player.crouchdir == -1 ) { // Crouching - if ( InStateSequence(CurState,FindState("CrouchMove")) ) + if ( InStateSequence(CurState,FindState("CrouchMove")) + || InStateSequence(CurState,FindState("CrouchMoveRun")) + || InStateSequence(CurState,FindState("CrouchMoveFast")) ) SetStateLabel("Crouch"); else if ( InStateSequence(CurState,FindState("Spawn")) || InStateSequence(CurState,FindState("Turn")) || InStateSequence(CurState,FindState("See")) + || InStateSequence(CurState,FindState("SeeRun")) || InStateSequence(CurState,FindState("SeeFast")) || InStateSequence(CurState,FindState("SeeFastLoop")) || InStateSequence(CurState,FindState("SeeFastEnd")) || InStateSequence(CurState,FindState("Float")) || InStateSequence(CurState,FindState("Swim")) - || InStateSequence(CurState,FindState("SwimLoop")) ) + || InStateSequence(CurState,FindState("SwimLoop")) + || InStateSequence(CurState,FindState("SwimLoopRun")) + || InStateSequence(CurState,FindState("SwimLoopFast")) ) SetStateLabel("StartCrouch"); } else { if ( InStateSequence(CurState,FindState("Crouch")) - || InStateSequence(CurState,FindState("CrouchMove")) ) + || InStateSequence(CurState,FindState("CrouchMove")) + || InStateSequence(CurState,FindState("CrouchMoveRun")) + || InStateSequence(CurState,FindState("CrouchMoveFast")) ) SetStateLabel("EndCrouch"); else if ( InStateSequence(CurState,FindState("See")) + || InStateSequence(CurState,FindState("SeeRun")) || InStateSequence(CurState,FindState("Float")) ) { SetStateLabel("Spawn"); @@ -2065,7 +2077,9 @@ Class Demolitionist : PlayerPawn || InStateSequence(CurState,FindState("SeeFastLoop")) ) SetStateLabel("SeeFastEnd"); else if ( InStateSequence(CurState,FindState("Swim")) - || InStateSequence(CurState,FindState("SwimLoop")) ) + || InStateSequence(CurState,FindState("SwimLoop")) + || InStateSequence(CurState,FindState("SwimLoopRun")) + || InStateSequence(CurState,FindState("SwimLoopFast")) ) SetStateLabel("SwimEnd"); } } @@ -2077,6 +2091,7 @@ Class Demolitionist : PlayerPawn if ( InStateSequence(CurState,FindState("Spawn")) || InStateSequence(CurState,FindState("Turn")) || InStateSequence(CurState,FindState("See")) + || InStateSequence(CurState,FindState("SeeRun")) || InStateSequence(CurState,FindState("SeeFast")) || InStateSequence(CurState,FindState("SeeFastLoop")) || InStateSequence(CurState,FindState("SeeFastEnd")) @@ -2085,7 +2100,9 @@ Class Demolitionist : PlayerPawn || InStateSequence(CurState,FindState("Fall")) || InStateSequence(CurState,FindState("FallLoop")) || InStateSequence(CurState,FindState("Swim")) - || InStateSequence(CurState,FindState("SwimLoop")) ) + || InStateSequence(CurState,FindState("SwimLoop")) + || InStateSequence(CurState,FindState("SwimLoopRun")) + || InStateSequence(CurState,FindState("SwimLoopFast")) ) SetStateLabel("StartCrouch"); } else @@ -2093,6 +2110,7 @@ Class Demolitionist : PlayerPawn if ( (InStateSequence(CurState,FindState("Spawn")) || InStateSequence(CurState,FindState("Turn")) || InStateSequence(CurState,FindState("See")) + || InStateSequence(CurState,FindState("SeeRun")) || InStateSequence(CurState,FindState("SeeFast")) || InStateSequence(CurState,FindState("SeeFastLoop")) || InStateSequence(CurState,FindState("SeeFastEnd")) @@ -2100,10 +2118,14 @@ Class Demolitionist : PlayerPawn && (abs(pos.z-floorz) > maxstepheight) ) SetStateLabel("Fall"); else if ( InStateSequence(CurState,FindState("Crouch")) - || InStateSequence(CurState,FindState("CrouchMove")) ) + || InStateSequence(CurState,FindState("CrouchMove")) + || InStateSequence(CurState,FindState("CrouchMoveRun")) + || InStateSequence(CurState,FindState("CrouchMoveFast")) ) SetStateLabel("EndCrouch"); else if ( InStateSequence(CurState,FindState("Swim")) - || InStateSequence(CurState,FindState("SwimLoop")) ) + || InStateSequence(CurState,FindState("SwimLoop")) + || InStateSequence(CurState,FindState("SwimLoopRun")) + || InStateSequence(CurState,FindState("SwimLoopFast")) ) SetStateLabel("SwimEnd"); } } @@ -2116,6 +2138,7 @@ Class Demolitionist : PlayerPawn if ( InStateSequence(CurState,FindState("Spawn")) || InStateSequence(CurState,FindState("Turn")) || InStateSequence(CurState,FindState("See")) + || InStateSequence(CurState,FindState("SeeRun")) || InStateSequence(CurState,FindState("SeeFast")) || InStateSequence(CurState,FindState("SeeFastLoop")) || InStateSequence(CurState,FindState("SeeFastEnd")) @@ -2124,7 +2147,9 @@ Class Demolitionist : PlayerPawn || InStateSequence(CurState,FindState("Fall")) || InStateSequence(CurState,FindState("FallLoop")) || InStateSequence(CurState,FindState("Swim")) - || InStateSequence(CurState,FindState("SwimLoop")) ) + || InStateSequence(CurState,FindState("SwimLoop")) + || InStateSequence(CurState,FindState("SwimLoopRun")) + || InStateSequence(CurState,FindState("SwimLoopFast")) ) SetStateLabel("StartCrouch"); } else @@ -2132,6 +2157,7 @@ Class Demolitionist : PlayerPawn if ( InStateSequence(CurState,FindState("Spawn")) || InStateSequence(CurState,FindState("Turn")) || InStateSequence(CurState,FindState("See")) + || InStateSequence(CurState,FindState("SeeRun")) || InStateSequence(CurState,FindState("SeeFast")) || InStateSequence(CurState,FindState("SeeFastLoop")) || InStateSequence(CurState,FindState("SeeFastEnd")) @@ -2140,10 +2166,14 @@ Class Demolitionist : PlayerPawn || InStateSequence(CurState,FindState("FallLoop")) ) SetStateLabel("Float"); else if ( InStateSequence(CurState,FindState("Swim")) - || InStateSequence(CurState,FindState("SwimLoop")) ) + || InStateSequence(CurState,FindState("SwimLoop")) + || InStateSequence(CurState,FindState("SwimLoopRun")) + || InStateSequence(CurState,FindState("SwimLoopFast")) ) SetStateLabel("SwimEnd"); else if ( InStateSequence(CurState,FindState("Crouch")) - || InStateSequence(CurState,FindState("CrouchMove")) ) + || InStateSequence(CurState,FindState("CrouchMove")) + || InStateSequence(CurState,FindState("CrouchMoveRun")) + || InStateSequence(CurState,FindState("CrouchMoveFast")) ) SetStateLabel("EndCrouch"); } } @@ -2152,8 +2182,8 @@ Class Demolitionist : PlayerPawn { if ( !player ) { - if ( !InStateSequence(CurState,FindState("See")) ) - SetStateLabel("See"); + if ( !InStateSequence(CurState,FindState("SeeRun")) ) + SetStateLabel("SeeRun"); return; } if ( player.health <= 0 ) return; @@ -2166,6 +2196,7 @@ Class Demolitionist : PlayerPawn if ( InStateSequence(CurState,FindState("Spawn")) || InStateSequence(CurState,FindState("Turn")) || InStateSequence(CurState,FindState("See")) + || InStateSequence(CurState,FindState("SeeRun")) || InStateSequence(CurState,FindState("SeeFast")) || InStateSequence(CurState,FindState("SeeFastLoop")) || InStateSequence(CurState,FindState("SeeFastEnd")) @@ -2173,29 +2204,50 @@ Class Demolitionist : PlayerPawn || InStateSequence(CurState,FindState("FallLoop")) || InStateSequence(CurState,FindState("Float")) || InStateSequence(CurState,FindState("Swim")) - || InStateSequence(CurState,FindState("SwimLoop")) ) + || InStateSequence(CurState,FindState("SwimLoop")) + || InStateSequence(CurState,FindState("SwimLoopRun")) + || InStateSequence(CurState,FindState("SwimLoopFast")) ) SetStateLabel("StartCrouch"); else if ( InStateSequence(CurState,FindState("Crouch")) ) - SetStateLabel("CrouchMove"); + { + switch( FastCheck() ) + { + case 2: + SetStateLabel("CrouchMoveFast"); + break; + case 1: + SetStateLabel("CrouchMoveRun"); + break; + default: + SetStateLabel("CrouchMove"); + break; + } + } } else { if ( InStateSequence(CurState,FindState("Crouch")) - || InStateSequence(CurState,FindState("CrouchMove")) ) + || InStateSequence(CurState,FindState("CrouchMove")) + || InStateSequence(CurState,FindState("CrouchMoveRun")) + || InStateSequence(CurState,FindState("CrouchMoveFast")) ) SetStateLabel("EndCrouch"); else if ( InStateSequence(CurState,FindState("Swim")) - || InStateSequence(CurState,FindState("SwimLoop")) ) + || InStateSequence(CurState,FindState("SwimLoop")) + || InStateSequence(CurState,FindState("SwimLoopRun")) + || InStateSequence(CurState,FindState("SwimLoopFast")) ) SetStateLabel("SwimEnd"); - else if ( FastCheck() + else if ( (FastCheck() == 2) && (InStateSequence(CurState,FindState("Spawn")) || InStateSequence(CurState,FindState("Turn")) - || InStateSequence(CurState,FindState("See"))) ) + || InStateSequence(CurState,FindState("See")) + || InStateSequence(CurState,FindState("SeeRun"))) ) SetStateLabel("SeeFast"); else if ( InStateSequence(CurState,FindState("Spawn")) || InStateSequence(CurState,FindState("Float")) || InStateSequence(CurState,FindState("Turn")) ) { - SetStateLabel("See"); + if ( FastCheck() == 1 ) SetStateLabel("SeeRun"); + else SetStateLabel("See"); A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.2); } } @@ -2214,6 +2266,7 @@ Class Demolitionist : PlayerPawn if ( InStateSequence(CurState,FindState("Spawn")) || InStateSequence(CurState,FindState("Turn")) || InStateSequence(CurState,FindState("See")) + || InStateSequence(CurState,FindState("SeeRun")) || InStateSequence(CurState,FindState("SeeFast")) || InStateSequence(CurState,FindState("SeeFastLoop")) || InStateSequence(CurState,FindState("SeeFastEnd")) @@ -2222,10 +2275,25 @@ Class Demolitionist : PlayerPawn || InStateSequence(CurState,FindState("FallLoop")) || InStateSequence(CurState,FindState("Float")) || InStateSequence(CurState,FindState("Swim")) - || InStateSequence(CurState,FindState("SwimLoop")) ) + || InStateSequence(CurState,FindState("SwimLoop")) + || InStateSequence(CurState,FindState("SwimLoopRun")) + || InStateSequence(CurState,FindState("SwimLoopFast")) ) SetStateLabel("StartCrouch"); else if ( InStateSequence(CurState,FindState("Crouch")) ) - SetStateLabel("CrouchMove"); + { + switch( FastCheck() ) + { + case 2: + SetStateLabel("CrouchMoveFast"); + break; + case 1: + SetStateLabel("CrouchMoveRun"); + break; + default: + SetStateLabel("CrouchMove"); + break; + } + } } else if ( bFlyCheat || (player.cheats&CF_NOCLIP2) ) { @@ -2234,6 +2302,7 @@ Class Demolitionist : PlayerPawn if ( InStateSequence(CurState,FindState("Spawn")) || InStateSequence(CurState,FindState("Turn")) || InStateSequence(CurState,FindState("See")) + || InStateSequence(CurState,FindState("SeeRun")) || InStateSequence(CurState,FindState("SeeFast")) || InStateSequence(CurState,FindState("SeeFastLoop")) || InStateSequence(CurState,FindState("SeeFastEnd")) @@ -2241,10 +2310,14 @@ Class Demolitionist : PlayerPawn || InStateSequence(CurState,FindState("Fall")) || InStateSequence(CurState,FindState("FallLoop")) || InStateSequence(CurState,FindState("Swim")) - || InStateSequence(CurState,FindState("SwimLoop")) ) + || InStateSequence(CurState,FindState("SwimLoop")) + || InStateSequence(CurState,FindState("SwimLoopRun")) + || InStateSequence(CurState,FindState("SwimLoopFast")) ) SetStateLabel("Float"); else if ( InStateSequence(CurState,FindState("Crouch")) - || InStateSequence(CurState,FindState("CrouchMove")) ) + || InStateSequence(CurState,FindState("CrouchMove")) + || InStateSequence(CurState,FindState("CrouchMoveRun")) + || InStateSequence(CurState,FindState("CrouchMoveFast")) ) SetStateLabel("EndCrouch"); } else @@ -2252,6 +2325,7 @@ Class Demolitionist : PlayerPawn if ( InStateSequence(CurState,FindState("Spawn")) || InStateSequence(CurState,FindState("Turn")) || InStateSequence(CurState,FindState("See")) + || InStateSequence(CurState,FindState("SeeRun")) || InStateSequence(CurState,FindState("SeeFast")) || InStateSequence(CurState,FindState("SeeFastLoop")) || InStateSequence(CurState,FindState("SeeFastEnd")) @@ -2261,7 +2335,8 @@ Class Demolitionist : PlayerPawn || InStateSequence(CurState,FindState("Float")) ) SetStateLabel("Swim"); else if ( InStateSequence(CurState,FindState("Crouch")) - || InStateSequence(CurState,FindState("CrouchMove")) ) + || InStateSequence(CurState,FindState("CrouchMoveRun")) + || InStateSequence(CurState,FindState("CrouchMoveFast")) ) SetStateLabel("EndCrouch"); } } @@ -2272,8 +2347,8 @@ Class Demolitionist : PlayerPawn if ( player && (player.ReadyWeapon is 'SWWMWeapon') ) return; if ( InStateSequence(CurState,FindState("Dash")) - || InStateSequence(CurState,FindState("Jump")) ) - return; // don't cancel dash/jump + || InStateSequence(CurState,FindState("Boost")) ) + return; // don't cancel dash/boost if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchMissile"); else SetStateLabel("Missile"); } @@ -2284,40 +2359,40 @@ Class Demolitionist : PlayerPawn void PlayFire() { if ( InStateSequence(CurState,FindState("Dash")) - || InStateSequence(CurState,FindState("Jump")) ) - return; // don't cancel dash/jump + || InStateSequence(CurState,FindState("Boost")) ) + return; // don't cancel dash/boost if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchMissile"); else SetStateLabel("Missile"); } void PlayMelee() { if ( InStateSequence(CurState,FindState("Dash")) - || InStateSequence(CurState,FindState("Jump")) ) - return; // don't cancel dash/jump + || InStateSequence(CurState,FindState("Boost")) ) + return; // don't cancel dash/boost if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchMelee"); else SetStateLabel("Melee"); } void PlayFastMelee() { if ( InStateSequence(CurState,FindState("Dash")) - || InStateSequence(CurState,FindState("Jump")) ) - return; // don't cancel dash/jump + || InStateSequence(CurState,FindState("Boost")) ) + return; // don't cancel dash/boost if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchFastMelee"); else SetStateLabel("FastMelee"); } void PlayReload() { if ( InStateSequence(CurState,FindState("Dash")) - || InStateSequence(CurState,FindState("Jump")) ) - return; // don't cancel dash/jump + || InStateSequence(CurState,FindState("Boost")) ) + return; // don't cancel dash/boost if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchReload"); else SetStateLabel("Reload"); } void PlayCheckGun() { if ( InStateSequence(CurState,FindState("Dash")) - || InStateSequence(CurState,FindState("Jump")) ) - return; // don't cancel dash/jump + || InStateSequence(CurState,FindState("Boost")) ) + return; // don't cancel dash/boost if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchCheckGun"); else SetStateLabel("CheckGun"); } @@ -2482,9 +2557,9 @@ Class Demolitionist : PlayerPawn SWWMHandler.AddOneliner("puzzsucc",2,10); return true; } - void A_Footstep( double yofs, bool run = false, double vol = .3 ) + void A_Footstep( double yofs, int run = 0, double vol = .3 ) { - if ( run ) + if ( run == 2 ) { A_StartSound("demolitionist/run",CHAN_FOOTSTEP,CHANF_OVERLAP,vol); let b = Spawn("InvisibleSplasher",level.Vec3Offset(pos,(RotateVector((0,yofs*.25*radius),angle),0))); @@ -2492,7 +2567,7 @@ Class Demolitionist : PlayerPawn vel.xy += (RotateVector(NormalizedMove(),angle)/3600.)*TweakSpeed(); if ( swwm_extraalert ) A_AlertMonsters(swwm_uncapalert?0:(200*vol)); } - else + else if ( run == 1 ) { A_StartSound("demolitionist/walk",CHAN_FOOTSTEP,CHANF_OVERLAP,vol*.5); let b = Spawn("InvisibleSplasher",level.Vec3Offset(pos,(RotateVector((0,yofs*.25*radius),angle),0))); @@ -2500,6 +2575,14 @@ Class Demolitionist : PlayerPawn vel.xy += (RotateVector(NormalizedMove(),angle)/4800.)*TweakSpeed(); if ( swwm_extraalert ) A_AlertMonsters(swwm_uncapalert?0:(100*vol)); } + else + { + A_StartSound("demolitionist/walk",CHAN_FOOTSTEP,CHANF_OVERLAP,vol*.2); + let b = Spawn("SmolInvisibleSplasher",level.Vec3Offset(pos,(RotateVector((0,yofs*.25*radius),angle),0))); + b.A_CheckTerrain(); + vel.xy += (RotateVector(NormalizedMove(),angle)/6400.)*TweakSpeed(); + if ( swwm_extraalert ) A_AlertMonsters(swwm_uncapalert?0:(50*vol)); + } } override bool Used( Actor user ) { @@ -2511,12 +2594,20 @@ Class Demolitionist : PlayerPawn } return false; } - bool FastCheck( bool notfast = false ) + int FastCheck() { - if ( !player ) return false; - bool rslt = player.cmd.buttons&BT_RUN; - if ( notfast ) rslt = !rslt; - return rslt; + if ( !player ) return 1; + if ( player.cmd.buttons&BT_SPEED ) return 2; // sprint + if ( !bWalking && (NormalizedMove().length() > 8000.) ) return 1; // run + return 0; // walk + } + State A_FastJump( StateLabel walk = null, StateLabel run = null, StateLabel sprint = null ) + { + int fc = FastCheck(); + if ( (fc == 2) && sprint ) return ResolveState(sprint); + if ( (fc == 1) && run ) return ResolveState(run); + if ( (fc == 0) && walk ) return ResolveState(walk); + return ResolveState(null); } bool AllowCrouch() { @@ -2739,11 +2830,11 @@ Class Demolitionist : PlayerPawn See: // normal walking #### # 2; - XZW1 BCD 2 A_JumpIf(FastCheck(false),"SeeFast"); + XZW1 BCD 2 A_FastJump(null,"SeeRun","SeeFast"); XZW1 E 0 A_Footstep(1); - XZW1 EFGHIJKL 2 A_JumpIf(FastCheck(false),"SeeFast"); + XZW1 EFGHIJKL 2 A_FastJump(null,"SeeRun","SeeFast"); XZW1 M 0 A_Footstep(-1); - XZW1 MNOPA 2 A_JumpIf(FastCheck(false),"SeeFast"); + XZW1 MNOPA 2 A_FastJump(null,"SeeRun","SeeFast"); Goto See+1; Turn: #### # 8 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.1); @@ -2751,19 +2842,38 @@ Class Demolitionist : PlayerPawn Wait; XZW1 C 3 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.1); Goto Spawn+1; + SeeRun: + #### # 2; + XZWI PQR 2 A_FastJump("See",null,"SeeFast"); + XZWI S 0 A_Footstep(1,1); + XZWI STUVWX 2 A_FastJump("See",null,"SeeFast"); + XZWI Y 0 A_Footstep(-1,1); + XZWI YZ 2 A_FastJump("See",null,"SeeFast"); + XZW1 A 2 A_FastJump("See",null,"SeeFast"); + Goto SeeRun+1; SeeFast: // sprinting #### # 2 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.3); - XZW1 QRST 2; + XZW1 QRS 2; Goto SeeFastLoop; SeeFastLoop: // keep sprinting - XZW1 U 0 A_Footstep(1,true); - XZW1 UVWXYZ 2 A_JumpIf(FastCheck(true),"SeeFastEnd"); - XZW2 A 2 A_JumpIf(FastCheck(true),"SeeFastEnd"); - XZW2 B 0 A_Footstep(-1,true); - XZW2 BCDEFG 2 A_JumpIf(FastCheck(true),"SeeFastEnd"); - XZW1 T 2 A_JumpIf(FastCheck(true),"SeeFastEnd"); + XZW1 T 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW1 U 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW1 V 0 A_Footstep(1,2); + XZW1 V 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW1 W 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW1 X 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW1 Y 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW1 Z 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW2 A 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW2 B 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW2 C 0 A_Footstep(1,2); + XZW2 C 1 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW2 D 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW2 E 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW2 F 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); + XZW2 G 2 A_JumpIf(FastCheck()!=2,"SeeFastEnd"); Goto SeeFastLoop; SeeFastEnd: // brake @@ -2797,13 +2907,13 @@ Class Demolitionist : PlayerPawn XZW3 ABCDEFG 2; XZW3 H 1 A_DMFade(); Wait; - Jump: + Boost: // start boost #### # 2; XZW3 IJKLMNO 2 { if ( player.onground||bNoGravity||(waterlevel>=3) ) - return ResolveState("JumpEnd"); + return ResolveState("BoostEnd"); A_BoostUp(true); return ResolveState(null); } @@ -2811,17 +2921,21 @@ Class Demolitionist : PlayerPawn XZW3 P 1 { if ( player.onground||bNoGravity||(waterlevel>=3) ) - return ResolveState("JumpEnd"); + return ResolveState("BoostEnd"); A_BoostUp(false); return ResolveState(null); } XZW3 P 1 A_JumpIf((vel.z<-10)&&(pos.z>(floorz+80)),"Fall"); - Goto Jump+8; - JumpEnd: + Goto Boost+8; + BoostEnd: // stop boost #### # 2; XZW3 PQRSTUVW 2; Goto Spawn+1; + Jump: + #### # 2; + XZWJ ABCDEF 2; + Goto FallLoop; Fall: // start fall #### # 4; @@ -2937,12 +3051,29 @@ Class Demolitionist : PlayerPawn XZW7 M -1; Stop; CrouchMove: - XZW7 MN 2; + #### # 4; + XZW7 MN 4 A_FastJump(null,"CrouchMoveRun","CrouchMoveFast"); + XZW7 O 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.1); + XZW7 OPQRS 4 A_FastJump(null,"CrouchMoveRun","CrouchMoveFast"); + XZW7 T 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.1); + XZW7 TUV 4 A_FastJump(null,"CrouchMoveRun","CrouchMoveFast"); + Goto CrouchMove+1; + CrouchMoveRun: + #### # 3; + XZW7 MN 3 A_FastJump("CrouchMove",null,"CrouchMoveFast"); XZW7 O 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.2); - XZW7 OPQRS 2; + XZW7 OPQRS 3 A_FastJump("CrouchMove",null,"CrouchMoveFast"); XZW7 T 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.2); - XZW7 TUV 2; - Loop; + XZW7 TUV 3 A_FastJump("CrouchMove",null,"CrouchMoveFast"); + Goto CrouchMoveRun+1; + CrouchMoveFast: + #### # 2; + XZW7 MN 2 A_FastJump("CrouchMove","CrouchMoveRun",null); + XZW7 O 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.4); + XZW7 OPQRS 2 A_FastJump("CrouchMove","CrouchMoveRun",null); + XZW7 T 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.4); + XZW7 TUV 2 A_FastJump("CrouchMove","CrouchMoveRun",null); + Goto CrouchMoveFast+2; CrouchWave: #### # 3; XZWF ABCDEFGHIJKLMNO 3; @@ -3015,12 +3146,29 @@ Class Demolitionist : PlayerPawn XZWE JKL 2; Goto SwimLoop; SwimLoop: - XZWE MNO 2; + #### # 5; + XZWE MNO 5 A_FastJump(null,"SwimLoopRun","SwimLoopFast"); + XZWE P 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.1); + XZWE PQRSTU 5 A_FastJump(null,"SwimLoopRun","SwimLoopFast"); + XZWE V 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.1); + XZWE VWX 5 A_FastJump(null,"SwimLoopRun","SwimLoopFast"); + Goto SwimLoop+1; + SwimLoopRun: + #### # 3; + XZWE MNO 3 A_FastJump("SwimLoop",null,"SwimLoopFast"); XZWE P 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.2); - XZWE PQRSTU 2; + XZWE PQRSTU 3 A_FastJump("SwimLoop",null,"SwimLoopFast"); XZWE V 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.2); - XZWE VWX 2; - Loop; + XZWE VWX 3 A_FastJump("SwimLoop",null,"SwimLoopFast"); + Goto SwimLoopRun+1; + SwimLoopFast: + #### # 2; + XZWE MNO 2 A_FastJump("SwimLoop","SwimLoopRun",null); + XZWE P 0 A_StartSound("demolitionist/runstart",CHAN_FOOTSTEP,CHANF_OVERLAP,.4); + XZWE PQRSTU 2 A_FastJump("SwimLoop","SwimLoopRun",null); + XZWE V 0 A_StartSound("demolitionist/runstop",CHAN_FOOTSTEP,CHANF_OVERLAP,.4); + XZWE VWX 2 A_FastJump("SwimLoop","SwimLoopRun",null); + Goto SwimLoopFast+1; SwimEnd: #### # 2; XZWE MYZ 2;