diff --git a/README.md b/README.md index dc138f404..c5a6a4a7c 100644 --- a/README.md +++ b/README.md @@ -401,6 +401,13 @@ A floating lamp companion, may attract moths. The moths will disperse and attack Reveals the entire layout of the map and shows key locations in the HUD. Also allows you to highlight pickups through walls when holding the **Item Sense** button. +### Mykradvo Artifact ~ May randomly replace Ghost Artifact, Ragekit or Invinciball +![](docimg/mykradvo.png) + +When used, bursts into plasma tendrils that will seek all hostiles within 100m and fry them good. If there are no hostiles around, the artifact will simply not ignite. + +Has a chance to spawn in place of other items, but only one may spawn per map. + ## The Collectibles ![](docimg/chancebox.png) diff --git a/cvarinfo.txt b/cvarinfo.txt index c7446cc6a..0fa13efe7 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -218,6 +218,8 @@ nosave int swwm_achievement_sanic = 0; nosave int swwm_achievement_tele = 0; nosave int swwm_achievement_bune = 0; nosave int swwm_achievement_bonk = 0; +nosave int swwm_achievement_anom = 0; +nosave int swwm_achievement_anone = 0; nosave int swwm_achievement_tetris = 0; nosave int swwm_achievement_pong = 0; nosave int swwm_achievement_snake = 0; @@ -267,3 +269,4 @@ nosave int swwm_progress_acid = 0; nosave int swwm_progress_mega = 0; nosave int swwm_progress_bune = 0; nosave int swwm_progress_bonk = 0; +nosave int swwm_progress_anom = 0; diff --git a/docimg/mykradvo.png b/docimg/mykradvo.png new file mode 100644 index 000000000..7915d4109 Binary files /dev/null and b/docimg/mykradvo.png differ diff --git a/gldefs.pickups b/gldefs.pickups index e765b9350..ec4f5fbfb 100644 --- a/gldefs.pickups +++ b/gldefs.pickups @@ -72,6 +72,17 @@ Brightmap Texture "models/Barrier.png" Map "models/Barrier_bright.png" DisableFullbright } +HardwareShader Sprite "MKRVA0" +{ + Shader "shaders/glsl/Mykradvo.fp" + Texture "warptex" "textures/warptex.png" + Texture "snoisetex" "textures/softnoise.png" +} +HardwareShader Texture "models/extra/AnomRingies.png" +{ + Shader "shaders/glsl/Mykradvo2.fp" + Texture "warptex" "textures/heattex.png" +} PointLight ARMORNUGGETLIGHT { @@ -209,3 +220,39 @@ Object EBarrier { Frame "XZW1" { light "BARRIERLIGHT" } } + +FlickerLight2 MYKRADVOLIGHT1 +{ + Color 0.9 0.6 1.0 + Size 70 + SecondarySize 80 + Interval 0.1 + Attenuate 1 +} +PulseLight MYKRADVOLIGHT2 +{ + Color 0.4 0.1 0.7 + Size 90 + SecondarySize 60 + Interval 2 + Attenuate 1 +} +PulseLight MYKRADVOLIGHT3 +{ + Color 0.7 0.1 0.4 + Size 60 + SecondarySize 90 + Interval 2 + Attenuate 1 +} + +Object MykradvoX +{ + Frame "MKRV" { light "MYKRADVOLIGHT1" } +} +Object MykradvoX2 +{ + Frame "XZW1A" { light "MYKRADVOLIGHT2" } + Frame "XZW1B" { light "MYKRADVOLIGHT3" } +} + diff --git a/graphics/HUD/Icons/I_Mykradvo.png b/graphics/HUD/Icons/I_Mykradvo.png new file mode 100644 index 000000000..ca4dce2e9 Binary files /dev/null and b/graphics/HUD/Icons/I_Mykradvo.png differ diff --git a/language.def_base b/language.def_base index 68fe9058e..a12c29b3c 100644 --- a/language.def_base +++ b/language.def_base @@ -114,6 +114,7 @@ T_REFRESHER = "Refresher"; T_SANDWICH = "Grilled Cheese Sandwich"; T_WARARMOR = "War Armor"; T_BARRIER = "Elemental Coating"; +T_MYKRADVO = "Mykradvo Artifact"; T_CHANCEBOX = "Lucky Chance Box"; T_FROGGY = "Froggy Chair"; T_PERFECTLYGENERIC = "Generic Cube"; @@ -469,6 +470,7 @@ O_MASHIRO3 = "%o made a terrible mistake."; O_MASHIRO4 = "%o mysteriously disappeared."; O_MASHIRO5 = "%o angered the wrong moth."; O_ENDLEVEL = "Looks like %o will have to pistol start."; +O_MYKRADVO = "%o couldn't hide from %k's vengeful wrath."; // edited vanilla obituaries OB_SUICIDE = "%o commited suikoden."; OB_FALLING = "%o sprained everything."; @@ -973,13 +975,17 @@ SWWM_ACHIEVEMENT_NOBUY_TXT = "Don't spend any money for %d maps straight"; SWWM_ACHIEVEMENT_MEGA_TAG = "Megadeath"; SWWM_ACHIEVEMENT_MEGA_TXT = "Kill a grand total of one million enemies"; SWWM_ACHIEVEMENT_SANIC_TAG = "CHILLI DOGS"; -SWWM_ACHIEVEMENT_SANIC_TXT = "Reach a top speed of %d km/h."; +SWWM_ACHIEVEMENT_SANIC_TXT = "Reach a top speed of %d km/h"; SWWM_ACHIEVEMENT_TELE_TAG = "A Soldier's Pastime"; SWWM_ACHIEVEMENT_TELE_TXT = "Teleport some bread (a sandwich works too)"; SWWM_ACHIEVEMENT_BUNE_TAG = "Legendary Lagomorph"; -SWWM_ACHIEVEMENT_BUNE_TXT = "Bunnyhop %d times."; +SWWM_ACHIEVEMENT_BUNE_TXT = "Bunnyhop %d times"; SWWM_ACHIEVEMENT_BONK_TAG = "Shock Resistant"; -SWWM_ACHIEVEMENT_BONK_TXT = "Bump into stuff %d times."; +SWWM_ACHIEVEMENT_BONK_TXT = "Bump into stuff %d times"; +SWWM_ACHIEVEMENT_ANOM_TAG = "Anomalous"; +SWWM_ACHIEVEMENT_ANOM_TXT = "Use %d Mykradvo Artifacts"; +SWWM_ACHIEVEMENT_ANONE_TAG = "Completely Necessary Use of Force"; +SWWM_ACHIEVEMENT_ANONE_TXT = "Use the Mykradvo Artifact against a single non-boss enemy"; SWWM_ACHIEVEMENT_TETRIS_TAG = "Tetromination"; SWWM_ACHIEVEMENT_TETRIS_TXT = "Complete a full game of Tetris"; SWWM_ACHIEVEMENT_PONG_TAG = "Danny Won, Yeah"; diff --git a/language.def_lore b/language.def_lore index 288b45985..4d9778783 100644 --- a/language.def_lore +++ b/language.def_lore @@ -305,6 +305,10 @@ SWWM_LORETAG_MUNCH = "Munch Innovations"; SWWM_LORETAB_MUNCH = "People"; SWWM_LOREREL_MUNCH = "Saya;Explodium;ExplodiumGun"; SWWM_LORETXT_MUNCH = "\cxName:\c-\n\cf Munch Innovations\c-\n\cxClassification:\c-\n\cf Smart Home Appliance Manufacturer\c-\n\cf Arms Manufacturer\c-\n\cxLocation:\c-\n\cf Texas\c-\n\cxWebsite:\c-\n\cf https://munch.home\c-\n\nInitially starting its days producing smart appliances for home use, \cfMunch Innovations\c- suddenly entered the weapons market without a second thought after \cfParker Munch\c-, son of company founder \cfAllen Munch\c- and well-known gun enthusiast, made the decision to acquire all the research material and patents on a new plastic explosive known as \cfExplodium\c-.\n\nFollowing the success of Parker's \cfExplodium Gun\c-, he went on to announce an \"invent as many guns as I can in one week\" challenge on his Twitter, furthermore going through each and every one of the various designs he'd come up with. Not many of those succeeded, although a much more powerful (albeit dangerous) new model of the Explodium Gun did gain some recognition (mainly among people crazy enough to want to use it).\n\nMany of the designs that did succeed would enter the market under the Munch Innovations brand, however, and sell like hotcakes, especially on US territory.\n\n\cxSaya's Notes:\c-\n\cfGotta love how in this day and age, pretty much anyone can start making guns. I mean, for those american idiots, it's not unexpected, but yeah.\c-\n\n\cfAlso is it just me or... that guy's name sounds hella familiar? I swear, I've heard that name before... or something similar, maybe? If my brain wasn't so scrambled from living this long I'd remember it right away, fml.\c-"; +SWWM_LORETAG_MYKRADVO = "Mykradvo Artifact"; +SWWM_LORETAB_MYKRADVO = "Item"; +SWWM_LOREREL_MYKRADVO = "Nedoshiaan;Devanikna;Saya"; +SWWM_LORETXT_MYKRADVO = "\cxDesignation:\c-\n\cf Mykradvo Artifact\c-\n\cxManufacturer:\c-\n\cf Nukurines Mei Mess\c-\n\cf Nekorosen Nerukousei\c-\n\cxClassification:\c-\n\cf Magic Bomb\c-\n\nThe \cfMykradvo (Vengeful Heart)\c-, also known as the \cf\"Great Anomaly\"\c- by some, is a magic artifact that releases tendrils of searing hot plasma onto any targets within 100 meters that bear ill will towards the person who crushes it in their hands.\n\nA joint project between \cfNukurines Mei Mess\c- and \cfNekorosen Nerukousei\c-, initiated back when they served under the tyrant god \cfNedoshiaan\c-, the Mykradvo is best described as the \"ultimate panic button\". Even long after their master's death, newer instances of this artifact would still be produced, as its usefulness in battle was seen to outweigh the concerns about the evil nature of its conception.\n\nAll newly created artifacts have only a fraction of the power of the original, retrieved together with other artifacts of the dead god during a \cfDevanikan\c- expedition to the ruined planet where Nedoshiaan's empire once stood. However, this is for the best, considering the dangers upon the world that would be unleashed should the original article be detonated.\n\n\cxSaya's Notes:\c-\n\cfBig fuckoff orb of DIE. That's what this thing is. You give it a firm ol' squish and BOOM, everything around you dies. Definitely can see why people call it a panic button, yeah.\c-\n\n\cfI remember one time I squeezed it by accident and it didn't do anything. I guess it's smart enough to not blow up if there's no one around who wants you dead. Handy.\c-"; SWWM_LORETAG_NANA = "Miyamoto, Nana"; SWWM_LORETAB_NANA = "People"; SWWM_LOREREL_NANA = "Ryuji;Saya;Gensokyo;Yui;Taro;Kirin"; diff --git a/language.es_base b/language.es_base index 77a33715e..624dd7557 100644 --- a/language.es_base +++ b/language.es_base @@ -104,6 +104,7 @@ T_REFRESHER = "Refrescador"; T_SANDWICH = "Sándwich de Queso a la Plancha"; T_WARARMOR = "Armadura de Guerra"; T_BARRIER = "Revestimiento Elemental"; +T_MYKRADVO = "Artefacto Mykradvo"; T_CHANCEBOX = "Caja Afortunada"; T_FROGGY = "Silla Rana"; T_PERFECTLYGENERIC = "Cubo Genérico"; @@ -400,6 +401,7 @@ O_MASHIRO3 = "%o ha cometido un error terrible."; O_MASHIRO4 = "%o desapareció misteriosamente."; O_MASHIRO5 = "%o enfureció a la polilla equivocada."; O_ENDLEVEL = "Parece que a %o le toca hacer pistol start."; +O_MYKRADVO = "%o no pudo esconderse de la ira vengativa de %k."; // edited vanilla obituaries OB_SUICIDE = "%o se hizo un sudoku."; OB_FALLING = "%o se partió las patas."; @@ -872,9 +874,13 @@ SWWM_ACHIEVEMENT_SANIC_TXT = "Alcanza una velocidad punta de %d km/h"; SWWM_ACHIEVEMENT_TELE_TAG = "Pasatiempo de Soldado"; SWWM_ACHIEVEMENT_TELE_TXT = "Teletransporta pan (un sandwich también vale)"; SWWM_ACHIEVEMENT_BUNE_TAG = "Lagomorfo Legendario"; -SWWM_ACHIEVEMENT_BUNE_TXT = "Realiza %d bunnyhops."; +SWWM_ACHIEVEMENT_BUNE_TXT = "Realiza %d bunnyhops"; SWWM_ACHIEVEMENT_BONK_TAG = "Resistente a Choques"; -SWWM_ACHIEVEMENT_BONK_TXT = "Choca %d veces."; +SWWM_ACHIEVEMENT_BONK_TXT = "Choca %d veces"; +SWWM_ACHIEVEMENT_ANOM_TAG = "Anómalo"; +SWWM_ACHIEVEMENT_ANOM_TXT = "Usa %d Artefactos Mykradvo"; +SWWM_ACHIEVEMENT_ANONE_TAG = "Uso Completamente Necesario de Fuerza"; +SWWM_ACHIEVEMENT_ANONE_TXT = "Usa el Artefacto Mykradvo contra un único enemigo no-jefe"; SWWM_ACHIEVEMENT_TETRIS_TAG = "Tetrominación"; SWWM_ACHIEVEMENT_TETRIS_TXT = "Completa una partida entera de Tetris"; SWWM_ACHIEVEMENT_PONG_TAG = "Danny Ganó, Yeah"; diff --git a/language.es_lore b/language.es_lore index 4e677a07f..2f5097de4 100644 --- a/language.es_lore +++ b/language.es_lore @@ -131,6 +131,8 @@ SWWM_LORETAG_MOTHPLUSHY = "Peluche de Polilla"; SWWM_LORETXT_MOTHPLUSHY = "\cxDesignación:\c-\n\cf Peluche de Mashiro la Chica Polilla\c-\n\cxFabricante:\c-\n\cf Nukritas 2xx\c-\n\cxClasificación:\c-\n\cf Muñeco de Peluche\c-\n\nUn muñeco de peluche cariñosamente creado a mano de \cfMashiro\c-, la chica polilla, para buenos niños y niñas por igual. Como todas las polillas, le encanta la luz de una buena lámpara. Si la provees del calmante brillo de una \cfLámpara Compañera Sankai\c-, puede que tengas una amiga fiable, puede que incluso una amante. Solo, no hagas ruido, puede que la asustes.\n\nEn \cfPlutoni Incorporated\c- no nos hacemos responsables si acabas atrapada en un bucle de tiempo con una buena chica polilla haciéndote compañía.\n\n\cxNotas de Saya:\c-\n\cfHay un montón de estas en mi dormitorio, sabes. Una por cada vez que esos dos me han cabreado. Da miedo que me conozcan tan bien, en serio.\c-\n\n\cfOh por cierto, me han dicho que esa en específico que tienes, de su estúpida mierda gacha, está potencialmente maldita. No me gusta PARA NADA como suena eso... a no ser... ¿Y si resulta que atrae una chica polilla de verdad? Oh dios oh tío quiero ver eso porfa PORFA.\c-"; SWWM_LORETAG_MUNCH = "Innovaciones Munch"; SWWM_LORETXT_MUNCH = "\cxNombre:\c-\n\cf Innovaciones Munch\c-\n\cxClasificación:\c-\n\cf Fabricante de Aparatos del Hogar Inteligentes\c-\n\cf Fabricante de Armas\c-\n\cxLocalización:\c-\n\cf Texas\c-\n\cxPágina Web:\c-\n\cf https://munch.home\c-\n\nInicialmente siendo un productor de aparatos inteligentes para el hogar, \cfInnovaciones Munch\c- entró repentinamente en el mercado de armas sin pensarlo dos veces después de que \cfParker Munch\c-, hijo del fundador \cfAllen Munch\c-, y un bien conocido entusiasta de las armas, tomara la decisión de obtener todo el material de investigación y patentes sobre un nuevo explosivo plástico conocido como \cfExplodium\c-.\n\nTras el éxito de la \cfPistola de Explodium\c- de Parker, decidió anunciar un reto de \"inventar todas las armas que pueda en una semana\" en su Twitter, consiguientemente posteando sobre todos y cada uno de los diseños que se le iban ocurriendo. No muchos de estos fueron exitosos, aunque un modelo más poderoso (y peligroso) de Pistola de Explodium sí ganó cierto reconocimiento (principalmente entre gente lo suficientemente loca como para querer usarlo).\n\nSin embargo, los muchos diseños que sí llegaron a tener éxito entrarían al mercado bajo la marca de Innovaciones Munch, y se venderían como roscas, especialmente en el territorio de la Unión de Estados.\n\n\cxNotas de Saya:\c-\n\cfMe encanta como en estos tiempos que corren, cualquier tío puede ir y empezar a hacer armas. A ver, con los idiotas americanos, no es una sorpresa, pero ya.\c-\n\n\cfAh y ¿es cosa mía o... el nombre del tío ese suena jodidamente familiar? Lo juro, es que yo he oído ese nombre antes... o algo parecido, ¿creo? Si mi cerebro no estuviera tan revuelto de haber vivido tanto lo recordaría al momento, asco de vida.\c-"; +SWWM_LORETAG_MYKRADVO = "Artefacto Mykradvo"; +SWWM_LORETXT_MYKRADVO = "\cxDesignación:\c-\n\cf Artefacto Mykradvo\c-\n\cxFabricante:\c-\n\cf Nukurines Mei Mess\c-\n\cf Nekorosen Nerukousei\c-\n\cxClasificación:\c-\n\cf Bomba Mágica\c-\n\nEl \cfMykradvo (Corazón Vengativo)\c-, también conocido por algunos como la \cf\"Gran Anomalía\"\c-, es un artefacto mágico que libera filamentos de plasma candente contra cualquier objetivo en 100 metros que muestre hostilidad hacia la persona que lo exprima entre sus manos.\n\nUn proyecto conjunto de \cfNukurines Mei Mess\c- y \cfNekorosen Nerukousei\c-, iniciado en sus tiempos de servidumbre bajo el dios tirano \cfNedoshiaan\c-, el Mykradvo suele ser descrito como el \"botón de pánico definitivo\". Incluso mucho después de la muerte de su maestro, nuevas instancias de este artefacto serían producidas, ya que su utilidad en batalla se considera más importante que cualquier duda sobre la naturaleza maligna de su concepción.\n\nTodos los artefactos nuevamente creados poseen solo una fracción del poder del original, recuperado junto con otros artefactos del dios muerto durante una expedición \cfDevanikan\c- al planeta desolado en el que el imperio de Nedoshiaan una vez estuvo. Sin embargo, es mejor así, considerando lo peligroso para el mundo que sería desatar la fuerza del artefacto original.\n\n\cxNotas de Saya:\c-\n\cfGran orbe de puta MUERTE. Eso es lo que es esto. Le das un buen apretujón ahí y BUM, todo lo que te rodea muere. Desde luego puedo ver por qué la gente lo llama un botón de pánico, pues sí.\c-\n\n\cfRecuerdo una vez que lo apreté sin querer y no hizo nada. Supongo que es lo bastante listo como para no reventar si no hay nadie por ahí que te quiera matar. Muy útil.\c-"; SWWM_LORETXT_NANA = "\cxNombre Completo:\c-\n\cf Nana Miyamoto\c-\n\cxNacionalidad:\c-\n\cf Japonesa\c-\n\cxFecha de Nacimiento:\c-\n\cf 1907-07-07\c-\n\n\cfNana\c- es la hija única de \cfKaguya Houraisan\c-, la princesa \cfLunar\c- exiliada que hizo de \cfGensokyo\c- su hogar. Habiendo sido criada y educada completamente dentro de los confines de \cfEientei\c- no sabía mucho del mundo exterior, y habría pasado el resto de su vida eterna ahí, de no haber sido por un encuentro inesperado con \cfRyuji Miyamoto\c- en los años 60. Habiendo huido de la \cfAldea Humana\c-, se cruzó con Nana. Los dos entablaron una amistad cercana, y el joven chico hizo la promesa de casarse con ella cuando creciera, y llevarla al exterior, para que pudiese \"ver el mundo\". Esto ocurriría en 1973, con los dos dejando atrás Gensokyo para formar una familia.\n\nSiendo parte de la realeza, Nana ha ganado bastante fama en Japón, apareciendo incluso en varios programas de entrevistas. También es bien conocida por sus habilidades en varias artes marciales, y ha ganado varios torneos durante años. Otros de sus hobbies también incluyen la pintura y talla de madera, y es una cocinera muy hábil.\n\nNana tiene tres hijos, los cuales, como ella, han heredado la sangre inmortal de la princesa lunar: \cfTaro\c-, \cfSaya\c- y \cfYui\c-. Cada uno de ellos ha tenido un gran éxito en sus propias hazañas, algo de lo que Nana habla en gran detalle, muy orgullosa.\n\n\cxNotas de Saya:\c-\n\cfLa más mejor mamá del mundo, no voy a mentir. Puede que sea estricta a veces, o se enfade conmigo por estar despierta hasta muy tarde (si es que se da cuenta, je), pero realmente es la mejor. Aun no la has conocido, Demo-chan, pero seguro que le vas a caer muy bien. Te aseguro que es muy maja a pesar del miedo que da la pinta que tiene a veces. No es para nada como Kaguya obaa-san, que juro que siempre tiene ese aura que es como... normal que los tíos le tengan miedo, siempre con un miedo constante a que les haga CBT en cualquier momento.\c-"; SWWM_LORETXT_NANA2 = "\cxNombre Completo:\c-\n\cf Nana Miyamoto\c-\n\cxNacionalidad:\c-\n\cf Japonesa\c-\n\cxFecha de Nacimiento:\c-\n\cf 1907-07-07\c-\n\n\cfNana\c- es la hija única de \cfKaguya Houraisan\c-, la princesa \cfLunar\c- exiliada que hizo de \cfGensokyo\c- su hogar. Habiendo sido criada y educada completamente dentro de los confines de \cfEientei\c- no sabía mucho del mundo exterior, y habría pasado el resto de su vida eterna ahí, de no haber sido por un encuentro inesperado con \cfRyuji Miyamoto\c- en los años 60. Habiendo huido de la \cfAldea Humana\c-, se cruzó con Nana. Los dos entablaron una amistad cercana, y el joven chico hizo la promesa de casarse con ella cuando creciera, y llevarla al exterior, para que pudiese \"ver el mundo\". Esto ocurriría en 1973, con los dos dejando atrás Gensokyo para formar una familia.\n\nSiendo parte de la realeza, Nana ha ganado bastante fama en Japón, apareciendo incluso en varios programas de entrevistas. También es bien conocida por sus habilidades en varias artes marciales, y ha ganado varios torneos durante años. Otros de sus hobbies también incluyen la pintura y talla de madera, y es una cocinera muy hábil.\n\nNana tiene tres hijos, los cuales, como ella, han heredado la sangre inmortal de la princesa lunar: \cfTaro\c-, \cfSaya\c- y \cfYui\c-. Cada uno de ellos ha tenido un gran éxito en sus propias hazañas, algo de lo que Nana habla en gran detalle, muy orgullosa.\n\n\cxNotas de Saya:\c-\n\cfOkaa-san es tan feliz de que vayas por ahí haciendo el bien. Me moló que le gustaras. Si es que te lo dije.\c-\n\n\cfPor cierto, me di cuenta, sabes, cuando te dio ese abrazo, sí. No ha intentado ver a otros tíos desde que perdimos a papá... Pero creo que a lo mejor... puede que le gustes de una forma algo diferente, ya sabes...\c-"; SWWM_LORETXT_NANA3 = "\cxNombre Completo:\c-\n\cf Nana Miyamoto\c-\n\cxNacionalidad:\c-\n\cf Japonesa\c-\n\cxFecha de Nacimiento:\c-\n\cf 1907-07-07\c-\n\n\cfNana\c- es la hija única de \cfKaguya Houraisan\c-, la princesa \cfLunar\c- exiliada que hizo de \cfGensokyo\c- su hogar. Habiendo sido criada y educada completamente dentro de los confines de \cfEientei\c- no sabía mucho del mundo exterior, y habría pasado el resto de su vida eterna ahí, de no haber sido por un encuentro inesperado con \cfRyuji Miyamoto\c- en los años 60. Habiendo huido de la \cfAldea Humana\c-, se cruzó con Nana. Los dos entablaron una amistad cercana, y el joven chico hizo la promesa de casarse con ella cuando creciera, y llevarla al exterior, para que pudiese \"ver el mundo\". Esto ocurriría en 1973, con los dos dejando atrás Gensokyo para formar una familia.\n\nSiendo parte de la realeza, Nana ha ganado bastante fama en Japón, apareciendo incluso en varios programas de entrevistas. También es bien conocida por sus habilidades en varias artes marciales, y ha ganado varios torneos durante años. Otros de sus hobbies también incluyen la pintura y talla de madera, y es una cocinera muy hábil.\n\nNana tiene tres hijos, los cuales, como ella, han heredado la sangre inmortal de la princesa lunar: \cfTaro\c-, \cfSaya\c- y \cfYui\c-. Cada uno de ellos ha tenido un gran éxito en sus propias hazañas, algo de lo que Nana habla en gran detalle, muy orgullosa.\n\n\cxNotas de Saya:\c-\n\cfOkaa-san es tan feliz de que vayas por ahí haciendo el bien. Me moló que le gustaras. Si es que te lo dije.\c-\n\n\cfOh ya, en la boda, con Kirin... ¿recuerdas? Resulta que tenía razón, después de todo. Se ha pasado a la \"otra acera\" ahora. Dios, como os envidio a todas, habiéndoos perdido esa escena. Ver a mamá justo ahí, dándose el lote con la de Ashley-san... Desearía poder des-verlo, pero ahora hasta planean casarse. ¿Eso no haría que Yu-chan y Ashley-san fuesen hermanas? A ver, las dos ya son pareja y tal... Va a ser raro.\c-\n\n\cfEspera... Si ese es el caso, entonces... ENTONCES KIRIN-KUN Y YO... ¿¿¿ME VOY A CONVERTIR EN SU TÍA???\c-\n\n\cf... ahora que lo pienso, la verdad es que no importa. Yo es que ya he pecado, considerando que estáis tú, Ibuki y Meido. Técnicamente sois mis hijas (y además Ibuki es mi propio clon), después de todo.\c-"; diff --git a/language.version b/language.version index f7f90ac43..37968c248 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r364 \cu(Tue 16 Mar 23:29:26 CET 2021)\c-"; -SWWM_SHORTVER="\cw0.9.11b-pre r364 \cu(2021-03-16 23:29:26)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r365 \cu(Wed 17 Mar 20:16:17 CET 2021)\c-"; +SWWM_SHORTVER="\cw0.9.11b-pre r365 \cu(2021-03-17 20:16:17)\c-"; diff --git a/lore/default/mykradvo.txt b/lore/default/mykradvo.txt new file mode 100644 index 000000000..c398e1bd6 --- /dev/null +++ b/lore/default/mykradvo.txt @@ -0,0 +1,25 @@ +TAG +Mykradvo Artifact +TAB +Item +REL +Nedoshiaan;Devanikna;Saya +TXT +\cxDesignation:\c- +\cf Mykradvo Artifact\c- +\cxManufacturer:\c- +\cf Nukurines Mei Mess\c- +\cf Nekorosen Nerukousei\c- +\cxClassification:\c- +\cf Magic Bomb\c- + +The **Mykradvo (Vengeful Heart)**, also known as the **"Great Anomaly"** by some, is a magic artifact that releases tendrils of searing hot plasma onto any targets within 100 meters that bear ill will towards the person who crushes it in their hands. + +A joint project between **Nukurines Mei Mess** and **Nekorosen Nerukousei**, initiated back when they served under the tyrant god **Nedoshiaan**, the Mykradvo is best described as the "ultimate panic button". Even long after their master's death, newer instances of this artifact would still be produced, as its usefulness in battle was seen to outweigh the concerns about the evil nature of its conception. + +All newly created artifacts have only a fraction of the power of the original, retrieved together with other artifacts of the dead god during a **Devanikan** expedition to the ruined planet where Nedoshiaan's empire once stood. However, this is for the best, considering the dangers upon the world that would be unleashed should the original article be detonated. + +\cxSaya's Notes:\c- +\cfBig fuckoff orb of DIE. That's what this thing is. You give it a firm ol' squish and BOOM, everything around you dies. Definitely can see why people call it a panic button, yeah.\c- + +\cfI remember one time I squeezed it by accident and it didn't do anything. I guess it's smart enough to not blow up if there's no one around who wants you dead. Handy.\c- diff --git a/lore/es/mykradvo.txt b/lore/es/mykradvo.txt new file mode 100644 index 000000000..f759e482b --- /dev/null +++ b/lore/es/mykradvo.txt @@ -0,0 +1,21 @@ +TAG +Artefacto Mykradvo +TXT +\cxDesignación:\c- +\cf Artefacto Mykradvo\c- +\cxFabricante:\c- +\cf Nukurines Mei Mess\c- +\cf Nekorosen Nerukousei\c- +\cxClasificación:\c- +\cf Bomba Mágica\c- + +El **Mykradvo (Corazón Vengativo)**, también conocido por algunos como la **"Gran Anomalía"**, es un artefacto mágico que libera filamentos de plasma candente contra cualquier objetivo en 100 metros que muestre hostilidad hacia la persona que lo exprima entre sus manos. + +Un proyecto conjunto de **Nukurines Mei Mess** y **Nekorosen Nerukousei**, iniciado en sus tiempos de servidumbre bajo el dios tirano **Nedoshiaan**, el Mykradvo suele ser descrito como el "botón de pánico definitivo". Incluso mucho después de la muerte de su maestro, nuevas instancias de este artefacto serían producidas, ya que su utilidad en batalla se considera más importante que cualquier duda sobre la naturaleza maligna de su concepción. + +Todos los artefactos nuevamente creados poseen solo una fracción del poder del original, recuperado junto con otros artefactos del dios muerto durante una expedición **Devanikan** al planeta desolado en el que el imperio de Nedoshiaan una vez estuvo. Sin embargo, es mejor así, considerando lo peligroso para el mundo que sería desatar la fuerza del artefacto original. + +\cxNotas de Saya:\c- +\cfGran orbe de puta MUERTE. Eso es lo que es esto. Le das un buen apretujón ahí y BUM, todo lo que te rodea muere. Desde luego puedo ver por qué la gente lo llama un botón de pánico, pues sí.\c- + +\cfRecuerdo una vez que lo apreté sin querer y no hizo nada. Supongo que es lo bastante listo como para no reventar si no hay nadie por ahí que te quiera matar. Muy útil.\c- diff --git a/modeldef.misc b/modeldef.misc index cc32625cf..f3a14d217 100644 --- a/modeldef.misc +++ b/modeldef.misc @@ -151,6 +151,97 @@ Model "DemolitionistRadiusShockwaveTail" FrameIndex XZW1 A 0 0 } +Model "MykradvoTendril" +{ + Path "models/extra" + + Model 0 "WarpBeam3_d.3d" + Skin 0 "AnomTrail.png" + Scale 0.25 0.25 0.25 + Offset 32 0 0 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + // base + FrameIndex XZW1 A 0 0 + // low deviation + FrameIndex XZW1 B 0 1 + FrameIndex XZW1 C 0 2 + FrameIndex XZW1 D 0 3 + FrameIndex XZW1 E 0 4 + // mid deviation + FrameIndex XZW1 F 0 5 + FrameIndex XZW1 G 0 6 + FrameIndex XZW1 H 0 7 + FrameIndex XZW1 I 0 8 + // high deviation + FrameIndex XZW1 J 0 9 + FrameIndex XZW1 K 0 10 + FrameIndex XZW1 L 0 11 + FrameIndex XZW1 M 0 12 +} +Model "MykradvoSmallTendril" +{ + Path "models/extra" + + Model 0 "WarpBeam2_d.3d" + Skin 0 "AnomTrail.png" + Scale 0.0625 0.125 0.125 + Offset 8 0 0 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + // base + FrameIndex XZW1 A 0 0 + // low deviation + FrameIndex XZW1 B 0 1 + FrameIndex XZW1 C 0 2 + FrameIndex XZW1 D 0 3 + FrameIndex XZW1 E 0 4 + // mid deviation + FrameIndex XZW1 F 0 5 + FrameIndex XZW1 G 0 6 + FrameIndex XZW1 H 0 7 + FrameIndex XZW1 I 0 8 + // high deviation + FrameIndex XZW1 J 0 9 + FrameIndex XZW1 K 0 10 + FrameIndex XZW1 L 0 11 + FrameIndex XZW1 M 0 12 +} +Model "MykradvoSmallNullTendril" +{ + Path "models/extra" + + Model 0 "WarpBeam2_d.3d" + Skin 0 "AnomTrail.png" + Scale 0.03125 0.0625 0.0625 + Offset 4 0 0 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + // base + FrameIndex XZW1 A 0 0 + // low deviation + FrameIndex XZW1 B 0 1 + FrameIndex XZW1 C 0 2 + FrameIndex XZW1 D 0 3 + FrameIndex XZW1 E 0 4 + // mid deviation + FrameIndex XZW1 F 0 5 + FrameIndex XZW1 G 0 6 + FrameIndex XZW1 H 0 7 + FrameIndex XZW1 I 0 8 + // high deviation + FrameIndex XZW1 J 0 9 + FrameIndex XZW1 K 0 10 + FrameIndex XZW1 L 0 11 + FrameIndex XZW1 M 0 12 +} + Model "SWWMShadow" { Path "models/extra" diff --git a/modeldef.pickups b/modeldef.pickups index 2e8526f7d..3ccbaf934 100644 --- a/modeldef.pickups +++ b/modeldef.pickups @@ -285,3 +285,17 @@ Model "EBarrierX" FrameIndex XZW1 A 0 0 } +Model "MykradvoX2" +{ + Path "models/extra" + Model 0 "Flat_d.3d" + Skin 0 "AnomRingies.png" + Scale 0.08 0.08 0.08 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + FrameIndex XZW1 A 0 0 + AngleOffset 180 + FrameIndex XZW1 B 0 0 +} diff --git a/modeldef.spreadgun b/modeldef.spreadgun index d242afbbf..08b0adb10 100644 --- a/modeldef.spreadgun +++ b/modeldef.spreadgun @@ -101,7 +101,7 @@ Model "SaltBeam" { Path "models/extra" - Model 0 "WarpBeam_d.3d" + Model 0 "WarpBeam2_d.3d" Scale 0.125 0.125 0.125 Offset 16 0 0 DONTCULLBACKFACES diff --git a/modeldef.ynykron b/modeldef.ynykron index 0dc0a0cfd..0c4979648 100644 --- a/modeldef.ynykron +++ b/modeldef.ynykron @@ -2,7 +2,7 @@ Model "YnykronBeam" { Path "models/extra" - Model 0 "WarpBeam_d.3d" + Model 0 "WarpBeam2_d.3d" Scale 1.0 1.0 1.0 Offset 128 0 0 DONTCULLBACKFACES @@ -96,7 +96,7 @@ Model "YnykronAltBeam" { Path "models/extra" - Model 0 "WarpBeam_d.3d" + Model 0 "WarpBeam2_d.3d" Scale 0.5 0.5 0.5 Offset 64 0 0 DONTCULLBACKFACES diff --git a/models/extra/AnomRingies.png b/models/extra/AnomRingies.png new file mode 100644 index 000000000..85c63eaef Binary files /dev/null and b/models/extra/AnomRingies.png differ diff --git a/models/extra/AnomTrail.png b/models/extra/AnomTrail.png new file mode 100644 index 000000000..69d399786 Binary files /dev/null and b/models/extra/AnomTrail.png differ diff --git a/models/extra/WarpBeam2_a.3d b/models/extra/WarpBeam2_a.3d new file mode 100644 index 000000000..db46a09fc Binary files /dev/null and b/models/extra/WarpBeam2_a.3d differ diff --git a/models/extra/WarpBeam2_d.3d b/models/extra/WarpBeam2_d.3d new file mode 100644 index 000000000..79e73652a Binary files /dev/null and b/models/extra/WarpBeam2_d.3d differ diff --git a/models/extra/WarpBeam3_a.3d b/models/extra/WarpBeam3_a.3d new file mode 100644 index 000000000..c8856480a Binary files /dev/null and b/models/extra/WarpBeam3_a.3d differ diff --git a/models/extra/WarpBeam3_d.3d b/models/extra/WarpBeam3_d.3d new file mode 100644 index 000000000..ac89c1b6b Binary files /dev/null and b/models/extra/WarpBeam3_d.3d differ diff --git a/shaders/glsl/Mykradvo.fp b/shaders/glsl/Mykradvo.fp new file mode 100644 index 000000000..8d2aff26c --- /dev/null +++ b/shaders/glsl/Mykradvo.fp @@ -0,0 +1,36 @@ +const float pi = 3.14159265358979323846; + +vec4 ProcessTexel() +{ + vec2 p = 2.*(vTexCoord.st-.5); + float a = atan(p.y,p.x); + float r = length(p); + // noise burst + vec2 ccoord = vec2(.1/r-.06*timer+.5*r,a/pi+.04*timer); + vec3 nz = texture(warptex,ccoord).rgb; + ccoord = vec2(.4/r-.08*timer+1.4*r,a/pi-.04*timer); + nz += texture(warptex,ccoord).rgb; + nz = clamp((nz-1.)*.5,-1.,1.); + nz *= abs(2.*r-1.); + // shimmering flare + vec3 flr = vec3(1.-r*2.)+vec3(.6,.3,.4)*texture(snoisetex,vec2(2.*a/pi-timer*.05,0.)).r + +vec3(.1,.2,.9)*texture(snoisetex,vec2(3.*a/pi+timer*.07,0.)).g + +vec3(.4,.7,.3)*texture(snoisetex,vec2(a/pi-timer*.09,0.)).b; + // readjust flare + flr = pow(max(flr,0.),vec3(.5)); + // distort by flare + nz.x -= p.x*min(min(flr.r,flr.g),flr.b)*max(1.-r,0.); + nz.y -= p.y*min(min(flr.r,flr.g),flr.b)*max(1.-r,0.); + // readjust flare + flr = pow(max(flr,0.),vec3(8.)); + // color flicker + flr *= .4+.6*texture(snoisetex,vTexCoord.st*.02/r+.02*timer).rgb; + // sample ring + vec3 col = getTexel(vTexCoord.st+(nz.xy*.1)).rgb; + // overlay flare + col *= max(1.-pow(flr.b,.25),0.); + col += flr; + // debug: uncomment to show bumpmap + //col = vec3((nz.x+.5)*.5,(nz.y+.5)*.5,1.); + return vec4(col,1.); +} diff --git a/shaders/glsl/Mykradvo2.fp b/shaders/glsl/Mykradvo2.fp new file mode 100644 index 000000000..f97905387 --- /dev/null +++ b/shaders/glsl/Mykradvo2.fp @@ -0,0 +1,20 @@ +const float pi = 3.14159265358979323846; + +vec4 ProcessTexel() +{ + vec2 p = 2.*(vTexCoord.st-.5); + float a = atan(p.y,p.x); + float r = length(p); + // noise burst + vec2 ccoord = vec2(.1/r-.06*timer+.5*r,a/pi+.04*timer); + vec3 nz = texture(warptex,ccoord).rgb; + ccoord = vec2(.4/r-.08*timer+1.4*r,a/pi-.04*timer); + nz += texture(warptex,ccoord).rgb; + nz = clamp((nz-1.)*.5,-1.,1.); + nz *= abs(2.*r-1.); + // sample ring + vec3 col = getTexel(vTexCoord.st+(nz.xy*.1)).rgb; + // debug: uncomment to show bumpmap + //col = vec3((nz.x+.5)*.5,(nz.y+.5)*.5,1.); + return vec4(col,1.); +} diff --git a/sndinfo.txt b/sndinfo.txt index 8cd3ddf6a..b0586537e 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -1002,6 +1002,32 @@ powerup/embiggener sounds/items/embiggen.ogg powerup/barrier sounds/items/barrieron.ogg powerup/barrieract sounds/items/barrieract.ogg powerup/barrierend sounds/items/barrieroff.ogg +powerup/mykradvo sounds/items/AnomExplode.ogg +$limit powerup/mykradvo 16 +powerup/mykradvoamb sounds/items/AnomHeartBeat.ogg + +mykradvo/arc1 sounds/items/mykrarc1.ogg +mykradvo/arc2 sounds/items/mykrarc2.ogg +mykradvo/arc3 sounds/items/mykrarc3.ogg +mykradvo/arc4 sounds/items/mykrarc4.ogg +mykradvo/arc5 sounds/items/mykrarc5.ogg +mykradvo/arc6 sounds/items/mykrarc6.ogg +mykradvo/arc7 sounds/items/mykrarc7.ogg +mykradvo/arc8 sounds/items/mykrarc8.ogg +mykradvo/arc9 sounds/items/mykrarc9.ogg +mykradvo/smallarc1 sounds/items/mykrarcs1.ogg +mykradvo/smallarc2 sounds/items/mykrarcs2.ogg +mykradvo/smallarc3 sounds/items/mykrarcs3.ogg +mykradvo/smallarc4 sounds/items/mykrarcs4.ogg +mykradvo/smallarc5 sounds/items/mykrarcs5.ogg +mykradvo/smallarc6 sounds/items/mykrarcs6.ogg +mykradvo/smallarc7 sounds/items/mykrarcs7.ogg +mykradvo/smallarc8 sounds/items/mykrarcs8.ogg +mykradvo/smallarc9 sounds/items/mykrarcs9.ogg +$random mykradvo/arc { mykradvo/arc1 mykradvo/arc2 mykradvo/arc3 mykradvo/arc4 mykradvo/arc5 mykradvo/arc6 mykradvo/arc7 mykradvo/arc8 mykradvo/arc9 } +$random mykradvo/smallarc { mykradvo/smallarc1 mykradvo/smallarc2 mykradvo/smallarc3 mykradvo/smallarc4 mykradvo/smallarc5 mykradvo/smallarc6 mykradvo/smallarc7 mykradvo/smallarc8 mykradvo/smallarc9 } +$limit mykradvo/arc 32 +$limit mykradvo/smallarc 16 lamp/on sounds/items/lampon.ogg lamp/off sounds/items/lampoff.ogg @@ -1012,12 +1038,12 @@ moth/scrape2 sounds/items/mothatk2.ogg moth/scrape3 sounds/items/mothatk3.ogg moth/scrape4 sounds/items/mothatk4.ogg $random moth/scrape { moth/scrape1 moth/scrape2 moth/scrape3 moth/scrape4 } -$limit moth/scrape 30 +$limit moth/scrape 32 moth/die1 sounds/items/mothdie1.ogg moth/die2 sounds/items/mothdie2.ogg $random moth/die { moth/die1 moth/die2 } moth/fly sounds/items/mothfly.ogg -$limit moth/fly 30 +$limit moth/fly 32 // white lady (not actually mashiro) mashiro/appear sounds/mashiro/moth_appear.ogg mashiro/giggle1 sounds/mashiro/moth_giggle1.ogg diff --git a/sounds/items/AnomExplode.ogg b/sounds/items/AnomExplode.ogg new file mode 100644 index 000000000..9dd44ad36 Binary files /dev/null and b/sounds/items/AnomExplode.ogg differ diff --git a/sounds/items/AnomHeartBeat.ogg b/sounds/items/AnomHeartBeat.ogg new file mode 100644 index 000000000..8875b2817 Binary files /dev/null and b/sounds/items/AnomHeartBeat.ogg differ diff --git a/sounds/items/mykrarc1.ogg b/sounds/items/mykrarc1.ogg new file mode 100644 index 000000000..20e785e57 Binary files /dev/null and b/sounds/items/mykrarc1.ogg differ diff --git a/sounds/items/mykrarc2.ogg b/sounds/items/mykrarc2.ogg new file mode 100644 index 000000000..ef54bab6c Binary files /dev/null and b/sounds/items/mykrarc2.ogg differ diff --git a/sounds/items/mykrarc3.ogg b/sounds/items/mykrarc3.ogg new file mode 100644 index 000000000..71fbdecd7 Binary files /dev/null and b/sounds/items/mykrarc3.ogg differ diff --git a/sounds/items/mykrarc4.ogg b/sounds/items/mykrarc4.ogg new file mode 100644 index 000000000..7750d7e92 Binary files /dev/null and b/sounds/items/mykrarc4.ogg differ diff --git a/sounds/items/mykrarc5.ogg b/sounds/items/mykrarc5.ogg new file mode 100644 index 000000000..84380cf8c Binary files /dev/null and b/sounds/items/mykrarc5.ogg differ diff --git a/sounds/items/mykrarc6.ogg b/sounds/items/mykrarc6.ogg new file mode 100644 index 000000000..be20c1c75 Binary files /dev/null and b/sounds/items/mykrarc6.ogg differ diff --git a/sounds/items/mykrarc7.ogg b/sounds/items/mykrarc7.ogg new file mode 100644 index 000000000..b524db56f Binary files /dev/null and b/sounds/items/mykrarc7.ogg differ diff --git a/sounds/items/mykrarc8.ogg b/sounds/items/mykrarc8.ogg new file mode 100644 index 000000000..fccf1b7ff Binary files /dev/null and b/sounds/items/mykrarc8.ogg differ diff --git a/sounds/items/mykrarc9.ogg b/sounds/items/mykrarc9.ogg new file mode 100644 index 000000000..de83ee60e Binary files /dev/null and b/sounds/items/mykrarc9.ogg differ diff --git a/sounds/items/mykrarcs1.ogg b/sounds/items/mykrarcs1.ogg new file mode 100644 index 000000000..978d0c492 Binary files /dev/null and b/sounds/items/mykrarcs1.ogg differ diff --git a/sounds/items/mykrarcs2.ogg b/sounds/items/mykrarcs2.ogg new file mode 100644 index 000000000..485d09441 Binary files /dev/null and b/sounds/items/mykrarcs2.ogg differ diff --git a/sounds/items/mykrarcs3.ogg b/sounds/items/mykrarcs3.ogg new file mode 100644 index 000000000..78b706a00 Binary files /dev/null and b/sounds/items/mykrarcs3.ogg differ diff --git a/sounds/items/mykrarcs4.ogg b/sounds/items/mykrarcs4.ogg new file mode 100644 index 000000000..079d9b950 Binary files /dev/null and b/sounds/items/mykrarcs4.ogg differ diff --git a/sounds/items/mykrarcs5.ogg b/sounds/items/mykrarcs5.ogg new file mode 100644 index 000000000..677c2d409 Binary files /dev/null and b/sounds/items/mykrarcs5.ogg differ diff --git a/sounds/items/mykrarcs6.ogg b/sounds/items/mykrarcs6.ogg new file mode 100644 index 000000000..05964e8e0 Binary files /dev/null and b/sounds/items/mykrarcs6.ogg differ diff --git a/sounds/items/mykrarcs7.ogg b/sounds/items/mykrarcs7.ogg new file mode 100644 index 000000000..855fab90f Binary files /dev/null and b/sounds/items/mykrarcs7.ogg differ diff --git a/sounds/items/mykrarcs8.ogg b/sounds/items/mykrarcs8.ogg new file mode 100644 index 000000000..6b4502abf Binary files /dev/null and b/sounds/items/mykrarcs8.ogg differ diff --git a/sounds/items/mykrarcs9.ogg b/sounds/items/mykrarcs9.ogg new file mode 100644 index 000000000..e6b51dece Binary files /dev/null and b/sounds/items/mykrarcs9.ogg differ diff --git a/sprites/MKRVA0.png b/sprites/MKRVA0.png new file mode 100644 index 000000000..89aef4022 Binary files /dev/null and b/sprites/MKRVA0.png differ diff --git a/textures/softnoise.png b/textures/softnoise.png new file mode 100644 index 000000000..27d493d69 Binary files /dev/null and b/textures/softnoise.png differ diff --git a/zscript/handler/swwm_handler_replacements.zsc b/zscript/handler/swwm_handler_replacements.zsc index abd9f3aad..957f41036 100644 --- a/zscript/handler/swwm_handler_replacements.zsc +++ b/zscript/handler/swwm_handler_replacements.zsc @@ -517,11 +517,11 @@ extend Class SWWMHandler else if ( (e.Replacee is 'Medikit') || (e.Replacee is 'ArtiHealth') ) e.Replacement = 'CubeHealthItem'; else if ( (e.Replacee is 'Soulsphere') || (e.Replacee is 'ArtiSuperHealth') ) e.Replacement = 'RefresherItem'; else if ( (e.Replacee is 'Megasphere') || (e.Replacee is 'ArtiEgg') || (e.Replacee is 'ArtiBoostArmor') ) e.Replacement = 'GrilledCheeseSandwich'; - else if ( (e.Replacee is 'Blursphere') || (e.Replacee is 'ArtiInvisibility') ) e.Replacement = 'GhostArtifact'; + else if ( (e.Replacee is 'Blursphere') || (e.Replacee is 'ArtiInvisibility') ) e.Replacement = (deathmatch||Random[Replacements](0,2)||SWWMUtility.ItemExists('Mykradvo',worldonly:true))?'GhostArtifact':'Mykradvo'; else if ( e.Replacee is 'Radsuit' ) e.Replacement = 'EBarrier'; else if ( (e.Replacee is 'ArtiFly') ) e.Replacement = 'GravitySuppressor'; - else if ( (e.Replacee is 'InvulnerabilitySphere') || (e.Replacee is 'ArtiInvulnerability') || (e.Replacee is 'ArtiInvulnerability2') ) e.Replacement = 'FuckingInvinciball'; - else if ( (e.Replacee is 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') || (e.Replacee == 'ArtiSpeedBoots') ) e.Replacement = 'Ragekit'; + else if ( (e.Replacee is 'InvulnerabilitySphere') || (e.Replacee is 'ArtiInvulnerability') || (e.Replacee is 'ArtiInvulnerability2') ) e.Replacement = (deathmatch||Random[Replacements](0,3)||SWWMUtility.ItemExists('Mykradvo',worldonly:true))?'FuckingInvinciball':'Mykradvo'; + else if ( (e.Replacee is 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') || (e.Replacee == 'ArtiSpeedBoots') ) e.Replacement = (deathmatch||Random[Replacements](0,2)||SWWMUtility.ItemExists('Mykradvo',worldonly:true))?'Ragekit':'Mykradvo'; else if ( (e.Replacee is 'AllMap') || (e.Replacee is 'SuperMap') ) e.Replacement = 'Omnisight'; else if ( (e.Replacee is 'Infrared') || (e.Replacee is 'ArtiTorch') ) e.Replacement = 'SWWMLamp'; else if ( (e.Replacee is 'GreenArmor') || (e.Replacee is 'SilverShield') || (e.Replacee is 'PlatinumHelm') || (e.Replacee is 'AmuletOfWarding') ) e.Replacement = 'BlastSuitItem'; diff --git a/zscript/items/swwm_armor.zsc b/zscript/items/swwm_armor.zsc index 7c200aefd..87faab099 100644 --- a/zscript/items/swwm_armor.zsc +++ b/zscript/items/swwm_armor.zsc @@ -138,7 +138,7 @@ Class WarArmor : SWWMArmor { double factor; // should be enough "elemental" damage types I guess - if ( (damageType == 'Fire') || (damageType == 'Ice') || (damageType == 'Slime') || (damageType == 'Electric') || (damageType == 'Wind') || (damageType == 'Water') || (damageType == 'Corroded') || (damageType == 'Lava') ) factor = .8; + if ( (damageType == 'Fire') || (damageType == 'Ice') || (damageType == 'Slime') || (damageType == 'Electric') || (damageType == 'Plasma') || (damageType == 'Radiation') || (damageType == 'Wind') || (damageType == 'Water') || (damageType == 'Corroded') || (damageType == 'Lava') ) factor = .8; else factor = .5; if ( flags&DMG_EXPLOSION ) factor = 1.-(1.-factor)*.7; return int(ceil(damage*factor)); diff --git a/zscript/items/swwm_powerups.zsc b/zscript/items/swwm_powerups.zsc index b96343597..adf27e078 100644 --- a/zscript/items/swwm_powerups.zsc +++ b/zscript/items/swwm_powerups.zsc @@ -183,6 +183,10 @@ Class GrilledCheeseSandwich : Inventory other.Inv = Inv; Inv = saved; } + override void PostTeleport( Vector3 destpos, double destangle, int flags ) + { + // TODO "teleported bread" achievement + } Default { @@ -1958,7 +1962,7 @@ Class BarrierPower : PowerIronFeet override void AbsorbDamage( int damage, Name damageType, out int newdamage ) { // negate elemental damage - if ( (damageType == 'Fire') || (damageType == 'Ice') || (damageType == 'Slime') || (damageType == 'Electric') || (damageType == 'Wind') || (damageType == 'Water') || (damageType == 'Corroded') || (damageType == 'Lava') ) + if ( (damageType == 'Fire') || (damageType == 'Ice') || (damageType == 'Slime') || (damageType == 'Electric') || (damageType == 'Plasma') || (damageType == 'Radiation') || (damageType == 'Wind') || (damageType == 'Water') || (damageType == 'Corroded') || (damageType == 'Lava') ) newdamage = 0; } @@ -2065,3 +2069,742 @@ Class EBarrier : Inventory Class EBarrierX : GhostArtifactX { } + +Class TendrilTracer : LineTracer +{ + Actor ignore; + Array ShootThroughList; + Array HitList; + + override ETraceStatus TraceCallback() + { + if ( Results.HitType == TRACE_HitActor ) + { + if ( Results.HitActor == ignore ) return TRACE_Skip; + if ( Results.HitActor.bSHOOTABLE ) + { + let ent = new("HitListEntry"); + ent.hitactor = Results.HitActor; + ent.hitlocation = Results.HitPos; + ent.x = Results.HitVector; + hitlist.Push(ent); + } + return TRACE_Skip; + } + else if ( Results.HitType == TRACE_HitWall ) + { + ShootThroughList.Push(Results.HitLine); + return TRACE_Skip; + } + return TRACE_Skip; + } +} + +// main heatseeker +Class MykradvoTendril : Actor +{ + Vector3 nextpos, nextdir; + + action void A_Trace() + { + tics = bMISSILEMORE?2:1; + Vector3 x, y, z; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + if ( !bSTANDSTILL ) + { + let t = new("TendrilTracer"); + t.ignore = target; + t.hitlist.Clear(); + t.ShootThroughList.Clear(); + t.Trace(pos,CurSector,x,speed,0); + for ( int i=0; i 1 ) + { + dirto /= dist; + dir = (dir+dirto*(clamp(1.-(dist/3000.),.2,1.)**1.5)).unit(); + } + // early split + if ( dist < speed ) bMISSILEEVENMORE = true; + } + invoker.nextdir = dir; + } + action void A_Spread() + { + if ( bMISSILEMORE && bMISSILEEVENMORE ) + { + // spread into sub-tendrils + Vector3 x, y, z; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + int ntendies = clamp(tracer.default.health/400,2,10); + for ( int i=0; i ReactionTime)) ) + { + if ( !bSTANDSTILL ) + { + int numpt = bMISSILEMORE?9:3; + Vector3 x, y, z; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + for ( int i=0; i 0 ) tics--; + while ( !tics ) + { + if ( !SetState(CurState.NextState) ) + return; + } + } + Default + { + Obituary "$O_MYKRADVO"; + RenderStyle "Add"; + DamageFunction 100; + ReactionTime 8; + Speed 64; + Radius .1; + Height 0; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +INTERPOLATEANGLES; + +NOTELEPORT; + +FOILINVUL; + +NOINTERACTION; + +MISSILEMORE; + } + States + { + Spawn: + TNT1 A 0 Bright; + XZW1 A 1 Bright A_Trace(); + XZW1 A 1 Bright + { + A_Spread(); + return FindState("Fade")+Random[Mykradvo](0,11)*2; + } + Stop; + Fade: + #### # 20 Bright; + XZW1 B -1 Bright; + Stop; + #### # 20 Bright; + XZW1 C -1 Bright; + Stop; + #### # 20 Bright; + XZW1 D -1 Bright; + Stop; + #### # 20 Bright; + XZW1 E -1 Bright; + Stop; + #### # 20 Bright; + XZW1 F -1 Bright; + Stop; + #### # 20 Bright; + XZW1 G -1 Bright; + Stop; + #### # 20 Bright; + XZW1 H -1 Bright; + Stop; + #### # 20 Bright; + XZW1 I -1 Bright; + Stop; + #### # 20 Bright; + XZW1 J -1 Bright; + Stop; + #### # 20 Bright; + XZW1 K -1 Bright; + Stop; + #### # 20 Bright; + XZW1 L -1 Bright; + Stop; + #### # 20 Bright; + XZW1 M -1 Bright; + Stop; + } +} + +// sub seekers +Class MykradvoSmallTendril : MykradvoTendril +{ + Default + { + Speed 16; + DamageFunction 20; + ReactionTime 20; + -MISSILEMORE; + } + States + { + Fade: + #### # 10 Bright; + XZW1 B -1 Bright; + Stop; + #### # 10 Bright; + XZW1 C -1 Bright; + Stop; + #### # 10 Bright; + XZW1 D -1 Bright; + Stop; + #### # 10 Bright; + XZW1 E -1 Bright; + Stop; + #### # 10 Bright; + XZW1 F -1 Bright; + Stop; + #### # 10 Bright; + XZW1 G -1 Bright; + Stop; + #### # 10 Bright; + XZW1 H -1 Bright; + Stop; + #### # 10 Bright; + XZW1 I -1 Bright; + Stop; + #### # 10 Bright; + XZW1 J -1 Bright; + Stop; + #### # 10 Bright; + XZW1 K -1 Bright; + Stop; + #### # 10 Bright; + XZW1 L -1 Bright; + Stop; + #### # 10 Bright; + XZW1 M -1 Bright; + Stop; + } +} + +// non-hurting non-seekers +Class MykradvoSmallNullTendril : MykradvoSmallTendril +{ + Default + { + Speed 8; + ReactionTime 6; + +STANDSTILL; + } + States + { + Fade: + #### # 5 Bright; + XZW1 B -1 Bright; + Stop; + #### # 5 Bright; + XZW1 C -1 Bright; + Stop; + #### # 5 Bright; + XZW1 D -1 Bright; + Stop; + #### # 5 Bright; + XZW1 E -1 Bright; + Stop; + #### # 5 Bright; + XZW1 F -1 Bright; + Stop; + #### # 5 Bright; + XZW1 G -1 Bright; + Stop; + #### # 5 Bright; + XZW1 H -1 Bright; + Stop; + #### # 5 Bright; + XZW1 I -1 Bright; + Stop; + #### # 5 Bright; + XZW1 J -1 Bright; + Stop; + #### # 5 Bright; + XZW1 K -1 Bright; + Stop; + #### # 5 Bright; + XZW1 L -1 Bright; + Stop; + #### # 5 Bright; + XZW1 M -1 Bright; + Stop; + } +} + +Class MykradvoBurstLight : PaletteLight +{ + Default + { + Tag "Purple"; + ReactionTime 60; + Args 0,0,0,400; + } +} + +// 'splode +Class MykradvoBurst : Actor +{ + Array targets; + int nstep; + + Default + { + RenderStyle "Add"; + +NOBLOCKMAP; + +NOGRAVITY; + +FORCEXYBILLBOARD; + +NOTELEPORT; + +NOINTERACTION; + Scale 1.4; + } + void FlashPlayer( int str, double rad ) + { + if ( !SWWMUtility.InPlayerFOV(players[consoleplayer],self,rad) ) return; + let mo = players[consoleplayer].Camera; + double dist = Distance3D(mo); + str = int(str*(1.-(dist/rad))); + SWWMHandler.DoFlash(mo,Color(str,250,240,255),5); + SWWMHandler.DoFlash(mo,Color(str,128,0,255),15); + } + override void PostBeginPlay() + { + nstep = clamp(targets.Size()/10,1,5); + A_AlertMonsters(swwm_uncapalert?0:8000); + A_QuakeEx(9,9,9,80,0,3000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:1000,rollintensity:2.); + A_StartSound("powerup/mykradvo",CHAN_BODY,CHANF_DEFAULT,1.,.25); + A_StartSound("powerup/mykradvo",CHAN_VOICE,CHANF_DEFAULT,1.,.25); + FlashPlayer(100,1500); + int numpt = Random[ExploS](20,30); + for ( int i=0; i 0 ) + { + int numpt = Random[ExploS](2,4); + for ( int j=0; j 0) ) + { + let t = Spawn("MykradvoTendril",pos); + t.angle = t.AngleTo(targ); + t.pitch = SWWMUtility.PitchTo(t,targ,.5); + t.target = target; + t.tracer = targ; + } + else i--; + targets.Delete(0); + } + } + if ( !CheckNoDelay() || (tics == -1) ) return; + if ( tics > 0 ) tics--; + while ( !tics ) + { + if ( !SetState(CurState.NextState) ) + return; + } + } + States + { + Spawn: + XEX4 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\ 2 Bright; + TNT1 A 1 A_JumpIf(!IsActorPlayingSound(CHAN_VOICE)&&!(invoker.targets.Size()),1); + Wait; + TNT1 A 1; + Stop; + } +} + +Class Mykradvo : Inventory +{ + Mixin SWWMAutoUseFix; + Mixin SWWMOverlapPickupSound; + Mixin SWWMUseToPickup; + + Actor ringa[2]; + + Array targets; + + // quicksort (targets) + private bool CmpDist( Actor ref, Vector3 a, Vector3 b ) + { + double dista = level.Vec3Diff(ref.pos,a).length(); + double distb = level.Vec3Diff(ref.pos,b).length(); + return (dista < distb); + } + private int partition_targets( Array a, int l, int h, Actor ref ) + { + Actor pv = a[h]; + int i = (l-1); + for ( int j=l; j<=(h-1); j++ ) + { + if ( CmpDist(ref,a[j].pos,pv.pos) ) + { + i++; + Actor tmp = a[j]; + a[j] = a[i]; + a[i] = tmp; + } + } + Actor tmp = a[h]; + a[h] = a[i+1]; + a[i+1] = tmp; + return i+1; + } + private void qsort_targets( Array a, int l, int h, Actor ref ) + { + if ( l >= h ) return; + int p = partition_targets(a,l,h,ref); + qsort_targets(a,l,p-1,ref); + qsort_targets(a,p+1,h,ref); + } + + bool FindTargets( Actor t ) + { + targets.Clear(); + // search all actively hostile enemies within 50m + let ti = ThinkerIterator.Create("Actor"); + Actor a; + while ( a=Actor(ti.Next()) ) + { + // is a shootable, live monster + if ( !a.bISMONSTER || !a.bSHOOTABLE || a.bDORMANT || (a.Health <= 0) ) continue; + // is hostile + if ( !a.IsHostile(t) || SWWMUtility.IsCivilian(a) ) continue; + // is visible or targetting us + if ( (a.target != t) && !t.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) + continue; + // is within 100m of the owner + if ( !SWWMUtility.SphereIntersect(a,t.pos,3200) ) + continue; + targets.Push(a); + } + // sorted, so the closest take priority + qsort_targets(targets,0,targets.Size()-1,t); + return (targets.Size() > 0); + } + + override bool Use( bool pickup ) + { + if ( pickup && !deathmatch ) return false; + if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA); + Vector3 spawnpos = Owner.Vec3Angle(15,Owner.angle,Owner.Height*.7); + if ( !FindTargets(Owner) ) + { + int numpt = Random[ExploS](8,12); + let f = Spawn("SWWMPurplePickupFlash",spawnpos-(0,0,16)); + f.Scale *= .5; + for ( int i=0; i itm, Inventory skipme = null, bool mapstart = false ) + // worldonly: only checks for items that are placed in the world + static bool ItemExists( Class itm, Inventory skipme = null, bool mapstart = false, bool worldonly = false ) { let ti = ThinkerIterator.Create(itm); Inventory i; while ( i = Inventory(ti.Next()) ) { if ( i == skipme ) continue; + if ( worldonly && i.Owner ) continue; return true; } - if ( !mapstart ) return false; + if ( worldonly || !mapstart ) return false; ti = ThinkerIterator.Create(itm,Thinker.STAT_TRAVELLING); while ( i = Inventory(ti.Next()) ) { diff --git a/zscript/weapons/swwm_shot_fx.zsc b/zscript/weapons/swwm_shot_fx.zsc index a66ddd3a0..d8372394e 100644 --- a/zscript/weapons/swwm_shot_fx.zsc +++ b/zscript/weapons/swwm_shot_fx.zsc @@ -357,7 +357,7 @@ Class SaltImpact : Actor Default { Obituary "$O_SPREADGUN_BLUE"; - DamageType "Electric"; + DamageType "Plasma"; RenderStyle "Add"; Radius 0.1; Height 0; @@ -445,7 +445,7 @@ Class SaltBeam : Actor Default { Obituary "$O_SPREADGUN_BLUE"; - DamageType "Electric"; + DamageType "Plasma"; RenderStyle "Add"; Radius 0.1; Height 0; diff --git a/zscript/weapons/swwm_sparkyboi_fx.zsc b/zscript/weapons/swwm_sparkyboi_fx.zsc index e02f1d0b9..9229a75c9 100644 --- a/zscript/weapons/swwm_sparkyboi_fx.zsc +++ b/zscript/weapons/swwm_sparkyboi_fx.zsc @@ -260,7 +260,7 @@ Class BigBiospark : Actor if ( !t || !t.bSHOOTABLE ) continue; if ( SWWMUtility.SphereIntersect(t,pos,40) ) { - t.DamageMobj(self,target,4+special1,'Electric'); + t.DamageMobj(self,target,4+special1,'Plasma'); if ( t.bISMONSTER && !Random[Sparkster](0,3) ) t.Howl(); Health--; @@ -383,7 +383,7 @@ Class BigBiospark : Actor Default { Obituary "$O_SPARKSTER"; - DamageType "Electric"; + DamageType "Plasma"; RenderStyle "Add"; Health 1200; Radius 2; @@ -428,7 +428,7 @@ Class BiosparkBall : Actor Default { Obituary "$O_SPARKSTER"; - DamageType "Electric"; + DamageType "Plasma"; RenderStyle "Add"; Radius 3; Height 6; @@ -693,7 +693,7 @@ Class BiosparkBeamImpact : Actor Default { Obituary "$O_SPARKSTER"; - DamageType "Electric"; + DamageType "Plasma"; RenderStyle "Add"; Radius .1; Height 0; @@ -833,7 +833,7 @@ Class BiosparkComboImpactSub : Actor Default { Obituary "$O_SPARKSTER"; - DamageType "Electric"; + DamageType "Plasma"; RenderStyle "Add"; Scale 1.4; Alpha .4; @@ -879,7 +879,7 @@ Class BiosparkComboImpact : Actor Default { Obituary "$O_SPARKSTER"; - DamageType "Electric"; + DamageType "Plasma"; RenderStyle "Add"; Scale 2.; Radius .1; @@ -1131,7 +1131,7 @@ Class BiosparkBeam : Actor else { SWWMUtility.DoKnockback(t.hitlist[i].hitactor,t.hitlist[i].x,15000); - t.hitlist[i].hitactor.DamageMobj(self,target,GetMissileDamage(0,0),'Electric',DMG_THRUSTLESS); + t.hitlist[i].hitactor.DamageMobj(self,target,GetMissileDamage(0,0),'Plasma',DMG_THRUSTLESS); if ( t.hitlist[i].hitactor && t.hitlist[i].hitactor.bISMONSTER && !Random[Sparkster](0,3) ) t.hitlist[i].hitactor.Howl(); } @@ -1283,7 +1283,7 @@ Class BiosparkBeam : Actor else { SWWMUtility.DoKnockback(t.hitlist[i].hitactor,t.hitlist[i].x,15000); - t.hitlist[i].hitactor.DamageMobj(self,target,int(GetMissileDamage(0,0)*alpha),'Electric',DMG_THRUSTLESS); + t.hitlist[i].hitactor.DamageMobj(self,target,int(GetMissileDamage(0,0)*alpha),'Plasma',DMG_THRUSTLESS); if ( t.hitlist[i].hitactor && t.hitlist[i].hitactor.bISMONSTER && !Random[Sparkster](0,3) ) t.hitlist[i].hitactor.Howl(); } @@ -1473,7 +1473,7 @@ Class BiosparkArc : Actor for ( int i=0; i 1) && !Random[Sparkster](0,3) ) { + Vector3 x, y, z; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); for ( int i=0; i<2; i++ ) { let r = Spawn("BiosparkArc",level.Vec3Offset(pos,tdir*FRandom[Sparkster](0,1))); - Vector3 x, y, z; - [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); double a = FRandom[Sparkster](0,360), s = FRandom[Sparkster](0.,1.); Vector3 sdir = (x+y*cos(a)*s+z*sin(a)*s).unit(); r.angle = atan2(sdir.y,sdir.x);