diff --git a/README.md b/README.md index 2d3fd6129..c4ce2e27e 100644 --- a/README.md +++ b/README.md @@ -258,7 +258,7 @@ Bullet, with built-in recoil compensation. A joint project of Blackmann Arms and Forx Industries. This thing kills almost everything in one shot, provided you can aim straight. -Primary fire shoots, duh. +Primary fire shoots, duh. A second press chambers another round. Secondary fire uses the scope. Can be held to go up to 16x. diff --git a/TODO.md b/TODO.md index a34afb3c4..7bc56fc9a 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,5 @@ Fundamental things: - Wallbuster breaching feature - - Silver Bullet - Ynykron Artifact Not so fundamental things: diff --git a/decaldef.txt b/decaldef.txt index fd5015461..c0b62151d 100644 --- a/decaldef.txt +++ b/decaldef.txt @@ -52,6 +52,32 @@ decalgroup BigWallCrack BigWallCrack2 1 } +decal HugeWallCrack1 +{ + pic WallCrk1 + translucent 0.9 + shade "00 00 00" + x-scale 1.5 + y-scale 1.5 + randomflipx + randomflipy +} +decal HugeWallCrack2 +{ + pic WallCrk2 + translucent 0.9 + shade "00 00 00" + x-scale 1.5 + y-scale 1.5 + randomflipx + randomflipy +} + +decalgroup HugeWallCrack +{ + HugeWallCrack1 1 + HugeWallCrack2 1 +} decal SaltMark { @@ -204,3 +230,67 @@ decalgroup TinyBulletChip TinyBulletChip4 1 TinyBulletChip5 1 } + +decal BigBulletChip1 +{ + pic CHIP1 + translucent 0.85 + shade "00 00 00" + x-scale 1.0 + y-scale 1.0 + randomflipx + randomflipy +} + +decal BigBulletChip2 +{ + pic CHIP2 + translucent 0.85 + shade "00 00 00" + x-scale 1.0 + y-scale 1.0 + randomflipx + randomflipy +} + +decal BigBulletChip3 +{ + pic CHIP3 + translucent 0.85 + shade "00 00 00" + x-scale 1.0 + y-scale 1.0 + randomflipx + randomflipy +} + +decal BigBulletChip4 +{ + pic CHIP4 + translucent 0.85 + shade "00 00 00" + x-scale 1.0 + y-scale 1.0 + randomflipx + randomflipy +} + +decal BigBulletChip5 +{ + pic CHIP5 + translucent 0.85 + shade "00 00 00" + x-scale 1.0 + y-scale 1.0 + randomflipx + randomflipy +} + +decalgroup BigBulletChip +{ + BigBulletChip1 1 + BigBulletChip2 1 + BigBulletChip3 1 + BigBulletChip4 1 + BigBulletChip5 1 +} \ No newline at end of file diff --git a/gldefs.pp b/gldefs.pp index 8608a9375..fb9a46427 100644 --- a/gldefs.pp +++ b/gldefs.pp @@ -1,4 +1,9 @@ HardwareShader PostProcess beforebloom +{ + Name "SilverScope" + Shader "shaders/glsl/SilverScope.fp" 330 +} +HardwareShader PostProcess beforebloom { Name "BarrierShader" Shader "shaders/glsl/Barrier.fp" 330 @@ -42,4 +47,4 @@ HardwareShader PostProcess scene Uniform float Timer Uniform float ni Texture NoiseTexture "textures/rgbnoise.png" -} +} \ No newline at end of file diff --git a/gldefs.silverbullet b/gldefs.silverbullet new file mode 100644 index 000000000..b6591fc66 --- /dev/null +++ b/gldefs.silverbullet @@ -0,0 +1,5 @@ +HardwareShader Texture "models/SilverBulletJetSmoke.png" +{ + Shader "shaders/glsl/JetSmoke.fp" + Texture "smoketex" "models/SilverBulletJetNoise.png" +} diff --git a/graphics/HUD/SilverBulletDisplay.png b/graphics/HUD/SilverBulletDisplay.png new file mode 100644 index 000000000..c1b78d892 Binary files /dev/null and b/graphics/HUD/SilverBulletDisplay.png differ diff --git a/graphics/HUD/SilverBulletZoomBar.png b/graphics/HUD/SilverBulletZoomBar.png new file mode 100644 index 000000000..99e182306 Binary files /dev/null and b/graphics/HUD/SilverBulletZoomBar.png differ diff --git a/graphics/HUD/SilverBulletZoomDisplay.png b/graphics/HUD/SilverBulletZoomDisplay.png new file mode 100644 index 000000000..bd938178a Binary files /dev/null and b/graphics/HUD/SilverBulletZoomDisplay.png differ diff --git a/graphics/HUD/WallbusterMenu.png b/graphics/HUD/WallbusterMenu.png index 8ff13bac7..0f3bc7f78 100644 Binary files a/graphics/HUD/WallbusterMenu.png and b/graphics/HUD/WallbusterMenu.png differ diff --git a/graphics/xhairb99.png b/graphics/xhairb99.png new file mode 100644 index 000000000..4d7beb806 Binary files /dev/null and b/graphics/xhairb99.png differ diff --git a/graphics/xhairs99.png b/graphics/xhairs99.png new file mode 100644 index 000000000..7b58b30ab Binary files /dev/null and b/graphics/xhairs99.png differ diff --git a/language.def_lore b/language.def_lore index 0f9711845..13d49c68d 100644 --- a/language.def_lore +++ b/language.def_lore @@ -101,7 +101,7 @@ SWWM_LORETXT_YNYKRON = "\cxDesignation:\c-\n\cf Ynykron Artifact\c-\n\cxManufact SWWM_LORETAG_SILVERBULLET = "Silver Bullet JET"; SWWM_LORETAB_SILVERBULLET = "Item"; SWWM_LOREREL_SILVERBULLET = "Blackmann;Forx;Explodium"; -SWWM_LORETXT_SILVERBULLET = "\cxDesignation:\c-\n\cf Silver Bullet JET\c-\n\cxManufacturer:\c-\n\cf Blackmann Arms Ltd.\c-\n\cf Forx Aeronautics\c-\n\cxClassification:\c-\n\cf Ultra-High Caliber Sniper Rifle\c-\n\nThe \cfSilver Bullet JET\c- is the 1.150 member of the \cfSilver Bullet\c- series of ultra-high caliber rifles manufactured by \cfBlackmann Arms\c-. It was created as a lighter, more \"reasonable\" alternative to the 1.350 \cfBehemoth\c- model. Weighing 43 kilograms and sporting a total length of 2.4 meters, it is sufficiently compact for non-augmented human use.\n\nThe main ammunition designed for this specific model is the 1.150 \cfXSB (eXplosive Super Burst)\c-. These beastly rounds are partially based on a NATO standard 30x113mm cartridge, and employ a low density \cfExplodium\c- shaped charge as propellant, allowing high velocity while still being safe for use. The bullets themselves are composed of a tungsten carbide core, snugly wrapped in an aluminum jacket, and decorated with a thin silver plating for aesthetic appearance (Silver Bullets are, indeed, NOT really made of silver).\n\nIn order to compensate for its massive recoil, the weapon redirects a part of the gasses from round ignition into a set of jet compensators designed by \cfForx Aeronautics\c-. Although partially cooled in the process, it is still hot enough to cause some damage to users not wearing adequate protection.\n\n\cfPrimary Fire:\c- Shoot the bullet. Any small targets hit by it are pretty much turned to paste. In addition, there's the potential for it to penetrate several targets in a row before eventually stopping, depending on their size.\n\n\cfSecondary Fire:\c- Custom-tailored adjustable telescopic sight, up to 16x. Equipped with a soft foam covering to protect the user's face during scoped fire.\n\n\cfReloading:\c- Reloads the weapon. Each magazine holds 5 rounds. An extra round can also be kept chambered.\n\n\cxSaya's Notes:\c-\n\cfWhat was that quote again, \"there is no kill like overkill\"? Yeah, sounds about right for this thing.\c-\n\n\cfThe fuck are you even supposed to hunt with it, wild tanks? I suppose... bigass beefy demons could also count, but you're going to just turn them all to fucking paste.\c-"; +SWWM_LORETXT_SILVERBULLET = "\cxDesignation:\c-\n\cf Silver Bullet JET\c-\n\cxManufacturer:\c-\n\cf Blackmann Arms Ltd.\c-\n\cf Forx Aeronautics\c-\n\cxClassification:\c-\n\cf Ultra-High Caliber Sniper Rifle\c-\n\nThe \cfSilver Bullet JET\c- is the 1.150 member of the \cfSilver Bullet\c- series of ultra-high caliber rifles manufactured by \cfBlackmann Arms\c-. It was created as a lighter, more \"reasonable\" alternative to the 1.350 \cfBehemoth\c- model. Weighing 43 kilograms and sporting a total length of 2.4 meters, it is sufficiently compact for non-augmented human use.\n\nThe main ammunition designed for this specific model is the 1.150 \cfXSB (eXplosive Super Burst)\c-. These beastly rounds are partially based on a NATO standard 30x113mm cartridge, and employ a low density \cfExplodium\c- shaped charge as propellant, allowing high velocity while still being safe for use. The bullets themselves are composed of a tungsten carbide core, snugly wrapped in an aluminum jacket, and decorated with a thin silver plating for aesthetic appearance (Silver Bullets are, indeed, NOT really made of silver).\n\nIn order to compensate for its massive recoil, the weapon redirects a part of the gasses from round ignition into a set of jet compensators designed by \cfForx Aeronautics\c-. Although partially cooled in the process, it is still hot enough to cause some damage to users not wearing adequate protection.\n\n\cfPrimary Fire:\c- Shoot the bullet. Any small targets hit by it are pretty much turned to paste. In addition, there's the potential for it to penetrate several targets in a row before eventually stopping, depending on their size. A second press after firing will chamber another round.\n\n\cfSecondary Fire:\c- Custom-tailored adjustable telescopic sight, up to 16x. Equipped with a soft foam covering to protect the user's face during scoped fire.\n\n\cfReloading:\c- Reloads the weapon. Each magazine holds 5 rounds. An extra round can also be kept chambered.\n\n\cxSaya's Notes:\c-\n\cfWhat was that quote again, \"there is no kill like overkill\"? Yeah, sounds about right for this thing.\c-\n\n\cfThe fuck are you even supposed to hunt with it, wild tanks? I suppose... bigass beefy demons could also count, but you're going to just turn them all to fucking paste.\c-"; SWWM_LORETAG_BIGSHOT = "Mr. BIG SHOT"; SWWM_LORETAB_BIGSHOT = "People"; SWWM_LOREREL_BIGSHOT = "Blackmann;Saya"; diff --git a/language.es_lore b/language.es_lore index ba6828fd2..1afbf4200 100644 --- a/language.es_lore +++ b/language.es_lore @@ -142,7 +142,7 @@ SWWM_LORETXT_TARO = "\cxNombre Completo:\c-\n\cf Taro Miyamoto\c-\n\cxNacionalid SWWM_LORETAG_HAMMERSPACEEMBIGGENER = "Ensanchecedor"; SWWM_LORETXT_HAMMERSPACEEMBIGGENER = "\cxDesignación:\c-\n\cf Ensanchecedor de Hammerspace™\c-\n\cxFabricante:\c-\n\cf Cyrus Enterprises\c-\n\cxClasificación:\c-\n\cf Contrato de Expansión de Almacenamiento\c-\n\nCuando los contenedores de \cfHammerspace™\c- fueron inicialmente comercializados, \cfCyrus Enterprises\c- aun no había decidido como manejar las necesitades de aquellos que no estuvieran satisfechos con la capacidad de almacenamiento estándar para cada cliente. Entonces, un día, una idea \"revolucionaria\" vino, la de un servicio extra de \"expansión\", por el cual clientes existentes pueden pagar un precio extra para obtener acceso a contenedores adicionales, incrementando su capacidad de almacenamiento total. Cada una de estas tarjetas de \cfEnsanchecedor de Hammerspace™\c- es completamente única, y sólo disponible para su compra desde Cyrus Enterprises. Los clientes pueden expandir su límite de almacenamiento hasta ocho veces con éstas, lo cual será suficiente incluso para los requisitos de grandes ejércitos que buscan almacenar eficientemente sus armas y munición.\n\n\cxNotas de Saya:\c-\n\cfQué hostias, ¿eso es una referencia a lo que creo que es? Este tío es más friki de lo que pensaba... aparte de que eso no es una palabra de verdad, ¿o no? ... Espera, ¿lo es? Vaya, así que sí la aceptaron... pues vale.\c-\n\n\cfAh ya, por cierto, el frikazo dice que solo tu contenedor de munición se puede expandir con esto, iba soltando mierdas de \"mochilas\" y tal, me largué antes de que empezara a desvariar de verdad. Cuando hace eso es como si alguien estuviera arañando una pizarra justo delante de ti, ugh...\c-"; SWWM_LORETXT_NEKURATEK = "\cxNombre:\c-\n\cf Nekuraku Tekkanosei\c-\n\cxClasificación:\c-\n\cf Megacorporación Tecnológica\c-\n\cxLocalización:\c-\n\cf Akane, Nahkami\c-\n\cxPágina Web:\c-\n\cf ubn://nkr/nekuraku.ts\c-\n\n\cfNekuratek\c- fue fundada por \cfZanata Nekuraku I\c- en 1744, inicialmente bajo el nombre de \cfNekuraku Rafana Sakosai (Fábrica de Armas Nekuraku)\c-. Rápidamente se convirtió en el proveedor principal de armamento para el \cfImperio Yathai\c-, lo cual aseguró su la posición de la familia Nekuraku entre la \"clase alta\" de ciudadanos del Imperio. Con esta nueva posición, Zanata incluso consiguió asegurar su puesto como líder provincial de Akai, uno de de los territorios mayores y más ricos de \cfNahkami\c-. Con el dominio absoluto de esa región, Nekuratek se extendería prácticamente sin límites, convirtiéndose entonces en la mayor corporación del planeta.\n\nZanata permaneció a la cabeza de la compañía hasata 1870, después de que un fallo en el prototipo del primer \cfReactor de Fusión de Nokorokinylum\c- de Nekuratek resultara en una explosión que acabó con su vida y la de varios empleados. Tras el suicidio del marido de Zanata, y con sus dos hijos, \cfDokuro\c- y \cfNokoi\c- habiendo muerto en la Sexta Guerra Mundial, el único sucesor que quedaba era su nieta, \cfZanata II\c-.\n\nUna vez a cargo de Nekuratek, Zanata II comenzó a diversificar en otros campos, tales como la robótica y la informática, y gradualmente fue recortando en fabricación de armas. No estaba claro al principio, la razón por este cambio repentino en su dirección, pero tras la caida del Imperio Yathai, reveló finalmente el inmenso desdén por el régimen tiránico que había sentido desde hace mucho tiempo, y su deseo de distanciarse a ella y a su familia de \"ser arquitectos de la muerte\".\n\nDurante el periodo inicial de \"desescalada\", su hijo \cfZanaveth I\c- estaba a carbo de la división de fábrica de armas, y fue responsable de la creación de \cfLa Ira del Emperador\c-, un arma orbital que se usaría en los eventos del incidente de la \cfCicatriz Blanca\c-. Tras ser testigo de lo que su creación había hecho, renunció a su posición y pasó varios años en solitario. Nunca volvió a involucrarse en la compañía desde entonces.\n\nDurante la reforma masiva de los sistemas políticos y económicos de la nación en el periodo de transición de 2104-2108, Nekuratek fue uno de los primeros en reformarse en una organización pública, con la familia Nekuraku sirviendo simplemente como \"líderes simbólicos\". En 2128, Zanata II se jubiló y dejó a \cfZanaveth II\c- a cargo de la compañía.\n\n\cxNotas de Saya:\c-\n\cfMuy buena gente con la que trabajar (incluso antes, durante su fase de \"capitalismo desenfrenado\"), sinceramente. La verdad es que no tuve mucho contacto con la vieja \"jefaza\", pero Zana-sama estuvo siempre ahí, y me encantaba hablar con ella, incluso de rollos de negocios y tal.\c-\n\n\cfMe mola muchísimo como esta gente abrazó tan fácilmente la forma correcta de hacer las cosas™. Aunque... es algo que no sorprende mucho teniendo encuenta toda la mierda que pasaba entonces. No sé como Zanata-sama consiguió hacer todo eso delante de las narices de esos capullos. Era taaaaaaaan obvio que era anti-imperio que tenías que estar ciega para no darte cuenta. Y tenía MUY BUENAS razones para serlo, también, perdiendo familia en la guerra y tal.\c-\n\n\cfEn fin, por culpa de la estúpida \"Cicatriz Blanca\" todo se ha ido a tomar por culo, y tenemos muy poco contacto, así que espero que estén bien. Dios, echo de menos a Zana-sama... Absoluta monada...\c-"; -SWWM_LORETXT_SILVERBULLET = "\cxDesignación:\c-\n\cf Silver Bullet JET\c-\n\cxFabricante:\c-\n\cf Blackmann Arms S.L.\c-\n\cf Aeronáutica Forx\c-\n\cxClasificación:\c-\n\cf Rifle de Francotirador de Calibre Ultra-Alto\c-\n\nEl \cfSilver Bullet JET\c- es el miembro de calibre 1.150 de la serie \cfSilver Bullet\c- de rifles de calibre ultra-alto fabricados por \cfBlackmann Arms\c-. Fue creado como una alternativa ligera y más \"razonable\" del modelo \cfBehemoth\c- de calibre 1.350. Pesando 43 kilos y con una longitud total de 2.4 metros, es suficientemente compacto para el uso por humanos no mejorados.\n\nLa munición diseñada principalmente para este modelo son las balas \cfXSB (eXplosive Super Burst)\c- del calibre 1.150. Estas bestiales balas están basadas parcialmente en los cartuchos estándar de 30x113mm de la OTAN, y emplean una carga de baja densidad de \cfExplódium\c- como propulsor, permitiendo una alta velocidad siendo a la vez seguro de usar. Las balas en sí están compuestas de un núcleo de carburo de tungsteno, con una envoltura de aluminio, y decorado con una capa fina de plata para una apariencia más estética (estas Balas de Plata, ciertamente, NO están hechas de plata).\n\nPara poder compensar su masivo retroceso, el arma redirige una parte de los gases de ignición hasta un grupo de jets compensadores diseñados por \cfAeronáutica Forx\c-. Aunque son parcialmente refrigerados en el proceso, son aun lo suficientemente cálidos para causar ligero daño a usuarios que no lleven la protección adecuada.\n\n\cfFuego Primario:\c- Dispara la bala. Cualquier objetivo alcanzado por ella queda hecho papilla. Adicionalmente, es posible que la bala penetre otros objetivos durante su trayecto hasta parar finalmente, dependiendo de su tamaño.\n\n\cfFuego Secundario:\c- Mira telescópica hecha a medida, hasta 16 aumentos. Equipada con una cubierta de espuma suave para proteger la cara del usuario durante el disparo con mira.\n\n\cfRecarga:\c- Recarga el arma. Cada cargador tiene 5 balas. Se puede mantener también una bala extra en la recámara.\n\n\cxNotas de Saya:\c-\n\cfComo era la frase esa, ¿\"no hay kill como un overkill\"? Ya, pues queda perfecta para la cosa esta.\c-\n\n\cf¿Y que coño se supone que cazas con esto, tanques salvajes? Supongo... demonios tó ciclaos también valdrían, pero al final solo van a acabar hechos mierda.\c-"; +SWWM_LORETXT_SILVERBULLET = "\cxDesignación:\c-\n\cf Silver Bullet JET\c-\n\cxFabricante:\c-\n\cf Blackmann Arms S.L.\c-\n\cf Aeronáutica Forx\c-\n\cxClasificación:\c-\n\cf Rifle de Francotirador de Calibre Ultra-Alto\c-\n\nEl \cfSilver Bullet JET\c- es el miembro de calibre 1.150 de la serie \cfSilver Bullet\c- de rifles de calibre ultra-alto fabricados por \cfBlackmann Arms\c-. Fue creado como una alternativa ligera y más \"razonable\" del modelo \cfBehemoth\c- de calibre 1.350. Pesando 43 kilos y con una longitud total de 2.4 metros, es suficientemente compacto para el uso por humanos no mejorados.\n\nLa munición diseñada principalmente para este modelo son las balas \cfXSB (eXplosive Super Burst)\c- del calibre 1.150. Estas bestiales balas están basadas parcialmente en los cartuchos estándar de 30x113mm de la OTAN, y emplean una carga de baja densidad de \cfExplódium\c- como propulsor, permitiendo una alta velocidad siendo a la vez seguro de usar. Las balas en sí están compuestas de un núcleo de carburo de tungsteno, con una envoltura de aluminio, y decorado con una capa fina de plata para una apariencia más estética (estas Balas de Plata, ciertamente, NO están hechas de plata).\n\nPara poder compensar su masivo retroceso, el arma redirige una parte de los gases de ignición hasta un grupo de jets compensadores diseñados por \cfAeronáutica Forx\c-. Aunque son parcialmente refrigerados en el proceso, son aun lo suficientemente cálidos para causar ligero daño a usuarios que no lleven la protección adecuada.\n\n\cfFuego Primario:\c- Dispara la bala. Cualquier objetivo alcanzado por ella queda hecho papilla. Adicionalmente, es posible que la bala penetre otros objetivos durante su trayecto hasta parar finalmente, dependiendo de su tamaño. Un segundo pulsado tras disparar cargará otra bala.\n\n\cfFuego Secundario:\c- Mira telescópica hecha a medida, hasta 16 aumentos. Equipada con una cubierta de espuma suave para proteger la cara del usuario durante el disparo con mira.\n\n\cfRecarga:\c- Recarga el arma. Cada cargador tiene 5 balas. Se puede mantener también una bala extra en la recámara.\n\n\cxNotas de Saya:\c-\n\cfComo era la frase esa, ¿\"no hay kill como un overkill\"? Ya, pues queda perfecta para la cosa esta.\c-\n\n\cf¿Y que coño se supone que cazas con esto, tanques salvajes? Supongo... demonios tó ciclaos también valdrían, pero al final solo van a acabar hechos mierda.\c-"; SWWM_LORETXT_ZANAVETH2 = "\cxNombre Completo:\c-\n\cf Zanaveth Nekuraku II\c-\n\cxNacionalidad:\c-\n\cf Nukuri\c-\n\cxFecha de Nacimiento:\c-\n\cf 1969-08-10\c-\n\cxTwitter:\c-\n\cf @purple_emotion\c-\n\n\cfZanaveth Nekuraku II\c- nació en 1969, siendo la hija única de \cfZanaveth Nekuraku I\c- y \cfDanakorn Kiyanou\c-. Durante su infancia, demostró un gran potencial, con una gran rapidez para el aprendizaje, pero en vez de forzarla a estudiar más, o trasladarla a un lugar de estudio de mayor nivel, sus padres decidieron dejar que hiciera las cosas a su ritmo, algo poco visto en aquellos tiempos.\n\nHabiendo terminado sus estudios secundarios en 2005, Zanaveth II optó por pasar un tiempo trabajando en el negocio familiar, \cfNekuratek\c-, donde aprendería todo sobre la IA y robótica, un campo en el que tenía bastante interés. En 2009, coincidiendo con la apertura de nuevos cursos en la \cfUniversidad de Nos-Kora\c-, y por recomendación de su abuela, \cfZanata II\c-, Zanaveth II se apuntó a \cfEstudios Extraespecies\c-, ya que parecía ser la forma perfecta de que pudiera ver el mundo, habiendo pasado toda su vida hasta entonces en su provincia natal de Akai.\n\nComo parte de este curso, Zanaveth II viajaría por toda la \cfCoalición X'Animen\c-, siendo introducida a las muchas especies que habitaban sus planetas aliados, y estudiando sus diversas culturas e historias. Zanaveth II también pasó un tiempo en el \cfInstituto Luna de Investigación\c-, entre 2013 y 2014, aprendiendo sobre los \cfNinuma\c- (el término común para los humanos en la coalición, acuñado por uno de sus cofundadores). En 2016, al haber finalizado los conflictos internos entre clanes enfrentados de los \cfDevanikan\c-, Zanaveth II aprovechó para visitarlos, ya que no pudo anteriormente. Fue durante esta visita que conoció a \cfMisa Azadeku Unissix\c-, su actual esposa. Zanaveth II se graduó en 2019, convirtiéndose después en empleada a tiempo completo en el Instituto Luna.\n\nTras el \cfEvento Luna\c- de 2021, en Diciembre del mismo año, Zanaveth II entró en contacto con \cfSaya Miyamoto\c-, deseando aprender sobre su compañlía y su dedicación a la IA y robótica. Las dos se hicieron buenas amigas rápidamente, y como prueba de esta amistad, Zanaveth II decidió proveer a \cfAkari Labs\c- del avanzado \cfFramework de IA Nekuronbot\c- para mejorar aun más sus creaciones.\n\nA partir de sus visitas semanales a Japón, Zanaveth II se interesaría por la cultura y entretenimiento del país. Rápidamente tomó nota de las similtudes entre ellos y los Nukuri, extendiéndose incluso a su idioma, algo que le resultaba muy curioso. En redes sociales, sus típicos posts serían a menudo enterrados por extensivas discusiones sobre anime y videojuegos, entremezclándose frecuentemente con las de Saya Miyamoto.\n\nEl 20 de Agosto de 2042, Zanaveth II y Misa tuvieron una hija, \cfZanaveth Nekuraku III\c-, la primera Nukuri nacida y criada en la Tierra. Sin embargo, debido a las estrictas leyes de aquel entonces, la familia tuvo que volver a Nahkami en cuanto su hija estaba lista para entrar a la escuela a los cuatro años. Aunque aun así seguirían visitando ocasionalmente la Tierra, durante las vacaciones.\n\nA principios de la \cfSéptima Guerra Mundial Nukuri\c- de 2068, Zanaveth II huyó con su mujer y su hija a \cfSankaideriha\c-, ayudada de la bruja Nukuri \cfSaniuke Okusainaya\c-, vieja amiga de la familia. Dos años después, tras demostrar no poder acostumbrarse a vivir allí, la familia decidió dejar a Zanaveth III al cuidado de Saya. Esto duraría hasta 2077, cuando el incidente de la \cfCicatriz Blanca\c- dio lugar a la expulsión de todos los Nukuri en la Tierra. Zanaveth III fue enviada entonces a vivir con sus abuelos, hasta el final de la guerra en 2104, cuando sus padres regresaron de nuevo a Nahkami.\n\nDesde la formación del \cfGobierno Unificado Nukuri\c- en 2108, Zanaveth II mantiene el puesto de \"Ministra de Relaciones Interespecie\", gracias en parte a sus brillantes logros durante el tiempo que pasó como estudiante de la Universidad de Nos-Kora.\n\n\cxNotas de Saya:\c-\n\cfAhhhhhh, joder. Es la tipa más dulce y mona que he conocido jamás, te lo digo en serio. Y es un puto superlogro que haya convertido a esta monada alienígena en toda una otaku también, jeje...\c-\n\n\cfOh tía, conocerla fue el mejor regalo de navidad de la historia. Y al pequeñín rollito de canela de su mujer, también, jujuju... Suertuda que es, pillándose a un pivón como ese. Molaba mucho salir con ellas por ahí, especialmente por lo mucho que le impresionaba todo a Zana-sama llendo por la ciudad. Era como una niña en una tienda de chuches. ABSOLUTAMENTE ADORABLE, JODER.\c-\n\n\cfAhora con la mierda esa de la Cicatriz Blanca, no nos hablamos mucho. Misa ha conseguido visitarme unas cuantas veces, pero no es lo mismo, y pude notar que tampoco lo pasaba bien. Sí, puta mierda, espero que un día se acabe todo y pueda tener a las dos aquí otra vez.\c-"; SWWM_LORETXT_ZANAVETH22 = "\cxNombre Completo:\c-\n\cf Zanaveth Nekuraku II\c-\n\cxNacionalidad:\c-\n\cf Nukuri\c-\n\cxFecha de Nacimiento:\c-\n\cf 1969-08-10\c-\n\cxTwitter:\c-\n\cf @purple_emotion\c-\n\n\cfZanaveth Nekuraku II\c- nació en 1969, siendo la hija única de \cfZanaveth Nekuraku I\c- y \cfDanakorn Kiyanou\c-. Durante su infancia, demostró un gran potencial, con una gran rapidez para el aprendizaje, pero en vez de forzarla a estudiar más, o trasladarla a un lugar de estudio de mayor nivel, sus padres decidieron dejar que hiciera las cosas a su ritmo, algo poco visto en aquellos tiempos.\n\nHabiendo terminado sus estudios secundarios en 2005, Zanaveth II optó por pasar un tiempo trabajando en el negocio familiar, \cfNekuratek\c-, donde aprendería todo sobre la IA y robótica, un campo en el que tenía bastante interés. En 2009, coincidiendo con la apertura de nuevos cursos en la \cfUniversidad de Nos-Kora\c-, y por recomendación de su abuela, \cfZanata II\c-, Zanaveth II se apuntó a \cfEstudios Extraespecies\c-, ya que parecía ser la forma perfecta de que pudiera ver el mundo, habiendo pasado toda su vida hasta entonces en su provincia natal de Akai.\n\nComo parte de este curso, Zanaveth II viajaría por toda la \cfCoalición X'Animen\c-, siendo introducida a las muchas especies que habitaban sus planetas aliados, y estudiando sus diversas culturas e historias. Zanaveth II también pasó un tiempo en el \cfInstituto Luna de Investigación\c-, entre 2013 y 2014, aprendiendo sobre los \cfNinuma\c- (el término común para los humanos en la coalición, acuñado por uno de sus cofundadores). En 2016, al haber finalizado los conflictos internos entre clanes enfrentados de los \cfDevanikan\c-, Zanaveth II aprovechó para visitarlos, ya que no pudo anteriormente. Fue durante esta visita que conoció a \cfMisa Azadeku Unissix\c-, su actual esposa. Zanaveth II se graduó en 2019, convirtiéndose después en empleada a tiempo completo en el Instituto Luna.\n\nTras el \cfEvento Luna\c- de 2021, en Diciembre del mismo año, Zanaveth II entró en contacto con \cfSaya Miyamoto\c-, deseando aprender sobre su compañlía y su dedicación a la IA y robótica. Las dos se hicieron buenas amigas rápidamente, y como prueba de esta amistad, Zanaveth II decidió proveer a \cfAkari Labs\c- del avanzado \cfFramework de IA Nekuronbot\c- para mejorar aun más sus creaciones.\n\nA partir de sus visitas semanales a Japón, Zanaveth II se interesaría por la cultura y entretenimiento del país. Rápidamente tomó nota de las similtudes entre ellos y los Nukuri, extendiéndose incluso a su idioma, algo que le resultaba muy curioso. En redes sociales, sus típicos posts serían a menudo enterrados por extensivas discusiones sobre anime y videojuegos, entremezclándose frecuentemente con las de Saya Miyamoto.\n\nEl 20 de Agosto de 2042, Zanaveth II y Misa tuvieron una hija, \cfZanaveth Nekuraku III\c-, la primera Nukuri nacida y criada en la Tierra. Sin embargo, debido a las estrictas leyes de aquel entonces, la familia tuvo que volver a Nahkami en cuanto su hija estaba lista para entrar a la escuela a los cuatro años. Aunque aun así seguirían visitando ocasionalmente la Tierra, durante las vacaciones.\n\nA principios de la \cfSéptima Guerra Mundial Nukuri\c- de 2068, Zanaveth II huyó con su mujer y su hija a \cfSankaideriha\c-, ayudada de la bruja Nukuri \cfSaniuke Okusainaya\c-, vieja amiga de la familia. Dos años después, tras demostrar no poder acostumbrarse a vivir allí, la familia decidió dejar a Zanaveth III al cuidado de Saya. Esto duraría hasta 2077, cuando el incidente de la \cfCicatriz Blanca\c- dio lugar a la expulsión de todos los Nukuri en la Tierra. Zanaveth III fue enviada entonces a vivir con sus abuelos, hasta el final de la guerra en 2104, cuando sus padres regresaron de nuevo a Nahkami.\n\nDesde la formación del \cfGobierno Unificado Nukuri\c- en 2108, Zanaveth II mantiene el puesto de \"Ministra de Relaciones Interespecie\", gracias en parte a sus brillantes logros durante el tiempo que pasó como estudiante de la Universidad de Nos-Kora.\n\nDesde 2171, Zanaveth II ha estado envuelta en negociaciones con los \cfAnarukon\c-, como parte de una \"expansión multiversal\" de la \cfBleaknet\c-. Adicionalmente, a partir de un trato con \cfAkari Labs\c-, la Tierra tendrá también su propio nodo con el Nexo de Bleaknet. Este último acto siendo parte de un plan mayor para restaurar las relaciones entre Humanos y Nukuri, poniendo fin al Tratado de la Cicatriz Blanca.\n\n\cxNotas de Saya:\c-\n\cfAhhhhhh, joder. Es la tipa más dulce y mona que he conocido jamás, te lo digo en serio. Y es un puto superlogro que haya convertido a esta monada alienígena en toda una otaku también, jeje...\c-\n\n\cfOh tía, conocerla fue el mejor regalo de navidad de la historia. Y al pequeñín rollito de canela de su mujer, también, jujuju... Suertuda que es, pillándose a un pivón como ese. Molaba mucho salir con ellas por ahí, especialmente por lo mucho que le impresionaba todo a Zana-sama llendo por la ciudad. Era como una niña en una tienda de chuches. ABSOLUTAMENTE ADORABLE, JODER.\c-\n\n\cfAhora que la puta basura esa de la Cicatriz Blanca se irá a tomar por culo, tengo unas ganas tremendas de poderla ver de nuevo por aquí. Dios, cuando apareció después de mi boda con Kirin-kun casi me puse a llorar. La echaba jodidamente tanto de menos, es que... en serio.\c-"; SWWM_LORETAG_FABRICATOR = "Fab. de Munición"; diff --git a/language.version b/language.version index d8e59d5d0..98732927c 100644 --- a/language.version +++ b/language.version @@ -1,2 +1,2 @@ [default] -SWWM_MODVER="\cxSWWM GZ\c- r337 (Fri 12 Jun 20:53:32 CEST 2020)"; +SWWM_MODVER="\cxSWWM GZ\c- r338 (Sat 13 Jun 21:32:28 CEST 2020)"; diff --git a/lore/default/silverbullet.txt b/lore/default/silverbullet.txt index 901fef0d0..5db8c7bd7 100644 --- a/lore/default/silverbullet.txt +++ b/lore/default/silverbullet.txt @@ -19,7 +19,7 @@ The main ammunition designed for this specific model is the 1.150 **XSB (eXplosi In order to compensate for its massive recoil, the weapon redirects a part of the gasses from round ignition into a set of jet compensators designed by **Forx Aeronautics**. Although partially cooled in the process, it is still hot enough to cause some damage to users not wearing adequate protection. -\cfPrimary Fire:\c- Shoot the bullet. Any small targets hit by it are pretty much turned to paste. In addition, there's the potential for it to penetrate several targets in a row before eventually stopping, depending on their size. +\cfPrimary Fire:\c- Shoot the bullet. Any small targets hit by it are pretty much turned to paste. In addition, there's the potential for it to penetrate several targets in a row before eventually stopping, depending on their size. A second press after firing will chamber another round. \cfSecondary Fire:\c- Custom-tailored adjustable telescopic sight, up to 16x. Equipped with a soft foam covering to protect the user's face during scoped fire. diff --git a/lore/es/silverbullet.txt b/lore/es/silverbullet.txt index 743d1ae94..f104c8ce6 100644 --- a/lore/es/silverbullet.txt +++ b/lore/es/silverbullet.txt @@ -13,7 +13,7 @@ La munición diseñada principalmente para este modelo son las balas **XSB (eXpl Para poder compensar su masivo retroceso, el arma redirige una parte de los gases de ignición hasta un grupo de jets compensadores diseñados por **Aeronáutica Forx**. Aunque son parcialmente refrigerados en el proceso, son aun lo suficientemente cálidos para causar ligero daño a usuarios que no lleven la protección adecuada. -\cfFuego Primario:\c- Dispara la bala. Cualquier objetivo alcanzado por ella queda hecho papilla. Adicionalmente, es posible que la bala penetre otros objetivos durante su trayecto hasta parar finalmente, dependiendo de su tamaño. +\cfFuego Primario:\c- Dispara la bala. Cualquier objetivo alcanzado por ella queda hecho papilla. Adicionalmente, es posible que la bala penetre otros objetivos durante su trayecto hasta parar finalmente, dependiendo de su tamaño. Un segundo pulsado tras disparar cargará otra bala. \cfFuego Secundario:\c- Mira telescópica hecha a medida, hasta 16 aumentos. Equipada con una cubierta de espuma suave para proteger la cara del usuario durante el disparo con mira. diff --git a/modeldef.silverbullet b/modeldef.silverbullet index f67e0a8db..2d3596d4c 100644 --- a/modeldef.silverbullet +++ b/modeldef.silverbullet @@ -1,3 +1,42 @@ +Model "SilverBulletCasing" +{ + Path "models" + + Model 0 "SilverbulletCase_d.3d" + Skin 0 "SilverbulletBullet.png" + Scale 0.04 0.04 0.04 + ZOffset 1 + AngleOffset 90 + USEACTORPITCH + USEACTORROLL + + FrameIndex XZW1 A 0 0 +} +Model "SilverBulletMag" +{ + Path "models" + + Model 0 "SilverbulletMag_d.3d" + Skin 0 "SilverbulletAmmo.png" + Scale 0.2 0.2 0.2 + USEACTORPITCH + USEACTORROLL + + FrameIndex XZW1 A 0 0 +} +Model "SilverBulletMagEmpty" +{ + Path "models" + + Model 0 "SilverbulletMag_d.3d" + Skin 0 "SilverbulletAmmo_EmptyMag.png" + Scale 0.2 0.2 0.2 + USEACTORPITCH + USEACTORROLL + + FrameIndex XZW1 A 0 0 +} + Model "SilverBullet" { Path "models" @@ -12,3 +51,213 @@ Model "SilverBullet" FrameIndex XZW1 A 0 0 } + +Model "SilverBullet" +{ + Path "models/extra" + + Model 3 "Flat_d.3d" + Skin 3 "SilverMuz.png" + RollOffset 90 + AngleOffset 90 + Scale 0.48 0.24 0.24 + Offset 12 -90 -12 + + FrameIndex XZWZ A 3 0 +} + +Model "SilverBullet" +{ + Path "models" + + Model 2 "Silverbullet1st_d.3d" + AngleOffset -90 + Scale -0.005 0.0025 0.005 + DONTCULLBACKFACES + + // Casing + SurfaceSkin 2 5 "SilverbulletBullet.png" + FrameIndex XZW7 D 2 30 + FrameIndex XZW7 E 2 31 + FrameIndex XZW7 F 2 32 + FrameIndex XZW7 G 2 33 + FrameIndex XZW7 H 2 34 + FrameIndex XZW7 I 2 35 + FrameIndex XZW7 J 2 36 + FrameIndex XZW7 K 2 37 + FrameIndex XZW7 L 2 38 + FrameIndex XZW7 M 2 39 + FrameIndex XZW7 N 2 40 + FrameIndex XZW7 O 2 41 + // Jets + SurfaceSkin 2 5 "" + SurfaceSkin 2 6 "SilverbulletJetSmoke.png" + FrameIndex XZW7 P 2 16 + FrameIndex XZW7 Q 2 17 + FrameIndex XZW7 R 2 18 + FrameIndex XZW7 S 2 19 + FrameIndex XZW7 T 2 20 + FrameIndex XZW7 U 2 21 + FrameIndex XZW7 V 2 22 + FrameIndex XZW7 W 2 23 + FrameIndex XZW7 X 2 24 +} + +Model "SilverBullet" +{ + Path "models" + + Model 1 "Silverbullet1st_d.3d" + SurfaceSkin 1 0 "DemoTags.png" + SurfaceSkin 1 1 "DemoArms.png" + SurfaceSkin 1 2 "DemoSoft.png" + SurfaceSkin 1 3 "Silverbullet.png" + SurfaceSkin 1 4 "SilverbulletAmmo.png" + AngleOffset -90 + Scale -0.005 0.0025 0.005 + + // Still / Deselect + FrameIndex XZW2 A 1 0 + FrameIndex XZW2 B 1 1 + FrameIndex XZW2 C 1 2 + FrameIndex XZW2 D 1 3 + FrameIndex XZW2 E 1 4 + FrameIndex XZW2 F 1 5 + FrameIndex XZW2 G 1 6 // Select + FrameIndex XZW2 H 1 7 + FrameIndex XZW2 I 1 8 + FrameIndex XZW2 J 1 9 + FrameIndex XZW2 K 1 10 + FrameIndex XZW2 L 1 11 + FrameIndex XZW2 M 1 12 + FrameIndex XZW2 N 1 13 + // Fire + FrameIndex XZW2 O 1 15 + FrameIndex XZW2 P 1 16 + FrameIndex XZW2 Q 1 17 + FrameIndex XZW2 R 1 18 + FrameIndex XZW2 S 1 19 + FrameIndex XZW2 T 1 20 + FrameIndex XZW2 U 1 21 + FrameIndex XZW2 V 1 22 + FrameIndex XZW2 W 1 23 + // Bolt + FrameIndex XZW2 X 1 25 + FrameIndex XZW2 Y 1 26 + FrameIndex XZW2 Z 1 27 + FrameIndex XZW3 A 1 28 + FrameIndex XZW3 B 1 29 + FrameIndex XZW3 C 1 30 // StartCasing + FrameIndex XZW3 D 1 31 + FrameIndex XZW3 E 1 32 + FrameIndex XZW3 F 1 33 + FrameIndex XZW3 G 1 34 + FrameIndex XZW3 H 1 35 + FrameIndex XZW3 I 1 36 + FrameIndex XZW3 J 1 37 + FrameIndex XZW3 K 1 38 + FrameIndex XZW3 L 1 39 + FrameIndex XZW3 M 1 40 + FrameIndex XZW3 N 1 41 // EndCasing + FrameIndex XZW3 O 1 42 + FrameIndex XZW3 P 1 43 + FrameIndex XZW3 Q 1 44 + FrameIndex XZW3 R 1 45 + // ZoomIn + FrameIndex XZW3 S 1 47 + FrameIndex XZW3 T 1 48 + FrameIndex XZW3 U 1 49 + FrameIndex XZW3 V 1 50 + FrameIndex XZW3 W 1 51 + FrameIndex XZW3 X 1 52 // ZoomStill / ZoomOut + FrameIndex XZW3 Y 1 53 + FrameIndex XZW3 Z 1 54 + FrameIndex XZW4 A 1 55 + FrameIndex XZW4 B 1 56 + FrameIndex XZW4 C 1 57 + // Unload + FrameIndex XZW4 D 1 59 + FrameIndex XZW4 E 1 60 + FrameIndex XZW4 F 1 61 + FrameIndex XZW4 G 1 62 + FrameIndex XZW4 H 1 63 + FrameIndex XZW4 I 1 64 + FrameIndex XZW4 J 1 65 + FrameIndex XZW4 K 1 66 + FrameIndex XZW4 L 1 67 + FrameIndex XZW4 M 1 68 + FrameIndex XZW4 N 1 69 + // UnloadEmpty + SurfaceSkin 1 4 "SilverbulletAmmo_EmptyMag.png" + FrameIndex XZW4 O 1 59 + FrameIndex XZW4 P 1 60 + FrameIndex XZW4 Q 1 61 + FrameIndex XZW4 R 1 62 + FrameIndex XZW4 S 1 63 + FrameIndex XZW4 T 1 64 + FrameIndex XZW4 U 1 65 + FrameIndex XZW4 V 1 66 + FrameIndex XZW4 W 1 67 + FrameIndex XZW4 X 1 68 + FrameIndex XZW4 Y 1 69 + SurfaceSkin 1 4 "SilverbulletAmmo.png" + // Load + FrameIndex XZW4 Z 1 70 + FrameIndex XZW5 A 1 71 + FrameIndex XZW5 B 1 72 + FrameIndex XZW5 C 1 73 + FrameIndex XZW5 D 1 74 + FrameIndex XZW5 E 1 75 + FrameIndex XZW5 F 1 76 + FrameIndex XZW5 G 1 77 + FrameIndex XZW5 H 1 78 + FrameIndex XZW5 I 1 79 + FrameIndex XZW5 J 1 80 + FrameIndex XZW5 K 1 81 + FrameIndex XZW5 L 1 82 + FrameIndex XZW5 M 1 83 + FrameIndex XZW5 N 1 84 + // Idle + FrameIndex XZW5 O 1 86 + FrameIndex XZW5 P 1 87 + FrameIndex XZW5 Q 1 88 + FrameIndex XZW5 R 1 89 + FrameIndex XZW5 S 1 90 + FrameIndex XZW5 T 1 91 + FrameIndex XZW5 U 1 92 + FrameIndex XZW5 V 1 93 + FrameIndex XZW5 W 1 94 + FrameIndex XZW5 X 1 95 + FrameIndex XZW5 Y 1 96 + FrameIndex XZW5 Z 1 97 + FrameIndex XZW6 A 1 98 + FrameIndex XZW6 B 1 99 + FrameIndex XZW6 C 1 100 + FrameIndex XZW6 D 1 101 + FrameIndex XZW6 E 1 102 + FrameIndex XZW6 F 1 103 + FrameIndex XZW6 G 1 104 + FrameIndex XZW6 H 1 105 + // Melee + FrameIndex XZW6 I 1 107 + FrameIndex XZW6 J 1 108 + FrameIndex XZW6 K 1 109 + FrameIndex XZW6 L 1 110 + FrameIndex XZW6 M 1 111 + FrameIndex XZW6 N 1 112 + FrameIndex XZW6 O 1 113 + FrameIndex XZW6 P 1 114 + FrameIndex XZW6 Q 1 115 + FrameIndex XZW6 R 1 116 + FrameIndex XZW6 S 1 117 + FrameIndex XZW6 T 1 118 + FrameIndex XZW6 U 1 119 + FrameIndex XZW6 V 1 120 + FrameIndex XZW6 W 1 121 + FrameIndex XZW6 X 1 122 + FrameIndex XZW6 Y 1 123 + FrameIndex XZW6 Z 1 124 + FrameIndex XZW7 A 1 125 + FrameIndex XZW7 B 1 126 + FrameIndex XZW7 C 1 127 +} diff --git a/models/Silverbullet1st.blend b/models/Silverbullet1st.blend index c4b30d289..c73729016 100644 Binary files a/models/Silverbullet1st.blend and b/models/Silverbullet1st.blend differ diff --git a/models/Silverbullet1st_a.3d b/models/Silverbullet1st_a.3d index 1501eaf0d..4d3ed0d99 100644 Binary files a/models/Silverbullet1st_a.3d and b/models/Silverbullet1st_a.3d differ diff --git a/models/Silverbullet1st_d.3d b/models/Silverbullet1st_d.3d index 900205ee3..febddc326 100644 Binary files a/models/Silverbullet1st_d.3d and b/models/Silverbullet1st_d.3d differ diff --git a/models/SilverbulletJetNoise.png b/models/SilverbulletJetNoise.png new file mode 100644 index 000000000..c6a3b4b22 Binary files /dev/null and b/models/SilverbulletJetNoise.png differ diff --git a/models/SilverbulletJetSmoke.png b/models/SilverbulletJetSmoke.png new file mode 100644 index 000000000..f6c3704e4 Binary files /dev/null and b/models/SilverbulletJetSmoke.png differ diff --git a/models/barriermap.png b/models/barriermap.png index d292a0a16..8b8b2639c 100644 Binary files a/models/barriermap.png and b/models/barriermap.png differ diff --git a/models/extra/SilverMuz.png b/models/extra/SilverMuz.png new file mode 100644 index 000000000..10a5ef736 Binary files /dev/null and b/models/extra/SilverMuz.png differ diff --git a/shaders/glsl/JetSmoke.fp b/shaders/glsl/JetSmoke.fp new file mode 100644 index 000000000..4670e9aff --- /dev/null +++ b/shaders/glsl/JetSmoke.fp @@ -0,0 +1,9 @@ +vec4 ProcessTexel() +{ + vec3 base = getTexel(vTexCoord.st).rgb; + vec2 scroll = vTexCoord.st*.5+vec2(.2,.5)*timer; + float smk = texture(smoketex,scroll).x; + scroll = vTexCoord.st*.9+vec2(-.2,.4)*timer; + smk *= texture(smoketex,scroll).x; + return vec4(base*smk,1.); +} diff --git a/shaders/glsl/SilverScope.fp b/shaders/glsl/SilverScope.fp new file mode 100644 index 000000000..1264a50c7 --- /dev/null +++ b/shaders/glsl/SilverScope.fp @@ -0,0 +1,13 @@ +void main() +{ + vec2 uv = TexCoord.st; + vec3 base = texture(InputTexture,uv).rgb; + vec2 p = vec2(.5)-uv; + vec2 sz = textureSize(InputTexture,0); + if ( sz.x > sz.y ) p.x *= sz.x/sz.y; + else p.y *= sz.y/sz.x; + vec3 col = texture(InputTexture,uv+p*pow(length(p),8.)*80.).rgb; + col = (col+.02)*.98*vec3(1.2,.6,.15); + float fade = 1.-clamp(pow(length(p)*2.,40.),0.,1.); + FragColor = vec4(mix(base*.05,col,vec3(fade)),1.); +} diff --git a/sndinfo.txt b/sndinfo.txt index 177d5f878..ebad0d4e0 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -715,6 +715,39 @@ biospark/hiss sounds/sparkster/spark_hiss.ogg biospark/fail sounds/sparkster/spark_thirdfail.ogg biospark/checkout sounds/sparkster/spark_checkout.ogg +silverbullet/select sounds/silverbullet/silver_select.ogg +silverbullet/deselect sounds/silverbullet/silver_deselect.ogg +silverbullet/meleestart sounds/silverbullet/silver_meleestart.ogg +silverbullet/meleeend sounds/silverbullet/silver_meleeend.ogg +silverbullet/idle sounds/silverbullet/silver_idle.ogg +silverbullet/boltopen sounds/silverbullet/silver_boltopen.ogg +silverbullet/boltclose sounds/silverbullet/silver_boltclose.ogg +silverbullet/magout sounds/silverbullet/silver_magout.ogg +silverbullet/magin sounds/silverbullet/silver_magin.ogg +silverbullet/zoomstart sounds/silverbullet/silver_zoomstart.ogg +silverbullet/zooming sounds/silverbullet/silver_zooming.ogg +silverbullet/zoomend sounds/silverbullet/silver_zoomend.ogg +silverbullet/fire1 sounds/silverbullet/silver_fire1.ogg +silverbullet/fire2 sounds/silverbullet/silver_fire2.ogg +silverbullet/fire3 sounds/silverbullet/silver_fire3.ogg +$random silverbullet/fire { silverbullet/fire1 silverbullet/fire2 silverbullet/fire3 } +silverbullet/jet sounds/silverbullet/silver_jet.ogg +silverbullet/casing1 sounds/silverbullet/silver_casing1.ogg +silverbullet/casing2 sounds/silverbullet/silver_casing2.ogg +silverbullet/casing3 sounds/silverbullet/silver_casing3.ogg +silverbullet/casing4 sounds/silverbullet/silver_casing4.ogg +$random silverbullet/casing { silverbullet/casing1 silverbullet/casing2 silverbullet/casing3 silverbullet/casing4 } +silverbullet/mag1 sounds/silverbullet/silver_mag1.ogg +silverbullet/mag2 sounds/silverbullet/silver_mag2.ogg +silverbullet/mag3 sounds/silverbullet/silver_mag3.ogg +$random silverbullet/mag { silverbullet/mag1 silverbullet/mag2 silverbullet/mag3 } +silverbullet/hit1 sounds/silverbullet/silver_hit1.ogg +silverbullet/hit2 sounds/silverbullet/silver_hit2.ogg +$random silverbullet/hit { silverbullet/hit1 silverbullet/hit2 } +silverbullet/flesh1 sounds/silverbullet/silver_hitf1.ogg +silverbullet/flesh2 sounds/silverbullet/silver_hitf2.ogg +$random silverbullet/flesh { silverbullet/flesh1 silverbullet/flesh2 } + candygun/fire1 sounds/candygun/candy_fire1.ogg candygun/fire2 sounds/candygun/candy_fire2.ogg candygun/fire3 sounds/candygun/candy_fire3.ogg diff --git a/sounds/silverbullet/silver_boltclose.ogg b/sounds/silverbullet/silver_boltclose.ogg new file mode 100644 index 000000000..e6b35817f Binary files /dev/null and b/sounds/silverbullet/silver_boltclose.ogg differ diff --git a/sounds/silverbullet/silver_boltopen.ogg b/sounds/silverbullet/silver_boltopen.ogg new file mode 100644 index 000000000..0e4ed96d8 Binary files /dev/null and b/sounds/silverbullet/silver_boltopen.ogg differ diff --git a/sounds/silverbullet/silver_casing1.ogg b/sounds/silverbullet/silver_casing1.ogg new file mode 100644 index 000000000..1c2872293 Binary files /dev/null and b/sounds/silverbullet/silver_casing1.ogg differ diff --git a/sounds/silverbullet/silver_casing2.ogg b/sounds/silverbullet/silver_casing2.ogg new file mode 100644 index 000000000..12fbaf046 Binary files /dev/null and b/sounds/silverbullet/silver_casing2.ogg differ diff --git a/sounds/silverbullet/silver_casing3.ogg b/sounds/silverbullet/silver_casing3.ogg new file mode 100644 index 000000000..5533e8c0b Binary files /dev/null and b/sounds/silverbullet/silver_casing3.ogg differ diff --git a/sounds/silverbullet/silver_casing4.ogg b/sounds/silverbullet/silver_casing4.ogg new file mode 100644 index 000000000..1132b202d Binary files /dev/null and b/sounds/silverbullet/silver_casing4.ogg differ diff --git a/sounds/silverbullet/silver_deselect.ogg b/sounds/silverbullet/silver_deselect.ogg new file mode 100644 index 000000000..002f13407 Binary files /dev/null and b/sounds/silverbullet/silver_deselect.ogg differ diff --git a/sounds/silverbullet/silver_fire1.ogg b/sounds/silverbullet/silver_fire1.ogg new file mode 100644 index 000000000..813642716 Binary files /dev/null and b/sounds/silverbullet/silver_fire1.ogg differ diff --git a/sounds/silverbullet/silver_fire2.ogg b/sounds/silverbullet/silver_fire2.ogg new file mode 100644 index 000000000..8b43b3172 Binary files /dev/null and b/sounds/silverbullet/silver_fire2.ogg differ diff --git a/sounds/silverbullet/silver_fire3.ogg b/sounds/silverbullet/silver_fire3.ogg new file mode 100644 index 000000000..e28ef4bae Binary files /dev/null and b/sounds/silverbullet/silver_fire3.ogg differ diff --git a/sounds/silverbullet/silver_hit1.ogg b/sounds/silverbullet/silver_hit1.ogg new file mode 100644 index 000000000..cbf157973 Binary files /dev/null and b/sounds/silverbullet/silver_hit1.ogg differ diff --git a/sounds/silverbullet/silver_hit2.ogg b/sounds/silverbullet/silver_hit2.ogg new file mode 100644 index 000000000..887253ee9 Binary files /dev/null and b/sounds/silverbullet/silver_hit2.ogg differ diff --git a/sounds/silverbullet/silver_hitf1.ogg b/sounds/silverbullet/silver_hitf1.ogg new file mode 100644 index 000000000..633fef10d Binary files /dev/null and b/sounds/silverbullet/silver_hitf1.ogg differ diff --git a/sounds/silverbullet/silver_hitf2.ogg b/sounds/silverbullet/silver_hitf2.ogg new file mode 100644 index 000000000..1f35006d6 Binary files /dev/null and b/sounds/silverbullet/silver_hitf2.ogg differ diff --git a/sounds/silverbullet/silver_idle.ogg b/sounds/silverbullet/silver_idle.ogg new file mode 100644 index 000000000..f681e0596 Binary files /dev/null and b/sounds/silverbullet/silver_idle.ogg differ diff --git a/sounds/silverbullet/silver_jet.ogg b/sounds/silverbullet/silver_jet.ogg new file mode 100644 index 000000000..fbc088f52 Binary files /dev/null and b/sounds/silverbullet/silver_jet.ogg differ diff --git a/sounds/silverbullet/silver_mag1.ogg b/sounds/silverbullet/silver_mag1.ogg new file mode 100644 index 000000000..7e6873fae Binary files /dev/null and b/sounds/silverbullet/silver_mag1.ogg differ diff --git a/sounds/silverbullet/silver_mag2.ogg b/sounds/silverbullet/silver_mag2.ogg new file mode 100644 index 000000000..926bf93ff Binary files /dev/null and b/sounds/silverbullet/silver_mag2.ogg differ diff --git a/sounds/silverbullet/silver_mag3.ogg b/sounds/silverbullet/silver_mag3.ogg new file mode 100644 index 000000000..808f5bfa3 Binary files /dev/null and b/sounds/silverbullet/silver_mag3.ogg differ diff --git a/sounds/silverbullet/silver_magin.ogg b/sounds/silverbullet/silver_magin.ogg new file mode 100644 index 000000000..57fd49859 Binary files /dev/null and b/sounds/silverbullet/silver_magin.ogg differ diff --git a/sounds/silverbullet/silver_magout.ogg b/sounds/silverbullet/silver_magout.ogg new file mode 100644 index 000000000..3180817f6 Binary files /dev/null and b/sounds/silverbullet/silver_magout.ogg differ diff --git a/sounds/silverbullet/silver_meleeend.ogg b/sounds/silverbullet/silver_meleeend.ogg new file mode 100644 index 000000000..0f3833765 Binary files /dev/null and b/sounds/silverbullet/silver_meleeend.ogg differ diff --git a/sounds/silverbullet/silver_meleestart.ogg b/sounds/silverbullet/silver_meleestart.ogg new file mode 100644 index 000000000..36f3ff4dd Binary files /dev/null and b/sounds/silverbullet/silver_meleestart.ogg differ diff --git a/sounds/silverbullet/silver_select.ogg b/sounds/silverbullet/silver_select.ogg new file mode 100644 index 000000000..c35d2c33b Binary files /dev/null and b/sounds/silverbullet/silver_select.ogg differ diff --git a/sounds/silverbullet/silver_zoomend.ogg b/sounds/silverbullet/silver_zoomend.ogg new file mode 100644 index 000000000..1f32cbf84 Binary files /dev/null and b/sounds/silverbullet/silver_zoomend.ogg differ diff --git a/sounds/silverbullet/silver_zooming.ogg b/sounds/silverbullet/silver_zooming.ogg new file mode 100644 index 000000000..d8958f44e Binary files /dev/null and b/sounds/silverbullet/silver_zooming.ogg differ diff --git a/sounds/silverbullet/silver_zoomstart.ogg b/sounds/silverbullet/silver_zoomstart.ogg new file mode 100644 index 000000000..04af9e9fe Binary files /dev/null and b/sounds/silverbullet/silver_zoomstart.ogg differ diff --git a/zscript/swwm_ammo.zsc b/zscript/swwm_ammo.zsc index f9acd2c48..0f76f5ef2 100644 --- a/zscript/swwm_ammo.zsc +++ b/zscript/swwm_ammo.zsc @@ -196,7 +196,7 @@ Class RedShell : Ammo Tag "$T_REDSHELLS"; Stamina 500; Inventory.Amount 1; - Inventory.MaxAmount 48; + Inventory.MaxAmount 40; Ammo.BackpackAmount 8; Ammo.DropAmount 3; +FLOATBOB; @@ -255,7 +255,7 @@ Class GreenShell : Ammo Tag "$T_GREENSHELLS"; Stamina 800; Inventory.Amount 1; - Inventory.MaxAmount 40; + Inventory.MaxAmount 32; Ammo.BackpackAmount 4; Ammo.DropAmount 2; +FLOATBOB; @@ -540,7 +540,7 @@ Class EvisceratorShell : Ammo Inventory.PickupMessage "$T_EVISHELL"; Stamina 2500; Inventory.Amount 1; - Inventory.MaxAmount 30; + Inventory.MaxAmount 24; Ammo.BackpackAmount 3; Ammo.DropAmount 2; +FLOATBOB; @@ -577,7 +577,7 @@ Class HellblazerMissiles : Ammo Inventory.PickupMessage "$T_HELLMISSILE"; Stamina 6000; Inventory.Amount 1; - Inventory.MaxAmount 60; + Inventory.MaxAmount 30; Ammo.BackpackAmount 3; Ammo.DropAmount 1; +FLOATBOB; @@ -609,7 +609,7 @@ Class HellblazerCrackshots : Ammo Inventory.PickupMessage "$T_HELLCLUSTER"; Stamina 8000; Inventory.Amount 1; - Inventory.MaxAmount 24; + Inventory.MaxAmount 18; Ammo.BackpackAmount 2; Ammo.DropAmount 1; +FLOATBOB; @@ -707,7 +707,7 @@ Class SparkUnit : Ammo Inventory.PickupMessage "$T_SPARKUNIT"; Stamina 50000; Inventory.Amount 1; - Inventory.MaxAmount 8; + Inventory.MaxAmount 4; Ammo.BackpackAmount 1; Ammo.DropAmount 1; +FLOATBOB; @@ -733,8 +733,8 @@ Class SilverBulletAmmo : Ammo Inventory.PickupMessage "$T_XSBMAG"; Stamina 70000; Inventory.Amount 1; - Inventory.MaxAmount 5; - Ammo.BackpackAmount 1; + Inventory.MaxAmount 3; + Ammo.BackpackAmount 0; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -759,7 +759,7 @@ Class CandyGunAmmo : Ammo Inventory.PickupMessage "$T_CANDYMAG"; Stamina 100000; Inventory.Amount 1; - Inventory.MaxAmount 4; + Inventory.MaxAmount 2; Ammo.BackpackAmount 0; Ammo.DropAmount 1; +FLOATBOB; diff --git a/zscript/swwm_blazeit.zsc b/zscript/swwm_blazeit.zsc index d7c599e44..4eb8c2b20 100644 --- a/zscript/swwm_blazeit.zsc +++ b/zscript/swwm_blazeit.zsc @@ -1841,7 +1841,7 @@ Class Hellblazer : SWWMWeapon XZWQ KLM 2; XZWQ N 2 A_Parry(9); XZWQ OP 1; - XZWQ Q 1 A_Melee(75,"demolitionist/whitl"); + XZWQ Q 1 A_Melee(75,"demolitionist/whitl",1.05); XZWQ RSTUV 2; XZWQ W 2 A_StartSound("hellblazer/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZWQ XYZ 2; diff --git a/zscript/swwm_cbt.zsc b/zscript/swwm_cbt.zsc index 8f343d853..3dcdd1fdc 100644 --- a/zscript/swwm_cbt.zsc +++ b/zscript/swwm_cbt.zsc @@ -636,8 +636,8 @@ Class Wallbuster : SWWMWeapon { t.HitList[i].HitActor.TraceBleed(realdmg,self); t.HitList[i].HitActor.SpawnBlood(t.HitList[i].HitLocation,atan2(t.HitList[i].x.y,t.HitList[i].x.x)+180,realdmg); - if ( large ) t.HitList[i].HitActor.A_StartSound("spreadgun/slugf",CHAN_BODY,CHANF_OVERLAP,1.,2.); - else t.HitList[i].HitActor.A_StartSound("spreadgun/pelletf",CHAN_BODY,CHANF_OVERLAP,.4,4.); + if ( large ) t.HitList[i].HitActor.A_StartSound("spreadgun/slugf",CHAN_FOOTSTEP,CHANF_OVERLAP,1.,2.); + else t.HitList[i].HitActor.A_StartSound("spreadgun/pelletf",CHAN_FOOTSTEP,CHANF_OVERLAP,.4,4.); } } if ( (t.Results.HitType != TRACE_HitNone) && (t.Results.HitType != TRACE_HasHitSky) ) @@ -746,7 +746,7 @@ Class Wallbuster : SWWMWeapon int qk = min(9,1+howmany/5); int ql = min(25,6+howmany/2); A_QuakeEx(qk,qk,qk,ql,0,8,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:qk*.15); - A_ZoomFactor(1.+qk*.04,ZOOM_INSTANT); + A_ZoomFactor(1.-qk*.04,ZOOM_INSTANT); A_ZoomFactor(1.); A_AlertMonsters(alertness); A_PlayerFire(); @@ -1390,7 +1390,7 @@ Class Wallbuster : SWWMWeapon XZW9 GHI 2; XZW9 J 2 A_Parry(9); XZW9 KLM 1; - XZW9 N 1 A_Melee(70,"demolitionist/whitl"); + XZW9 N 1 A_Melee(70,"demolitionist/whitl",1.2); XZW9 OPQRS 2; XZW9 T 2 A_StartSound("wallbuster/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW9 UVW 2; diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index 234275775..cd6ea98e0 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -2811,22 +2811,22 @@ Class SWWMHandler : EventHandler case 1: case 2: case 3: - if ( Random[Replacements](0,1) ) e.Replacement = 'HellblazerMissiles'; + if ( Random[Replacements](0,2) ) e.Replacement = 'HellblazerMissiles'; else e.Replacement = 'HellblazerMissileMag'; break; case 4: case 5: case 6: - if ( Random[Replacements](0,2) ) e.Replacement = 'HellblazerCrackshots'; + if ( Random[Replacements](0,3) ) e.Replacement = 'HellblazerCrackshots'; else e.Replacement = 'HellblazerCrackshotMag'; break; case 7: case 8: - if ( Random[Replacements](0,3) ) e.Replacement = 'HellblazerRavagers'; + if ( Random[Replacements](0,4) ) e.Replacement = 'HellblazerRavagers'; else e.Replacement = 'HellblazerRavagerMag'; break; case 9: - if ( Random[Replacements](0,4) ) e.Replacement = 'HellblazerWarheads'; + if ( Random[Replacements](0,5) ) e.Replacement = 'HellblazerWarheads'; else e.Replacement = 'HellblazerWarheadMag'; break; } @@ -3088,6 +3088,9 @@ Class SWWMHandler : EventHandler Screen.Dim(Color(96,255,64),.1875*fstr,0,0,Screen.GetWidth(),Screen.GetHeight()); } } + // weapon underlays + if ( players[consoleplayer].ReadyWeapon is 'SWWMWeapon' ) + SWWMWeapon(players[consoleplayer].ReadyWeapon).RenderUnderlay(e); if ( !statusbar || !(statusbar is 'SWWMStatusBar') ) return; SWWMStatusBar(statusbar).viewpos = e.viewpos; SWWMStatusBar(statusbar).viewrot = (e.viewangle,e.viewpitch,e.viewroll); diff --git a/zscript/swwm_danmaku.zsc b/zscript/swwm_danmaku.zsc index 773cc8b8d..5a45fc440 100644 --- a/zscript/swwm_danmaku.zsc +++ b/zscript/swwm_danmaku.zsc @@ -918,7 +918,7 @@ Class Eviscerator : SWWMWeapon XZW9 AB 1; XZW9 C 1 A_Parry(9); XZW9 D 1; - XZW9 E 2 A_Melee(60,"demolitionist/whitm"); + XZW9 E 2 A_Melee(60,"demolitionist/whitm",1.1); XZW9 FGH 2; XZW9 I 2 A_StartSound("eviscerator/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW9 JKL 2; @@ -929,7 +929,7 @@ Class Eviscerator : SWWMWeapon XZWA QRS 1; XZWA T 1 A_Parry(9); XZWA U 1; - XZWA V 2 A_Melee(60,"demolitionist/whitm"); + XZWA V 2 A_Melee(60,"demolitionist/whitm",1.1); XZWA WXY 2; XZWA Z 2 A_StartSound("eviscerator/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZWB ABC 2; diff --git a/zscript/swwm_inventory.zsc b/zscript/swwm_inventory.zsc index fac864a66..588ccbd51 100644 --- a/zscript/swwm_inventory.zsc +++ b/zscript/swwm_inventory.zsc @@ -976,6 +976,10 @@ Class SWWMWeapon : Weapon abstract virtual ui void HudTick() { } + // extra drawing, usually scopes + virtual ui void RenderUnderlay( RenderEvent e ) + { + } // animations action void A_PlayerFire() { @@ -1048,12 +1052,12 @@ Class SWWMWeapon : Weapon abstract if ( !FindInventory("ParryDamageChecker") ) GiveInventory("ParryDamageChecker",1); // need this so parried projectiles deal extra damage } - private action bool TryMelee( double angle, int dmg, String hitsound = "" ) + private action bool TryMelee( double angle, int dmg, String hitsound = "", double rangemul = 1. ) { FTranslatedLineTarget t; - double slope = AimLineAttack(angle,1.5*DEFMELEERANGE,t,0.,ALF_CHECK3D); + double slope = AimLineAttack(angle,1.5*DEFMELEERANGE*rangemul,t,0.,ALF_CHECK3D); FLineTraceData d; - LineTrace(angle,1.5*DEFMELEERANGE,slope,0,player.viewheight,data:d); + LineTrace(angle,1.5*DEFMELEERANGE*rangemul,slope,0,player.viewheight,data:d); bool raging = CountInv("RagekitPower"); if ( d.HitType == TRACE_HitActor ) { @@ -1105,7 +1109,7 @@ Class SWWMWeapon : Weapon abstract } return false; } - action void A_Melee( int dmg = 40, String hitsound = "" ) + action void A_Melee( int dmg = 40, String hitsound = "", double rangemul = 1. ) { // temporarily disable parry field so we can trace through if ( invoker.pfield ) invoker.pfield.bSHOOTABLE = false; @@ -1113,7 +1117,7 @@ Class SWWMWeapon : Weapon abstract let ut = new("UseLineTracer"); ut.uses.Clear(); ut.glass.Clear(); - ut.Trace(Vec3Offset(0,0,player.viewheight),CurSector,(cos(angle)*cos(pitch),sin(angle)*cos(pitch),sin(-pitch)),DEFMELEERANGE,0); + ut.Trace(Vec3Offset(0,0,player.viewheight),CurSector,(cos(angle)*cos(pitch),sin(angle)*cos(pitch),sin(-pitch)),DEFMELEERANGE*rangemul,0); for ( int i=0; i= 10 ) + { + Screen.DrawTexture(WeaponBox[1],false,bx-56,by-34,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + Screen.DrawText(TewiFont,Font.CR_WHITE,bx-54,by-34,String.Format("%2dx",zl/10),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + int zw = int(zl*31./160.); + Screen.DrawTexture(ZoomBar,false,bx-33,by-32,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_WindowRight,zw); + } + Screen.DrawTexture(WeaponBox[0],false,bx-56,by-22,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + if ( chambered && !fired ) Screen.DrawText(TewiFont,Font.CR_FIRE,bx-19,by-21,"⁺¹",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Spacing,-1); + Screen.DrawText(TewiFont,Font.CR_FIRE,bx-16,by-14,String.Format("%d",max(clipcount,0)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + int cx = (Ammo1.Amount>9)?53:50; + Screen.DrawText(TewiFont,Font.CR_FIRE,bx-cx,by-18,String.Format("%d",Ammo1.Amount),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + } + override void HudTick() + { + if ( !ZoomInter ) ZoomInter = DynamicValueInterpolator.Create(int(zoomlevel*10),.5,1,20); + ZoomInter.Update(int(zoomlevel*10)); + } + override bool ReportHUDAmmo() { - return false; + if ( (chambered && !fired) || (clipcount > 0) ) return true; + if ( Ammo1.Amount <= 0 ) return false; + return Super.ReportHUDAmmo(); } override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount ) { - return false; + if ( sv_infiniteammo || Owner.FindInventory('PowerInfiniteAmmo',true) ) return true; + if ( fireMode == PrimaryFire ) return ((chambered && !fired) || (clipcount > 0) || (Ammo1.Amount > 0)); + if ( fireMode == AltFire ) return true; // it's just a zoom + return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount); } override void AttachToOwner( Actor other ) { Super.AttachToOwner(other); - if ( other.player == players[consoleplayer] ) - Console.Printf("\cgSILVER BULLET JET NOT IMPLEMENTED\c-"); + if ( !initialized ) + { + initialized = true; + // first copy always has a bullet in the chamber + chambered = true; + fired = false; + } + } + override void DetachFromOwner() + { + // force disable zoom + zoomed = false; + if ( Owner.player == players[consoleplayer] ) + Shader.SetEnabled(players[consoleplayer],"SilverScope",false); + Super.DetachFromOwner(); + } + override void DoEffect() + { + Super.DoEffect(); + if ( zoomed ) crosshair = 99; + else crosshair = 0; + } + override void RenderUnderlay( RenderEvent e ) + { + if ( zoomed && (Owner.player == players[consoleplayer]) ) + { + Vector2 ss = (Screen.GetWidth(),Screen.GetHeight()); + ss *= (512./ss.y); + Shader.SetEnabled(players[consoleplayer],"SilverScope",true); + if ( !reticle ) reticle = TexMan.CheckForTexture("graphics/SBReticle.png",TexMan.Type_Any); + Screen.DrawTexture(reticle,false,ss.x*.5,ss.y*.5,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_LegacyRenderStyle,STYLE_Stencil,DTA_FillColor,Color(0,0,0)); + } + else Shader.SetEnabled(players[consoleplayer],"SilverScope",false); + } + + action void ProcessTraceHit( SpreadgunTracer t, Vector3 origin, Vector3 dir ) + { + for ( int i=0; i0)?"SilverBulletMag":"SilverBulletMagEmpty",origin); + c.angle = angle; + c.pitch = pitch; + c.vel = x*FRandom[Junk](-.5,.5)+y*FRandom[Junk](-.5,.5)-(0,0,FRandom[Junk](2,3)); + c.vel += vel*.5; + } + action void A_JetCompensate() + { + invoker.specialf1 -= .06; + Vector3 x, y, z; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + vel += x*min(1.,invoker.specialf1)*(600./Mass); + A_OverlayAlpha(PSP_WEAPON+2,clamp(invoker.specialf1*3.,0.,1.)); + if ( Random[SilverBullet](0,int(invoker.specialf1*4)) ) + self.DamageMobj(invoker,self,2,'jet'); + Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),-x*10-z*10); + for ( int i=0; i<4; i++ ) + { + let s = Spawn("SWWMSmoke",origin); + s.scale *= 1.3; + s.alpha *= .5*invoker.specialf1; + s.special1 = Random[Silverbullet](0,3); + s.SetShade(Color(1,1,1)*Random[Silverbullet](224,255)); + s.vel += vel*.5+x*FRandom[Silverbullet](-8.,-5.)+y*FRandom[Silverbullet](3.,6.)*RandomPick[Silverbullet](-1,1)+z*FRandom[Silverbullet](-3.,-2.); + } } Default @@ -31,6 +386,7 @@ Class SilverBullet : SWWMWeapon Obituary "$O_SILVERBULLET"; Weapon.SlotNumber 8; Weapon.SelectionOrder 1400; + Weapon.UpSound "silverbullet/select"; Stamina 400000; Weapon.AmmoType1 "SilverBulletAmmo"; Weapon.AmmoGive1 1; @@ -44,20 +400,263 @@ Class SilverBullet : SWWMWeapon XZW1 A -1; Stop; Select: - TNT1 A 1 - { - Console.Printf("\cgSILVER BULLET JET NOT IMPLEMENTED\c-"); - A_FullRaise(); - } + XZW2 G 2 A_FullRaise(); + XZW2 HIJKLMN 2; Goto Ready; Ready: - TNT1 A 1 A_WeaponReady(); + XZW2 A 1 + { + int flg = WRF_ALLOWZOOM|WRF_ALLOWUSER1; + if ( (invoker.clipcount < invoker.default.clipcount) && (sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true) || (invoker.Ammo1.Amount > 0)) ) + flg |= WRF_ALLOWRELOAD; + A_WeaponReady(flg); + if ( player.cmd.buttons&BT_ATTACK ) + invoker.CheckAmmo(EitherFire,true); + } + Wait; + ZoomReady: + TNT1 A 1 + { + int flg = WRF_ALLOWZOOM|WRF_ALLOWUSER1; + if ( (invoker.clipcount < invoker.default.clipcount) && (sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true) || (invoker.Ammo1.Amount > 0)) ) + flg |= WRF_ALLOWRELOAD; + A_WeaponReady(flg); + if ( player.cmd.buttons&BT_ATTACK ) + invoker.CheckAmmo(EitherFire,true); + } Wait; Fire: + XZW2 A 1 + { + if ( !invoker.chambered || invoker.fired ) + { + if ( !invoker.fired && (invoker.clipcount <= 0) && (sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true) || (invoker.Ammo1.Amount > 0)) ) + return ResolveState("Reload"); + return ResolveState("Cock"); + } + A_SilverFire(); + invoker.fired = true; + return A_JumpIf(invoker.zoomed,"ZoomFire"); + } + XZW2 OPQR 2; + XZW2 STUVW 3; + XZW2 A 1 A_JumpIf(invoker.specialf1<=0.,"Ready"); + Wait; + Jet: + TNT1 A 3 + { + invoker.specialf1 = 1.5; + } + TNT1 A 0 + { + A_StartSound("silverbullet/jet",CHAN_WEAPON,CHANF_OVERLAP); + A_Overlay(PSP_WEAPON+2,"JetSmoke"); + A_OverlayFlags(PSP_WEAPON+2,PSPF_RENDERSTYLE|PSPF_ALPHA|PSPF_FORCESTYLE|PSPF_FORCEALPHA,true); + A_OverlayRenderStyle(PSP_WEAPON+2,STYLE_Add); + } + TNT1 A 1 + { + A_JetCompensate(); + return A_JumpIf(invoker.specialf1<=0.,1); + } + Wait; TNT1 A 1; + Stop; + JetSmoke: + XZW7 PQR 2; + XZW7 STUVW 3; + XZW7 X 1 A_JumpIf(invoker.specialf1<=0.,1); + Wait; + TNT1 A 1; + Stop; + Cock: + XZW2 A 0 + { + if ( invoker.zoomed ) + { + invoker.dezoomstate = ResolveState("DoCock"); + return ResolveState("AltFireZoom"); + } + return ResolveState(null); + } + DoCock: + XZW2 A 2 A_StartSound("silverbullet/meleestart",CHAN_WEAPON,CHANF_OVERLAP); + XZW2 XYZ 2; + XZW3 AB 2; + XZW3 C 2 + { + A_StartSound("silverbullet/boltopen",CHAN_WEAPON,CHANF_OVERLAP); + invoker.fired = false; + if ( invoker.chambered ) + A_Overlay(PSP_WEAPON+1,"Casing"); + invoker.chambered = (invoker.clipcount>0); + invoker.clipcount = max(0,invoker.clipcount-1); + } + XZW3 DEFG 2; + XZW3 H 2 A_StartSound("silverbullet/boltclose",CHAN_WEAPON,CHANF_OVERLAP); + XZW3 I 2 A_StartSound("silverbullet/meleeend",CHAN_WEAPON,CHANF_OVERLAP); + XZW3 JKLMNOPQR 2; + Goto Ready; + Casing: + XZW7 DE 2; + XZW7 FGHIJKLMNO 1; + TNT1 A 0 A_DropCasing(); + Stop; + ZoomFire: + TNT1 A 24; + TNT1 A 1 A_JumpIf(invoker.specialf1<=0.,"ZoomReady"); + Wait; + AltFire: + XZW2 A 0 A_JumpIf(invoker.zoomed,"AltFireZoom"); + XZW2 A 2 + { + A_StartSound("silverbullet/zoomstart",CHAN_WEAPON,CHANF_OVERLAP); + invoker.zoomlevel = 0; + } + XZW3 STUVWX 1; + TNT1 A 1 + { + invoker.zoomed = true; + invoker.zoomlevel = clamp(invoker.zoomlevel*1.1+.1,1.,16.); + A_ZoomFactor(invoker.zoomlevel); + if ( !(level.maptime%2) && (invoker.zoomlevel < 16.) ) A_StartSound("silverbullet/zooming",CHAN_WEAPON,CHANF_OVERLAP,.2); + if ( !(player.cmd.buttons&BT_ALTATTACK) ) + return ResolveState("ZoomReady"); + return ResolveState(null); + } + Wait; + AltFireZoom: + XZW3 X 1 + { + A_StartSound("silverbullet/zoomend",CHAN_WEAPON,CHANF_OVERLAP); + invoker.zoomed = false; + invoker.zoomlevel = 0; + A_ZoomFactor(1.,ZOOM_INSTANT); + } + XZW3 YZ 1; + XZW4 ABC 1; + XZW2 A 0 + { + if ( invoker.dezoomstate ) + { + State tmp = invoker.dezoomstate; + invoker.dezoomstate = null; + return tmp; + } + return ResolveState(null); + } + Goto Ready; + Reload: + XZW2 A 0 + { + if ( invoker.zoomed ) + { + invoker.dezoomstate = ResolveState("Unload"); + return ResolveState("AltFireZoom"); + } + return ResolveState(null); + } + Unload: + XZW2 A 2 + { + A_PlayerReload(); + A_StartSound("silverbullet/meleestart",CHAN_WEAPON,CHANF_OVERLAP); + return A_JumpIf(invoker.clipcount<=0,"UnloadEmpty"); + } + XZW4 DEFGHI 2; + XZW4 J 2 A_StartSound("silverbullet/magout",CHAN_WEAPON,CHANF_OVERLAP); + XZW4 KLMN 2; + Goto Load; + UnloadEmpty: + XZW2 A 2; + XZW4 OPQRST 2; + XZW4 U 2 A_StartSound("silverbullet/magout",CHAN_WEAPON,CHANF_OVERLAP); + XZW4 VWXY 2; + Goto Load; + Load: + XZW4 Z 2 + { + A_DropMag(); + invoker.clipcount = invoker.default.clipcount; + if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1); + } + XZW5 ABC 2; + XZW5 D 2 A_StartSound("silverbullet/magin",CHAN_WEAPON,CHANF_OVERLAP); + XZW5 E 2 A_StartSound("silverbullet/meleeend",CHAN_WEAPON,CHANF_OVERLAP); + XZW5 FGHIJKLMN 2; + Goto Ready; + Zoom: + XZW2 A 0 + { + if ( invoker.zoomed ) + { + invoker.dezoomstate = ResolveState("DoZoom"); + return ResolveState("AltFireZoom"); + } + return ResolveState(null); + } + DoZoom: + XZW2 A 2 + { + A_StartSound("silverbullet/idle",CHAN_WEAPON,CHANF_OVERLAP); + A_PlayerCheckGun(); + } + XZW5 OPQR 3; + XZW5 STUV 2; + XZW5 WXYZ 3; + XZW6 ABCD 4; + XZW6 EFGH 3; + Goto Ready; + User1: + XZW2 A 0 + { + if ( invoker.zoomed ) + { + invoker.dezoomstate = ResolveState("DoUser1"); + return ResolveState("AltFireZoom"); + } + return ResolveState(null); + } + DoUser1: + XZW2 A 2 + { + A_StartSound("silverbullet/meleestart",CHAN_WEAPON,CHANF_OVERLAP); + A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); + A_PlayerMelee(); + } + XZW6 IJK 3; + XZW6 L 1 A_Parry(9); + XZW6 MN 1; + XZW6 O 1 A_Melee(90,"demolitionist/whitl",1.6); + XZW6 PQ 1; + XZW6 RST 2; + XZW6 U 3 A_StartSound("silverbullet/meleeend",CHAN_WEAPON,CHANF_OVERLAP); + XZW6 VWXYZ 3; + XZW7 ABC 2; Goto Ready; Deselect: - TNT1 A -1 A_FullLower(); + XZW2 A 0 + { + if ( invoker.zoomed ) + { + invoker.dezoomstate = ResolveState("DoDeselect"); + return ResolveState("AltFireZoom"); + } + return ResolveState(null); + } + DoDeselect: + XZW2 A 2 A_StartSound("silverbullet/deselect",CHAN_WEAPON,CHANF_OVERLAP); + XZW2 BCDEF 2; + XZW2 G -1 A_FullLower(); + Stop; + Flash: + XZWZ A 2 Bright + { + let l = Spawn("SWWMWeaponLight",pos); + l.args[3] = 200; + l.target = self; + } Stop; } }