diff --git a/README.md b/README.md index 10a41c007..e8a636487 100644 --- a/README.md +++ b/README.md @@ -253,16 +253,18 @@ their small size. ### Silver Bullet JET (slot 8), replaces Plasma Rifle, Hellstaff, Quietus (hilt) -A lighter (43kg), higher caliber (1.150 XSB) variant of the original Silver +A lighter (43kg), higher caliber (1.150) variant of the original Silver 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. A second press chambers another round. -Secondary fire uses the scope. Can be held to go up to 16x. +Secondary fire picks the ammo for the next reload. -Reload reloads (what else is new). +Reload reloads (what else is new) or switches ammo types. + +Zoom uses the scope. Can be held to go up to 16x. This weapon is generally not recommended for human use outside of power armor. Good thing you're not a human, then. Still, the recoil compensator jet engines @@ -272,9 +274,22 @@ careful. ### 1.150 XSB Bullets, replaces Cells, Runes The 1.150 caliber eXplosive Super Burst bullets employ an explodium microcharge -to be shot with enough energy to reach a relatively high velocity. They are -hard to come by, so spawns are scarce, and they won't even pop up in -Hammerspace Embiggeners, only on higher tier Fabricators. +to be shot with enough energy to reach a relatively high velocity, allowing +their massive bulk to penetrate several targets including walls. They are hard +to come by, so spawns are scarce, and they won't even pop up in Hammerspace +Embiggeners, only on higher tier Fabricators. + +In the world, they may pop up as spare bullets or full mags. Each five bullets +picked up will be automatically converted to a full mag in your inventory. + +### 1.150 FCB Bullets, replaces Cells, Runes + +The more directly explosive counterpart of the XSB. Personally baptized by +Hermann E. Ischer himself as "Fat Chode Bombs", these High-Explosive Squash +Head rounds will blast through walls on impact, hitting anything standing +behind them, and in some cases, tearing down the wall itself too. + +Same spawn conditions as the standard bullets. ### Candy Gun (slot 9), replaces BFG9000, Firemace, Bloodscourge (stub) @@ -293,6 +308,15 @@ Holding primary fire during the first few moments of altfire will throws the weapon away, armed and ready to explode if it hits anyone or anything. The blast area for this is pretty ridiculous. You can hold spare guns, by the way. +### Candy Gun Bullets, replaces Cells, Runes + +The ammo for this beast. Mags don't pop up on embiggeners, only on the highest +tier fabricator. + +In the world, you may find either spare bullets or full mags. Each seven +bullets picked up will be automatically converted to a full mag in your +inventory. + ### Ynykron Artifact (slot 0), replaces BFG9000, Firemace, Wraithverge (arc) Popularly known as the "Death Cannon". One of the four ultimate weapons @@ -433,7 +457,7 @@ You're fucking invincible for a total of 30 seconds. ### Hammerspace Embiggener, replaces Backpack, Bag of Holding, Porkalator, Dragonskin Bracers Each of these you pick up increase ammo capacity by half of its base value, up -to 5x, and also give you some extra ammo like a normal backpack. +to 16x, and also give you some extra ammo like a normal backpack. ### Universal Ammo Fabricator, replaces Mana / Krater of Might in Hexen diff --git a/TODO.md b/TODO.md index 454af5eb2..6af51367e 100644 --- a/TODO.md +++ b/TODO.md @@ -6,8 +6,7 @@ Not so fundamental things during beta: - Item detection button (highlights nearby, visible items) - Dual wielding Explodium Gun - Quick grenade function (Explodium Mag) - - Mag refilling system (no more wasted ammo) - - 1.150 FCB alternate ammo for Silver Bullet + - Allow loading partial mags from spare bullets - Parrying for hitscan weapons (currently parrying only handles vanilla LineAttack) - Fun options - Omnibusting (all weapons can bust walls) diff --git a/graphics/HUD/Icons/A_CandyBullet.png b/graphics/HUD/Icons/A_CandyBullet.png new file mode 100644 index 000000000..c8e1f590b Binary files /dev/null and b/graphics/HUD/Icons/A_CandyBullet.png differ diff --git a/graphics/HUD/Icons/A_SilverBullet2.png b/graphics/HUD/Icons/A_SilverBullet2.png new file mode 100644 index 000000000..4597d055d Binary files /dev/null and b/graphics/HUD/Icons/A_SilverBullet2.png differ diff --git a/graphics/HUD/Icons/A_SilverBulletBullet.png b/graphics/HUD/Icons/A_SilverBulletBullet.png new file mode 100644 index 000000000..dff86ef16 Binary files /dev/null and b/graphics/HUD/Icons/A_SilverBulletBullet.png differ diff --git a/graphics/HUD/Icons/A_SilverBulletBullet2.png b/graphics/HUD/Icons/A_SilverBulletBullet2.png new file mode 100644 index 000000000..588f26316 Binary files /dev/null and b/graphics/HUD/Icons/A_SilverBulletBullet2.png differ diff --git a/graphics/HUD/SilverBulletDisplay.png b/graphics/HUD/SilverBulletDisplay.png index c1b78d892..964bc1faf 100644 Binary files a/graphics/HUD/SilverBulletDisplay.png and b/graphics/HUD/SilverBulletDisplay.png differ diff --git a/graphics/HUD/SilverBulletFCB.png b/graphics/HUD/SilverBulletFCB.png new file mode 100644 index 000000000..10e59451c Binary files /dev/null and b/graphics/HUD/SilverBulletFCB.png differ diff --git a/graphics/HUD/SilverBulletFCBMag.png b/graphics/HUD/SilverBulletFCBMag.png new file mode 100644 index 000000000..e78d1646a Binary files /dev/null and b/graphics/HUD/SilverBulletFCBMag.png differ diff --git a/graphics/HUD/SilverBulletXSB.png b/graphics/HUD/SilverBulletXSB.png new file mode 100644 index 000000000..b01292e92 Binary files /dev/null and b/graphics/HUD/SilverBulletXSB.png differ diff --git a/graphics/HUD/SilverBulletXSBMag.png b/graphics/HUD/SilverBulletXSBMag.png new file mode 100644 index 000000000..0f685940e Binary files /dev/null and b/graphics/HUD/SilverBulletXSBMag.png differ diff --git a/graphics/HUD/SilverBulletZoomDisplay.png b/graphics/HUD/SilverBulletZoomDisplay.png index bd938178a..39a71a799 100644 Binary files a/graphics/HUD/SilverBulletZoomDisplay.png and b/graphics/HUD/SilverBulletZoomDisplay.png differ diff --git a/language.def_base b/language.def_base index b5e363c6b..fdf0f21d6 100644 --- a/language.def_base +++ b/language.def_base @@ -51,7 +51,11 @@ T_HELLBURNINATORMAG = "Hellblazer Ravager Mag"; T_HELLNUKEMAG = "Hellblazer Warhead Mag"; T_SPARKUNIT = "Biospark Unit"; T_XSBMAG = "1.150 XSB Magazine"; +T_FCBMAG = "1.150 FCB Magazine"; +T_XSBBULLET = "1.150 XSB Bullet"; +T_FCBBULLET = "1.150 FCB Bullet"; T_CANDYMAG = "Candy Gun Magazine"; +T_CANDYBULLET = "Candy Gun Bullet"; T_CANDYSPARE = "Candy Gun Spare"; T_YNYKRONAMMO = "Crystal Box"; T_BLASTSUIT = "Blast Suit"; @@ -605,6 +609,7 @@ O_EVISCERATOR = "%o was eviscerated by %k."; O_HELLBLAZER = "%k blasted %o into burning bits."; O_SPARKSTER = "%o got sparked hard by %k."; O_SILVERBULLET = "%o could not ignore the girth of %k's bullets."; +O_SILVERBULLET2 = "%o was blasted by %k's girthy bullets."; O_CANDYGUN = "%k made %o taste the sweetness (and death)."; O_YNYKRON = "%o was instantly removed by %k."; O_YNYKRONALT = "%o was spaghettified by %k."; diff --git a/language.def_lore b/language.def_lore index d4c4e0ed6..54819cbfc 100644 --- a/language.def_lore +++ b/language.def_lore @@ -22,7 +22,7 @@ SWWM_LORETXT_MAIDBOT = "\cxFull Name:\c-\n\cf Maidbot \"Meido\" Miyamoto\c-\n\cf SWWM_LORETAG_SPARKSTER = "Biospark Carbine"; SWWM_LORETAB_SPARKSTER = "Item"; SWWM_LOREREL_SPARKSTER = "DecadeMech;EngineTech;Saya"; -SWWM_LORETXT_SPARKSTER = "\cxDesignation:\c-\n\cf Model S-5 Biospark Carbine\c-\n\cxManufacturer:\c-\n\cf Decade Mechanics\c-\n\cxClassification:\c-\n\cf Ancient Alien Energy Weapon\c-\n\nThe \cfBiospark Carbine\c-, also known by its nickname of \cf\"Sparkster\"\c-, was the flagship weapon of \cfDecade Mechanics\c-, back when it was still active. It is described as being powered by \"sentient lightning\", although it does not show any signs of being truly electric in nature.\n\nBlueprints were found for all models from the S-1 to S-6 (the latter being in early prototyping stages, and not yet functional), but it proved impossible to truly recreate them. Fortunately, over 30,000 ready-made S-5 units were stockpiled deeply inside the ruined facility in \cfSunkaeze\c-, all ready for use. Currently, \cfTach-Engine Technologies\c- and its associated partners manage the distribution of these units, and are also studying the weapons in detail for potential redesigns and enhancements.\n\nOne notable detail about the Biospark Carbine is how its \"sentient\" energy drives shot projectiles to seek nearby targets, somehow telling apart friend from foe, relative to the weapon's user. Arcs of lightning have a tendency to spread out from them, dealing additional damage.\n\n\cfPrimary Fire:\c- Small blobs of stabilised energy with slight target-seeking abilities. Leave a trail of arcs that gravitate towards them as they move, then spread out on impact, homing on hostile targets.\n\n\cfSecondary Fire:\c- Concentrated, penetrating beam shot. Also has some slight seeking.\n\n\cfTertiary Fire:\c- If the loaded charge is at least at 50%, the containment capsule inside will be ejected through the main barrel and detonated as a massive sphere of pure energy that tracks down nearby targets. The weapon must be reloaded afterwards.\n\n\cfReload:\c- Reloads, obviously.\n\n\cfTechniques:\c- If the secondary beam comes in contact with an energy blob it will be detonated with increased damage and range. This requires precise timing and aim to be truly effective.\n\n\cxSaya's Notes:\c-\n\cfFunny how these rusty-ass things somehow still work. And holy fuck do they work well, too...\c-\n\n\cfI'm also surprised that that nickname caught on. Most people nowadays probably won't even get the reference at all.\c-"; +SWWM_LORETXT_SPARKSTER = "\cxDesignation:\c-\n\cf Model S-5 Biospark Carbine\c-\n\cxManufacturer:\c-\n\cf Decade Mechanics\c-\n\cxClassification:\c-\n\cf Ancient Alien Energy Weapon\c-\n\nThe \cfBiospark Carbine\c-, also known by its nickname of \cf\"Sparkster\"\c-, was the flagship weapon of \cfDecade Mechanics\c-, back when it was still active. It is described as being powered by \"sentient lightning\", although it does not show any signs of being truly electric in nature.\n\nBlueprints were found for all models from the S-1 to S-6 (the latter being in early prototyping stages, and not yet functional), but it proved impossible to truly recreate them. Fortunately, over 30,000 ready-made S-5 units were stockpiled deeply inside the ruined facility in \cfSunkaeze\c-, all ready for use. Currently, \cfTach-Engine Technologies\c- and its associated partners manage the distribution of these units, and are also studying the weapons in detail for potential redesigns and enhancements.\n\nOne notable detail about the Biospark Carbine is how its \"sentient\" energy drives shot projectiles to seek nearby targets, somehow telling apart friend from foe, relative to the weapon's user. Arcs of lightning have a tendency to spread out from them, dealing additional damage.\n\n\cfPrimary Fire:\c- Small blobs of stabilised energy with slight target-seeking abilities. Leave a trail of arcs that gravitate towards them as they move, then spread out on impact, homing on hostile targets.\n\n\cfSecondary Fire:\c- Concentrated, penetrating beam shot. Also has some slight seeking.\n\n\cfTertiary Fire:\c- If the loaded charge is at least at 50%, the containment capsule inside will be ejected through the main barrel and detonated as a massive sphere of pure energy that tracks down nearby targets. The weapon must be reloaded afterwards.\n\n\cfReload:\c- Reloads, obviously. Do note that the loaded charge has to be depleted completely before it can be removed.\n\n\cfTechniques:\c- If the secondary beam comes in contact with an energy blob it will be detonated with increased damage and range. This requires precise timing and aim to be truly effective.\n\n\cxSaya's Notes:\c-\n\cfFunny how these rusty-ass things somehow still work. And holy fuck do they work well, too...\c-\n\n\cfI'm also surprised that that nickname caught on. Most people nowadays probably won't even get the reference at all.\c-"; SWWM_LORETAG_KNOWLEDGEBASE = "Library"; SWWM_LORETAB_KNOWLEDGEBASE = "Item"; SWWM_LOREREL_KNOWLEDGEBASE = "Demolitionist;AkariLabs;Taro;Saya"; @@ -102,7 +102,7 @@ SWWM_LORETXT_YNYKRON2 = "\cxDesignation:\c-\n\cf Ynykron Artifact\c-\n\cxManufac 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. 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_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). XSB rounds can penetrate several targets before eventually stopping, depending on their size, they may also do the same for thin walls.\n\nThe secondary ammunition is the 1.150 \cfFCB (Fat Chode Bomb)\c-. Personally named by the CEO of Blackmann Arms himself, FCBs are quite similar to the standard XSB ammunition, but instead the bullets are full of additional Explodium, which on impact, is released violently, propagating its deadly blast through solid surfaces. Due to the volatility of these bullets, the propellant employed is slightly less potent, which results in a diminished potential for target penetration, but the blast definitely compensates for this. The explosive charge is so powerful that it can break some walls to pieces.\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. A second press after firing will chamber another round.\n\n\cfSecondary Fire:\c- Switches next reload between XSB and FCB ammunition, if available.\n\n\cfReloading:\c- Reloads the weapon. Each magazine holds 5 rounds. An extra round can also be kept chambered.\n\n\cfZoom:\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\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"; @@ -158,7 +158,7 @@ SWWM_LORETXT_MUNCH = "\cxName:\c-\n\cf Munch Innovations\c-\n\cxClassification:\ SWWM_LORETAG_HAMMERSPACEEMBIGGENER = "Hs. Embiggener"; SWWM_LORETAB_HAMMERSPACEEMBIGGENER = "Item"; SWWM_LOREREL_HAMMERSPACEEMBIGGENER = "Cyrus;Hammerspace;Saya"; -SWWM_LORETXT_HAMMERSPACEEMBIGGENER = "\cxDesignation:\c-\n\cf Hammerspace™ Embiggener\c-\n\cxManufacturer:\c-\n\cf Cyrus Enterprises\c-\n\cxClassification:\c-\n\cf Storage Expansion Contract\c-\n\nWhen \cfHammerspace™\c- containers first started being commercialized, \cfCyrus Enterprises\c- hadn't yet decided on how to handle the needs of those who might not be quite satisfied with the standard storage capacity provided to each customer. Then, one day, a \"revolutionary\" idea came forth, that of an extra \"expansion\" service, where existing customers could pay extra to gain access to additional containers, increasing their total storage. Each of these \cfHammerspace™ Embiggener\c- cards is completely unique, and only available for purchase from Cyrus Enterprises themselves. Customers can expand their storage limit up to eight times with these, which should be enough even for the needs of large armies seeking to store their weapons and ammo efficiently.\n\n\cxSaya's Notes:\c-\n\cfThe hell, is that a reference to what I think it is? This guy is an even bigger nerd than I thought... also that's not a real word, is it? ... Wait, it is? huh, so it really got accepted... ok then.\c-\n\n\cfOh yeah by the way, nerdboi says only your ammo container can be expanded with this, he was going on about something of \"backpacks\" and shit, I walked away before he began ranting for real. When he does that it's like someone scraping a chalkboard right in front of you, ugh...\c-"; +SWWM_LORETXT_HAMMERSPACEEMBIGGENER = "\cxDesignation:\c-\n\cf Hammerspace™ Embiggener\c-\n\cxManufacturer:\c-\n\cf Cyrus Enterprises\c-\n\cxClassification:\c-\n\cf Storage Expansion Contract\c-\n\nWhen \cfHammerspace™\c- containers first started being commercialized, \cfCyrus Enterprises\c- hadn't yet decided on how to handle the needs of those who might not be quite satisfied with the standard storage capacity provided to each customer. Then, one day, a \"revolutionary\" idea came forth, that of an extra \"expansion\" service, where existing customers could pay extra to gain access to additional containers, increasing their total storage. Each of these \cfHammerspace™ Embiggener\c- cards is completely unique, and only available for purchase from Cyrus Enterprises themselves. Customers can expand their storage limit up to sixteen times with these, which should be enough even for the needs of large armies seeking to store their weapons and ammo efficiently.\n\n\cxSaya's Notes:\c-\n\cfThe hell, is that a reference to what I think it is? This guy is an even bigger nerd than I thought... also that's not a real word, is it? ... Wait, it is? huh, so it really got accepted... ok then.\c-\n\n\cfOh yeah by the way, nerdboi says only your ammo container can be expanded with this, he was going on about something of \"backpacks\" and shit, I walked away before he began ranting for real. When he does that it's like someone scraping a chalkboard right in front of you, ugh...\c-"; SWWM_LORETAG_BLASTSUIT = "Blast Suit"; SWWM_LORETAB_BLASTSUIT = "Item"; SWWM_LOREREL_BLASTSUIT = "Symnatek;Cyrus"; diff --git a/language.es_base b/language.es_base index 70f7451b0..5ae6ed1e0 100644 --- a/language.es_base +++ b/language.es_base @@ -46,7 +46,11 @@ T_HELLBURNINATORMAG = "Cargador de Ruinadores Hellblazer"; T_HELLNUKEMAG = "Cargador de Cabezas Nucleares Hellblazer"; T_SPARKUNIT = "Unidad Biospark"; T_XSBMAG = "Cargador 1.150 XSB"; +T_FCBMAG = "Cargador 1.150 FCB"; +T_XSBBULLET = "Bala 1.150 XSB"; +T_FCBBULLET = "Bala 1.150 FCB"; T_CANDYMAG = "Cargador de Pistola Caramelo"; +T_CANDYBULLET = "Bala de Pistola Caramelo"; T_CANDYSPARE = "Repuesto de Pistola Caramelo"; T_YNYKRONAMMO = "Contenedor de Cristal"; T_BLASTSUIT = "Chaleco Antiexplosivos"; @@ -575,6 +579,7 @@ O_EVISCERATOR = "%o fue descuartizad@[ao_esp] por %k."; O_HELLBLAZER = "%k reventó a %o en cachitos humeantes."; O_SPARKSTER = "%o fue bien chispead@[ao_esp] por %k."; O_SILVERBULLET = "%o no pudo ignorar el grosor de las balas de %k."; +O_SILVERBULLET2 = "%o fue reventad@[ao_esp] por las gruesas balas de %k."; O_CANDYGUN = "%k hizo probar a %o un sabor dulce (de muerte)."; O_YNYKRON = "%o fue borrad@[ao_esp] instantáneamente por %k."; O_YNYKRONALT = "%o fue espaguetificad@[ao_esp] por %k."; diff --git a/language.es_lore b/language.es_lore index 7255e0602..3a6c2a279 100644 --- a/language.es_lore +++ b/language.es_lore @@ -107,7 +107,7 @@ SWWM_LORETXT_ANARUKON = "\cxNombre:\c-\n\cf Anarukon (\"Imperecedero\")\c-\n\cxC SWWM_LORETXT_ANARUKON2 = "\cxNombre:\c-\n\cf Anarukon (\"Imperecedero\")\c-\n\cxClasificación:\c-\n\cf Especie alienígena\c-\n\cxLocalización:\c-\n\cf Novoskhana\c-\n\cf Kurukurunishe\c-\n\cf Akkou\c-\n\cf + Otros varios (incluyendo la Tierra)\c-\n\nLos \cfAnarukon\c- son una raza de seres inmortales nativos de un mundo paralelo conocido como \cfNovoskhana\c-, fuera de los límites de nuestro propio Universo. Segun sus registros históricos, este mundo fue creado por una deidad conocida como \cfNoskas Kurenai\c- (\"Gran Padre de la Eternidad\" en su lengua), hace más de 50.000 años. Novoskhana es también el hogar del mayor imperio documentado, el \cfImperio Eterno e Inmortal de Novoskhana\c-, con una población estimada de 13 mil millones, relativamente poco denso considerando su tamaño físico, ya que cubre la mayor parte del terreno habitable de este mundo.\n\nSin embargo, solo una pequeña parte de la población Anarukon total vive en Novoskhana. Tras un descontento general por las controvertidas políticas y posición del imperio en cuanto a derechos civiles básicos, varios grupos se han separado de él, uno de los mayores entre ellos siendo el \cfReino Kurenai\c-, inicialmente liderado por la propia deidad misma de los Anarukon, quien, según se cuenta en muchas historias, decidió sacrificar su divinidad para salvar a su gente de la tiranía de la \cfEmperatriz Eterna\c-.\n\nLos Anarukon son conocidos como guerreros fieros e imparables, dada su rápida habilidad regenerativa e inmortalidad total, capaces incluso de recomponerse tras ser decapitados. Se dice que cuando un territorio cae en el punto de mira del Imperio para ser conquistado, la elección más sabia es rendirse immediatamente, ya que luchar contra ellos solo resultará en la más dolorosa de las muertes, en una batalla completamente unilateral.\n\nMucha gente de esta especie puede ser encontrada en la Tierra, un hecho ocultado a conciencia hasta el primer contacto con otras especies tras el \cfEvento Luna\c- de 2021. Es más, otra información llegó a ver la luz, sobre la intervención entre el Reino Kurenai y \cfImanaki Corp\c-, siendo los ejércitos del reino los responsables de la destrucción de sus oficinas centrales en \cfKereshnovka\c- en 2009, el así llamado \cfIncidente Hellbound\c- que atrayeron semanas después del final de la \cfCaza de Ghouls\c- de 2007. Se dice que desde ese incidente, el reino había declarado a la humanidad como su enemigo, pero no hubo intentos de tomar represalias más allá del incidente especificado. Esta fría hostilidad duró hasta 2171, con la boda de \cfSaya Miyamoto\c- y \cfKirin Xanai\c-, líder de su principal aliado, el \cfImperio Sykhai de Akkou\c-, y habiendo ella entablado amistad con la \cfReina Andreki Anderken\c-, actual líder del Reino Kurenai.\n\nEntre los varios miembros de esta especie en la Tierra, un nombre que muchos reconocerán es el de \cfAshley Knox\c-, cantante y guitarrista de \cfThe Black Rat's Coven\c-. La revelación de no ser humana fue recibida con mucha sorpresa, aunque no fue tan espectacular como el hecho de que otros dos miembros de la banda eran literalmente dioses.\n\n\cxNotas de Saya:\c-\n\cf¿Sabes que? Tengo que decirlo, REALMENTE tengo que decirlo.\c-\n\n\cg♥\c- \ca¡TE AMO KIRIN-KUN!\c- \cg♥\c-\n\n\cfJejeje... en serio. Aun no me puedo creer que todo eso haya pasado. Esperé y esperé a poder tener mi propia monada Anarukon, como Taro nii-san tuvo a Ellen y Yu-chan a Ashley, y ¡bam! Ahí estaba. Y por supuesto tengo que dar gracias a Ashley-san por la mayor puta bendición, sí. Es que, nada más comentarle lo del Proyecto Akari me salta con lo de \"Sé un lugar que puedes visitar\", y eso... así es como conocí a mi amorcito. Ya te lo he contado todo, pero coño, es que tengo que escribirlo aquí también, como recodatorio. ¿No es monísimo? Recuerdo como de supertímidas estabais tú y Maidbot cuando lo conocisteis. Fue tan adorable, la cosa mas dulce, más incluso que los \"panes de leche\" esos que tenían en el banquete (cosa fina por cierto). Y ahora, las cuatro estamos casadas con él, y a vivir la buena vida.\c-\n\n\cfOh ya, y conocer a la tía esa, Andreki, joder la vergüenza que pasé, la mayor de toda mi puta vida, puto en serio. Es que, imagina, me dicen que espere por ahí a alguien que quiere tener una charla conmigo en privado, y... este... puto retaco engreído se me acerca, una niña enana, con aires de superimportancia y tal, soltándome cosas tipo \"soy alguien muy importante\" y \"deberías saber quien soy, Lady Saya\" y voy yo con \"lo siento, niña, estoy esperando por alguien, no puedo jugar contigo\", y ahi va y EXPLOTA de repente, soltandome que si \"COMO TE ATREVES\" y \"SOY MUCHO MAYOR QUE TÚ\" y mierdas, y ya... me pongo en modo \"mil perdones\" total, tirándome en el suelo y todo. Kirin tuvo que venir corriendo a dar explicaciones e intentar calmarla porque es que... no podía hacer nada. Joder, es que... Al menos luego pudimos ser amigas, pero... justo en ese momento es que ya veía como me había convertido en el enemigo mortal de todo un puto reino.\c-"; SWWM_LORETXT_YUI = "\cxNombre Completo:\c-\n\cf Yui Miyamoto\c-\n\cxNacionalidad:\c-\n\cf Japonesa\c-\n\cxFecha de Nacimiento:\c-\n\cf 2009-07-02\c-\n\cxTwitter:\c-\n\cf @yuchan09\c-\n\nNacida en 2009, hija de \cfNana\c- y \cfRyuji Miyamoto\c-, \cfYui\c- es la más joven de tres hermanos. Es una persona muy sociable y empática, totalmente diferente a sus más reclusivos y antisociales hermanos \cfSaya\c- y \cfTaro\c-, habiendo mostrado siempre un claro interés por ayudar a la gente. Desde pequeña, su deseo era el de ser doctora, \"para salvar vidas\". Este deseo llegó a cumplirse tras perseverar en sus estudios y pasar varios años \"ascendiendo en rango\". A fecha de escribirse este artículo, Yui trabaja actualmente como neurocirujana en el \cfHospital Central de Kasukabe\c-, y ha recibido varios premios por sus logros excepcionales.\n\nA un lado más personal, Yui tiene una gran variedad de intereses, los cuales algunos han notado ser bastante curiosos en cuanto a su contraste. Por ejemplo, se conoce que es una gran fan de la lucha libre, pero lo es tanto como por el ajedrez. También disfruta de varios tipos de música que normalmente se considerarían \"conflictivos\" entre ellos. Ciertamente, Yui Miyamoto es una mujer de contrastes. \cf[nota de ed.: gracias, acabo de escupir por todo el teclado]\c-\n\nDesde hace mucho tiempo, Yui ha sido fan de una cierta banda Británica, \cfThe Black Rat's Coven\c-. Disfrutaba muchísimo con su música, y estaba completamente enamorada de su cantante principal, \cfAshley Knox\c-. Solía imaginarse saliendo con ella, muy a pesar de las burlas de sus amigas, y realmente, en serio deseaba que un día apareciera en su puerta, y le pidiera ser su novia.\n\nTodo esto definitivamente nunca ocurriría, y lo sabía, pero un día, la banda visitó Japón durante uno de sus tours, y pudo verlos en vivo. Yui y su hermana, quien era fan también, se apresuraron a comprar entradas para el concierto y llegaron allí lo más rápido que pudieron. La experiencia fue impresionante, estando tan cerca de ellos. Yui juró que a veces, Ashley la miró y le sonrió, pero lo dejó pasar como que probablemente fuese su imaginación o algo.\n\nTras el concierto, se puso en fila emocionada por tener un autógrafo, y fue entonces que lo imposible se hizo posible. Una vez delante de la \cfEstilosa Bruja del Oeste\c-, Yui se lo pidió, nerviosa, pero lo que recibió en su lugar fueron unas palabras que la dejaron paralizada: \"Eres una chavala monísima. ¿Quieres salir conmigo?\". Basta decir, que actualmente las dos están felizmente casadas.\n\n\cxNotas de Saya:\c-\n\cfghfjksdhfsjkghsdkfjsfgj estaba tán contenta por ella pero tambien CELOSA, SÍ, CELOSÍSIMA. Dios cuando pasó pensé que se iba a desplomar, con la novia gótica tetuda preguntándole eso de repente, madre de dios...\c-\n\n\cfPues aparentemente, Yu-chan resultó ser JUSTO su tipo, vaya una coincidencia, ¿eh? Puto hechas la una para la otra, justo ahí. Sinceramente, esto apesta tanto a cliché de romance a primera vista, buf... Apuesto a que cuesta mucho creer una historia así. Ashley-san hasta bromeaba diciendo que el \"amor a primera vista\" es algo normal en su familia. Pffff...\c-\n\n\cfJoder la envídia que teía... con su novia gótica tetuda todo mazizorra... Bueno, la tenía, hasta que llegó Ibuki, jejejeje...\c-"; SWWM_LORETAG_SPARKSTER = "Carabina Biospark"; -SWWM_LORETXT_SPARKSTER = "\cxDesignación:\c-\n\cf Carabina Biospark Modelo S-5\c-\n\cxFabricante:\c-\n\cf Decade Mechanics\c-\n\cxClasificación:\c-\n\cf Arma de Energía Alienígena Antigua\c-\n\nLa \cfCarabina Biospark\c-, conocida tambien por el apodo de \cfSparkster\c-, fue el arma insignia de \cfDecade Mechanics\c-, cuando aun estaban en activo. Se describe como que está potenciada por \"rayos conscientes\", aunque no muestra ningún signo de que realmente use electricidad.\n\nSe encontraron planos para todos los modelos desde el S-1 al S-6 (el último encontrándose ya en fase prototipo, pero no siendo todavía funcional), pero probó ser imposible recrearlos realmente. Por suerte, mas de 30.000 unidades S-5 listas para el uso se encontraron almacenadas en las profundidades de las ruinas en \cfSunkaeze\c-. Actualmente, \cfTecnologías Tach-Engine\c- y sus socios manejan la distribución de estas unidades, y también estudian las armas en detale para posibles rediseños y mejoras.\n\nUn detalle notable sobre la Carabina Biospark es como su energía \"consciente\" lleva a que los proyectiles busquen objetivos cercanos, de alguna forma diferenciando entre amigo y enemigo, de forma relativa al usuario del arma. Tambien tienden a saltar arcos eléctricos de los proyectiles, los cuales se dispersan causando un daño extra.\n\n\cfFuego Primario:\c- Pequeñas bolas de energía estable con ligeras habilidades de atracción hacia objetivos. Dejan un rastro de arcos eléctricos que gravitan alrededor de ellas mientras se mueven, y luego se dispersan al impactar, atraídos hacia objetivos hostiles.\n\n\cfFuego Secundario:\c- Un rayo penetrante concentrado. También tiene una ligera atracción hacia objetivos.\n\n\cfFuego Terciario:\c- Si la carga actual es de al menos un 50%, la cápsula de contención será expulsada por el cañón principal y detonará liberando una esfera masiva de energía pura que busca objetivos cercanos. El arma debe ser recargada después.\n\n\cfRecarga:\c- Recarga, obviamente.\n\n\cfTécnicas:\c- Si el rayo secundario entra en contacto con una bola de energía hará que detone con un daño y rango mayores. Esto requiere una puntería y tiempo precisos para ser realmente efectivo.\n\n\cxNotas de Saya:\c-\n\cfCurioso como la chatarra oxidada esta aun funciona. Y joder si funciona bien, también...\c-\n\n\cfTambién me sorprende que aun se use el apodo ese. La mayoría de la gente ahora probablemente no va a pillar la referencia, para nada.\c-"; +SWWM_LORETXT_SPARKSTER = "\cxDesignación:\c-\n\cf Carabina Biospark Modelo S-5\c-\n\cxFabricante:\c-\n\cf Decade Mechanics\c-\n\cxClasificación:\c-\n\cf Arma de Energía Alienígena Antigua\c-\n\nLa \cfCarabina Biospark\c-, conocida tambien por el apodo de \cfSparkster\c-, fue el arma insignia de \cfDecade Mechanics\c-, cuando aun estaban en activo. Se describe como que está potenciada por \"rayos conscientes\", aunque no muestra ningún signo de que realmente use electricidad.\n\nSe encontraron planos para todos los modelos desde el S-1 al S-6 (el último encontrándose ya en fase prototipo, pero no siendo todavía funcional), pero probó ser imposible recrearlos realmente. Por suerte, mas de 30.000 unidades S-5 listas para el uso se encontraron almacenadas en las profundidades de las ruinas en \cfSunkaeze\c-. Actualmente, \cfTecnologías Tach-Engine\c- y sus socios manejan la distribución de estas unidades, y también estudian las armas en detale para posibles rediseños y mejoras.\n\nUn detalle notable sobre la Carabina Biospark es como su energía \"consciente\" lleva a que los proyectiles busquen objetivos cercanos, de alguna forma diferenciando entre amigo y enemigo, de forma relativa al usuario del arma. Tambien tienden a saltar arcos eléctricos de los proyectiles, los cuales se dispersan causando un daño extra.\n\n\cfFuego Primario:\c- Pequeñas bolas de energía estable con ligeras habilidades de atracción hacia objetivos. Dejan un rastro de arcos eléctricos que gravitan alrededor de ellas mientras se mueven, y luego se dispersan al impactar, atraídos hacia objetivos hostiles.\n\n\cfFuego Secundario:\c- Un rayo penetrante concentrado. También tiene una ligera atracción hacia objetivos.\n\n\cfFuego Terciario:\c- Si la carga actual es de al menos un 50%, la cápsula de contención será expulsada por el cañón principal y detonará liberando una esfera masiva de energía pura que busca objetivos cercanos. El arma debe ser recargada después.\n\n\cfRecarga:\c- Recarga, obviamente. Ten encuenta que la carga actual debe estar completamente vacía antes de poder ser extraída.\n\n\cfTécnicas:\c- Si el rayo secundario entra en contacto con una bola de energía hará que detone con un daño y rango mayores. Esto requiere una puntería y tiempo precisos para ser realmente efectivo.\n\n\cxNotas de Saya:\c-\n\cfCurioso como la chatarra oxidada esta aun funciona. Y joder si funciona bien, también...\c-\n\n\cfTambién me sorprende que aun se use el apodo ese. La mayoría de la gente ahora probablemente no va a pillar la referencia, para nada.\c-"; SWWM_LORETAG_BLASTSUIT = "Chaleco Antiexpl."; SWWM_LORETXT_BLASTSUIT = "\cxDesignación:\c-\n\cf Chaleco Antiexplosivos\c-\n\cxFabricante:\c-\n\cf Suministros Militares Itamex (subsidiaria de Symnatek)\c-\n\cxClasificación:\c-\n\cf Armadura\c-\n\nUn simple chaleco fácil de llevar, diseñado para proteger contra explosivos. Su cuerpo principal está compuesto de nanotejidos muy elásticos, que deberían proveer de protección adicional contra armas ligeras. El blindaje pesado al frente está hecho de una aleación propietaria con una alta absorción de impacto, capaz de absorber la mayor parte de la fuerza bruta de cualquier explosión cercana a quien lo lleve. El fabricante anuncia que \"puede incluso bloquear RPGs\", aunque esto nunca se ha puesto a prueba.\n\n\cxDatos de análisis:\c-\nEsta pieza de armadura parece ser capaz de reducir la mayoría del daño entrante en un factor del 30%, y también reducir completamente a la mitad todo impacto explosivo recibido por el usuario. Puede absorber hasta 150 \"unidades de daño\" antes de ser inutilizada. Es más, puede llevarse por debajo de otros tipos de armadura, permitiendo una protección combinada.\n\n\cxNotas de Saya:\c-\n\cfNo me preguntes, en serio que no sé a que viene todo esto de \"unidades de daño\". Pedimos al friki ese de Cyrus Enterprises que hiciera las pruebas por nosotros. Es que en serio, siempre hace lo mismo, con eso de que todo es como un puto videojuego para él, igual que insiste en hacer toda la mierda esa de desperdigar todo tu equipamiento a propósito para que lo recojas. PERO no puedo hacer nada. Es quien paga todo esto... Sí, ¿todo ese pastizal que vas acumulando? Es él, lo llama tu \"puntuación\". En serio... puto friki...\c-"; SWWM_LORETXT_PARTHORIS = "\cxNombre:\c-\n\cf Parthoris\c-\n\cxClasificación:\c-\n\cf Mundo alternativo\c-\n\n\cfParthoris\c- es uno de los varios mundos extra-universales que fueron descubiertos en las fases iniciales de los experimentos con interportales de \cfAkari Labs\c-, como parte del \cfProyecto Akari\c-. En su centro se encuentra una tierra dividida en siete naciones, en una fase de desarrollo que uno describiría como \"medieval\", aunque hay una clara presencia de fuerzas mágicas. Sin embargo, se ha reportado la presencia de de tecnología curiosamente avanzada, en una zona lejana, identificada como la guarida de una especie de poderoso lich.\n\nCuando este mundo fue localizado inicialmente, hubo signos claros de haber pasado por algun tipo de gran batalla. Las siete naciones estaban bajo el control de un individuo llamado \cfD'Sparil\c-, quien había tomado el mando por la fuerza con sus ejércitos. La causa exacta de esto se desconoce, pero al momento de escribirse este artículo, el \cfDemolicionista\c- ha sido enviado para investigar, y eliminar cualquier amenaza en el proceso.\n\n\cxNotas de Saya:\c-\n\cfHay un monte de cosas intresnates por ahí y voy a estar muy pendiente del directo. Esta es la primerísima vez que hacemos una exploración de todo, sabes, así que quiero ver TODO lo que pueda haber aquí.\c-\n\n\cfNo sé si te vas a acercar al sitio ese, la tal \"Guarida de Malumax\". Mira que tengo curiosidad por eso, el hecho de que haya un tío con acceso a cosas modernas en esta maravillante tierra de fantasía medieval.\c-"; @@ -139,9 +139,9 @@ SWWM_LORETXT_GRAVITYSUPPRESSOR = "\cxDesignación:\c-\n\cf Supresor de Gravedad\ SWWM_LORETXT_WALLBUSTER = "\cxDesignación:\c-\n\cf Excopeta de Brecha de Armaduras Pesadas \"Wallbuster\"\c-\n\cxFabricante:\c-\n\cf Blackmann Arms S.L.\c-\n\cf Diseño de Don BIG SHOT\c-\n\cxClasificación:\c-\n\cf Escopeta Revólver\c-\n\nLa \cfWallbuster\c- es una escopeta bestial, teniendo un total de 25 cañones divididos en grupos rotatorios individuales de 5. Usa el calibre 10, haciéndola aun más ridícula en cuanto a su poder y tamaño. Algo que no sorprende teniendo en cuenta que fue encargada por el mismo \cfDon BIG SHOT\c-. De todas las armas que \cfBlackman Arms\c- ha hecho para él, ésta es la única que fue hecha pública, y se dice que las demás puede que sean incluso más absurdas.\n\nLos mecanismos internos que empujan el funcionamiento de este arma tienen tal grado de complejidad que han sido descritos por algunos como \cfIngeniería Loca Alemana\c-. Solamente el propio \cfHermann E. Ischer\c- conoce todos los detalles de su operación. Con cada accionamiento del gatillo principal, el cañón superior es disparado, y luego su grupo gira a contrarreloj, con el siguienta cartucho listo para dispararse. Cada cinco disparos, o cuando se usa el gatillo secundario, el cuerpo principal gira después, alternando a otro grupo de cinco cañones.\n\nLa Wallbuster es compatible con la mayor parte de municiones estándar, aunque hay restricciones de seguridad para algunas, como las de tipo incendiario, o los cartuchos dorados. Esto limita el rango de munición usable a sólo estos cuatro tipos: Perdigones, Slugs, Sal de Kinylum, Bolas de Plomo.\n\n\cfFuego Primario:\c- Dispara el cañón superior.\n\n\cfFuego Secundario:\c- Dispara el grupo de cinco cañones superior.\n\n\cfFuego Terciario:\c- Dispara todos los cañones, si realmente quieres.\n\n\cfRecarga:\c- Una vez se tira de la palanca lateral, los grupos de cañones pueden ser retirados y recargados individualmente. Para recargar por el camino, se recomienda tener un \cfCinturón Magnético Útil\c- o similar, ya que facilitará esta operación. Hay recargadores rápidos disponibles para comprar desde la página web de Blackmann Arms, o de distribuidores autorizados.\n\n\cfTécnicas:\c- Tal y como su nombre indica, puedes destruir toda clase de obstáculos por el camino, siempre y cuando causes suficiente daño relativo a su tamaño. Esto incluye hasta puertas bloqueadas, por lo que nunca más necesitarás buscar llaves.\n\n\cxNotas de Saya:\c-\n\cfOK a ver, la puta masa de metal rompecojones esta. Sí, esto sí que es la puta repera...\c-\n\n\cfNo te preocupes por tardar un huevo en recargarla, por cierto. DemolitionOS viene con una rutina de recarga rápida que te lo pondrá más fácil. La munición se pone ahí en cola desde el Hammerspace, y luego todo lo que tienes que hacer es poner la mano encima de los cañones, y ya se mete todo ahí. Mola, ¿verdad? Taro hizo la mayor parte del chollo, así que eso, le puedes dar las gracias.\c-\n\n\cfOh ya... sabes... la cosa esta, con el nombre y todo, casi que me recuerda a la abuela un poco. A ver, si cambias la primera letra... Oh, ¿puedes oír la batería y la guitarra? Porque yo sí...\c-\n\n\cfOld Days~ ♪\c-"; SWWM_LORETXT_TARO = "\cxNombre Completo:\c-\n\cf Taro Miyamoto\c-\n\cxNacionalidad:\c-\n\cf Japonés\c-\n\cxFecha de Nacimiento:\c-\n\cf 1985-10-06\c-\n\cxTwitter:\c-\n\cf @AkariTaro\c-\n\nNacido en 1985, hijo de \cfNana\c- y \cfRyuji Miyamoto\c-, \cfTaro\c- es el mayor de tres hermanos, a pesar de lo que muestre su apariencia. De niño, fue algo conflictivo, pero notablemente estudioso también. Habiendo terminado el instituto con notas excelentes, estudió en muchas universidades prestigiosas de todo el mundo, impulsado por el deseo de expandir sus conocimientos, especialmente aquellos de la tecnología informática, con la cual estaba obsesionado. Junto con \cfSaya\c-, su hermana menor, fundaron \cfAkari Labs\c-, una compañía que se especializa en Robótica e Inteligencia Artificial, entre otros. Ahí, las especialidades de Taro son la Ingeniería y el Diseño de Software, y también está a carbo de las relaciones públicas, ya que Saya no \"tiene mucho don de gentes\" a diferencia de él.\n\nTaro es un programador nato, competente en múltiples lenguajes, y tiene una gran cantidad de proyectos a su nombre, junto con muchas contribuciones a proyectos notables de código abierto, incluyendo el \cfKernel de Linux\c-. También es un autoproclamado \"archivista cultural\", declarando que es básicamente una biblioteca andante en lo que respecta a aspectos de la cultura popular que para muchos se han perdido en el tiempo, gracias a la inmortalidad heredada de su madre, y su gran memoria. También es bastante popular en la red por sus reviews cómicas de anime, bajo la personalidad de \cf\"El Mago de Waifus\"\c-.\n\nEn 2091, Taro fue elegido para recuperar personalmente al \cfOni Rojo\c-, \cfIbuki Miyamoto\c-, tras los eventos de la \cfCicatriz Blanca\c-. Siguiendo la señal de rastreo de su collar, la encontró fácilmente, y cuando estaba a punto de traerla de vuelta a Japón una chica se le acercó. Era \cfElena Yanikov XXI\c-, quien había entablado amistad con Ibuki mientras vagaba por el yermo ardiente. Pidió a Taro que la llevara con él, prometiendo ser \"una chica buena\". Estas palabras inmediatamente hicieron que aceptara su proposición.\n\nNo mucho después de eso, ambos comenzaron a salir, casándose finalmente en 2097.\n\n\cxNotas de Saya:\c-\n\cf¿COMO PUTO COJONES pudo el absoluto perdedor de mi hermano echarse novia? Es que no lo entiendo. Dios, viendo el artículo después de que lo editara, hay tanta mierda ahí que se nota que es él fardando, patético...\c-\n\n\cfSí, es esa clase de tío. Se hace el chulo pero en cuanto miras más allá de sus \"impresionantes habilidades y logros\", no es más que un capullo en internet. A ver, admito que yo también lo soy, un poco, pero él es peor. La culpa es de que pase tanto tiempo en foros de mierda.\c-\n\n\cfAunque a ver, a veces se pone serio cuando quiere. Y en momentos así es que es básicamente el Tsukkomi de mi Boke. Si no sabes lo que significa todo eso puedes buscarlo, Demo-chan.\c-"; 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_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 dieciseis 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. 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_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). Las balas XSB pueden penetrar varios objetivos antes de detenerse, dependiendo de su tamaño, pueden incluso hacer lo mismo con paredes ligeras.\n\nLa munición secundaria son las balas \cfFCB (Fat Chode Bomb)\c- también de calibre 1.150. Llamadas así por el propio CEO de Blackmann Arms, las FCB son bastante similares a la munición XSB estándar, con la diferencia de que estas balas están llenas de Explodium, el cual, al impactar, es liberado violentamente, propagando su estallido mortífero a través de superficies sólidas. Dada la volatilidad de estas balas, el propulsor empleado es ligeramente menos potente, lo cual resulta en un disminuído potencial de penetración de objetivos, pero la explosión definitivamente lo compensa. La carga explosiva es tan potente que puede derribar completamente algunas paredes.\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. Un segundo pulsado tras disparar cargará otra bala.\n\n\cfFuego Secundario:\c- Alterna entre balas XSB y FCB para la siguiente recarga, si están disponibles.\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\cfZoom:\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\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 f1a724676..4a427d69b 100644 --- a/language.version +++ b/language.version @@ -1,2 +1,2 @@ [default] -SWWM_MODVER="\chSWWM \cwGZ\c- r454 (Wed 5 Aug 12:38:18 CEST 2020)"; +SWWM_MODVER="\chSWWM \cwGZ\c- r455 (Thu 6 Aug 20:21:32 CEST 2020)"; diff --git a/lore/default/hammerspaceembiggener.txt b/lore/default/hammerspaceembiggener.txt index c7d443cc2..7ce9fa7df 100644 --- a/lore/default/hammerspaceembiggener.txt +++ b/lore/default/hammerspaceembiggener.txt @@ -12,7 +12,7 @@ TXT \cxClassification:\c- \cf Storage Expansion Contract\c- -When **Hammerspace™** containers first started being commercialized, **Cyrus Enterprises** hadn't yet decided on how to handle the needs of those who might not be quite satisfied with the standard storage capacity provided to each customer. Then, one day, a "revolutionary" idea came forth, that of an extra "expansion" service, where existing customers could pay extra to gain access to additional containers, increasing their total storage. Each of these **Hammerspace™ Embiggener** cards is completely unique, and only available for purchase from Cyrus Enterprises themselves. Customers can expand their storage limit up to eight times with these, which should be enough even for the needs of large armies seeking to store their weapons and ammo efficiently. +When **Hammerspace™** containers first started being commercialized, **Cyrus Enterprises** hadn't yet decided on how to handle the needs of those who might not be quite satisfied with the standard storage capacity provided to each customer. Then, one day, a "revolutionary" idea came forth, that of an extra "expansion" service, where existing customers could pay extra to gain access to additional containers, increasing their total storage. Each of these **Hammerspace™ Embiggener** cards is completely unique, and only available for purchase from Cyrus Enterprises themselves. Customers can expand their storage limit up to sixteen times with these, which should be enough even for the needs of large armies seeking to store their weapons and ammo efficiently. \cxSaya's Notes:\c- \cfThe hell, is that a reference to what I think it is? This guy is an even bigger nerd than I thought... also that's not a real word, is it? ... Wait, it is? huh, so it really got accepted... ok then.\c- diff --git a/lore/default/silverbullet.txt b/lore/default/silverbullet.txt index 5db8c7bd7..d5f3bf002 100644 --- a/lore/default/silverbullet.txt +++ b/lore/default/silverbullet.txt @@ -15,16 +15,20 @@ TXT The **Silver Bullet JET** is the 1.150 member of the **Silver Bullet** series of ultra-high caliber rifles manufactured by **Blackmann Arms**. It was created as a lighter, more "reasonable" alternative to the 1.350 **Behemoth** model. Weighing 43 kilograms and sporting a total length of 2.4 meters, it is sufficiently compact for non-augmented human use. -The main ammunition designed for this specific model is the 1.150 **XSB (eXplosive Super Burst)**. These beastly rounds are partially based on a NATO standard 30x113mm cartridge, and employ a low density **Explodium** 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). +The main ammunition designed for this specific model is the 1.150 **XSB (eXplosive Super Burst)**. These beastly rounds are partially based on a NATO standard 30x113mm cartridge, and employ a low density **Explodium** 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). XSB rounds can penetrate several targets before eventually stopping, depending on their size, they may also do the same for thin walls. + +The secondary ammunition is the 1.150 **FCB (Fat Chode Bomb)**. Personally named by the CEO of Blackmann Arms himself, FCBs are quite similar to the standard XSB ammunition, but instead the bullets are full of additional Explodium, which on impact, is released violently, propagating its deadly blast through solid surfaces. Due to the volatility of these bullets, the propellant employed is slightly less potent, which results in a diminished potential for target penetration, but the blast definitely compensates for this. The explosive charge is so powerful that it can break some walls to pieces. 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. A second press after firing will chamber another round. +\cfPrimary Fire:\c- Shoot the bullet. Any small targets hit by it are pretty much turned to paste. 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. +\cfSecondary Fire:\c- Switches next reload between XSB and FCB ammunition, if available. \cfReloading:\c- Reloads the weapon. Each magazine holds 5 rounds. An extra round can also be kept chambered. +\cfZoom:\c- Custom-tailored adjustable telescopic sight, up to 16x. Equipped with a soft foam covering to protect the user's face during scoped fire. + \cxSaya's Notes:\c- \cfWhat was that quote again, "there is no kill like overkill"? Yeah, sounds about right for this thing.\c- diff --git a/lore/default/sparkster.txt b/lore/default/sparkster.txt index 302b2c5b4..dfb17a478 100644 --- a/lore/default/sparkster.txt +++ b/lore/default/sparkster.txt @@ -24,7 +24,7 @@ One notable detail about the Biospark Carbine is how its "sentient" energy drive \cfTertiary Fire:\c- If the loaded charge is at least at 50%, the containment capsule inside will be ejected through the main barrel and detonated as a massive sphere of pure energy that tracks down nearby targets. The weapon must be reloaded afterwards. -\cfReload:\c- Reloads, obviously. +\cfReload:\c- Reloads, obviously. Do note that the loaded charge has to be depleted completely before it can be removed. \cfTechniques:\c- If the secondary beam comes in contact with an energy blob it will be detonated with increased damage and range. This requires precise timing and aim to be truly effective. diff --git a/lore/es/hammerspaceembiggener.txt b/lore/es/hammerspaceembiggener.txt index 5f31d42fb..ba94ca524 100644 --- a/lore/es/hammerspaceembiggener.txt +++ b/lore/es/hammerspaceembiggener.txt @@ -8,7 +8,7 @@ TXT \cxClasificación:\c- \cf Contrato de Expansión de Almacenamiento\c- -Cuando los contenedores de **Hammerspace™** fueron inicialmente comercializados, **Cyrus Enterprises** 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 **Ensanchecedor de Hammerspace™** 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. +Cuando los contenedores de **Hammerspace™** fueron inicialmente comercializados, **Cyrus Enterprises** 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 **Ensanchecedor de Hammerspace™** es completamente única, y sólo disponible para su compra desde Cyrus Enterprises. Los clientes pueden expandir su límite de almacenamiento hasta dieciseis veces con éstas, lo cual será suficiente incluso para los requisitos de grandes ejércitos que buscan almacenar eficientemente sus armas y munición. \cxNotas de Saya:\c- \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- diff --git a/lore/es/silverbullet.txt b/lore/es/silverbullet.txt index f104c8ce6..995a9aa63 100644 --- a/lore/es/silverbullet.txt +++ b/lore/es/silverbullet.txt @@ -9,16 +9,20 @@ TXT El **Silver Bullet JET** es el miembro de calibre 1.150 de la serie **Silver Bullet** de rifles de calibre ultra-alto fabricados por **Blackmann Arms**. Fue creado como una alternativa ligera y más "razonable" del modelo **Behemoth** 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. -La munición diseñada principalmente para este modelo son las balas **XSB (eXplosive Super Burst)** 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 **Explódium** 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). +La munición diseñada principalmente para este modelo son las balas **XSB (eXplosive Super Burst)** 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 **Explódium** 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). Las balas XSB pueden penetrar varios objetivos antes de detenerse, dependiendo de su tamaño, pueden incluso hacer lo mismo con paredes ligeras. + +La munición secundaria son las balas **FCB (Fat Chode Bomb)** también de calibre 1.150. Llamadas así por el propio CEO de Blackmann Arms, las FCB son bastante similares a la munición XSB estándar, con la diferencia de que estas balas están llenas de Explodium, el cual, al impactar, es liberado violentamente, propagando su estallido mortífero a través de superficies sólidas. Dada la volatilidad de estas balas, el propulsor empleado es ligeramente menos potente, lo cual resulta en un disminuído potencial de penetración de objetivos, pero la explosión definitivamente lo compensa. La carga explosiva es tan potente que puede derribar completamente algunas paredes. 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. Un segundo pulsado tras disparar cargará otra bala. +\cfFuego Primario:\c- Dispara la bala. Cualquier objetivo alcanzado por ella queda hecho papilla. 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. +\cfFuego Secundario:\c- Alterna entre balas XSB y FCB para la siguiente recarga, si están disponibles. \cfRecarga:\c- Recarga el arma. Cada cargador tiene 5 balas. Se puede mantener también una bala extra en la recámara. +\cfZoom:\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. + \cxNotas de Saya:\c- \cfComo era la frase esa, ¿"no hay kill como un overkill"? Ya, pues queda perfecta para la cosa esta.\c- diff --git a/lore/es/sparkster.txt b/lore/es/sparkster.txt index cd6e99f84..76728f2c9 100644 --- a/lore/es/sparkster.txt +++ b/lore/es/sparkster.txt @@ -20,7 +20,7 @@ Un detalle notable sobre la Carabina Biospark es como su energía "consciente" l \cfFuego Terciario:\c- Si la carga actual es de al menos un 50%, la cápsula de contención será expulsada por el cañón principal y detonará liberando una esfera masiva de energía pura que busca objetivos cercanos. El arma debe ser recargada después. -\cfRecarga:\c- Recarga, obviamente. +\cfRecarga:\c- Recarga, obviamente. Ten encuenta que la carga actual debe estar completamente vacía antes de poder ser extraída. \cfTécnicas:\c- Si el rayo secundario entra en contacto con una bola de energía hará que detone con un daño y rango mayores. Esto requiere una puntería y tiempo precisos para ser realmente efectivo. diff --git a/modeldef.ammo b/modeldef.ammo index bf52f0014..f5b92c816 100644 --- a/modeldef.ammo +++ b/modeldef.ammo @@ -516,6 +516,45 @@ Model "SilverBulletAmmo" FrameIndex XZW1 A 0 0 } +Model "SilverBulletAmmo2" +{ + Path "models" + + Model 0 "SilverbulletMag_d.3d" + Skin 0 "SilverbulletAmmo_FCB.png" + Scale 0.25 0.25 0.25 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "SilverBullets" +{ + Path "models" + + Model 0 "SilverbulletBullet_d.3d" + Skin 0 "SilverbulletBullet.png" + Scale 0.05 0.05 0.05 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} +Model "SilverBullets2" +{ + Path "models" + + Model 0 "SilverbulletBullet_FCB_d.3d" + Skin 0 "SilverbulletBullet_FCB.png" + Scale 0.05 0.05 0.05 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "CandyGunAmmo" { @@ -530,6 +569,20 @@ Model "CandyGunAmmo" FrameIndex XZW1 A 0 0 } +Model "CandyGunBullets" +{ + Path "models" + + Model 0 "ExplodiumBullet_d.3d" + SurfaceSkin 0 0 "BooletCandy.png" + SurfaceSkin 0 1 "CandyCasing_Boolet.png" + Scale 0.02 0.02 0.02 + PitchOffset 30 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} Model "YnykronAmmo" { diff --git a/modeldef.candygun b/modeldef.candygun index a05a668af..0282890c1 100644 --- a/modeldef.candygun +++ b/modeldef.candygun @@ -21,23 +21,14 @@ Model "CandyMag" USEACTORPITCH USEACTORROLL - Skin 0 "CandyGun.png" - FrameIndex XZW1 A 0 0 -} - -Model "CandyMagEmpty" -{ - Path "models" - - Model 0 "ExplodiumMag_d.3d" - Scale 0.03 0.03 0.03 - USEACTORPITCH - USEACTORROLL - Skin 0 "CandyGun_EmptyMag.png" FrameIndex XZW1 A 0 0 + RollOffset 90 + ZOffset 1 + FrameIndex XZW1 B 0 0 + RollOffset -90 + FrameIndex XZW1 C 0 0 } - Model "CandyMagProj" { Path "models" diff --git a/modeldef.eviscerator b/modeldef.eviscerator index 52b3c383c..6d355dd84 100644 --- a/modeldef.eviscerator +++ b/modeldef.eviscerator @@ -9,6 +9,11 @@ Model "EvisceratorCasing" USEACTORROLL FrameIndex XZW1 A 0 0 + PitchOffset 90 + ZOffset 2 + FrameIndex XZW1 B 0 0 + PitchOffset -90 + FrameIndex XZW1 C 0 0 } Model "EvisceratorProj" diff --git a/modeldef.explodiumgun b/modeldef.explodiumgun index 9a4970ff5..b0b145dce 100644 --- a/modeldef.explodiumgun +++ b/modeldef.explodiumgun @@ -21,21 +21,13 @@ Model "ExplodiumMag" USEACTORPITCH USEACTORROLL - Skin 0 "ExplodiumGun.png" - FrameIndex XZW1 A 0 0 -} - -Model "ExplodiumMagEmpty" -{ - Path "models" - - Model 0 "ExplodiumMag_d.3d" - Scale 0.03 0.03 0.03 - USEACTORPITCH - USEACTORROLL - Skin 0 "ExplodiumGun_EmptyMag.png" FrameIndex XZW1 A 0 0 + RollOffset 90 + ZOffset 1 + FrameIndex XZW1 B 0 0 + RollOffset -90 + FrameIndex XZW1 C 0 0 } Model "ExplodiumMagProj" diff --git a/modeldef.silverbullet b/modeldef.silverbullet index e7014e3a1..8cfba1b10 100644 --- a/modeldef.silverbullet +++ b/modeldef.silverbullet @@ -12,19 +12,21 @@ Model "SilverBulletCasing" FrameIndex XZW1 A 0 0 } -Model "SilverBulletMag" +Model "SilverBulletCasing2" { Path "models" - Model 0 "SilverbulletMag_d.3d" - Skin 0 "SilverbulletAmmo.png" - Scale 0.2 0.2 0.2 + Model 0 "SilverbulletCase_FCB_d.3d" + Skin 0 "SilverbulletBullet_FCB.png" + Scale 0.04 0.04 0.04 + ZOffset 1 + AngleOffset 90 USEACTORPITCH USEACTORROLL FrameIndex XZW1 A 0 0 } -Model "SilverBulletMagEmpty" +Model "SilverBulletMag" { Path "models" @@ -35,6 +37,28 @@ Model "SilverBulletMagEmpty" USEACTORROLL FrameIndex XZW1 A 0 0 + RollOffset 90 + ZOffset 2 + FrameIndex XZW1 B 0 0 + RollOffset -90 + FrameIndex XZW1 C 0 0 +} +Model "SilverBulletMag2" +{ + Path "models" + + Model 0 "SilverbulletMag_d.3d" + Skin 0 "SilverbulletAmmo_FCB_EmptyMag.png" + Scale 0.2 0.2 0.2 + USEACTORPITCH + USEACTORROLL + + FrameIndex XZW1 A 0 0 + RollOffset 90 + ZOffset 2 + FrameIndex XZW1 B 0 0 + RollOffset -90 + FrameIndex XZW1 C 0 0 } Model "SilverBullet" @@ -75,7 +99,7 @@ Model "SilverBullet" Scale -0.005 0.0025 0.005 DONTCULLBACKFACES - // Casing + // Casing (XSB) SurfaceSkin 2 5 "SilverbulletBullet.png" FrameIndex XZW7 D 2 30 FrameIndex XZW7 E 2 31 @@ -89,6 +113,20 @@ Model "SilverBullet" FrameIndex XZW7 M 2 39 FrameIndex XZW7 N 2 40 FrameIndex XZW7 O 2 41 + // Casing (FCB) + SurfaceSkin 2 5 "SilverbulletBullet_FCB.png" + FrameIndex XZWD D 2 30 + FrameIndex XZWD E 2 31 + FrameIndex XZWD F 2 32 + FrameIndex XZWD G 2 33 + FrameIndex XZWD H 2 34 + FrameIndex XZWD I 2 35 + FrameIndex XZWD J 2 36 + FrameIndex XZWD K 2 37 + FrameIndex XZWD L 2 38 + FrameIndex XZWD M 2 39 + FrameIndex XZWD N 2 40 + FrameIndex XZWD O 2 41 // Jets SurfaceSkin 2 5 "" SurfaceSkin 2 6 "SilverbulletJetSmoke.png" @@ -116,6 +154,7 @@ Model "SilverBullet" AngleOffset -90 Scale -0.005 0.0025 0.005 + // EXPLOSIVE SUPER BURST // Still / Deselect FrameIndex XZW2 A 1 0 FrameIndex XZW2 B 1 1 @@ -260,4 +299,150 @@ Model "SilverBullet" FrameIndex XZW7 A 1 125 FrameIndex XZW7 B 1 126 FrameIndex XZW7 C 1 127 + //// FAT CHODE BOMB + SurfaceSkin 1 4 "SilverbulletAmmo_FCB.png" + // Still / Deselect + FrameIndex XZW8 A 1 0 + FrameIndex XZW8 B 1 1 + FrameIndex XZW8 C 1 2 + FrameIndex XZW8 D 1 3 + FrameIndex XZW8 E 1 4 + FrameIndex XZW8 F 1 5 + FrameIndex XZW8 G 1 6 // Select + FrameIndex XZW8 H 1 7 + FrameIndex XZW8 I 1 8 + FrameIndex XZW8 J 1 9 + FrameIndex XZW8 K 1 10 + FrameIndex XZW8 L 1 11 + FrameIndex XZW8 M 1 12 + FrameIndex XZW8 N 1 13 + // Fire + FrameIndex XZW8 O 1 15 + FrameIndex XZW8 P 1 16 + FrameIndex XZW8 Q 1 17 + FrameIndex XZW8 R 1 18 + FrameIndex XZW8 S 1 19 + FrameIndex XZW8 T 1 20 + FrameIndex XZW8 U 1 21 + FrameIndex XZW8 V 1 22 + FrameIndex XZW8 W 1 23 + // Bolt + FrameIndex XZW8 X 1 25 + FrameIndex XZW8 Y 1 26 + FrameIndex XZW8 Z 1 27 + FrameIndex XZW9 A 1 28 + FrameIndex XZW9 B 1 29 + FrameIndex XZW9 C 1 30 // StartCasing + FrameIndex XZW9 D 1 31 + FrameIndex XZW9 E 1 32 + FrameIndex XZW9 F 1 33 + FrameIndex XZW9 G 1 34 + FrameIndex XZW9 H 1 35 + FrameIndex XZW9 I 1 36 + FrameIndex XZW9 J 1 37 + FrameIndex XZW9 K 1 38 + FrameIndex XZW9 L 1 39 + FrameIndex XZW9 M 1 40 + FrameIndex XZW9 N 1 41 // EndCasing + FrameIndex XZW9 O 1 42 + FrameIndex XZW9 P 1 43 + FrameIndex XZW9 Q 1 44 + FrameIndex XZW9 R 1 45 + // ZoomIn + FrameIndex XZW9 S 1 47 + FrameIndex XZW9 T 1 48 + FrameIndex XZW9 U 1 49 + FrameIndex XZW9 V 1 50 + FrameIndex XZW9 W 1 51 + FrameIndex XZW9 X 1 52 // ZoomStill / ZoomOut + FrameIndex XZW9 Y 1 53 + FrameIndex XZW9 Z 1 54 + FrameIndex XZWA A 1 55 + FrameIndex XZWA B 1 56 + FrameIndex XZWA C 1 57 + // Unload + FrameIndex XZWA D 1 59 + FrameIndex XZWA E 1 60 + FrameIndex XZWA F 1 61 + FrameIndex XZWA G 1 62 + FrameIndex XZWA H 1 63 + FrameIndex XZWA I 1 64 + FrameIndex XZWA J 1 65 + FrameIndex XZWA K 1 66 + FrameIndex XZWA L 1 67 + FrameIndex XZWA M 1 68 + FrameIndex XZWA N 1 69 + // UnloadEmpty + SurfaceSkin 1 4 "SilverbulletAmmo_FCB_EmptyMag.png" + FrameIndex XZWA O 1 59 + FrameIndex XZWA P 1 60 + FrameIndex XZWA Q 1 61 + FrameIndex XZWA R 1 62 + FrameIndex XZWA S 1 63 + FrameIndex XZWA T 1 64 + FrameIndex XZWA U 1 65 + FrameIndex XZWA V 1 66 + FrameIndex XZWA W 1 67 + FrameIndex XZWA X 1 68 + FrameIndex XZWA Y 1 69 + SurfaceSkin 1 4 "SilverbulletAmmo_FCB.png" + // Load + FrameIndex XZWA Z 1 70 + FrameIndex XZWB A 1 71 + FrameIndex XZWB B 1 72 + FrameIndex XZWB C 1 73 + FrameIndex XZWB D 1 74 + FrameIndex XZWB E 1 75 + FrameIndex XZWB F 1 76 + FrameIndex XZWB G 1 77 + FrameIndex XZWB H 1 78 + FrameIndex XZWB I 1 79 + FrameIndex XZWB J 1 80 + FrameIndex XZWB K 1 81 + FrameIndex XZWB L 1 82 + FrameIndex XZWB M 1 83 + FrameIndex XZWB N 1 84 + // Idle + FrameIndex XZWB O 1 86 + FrameIndex XZWB P 1 87 + FrameIndex XZWB Q 1 88 + FrameIndex XZWB R 1 89 + FrameIndex XZWB S 1 90 + FrameIndex XZWB T 1 91 + FrameIndex XZWB U 1 92 + FrameIndex XZWB V 1 93 + FrameIndex XZWB W 1 94 + FrameIndex XZWB X 1 95 + FrameIndex XZWB Y 1 96 + FrameIndex XZWB Z 1 97 + FrameIndex XZWC A 1 98 + FrameIndex XZWC B 1 99 + FrameIndex XZWC C 1 100 + FrameIndex XZWC D 1 101 + FrameIndex XZWC E 1 102 + FrameIndex XZWC F 1 103 + FrameIndex XZWC G 1 104 + FrameIndex XZWC H 1 105 + // Melee + FrameIndex XZWC I 1 107 + FrameIndex XZWC J 1 108 + FrameIndex XZWC K 1 109 + FrameIndex XZWC L 1 110 + FrameIndex XZWC M 1 111 + FrameIndex XZWC N 1 112 + FrameIndex XZWC O 1 113 + FrameIndex XZWC P 1 114 + FrameIndex XZWC Q 1 115 + FrameIndex XZWC R 1 116 + FrameIndex XZWC S 1 117 + FrameIndex XZWC T 1 118 + FrameIndex XZWC U 1 119 + FrameIndex XZWC V 1 120 + FrameIndex XZWC W 1 121 + FrameIndex XZWC X 1 122 + FrameIndex XZWC Y 1 123 + FrameIndex XZWC Z 1 124 + FrameIndex XZWD A 1 125 + FrameIndex XZWD B 1 126 + FrameIndex XZWD C 1 127 } diff --git a/models/BooletCandy.png b/models/BooletCandy.png new file mode 100644 index 000000000..8a76d9da5 Binary files /dev/null and b/models/BooletCandy.png differ diff --git a/models/BooletExplodium.png b/models/BooletExplodium.png new file mode 100644 index 000000000..ba7635e5e Binary files /dev/null and b/models/BooletExplodium.png differ diff --git a/models/CandyCasing_Boolet.png b/models/CandyCasing_Boolet.png new file mode 100644 index 000000000..4b1e7da82 Binary files /dev/null and b/models/CandyCasing_Boolet.png differ diff --git a/models/ExplodiumBullet_a.3d b/models/ExplodiumBullet_a.3d new file mode 100644 index 000000000..5e9aea0cb Binary files /dev/null and b/models/ExplodiumBullet_a.3d differ diff --git a/models/ExplodiumBullet_d.3d b/models/ExplodiumBullet_d.3d new file mode 100644 index 000000000..f03fff4b6 Binary files /dev/null and b/models/ExplodiumBullet_d.3d differ diff --git a/models/ExplodiumCasing_Boolet.png b/models/ExplodiumCasing_Boolet.png new file mode 100644 index 000000000..15a214d61 Binary files /dev/null and b/models/ExplodiumCasing_Boolet.png differ diff --git a/models/SilverbulletAmmo_FCB.png b/models/SilverbulletAmmo_FCB.png new file mode 100644 index 000000000..3f643aab2 Binary files /dev/null and b/models/SilverbulletAmmo_FCB.png differ diff --git a/models/SilverbulletAmmo_FCB_EmptyMag.png b/models/SilverbulletAmmo_FCB_EmptyMag.png new file mode 100644 index 000000000..823989aad Binary files /dev/null and b/models/SilverbulletAmmo_FCB_EmptyMag.png differ diff --git a/models/SilverbulletBullet_FCB.png b/models/SilverbulletBullet_FCB.png new file mode 100644 index 000000000..4dbda5900 Binary files /dev/null and b/models/SilverbulletBullet_FCB.png differ diff --git a/models/SilverbulletBullet_FCB_a.3d b/models/SilverbulletBullet_FCB_a.3d new file mode 100644 index 000000000..65153c54c Binary files /dev/null and b/models/SilverbulletBullet_FCB_a.3d differ diff --git a/models/SilverbulletBullet_FCB_d.3d b/models/SilverbulletBullet_FCB_d.3d new file mode 100644 index 000000000..c8b9bd6bc Binary files /dev/null and b/models/SilverbulletBullet_FCB_d.3d differ diff --git a/models/SilverbulletCase_FCB_a.3d b/models/SilverbulletCase_FCB_a.3d new file mode 100644 index 000000000..6f940f816 Binary files /dev/null and b/models/SilverbulletCase_FCB_a.3d differ diff --git a/models/SilverbulletCase_FCB_d.3d b/models/SilverbulletCase_FCB_d.3d new file mode 100644 index 000000000..8e979e3ba Binary files /dev/null and b/models/SilverbulletCase_FCB_d.3d differ diff --git a/sndinfo.txt b/sndinfo.txt index a891cdc62..e540e11fd 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -739,6 +739,10 @@ 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/altfire1 sounds/silverbullet/silver_altfire1.ogg +silverbullet/altfire2 sounds/silverbullet/silver_altfire2.ogg +silverbullet/altfire3 sounds/silverbullet/silver_altfire3.ogg +$random silverbullet/altfire { silverbullet/altfire1 silverbullet/altfire2 silverbullet/altfire3 } silverbullet/jet sounds/silverbullet/silver_jet.ogg silverbullet/casing1 sounds/silverbullet/silver_casing1.ogg silverbullet/casing2 sounds/silverbullet/silver_casing2.ogg @@ -755,6 +759,9 @@ $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 } +silverbullet/chode1 sounds/silverbullet/silver_chode1.ogg +silverbullet/chode2 sounds/silverbullet/silver_chode2.ogg +$random silverbullet/chode { silverbullet/chode1 silverbullet/chode2 } candygun/fire1 sounds/candygun/candy_fire1.ogg candygun/fire2 sounds/candygun/candy_fire2.ogg @@ -815,6 +822,7 @@ misc/p_pkup sounds/general/ppickup.ogg misc/i_pkup sounds/general/ipickup.ogg misc/k_pkup sounds/general/kpickup.ogg misc/ammo_pkup sounds/general/apickup.ogg +misc/bullet_pkup sounds/general/bpickup.ogg misc/armor_pkup sounds/general/spickup.ogg misc/health_pkup sounds/general/hpickup.ogg misc/spawn sounds/CORK.ogg diff --git a/sounds/general/bpickup.ogg b/sounds/general/bpickup.ogg new file mode 100644 index 000000000..9cc3dbc21 Binary files /dev/null and b/sounds/general/bpickup.ogg differ diff --git a/sounds/silverbullet/silver_altfire1.ogg b/sounds/silverbullet/silver_altfire1.ogg new file mode 100644 index 000000000..37daa379e Binary files /dev/null and b/sounds/silverbullet/silver_altfire1.ogg differ diff --git a/sounds/silverbullet/silver_altfire2.ogg b/sounds/silverbullet/silver_altfire2.ogg new file mode 100644 index 000000000..2ea11b4e2 Binary files /dev/null and b/sounds/silverbullet/silver_altfire2.ogg differ diff --git a/sounds/silverbullet/silver_altfire3.ogg b/sounds/silverbullet/silver_altfire3.ogg new file mode 100644 index 000000000..c62fc277f Binary files /dev/null and b/sounds/silverbullet/silver_altfire3.ogg differ diff --git a/sounds/silverbullet/silver_chode1.ogg b/sounds/silverbullet/silver_chode1.ogg new file mode 100644 index 000000000..be9ee15c9 Binary files /dev/null and b/sounds/silverbullet/silver_chode1.ogg differ diff --git a/sounds/silverbullet/silver_chode2.ogg b/sounds/silverbullet/silver_chode2.ogg new file mode 100644 index 000000000..d758d0aeb Binary files /dev/null and b/sounds/silverbullet/silver_chode2.ogg differ diff --git a/zscript/swwm_ammo.zsc b/zscript/swwm_ammo.zsc index ad2b3d48d..2170b3acc 100644 --- a/zscript/swwm_ammo.zsc +++ b/zscript/swwm_ammo.zsc @@ -160,6 +160,115 @@ Mixin Class SWWMAmmo } } +// Common code for individual bullets +Class MagAmmo : Inventory abstract +{ + Mixin SWWMOverlapPickupSound; + + Class ParentAmmo; + Ammo pamo; + int ClipSize; + int countdown; + + Property ParentAmmo : ParentAmmo; + Property ClipSize : ClipSize; + + default + { + +INVENTORY.KEEPDEPLETED; + Inventory.PickupSound "misc/bullet_pkup"; + } + + private Inventory DoDrop( Class type ) + { + let copy = Inventory(Spawn(type,Owner.Pos,NO_REPLACE)); + if ( !copy ) return null; + copy.DropTime = 30; + copy.bSpecial = copy.bSolid = false; + copy.SetOrigin(Owner.Vec3Offset(0,0,10.),false); + copy.Angle = Owner.Angle; + copy.VelFromAngle(5.); + copy.Vel.Z = 1.; + copy.Vel += Owner.Vel; + copy.bNoGravity = false; + copy.ClearCounters(); + copy.OnDrop(Owner); + copy.vel += (RotateVector((FRandom[Junk](-1.5,.5),FRandom[Junk](-2.5,2.5)),Owner.angle),FRandom[Junk](2.,5.)); + return copy; + } + + override bool SpecialDropAction( Actor dropper ) + { + if ( Amount != default.Amount ) + { + // needed for positioning to work + Owner = dropper; + CreateTossable(Amount); + return true; + } + return false; + } + + override void DoEffect() + { + Super.DoEffect(); + if ( !pamo ) + { + pamo = Ammo(Owner.FindInventory(ParentAmmo)); + if ( !pamo ) + { + pamo = Ammo(Spawn(ParentAmmo)); + pamo.AttachToOwner(Owner); + pamo.Amount = 0; + } + } + // check if we can fill a mag (delayed) + if ( (Amount < ClipSize) || (pamo.Amount >= pamo.MaxAmount) ) + { + countdown = 35; + return; + } + if ( countdown-- > 0 ) return; + bool given = false; + while ( (pamo.Amount < pamo.MaxAmount) && (Amount >= ClipSize) ) + { + pamo.Amount++; + Amount -= ClipSize; + given = true; + if ( Owner.CheckLocalView() ) + pamo.PrintPickupMessage(true,pamo.PickupMessage()); + } + if ( given ) pamo.PlayPickupSound(Owner); + } + + override inventory CreateTossable( int amt ) + { + if ( bUndroppable || bUntossable || !Owner || (Amount <= 0) || (amt == 0) ) + return null; + // cap + amt = min(amount,amt); + // perform subdivision + Inventory last = null; + let pammo = GetDefaultByType(ParentAmmo); + while ( amt > 0 ) + { + // drop full mag if possible + if ( amt >= pammo.Amount ) + { + last = DoDrop(ParentAmmo); + amt -= pammo.Amount; + Amount -= pammo.Amount; + continue; + } + // drop individual bullets + last = DoDrop(GetClass()); + amt--; + Amount--; + } + return last; + } +} + // ============================================================================ // Spreadgun / Wallbuster ammo // ============================================================================ @@ -786,7 +895,7 @@ Class SilverBulletAmmo : Ammo { Tag "$T_XSBMAG"; Inventory.PickupMessage "$T_XSBMAG"; - Stamina 80000; + Stamina 70000; Inventory.Icon "graphics/HUD/Icons/A_SilverBullet.png"; Inventory.Amount 1; Inventory.MaxAmount 3; @@ -803,6 +912,78 @@ Class SilverBulletAmmo : Ammo } } +Class SilverBulletAmmo2 : Ammo +{ + Mixin SWWMOverlapPickupSound; + + Default + { + Tag "$T_FCBMAG"; + Inventory.PickupMessage "$T_FCBMAG"; + Stamina 80000; + Inventory.Icon "graphics/HUD/Icons/A_SilverBullet2.png"; + Inventory.Amount 1; + Inventory.MaxAmount 2; + Ammo.BackpackAmount 0; + Ammo.DropAmount 1; + +FLOATBOB; + FloatBobStrength 0.25; + } + States + { + Spawn: + XZW1 A -1; + Stop; + } +} + +Class SilverBullets : MagAmmo +{ + Mixin SWWMOverlapPickupSound; + + Default + { + Tag "$T_XSBBULLET"; + Inventory.PickupMessage "$T_XSBBULLET"; + Inventory.Icon "graphics/HUD/Icons/A_SilverBulletBullet.png"; + Inventory.Amount 1; + Inventory.MaxAmount 5; + MagAmmo.ParentAmmo "SilverBulletAmmo"; + MagAmmo.ClipSize 5; + +FLOATBOB; + FloatBobStrength 0.25; + } + States + { + Spawn: + XZW1 A -1; + Stop; + } +} +Class SilverBullets2 : MagAmmo +{ + Mixin SWWMOverlapPickupSound; + + Default + { + Tag "$T_FCBBULLET"; + Inventory.PickupMessage "$T_FCBBULLET"; + Inventory.Icon "graphics/HUD/Icons/A_SilverBulletBullet2.png"; + Inventory.Amount 1; + Inventory.MaxAmount 5; + MagAmmo.ParentAmmo "SilverBulletAmmo2"; + MagAmmo.ClipSize 5; + +FLOATBOB; + FloatBobStrength 0.25; + } + States + { + Spawn: + XZW1 A -1; + Stop; + } +} + // ============================================================================ // Candygun ammo // ============================================================================ @@ -818,7 +999,7 @@ Class CandyGunAmmo : Ammo Stamina 100000; Inventory.Icon "graphics/HUD/Icons/A_CandyGun.png"; Inventory.Amount 1; - Inventory.MaxAmount 2; + Inventory.MaxAmount 3; Ammo.BackpackAmount 0; Ammo.DropAmount 1; +FLOATBOB; @@ -832,6 +1013,30 @@ Class CandyGunAmmo : Ammo } } +Class CandyGunBullets : MagAmmo +{ + Mixin SWWMOverlapPickupSound; + + Default + { + Tag "$T_CANDYBULLET"; + Inventory.PickupMessage "$T_CANDYBULLET"; + Inventory.Icon "graphics/HUD/Icons/A_CandyBullet.png"; + Inventory.Amount 1; + Inventory.MaxAmount 7; + MagAmmo.ParentAmmo "CandyGunAmmo"; + MagAmmo.ClipSize 7; + +FLOATBOB; + FloatBobStrength 0.25; + } + States + { + Spawn: + XZW1 A -1; + Stop; + } +} + Class CandyGunSpares : Ammo { Default @@ -942,6 +1147,8 @@ Class AmmoFabricator : Inventory abstract for ( int i=0; i)(AllActorClasses[i]); + // skip over candy gun spares, they're "special ammo" + if ( a == 'CandyGunSpares' ) continue; // only direct descendants of ammo with a set price below our max unit price if ( !a || (a.GetParentClass() != 'Ammo') ) continue; let def = GetDefaultByType(a); @@ -1145,8 +1352,9 @@ Class HammerspaceEmbiggener : Inventory // The player did not have the ammoitem. Add it. ammoitem = Ammo(Spawn(type)); ammoitem.Amount = amount; - if ( ammoitem.BackpackMaxAmount != ammoitem.default.MaxAmount ) - ammoitem.MaxAmount = int(ammoitem.default.MaxAmount*(1+self.Amount/2.)); + ammoitem.MaxAmount = int(ammoitem.default.MaxAmount*(1+self.Amount/2.)); + if ( ammoitem.BackpackMaxAmount > 0 ) + ammoitem.MaxAmount = min(ammoitem.MaxAmount,ammoitem.BackpackMaxAmount); if ( (ammoitem.Amount > ammoitem.MaxAmount) && !sv_unlimited_pickup ) ammoitem.Amount = ammoitem.MaxAmount; ammoitem.AttachToOwner(other); @@ -1154,8 +1362,9 @@ Class HammerspaceEmbiggener : Inventory else { // The player had the ammoitem. Give some more. - if ( ammoitem.BackpackMaxAmount != ammoitem.default.MaxAmount ) - ammoitem.MaxAmount = int(ammoitem.default.MaxAmount*(1+self.Amount/2.)); + ammoitem.MaxAmount = int(ammoitem.default.MaxAmount*(1+self.Amount/2.)); + if ( ammoitem.BackpackMaxAmount > 0 ) + ammoitem.MaxAmount = min(ammoitem.MaxAmount,ammoitem.BackpackMaxAmount); if ( ammoitem.Amount < ammoitem.MaxAmount ) { ammoitem.Amount += amount; @@ -1174,11 +1383,13 @@ Class HammerspaceEmbiggener : Inventory { if ( !HammerspaceEmbiggener(item).cheatedin ) Owner.A_StartSound("powerup/embiggener",CHAN_ITEMEXTRA); // readjust ammo values to new capacity + // also do the same for spare bullets for ( Inventory i=Owner.Inv; i; i=i.Inv ) { if ( !(i is 'Ammo') ) continue; - if ( Ammo(i).BackpackMaxAmount != i.default.MaxAmount ) - i.MaxAmount = int(i.Default.MaxAmount*(1+self.Amount/2.)); + i.MaxAmount = int(i.Default.MaxAmount*(1+self.Amount/2.)); + if ( Ammo(i).BackpackMaxAmount > 0 ) + i.MaxAmount = min(i.MaxAmount,Ammo(i).BackpackMaxAmount); int amount = Ammo(i).BackpackAmount; if ( !bIgnoreSkill ) amount = int(amount*G_SkillPropertyFloat(SKILLP_AmmoFactor)); i.Amount += amount; @@ -1194,7 +1405,7 @@ Class HammerspaceEmbiggener : Inventory // reset upgrade for ( Inventory i=Owner.Inv; i; i=i.Inv ) { - if ( !(i is 'Ammo') ) continue; + if ( !(i is 'Ammo') && !(i is 'MagAmmo') ) continue; i.MaxAmount = i.Default.MaxAmount; if ( i.Amount > i.MaxAmount ) i.Amount = i.MaxAmount; @@ -1205,8 +1416,8 @@ Class HammerspaceEmbiggener : Inventory { Tag "$T_EMBIGGENER"; Inventory.PickupMessage "$T_EMBIGGENER"; - Inventory.MaxAmount 8; - Inventory.InterHubAmount 8; + Inventory.MaxAmount 16; + Inventory.InterHubAmount 16; +INVENTORY.UNDROPPABLE; +INVENTORY.UNTOSSABLE; +INVENTORY.ALWAYSPICKUP; diff --git a/zscript/swwm_cbt.zsc b/zscript/swwm_cbt.zsc index 65a58f18a..35e2dda40 100644 --- a/zscript/swwm_cbt.zsc +++ b/zscript/swwm_cbt.zsc @@ -520,6 +520,25 @@ Class BusterWall : Thinker } } + private static bool IsIOSWall( Line l ) + { + TextureID facetex[5]; + facetex[0] = TexMan.CheckForTexture("ZZZFACE1",TexMan.Type_Wall); + facetex[1] = TexMan.CheckForTexture("ZZZFACE2",TexMan.Type_Wall); + facetex[2] = TexMan.CheckForTexture("ZZZFACE3",TexMan.Type_Wall); + facetex[3] = TexMan.CheckForTexture("ZZZFACE4",TexMan.Type_Wall); + facetex[4] = TexMan.CheckForTexture("ZZZFACE5",TexMan.Type_Wall); + for ( int i=0; i<5; i++ ) + { + for ( int j=0; j<3; j++ ) + { + if ( l.sidedef[0].GetTexture(j) == facetex[i] ) return true; + if ( l.sidedef[1] && l.sidedef[1].GetTexture(j) == facetex[i] ) return true; + } + } + return false; + } + static void Bust( TraceResults d, int accdamage, Actor instigator, Vector3 x, double hitz ) { // we can't blow up 3D floors (yet) @@ -528,6 +547,8 @@ Class BusterWall : Thinker int hp; if ( d.HitType == TRACE_HitWall ) { + // no busting the goat + if ( IsIOSWall(d.HitLine) ) return; // onesided wall? no bust (TODO: bust polyobjects) if ( !d.HitLine.sidedef[1] ) return; // sector is opposite of side hit diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index 8a1fd3307..badd42ebb 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -3653,12 +3653,9 @@ Class SWWMHandler : EventHandler } else if ( (e.Replacee == 'Cell') || (e.Replacee == 'SkullRodAmmo') ) { - if ( Random[Replacements](0,6) ) - { - if ( Random[Replacements](0,2) ) e.Replacement = 'HellblazerRavagers'; - else e.Replacement = 'HellblazerWarheads'; - } - else e.Replacement = 'SparkUnit'; + if ( Random[Replacements](0,3) ) e.Replacement = 'SparkUnit'; + else if ( !Random[Replacements](0,2) ) e.Replacement = 'CandyGunBullets'; + else e.Replacement = Random[Replacements](0,2)?'SilverBullets':'SilverBullets2'; } else if ( (e.Replacee == 'ArtiTeleport') || (e.Replacee == 'ArtiTeleportOther') ) { @@ -3667,8 +3664,7 @@ Class SWWMHandler : EventHandler } else if ( (e.Replacee == 'CellPack') || (e.Replacee == 'SkullRodHefty') ) { - if ( !Random[Replacements](0,2) ) e.Replacement = 'SilverBulletAmmo'; - else if ( Random[Replacements](0,1) ) e.Replacement = 'SparkUnit'; + if ( !Random[Replacements](0,2) ) e.Replacement = Random[Replacements](0,2)?'SilverBulletAmmo':'SilverBulletAmmo2'; else e.Replacement = 'CandyGunAmmo'; } else if ( e.Replacee == 'Mana1' ) e.Replacement = 'FabricatorTier1'; diff --git a/zscript/swwm_danmaku.zsc b/zscript/swwm_danmaku.zsc index 753c88d46..de92aa577 100644 --- a/zscript/swwm_danmaku.zsc +++ b/zscript/swwm_danmaku.zsc @@ -505,11 +505,11 @@ Class EvisceratorCasing : SWWMCasing States { Death: - #### # -1 + XZW1 BC -1 { - pitch = RandomPick[Junk](-90,90); + pitch = roll = 0; angle = FRandom[Junk](0,360); - roll = 0; + frame = RandomPick[Junk](1,2); } Stop; } diff --git a/zscript/swwm_deathlydeathcannon.zsc b/zscript/swwm_deathlydeathcannon.zsc index 49972f4d0..2518c28c4 100644 --- a/zscript/swwm_deathlydeathcannon.zsc +++ b/zscript/swwm_deathlydeathcannon.zsc @@ -996,6 +996,251 @@ Class YnykronShot : Actor } } +Class YnykronAltTracer : LineTracer +{ + Actor ignore; + Array ShootThroughList; + Array WaterHitList; + + override ETraceStatus TraceCallback() + { + // liquid splashes + if ( Results.CrossedWater ) + { + let hl = new("WaterHit"); + hl.sect = Results.CrossedWater; + hl.hitpos = Results.CrossedWaterPos; + WaterHitList.Push(hl); + } + else if ( Results.Crossed3DWater ) + { + let hl = new("WaterHit"); + hl.sect = Results.Crossed3DWater; + hl.hitpos = Results.Crossed3DWaterPos; + WaterHitList.Push(hl); + } + if ( Results.HitType == TRACE_HitActor ) + { + if ( Results.HitActor == ignore ) return TRACE_Skip; + if ( Results.HitActor.bSHOOTABLE ) return TRACE_Stop; + return TRACE_Skip; + } + else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) + { + if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&Line.ML_BlockHitscan) ) + return TRACE_Stop; + ShootThroughList.Push(Results.HitLine); + return TRACE_Skip; + } + return TRACE_Stop; + } +} + +Class YnykronAltBeam : Actor +{ + bool nospread; + + void TraceOut() + { + Vector3 x, y, z; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + let t = new("YnykronAltTracer"); + t.ignore = target; + t.ShootThroughList.Clear(); + t.WaterHitList.Clear(); + t.Trace(pos,cursector,x,64,TRACE_HitSky); + for ( int i=0; i= 25600 ) + { + // end of the line, dissipate + int numpt = Random[Ynykron](4,8); + for ( int i=0; i 0 ) tics--; + while ( !tics ) + { + if ( !SetState(CurState.NextState) ) + return; + } + } + + Default + { + RenderStyle "Subtract"; + Radius .1; + Height 0; + Alpha .4; + +NOGRAVITY; + +NOBLOCKMAP; + +NOCLIP; + +NOTELEPORT; + +DONTSPLASH; + +FORCEXYBILLBOARD; + +ROLLSPRITE; + +ROLLCENTER; + +NOINTERACTION; + } + States + { + Spawn: + XZW1 A -1 Bright NoDelay + { + return FindState("StarterDev")+Random[Ynykron](0,3)*2; + } + Stop; + TrailSpawn: + XZW2 A -1 Bright + { + return FindState("TrailerDev")+Random[Ynykron](0,3)*2; + } + Stop; + StarterDev: + #### # 50 Bright; + XZW1 B -1 Bright; + Stop; + #### # 50 Bright; + XZW1 C -1 Bright; + Stop; + #### # 50 Bright; + XZW1 D -1 Bright; + Stop; + #### # 50 Bright; + XZW1 E -1 Bright; + Stop; + TrailerDev: + #### # 50 Bright; + XZW2 B -1 Bright; + Stop; + #### # 50 Bright; + XZW2 C -1 Bright; + Stop; + #### # 50 Bright; + XZW2 D -1 Bright; + Stop; + #### # 50 Bright; + XZW2 E -1 Bright; + Stop; + } +} + +Class YnykronAltShot : Actor +{ + Default + { + Radius .1; + Height 0; + +NOGRAVITY; + +NOBLOCKMAP; + +NOTELEPORT; + +DONTSPLASH; + +NOINTERACTION; + } + override void PostBeginPlay() + { + A_QuakeEx(4,4,4,80,0,65536,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65536,rollIntensity:.8); + A_StartSound("ynykron/altbeam",CHAN_VOICE,CHANF_DEFAULT,1.,0.); + let b = Spawn("YnykronAltBeam",pos); + b.target = target; + b.angle = angle; + b.pitch = pitch; + } + override void Tick() + { + if ( isFrozen() || IsActorPlayingSound(CHAN_VOICE) ) return; + Destroy(); + } +} + Class Ynykron : SWWMWeapon { transient ui TextureID WeaponBox, ChargeBar[2], BoxSide[2]; diff --git a/zscript/swwm_inventory.zsc b/zscript/swwm_inventory.zsc index ccb9e39fe..75cd72b1c 100644 --- a/zscript/swwm_inventory.zsc +++ b/zscript/swwm_inventory.zsc @@ -402,7 +402,7 @@ Class SWWMCasing : Actor abstract } Loop; Bounce: - #### # 0 + XZW1 A 0 { pitchvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); anglevel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); @@ -416,7 +416,7 @@ Class SWWMCasing : Actor abstract } Goto Spawn; Death: - #### # -1 + XZW1 A -1 { pitch = roll = 0; angle = FRandom[Junk](0,360); diff --git a/zscript/swwm_menu.zsc b/zscript/swwm_menu.zsc index 733b2ba6b..137676276 100644 --- a/zscript/swwm_menu.zsc +++ b/zscript/swwm_menu.zsc @@ -1459,13 +1459,17 @@ Class SWWMKnowledgeBaseMenu : GenericMenu { int ta = 0, tb = 0; if ( a is 'Weapon' ) ta = 2; - else if ( (a is 'Ammo') || (a is 'BackpackItem') || (a is 'HammerspaceEmbiggener') ) ta = 3; + else if ( (a is 'BackpackItem') || (a is 'HammerspaceEmbiggener') ) ta = 3; + else if ( (a is 'Ammo') ) ta = 4; + else if ( (a is 'MagAmmo') ) ta = 5; else if ( (a is 'PowerupGiver') || (a is 'AmmoFabricator') || a.bBIGPOWERUP ) ta = -3; else if ( (a is 'Health') || (a is 'HealthPickup') || (a is 'SWWMHealth') ) ta = -2; else if ( (a is 'Armor') || (a is 'SWWMSpareArmor') ) ta = -1; else if ( a is 'PuzzleItem' ) ta = 1; if ( b is 'Weapon' ) tb = 2; - else if ( (b is 'Ammo') || (b is 'BackpackItem') || (b is 'HammerspaceEmbiggener') ) tb = 3; + else if ( (b is 'BackpackItem') || (b is 'HammerspaceEmbiggener') ) tb = 3; + else if ( (b is 'Ammo') ) tb = 4; + else if ( (b is 'MagAmmo') ) tb = 5; else if ( (b is 'PowerupGiver') || (b is 'AmmoFabricator') || b.bBIGPOWERUP ) tb = -3; else if ( (b is 'Health') || (b is 'HealthPickup') || (b is 'SWWMHealth') ) tb = -2; else if ( (b is 'Armor') || (b is 'SWWMSpareArmor') ) tb = -1; @@ -1610,7 +1614,7 @@ Class SWWMKnowledgeBaseMenu : GenericMenu // alphabetically sorted inventory for ( Inventory inv=players[consoleplayer].mo.Inv; inv; inv=inv.Inv ) { - if ( (inv.Amount <= 0) || !inv.SpawnState.ValidateSpriteFrame() || (inv is 'Key') || (inv is 'BasicArmor') || (inv is 'HexenArmor') || (inv is 'Powerup') || (inv is 'SWWMArmor') || (inv is 'SWWMGesture') || (!(inv is 'Ammo') && !(inv is 'Weapon') && !inv.bINVBAR) && !(inv is 'HammerspaceEmbiggener') && !(inv is 'SWWMCollectable') ) continue; + if ( (inv.Amount <= 0) || !inv.SpawnState.ValidateSpriteFrame() || (inv is 'Key') || (inv is 'BasicArmor') || (inv is 'HexenArmor') || (inv is 'Powerup') || (inv is 'SWWMArmor') || (inv is 'SWWMGesture') || (!(inv is 'Ammo') && !(inv is 'Weapon') && !inv.bINVBAR) && !(inv is 'HammerspaceEmbiggener') && !(inv is 'SWWMCollectable') && !(inv is 'MagAmmo') ) continue; String tag = inv.GetTag(); bool greater = false; for ( int i=0; i=invoker.default.clipcount)||((invoker.Ammo1.Amount<=0)&&!sv_infiniteammo&&!FindInventory('PowerInfiniteAmmo',true)),"Idle"); + XZW2 A 0 A_JumpIf((invoker.clipcount>0)||((invoker.Ammo1.Amount<=0)&&!sv_infiniteammo&&!FindInventory('PowerInfiniteAmmo',true)),"Idle"); XZW2 A 2 { A_StartSound("biospark/meleestart",CHAN_WEAPON,CHANF_OVERLAP); diff --git a/zscript/swwm_splode.zsc b/zscript/swwm_splode.zsc index 4a338d27b..2a6dd4c7f 100644 --- a/zscript/swwm_splode.zsc +++ b/zscript/swwm_splode.zsc @@ -20,18 +20,16 @@ Class ExplodiumMag : SWWMCasing States { Death: - #### # -1 + XZW1 BC -1 { - pitch = 0; + pitch = roll = 0; angle = FRandom[Junk](0,360); - roll = RandomPick[Junk](-90,90); + frame = RandomPick[Junk](1,2); } Stop; } } -Class ExplodiumMagEmpty : ExplodiumMag {} - Class ExplodiumMagArm : Actor { Default @@ -391,12 +389,12 @@ Class ExplodiumGun : SWWMWeapon p.vel += vel*.5; } - action void A_DropMag( bool loaded = false ) + action void A_DropMag() { Vector3 x, y, z; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x-2*y-10*z); - let c = Spawn(loaded?"ExplodiumMag":"ExplodiumMagEmpty",origin); + let c = Spawn("ExplodiumMag",origin); c.angle = angle; c.pitch = pitch; c.vel = x*FRandom[Junk](-.5,.5)+y*FRandom[Junk](-1.2,.3)-(0,0,FRandom[Junk](2,3)); @@ -501,7 +499,7 @@ Class ExplodiumGun : SWWMWeapon XZW3 C 1; XZW3 D 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); XZW3 EFGH 1; - XZW3 I 1 A_DropMag(true); + XZW3 I 1 A_DropMag(); Goto ReloadEnd; ReloadEmpty: XZW2 A 1; diff --git a/zscript/swwm_tastytreat.zsc b/zscript/swwm_tastytreat.zsc index 634b21265..2b0bad329 100644 --- a/zscript/swwm_tastytreat.zsc +++ b/zscript/swwm_tastytreat.zsc @@ -7,8 +7,6 @@ Class CandyMag : ExplodiumMag { } -Class CandyMagEmpty : ExplodiumMag {} - Class CandyLight : PaletteLight { Default @@ -529,7 +527,7 @@ Class CandyGunProj : Actor A_SetRenderStyle(1.,STYLE_Add); Scale *= 6.+.2*special1; A_AlertMonsters(40000); - SWWMHandler.DoExplosion(self,3500+500*special1,80000+8000*special1,300+20*special1,120,DE_EXTRAZTHRUST); + SWWMHandler.DoExplosion(self,4000+700*special1,80000+15000*special1,400+20*special1,250,DE_EXTRAZTHRUST); A_QuakeEx(9,9,9,70,0,1500+100*special1,"",QF_RELATIVE|QF_SCALEDOWN,falloff:1200,rollintensity:2.); A_StartSound("candygun/gunhit",CHAN_VOICE,attenuation:.24); A_StartSound("candygun/gunhit",CHAN_WEAPON,attenuation:.12); @@ -639,7 +637,7 @@ Class CandyMagProj : Actor A_SetRenderStyle(1.,STYLE_Add); Scale *= 3.+.2*special1; A_AlertMonsters(20000); - SWWMHandler.DoExplosion(self,700+600*special1,80000+8000*special1,150+15*special1,90,DE_EXTRAZTHRUST); + SWWMHandler.DoExplosion(self,800+700*special1,60000+15000*special1,200+15*special1,100,DE_EXTRAZTHRUST); A_QuakeEx(9,9,9,30,0,500+80*special1,"",QF_RELATIVE|QF_SCALEDOWN,falloff:500,rollintensity:2.); A_StartSound("candygun/maghit",CHAN_VOICE,attenuation:.24); A_StartSound("candygun/maghit",CHAN_WEAPON,attenuation:.12); @@ -1031,18 +1029,36 @@ Class CandyGun : SWWMWeapon p.vel += vel*.5; } - action void A_DropMag( bool loaded = false ) + action void A_DropMag() { Vector3 x, y, z; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x-2*y-10*z); - let c = Spawn(loaded?"CandyMag":"CandyMagEmpty",origin); + let c = Spawn("CandyMag",origin); c.angle = angle; c.pitch = pitch; c.vel = x*FRandom[Junk](-.5,.5)+y*FRandom[Junk](-1.2,.3)-(0,0,FRandom[Junk](2,3)); c.vel += vel*.5; } + action void A_EmptyMag() + { + MagAmmo ma = MagAmmo(FindInventory("CandyGunBullets")); + if ( !ma ) + { + ma = MagAmmo(Spawn("CandyGunBullets")); + ma.Amount = 0; + ma.AttachToOwner(self); + } + int maxgiveamt = min(ma.MaxAmount-ma.Amount,invoker.clipcount); + int dropamt = invoker.clipcount-maxgiveamt; + if ( dropamt > 0 ) ma.CreateTossable(dropamt); + ma.Amount = min(ma.MaxAmount,ma.Amount+invoker.clipcount); + if ( CheckLocalView() ) for ( int i=0; i<(invoker.clipcount-dropamt); i++ ) ma.PrintPickupMessage(true,ma.PickupMessage()); + ma.PlayPickupSound(self); + invoker.clipcount = 0; + } + action void A_DropCasing() { Vector3 x, y, z; @@ -1186,11 +1202,11 @@ Class CandyGun : SWWMWeapon } XZW2 TUVWXYZ 1; XZW3 A 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP,.3); - XZW3 B 1 { invoker.clipcount = 0; } + XZW3 B 1 A_EmptyMag(); XZW3 C 1; XZW3 D 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP); XZW3 EFGH 1; - XZW3 I 1 A_DropMag(true); + XZW3 I 1 A_DropMag(); Goto ReloadEnd; ReloadEmpty: XZW2 A 1; diff --git a/zscript/swwm_thiccboolet.zsc b/zscript/swwm_thiccboolet.zsc index 7427c73f6..1fe3ee3fa 100644 --- a/zscript/swwm_thiccboolet.zsc +++ b/zscript/swwm_thiccboolet.zsc @@ -8,6 +8,7 @@ Class SilverBulletCasing : SWWMCasing BounceSound "silverbullet/casing"; } } +Class SilverBulletCasing2 : SilverBulletCasing {} Class SilverBulletMag : SWWMCasing { @@ -26,23 +27,22 @@ Class SilverBulletMag : SWWMCasing States { Death: - #### # -1 + XZW1 BC -1 { - pitch = 0; + pitch = roll = 0; angle = FRandom[Junk](0,360); - roll = RandomPick[Junk](-90,90); + frame = RandomPick[Junk](1,2); } Stop; } } -Class SilverBulletMagEmpty : SilverBulletMag -{ -} +Class SilverBulletMag2 : SilverBulletMag {} Class SilverAirRip : Actor { Default { + Obituary "$O_SILVERBULLET"; Radius 0.1; Height 0; +NOGRAVITY; @@ -60,11 +60,34 @@ Class SilverAirRip : Actor Destroy(); } } +Class SilverAirRip2 : Actor +{ + Default + { + Obituary "$O_SILVERBULLET2"; + Radius 0.1; + Height 0; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +NOTELEPORT; + +FORCERADIUSDMG; + +NODAMAGETHRUST; + +NOINTERACTION; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + SWWMHandler.DoExplosion(self,20,2000,30,ignoreme:target); + Destroy(); + } +} Class SilverImpact : Actor { Default { + Obituary "$O_SILVERBULLET"; Radius 0.1; Height 0; +NOGRAVITY; @@ -79,7 +102,7 @@ Class SilverImpact : Actor { Super.PostBeginPlay(); SWWMHandler.DoExplosion(self,100,8000,100,20); - if ( swwm_extraalert ) A_AlertMonsters(2500); + A_AlertMonsters(2500); A_QuakeEx(4,4,4,20,0,400,"",QF_RELATIVE|QF_SCALEDOWN,falloff:100,rollIntensity:.9); if ( special1 ) { @@ -298,12 +321,238 @@ Class SilverBulletTracer : SpreadSlugTracer } } +Class FatChodeTracer : LineTracer +{ + Actor ignoreme; + Array ShootThroughList; + Array WaterHitList; + + override ETraceStatus TraceCallback() + { + // liquid splashes + if ( Results.CrossedWater ) + { + let hl = new("WaterHit"); + hl.sect = Results.CrossedWater; + hl.hitpos = Results.CrossedWaterPos; + WaterHitList.Push(hl); + } + else if ( Results.Crossed3DWater ) + { + let hl = new("WaterHit"); + hl.sect = Results.Crossed3DWater; + hl.hitpos = Results.Crossed3DWaterPos; + WaterHitList.Push(hl); + } + if ( Results.HitType == TRACE_HitActor ) + { + if ( Results.HitActor == ignoreme ) return TRACE_Skip; + if ( Results.HitActor.bSHOOTABLE ) return TRACE_Stop; + return TRACE_Skip; + } + else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) + { + if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&Line.ML_BlockHitscan) ) + return TRACE_Stop; + ShootThroughList.Push(Results.HitLine); + return TRACE_Skip; + } + return TRACE_Stop; + } +} + +Class ExploLight3 : PaletteLight +{ + Default + { + ReactionTime 30; + Args 0,0,0,250; + } +} +Class FatChodeImpact : Actor +{ + double realangle, realpitch; + + Default + { + Obituary "$O_SILVERBULLET2"; + DamageType 'Explodium'; + RenderStyle "Add"; + Radius 0.1; + Height 0; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +NOBLOCKMAP; + +FORCEXYBILLBOARD; + +FORCERADIUSDMG; + +NODAMAGETHRUST; + +NOTELEPORT; + +NOINTERACTION; + Scale 4.5; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + SWWMHandler.DoExplosion(self,1500,40000,250,120,DE_THRUWALLS|DE_EXTRAZTHRUST); + A_AlertMonsters(8000); + A_QuakeEx(7,7,7,50,0,2000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:800,rollIntensity:1.); + A_StartSound("silverbullet/chode",CHAN_VOICE,CHANF_DEFAULT,1.,.35); + A_SprayDecal("BigBulletChip",-64); + A_SprayDecal("HugeWallCrack",-64); + A_SprayDecal("WumboScorch",-64); + Scale *= FRandom[ExploS](0.8,1.1); + Scale.x *= RandomPick[ExploS](-1,1); + Scale.y *= RandomPick[ExploS](-1,1); + int numpt = Random[Silverbullet](15,25); + Vector3 x = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + 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); + Screen.DrawTexture(WeaponBox[1],false,bx-35,by-56,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(ZoomBar,false,bx-33,by-54,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); + Screen.DrawTexture(WeaponBox[0],false,bx-55,by-44,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + if ( chambered ) Screen.DrawTexture(BulletIcon[fcbchambered],false,bx-53,by-30,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,fired?Color(128,0,0,0):Color(0,0,0,0)); + for ( int i=0; i9)?32:29; + 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,DTA_ColorOverlay,fcbselected?Color(128,0,0,0):Color(0,0,0,0)); + cx = (Ammo2.Amount>9)?32:29; + Screen.DrawText(TewiFont,Font.CR_FIRE,bx-cx,by-40,String.Format("%d",Ammo2.Amount),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,fcbselected?Color(0,0,0,0):Color(128,0,0,0)); } override void HudTick() { @@ -346,7 +609,7 @@ Class SilverBullet : SWWMWeapon override bool ReportHUDAmmo() { if ( (chambered && !fired) || (clipcount > 0) ) return true; - if ( Ammo1.Amount <= 0 ) return false; + if ( (Ammo1.Amount <= 0) && (Ammo2.Amount <= 0) ) return false; return Super.ReportHUDAmmo(); } override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount ) @@ -357,7 +620,7 @@ Class SilverBullet : SWWMWeapon // allow player to still use the zoom even if there's no ammo left // (should work fine, assuming I've correctly interpreted the execution chain of all this stuff) if ( autoswitch && (fireMode == AltFire) ) return true; - return ((chambered && !fired) || (clipcount > 0) || (Ammo1.Amount > 0)); + return ((chambered && !fired) || (clipcount > 0) || (Ammo1.Amount > 0) || (Ammo2.Amount > 0)); } return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount); } @@ -367,9 +630,12 @@ Class SilverBullet : SWWMWeapon if ( !initialized ) { initialized = true; - // first copy always has a bullet in the chamber + // first copy always has a XSB mag with a XSB bullet in the chamber chambered = true; fired = false; + fcbchambered = false; + fcbloaded = false; + fcbselected = false; } } override void DetachFromOwner() @@ -477,7 +743,7 @@ Class SilverBullet : SWWMWeapon p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); p.target = self; - if ( t.Results.HitLine ) t.Results.HitLine.RemoteActivate(self,t.Results.Side,SPAC_Impact,t.Results.HitPos); + if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(self,t.Results.Side,SPAC_Impact,t.Results.HitPos); } for ( int i=0; i= invoker.default.clipcount ) + { + if ( invoker.fcbloaded ) + { + if ( (invoker.Ammo2.Amount >= invoker.Ammo2.MaxAmount) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + Spawn(invoker.AmmoType2,Vec3Angle(5,angle,height/2)); + else invoker.Ammo2.Amount = min(invoker.Ammo2.MaxAmount,invoker.Ammo2.Amount+1); + } + else + { + if ( (invoker.Ammo1.Amount >= invoker.Ammo1.MaxAmount) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + Spawn(invoker.AmmoType1,Vec3Angle(5,angle,height/2)); + else invoker.Ammo1.Amount = min(invoker.Ammo1.MaxAmount,invoker.Ammo1.Amount+1); + } + invoker.ClipCount = 0; + return; // no mag dropped + } + else + { + Class mac = invoker.fcbloaded?"SilverBullets2":"SilverBullets"; + MagAmmo ma = MagAmmo(FindInventory(mac)); + if ( !ma ) + { + ma = MagAmmo(Spawn(mac)); + ma.Amount = 0; + ma.AttachToOwner(self); + } + int maxgiveamt = min(ma.MaxAmount-ma.Amount,invoker.clipcount); + int dropamt = invoker.clipcount-maxgiveamt; + if ( dropamt > 0 ) ma.CreateTossable(dropamt); + ma.Amount = min(ma.MaxAmount,ma.Amount+invoker.clipcount); + if ( CheckLocalView() ) for ( int i=0; i<(invoker.clipcount-dropamt); i++ ) ma.PrintPickupMessage(true,ma.PickupMessage()); + ma.PlayPickupSound(self); + } + invoker.ClipCount = 0; Vector3 x, y, z; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),6*x-15*z); - let c = Spawn((invoker.clipcount>0)?"SilverBulletMag":"SilverBulletMagEmpty",origin); + let c = Spawn(invoker.fcbloaded?"SilverBulletMag2":"SilverBulletMag",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)); @@ -593,6 +980,22 @@ Class SilverBullet : SWWMWeapon } } + action void A_SwitchAmmoType( bool ifempty = false ) + { + bool oldsel = invoker.fcbselected; + if ( invoker.fcbselected && (invoker.Ammo1.Amount > 0) ) invoker.fcbselected = (ifempty&&(invoker.Ammo2.Amount>0))?true:false; + else if ( !invoker.fcbselected && (invoker.Ammo2.Amount > 0) ) invoker.fcbselected = (ifempty&&(invoker.Ammo1.Amount>0))?false:true; + if ( oldsel != invoker.fcbselected ) A_StartSound("misc/invchange",CHAN_WEAPONEXTRA,CHANF_UI|CHANF_LOCAL); + A_WeaponReady(WRF_NOFIRE); + } + action void A_AltHold() + { + A_WeaponReady(WRF_NOFIRE); + if ( player.cmd.buttons&BT_ALTATTACK ) return; + if ( invoker.zoomed ) player.SetPSPrite(PSP_WEAPON,invoker.FindState("ZoomReady")); + else player.SetPSPrite(PSP_WEAPON,invoker.fcbloaded?invoker.FindState("Ready2"):invoker.FindState("Ready")); + } + Default { Tag "$T_SILVERBULLET"; @@ -605,6 +1008,8 @@ Class SilverBullet : SWWMWeapon Stamina 400000; Weapon.AmmoType1 "SilverBulletAmmo"; Weapon.AmmoGive1 1; + Weapon.AmmoType2 "SilverBulletAmmo2"; + Weapon.AmmoGive2 0; SilverBullet.ClipCount 5; +SWWMWEAPON.NOFIRSTGIVE; +WEAPON.NO_AUTO_SWITCH; @@ -616,15 +1021,27 @@ Class SilverBullet : SWWMWeapon XZW1 A -1; Stop; Select: + XZW2 G 0 A_JumpIf(invoker.fcbloaded,"Select2"); XZW2 G 2 A_FullRaise(); XZW2 HIJKLMN 2; Goto Ready; + Select2: + XZW8 G 2 A_FullRaise(); + XZW8 HIJKLMN 2; + Goto Ready2; Ready: 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; + int flg = WRF_ALLOWRELOAD|WRF_ALLOWZOOM|WRF_ALLOWUSER1; + A_WeaponReady(flg); + if ( player.cmd.buttons&BT_ATTACK ) + invoker.CheckAmmo(EitherFire,true); + } + Wait; + Ready2: + XZW8 A 1 + { + int flg = WRF_ALLOWRELOAD|WRF_ALLOWZOOM|WRF_ALLOWUSER1; A_WeaponReady(flg); if ( player.cmd.buttons&BT_ATTACK ) invoker.CheckAmmo(EitherFire,true); @@ -633,36 +1050,45 @@ Class SilverBullet : SWWMWeapon 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; - if ( invoker.rezoom > 0 ) - { - flg |= WRF_NOSECONDARY; - invoker.rezoom--; - } + int flg = WRF_ALLOWRELOAD|WRF_ALLOWUSER1; + if ( invoker.rezoom > 0 ) invoker.rezoom--; + else flg |= WRF_ALLOWZOOM; A_WeaponReady(flg); if ( player.cmd.buttons&BT_ATTACK ) invoker.CheckAmmo(EitherFire,true); } Wait; + AltFire: + #### # 1 A_SwitchAmmoType(); + #### # 1 A_AltHold(); + 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)) ) + if ( !invoker.fired && (invoker.clipcount <= 0) && (sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true) || (invoker.Ammo1.Amount > 0) || (invoker.Ammo2.Amount > 0)) ) + { + A_SwitchAmmoType(true); return ResolveState("Reload"); + } return ResolveState("Cock"); } A_SilverFire(); invoker.fired = true; - return A_JumpIf(invoker.zoomed,"ZoomFire"); + if ( invoker.zoomed ) return ResolveState("ZoomFire"); + return A_JumpIf(invoker.fcbloaded,"Fire2"); } XZW2 OPQR 2; XZW2 STUVW 3; XZW2 A 1 A_JumpIf(invoker.specialf1<=0.,"Ready"); Wait; + Fire2: + XZW8 A 1; + XZW8 OPQR 2; + XZW8 STUVW 3; + XZW8 A 1 A_JumpIf(invoker.specialf1<=0.,"Ready2"); + Wait; Jet: TNT1 A 3 { @@ -695,10 +1121,10 @@ Class SilverBullet : SWWMWeapon { if ( invoker.zoomed ) { - invoker.dezoomstate = ResolveState("DoCock"); - return ResolveState("AltFireZoom"); + invoker.dezoomstate = invoker.fcbloaded?ResolveState("DoCock2"):ResolveState("DoCock"); + return ResolveState("UnZoom"); } - return ResolveState(null); + return invoker.fcbloaded?ResolveState("DoCock2"):ResolveState("DoCock"); } DoCock: XZW2 A 2 A_StartSound("silverbullet/meleestart",CHAN_WEAPON,CHANF_OVERLAP); @@ -709,8 +1135,12 @@ Class SilverBullet : SWWMWeapon A_StartSound("silverbullet/boltopen",CHAN_WEAPON,CHANF_OVERLAP); invoker.fired = false; if ( invoker.chambered ) - A_Overlay(PSP_WEAPON+1,"Casing"); + { + if ( invoker.fcbchambered ) A_Overlay(PSP_WEAPON+1,"Casing2"); + else A_Overlay(PSP_WEAPON+1,"Casing"); + } invoker.chambered = (invoker.clipcount>0); + if ( invoker.clipcount > 0 ) invoker.fcbchambered = invoker.fcbloaded; invoker.clipcount = max(0,invoker.clipcount-1); } XZW3 DEFG 2; @@ -718,17 +1148,45 @@ Class SilverBullet : SWWMWeapon XZW3 I 2 A_StartSound("silverbullet/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW3 JKLMNOPQR 2; Goto Ready; + DoCock2: + XZW8 A 2 A_StartSound("silverbullet/meleestart",CHAN_WEAPON,CHANF_OVERLAP); + XZW8 XYZ 2; + XZW9 AB 2; + XZW9 C 2 + { + A_StartSound("silverbullet/boltopen",CHAN_WEAPON,CHANF_OVERLAP); + invoker.fired = false; + if ( invoker.chambered ) + { + if ( invoker.fcbchambered ) A_Overlay(PSP_WEAPON+1,"Casing2"); + else A_Overlay(PSP_WEAPON+1,"Casing"); + } + invoker.chambered = (invoker.clipcount>0); + if ( invoker.clipcount > 0 ) invoker.fcbchambered = invoker.fcbloaded; + invoker.clipcount = max(0,invoker.clipcount-1); + } + XZW9 DEFG 2; + XZW9 H 2 A_StartSound("silverbullet/boltclose",CHAN_WEAPON,CHANF_OVERLAP); + XZW9 I 2 A_StartSound("silverbullet/meleeend",CHAN_WEAPON,CHANF_OVERLAP); + XZW9 JKLMNOPQR 2; + Goto Ready2; Casing: XZW7 DE 2; XZW7 FGHIJKLMNO 1; TNT1 A 0 A_DropCasing(); Stop; + Casing2: + XZWD DE 2; + XZWD FGHIJKLMNO 1; + TNT1 A 0 A_DropCasing(true); + Stop; ZoomFire: TNT1 A 24; TNT1 A 1 A_JumpIf(invoker.specialf1<=0.,"ZoomReady"); Wait; - AltFire: - XZW2 A 0 A_JumpIf(invoker.zoomed,"AltFireZoom"); + Zoom: + XZW2 A 0 A_JumpIf(invoker.zoomed,"UnZoom"); + XZW2 A 0 A_JumpIf(invoker.fcbloaded,"Zoom2"); XZW2 A 2 { A_StartSound("silverbullet/zoomstart",CHAN_WEAPON,CHANF_OVERLAP); @@ -741,7 +1199,7 @@ Class SilverBullet : SWWMWeapon invoker.zoomlevel = clamp(invoker.zoomlevel*1.05+.05,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) ) + if ( !(player.cmd.buttons&BT_ZOOM) ) { invoker.rezoom = 3; return ResolveState("ZoomReady"); @@ -749,7 +1207,30 @@ Class SilverBullet : SWWMWeapon return ResolveState(null); } Wait; - AltFireZoom: + Zoom2: + XZW8 A 0 A_JumpIf(invoker.zoomed,"UnZoom2"); + XZW8 A 2 + { + A_StartSound("silverbullet/zoomstart",CHAN_WEAPON,CHANF_OVERLAP); + invoker.zoomlevel = 0; + } + XZW9 STUVWX 1; + TNT1 A 1 + { + invoker.zoomed = true; + invoker.zoomlevel = clamp(invoker.zoomlevel*1.05+.05,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_ZOOM) ) + { + invoker.rezoom = 3; + return ResolveState("ZoomReady"); + } + return ResolveState(null); + } + Wait; + UnZoom: + XZW3 X 0 A_JumpIf(invoker.fcbloaded,"UnZoom2"); XZW3 X 1 { A_StartSound("silverbullet/zoomend",CHAN_WEAPON,CHANF_OVERLAP); @@ -770,13 +1251,36 @@ Class SilverBullet : SWWMWeapon return ResolveState(null); } Goto Ready; + UnZoom2: + XZW9 X 1 + { + A_StartSound("silverbullet/zoomend",CHAN_WEAPON,CHANF_OVERLAP); + invoker.zoomed = false; + invoker.zoomlevel = 0; + A_ZoomFactor(1.,ZOOM_INSTANT); + } + XZW9 YZ 1; + XZWA ABC 1; + XZW8 A 0 + { + if ( invoker.dezoomstate ) + { + State tmp = invoker.dezoomstate; + invoker.dezoomstate = null; + return tmp; + } + return ResolveState(null); + } + Goto Ready2; Reload: XZW2 A 0 { + if ( ((invoker.clipcount >= invoker.default.clipcount) && (invoker.fcbselected == invoker.fcbloaded)) || (!sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) && (invoker.Ammo1.Amount <= 0) && (invoker.Ammo2.Amount <= 0)) ) + return ResolveState("Idle"); if ( invoker.zoomed ) { - invoker.dezoomstate = ResolveState("Unload"); - return ResolveState("AltFireZoom"); + invoker.dezoomstate = invoker.fcbloaded?ResolveState("Unload2"):ResolveState("Unload"); + return ResolveState("UnZoom"); } return ResolveState(null); } @@ -797,30 +1301,68 @@ Class SilverBullet : SWWMWeapon XZW4 U 2 A_StartSound("silverbullet/magout",CHAN_WEAPON,CHANF_OVERLAP); XZW4 VWXY 2; Goto Load; + Unload2: + XZW8 A 2 + { + A_PlayerReload(); + A_StartSound("silverbullet/meleestart",CHAN_WEAPON,CHANF_OVERLAP); + return A_JumpIf(invoker.clipcount<=0,"UnloadEmpty"); + } + XZWA DEFGHI 2; + XZWA J 2 A_StartSound("silverbullet/magout",CHAN_WEAPON,CHANF_OVERLAP); + XZWA KLMN 2; + Goto Load; + UnloadEmpty2: + XZW8 A 2; + XZWA OPQRST 2; + XZWA U 2 A_StartSound("silverbullet/magout",CHAN_WEAPON,CHANF_OVERLAP); + XZWA VWXY 2; + Goto Load; Load: XZW4 Z 2 { A_DropMag(); + return A_JumpIf(invoker.fcbselected,"Load2"); + } + XZW5 ABC 2; + XZW5 D 2 + { + invoker.fcbloaded = false; invoker.clipcount = invoker.default.clipcount; if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1); + A_SwitchAmmoType(true); + A_StartSound("silverbullet/magin",CHAN_WEAPON,CHANF_OVERLAP); } - 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: + Load2: + XZWA Z 2; + XZWB ABC 2; + XZWB D 2 + { + invoker.fcbloaded = true; + invoker.clipcount = invoker.default.clipcount; + if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + invoker.Ammo2.Amount = max(0,invoker.Ammo2.Amount-1); + A_SwitchAmmoType(true); + A_StartSound("silverbullet/magin",CHAN_WEAPON,CHANF_OVERLAP); + } + XZWB E 2 A_StartSound("silverbullet/meleeend",CHAN_WEAPON,CHANF_OVERLAP); + XZWB FGHIJKLMN 2; + Goto Ready2; + Idle: XZW2 A 0 { if ( invoker.zoomed ) { - invoker.dezoomstate = ResolveState("DoZoom"); - return ResolveState("AltFireZoom"); + invoker.dezoomstate = invoker.fcbloaded?ResolveState("DoIdle2"):ResolveState("DoIdle"); + return ResolveState("UnZoom"); } - return ResolveState(null); + return invoker.fcbloaded?ResolveState("DoIdle2"):ResolveState("DoIdle"); } - DoZoom: + DoIdle: XZW2 A 2 { A_StartSound("silverbullet/idle",CHAN_WEAPON,CHANF_OVERLAP); @@ -832,15 +1374,27 @@ Class SilverBullet : SWWMWeapon XZW6 ABCD 4; XZW6 EFGH 3; Goto Ready; + DoIdle2: + XZW8 A 2 + { + A_StartSound("silverbullet/idle",CHAN_WEAPON,CHANF_OVERLAP); + A_PlayerCheckGun(); + } + XZWB OPQR 3; + XZWB STUV 2; + XZWB WXYZ 3; + XZWC ABCD 4; + XZWC EFGH 3; + Goto Ready2; User1: XZW2 A 0 { if ( invoker.zoomed ) { - invoker.dezoomstate = ResolveState("DoUser1"); - return ResolveState("AltFireZoom"); + invoker.dezoomstate = invoker.fcbloaded?ResolveState("DoUser12"):ResolveState("DoUser1"); + return ResolveState("UnZoom"); } - return ResolveState(null); + return invoker.fcbloaded?ResolveState("DoUser12"):ResolveState("DoUser1"); } DoUser1: XZW2 A 2 @@ -859,21 +1413,43 @@ Class SilverBullet : SWWMWeapon XZW6 VWXYZ 3; XZW7 ABC 2; Goto Ready; + DoUser12: + XZW8 A 2 + { + A_StartSound("silverbullet/meleestart",CHAN_WEAPON,CHANF_OVERLAP); + A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); + A_PlayerMelee(); + } + XZWC IJK 3; + XZWC L 1 A_Parry(9); + XZWC MN 1; + XZWC O 1 A_Melee(90,"demolitionist/whitl",1.6); + XZWC PQ 1; + XZWC RST 2; + XZWC U 3 A_StartSound("silverbullet/meleeend",CHAN_WEAPON,CHANF_OVERLAP); + XZWC VWXYZ 3; + XZWD ABC 2; + Goto Ready2; Deselect: XZW2 A 0 { if ( invoker.zoomed ) { - invoker.dezoomstate = ResolveState("DoDeselect"); - return ResolveState("AltFireZoom"); + invoker.dezoomstate = invoker.fcbloaded?ResolveState("DoDeselect2"):ResolveState("DoDeselect"); + return ResolveState("UnZoom"); } - return ResolveState(null); + return invoker.fcbloaded?ResolveState("DoDeselect2"):ResolveState("DoDeselect"); } DoDeselect: XZW2 A 2 A_StartSound("silverbullet/deselect",CHAN_WEAPON,CHANF_OVERLAP); XZW2 BCDEF 2; XZW2 G -1 A_FullLower(); Stop; + DoDeselect2: + XZW8 A 2 A_StartSound("silverbullet/deselect",CHAN_WEAPON,CHANF_OVERLAP); + XZW8 BCDEF 2; + XZW8 G -1 A_FullLower(); + Stop; Flash: XZWZ A 2 Bright {