diff --git a/ENDSWWM.bin b/ENDSWWM.bin
index c3b22c4a2..7dc097d97 100644
Binary files a/ENDSWWM.bin and b/ENDSWWM.bin differ
diff --git a/FuturePlans.md b/FuturePlans.md
index 807186b14..eb36efda7 100644
--- a/FuturePlans.md
+++ b/FuturePlans.md
@@ -1,18 +1,8 @@
This is just a bit of *"future planning"* for stuff that I ***might*** add later on.
-## 1.2 update *(A Needed Change)*:
-
-I REALLY need to do this, it's starting to become very problematic to maintain the Demolitionist Menu as-is.
-
-* **Demolitionist Menu Refactor:**
- - Non 16:10 ratio support
- - Smooth scrolling, better mouse input
- - Much cleaner code, easier maintenance and extension
- - Modular design, add-on tab support
-
## 1.3 update *(The Second Batch)*:
-More weapons, because we need 'em.
+More weapons, because we need 'em. In addition, all the "easy to implement" minigames, because the rest can wait until 1.5.
* **DLC Weaponset:**
- [1] Itamex Reinforced Hammer *(UnSX 5)*
@@ -27,70 +17,91 @@ More weapons, because we need 'em.
- Dakka *(Fire the Sheen HMG for one minute straight)*
- [6] Quadravol *(UnSX)*
- Gravely Roast *(Perform 50 bayonet combos with the Quadravol)*
- - [7] Blackfire Igniter *(UnSX 5, Ultra Suite 3)*
- - Ice Ice Baby *(Impale 40 enemies with the Blackfire Igniter secondary)*
- - [8] Rail Carbine *("Tesla Beamer" in Ultra Suite 2 & 3)*
- - John Romero's Curse *(Fry yourself by discharging an electric weapon in water)*
- - [9] Ray-Khom *(UnSX)*
- - The Most Silent Takedown *(Kill 30 enemies with the Ray-Khom primary without alerting them)*
- - [0] Grand Lance *(SWWM Iridium)*
- - Penetrator *(Strike through 20 enemies in a row with a single Grand Lance secondary)*
-
-## 1.4 update *(Arsenal Appendix)*:
-
-A couple extra weapons, not enough for a full batch, but still worthy additions.
-
-* **DLC Weaponset 2:**
- - [1] Hand of Divine *(Total Madness)*
- - Facepunching Extraordinaire *(Kill 300 enemies with the Hand of Divine)*
- [7] Sparkster x3 *(UnSX 2)*
- A Fine Sparking *(Kill 30 enemies at once with a Sparkster Rifle combo shot)*
- - [9] Mortal Rifle *(UnSX 2)*
+ - [8] Mortal Rifle *(UnSX 2)*
- Railed Hard *(Shoot through 16 enemies with a single Mortal Rifle overpressure shot)*
+ - [9] Ray-Khom *(UnSX)*
+ - The Most Silent Takedown *(Kill 30 enemies with the Ray-Khom primary without alerting them)*
+ - John Romero's Curse *(Fry yourself by discharging an electric weapon in water)*
- [0] Rafan-Kos *(UnSX 4)*
- Blasting Ropes *(Melt a grand total of 1000 enemies with the Rafan-Kos)*
+* **Minigames:**
+ - Tetris
+ - Breakout
+ - Snake
+ - Minesweeper
+ - Solitaire
+* **Additional Voice Acting:**
+ - Extra lines for item pickups/usage
+ - Additional taunts and others
+ - Reactions to hurtfloor damage
+ - Caco petting
+ - Explosion lines
+ - Lead ball crit lines
+ - Buttslam lines
+* **Additional Collectibles:**
+ - Saya's Mug
+
+## 1.4 update *(Fine Refinements)*:
+
+Re-animation of old FK models. Plus extra score incentives and achievements.
+
+* **Re-animate all base models with IK *(important for consistency)***
+* **Additional Score Bonuses:**
+ - Double-Cheeked *(Buttslam kill, 1.5x)*
+ - Mixup *(Different weapon between kills, +200, add +50 with each switch, 10 second cooldown)*
+ - Unseen *(Kill an enemy without a line of sight to yourself, +300)*
+ - Aerial *(Kill an enemy while in mid-air, +500)*
+ - YEET *(Kill a non-flying enemy while it's in the air, AFTER you sent it flying, +1000)*
+ - OVERWRITE *(Telefrag an enemy, overrides OVERKILL bonus, 4x)*
+ - Revenge *(Kill the enemy that killed you within 30 seconds of reviving, 3x)*
+ - Longshot *(Kill an enemy from over 2000 map units away, +600, add +100 for each extra 1000 map units)*
+ - Redirect *(Kill an enemy with another enemy's projectile, +900)*
+* **Additional Achievements:**
+ - Spicy Tennis *(Parry a thrown Explodium Mag)*
+ - Pachinko Code *(Find the Secret Menu)*
+ - Double Succ *(Merge two Ynykron singularities)*
+ - The Ultimate Combo *(Hit a Ynykron singularity with a Ynykron beam)*
+ - Author Appeal *(Smooch a boss brain)*
+ - Power of Love *(Recover a total of 500 health by kissing the Kirin Plush)*
+ - Arsenal of Olden Times *(Find all classic UnSX weapons)*
+ *(Quadravol, Biospark Carbine, Sparkster Rifle, Ray-Khom, Mortal Rifle, Ynykron, Rafan-Kos and K79-D)*
+ *(The K79-D was turned into the generic cube, so it still counts)*
+ - Know Thy Armaments *(Find all weapons)*
+ - Assortment of Thingamajigs *(Find all items)*
+ - Words Words Words *(Read 100 library entries)*
+ - Oops I Pressed It *(Turn the engine off)*
+ - Dangerous Ball Action *(Knock yourself out with your own lead ball)*
+ - Total Ball Destruction *(Kill the Icon of Sin with a lead ball)*
+ - Say The Line Vinny *(Spin attack with the Itamex Hammer for 60 seconds)*
+ - Whateverbuster *(Use the Wallbuster shuffle function 100 times)*
## 1.5 update *(The Final Stage)*:
All the hard stuff *(some of these aren't guaranteed)*.
* **DLC Gameset:**
- - Tetris
- - Pong
- - Snake
- **[Doom]** Demo Land Adventure *(platformer with shooty gameplay)*
- **[Heretic]** Interstellar Demolitionist *(a somewhat simple vertical SHMUP, kinda Touhou styled)*
- **[Hexen]** Demolition Quest *(a JRPG, kinda like early FF / BoF)*
* **Mothgirl summon for Lämp easter egg**
- Layers of White *(Summon the White Lady)*
-* **Replace all hitscan with *"light projectiles"***
-* **Crouch sliding *(+ proper crouch dashing)***
-* **Expand third person animations**
- - 4-directional movement variants
- - Height-dependent headpats (current animation was designed for dogs on same floor)
-* **Additional gestures + gesture menu**
- - Clap
- - The Bird
- - How Very Brutal *(Flip off 20 enemies)*
- - Thumbs Down
- - Giggle
- - Shrug
- - Beckon
+ - Fluffy Moth *(Pet the White Lady 50 times)*
+ - Ara Ara *(Have the White Lady kill a total of 100 enemies)*
* **Photo Mode**
- Dedicated poses
- Stickers
-* **Virtual Training Map**
+* ***(Maybe)* Virtual Training Map**
- Featuring Maidbot as assistant
## Unspecified
-Things that I'm unsure whether or not they'll be made.
+Things that I'm unsure when will be added *(or if they can be added)*.
-* **Japanese localization???**
-* ***(Maybe)* Fake livestream chat overlay, with dynamic reactions to all sorts of stuff**
* **Customized cluster text stuff if that ever gets scriptified**
* **Official Sunder support *(when the WAD is complete)***
-* **Original English Voice Acting**
+* **Gib models *(May happen by 1.3, hopefully)***
## Other Projects
@@ -98,36 +109,36 @@ Add-ons and other related stuff.
* **Monster/decoration replacements add-on:**
- Potentially standalone, usable with other mods
- - Balanced for this mod
+ - Balanced for this mod, as well as the side mods
- Unique bosses
- Some extra enemy variants
- Coverage for all supported WADs *(oof)*
-* **Ibuki side mod *(Red Oni):***
+* **Ibuki side mod *(Red Oni)*:**
- A more *"mundane"* arsenal
- Featuring a very big girl with very big... Assets
- - Possibly will have its own DLC Weaponset too
- - Featuring a toggleable companion
- - Nudity, in a Doom mod? Wow, never seen that one before
- - This one's surprisingly meant to be more of a power trip than SWWM GZ
-* **Saya side mod *(Red-Eyed Rampage)***
+ - Slightly more *"grounded"*, but still powerful
+ - See, I got tired of playing modded Fallout 4 so...
+* **Saya side mod *(Red-Eyed Rampage)*:**
- The first mod where you play as a mere squishy person
- - Spellcasting!
- - A more interesting take on "infinite lives"
+ - Even more fun weapons, including one made by a god!
+ - Spellcards!
+ - A more interesting take on *"infinite lives"*
- Featuring the Pancor Jackhammer *(lol)*
-* **[Hexen]** **Kirin side mod *(Red Star of Innocence)***
+* **Kirin side mod *(Red Star of Innocence)*:**
- Finally, you get to play as the precious femboy emperor
+ - Anarukon firearms? Anarukon firearms
- Designed entirely for Hexen's funky gameplay™
- Watch as our boy complains about *"puzzles"*
- Some unique touches to spice things up
- Basically a lite version of what you could expect in **UNDEATH**
-* ***(Maybe)* Hardcore Mode sub-mod:**
- - Featuring Demolitionist on Maidbot frame
- - More complex game mechanics
- - Manual Hammerspace management
- - Manual reloading and weapon maintenance
- - Alternate mobility options *(no jetpack)*
- - Non-instant item usage
-* **Official Campaign:**
+* **Marisa side mod *(Child of Ash)*:**
+ - An unexpected character turns up, Ibuki's very adventurous roommate
+ - What happens when an actual, full-on Anarukon warrior decides to join the fight
+ - Big focus on melee, as well as quick spellcasting
+ - Featuring a summonable AI companion
+ - Basically even more of what **UNDEATH** will feature
+* **Official Game *(VOID - The Dark Alliance)*:**
- Retell the events of UnSX 2 *(but with the Demolitionist's participation)*
- - Basically give SWWM GZ its own IWAD as a standalone game
+ - Basically give the Demolitionist their own standalone game
- Some new weapons, some renovations
+ - Lots of world exploration, more lore
diff --git a/LICENSE.code b/LICENSE.code
index 4317721b1..4190e6460 100644
--- a/LICENSE.code
+++ b/LICENSE.code
@@ -1,4 +1,4 @@
-Copyright (c) 2020-2021 Marisa Kirisame, UnSX Team
+Copyright (c) 2020-2022 Marisa Kirisame, UnSX Team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/LOCALIZATION.md b/LOCALIZATION.md
index d8c33c48f..e0a6c903f 100644
--- a/LOCALIZATION.md
+++ b/LOCALIZATION.md
@@ -1,4 +1,4 @@
-# Notes on localizing SWWM GZ
+# Notes on localizing this mod
There are two parts to this:
@@ -16,6 +16,10 @@ In regards to what should and should not be localized, this will be noted in com
Each entry must have only one of each TAG, TAB and REL section, and at least one TXT section. When localizing, DO NOT copy the TAB and REL sections, as these are for internal use and mustn't be translated, instead handle only the TAG and TXT sections.
+## Font support
+
+Both fonts in use fully support Latin, Greek and Cyrillic scripts.
+
## Language codes
-For a list of these, consult the ZDoom wiki article for [LANGUAGE](https://zdoom.org/wiki/LANGUAGE#Language_codes).
\ No newline at end of file
+For a list of these, consult the ZDoom wiki article for [LANGUAGE](https://zdoom.org/wiki/LANGUAGE#Language_codes).
diff --git a/README.md b/README.md
index a28c0cafb..0a3975544 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,12 @@
-## Some Weird Weapons Mod ~ GZDoom Edition

-**SWWM GZ** brings to **GZDoom** a "best of" collection of custom weapons I've made for **Unreal Tournament**, plus many new things that didn't make the cut there. It is also effectively a reboot of the entire **SWWM** series, which unfortunately ended with the cancelled **SWWM Z**, this mod's direct predecessor.
+---
+
+## The Introduction
+
+**Codename: Demolitionist** is an all-original gameplay mod for **GZDoom** with a basis on rapid, fluid movement mechanics as well as very satisfying, punchy, strong weaponry. In it, you play as the titular **Demolitionist**, a robot with quite a personality, who's destined to save the day, as explosively as necessary.
+
+The mod's arsenal could be seen as a *"best of"* collection of custom weapons I've made for **Unreal Tournament**, plus many new things that didn't make the cut there. It is also effectively a reboot of the entire **Some Weird Weapons Mod *(SWWM)*** series, which unfortunately ended with the cancelled **SWWM Z**, this mod's direct predecessor *(hence this project originally starting its days under the name of **SWWM GZ**)*.
It contains weapons and items remastered and revived from old projects such as the previous **SWWM** entries, along with the **Zanaveth Ultra Suite** side project, and also notably, the main **UnSX** series that never truly saw the light of day, as all work done on it so far has been lost forever. There may also be some original things here and there just to spice things up.
@@ -13,7 +18,7 @@ Hope you have fun exploding demon knees.
— *Marisa*
-## Disclaimers
+## The Disclaimers
This mod features loud sounds and flashing lights, which may be harmful to certain people. There are options to dampen some of these effects, but it may still be unsafe nonetheless.
@@ -21,34 +26,34 @@ The UI design and color schemes of the mod may be problematic to people with col
The characters and stories featured in this mod are part of my own personal lore. Any similarities to real world individuals or events are entirely coincidental or, in some cases, loosely referential.
-The mod's overarching story and themes often tackle topics of world politics, economy, human rights and others. No work of fiction is free of politics, especially those that reflect the author's own beliefs. If you feel discomfort from political views opposite to your own, this may not be for you (especially if you're right-leaning/conservative).
+The mod's overarching story and themes often tackle topics of world politics, economy, human rights and others. No work of fiction is free of politics, especially those that reflect the author's own beliefs. If you feel discomfort from political views opposite to your own, this may not be for you *(especially if you're right-leaning/conservative)*.
-The mod contains certain sexual undertones (or overtones in the story itself). Some parts could be considered explicit in nature, so please take this with a grain of salt. You've been warned: The mod *IS* horny (and so am I, as its author).
+The mod contains certain sexual undertones *(or overtones in the story itself)*. Some parts could be considered explicit in nature, so please take this with a grain of salt. You've been warned: The mod *IS* horny *(and so am I, as its author)*.
This mod is not compatible with **Brutal Doom** for obvious reasons. If you want to combine both, use the "Monsters Only" version of it, but do note that some glitches may still happen.
This mod is, funny enough, readily compatible with **H-Doom**. You will not be able to engage in erotic acts with the demon girls, however, but they will be very vulnerable to kisses and headpats.
-## The Player
+## The Demolitionist

You are an **Akari Labs Demolitionist Bot**, one of the very first units, fresh off the factory. You are the company's greatest achievement in AI-controlled combat units, trained to efficiently use all sorts of weaponry, built with premium quality armor plating and robust but flexible joints. In order to show off your capabilities, your creator has decided to send you out to fight the demonic invasion brought upon by *"those big stinkin' idiots at the **UAC**"*. Your time has come to kick ass and blow 'em up.
Additional features:
- - **Glowing color tags:** Located around various parts of your body, allows quick and easy differentiation between multiple units (color not directly configurable due to *engine limitations™*).
- - **Lucky Collar:** A little something that your creator gives to all of her creations. Reduces incoming damage by 75% when you're below 25% health. Plus an additional 50% reduction to any damage from your own weapons.
- - **High-Resonant Almasteel Plating:** Your chassis is built from one of the hardest alloys known across the universe. Thus, your body is practically indestructible, but not impervious to damage. All splash damage is reduced by 80%, and you only take half damage from crushers (and may cause them to break, permanently).
+ - **Glowing color tags:** Located around various parts of your body, allows easy signaling and identification of the unit's presence in darker areas.
+ - **Lucky Collar:** A little gift from your creator, to keep you safe. Reduces incoming damage by 75% when you're below 25% health. Plus an additional 50% reduction to any damage from your own weapons.
+ - **High-Resonant Almasteel Plating:** Your chassis is built from one of the hardest alloys known across the universe. Thus, your body is practically indestructible, but not impervious to damage. All splash damage is reduced by 80%, and you only take half damage from crushers *(and may cause them to break, permanently)*.
- **User Menu:** With the press of a button, open a dedicated menu to see all your stats in detail, info on carried items and weapons, check out a grand library of information on things you come across, and access the store for buying extra items with your score points.
- **Magnetic Utility Belt:** Holds important equipment tightly, and is also the secret to how you can reload some weapons so damn fast.
- **Keychain:** A lil' something to bring some extra good luck charms with you.
- **Pocket Hammerspace™ containers:** These will store and deploy items on demand, along with keeping hold of any keys you find. The capacity for ammo storage can be increased by finding **Hammerspace™ Embiggener** modules.
- **Forx JetBurst™ Impulsors:** Can be used for quick dashes in any direction, or even for short bursts of flight.
- - **Impact Absorption Boots:** Will negate any and all fall damage, and also allow extra boosts of speed to chained jumps (i.e.: bunnyhopping).
+ - **Impact Absorption Boots:** Will negate any and all fall damage, and also allow extra boosts of speed to chained jumps *(i.e.: bunnyhopping)*.
- **Targetting Array:** Tracks nearby foes and provides basic information on their health. Compatible with **Omnisight™** mapping modules for tracking key items and nearby exits. Can also highlight nearby pickups by holding a dedicated button.
- **Akari Labs CuteEmotion™ Display:** Equipped onto your visor to show a wide range of predefined facial expressions in order to convey simple emotions to others.
- - **Akari Labs LoudBoi™ Voicebox:** Allows you to 🇪 🇲 🇮 🇹. Easily moddable to allow alternate voicepack add-ons. Note that the default voice is in Japanese, but subtitles will be provided when needed.
- - **On-demand Item Obtainers:** AKA "hands". You can pick up the mod's items from a distance by pressing Use (this is mainly a workaround for any quirks that might come from them having modified collision).
+ - **Akari Labs LoudBoi™ Voicebox:** Allows you to **EMIT**. Easily moddable to allow alternate voicepack add-ons *(If someone were to make them)*. Your usual voice is quite robotty, due to a built-in filter.
+ - **On-demand Item Obtainers:** AKA "hands". You can pick up the mod's items from a distance by pressing Use *(this is mainly a workaround for any quirks that might come from them having modified collision)*.
**Note:** Since you're a robutt you pretty much can swim indefinitely and are also immune to poison.
@@ -63,7 +68,7 @@ All weapons also have a quick melee attack using the **Weapon State 1** button,
If a weapon has no actions on either the reload or zoom buttons, it may be replaced with some special idle action, such as spinning or fiddling around with it.
-For now, the following are all weapons planned for the first release. More will be added afterwards, in a future update (oh boy).
+For now, the following are all weapons available. More will be added afterwards, in future updates *(oh boy)*.
### Deep Impact (slot 1) ~ Replaces Fist, Staff, Hexen starting weapons

@@ -147,7 +152,7 @@ A ludicrously overkill weapon, courtesy of the always-overkill **Blackmann Arms*
- While loading shells, you can cancel by holding the reload button.
- For a skilled combat robot like you, reloading this should be very fast. 10 seconds tops, for all 25 barrels.
-People like to nickname it the ***"Ballbuster"***. You'll see why.
+Should you make use of its multi-fire functionality, you will soon learn why it bears the name of ***"Wallbuster"***.
### Eviscerator (slot 5) ~ Replaces Chaingun, Dragon Claw, Quietus (hilt)

@@ -158,14 +163,14 @@ The pleasure of shrapnel spamming. Make hot steaming pain rain upon your enemies
**Secondary fire:** Launch the entire shell. Hot lead will be deployed wherever it hits.
-**Tertiary fire (Zoom):** Toggle between wide spread (default) and tight spread for primary. Apart from that, also affects the effective range of the secondary fire, allowing you to lob these bombs farther away.
+**Tertiary fire (Zoom):** Toggle between wide spread *(default)* and tight spread for primary. With a tighter spread, chunks will be closer together and reach higher speeds, but bounce more erratically. In addition, lobbed shells will also go much farther.
This weapon made the **Unreal Engine** cry, so **GZDoom** may suffer a lot too.
### Eviscerator shells ~ Replaces Ammo Box, Claw Orb

-Little bundles of fun (in hot lead form) found either as single units (sometimes bunched up) or six-packs. There is no explanation for why they have an **owo** face scribbled on.
+Little bundles of fun (in hot lead form) found either as single units *(sometimes bunched up)* or six-packs. There is no explanation for why they have an **OwO** face scribbled on.
### Hellblazer (slot 6) ~ Replaces Rocket Launcher, Phoenix Rod, Hammer of Retribution

@@ -176,7 +181,7 @@ Another signature weapon of the **SWWM** series. This time in its third and far
**Secondary fire:** Lob the rocket as a grenade that will bounce around. Hold to load up to 2 additional grenades, then release for burst fire. You can tap the primary fire button at any time to cancel the preload and go straight to holding.
-**Tertiary fire (Zoom):** Change the ammo type, there are four options (see ammo section below). While holding rockets, tap to select seek targets.
+**Tertiary fire (Zoom):** Change the ammo type, there are four options *(see ammo section below)*. While holding rockets, tap to select seek targets.
**Reload:** Obviously does what you'd expect. If you're holding rockets and have targets locked on, tap to clear.
@@ -215,19 +220,19 @@ Ammunition for the Biospark Carbine. They contain a lot of energy, despite the s
### Silver Bullet JET (slot 8) ~ Replaces Plasma Rifle, Hellstaff, Arc of Death

-The definitive model of **Blackmann Arms**'s legendary **Silver Bullet** series. A lighter (43kg), lower caliber (1.150) variant of the former 1.350 **BEHEMOTH** model, discontinued due to being seen as too impractical.
+The definitive model of **Blackmann Arms**'s legendary **Silver Bullet** series. A lighter *(43kg)*, lower caliber *(1.150)* variant of the former 1.350 **BEHEMOTH** model, discontinued due to being seen as too impractical *(it was full auto, no, really)*.
**Primary fire:** Shoot the bullet. A second press chambers another round.
-**Secondary fire:** On tap, picks the ammo for the next reload. On hold, also tap primary to manually cock (in case you want to eject unfired rounds).
+**Secondary fire:** On tap, picks the ammo for the next reload. On hold, also tap primary to manually cock *(in case you want to eject unfired rounds)*.
-**Reload:** Reload (what else is new) or switch ammo types.
+**Reload:** Reload *(what else is new)* or switch ammo types.
-**Zoom:** Press and hold to enter scoped mode. Release to pick the desired zoom level (can go up to 16x). Press again to exit scoped mode.
+**Zoom:** Press and hold to enter scoped mode. Release to pick the desired zoom level *(can go up to 16x)*. Press again to exit scoped mode.
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 can potentially deal damage to yourself if you don't have any armor, so be careful.
-Note that going prone (crouching) will automatically disable the recoil compensators, increasing the potential damage of the bullets, but also reducing your mobility.
+Note that going prone *(crouching)* will automatically disable the recoil compensators, increasing the potential damage of the bullets, but also reducing your mobility.
### 1.150 XSB Bullets ~ Replaces Cells, Runes

@@ -246,15 +251,15 @@ Same spawn conditions as the standard bullets.
### Candy Gun (slot 9) ~ Replaces BFG9000, Firemace, Bloodscourge (stub)

-Coming from an old unreleased weapon mini-mod, the **Candy Gun** is like an **Explodium Gun** on steroids (or more specifically, on strawberry candy and pop rocks).
+Coming from an old unreleased weapon mini-mod, the **Candy Gun** is like an **Explodium Gun** on steroids *(or more specifically, on strawberry candy and pop rocks)*.
**Primary fire:** Explosive candy bullets. The blasts are a tasty treat of pain.
-**Secondary fire:** Like its weaker counterpart, the mag is armed and yeeted with extreme prejudice.
+**Secondary fire:** Like its weaker counterpart, the mag is armed and yeeted with extreme prejudice *(you cannot perform this action if you have no more ammo left)*.
**Reload:** Does what you'd expect.
-Holding secondary fire and primary fire (in that order) will throw the weapon itself, 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 (up to four).
+Holding secondary fire and primary fire *(in that order)* will throw the weapon itself, 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 *(up to four)*.
### Candy Gun Bullets ~ Replaces Cells, Runes

@@ -274,9 +279,9 @@ Popularly known as the ***"Death Cannon"***. One of the four ultimate weapons co
**Reload:** If charging, cancel the charge. Ammo will not be wasted, but it will have to vent for a while longer than after firing normally. If the ammo was spent, reloads as usual.
-Unlike its previous incarnation in **SWWM Platinum**, this one doesn't have such an obscene pre-fire delay, so it's much easier to land a shot (not to mention also being far more lethal, thanks to the added chain reaction effect).
+Unlike its previous incarnation in **SWWM Platinum**, this one doesn't have such an obscene pre-fire delay, so it's much easier to land a shot *(not to mention also being far more lethal, thanks to the added chain reaction effect)*.
-Due to its rarity, you can't buy it from the store, so you gotta find one (and only one) in the field.
+Due to its rarity, you can't buy it from the store, so you gotta find one *(and only one)* in the field.
### Crystal Box ~ Replaces Cell Pack, Greater Rune

@@ -290,9 +295,9 @@ These spawn VERY rarely and, like the weapon that uses them, you can't buy them
Of course, one cannot go without little helpers along their journey.
-Healing items restore health (duh), armor items do exactly what you'd expect, and then there's all the various powerups that grant you useful abilities.
+Healing items restore health *(duh)*, armor items do exactly what you'd expect, and then there's all the various powerups that grant you useful abilities.
-All of these can be carried in your inventory indefinitely before use, except in deathmatch, where they're activated immediately. Healing items are automatically used whenever possible (with the lowest tier healing items taking priority). Armor is immediately carried if you don't have any of that type on you, or if your existing armor drains and you have a spare. Most powerups can be toggled, unless specified otherwise.
+All of these can be carried in your inventory indefinitely before use, except in deathmatch, where they're activated immediately. Healing items are automatically used whenever possible *(with the lowest tier healing items taking priority)*. Armor is immediately carried if you don't have any of that type on you, or if your existing armor drains and you have a spare. Most powerups can be toggled, unless specified otherwise.
### Health Nugget ~ Replaces Health Bonus, Timebomb of the Ancients, Disc of Repulsion, Flechette, Mystic Ambit Incant

@@ -312,12 +317,12 @@ All of these can be carried in your inventory indefinitely before use, except in
### Refresher ~ Replaces Soulsphere, Mystic Urn

-This artifact provides a +100 health boost plus a regeneration effect that heals +10 every 5 seconds, for up to 50 seconds, thus it doubles as a powerup. Its overhealing effects cap at 500 points (including the regen). Once its effects wear out, however, your excess health will gradually settle towards the typical 200 point cap. Unlike other health items, the **Refresher** auto-activates only if you're about to die. This usually prevents such a grim outcome... unless the damage is too high to counter.
+This artifact provides a +100 health boost plus a regeneration effect that heals +10 every 5 seconds, for up to 50 seconds, thus it doubles as a powerup. Its overhealing effects cap at 500 points *(including the regen)*. Once its effects wear out, however, your excess health will gradually settle towards the typical 200 point cap. Unlike other health items, the **Refresher** auto-activates only if you're about to die. This usually prevents such a grim outcome... unless the damage is too high to counter.
### Armor Nugget ~ Replaces Armor Bonus, Timebomb of the Ancients, Disc of Repulsion, Flechette, Mystic Ambit Incant

-Cumulative armor items that can increase resistance to all damage by as much as you can find. Each nugget adds 1% to the total. Above 100%, damage gets turned into additional health (up to the standard 100% cap). The upper cap for these is 200%. Comes in bundles when replacing things other than armor bonuses.
+Cumulative armor items that can increase resistance to all damage by as much as you can find. Each nugget adds 1% to the total. Above 100%, damage gets turned into additional health *(up to the standard 100% cap)*. The upper cap for these is 200%. Comes in bundles when replacing things other than armor bonuses.
### Blast Suit ~ Replaces Green Armor, Silver Shield, Platinum Helm, Amulet of Warding

@@ -331,23 +336,23 @@ Can handle a total of 150 damage points before breaking.
Decent armor, protects very well against all damage. Reduction factors are as follows:
- * 80% reduction for elemental (fire, ice, electric, etc.)
+ * 80% reduction for elemental *(fire, ice, electric, etc.)*
* 50% reduction to everything else
- * 70% reduction for all splash damage (multiplicative on top of the other two)
+ * 70% reduction for all splash damage *(multiplicative on top of the other two)*
Can eat up a total of 250 damage points before breaking.
### Grilled Cheese Sandwich ~ Replaces Megasphere, Morph Ovum, Dragonskin Bracers

-The ultimate meal. Grants a full 1000 health and magically gives you a full stack of **Armor Nuggets**, a **Blast Suit** and a **War Armor**. In addition it prevents you from dying at all when it activates automatically (this wondrous artifact can even save you from the destruction of the **Ynykron Artifact**). Keep in mind that this overhealing above 500 points fades away much quicker than the **Refresher**'s, and you can't use another sandwich again until the overheal fades.
+The ultimate meal. Grants a full 1000 health and magically gives you a full stack of **Armor Nuggets**, a **Blast Suit** and a **War Armor**. In addition it prevents you from dying at all when it activates automatically *(this wondrous artifact can even save you from the destruction of the **Ynykron Artifact**)*. Keep in mind that this overhealing above 500 points fades away much quicker than the **Refresher**'s, and you can't use another sandwich again until the overheal fades.
### Ghost Artifact ~ Replaces Blur Sphere, Shadowsphere

Actual 100% invisibility, a relic from the old **UnSX** days.
-This powerup is capable of turning you absolutely invisible. However, it does not prevent you from making noise, so it's best to use it to sneak past certain encounters, or prepare surprise attacks.
+This powerup is capable of turning you absolutely invisible. However, it does not prevent you from making noise, so it's best to use it to sneak past certain encounters, or prepare surprise attacks. Enemies will be very confused and try to attack where they last heard you, until they eventually take notice that you're not there.
Lasts 60 seconds once activated.
@@ -384,7 +389,7 @@ You're fucking invincible for a total of 20 seconds.
### Hammerspace Embiggener ~ Replaces Backpack, Bag of Holding, Dragonskin Bracers

-Each of these you pick up increases your ammo capacity (not necessarily doubling it), stacking up to 8 times. They also give you some extra ammo, like a vanilla backpack would (though not for all weapons).
+Each of these you pick up increases your ammo capacity *(not necessarily doubling it)*, stacking up to 8 times. They also give you some extra ammo, like a vanilla backpack would *(though not for all weapons)*.
In some special cases you may find "Bulk" versions. These generally only pop up if the mapper decided to spawn several overlapping backpacks in one spot, as they result from all of those items merging together.
@@ -393,7 +398,7 @@ Note: In multiplayer, these can be traded between players, but do note that the
### Universal Ammo Fabricator ~ Replaces Mana / Krater of Might

-Separated into four tiers, they work pretty much like the ammo cubes in **Doom Tournament**, except they try to *"balance"* the total ammo given. The max tier fabricator is the only one capable of producing ammo for all weapons (excluding the **Ynykron Artifact**). Due to some unspecified reasons, they cannot be held in your inventory.
+Separated into four tiers, they work pretty much like the ammo cubes in **Doom Tournament**, except they try to *"balance"* the total ammo given. The max tier fabricator is the only one capable of producing ammo for all weapons *(excluding the **Ynykron Artifact**)*. Due to some unspecified reasons, they cannot be held in your inventory, something to do with their nature conflicting with **Hammerspace**.
### Lamp ~ Replaces Lite-Amp, Torch

@@ -434,7 +439,7 @@ Same conditions as the other two. Make sure you find the perfect chance to unlea
## The Collectibles

-Every now and then you will find these strange ***"Lucky Chance Boxes"*** in secret areas, which you can open by pressing Use. In Hexen, they will also replace Dark Servants, Banishment Devices and Porkalators (as the game generally doesn't have secret areas).
+Every now and then you will find these strange ***"Lucky Chance Boxes"*** in secret areas, which you can open by pressing Use. In Hexen, they will also replace Dark Servants, Banishment Devices and Porkalators *(as the game generally doesn't have secret areas)*.
While some will drop very useful goodies, others may provide you instead with a randomly selected item from a pool of various *"collectibles"*. On pickup, these will give you a nice extra score based on their estimated market price. Some of these collectibles will only appear when you play specific IWADs (or those that go chronologically after them, e.g.: Heretic collectibles appearing in Hexen).
@@ -456,7 +461,7 @@ A copy of Saya's famous sci-fi novel about interdimensional travel. Saya has fre
### Meidobot - Love Signals

-Debut album of Maidbot Miyamoto. Very cute and romantic J-Pop. Yes, it's a CD, and yes, some people still have CD drives out there. The album is considered a declaration of love to Saya, although it should be noted that this predates Maidbot gaining sentience (not that it makes much of a difference, as her feelings for Saya turned out to be very real).
+Debut album of Maidbot Miyamoto. Very cute and romantic J-Pop. Yes, it's a CD, and yes, some people still have CD drives out there. The album is considered a declaration of love to Saya, although it should be noted that this predates Maidbot gaining sentience *(not that it makes much of a difference, as her feelings for Saya turned out to be very real)*.
### Perfectly Generic Cube

@@ -505,61 +510,69 @@ Pretty simplistic so it doesn't get in the way of the action. Some things may be
### Top left corner
-Message display. Can be configured to show different numbers of messages depending on whether the chat prompt is open. Chat messages take much longer to expire than others, so there's less of a chance to miss them, as they might pop back up when the less important ones expire. A full chat history can be read at any time in the **Demolitionist Menu** (if there were any actual messages). Repeated messages are compressed with a multiplier suffix.
+Message display. Can be configured to show different numbers of messages depending on whether the chat prompt is open. Chat messages take much longer to expire than others, so there's less of a chance to miss them, as they might pop back up when the less important ones expire. A full chat history can be read at any time in the **Demolitionist Menu** *(if there were any actual messages)*. Repeated messages are compressed with a multiplier suffix.
### Top right corner
Current score.
-The scoring system is pretty straightforward. Each enemy you kill will give you points according to 5% of its base health, rounded up to the nearest multiple of 10 and capped to 1000, plus some bonuses (in order of application):
+The scoring system is pretty straightforward. Each enemy you kill will give you points according to 5% of its base health, rounded up to the nearest multiple of 10 and capped to 1000, plus some extra bonuses for feats such as multikills *(within 5 seconds of each other)*, gibbing enemies, killing bosses, and much more!
- * +500 if the enemy was killed with the **Deep Impact** primary (humiliation).
- * +300 if the enemy was killed with your butt while dashing (no, seriously).
- * +600 if the enemy was killed with a blown kiss (oh my~).
- * +200 if the enemy was killed with a parried projectile (+200 more if it was a perfect parry).
- * x2 for an overkill (enemy was gibbed or received twice its base health in damage).
- * x1.5 for each combo level, up to x8 in steps of x0.5. Kills are considered combos if multiple enemies are killed within 5 seconds of each other.
- * +100 for killing an enemy without having taken damage since last spawn, with extra +10 boosts for consecutive kills (extra boosts taper off after 10x).
- * +2000 if the enemy killed is a boss.
- * +1000 if you've killed the last enemy in the map.
+You are also given score for finding secrets and counted items, +100 for each secret, +1000 if it's the final one and +10 for each item or +500 if it's the final one. In addition, +5000 will be given to all players if the level is fully cleared *(100% kills/items/secrets)*.
-You are also given +100 points for each secret found, +1000 if it's the final secret. Countable items give +10 points each or +500 if it's the final item. In addition, +5000 will be given to all players if the level is fully cleared (100% kills/items/secrets).
+Score can be used to buy items on the in-game store *(or gained from selling them)*, and it is preserved between hubs, but pistol starts will reset it *(configurable, like most things)*.
-Score can be used to buy items on the in-game store (or gained from selling them), and it is preserved between hubs, but pistol starts will reset it.
+Right below your score box, a toggleable minimap will be shown. It works mostly like the radar did in **SWWM Z**, but has the added benefit of also showing map geometry *(an absolute nightmare to code)*. Has its own custom color scheme, but it can also be set to inherit these from GZDoom's own automap settings, or various vanilla presets.
-In **Doom** and **Heretic**, collected keys will be displayed below the score box.
+In addition, you may also see the stats for the level *(as well as its name if the automap is active)*, and below, any collected keys.
-When the **Automap** is open, the map name and stats will also be shown here.
+### Center
-Optionally, a minimap can be shown below the score box too. This works mostly like the radar did in **SWWM Z**, but it has the added benefit of also showing map geometry. Has its own configurable color scheme, but it can also be set to inherit these from GZDoom's own custom automap settings, or various vanilla presets.
+Your crosshair, of course. This mod features a physically projected crosshair that's pointing exactly where your current weapon will *(usually)* hit whenever you fire. If a weapon fires from multiple barrels, more crosshairs will of course appear for each of them.
+
+It's likely that somewhere in this general area you'll see, on occasion when playing supported maps, some dialogue boxes with characters *(usually **Saya**)* letting you know their thoughts on your progress in the mission, and what lies ahead. Do note that these communications are entirely voice-to-text and one-way.
+
+Oh, and also, when bringing up a certain weapon for the first time, you will see a tooltip detailing its basic controls. If you feel this gets in the way, you can disable it, of course.
### Bottom left corner
-Your health and fuel, along with an inventory box, and all active armors and powerups (with their respective durability/duration).
+Your health and fuel, along with an inventory box, and all active armors and powerups *(with their respective durability/duration)*.
### Bottom border
-Voice acting subtitles and pickup messages. Repeated pickups will have a multiplier suffix added. Total messages shown are also configurable. Achievement popups might also show here sporadically (yup, the mod has those).
+Voice acting subtitles and pickup messages. Repeated pickups will have a multiplier suffix added. Total messages shown are also configurable. Achievement popups might also show here sporadically *(yup, the mod has those)*.
### Bottom right corner
-The weapon slots. Above them, the currently equipped weapon's stats (i.e.: ammo(s) and such).
+The weapon slots. Above them, the currently equipped weapon's stats *(i.e.: ammo(s) and such)*.
-### Targeter
+### Targeting Array
-Because in the middle of the chaos that is this mod you might have a hard time trying to figure out where everything is in between explosions and massive smoke clouds, a targetter has been implemented, which will show the following:
+Because in the middle of the chaos that is this mod you might have a hard time trying to figure out where everything is in between explosions and massive smoke clouds, a targeting array has been implemented, which will show the following:
-- **Players and monsters:** Draws an identification label and a health bar. The bar can display overhealing, and also indicate when someone is invulnerable. When they take damage or get healed, numbers (either red or green) will pop up around them. The targetter only picks up enemies in your direct line of sight, gradually fading once you lose sight of them, and can only display up to 40 individual bars (configurable), giving priority first to players, then the nearest enemies. The **Omnisight** increases the time out-of-sight targets remain marked.
-- **Keys and map exits:** If you've picked up an **Omnisight**, key items and any exit lines will be marked and labeled, along with a little distance indicator in map units. Note that this doesn't work for script-triggered exits.
-- **Highlighted items:** Holding the ***"Item Sense"*** button will mark and label nearby items, in case they're hard to see among countless piles of corpses or dim lighting. If you have an **Omnisight**, items that are out of view (e.g.: behind walls) will be marked too.
+- **Players and monsters:** Draws an identification label and a health bar. The bar can display overhealing, and also indicate when someone is invulnerable. When they take damage or get healed, numbers *(either red or green)* will pop up around them. Only enemies in your direct line of sight are picked up, gradually fading once you lose sight of them, and only up to 40 individual bars can be displayed at a time *(configurable)*, giving priority first to players, then the nearest enemies. The **Omnisight** increases the time out-of-sight targets remain marked.
+- **Keys and map exits:** If you've picked up an **Omnisight**, key items and any exit lines will be marked and labeled, along with a little distance indicator in map units. Note that this doesn't work for script-triggered exits *(the exit line detection is also kind of wonky with the way some of them are laid out, so you might see duplicate markers and whatnot)*.
+- **Highlighted items:** Holding the ***"Item Sense"*** button will mark and label nearby items, in case they're hard to see among countless piles of corpses or dim lighting. If you have an **Omnisight**, items that are out of view *(e.g.: behind walls)* will be marked too.
These components are toggleable.
+## Multiplayer
+
+
+
+Although it's not officially supported, it is possible to play both co-op and deathmatch with this mod. Some caveats apply, such as the need to disable network prediction, as the various changes to player physics and behavior would quickly cause desyncs otherwise. Thus, the only recommendation I can give is to only try it out if there's low latency between players *(e.g.: LAN multiplayer)*.
+
+Due to engine limitations, it's not possible to color-code individual players, so you'll have to rely on the target array to identify others. Note that the named healthbars of other players are always displayed in co-op, regardless of distance or visibility.
+
+When playing deathmatch, detailed ranking and score stats will be shown on the right side of the HUD, so you know who's winning and by how far of a margin. Note that in deathmatch, the full map is always revealed, but other players will NOT appear in the minimap or target array unless they're visible, or they're part of your team *(if teamplay is enabled)*.
+
+Now, all things considered, the experience of multiplayer with this mod can only be described as *"pure unadulterated chaos"*. If one **Demolitionist** can already wreak intense havoc, imagine up to 8 of them on the same map.
+
## The End

That's all the info I can provide on this here Readme file, at least for now. Stay tuned for much more that will come in the future, as this mod is in constant development.
-Anyway, hope you have lots of fun playing **SWWM GZ**. Godspeed, and happy fragging!
+Anyway, hope you have lots of fun playing **Codename: Demolitionist**. Godspeed, and happy fragging!
— *Marisa*
diff --git a/achievements.lst b/achievements.lst
index 3e202bdd8..687fbaeb9 100644
--- a/achievements.lst
+++ b/achievements.lst
@@ -3,10 +3,11 @@
# basename: the base name used to construct cvars and localization strings
# maxval: limit progress value (if any), a value of -1 means it needs special
# handling in zscript (usually for cases where this is dynamic, like
-# the "all collectibles" achievement)
+# the "all collectibles" achievement), and a value below -1 indicates
+# this is a bitfield, where abs(maxval) bits must be set
# hasformat: the TXT string has a %d in it to substitute for maxval
# gametype: the game this belongs to (any, doom, heretic, hexen, raven, etc.)
-acid,50,yes,any
+acid,40,yes,any
allcoll,-1,no,any
allitems,30,yes,nothexen
allkills,30,yes,nothexen
@@ -14,24 +15,23 @@ allsecrets,30,yes,nothexen
anom,10,yes,any
anone,0,no,any
balls,10,yes,any
-barrel,1000,yes,doom
+barrel,500,yes,doom
barrier,20,yes,doom
baseball,0,no,doom
blaze,0,no,nothexen
-bonk,300,yes,any
+bonk,200,yes,any
bossdash,5,yes,any
brake,10,yes,any
-bune,500,yes,any
-bustin,50,yes,any
+bune,400,yes,any
+bustin,40,yes,any
butts,100,yes,any
-candy,1000,yes,any
-cheat,0,no,any
+candy,500,yes,any
cliffyb,0,no,nothexen
clonk,0,no,any
conga,10,yes,any
crush,0,no,any
cybully,0,no,doom
-#cum,1000,yes,any
+#cum,500,yes,any
#dab,200,yes,any
#dakka,60,no,any
deadeye,7,yes,any
@@ -39,25 +39,23 @@ deva,10,yes,any
dime,0,no,any
divine,10,yes,any
doodle,20,yes,doom
-dosh,1000000000,no,any
everything,0,no,any
-ezkill,50,yes,any
-#fisto,300,yes,any
+ezkill,50,yes,doom
+ezkill,30,yes,raven
flight,2000,yes,any
-friend,40,yes,any
-fuel,500,yes,any
+friend,20,yes,any
+fuel,400,yes,any
#fuller,0,no,any
gcsandwich,10,yes,any
#gepgun,30,yes,any
-ghost,30,yes,any
+ghost,20,yes,any
gib,1500,yes,any
golden,24,yes,any
gravity,10,yes,raven
-grenade,30,yes,any
+grenade,20,yes,any
#hnd,6,yes,any
hurry,0,no,any
-#ice,40,yes,any
-jump,150,yes,any
+jump,100,yes,any
kancho,0,no,hexen
keen,0,no,doom
lead,1500,yes,any
@@ -65,38 +63,39 @@ lead,1500,yes,any
ligma,0,no,any
love,10,yes,any
#mashiro,0,no,any
+matryoshka,0,no,any
mbf,0,no,doom
mega,10000,yes,any
-moth,50,yes,any
+moth,30,yes,any
nice,0,no,nothexen
oneguy,0,no,any
onehp,10,yes,any
onestanding,0,no,nothexen
oopsie,0,no,any
par,15,yes,doom
-parry,200,yes,any
+parry,100,yes,any
peace,0,no,nothexen
-#pene,20,yes,any
-#plasma,50,yes,any
+#plasma,30,yes,any
plush,10,yes,any
puzzle,0,no,hexen
rage,20,yes,any
#rail,16,yes,any
reflect,20,yes,any
refresh,30,yes,any
-#roast,50,yes,any
+#roast,40,yes,any
salt,0,no,any
sanic,800,yes,any
sekiro,0,no,any
shame,0,no,any
shock,30,yes,any
-slayer,40,yes,any
+slayer,40,yes,doom
+slayer,20,yes,raven
slemg,100,yes,any
sneaky,10,yes,raven
sneeze,20,yes,any
#spark,30,yes,any
step,30,yes,any
-stomp,50,yes,any
+stomp,40,yes,any
sunny,15,yes,any
tele,0,no,any
tender,100,yes,any
diff --git a/acs/swwmcomp.o b/acs/swwmcomp.o
index e7af79370..033d4c445 100644
Binary files a/acs/swwmcomp.o and b/acs/swwmcomp.o differ
diff --git a/animdefs.misc b/animdefs.misc
new file mode 100644
index 000000000..b06d2f36b
--- /dev/null
+++ b/animdefs.misc
@@ -0,0 +1 @@
+cameratexture LOGOFADE 64 64
diff --git a/ccards.txt b/ccards.txt
new file mode 100644
index 000000000..874b237f3
--- /dev/null
+++ b/ccards.txt
@@ -0,0 +1,5 @@
+// exclude secret Wolfenstein enemies
+excludeactor SWWMGuard
+excludeactor SWWMSS
+excludeactor SWWMHans
+excludeactor SWWMDog
diff --git a/credits.txt b/credits.txt
index c21bc0d64..b81589174 100644
--- a/credits.txt
+++ b/credits.txt
@@ -1,6 +1,5 @@
Most of the work here is original, but there are some notable exceptions:
- - Default player voices are edited from the Fallout 4 Japanese dub.
- * Special Thanks to Gargorias for Player Comments and Head Tracking (https://www.nexusmods.com/fallout4/mods/22166), which was of great help for tracking down all these lines.
+ - Demolitionist voice lines by Vyolette
- Many sounds have been mixed and matched and filtered and whatnot from the following games:
* Fallout New Vegas
* Fallout 4
diff --git a/cvarinfo.achievements b/cvarinfo.achievements
deleted file mode 100644
index 3e38b75af..000000000
--- a/cvarinfo.achievements
+++ /dev/null
@@ -1,143 +0,0 @@
-// shared achievements
-
-// cross-session achievement cvars (0: locked, 1: unlocked, 2: notified)
-nosave int swwm_achievement_acid = 0;
-nosave int swwm_achievement_allcoll = 0;
-nosave int swwm_achievement_anom = 0;
-nosave int swwm_achievement_anone = 0;
-nosave int swwm_achievement_balls = 0;
-nosave int swwm_achievement_bonk = 0;
-nosave int swwm_achievement_bossdash = 0;
-nosave int swwm_achievement_brake = 0;
-nosave int swwm_achievement_bune = 0;
-nosave int swwm_achievement_bustin = 0;
-nosave int swwm_achievement_butts = 0;
-nosave int swwm_achievement_candy = 0;
-nosave int swwm_achievement_cheat = 0;
-nosave int swwm_achievement_clonk = 0;
-nosave int swwm_achievement_conga = 0;
-nosave int swwm_achievement_crush = 0;
-nosave int swwm_achievement_cum = 0;
-nosave int swwm_achievement_dab = 0;
-nosave int swwm_achievement_dakka = 0;
-nosave int swwm_achievement_deadeye = 0;
-nosave int swwm_achievement_deva = 0;
-nosave int swwm_achievement_dime = 0;
-nosave int swwm_achievement_divine = 0;
-nosave int swwm_achievement_dosh = 0;
-nosave int swwm_achievement_everything = 0;
-nosave int swwm_achievement_ezkill = 0;
-nosave int swwm_achievement_fisto = 0;
-nosave int swwm_achievement_flight = 0;
-nosave int swwm_achievement_friend = 0;
-nosave int swwm_achievement_fuel = 0;
-nosave int swwm_achievement_fuller = 0;
-nosave int swwm_achievement_gcsandwich = 0;
-nosave int swwm_achievement_gepgun = 0;
-nosave int swwm_achievement_ghost = 0;
-nosave int swwm_achievement_gib = 0;
-nosave int swwm_achievement_golden = 0;
-nosave int swwm_achievement_grenade = 0;
-nosave int swwm_achievement_hnd = 0;
-nosave int swwm_achievement_hurry = 0;
-nosave int swwm_achievement_ice = 0;
-nosave int swwm_achievement_jump = 0;
-nosave int swwm_achievement_lead = 0;
-nosave int swwm_achievement_lightning = 0;
-nosave int swwm_achievement_ligma = 0;
-nosave int swwm_achievement_love = 0;
-nosave int swwm_achievement_mashiro = 0;
-nosave int swwm_achievement_mega = 0;
-nosave int swwm_achievement_moth = 0;
-nosave int swwm_achievement_oneguy = 0;
-nosave int swwm_achievement_onehp = 0;
-nosave int swwm_achievement_oopsie = 0;
-nosave int swwm_achievement_parry = 0;
-nosave int swwm_achievement_pene = 0;
-nosave int swwm_achievement_plasma = 0;
-nosave int swwm_achievement_plush = 0;
-nosave int swwm_achievement_rage = 0;
-nosave int swwm_achievement_rail = 0;
-nosave int swwm_achievement_reflect = 0;
-nosave int swwm_achievement_refresh = 0;
-nosave int swwm_achievement_roast = 0;
-nosave int swwm_achievement_salt = 0;
-nosave int swwm_achievement_sanic = 0;
-nosave int swwm_achievement_sekiro = 0;
-nosave int swwm_achievement_shame = 0;
-nosave int swwm_achievement_shock = 0;
-nosave int swwm_achievement_slayer = 0;
-nosave int swwm_achievement_slemg = 0;
-nosave int swwm_achievement_sneeze = 0;
-nosave int swwm_achievement_spark = 0;
-nosave int swwm_achievement_step = 0;
-nosave int swwm_achievement_stomp = 0;
-nosave int swwm_achievement_sunny = 0;
-nosave int swwm_achievement_tele = 0;
-nosave int swwm_achievement_tender = 0;
-nosave int swwm_achievement_thicc = 0;
-nosave int swwm_achievement_thruwall = 0;
-nosave int swwm_achievement_travel = 0;
-nosave int swwm_achievement_wantdie = 0;
-nosave int swwm_achievement_wave = 0;
-// cross-session progress cvars
-nosave int swwm_progress_acid = 0;
-nosave int swwm_progress_allcoll = 0;
-nosave int swwm_progress_anom = 0;
-nosave int swwm_progress_balls = 0;
-nosave int swwm_progress_bonk = 0;
-nosave int swwm_progress_bossdash = 0;
-nosave int swwm_progress_brake = 0;
-nosave int swwm_progress_bune = 0;
-nosave int swwm_progress_bustin = 0;
-nosave int swwm_progress_butts = 0;
-nosave int swwm_progress_candy = 0;
-nosave int swwm_progress_conga = 0;
-nosave int swwm_progress_cum = 0;
-nosave int swwm_progress_dab = 0;
-nosave int swwm_progress_dakka = 0;
-nosave int swwm_progress_deadeye = 0;
-nosave int swwm_progress_deva = 0;
-nosave int swwm_progress_divine = 0;
-nosave int swwm_progress_dosh = 0;
-nosave int swwm_progress_ezkill = 0;
-nosave int swwm_progress_fisto = 0;
-nosave int swwm_progress_flight = 0;
-nosave int swwm_progress_friend = 0;
-nosave float swwm_progress_fuel = 0; // this one needs to be float
-nosave int swwm_progress_gcsandwich = 0;
-nosave int swwm_progress_gepgun = 0;
-nosave int swwm_progress_ghost = 0;
-nosave int swwm_progress_gib = 0;
-nosave int swwm_progress_golden = 0;
-nosave int swwm_progress_grenade = 0;
-nosave int swwm_progress_hnd = 0;
-nosave int swwm_progress_ice = 0;
-nosave int swwm_progress_jump = 0;
-nosave int swwm_progress_lead = 0;
-nosave int swwm_progress_love = 0;
-nosave int swwm_progress_mega = 0;
-nosave int swwm_progress_moth = 0;
-nosave int swwm_progress_onehp = 0;
-nosave int swwm_progress_parry = 0;
-nosave int swwm_progress_pene = 0;
-nosave int swwm_progress_plasma = 0;
-nosave int swwm_progress_plush = 0;
-nosave int swwm_progress_rage = 0;
-nosave int swwm_progress_rail = 0;
-nosave int swwm_progress_reflect = 0;
-nosave int swwm_progress_refresh = 0;
-nosave int swwm_progress_roast = 0;
-nosave int swwm_progress_sanic = 0;
-nosave int swwm_progress_shock = 0;
-nosave int swwm_progress_slayer = 0;
-nosave int swwm_progress_slemg = 0;
-nosave int swwm_progress_sneeze = 0;
-nosave int swwm_progress_spark = 0;
-nosave int swwm_progress_step = 0;
-nosave int swwm_progress_stomp = 0;
-nosave int swwm_progress_sunny = 0;
-nosave int swwm_progress_tender = 0;
-nosave int swwm_progress_thicc = 0;
-nosave int swwm_progress_thruwall = 0;
-nosave float swwm_progress_travel = 0; // also needs to be float
diff --git a/cvarinfo.base b/cvarinfo.base
index da357f967..73b6886e9 100644
--- a/cvarinfo.base
+++ b/cvarinfo.base
@@ -3,38 +3,32 @@ user string swwm_voicetype = "default"; // voice for your demolitionist
nosave float swwm_flashstrength = 1.0; // strength of screen flashes
nosave int swwm_hudmargin = 10; // margin around fullscreen hud elements
nosave int swwm_maxshown = 4; // max messages to show normally
-nosave int swwm_maxshownbig = 10; // max messages to show when chatting
+nosave int swwm_maxshownbig = 10; // max messages to show when chatting
nosave int swwm_maxpickup = 5; // total pickup messages visible
nosave int swwm_mutevoice = 0; // mute demolitionist voice
// 0 - none
// 1 - combat comments
- // 2 - item/secret comments
+ // 2 - interaction comments
// 3 - map start comment
// 4 - pain/death and grunts
+nosave int swwm_voiceamp = 2; // additional voice line amplification, up to 4x
nosave int swwm_chatduration = 25; // lifespan of chat messages
nosave int swwm_msgduration = 5; // lifespan of other messages
nosave int swwm_pickduration = 3; // lifespan of pickup messages
-server bool swwm_sharekeys = true; // share keys in mp
-nosave noarchive int swwm_lasttab = 0; // last selected tab in the menu
-nosave noarchive int swwm_lastloretab = 0; // last selected tab in the library submenu
-nosave noarchive int swwm_laststattab = 0; // last selected tab in the stats submenu
user bool swwm_autousearmor = true; // automatically use armor items when possible
user bool swwm_autousehealth = true; // automatically use health items when possible
-server int swwm_enforceautousearmor = 0; // 1: server enforces auto use, -1: server enforces no auto use, 0: server respects user setting
-server int swwm_enforceautousehealth = 0; // likewise for health
-nosave bool swwm_targeter = true; // show targeter healthbars
+nosave bool swwm_targeter = true; // show targeter healthbars
nosave bool swwm_targettags = true; // show enemy tags above healthbars
nosave bool swwm_healthnums = true; // show damage/healing numbers
nosave bool swwm_scorenums = true; // show score numbers
nosave bool swwm_scorebonus = true; // show score bonuses
nosave bool swwm_pois = true; // show points of interest highlighted by omnisight
server bool swwm_fly6dof = false; // flying uses 6dof movement, toggleable for those who get motion sickness
-nosave bool swwm_othervoice = true; // can hear other player's voice lines in coop
nosave bool swwm_shaders = true; // use pp shaders for some effects
nosave bool swwm_earbuster = false; // limits loudness of wallbuster fire sounds
server bool swwm_revive = true; // allows the player to do an "emergency reboot" when dying
server int swwm_revivecooldown = 60; // cooldown after using a revive, in seconds (0: no limit)
-nosave bool swwm_interart = true; // show fanart on intermissions
+nosave int swwm_interart = 1; // show art on intermissions (2: only fanart, 3: only official renders)
server bool swwm_balluse = true; // lead ball can "press" switches remotely
nosave bool swwm_bosshealthbars = true; // display large healthbars for vanilla boss encounters
server bool swwm_upgradebosses = true; // vanilla bosses will be "upgraded" to be less insta-die prone
@@ -44,18 +38,18 @@ nosave int swwm_maxtargetdist = 2000; // maximum distance for target healthbars
nosave int swwm_maxtargets = 40; // maximum targeter healthbars to display (0 = unlimited)
nosave int swwm_maxscorenums = 0; // maximum score numbers to display (0 = unlimited)
nosave int swwm_maxdamnums = 0; // maximum damage/healing numbers to display (0 = unlimited)
-nosave int swwm_hudscale = 0; // HUD scaling (0 = use GZDoom scaling)
-nosave int swwm_barscale = 2; // target healthbar scaling (0 = use GZDoom scaling)
-nosave int swwm_scrscale = 2; // score scaling (0 = use GZDoom scaling)
-nosave int swwm_numscale = 3; // damnum scaling (0 = use GZDoom scaling)
-nosave int swwm_poiscale = 1; // point of interest scaling (0 = use GZDoom scaling)
-nosave int swwm_detscale = 2; // item sense scaling (0 = use GZDoom scaling)
+nosave bool swwm_hudscale = false; // HUD scaling (false = tight scaling, true = loose scaling)
+nosave int swwm_barscalerel = -1; // target healthbar scaling (relative)
+nosave int swwm_numscalerel = 0; // damnum scaling (relative)
+nosave int swwm_scrscalerel = -1; // score scaling (relative)
+nosave int swwm_poiscalerel = -2; // point of interest scaling (relative)
+nosave int swwm_detscalerel = -1; // item sense scaling (relative)
server bool swwm_blood = true; // custom blood/gibbing
server int swwm_maxblood = 200; // max blood effects at any time
server int swwm_maxgibs = 100; // max gibs at any time
server int swwm_maxcasings = 100; // max casings and spent mags at any time
server int swwm_maxdebris = 200; // max chunks of debris at any time
-nosave bool swwm_fuzz = true; // allows toggling the fuzz shader on the demolitionist menus, useful if you're streaming/recording since it destroys the encoding quality
+nosave bool swwm_fuzz = true; // allows toggling the fuzz shader on menus/backgrounds, useful if you're streaming/recording since it destroys the encoding quality
nosave bool swwm_cbtpause = true; // wallbuster menu pauses the game
nosave noarchive int swwm_cbtlast = 0; // last selected ammo for the wallbuster
server bool swwm_cbtall = false; // wallbuster breaks any wall, not just movable ones
@@ -105,7 +99,6 @@ server bool swwm_singlefirst = false; // single weapons are selected before dua
nosave bool swwm_uniqstats = false; // only list stats from the same map once, rather than for each single visit
nosave int swwm_filterachievements = 1; // filter for achievements at 0%: 0 - no filter, 1 - obscure text, 2 - don't show
nosave noarchive bool swwm_debugview = false; // debug visual aid for various things, such as actor collision, trajectories, relationships, etc.
-nosave bool swwm_oldcheat = false; // set to true if you used a SWWM Platinum cheat, so the easter egg only appears once per iwad
server bool swwm_selflight = true; // player emits light
server bool swwm_usetopickup = false; // allow item pickup only by pressing use
server bool swwm_meleepickup = true; // allow picking up items through melee
@@ -115,13 +108,18 @@ server bool swwm_ondemandammo = true; // don't spawn ammo for unavailable weapo
user float swwm_bumpstrength = 1.0; // intensity of fov bumping
server bool swwm_nomagdrop = true; // does not drop spent magazines (the "environmentally conscious" option)
user bool swwm_autousebarrier = true; // auto-use elemental coating when standing on damaging floors
-server int swwm_enforceautousebarrier = 0; // enforced auto-use for coating
nosave bool swwm_nomapmsg = false; // disables special map dialogue messages
nosave bool swwm_weapontooltips = true; // shows a tooltip on weapon operation when first selected
nosave string swwm_tooltipshown = ""; // which weapons have already had their tooltips displayed
nosave noarchive bool swwm_tooltipnote = false; // set if the note on how to disable tooltips was already displayed
nosave bool swwm_nointertips = false; // hides intermission tips, in case you don't want to see them
server bool swwm_demoslayer = false; // if you're below 100hp, enemies drop healing orbs when you kill them
+nosave bool swwm_beepboop = false; // prompts the Demolitionist to go "beep", "boop" and "bop" when pressing any switch (may get annoying)
+nosave bool swwm_oldlogo = false; // restores the old SWWM GZ logo and intro
+nosave string swwm_menuposehistory = ""; // stores currently seen poses for the main menu, for shuffling
+nosave string swwm_titlesubhistory = ""; // stores currently seen subtitles for the title screen, for shuffling
+nosave noarchive int swwm_profstart = 0; // starts profiling as soon as handler is registered for specified >0 tics
+server bool swwm_nodeathexit = false; // completely sidesteps the inventory resetting of death exits, if you hate those
// minimap settings
nosave bool swwm_mm_enable = true; // show a minimap below the score counter
@@ -130,7 +128,7 @@ nosave bool swwm_mm_rotate = true; // rotate minimap
nosave bool swwm_mm_grid = false; // show blockmap grid plus (0,0) crosshair
nosave bool swwm_mm_portaloverlay = true; // show portal overlays, like the gzdoom automap (but unlike the gzdoom automap, we also overlay actors)
nosave bool swwm_mm_missiles = true; // show projectiles (how revolutionary)
-nosave int swwm_mm_colorset = 0; // 0: SWWM GZ, 1: GZDoom, 2: Doom, 3: Strife, 4: Raven
+nosave int swwm_mm_colorset = 0; // 0: Demolitionist, 1: GZDoom, 2: Doom, 3: Strife, 4: Raven
nosave color swwm_mm_backcolor = "10 10 10";
nosave color swwm_mm_cdwallcolor = "30 50 70";
nosave color swwm_mm_efwallcolor = "80 a0 c0";
@@ -161,4 +159,6 @@ nosave color swwm_mm_yourcolor = "80 ff 00";
server noarchive bool swwm_iseriouslywanttoplaythiswithbd = false; // self-explanatory
-nosave int swwm_playtime = 0; // total playtime in seconds
+nosave int swwm_playtime = 0; // total playtime in seconds
+nosave string swwm_achievementstate = ""; // stores dictionary with all achievement states
+nosave string swwm_achievementprogress = ""; // stores dictionary with all achievement progress
diff --git a/decaldef.txt b/decaldef.txt
index fe578c84a..5db06c8cb 100644
--- a/decaldef.txt
+++ b/decaldef.txt
@@ -570,5 +570,7 @@ decal HeartyGlow
decal DemoSpray
{
pic DemoIcon
+ x-scale 0.25
+ y-scale 0.25
solid
}
diff --git a/docimg/demolitionist_mp.png b/docimg/demolitionist_mp.png
new file mode 100644
index 000000000..46748d2de
Binary files /dev/null and b/docimg/demolitionist_mp.png differ
diff --git a/docimg/logo.png b/docimg/logo.png
index f41076870..1502470e2 100644
Binary files a/docimg/logo.png and b/docimg/logo.png differ
diff --git a/filter/game-doom/cvarinfo.doomachievements b/filter/game-doom/cvarinfo.doomachievements
deleted file mode 100644
index 762a47dd0..000000000
--- a/filter/game-doom/cvarinfo.doomachievements
+++ /dev/null
@@ -1,30 +0,0 @@
-// doom-exclusive achievements
-
-// cross-session achievement cvars (0: locked, 1: unlocked, 2: notified)
-nosave int swwm_achievement_allitems = 0;
-nosave int swwm_achievement_allkills = 0;
-nosave int swwm_achievement_allsecrets = 0;
-nosave int swwm_achievement_barrel = 0;
-nosave int swwm_achievement_barrier = 0;
-nosave int swwm_achievement_baseball = 0;
-nosave int swwm_achievement_blaze = 0;
-nosave int swwm_achievement_cliffyb = 0;
-nosave int swwm_achievement_cybully = 0;
-nosave int swwm_achievement_doodle = 0;
-nosave int swwm_achievement_keen = 0;
-nosave int swwm_achievement_mbf = 0;
-nosave int swwm_achievement_nice = 0;
-nosave int swwm_achievement_onestanding = 0;
-nosave int swwm_achievement_par = 0;
-nosave int swwm_achievement_peace = 0;
-nosave int swwm_achievement_trash = 0;
-nosave int swwm_achievement_untouchable = 0;
-nosave int swwm_achievement_yeet = 0;
-// cross-session progress cvars
-nosave int swwm_progress_allitems = 0;
-nosave int swwm_progress_allkills = 0;
-nosave int swwm_progress_allsecrets = 0;
-nosave int swwm_progress_barrel = 0;
-nosave int swwm_progress_barrier = 0;
-nosave int swwm_progress_doodle = 0;
-nosave int swwm_progress_par = 0;
diff --git a/filter/game-heretic/cvarinfo.hereticachievements b/filter/game-heretic/cvarinfo.hereticachievements
deleted file mode 100644
index 1627939dd..000000000
--- a/filter/game-heretic/cvarinfo.hereticachievements
+++ /dev/null
@@ -1,21 +0,0 @@
-// heretic-exclusive achievements
-
-// cross-session achievement cvars (0: locked, 1: unlocked, 2: notified)
-nosave int swwm_achievement_allitems = 0;
-nosave int swwm_achievement_allkills = 0;
-nosave int swwm_achievement_allsecrets = 0;
-nosave int swwm_achievement_blaze = 0;
-nosave int swwm_achievement_cliffyb = 0;
-nosave int swwm_achievement_gravity = 0;
-nosave int swwm_achievement_nice = 0;
-nosave int swwm_achievement_onestanding = 0;
-nosave int swwm_achievement_peace = 0;
-nosave int swwm_achievement_sneaky = 0;
-nosave int swwm_achievement_tornado = 0;
-nosave int swwm_achievement_untouchable = 0;
-// cross-session progress cvars
-nosave int swwm_progress_allitems = 0;
-nosave int swwm_progress_allkills = 0;
-nosave int swwm_progress_allsecrets = 0;
-nosave int swwm_progress_gravity = 0;
-nosave int swwm_progress_sneaky = 0;
diff --git a/filter/game-hexen/cvarinfo.hexenachievements b/filter/game-hexen/cvarinfo.hexenachievements
deleted file mode 100644
index 170bd8b9c..000000000
--- a/filter/game-hexen/cvarinfo.hexenachievements
+++ /dev/null
@@ -1,10 +0,0 @@
-// hexen-exclusive achievements
-
-// cross-session achievement cvars (0: locked, 1: unlocked, 2: notified)
-nosave int swwm_achievement_gravity = 0;
-nosave int swwm_achievement_kancho = 0;
-nosave int swwm_achievement_puzzle = 0;
-nosave int swwm_achievement_sneaky = 0;
-// cross-session progress cvars
-nosave int swwm_progress_gravity = 0;
-nosave int swwm_progress_sneaky = 0;
diff --git a/filter/game-raven/graphics/KBase/PFP_Demolitionist.png b/filter/game-raven/graphics/KBase/PFP_Demolitionist.png
new file mode 100644
index 000000000..13dacbba9
Binary files /dev/null and b/filter/game-raven/graphics/KBase/PFP_Demolitionist.png differ
diff --git a/fonts.wad b/fonts.wad
index 4b1871f3a..ba4928907 100644
Binary files a/fonts.wad and b/fonts.wad differ
diff --git a/gameinfo.txt b/gameinfo.txt
index 7a6e05ed1..24848f5d5 100644
--- a/gameinfo.txt
+++ b/gameinfo.txt
@@ -1,5 +1,5 @@
STARTUPCOLORS = "FF FF FF", "80 40 FF"
-STARTUPTITLE = "Some Weird Weapons Mod: GZDoom Edition"
+STARTUPTITLE = "Codename: DEMOLITIONIST"
STARTUPTYPE = "Hexen"
STARTUPSONG = "music/H2I4D2E.XM"
LOADWIDESCREEN = 1
diff --git a/gldefs.keys b/gldefs.keys
index 90b44a8ac..fb5e3f9c2 100644
--- a/gldefs.keys
+++ b/gldefs.keys
@@ -99,6 +99,10 @@ Brightmap Texture "models/DoomYellowSkull.png"
{
map "models/DoomSkull_bright.png"
}
+Brightmap Texture "models/DoomPurpleSkull.png"
+{
+ map "models/DoomSkull_bright.png"
+}
HardwareShader Texture "models/DoomRedSkull.png"
{
Shader "shaders/glsl/Shinemask.fp"
diff --git a/gldefs.misc b/gldefs.misc
index 9960d0c44..c4a214b21 100644
--- a/gldefs.misc
+++ b/gldefs.misc
@@ -60,6 +60,112 @@ HardwareShader Texture "graphics/M_SWWM.png"
Texture "Layer6" "graphics/M_SWWM_Layer6.png"
Define "NO_BILINEAR"
}
+HardwareShader Texture "graphics/NewLogo.png"
+{
+ Shader "shaders/glsl/NewLogoAnimated.fp"
+ // what no 2d arrays does to a mf
+ Texture "Layer1" "graphics/NewLogo_Layer1.png"
+ Texture "Layer2" "graphics/NewLogo_Layer2.png"
+ Texture "Layer3" "graphics/NewLogo_Layer3.png"
+ Texture "gradtex" "graphics/NewLogo_Grad.png"
+ Texture "fadetex" "LOGOFADE"
+}
+HardwareShader Texture "graphics/M_DEMOLITIONIST.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/DemoIcon.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_DEEPIMPACT.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_EXPLOGUN.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_SPREADGUN.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_WALLBUSTER.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_EVISCERATOR.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_HELLBLAZER.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_BIOSPARK.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_SILVERBULLET.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_CANDYGUN.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_YNYKRON.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_PUSHER.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_DAB.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_DOUBLEV.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_HEALTH.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_LOVE.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_RAGEKIT.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_SANDWICH.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_SHELLS.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_SKULL.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_THONK.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/M_DEMOCHAN_THUMBUP.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/UnSXLogo.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
HardwareShader Sprite "MBRNB0"
{
Shader "shaders/glsl/Whew.fp"
@@ -108,6 +214,58 @@ HardwareShader Texture "graphics/Fanart/Marisa7.jpg"
{
Shader "shaders/glsl/Bilinear.fp"
}
+HardwareShader Texture "graphics/Fanart/Marisa8.jpg"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Marisa9.jpg"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Marisa10.jpg"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Marisa11.jpg"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Marisa12.jpg"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Marisa13.jpg"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Marisa14.jpg"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Marisa15.jpg"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Marisa16.jpg"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Monsoon.jpg"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Monsoon2.jpg"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Monsoon3.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
+HardwareShader Texture "graphics/Fanart/Monsoon4.png"
+{
+ Shader "shaders/glsl/Bilinear.fp"
+}
HardwareShader Texture "graphics/Fanart/RedeadITA.png"
{
Shader "shaders/glsl/Oversample.fp"
diff --git a/graphics/Achievements/AchievementDosh.png b/graphics/Achievements/AchievementDosh.png
deleted file mode 100644
index c726fb809..000000000
Binary files a/graphics/Achievements/AchievementDosh.png and /dev/null differ
diff --git a/graphics/Achievements/AchievementCheat.png b/graphics/Achievements/AchievementMatryoshka.png
similarity index 100%
rename from graphics/Achievements/AchievementCheat.png
rename to graphics/Achievements/AchievementMatryoshka.png
diff --git a/graphics/Achievements/BarAchievementBase.png b/graphics/Achievements/BarAchievementBase.png
new file mode 100644
index 000000000..853422dc8
Binary files /dev/null and b/graphics/Achievements/BarAchievementBase.png differ
diff --git a/graphics/Achievements/BarAchievementDone.png b/graphics/Achievements/BarAchievementDone.png
new file mode 100644
index 000000000..7f0c6c57e
Binary files /dev/null and b/graphics/Achievements/BarAchievementDone.png differ
diff --git a/graphics/Achievements/BarAchievementProgress.png b/graphics/Achievements/BarAchievementProgress.png
new file mode 100644
index 000000000..187340fe5
Binary files /dev/null and b/graphics/Achievements/BarAchievementProgress.png differ
diff --git a/graphics/DemoIcon.png b/graphics/DemoIcon.png
index 94297bc57..569e6a148 100644
Binary files a/graphics/DemoIcon.png and b/graphics/DemoIcon.png differ
diff --git a/graphics/Fanart/Marisa10.jpg b/graphics/Fanart/Marisa10.jpg
new file mode 100644
index 000000000..3b518b166
Binary files /dev/null and b/graphics/Fanart/Marisa10.jpg differ
diff --git a/graphics/Fanart/Marisa11.jpg b/graphics/Fanart/Marisa11.jpg
new file mode 100644
index 000000000..79158e341
Binary files /dev/null and b/graphics/Fanart/Marisa11.jpg differ
diff --git a/graphics/Fanart/Marisa12.jpg b/graphics/Fanart/Marisa12.jpg
new file mode 100644
index 000000000..6a5959648
Binary files /dev/null and b/graphics/Fanart/Marisa12.jpg differ
diff --git a/graphics/Fanart/Marisa13.jpg b/graphics/Fanart/Marisa13.jpg
new file mode 100644
index 000000000..a1cf45283
Binary files /dev/null and b/graphics/Fanart/Marisa13.jpg differ
diff --git a/graphics/Fanart/Marisa14.jpg b/graphics/Fanart/Marisa14.jpg
new file mode 100644
index 000000000..fe1e31e21
Binary files /dev/null and b/graphics/Fanart/Marisa14.jpg differ
diff --git a/graphics/Fanart/Marisa15.jpg b/graphics/Fanart/Marisa15.jpg
new file mode 100644
index 000000000..8d7d2e503
Binary files /dev/null and b/graphics/Fanart/Marisa15.jpg differ
diff --git a/graphics/Fanart/Marisa16.jpg b/graphics/Fanart/Marisa16.jpg
new file mode 100644
index 000000000..a1ce76f0d
Binary files /dev/null and b/graphics/Fanart/Marisa16.jpg differ
diff --git a/graphics/Fanart/Marisa8.jpg b/graphics/Fanart/Marisa8.jpg
new file mode 100644
index 000000000..fdea42e4d
Binary files /dev/null and b/graphics/Fanart/Marisa8.jpg differ
diff --git a/graphics/Fanart/Marisa9.jpg b/graphics/Fanart/Marisa9.jpg
new file mode 100644
index 000000000..b58e0a09f
Binary files /dev/null and b/graphics/Fanart/Marisa9.jpg differ
diff --git a/graphics/Fanart/Monsoon.jpg b/graphics/Fanart/Monsoon.jpg
new file mode 100644
index 000000000..1e8f06a5a
Binary files /dev/null and b/graphics/Fanart/Monsoon.jpg differ
diff --git a/graphics/Fanart/Monsoon2.jpg b/graphics/Fanart/Monsoon2.jpg
new file mode 100644
index 000000000..b680479e4
Binary files /dev/null and b/graphics/Fanart/Monsoon2.jpg differ
diff --git a/graphics/Fanart/Monsoon3.png b/graphics/Fanart/Monsoon3.png
new file mode 100644
index 000000000..e90c1457f
Binary files /dev/null and b/graphics/Fanart/Monsoon3.png differ
diff --git a/graphics/Fanart/Monsoon4.png b/graphics/Fanart/Monsoon4.png
new file mode 100644
index 000000000..2074fa5cc
Binary files /dev/null and b/graphics/Fanart/Monsoon4.png differ
diff --git a/graphics/HUD/ChatBoxTop.png b/graphics/HUD/ChatBoxTop.png
index 963ba861c..dc6cbc3e2 100644
Binary files a/graphics/HUD/ChatBoxTop.png and b/graphics/HUD/ChatBoxTop.png differ
diff --git a/graphics/HUD/ChatBoxTop_Smol.png b/graphics/HUD/ChatBoxTop_Smol.png
index 1c1e32453..08ec5867f 100644
Binary files a/graphics/HUD/ChatBoxTop_Smol.png and b/graphics/HUD/ChatBoxTop_Smol.png differ
diff --git a/graphics/HUD/Icons/A_CandyBullet.png b/graphics/HUD/Icons/A_CandyBullet.png
index c8e1f590b..8003a594d 100644
Binary files a/graphics/HUD/Icons/A_CandyBullet.png and b/graphics/HUD/Icons/A_CandyBullet.png differ
diff --git a/graphics/HUD/Icons/A_DarkAmmo.png b/graphics/HUD/Icons/A_DarkAmmo.png
deleted file mode 100644
index 7b43c4c2f..000000000
Binary files a/graphics/HUD/Icons/A_DarkAmmo.png and /dev/null differ
diff --git a/graphics/HUD/Icons/A_EMPCore.png b/graphics/HUD/Icons/A_EMPCore.png
deleted file mode 100644
index 7b43c4c2f..000000000
Binary files a/graphics/HUD/Icons/A_EMPCore.png and /dev/null differ
diff --git a/graphics/HUD/Icons/A_GrandAmmo.png b/graphics/HUD/Icons/A_GrandAmmo.png
deleted file mode 100644
index 7b43c4c2f..000000000
Binary files a/graphics/HUD/Icons/A_GrandAmmo.png and /dev/null differ
diff --git a/graphics/HUD/Icons/A_GrandSpear.png b/graphics/HUD/Icons/A_GrandSpear.png
deleted file mode 100644
index 7b43c4c2f..000000000
Binary files a/graphics/HUD/Icons/A_GrandSpear.png and /dev/null differ
diff --git a/graphics/HUD/Icons/A_MRAmmo.png b/graphics/HUD/Icons/A_MRAmmo.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_MRAmmo.png and b/graphics/HUD/Icons/A_MRAmmo.png differ
diff --git a/graphics/HUD/Icons/A_MRGrenade.png b/graphics/HUD/Icons/A_MRGrenade.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_MRGrenade.png and b/graphics/HUD/Icons/A_MRGrenade.png differ
diff --git a/graphics/HUD/Icons/A_MRRound.png b/graphics/HUD/Icons/A_MRRound.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_MRRound.png and b/graphics/HUD/Icons/A_MRRound.png differ
diff --git a/graphics/HUD/Icons/A_QuadAmmo.png b/graphics/HUD/Icons/A_QuadAmmo.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_QuadAmmo.png and b/graphics/HUD/Icons/A_QuadAmmo.png differ
diff --git a/graphics/HUD/Icons/A_RayAmmo.png b/graphics/HUD/Icons/A_RayAmmo.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_RayAmmo.png and b/graphics/HUD/Icons/A_RayAmmo.png differ
diff --git a/graphics/HUD/Icons/A_RayBattery.png b/graphics/HUD/Icons/A_RayBattery.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_RayBattery.png and b/graphics/HUD/Icons/A_RayBattery.png differ
diff --git a/graphics/HUD/Icons/A_RayBolt.png b/graphics/HUD/Icons/A_RayBolt.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_RayBolt.png and b/graphics/HUD/Icons/A_RayBolt.png differ
diff --git a/graphics/HUD/Icons/A_SMW05Ammo.png b/graphics/HUD/Icons/A_SMW05Ammo.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_SMW05Ammo.png and b/graphics/HUD/Icons/A_SMW05Ammo.png differ
diff --git a/graphics/HUD/Icons/A_SheenAmmo.png b/graphics/HUD/Icons/A_SheenAmmo.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_SheenAmmo.png and b/graphics/HUD/Icons/A_SheenAmmo.png differ
diff --git a/graphics/HUD/Icons/A_SilverBullet2.png b/graphics/HUD/Icons/A_SilverBullet2.png
index 4597d055d..fe8df615e 100644
Binary files a/graphics/HUD/Icons/A_SilverBullet2.png 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
index dff86ef16..6dfdf28d6 100644
Binary files a/graphics/HUD/Icons/A_SilverBulletBullet.png 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
index 588f26316..ded4f8264 100644
Binary files a/graphics/HUD/Icons/A_SilverBulletBullet2.png and b/graphics/HUD/Icons/A_SilverBulletBullet2.png differ
diff --git a/graphics/HUD/Icons/A_SparkBAmmo.png b/graphics/HUD/Icons/A_SparkBAmmo.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_SparkBAmmo.png and b/graphics/HUD/Icons/A_SparkBAmmo.png differ
diff --git a/graphics/HUD/Icons/A_SparkRAmmo.png b/graphics/HUD/Icons/A_SparkRAmmo.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_SparkRAmmo.png and b/graphics/HUD/Icons/A_SparkRAmmo.png differ
diff --git a/graphics/HUD/Icons/A_UltimateAmmo.png b/graphics/HUD/Icons/A_UltimateAmmo.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_UltimateAmmo.png and b/graphics/HUD/Icons/A_UltimateAmmo.png differ
diff --git a/graphics/HUD/Icons/A_UltimatePod.png b/graphics/HUD/Icons/A_UltimatePod.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/A_UltimatePod.png and b/graphics/HUD/Icons/A_UltimatePod.png differ
diff --git a/graphics/HUD/Icons/W_Blackfire.png b/graphics/HUD/Icons/W_Blackfire.png
deleted file mode 100644
index 7b43c4c2f..000000000
Binary files a/graphics/HUD/Icons/W_Blackfire.png and /dev/null differ
diff --git a/graphics/HUD/Icons/W_EMPCarbine.png b/graphics/HUD/Icons/W_EMPCarbine.png
deleted file mode 100644
index 7b43c4c2f..000000000
Binary files a/graphics/HUD/Icons/W_EMPCarbine.png and /dev/null differ
diff --git a/graphics/HUD/Icons/W_ExplodiumGun2.png b/graphics/HUD/Icons/W_ExplodiumGun2.png
index 673b16cef..3c4380d55 100644
Binary files a/graphics/HUD/Icons/W_ExplodiumGun2.png and b/graphics/HUD/Icons/W_ExplodiumGun2.png differ
diff --git a/graphics/HUD/Icons/W_FistGun.png b/graphics/HUD/Icons/W_FistGun.png
deleted file mode 100644
index 7b43c4c2f..000000000
Binary files a/graphics/HUD/Icons/W_FistGun.png and /dev/null differ
diff --git a/graphics/HUD/Icons/W_GrandLance.png b/graphics/HUD/Icons/W_GrandLance.png
deleted file mode 100644
index 7b43c4c2f..000000000
Binary files a/graphics/HUD/Icons/W_GrandLance.png and /dev/null differ
diff --git a/graphics/HUD/Icons/W_ItamexHammer.png b/graphics/HUD/Icons/W_ItamexHammer.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/W_ItamexHammer.png and b/graphics/HUD/Icons/W_ItamexHammer.png differ
diff --git a/graphics/HUD/Icons/W_MortalRifle.png b/graphics/HUD/Icons/W_MortalRifle.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/W_MortalRifle.png and b/graphics/HUD/Icons/W_MortalRifle.png differ
diff --git a/graphics/HUD/Icons/W_NewSparkster.png b/graphics/HUD/Icons/W_NewSparkster.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/W_NewSparkster.png and b/graphics/HUD/Icons/W_NewSparkster.png differ
diff --git a/graphics/HUD/Icons/W_PlasmaBlast.png b/graphics/HUD/Icons/W_PlasmaBlast.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/W_PlasmaBlast.png and b/graphics/HUD/Icons/W_PlasmaBlast.png differ
diff --git a/graphics/HUD/Icons/W_PlasmaBlast2.png b/graphics/HUD/Icons/W_PlasmaBlast2.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/W_PlasmaBlast2.png and b/graphics/HUD/Icons/W_PlasmaBlast2.png differ
diff --git a/graphics/HUD/Icons/W_PuntzerBeta.png b/graphics/HUD/Icons/W_PuntzerBeta.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/W_PuntzerBeta.png and b/graphics/HUD/Icons/W_PuntzerBeta.png differ
diff --git a/graphics/HUD/Icons/W_PuntzerGamma.png b/graphics/HUD/Icons/W_PuntzerGamma.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/W_PuntzerGamma.png and b/graphics/HUD/Icons/W_PuntzerGamma.png differ
diff --git a/graphics/HUD/Icons/W_Quadravol.png b/graphics/HUD/Icons/W_Quadravol.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/W_Quadravol.png and b/graphics/HUD/Icons/W_Quadravol.png differ
diff --git a/graphics/HUD/Icons/W_RafanKos.png b/graphics/HUD/Icons/W_RafanKos.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/W_RafanKos.png and b/graphics/HUD/Icons/W_RafanKos.png differ
diff --git a/graphics/HUD/Icons/W_RayKhom.png b/graphics/HUD/Icons/W_RayKhom.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/W_RayKhom.png and b/graphics/HUD/Icons/W_RayKhom.png differ
diff --git a/graphics/HUD/Icons/W_SheenHMG.png b/graphics/HUD/Icons/W_SheenHMG.png
index 7b43c4c2f..b516b82d2 100644
Binary files a/graphics/HUD/Icons/W_SheenHMG.png and b/graphics/HUD/Icons/W_SheenHMG.png differ
diff --git a/graphics/KBase/FrameTex.png b/graphics/KBase/FrameTex.png
new file mode 100644
index 000000000..79a975e64
Binary files /dev/null and b/graphics/KBase/FrameTex.png differ
diff --git a/graphics/KBase/HSepTex.png b/graphics/KBase/HSepTex.png
new file mode 100644
index 000000000..d7f1095b4
Binary files /dev/null and b/graphics/KBase/HSepTex.png differ
diff --git a/graphics/KBase/LibraryTabSeparator.png b/graphics/KBase/LibraryTabSeparator.png
deleted file mode 100644
index 614fc728e..000000000
Binary files a/graphics/KBase/LibraryTabSeparator.png and /dev/null differ
diff --git a/graphics/KBase/LibraryTabSeparatorJP.png b/graphics/KBase/LibraryTabSeparatorJP.png
deleted file mode 100644
index be0670830..000000000
Binary files a/graphics/KBase/LibraryTabSeparatorJP.png and /dev/null differ
diff --git a/graphics/KBase/MainWindow.png b/graphics/KBase/MainWindow.png
deleted file mode 100644
index acea0d714..000000000
Binary files a/graphics/KBase/MainWindow.png and /dev/null differ
diff --git a/graphics/KBase/PFP_Ashley.png b/graphics/KBase/PFP_Ashley.png
new file mode 100644
index 000000000..425e3c0b9
Binary files /dev/null and b/graphics/KBase/PFP_Ashley.png differ
diff --git a/graphics/KBase/PFP_Bigshot.png b/graphics/KBase/PFP_Bigshot.png
new file mode 100644
index 000000000..8c600d624
Binary files /dev/null and b/graphics/KBase/PFP_Bigshot.png differ
diff --git a/graphics/KBase/PFP_Cytho.png b/graphics/KBase/PFP_Cytho.png
new file mode 100644
index 000000000..29a110a88
Binary files /dev/null and b/graphics/KBase/PFP_Cytho.png differ
diff --git a/graphics/KBase/PFP_Demolitionist.png b/graphics/KBase/PFP_Demolitionist.png
new file mode 100644
index 000000000..47a19c4af
Binary files /dev/null and b/graphics/KBase/PFP_Demolitionist.png differ
diff --git a/graphics/KBase/PFP_Ellen.png b/graphics/KBase/PFP_Ellen.png
new file mode 100644
index 000000000..d09b2036b
Binary files /dev/null and b/graphics/KBase/PFP_Ellen.png differ
diff --git a/graphics/KBase/PFP_Ibuki.png b/graphics/KBase/PFP_Ibuki.png
new file mode 100644
index 000000000..76b50f3e5
Binary files /dev/null and b/graphics/KBase/PFP_Ibuki.png differ
diff --git a/graphics/KBase/PFP_Kirin.png b/graphics/KBase/PFP_Kirin.png
new file mode 100644
index 000000000..d250999e0
Binary files /dev/null and b/graphics/KBase/PFP_Kirin.png differ
diff --git a/graphics/KBase/PFP_Kmonn.png b/graphics/KBase/PFP_Kmonn.png
new file mode 100644
index 000000000..6253f687d
Binary files /dev/null and b/graphics/KBase/PFP_Kmonn.png differ
diff --git a/graphics/KBase/PFP_Locke.png b/graphics/KBase/PFP_Locke.png
new file mode 100644
index 000000000..d3710be34
Binary files /dev/null and b/graphics/KBase/PFP_Locke.png differ
diff --git a/graphics/KBase/PFP_Maidbot.png b/graphics/KBase/PFP_Maidbot.png
new file mode 100644
index 000000000..9d15fbfd3
Binary files /dev/null and b/graphics/KBase/PFP_Maidbot.png differ
diff --git a/graphics/KBase/PFP_Nana.png b/graphics/KBase/PFP_Nana.png
new file mode 100644
index 000000000..088c63ccc
Binary files /dev/null and b/graphics/KBase/PFP_Nana.png differ
diff --git a/graphics/KBase/PFP_Ryuji.png b/graphics/KBase/PFP_Ryuji.png
new file mode 100644
index 000000000..5fa4547e1
Binary files /dev/null and b/graphics/KBase/PFP_Ryuji.png differ
diff --git a/graphics/KBase/PFP_Saya.png b/graphics/KBase/PFP_Saya.png
new file mode 100644
index 000000000..6640007b4
Binary files /dev/null and b/graphics/KBase/PFP_Saya.png differ
diff --git a/graphics/KBase/PFP_Taro.png b/graphics/KBase/PFP_Taro.png
new file mode 100644
index 000000000..cd5fe629b
Binary files /dev/null and b/graphics/KBase/PFP_Taro.png differ
diff --git a/graphics/KBase/PFP_Unissix.png b/graphics/KBase/PFP_Unissix.png
new file mode 100644
index 000000000..b9faab43e
Binary files /dev/null and b/graphics/KBase/PFP_Unissix.png differ
diff --git a/graphics/KBase/PFP_Yui.png b/graphics/KBase/PFP_Yui.png
new file mode 100644
index 000000000..ca40a884a
Binary files /dev/null and b/graphics/KBase/PFP_Yui.png differ
diff --git a/graphics/KBase/PFP_Zanaveth2.png b/graphics/KBase/PFP_Zanaveth2.png
new file mode 100644
index 000000000..a0bdf04e3
Binary files /dev/null and b/graphics/KBase/PFP_Zanaveth2.png differ
diff --git a/graphics/KBase/PFP_Zanaveth3.png b/graphics/KBase/PFP_Zanaveth3.png
new file mode 100644
index 000000000..bcf4046b0
Binary files /dev/null and b/graphics/KBase/PFP_Zanaveth3.png differ
diff --git a/graphics/KBase/TabSeparator.png b/graphics/KBase/TabSeparator.png
deleted file mode 100644
index b22e21515..000000000
Binary files a/graphics/KBase/TabSeparator.png and /dev/null differ
diff --git a/graphics/KBase/VSepTex.png b/graphics/KBase/VSepTex.png
new file mode 100644
index 000000000..aa8fcc3fa
Binary files /dev/null and b/graphics/KBase/VSepTex.png differ
diff --git a/graphics/KBase/WindowSeparator.png b/graphics/KBase/WindowSeparator.png
deleted file mode 100644
index 295b8cbab..000000000
Binary files a/graphics/KBase/WindowSeparator.png and /dev/null differ
diff --git a/graphics/KBase/WindowSeparatorH.png b/graphics/KBase/WindowSeparatorH.png
deleted file mode 100644
index 76c433582..000000000
Binary files a/graphics/KBase/WindowSeparatorH.png and /dev/null differ
diff --git a/graphics/M_DEMOCHAN_BIOSPARK.png b/graphics/M_DEMOCHAN_BIOSPARK.png
new file mode 100644
index 000000000..19180f59e
Binary files /dev/null and b/graphics/M_DEMOCHAN_BIOSPARK.png differ
diff --git a/graphics/M_DEMOCHAN_CANDYGUN.png b/graphics/M_DEMOCHAN_CANDYGUN.png
new file mode 100644
index 000000000..1b7e2e757
Binary files /dev/null and b/graphics/M_DEMOCHAN_CANDYGUN.png differ
diff --git a/graphics/M_DEMOCHAN_DAB.png b/graphics/M_DEMOCHAN_DAB.png
new file mode 100644
index 000000000..ee4194464
Binary files /dev/null and b/graphics/M_DEMOCHAN_DAB.png differ
diff --git a/graphics/M_DEMOCHAN_DEEPIMPACT.png b/graphics/M_DEMOCHAN_DEEPIMPACT.png
new file mode 100644
index 000000000..a235c0ce9
Binary files /dev/null and b/graphics/M_DEMOCHAN_DEEPIMPACT.png differ
diff --git a/graphics/M_DEMOCHAN_DOUBLEV.png b/graphics/M_DEMOCHAN_DOUBLEV.png
new file mode 100644
index 000000000..dff26ef2f
Binary files /dev/null and b/graphics/M_DEMOCHAN_DOUBLEV.png differ
diff --git a/graphics/M_DEMOCHAN_EVISCERATOR.png b/graphics/M_DEMOCHAN_EVISCERATOR.png
new file mode 100644
index 000000000..122837a26
Binary files /dev/null and b/graphics/M_DEMOCHAN_EVISCERATOR.png differ
diff --git a/graphics/M_DEMOCHAN_EXPLOGUN.png b/graphics/M_DEMOCHAN_EXPLOGUN.png
new file mode 100644
index 000000000..96785cf5f
Binary files /dev/null and b/graphics/M_DEMOCHAN_EXPLOGUN.png differ
diff --git a/graphics/M_DEMOCHAN_HEALTH.png b/graphics/M_DEMOCHAN_HEALTH.png
new file mode 100644
index 000000000..d47ab5e2b
Binary files /dev/null and b/graphics/M_DEMOCHAN_HEALTH.png differ
diff --git a/graphics/M_DEMOCHAN_HELLBLAZER.png b/graphics/M_DEMOCHAN_HELLBLAZER.png
new file mode 100644
index 000000000..c0eaef577
Binary files /dev/null and b/graphics/M_DEMOCHAN_HELLBLAZER.png differ
diff --git a/graphics/M_DEMOCHAN_LOVE.png b/graphics/M_DEMOCHAN_LOVE.png
new file mode 100644
index 000000000..c27ab00ce
Binary files /dev/null and b/graphics/M_DEMOCHAN_LOVE.png differ
diff --git a/graphics/M_DEMOCHAN_PUSHER.png b/graphics/M_DEMOCHAN_PUSHER.png
new file mode 100644
index 000000000..80f5c3cf7
Binary files /dev/null and b/graphics/M_DEMOCHAN_PUSHER.png differ
diff --git a/graphics/M_DEMOCHAN_RAGEKIT.png b/graphics/M_DEMOCHAN_RAGEKIT.png
new file mode 100644
index 000000000..0b9ab6087
Binary files /dev/null and b/graphics/M_DEMOCHAN_RAGEKIT.png differ
diff --git a/graphics/M_DEMOCHAN_SANDWICH.png b/graphics/M_DEMOCHAN_SANDWICH.png
new file mode 100644
index 000000000..ab493fe14
Binary files /dev/null and b/graphics/M_DEMOCHAN_SANDWICH.png differ
diff --git a/graphics/M_DEMOCHAN_SHELLS.png b/graphics/M_DEMOCHAN_SHELLS.png
new file mode 100644
index 000000000..ccc052d7b
Binary files /dev/null and b/graphics/M_DEMOCHAN_SHELLS.png differ
diff --git a/graphics/M_DEMOCHAN_SILVERBULLET.png b/graphics/M_DEMOCHAN_SILVERBULLET.png
new file mode 100644
index 000000000..b954e550f
Binary files /dev/null and b/graphics/M_DEMOCHAN_SILVERBULLET.png differ
diff --git a/graphics/M_DEMOCHAN_SKULL.png b/graphics/M_DEMOCHAN_SKULL.png
new file mode 100644
index 000000000..79e9798ea
Binary files /dev/null and b/graphics/M_DEMOCHAN_SKULL.png differ
diff --git a/graphics/M_DEMOCHAN_SPREADGUN.png b/graphics/M_DEMOCHAN_SPREADGUN.png
new file mode 100644
index 000000000..235ad2bc7
Binary files /dev/null and b/graphics/M_DEMOCHAN_SPREADGUN.png differ
diff --git a/graphics/M_DEMOCHAN_THONK.png b/graphics/M_DEMOCHAN_THONK.png
new file mode 100644
index 000000000..d13021f71
Binary files /dev/null and b/graphics/M_DEMOCHAN_THONK.png differ
diff --git a/graphics/M_DEMOCHAN_THUMBUP.png b/graphics/M_DEMOCHAN_THUMBUP.png
new file mode 100644
index 000000000..8c06766a0
Binary files /dev/null and b/graphics/M_DEMOCHAN_THUMBUP.png differ
diff --git a/graphics/M_DEMOCHAN_WALLBUSTER.png b/graphics/M_DEMOCHAN_WALLBUSTER.png
new file mode 100644
index 000000000..da2839e95
Binary files /dev/null and b/graphics/M_DEMOCHAN_WALLBUSTER.png differ
diff --git a/graphics/M_DEMOCHAN_YNYKRON.png b/graphics/M_DEMOCHAN_YNYKRON.png
new file mode 100644
index 000000000..3c2151d3d
Binary files /dev/null and b/graphics/M_DEMOCHAN_YNYKRON.png differ
diff --git a/graphics/M_DEMOLITIONIST.png b/graphics/M_DEMOLITIONIST.png
new file mode 100644
index 000000000..b9f3a1723
Binary files /dev/null and b/graphics/M_DEMOLITIONIST.png differ
diff --git a/graphics/M_GRAD.png b/graphics/M_GRAD.png
new file mode 100644
index 000000000..1793e8453
Binary files /dev/null and b/graphics/M_GRAD.png differ
diff --git a/graphics/NewLogo.png b/graphics/NewLogo.png
new file mode 100644
index 000000000..26e519b0d
Binary files /dev/null and b/graphics/NewLogo.png differ
diff --git a/graphics/NewLogo_Grad.png b/graphics/NewLogo_Grad.png
new file mode 100644
index 000000000..ab24d4aae
Binary files /dev/null and b/graphics/NewLogo_Grad.png differ
diff --git a/graphics/NewLogo_Layer1.png b/graphics/NewLogo_Layer1.png
new file mode 100644
index 000000000..8e54d66db
Binary files /dev/null and b/graphics/NewLogo_Layer1.png differ
diff --git a/graphics/NewLogo_Layer2.png b/graphics/NewLogo_Layer2.png
new file mode 100644
index 000000000..e40010ac2
Binary files /dev/null and b/graphics/NewLogo_Layer2.png differ
diff --git a/graphics/NewLogo_Layer3.png b/graphics/NewLogo_Layer3.png
new file mode 100644
index 000000000..f6a3bf37a
Binary files /dev/null and b/graphics/NewLogo_Layer3.png differ
diff --git a/graphics/NewLogo_Letter0.png b/graphics/NewLogo_Letter0.png
new file mode 100644
index 000000000..1ebffda96
Binary files /dev/null and b/graphics/NewLogo_Letter0.png differ
diff --git a/graphics/NewLogo_Letter1.png b/graphics/NewLogo_Letter1.png
new file mode 100644
index 000000000..05cb28140
Binary files /dev/null and b/graphics/NewLogo_Letter1.png differ
diff --git a/graphics/NewLogo_Letter10.png b/graphics/NewLogo_Letter10.png
new file mode 100644
index 000000000..a6b3fb34b
Binary files /dev/null and b/graphics/NewLogo_Letter10.png differ
diff --git a/graphics/NewLogo_Letter11.png b/graphics/NewLogo_Letter11.png
new file mode 100644
index 000000000..2367c1676
Binary files /dev/null and b/graphics/NewLogo_Letter11.png differ
diff --git a/graphics/NewLogo_Letter12.png b/graphics/NewLogo_Letter12.png
new file mode 100644
index 000000000..b82e01b0e
Binary files /dev/null and b/graphics/NewLogo_Letter12.png differ
diff --git a/graphics/NewLogo_Letter2.png b/graphics/NewLogo_Letter2.png
new file mode 100644
index 000000000..d34de4b4b
Binary files /dev/null and b/graphics/NewLogo_Letter2.png differ
diff --git a/graphics/NewLogo_Letter3.png b/graphics/NewLogo_Letter3.png
new file mode 100644
index 000000000..c7d6842cc
Binary files /dev/null and b/graphics/NewLogo_Letter3.png differ
diff --git a/graphics/NewLogo_Letter4.png b/graphics/NewLogo_Letter4.png
new file mode 100644
index 000000000..89eab4ef8
Binary files /dev/null and b/graphics/NewLogo_Letter4.png differ
diff --git a/graphics/NewLogo_Letter5.png b/graphics/NewLogo_Letter5.png
new file mode 100644
index 000000000..dfab5f003
Binary files /dev/null and b/graphics/NewLogo_Letter5.png differ
diff --git a/graphics/NewLogo_Letter6.png b/graphics/NewLogo_Letter6.png
new file mode 100644
index 000000000..4d411999e
Binary files /dev/null and b/graphics/NewLogo_Letter6.png differ
diff --git a/graphics/NewLogo_Letter7.png b/graphics/NewLogo_Letter7.png
new file mode 100644
index 000000000..e3a2d69a9
Binary files /dev/null and b/graphics/NewLogo_Letter7.png differ
diff --git a/graphics/NewLogo_Letter8.png b/graphics/NewLogo_Letter8.png
new file mode 100644
index 000000000..65af7caea
Binary files /dev/null and b/graphics/NewLogo_Letter8.png differ
diff --git a/graphics/NewLogo_Letter9.png b/graphics/NewLogo_Letter9.png
new file mode 100644
index 000000000..86dcd2692
Binary files /dev/null and b/graphics/NewLogo_Letter9.png differ
diff --git a/graphics/bord_bl.png b/graphics/bord_bl.png
index ce41492fc..40360f20c 100644
Binary files a/graphics/bord_bl.png and b/graphics/bord_bl.png differ
diff --git a/graphics/bord_tr.png b/graphics/bord_tr.png
index 8a2ed1dc1..68e3fc65d 100644
Binary files a/graphics/bord_tr.png and b/graphics/bord_tr.png differ
diff --git a/graphics/swwmback.png b/graphics/swwmback.png
index 573538768..e173f3f8d 100644
Binary files a/graphics/swwmback.png and b/graphics/swwmback.png differ
diff --git a/graphics/swwmpause.png b/graphics/swwmpause.png
deleted file mode 100644
index 58c76b731..000000000
Binary files a/graphics/swwmpause.png and /dev/null differ
diff --git a/language.def_base b/language.def_base
index 254518ac6..07c2f86f6 100644
--- a/language.def_base
+++ b/language.def_base
@@ -33,15 +33,10 @@ T_SHEENHMG = "Sheen HMG";
I_SHEENHMG = "\"Sheen\" Heavy Machine Gun";
T_QUADRAVOL = "Quadravol";
I_QUADRAVOL = "\"Quadravol\" Fireball Launcher";
-T_BLACKFIRE = "Blackfire Igniter";
-T_EMPCARBINE = "Rail Carbine";
-I_EMPCARBINE = "EMP Rail Carbine";
-T_RAYKHOM = "Ray-Khom";
-T_GRANDLANCE = "Grand Lance";
-T_FISTGUN = "Hand of Divine";
T_NEWSPARKSTER = "Sparkster Rifle";
I_NEWSPARKSTER = "Series x3 Sparkster Rifle";
T_MORTALRIFLE = "Mortal Rifle";
+T_RAYKHOM = "Ray-Khom";
T_RAFANKOS = "Rafan-Kos";
T_REDSHELL = "Shell";
T_REDSHELLS = "Shells";
@@ -101,20 +96,6 @@ T_SHEENBULLET = "14.5x114mm MT Bullet";
T_SHEENBULLETS = "14.5x114mm MT Bullets";
T_QUADAMMO = "Quadravol Cell";
T_QUADAMMOS = "Quadravol Cells";
-T_DARKAMMO = "Blackfire Canister";
-T_DARKAMMOS = "Blackfire Canisters";
-T_EMPCORE = "Dysedum Rod";
-T_EMPCORES = "Dysedum Rods";
-T_RAYBOLT = "Ray-Khom Bolt";
-T_RAYBOLTS = "Ray-Khom Bolts";
-T_RAYAMMO = "Ray-Khom Magazine";
-T_RAYAMMOS = "Ray-Khom Magazines";
-T_RAYBATTERY = "Ray-Khom Battery";
-T_RAYBATTERYS = "Ray-Khom Batteries";
-T_GRANDSPEAR = "Grand Lance Spear";
-T_GRANDSPEARS = "Grand Lance Spears";
-T_GRANDAMMO = "Grand Lance Magazine";
-T_GRANDAMMOS = "Grand Lance Magazines";
T_SPARKBCELL = "Kinylum Cell";
T_SPARKBCELLS = "Kinylum Cells";
T_SPARKRCELL = "Nokron Cell";
@@ -125,6 +106,12 @@ T_MRAMMO = "Mortal Magazine";
T_MRAMMOS = "Mortal Magazines";
T_MRGRENADE = "Mortal Grenade";
T_MRGRENADES = "Mortal Grenades";
+T_RAYBOLT = "Ray-Khom Bolt";
+T_RAYBOLTS = "Ray-Khom Bolts";
+T_RAYAMMO = "Ray-Khom Magazine";
+T_RAYAMMOS = "Ray-Khom Magazines";
+T_RAYBATTERY = "Ray-Khom Battery";
+T_RAYBATTERYS = "Ray-Khom Batteries";
T_ULTIMATEPOD = "Rafan-Kos Pod";
T_ULTIMATEPODS = "Rafan-Kos Pods";
T_ULTIMATEAMMO = "Rafan-Kos Magazine";
@@ -173,14 +160,7 @@ T_MILKBREAD = "Akkouxhei Milk Bread";
T_KIRINMANGA = "Saya Miyamoto - I Married A Cherry Boy Emperor But It Turns Out He's Really Cute In Lingerie?!";
T_KIRINPLUSH = "Emperor Kirin Plush";
T_MOTHPLUSH = "Mashiro Plush";
-T_AA12 = "Auto Assault-12 Replica";
-T_HEGE = "Hege Cactus";
-T_HOAGIE = "Hoagie";
-T_IBUKIMILK = "Akari Labs All-Natural Red Oni Milk";
-T_BRCALBUM = "Black Rat's Coven - Counter-Inquisition";
-T_MANAROKOU = "Manarock";
-T_LITHIUM = "Lithium - Volume One";
-T_PSYKKONOVEXX = "Psykkonovexx";
+T_SAYASMUG = "Saya's Coffee Mug";
// colored tags for keys
T_REDCARD = "\cgRed Keycard\c-";
T_BLUECARD = "\chBlue Keycard\c-";
@@ -221,7 +201,7 @@ TXT_DEFAULTPICKUPMSG = "Unidentified Item";
QUITMSG = "You really want to go?\nWhat a shame...";
QUITMSG1 = "Wow, don't just go and leave!\nThere's still a lot of stuff to do!";
QUITMSG2 = "Oh, you're going now?\nWell, see you around, then.";
-QUITMSG3 = "Thanks for playing \cySWWM GZ\c-.\nI hope to see you again soon.";
+QUITMSG3 = "Thank you for playing.\nI hope to see you again soon.";
QUITMSG4 = "";
QUITMSG5 = "Ah, fun time is over, I guess...";
QUITMSG6 = "My love for you is like a truck.\n\cg!!BERSERKER!!\c-";
@@ -241,9 +221,9 @@ QUITMSG19 = "World hard and cold,\ntiddy soft and warm.";
// startup (don't localize)
STARTUP1 =
"\n"
-" \ck★\cf∼\c- \cvDemo-chan says\c- \cf∼\ck★\c-\n"
+" \ck★\cf~\c- \cvDemo-chan says\c- \cf~\ck★\c-\n"
"\n"
-" \ck★\cf∼\c- \cvTERFs can fuck off\c- \cf∼\ck★\c-\n"
+" \ck★\cf~\c- \cvTERFs can fuck off\c- \cf~\ck★\c-\n"
"\n";
STARTUP2 = "";
STARTUP3 = "";
@@ -347,12 +327,13 @@ FN_MANCU_FUN2 = "Lard Lad";
FN_MANCU_FUN3 = "Fatass";
FN_MANCU_FUN4 = "Hump Yo Mom";
FN_MANCU_FUN5 = "Fat Bastard";
-FN_ARCH_FUNN = "5";
+FN_ARCH_FUNN = "6";
FN_ARCH_FUN1 = "1000 Points Off";
FN_ARCH_FUN2 = "Lanky Martian";
FN_ARCH_FUN3 = "Pls No";
FN_ARCH_FUN4 = "Fuck You";
FN_ARCH_FUN5 = "Your Day Has Been Ruined";
+FN_ARCH_FUN6 = "Flaming Hot Cheeks";
FN_SPIDER_FUNN = "5";
FN_SPIDER_FUN1 = "Mama Spooder";
FN_SPIDER_FUN2 = "Big Momma";
@@ -460,6 +441,7 @@ FN_BOSSBRAIN_FUN = "YOU WERE EXPECTING JOHN ROMERO BUT IT WAS ME, MARISA!";
FN_KEEN = "Commander Keen";
FN_KEEN_FUN = "Ruined by Bethesda";
FN_VOODOO = "Voodoo doll of %s";
+FN_VOODOO_NP = "Voodoo doll";
FN_PIG = "Pig";
FN_PIG_FUN = "Porker";
FN_WOLFGUARD = "Guard";
@@ -531,18 +513,11 @@ O_PUNTZERGAMMA = "%k drilled several holes through %o.";
O_SHEENHMG = "%k drowned %o in bullets.";
O_QUADRAVOL = "%k made delicious barbecue out of %o.";
O_QUADRAVOL2 = "%o was gravely roasted by %k.";
-O_BLACKFIRE = "%k turned %o into a popsicle.";
-O_BLACKFIRE2 = "%o was very coldly impaled by %k.";
-O_EMPCARBINE = "%o was quite shocked by %k's lightning powers.";
-O_RAYKHOM = "%o received an express delivery of deadly plasma from %k.";
-O_RAYKHOM2 = "%o witnessed %k's UNLIMITED POWER.";
-O_GRANDLANCE = "%o was torn asunder by %k's Grand Lance.";
-O_GRANDLANCE2 = "%k showed %o how efficient nuclear fusion is.";
-O_FISTGUN = "%o ate %k's divine knuckle sandwich.";
-O_FISTGUN2 = "%k delivered a divine bitchslap upon %o.";
O_NEWSPARKSTER = "%o witnessed the might of %k's plasma artillery.";
O_MORTALRIFLE = "%k killed %o very dead.";
O_MORTALRIFLEALT = "%o caught a very deadly grenade from %k.";
+O_RAYKHOM = "%o received an express delivery of deadly plasma from %k.";
+O_RAYKHOM2 = "%o witnessed %k's UNLIMITED POWER.";
O_RAFANKOS = "%o stood no chance against %k's ultimate weapon.";
O_POUND = "%o was very impressed by %k's landing.";
O_DASH = "%o was discombobulated by a very fast moving %k.";
@@ -574,7 +549,7 @@ OB_SPLASH = "%o got a bit too close there.";
OB_R_SPLASH = "%o did an Icarus.";
OB_ROCKET = "%o ate a rocket.";
OB_KILLEDSELF = "%o self-destructed.";
-OB_VOODOO = "%o violated the laws of causality.";
+OB_VOODOO = "%o shouldn't have touched that doll.";
OB_MPTELEFRAG = "%k overwrote %o.";
OB_MONTELEFRAG = "%o was overwritten.";
OB_DEFAULT = "%o is ded.";
@@ -686,36 +661,56 @@ D_TETHERFAIL = "The Safety Tether link was obstructed.";
D_MASHIRO = "\cjShe knows where you are...\c-";
SWWM_YNYKRONREADY = "Ynykron Artifact ready for firing.";
SWWM_SWAPWEAPON = "\cjPress \cfUse\cj to swap \cf%s\cj for \cf%s\cj.\c-";
+SWWM_TITLEPRESENTSA = "UnSX Team";
+SWWM_TITLEPRESENTSB = "presents";
SWWM_TITLEPRESENTS = "presents";
+SWWM_TITLEMODBYA = "a mod by";
+SWWM_TITLEMODBYB = "Marisa Kirisame";
SWWM_TITLEMODBY = "a mod by \cxMarisa Kirisame";
-SWWM_TITLESCROLL = "SWWM GZ ~ Cute Robutt Whomst Love To Explode Demons\n"
-"A wondrous GZDoom gameplay mod by Marisa Kirisame of UnSX Team\n"
-"Lovingly designed 3D models with hand-painted 256-color dithered textures\n"
-"Almost 60k lines of ZScript, and still counting (god help me)\n"
-"The deepest lore this side of the Doom Modiverse\n"
-"And much much more!\n"
-"Greetz to Mub, Ribbed, Slemg, Bunr, Kegbine, Term-kun, Hype64, Bartendy, Skelly, Mr. BIG SHOT WildWeasel, Endy, Mima-sama, Sinkie, BillowPlaster, Disgusting Dog Water, Dangle Logo, Lämp Paipu, Leek Spah, Boingy, MarTREE, Dusty Demon Bread, Roasted Rock, Ed the Netcode Boy, Thirst Cactus, JimJam, Cappy Jay, A Nom, Missy Fits, Minor Cookie, Squid Kid, YukiCute, MafSulk, FineRaff25, NetroRutcase, ShudTheFugUpRyan, Kobl, Cacous Seriodemon, Zomb, Man of Chins, Bun Pun, Zikeous Shadestructor, Blimyot, Baja Blast Tittums, DrySpy.py, Typo Gem, Wantopus, Morf, Daedalus, Popato, SpengRob, Sgt. Shellpost, Loud M, Snk, Donut, C.Kid, Emit Birb, You Go To Sleep, Rach, Le No Chicken, Murasa, Smart Cactus Dude, Phantomboobs, Sanae Kochiya, Gardeboy, Cat, HK417, Smol Koa, Joe Mama, Jahn, Guta, Glue, Atan, Schweet Prints, Angury Teeth Practitioner, Sell Her, MiSiFu, Portuguese Sausage, Scoob Stub, Actually Jabba, Very Honest Cat, Chiaki's Tit Mole, Homie, Snacks, Tubz, Toof, Teef, Frisp, Trashkat, Succ 'n Spicy, Melissa Follower When, Shokku, Scummyboi, Kat Gravity Rush, John Romero, John Carmack, Tim Allen, Tim Sweeney and last but not least my beloved pet dragon\n"
-"I tried to squeeze as many names as possible in there, that I could remember, at least, so if you're not in there and want in, feel free to ask\n"
-"There's nothing else to see here, the scroll will now wrap around, see you again, have a nice day";
+SWWM_TITLEINTROA = "On that day, humankind saw itself in dire danger, facing an impending doom.";
+SWWM_TITLEINTROB = "But one machine stood up, who fought back, who could end this whole invasion.";
+SWWM_TITLEINTROC = "The demons would learn to fear that machine, who they know only by one name...";
+SWWM_NTITLESCROLL = "9";
+SWWM_TITLESCROLL1 = "SWWM GZ ~ Cute Robutt Whomst Love To Explode Demons";
+SWWM_TITLESCROLL1_NEW = "Codename: Demolitionist ~ Cute Robutt Whomst Love To Explode Demons";
+SWWM_TITLESCROLL2 = "A wondrous GZDoom gameplay mod by Marisa Kirisame of UnSX Team";
+SWWM_TITLESCROLL3 = "Lovingly designed 3D models with hand-painted 256-color dithered textures";
+SWWM_TITLESCROLL4 = "Over 60k lines of ZScript, and still counting (god help me)";
+SWWM_TITLESCROLL5 = "The deepest lore this side of the Doom Modiverse";
+SWWM_TITLESCROLL6 = "And much much more!";
+SWWM_TITLESCROLL7 = "Greetz to Mub, Ribbed, Slemg, Bunr, Kegbine, Term-kun, Hype64, Bartendy, Skelly, Mr. BIG SHOT WildWeasel, Endy, Mima-sama, Sinkie, BillowPlaster, Disgusting Dog Water, Dangle Logo, Lämp Paipu, Leek Spah, Boingy, MarTREE, Dusty Demon Bread, Roasted Rock, Ed the Netcode Boy, Thirst Cactus, JimJam, Cappy Jay, A Nom, Missy Fits, Minor Cookie, Squid Kid, YukiCute, MafSulk, FineRaff25, NetroRutcase, ShudTheFugUpRyan, Kobl, Cacous Seriodemon, Zomb, Man of Chins, Bun Pun, Zikeous Shadestructor, Blimyot, Baja Blast Tittums, DrySpy.py, Typo Gem, Wantopus, Morf, Daedalus, Popato, SpengRob, Sgt. Shellpost, Loud M, Snk, Donut, C.Kid, Emit Birb, You Go To Sleep, Rach, Le No Chicken, Murasa, Smart Cactus Dude, Phantomboobs, Sanae Kochiya, Gardeboy, Cat, HK417, Smol Koa, Joe Mama, Jahn, Guta, Glue, Atan, Schweet Prints, Angury Teeth Practitioner, Sell Her, MiSiFu, Portuguese Sausage, Scoob Stub, Actually Jabba, Very Honest Cat, Chiaki's Tit Mole, Homie, Snacks, Tubz, Toof, Teef, Frisp, Trashkat, Succ 'n Spicy, Melissa Follower When, Shokku, Scummyboi, Kat Gravity Rush, John Romero, John Carmack, Tim Allen, Tim Sweeney and last but not least my beloved pet dragon";
+SWWM_TITLESCROLL8 = "I tried to squeeze as many names as possible in there, that I could remember, at least, so if you're not in there and want in, feel free to ask";
+SWWM_TITLESCROLL9 = "There's nothing else to see here, the scroll will now wrap around, see you again, have a nice day";
+SWWM_NTITLESUB = "14";
+SWWM_TITLESUB1 = "The World Is In Danger And We Have Just Sent\nThis Double-Cheeked Sassy Robot To Save It!?";
+SWWM_TITLESUB2 = "&Knuckles";
+SWWM_TITLESUB3 = "The mod previously known as SWWM GZ";
+SWWM_TITLESUB4 = "I'm so sorry, Icarus, but you\ncan no longer call this Swim Jizz";
+SWWM_TITLESUB5 = "Do you like guns? We got guns!\nBig guns! Small guns! All the guns!";
+SWWM_TITLESUB6 = "Featuring revolutionary Shiny Metal Cheeks™ technology!";
+SWWM_TITLESUB7 = "This ain't your ordinary gameplay mod, no sir";
+SWWM_TITLESUB8 = "The misadventures of a very sassy robot\nand all their fun explosive toys";
+SWWM_TITLESUB9 = "Featuring Dante from the Devil May Cry series\n(not really, that's a joke)";
+SWWM_TITLESUB10 = "";
+SWWM_TITLESUB11 = "Slaughterwads too hard? No problem!\nJust play them with this mod!";
+SWWM_TITLESUB12 = " Did you know this subtitle is misaligned?";
+SWWM_TITLESUB13 = "I like big explosions and I cannot lie";
+SWWM_TITLESUB14 = "If you wrapped a cat in a tortilla,\nwould you call that a purrito?";
SWWM_UNIT_METER = "m";
SWWM_UNIT_KILOMETER = "km";
-SWWM_UNIT_KPH = "km/h";
+SWWM_UNIT_KPH = "kph";
SWWM_UNIT_LITER = "l";
SWWM_YOURSELF = "Yourself";
SWWM_DOKIDOKI = "The Power of Love™";
SWWM_GRAVKILL = "Gravity";
SWWM_PARRYKILL = "Deflected Projectiles";
-SWWM_SETSLOTSTRICT = "\cg!!!WARNING!!!\c-\n\cj\"setslotstrict\" is enabled. This will cause SWWM GZ weapons to not have slots assigned. Please go into Miscellaneous Options and toggle the \"Strict KEYCONF Weapons/Players\" setting.\c-";
+SWWM_SETSLOTSTRICT = "\cg!!!WARNING!!!\c-\n\cj\"setslotstrict\" is enabled. This will cause the mod's weapons to not have slots assigned. Please go into Miscellaneous Options and toggle the \"Strict KEYCONF Weapons/Players\" setting.\c-";
SWWM_FCBSEL = "1.150 FCB";
SWWM_XSBSEL = "1.150 XSB";
SWWM_WIDESPREAD = "Wide Spread Mode";
SWWM_TIGHTSPREAD = "Tight Spread Mode";
SWWM_YNYKRONFORWARD = "Beam Mode"; // desya / forward
SWWM_YNYKRONBACKWARD = "Vortex Mode"; // busa / backward
-SWWM_GAMMAMODE1 = "Semi-Auto";
-SWWM_GAMMAMODE2 = "3-Round Burst";
-SWWM_GAMMAMODE3 = "Full Auto";
-SWWM_GAMMAMODE4 = "FULLER AUTO";
SWWM_MRMODE1 = "Precision Shot";
SWWM_MRMODE2 = "Cluster Shot";
SWWM_MRMODE3 = "Stream Shot";
@@ -725,8 +720,9 @@ SWWM_DMSPREAD = "Spread:";
SWWM_PLACE1 = "1st";
SWWM_PLACE2 = "2nd";
SWWM_PLACE3 = "3rd";
+SWWM_PAUSE = "PAUSED";
// weapon tooltips
-SWWM_TTNOTE = "Note: Weapon tooltips can be deactivated in SWWM GZ Options.";
+SWWM_TTNOTE = "Note: Weapon tooltips can be deactivated in DEMOLITIONIST Options.";
TT_PUSHER =
"\cfFire:\c- Drill.\n"
"\cfAltfire:\c- Charged attack.";
@@ -757,8 +753,8 @@ TT_EVISCERATOR =
"\cfAltfire:\c- Grenade shot.\n"
"\cfZoom:\c- Toggle spread.";
TT_HELLBLAZER =
-"\cfFire:\c- Load rockets, release to shoot.\n"
-"\cfAltfire:\c- Load grenades, release to shoot.\n"
+"\cfFire:\c- Load / shoot rockets.\n"
+"\cfAltfire:\c- Load / shoot grenades.\n"
"\cfZoom:\c- Select ammo.\n"
"\cfReload:\c- Reload / switch ammo.\n"
"\cx(More controls in library)\c-";
@@ -799,8 +795,8 @@ TT_PUNTZERBETA =
"\cfAltfire:\c- Quickshot mode.\n"
"\cfReload:\c- Reload weapon.";
TT_PUNTZERGAMMA =
-"\cfFire:\c- Shoot weapon.\n"
-"\cfAltfire:\c- Cycle fire modes.\n"
+"\cfFire:\c- Full-auto fire.\n"
+"\cfAltfire:\c- Fuller-auto fire.\n"
"\cfReload:\c- Reload weapon.";
TT_SHEENHMG =
"\cfFire:\c- Slow fire.\n"
@@ -812,28 +808,6 @@ TT_QUADRAVOL =
"\cfReload:\c- Load cells.\n"
"\cfZoom+Fire:\c- Toggle spread mode.\n"
"\cfZoom+Altfire:\c- Switch firing stance.";
-TT_BLACKFIRE =
-"\cfFire:\c- Freeze thrower.\n"
-"\cfAltfire:\c- Icicle shot.\n"
-"\cfReload:\c- Reload canister(s).";
-TT_EMPCARBINE =
-"\cfFire:\c- Hold to ionize, release to shoot.\n"
-"\cfAltfire:\c- Multi-target ionization.\n"
-"\cfZoom:\c- Use scope.\n"
-"\cfReload:\c- Load rods.";
-TT_RAYKHOM =
-"\cfFire:\c- Shoot weapon.\n"
-"\cfAltfire:\c- Lightning attack.\n"
-"\cfReload:\c- Reload weapon.\n"
-"\cfZoom:\c- Reload battery.";
-TT_GRANDLANCE =
-"\cfFire:\c- Shoot weapon.\n"
-"\cfAltfire:\c- Charged shot.\n"
-"\cfReload:\c- Reload weapon.\n"
-"\cfZoom:\c- Reload battery.";
-TT_FISTGUN =
-"\cfFire:\c- Throw punch.\n"
-"\cfAltfire:\c- Wide slap.";
TT_NEWSPARKSTER =
"\cfFire:\c- Kinylum shot.\n"
"\cfAltfire:\c- Nokron shot.\n"
@@ -845,253 +819,15 @@ TT_MORTALRIFLE =
"\cfAltfire:\c- Shoot grenade.\n"
"\cfZoom:\c- Cycle fire modes.\n"
"\cfReload:\c- Reload weapon.";
+TT_RAYKHOM =
+"\cfFire:\c- Shoot weapon.\n"
+"\cfAltfire:\c- Lightning attack.\n"
+"\cfReload:\c- Reload weapon.\n"
+"\cfZoom:\c- Reload battery.";
TT_RAFANKOS =
"\cfFire:\c- Single beam.\n"
"\cfAltfire:\c- Multi beam.\n"
"\cfReload:\c- Reload weapon.";
-// "Direct messages"
-SWWM_INCOMINGMSG = "Incoming direct message from %s...";
-SWWM_SAYANAME = "\cgSaya Miyamoto\c-";
-SWWM_SAYASNAME = "\cgSaya\c-";
-SWWM_CYTHONAME = "\cvArchduke Cytho Valathor\c-";
-SWWM_CYTHOSNAME = "\cvCytho\c-";
-SWWM_IBUKINAME = "\crIbuki Miyamoto\c-";
-SWWM_IBUKISNAME = "\crIbuki\c-";
-SWWM_KIRINNAME = "\cxKirin Xanai\c-";
-SWWM_KIRINSNAME = "\cxKirin\c-";
-SWWM_ZNVNAME = "\chZanaveth Nekuraku III\c-";
-SWWM_ZNVSNAME = "\chZanaveth\c-";
-// E1M8
-SWWM_SAYAPHOBOS1 = "I kinda forgot to mention this in the briefing but... There's a bit of an issue here, \cdDemo-chan\c-.";
-SWWM_SAYAPHOBOS2 = "The gate to Deimos is guarded by two nasty pieces of work, and you're gonna have to get rid of them.";
-SWWM_SAYAPHOBOS3 = "They're supposedly the \"replacements\" for whatever the other guy killed to go the same route.";
-SWWM_SAYAPHOBOS4 = "Well, knowing you, I'm sure they won't be a problem. Anyway, that's everything for now. Good luck.";
-// E2M8
-SWWM_SAYADEIMOS1 = "Be careful, \cdDemo\c-, I've got a bad feeling about this.";
-SWWM_SAYADEIMOS2 = "There's a large energy reading coming from outside, and I mean LARGE.";
-SWWM_SAYADEIMOS3 = "On top of that I can't seem to get in touch with \cvCytho-sama\c- for info on where to go.";
-SWWM_SAYADEIMOS4 = "Well, you're on your own here, I guess. If you can't figure a way out, I'll be on stand-by for a recall.";
-// E3M8
-SWWM_SAYADIS1 = "And here we are... The very center of it all.";
-SWWM_SAYADIS2 = "This is where the first portal to Earth was opened, and you're gonna use it to get back.";
-SWWM_SAYADIS3 = "And of course, the place is guarded, why wouldn't it be. You've got to kill stuff, as usual.";
-SWWM_SAYADIS4 = "Let's just hope it drops you off at the right place. Keep going, \cdDemo-chan\c-, you're almost there.";
-// E4M8
-SWWM_SAYATHY1 = "Alright, good news, for once. There's a portal nearby, and I'm sure it'll take you to the right spot.";
-SWWM_SAYATHY2 = "But, of course, you gotta kick some ass to get there. I mean, nothing in life is easy, isn't it?";
-SWWM_SAYATHY3 = "I'll be ready to debrief you later on your ACTUAL mission.";
-SWWM_SAYATHY4 = "Yeah, still have no clue why this massive detour happened. But I'll get to the bottom of it, trust me.";
-// E5M8
-SWWM_CYTHOSIGIL1 = "\cdDemo\c-, this is \cvCytho\c-. I've got an important message to relay from the royal family.";
-SWWM_CYTHOSIGIL2 = "Prince Baphomet is satisfied with your efforts, and has opened a gate for you to return to Earth.";
-SWWM_CYTHOSIGIL3 = "Unfortunately, the gate is guarded by high level military demons, two of them, in fact.";
-SWWM_CYTHOSIGIL4 = "... Although, knowing you, I'm certain this will not be an issue, correct?";
-// MAP07
-SWWM_SAYADIMPLE1 = "Hold up right there, \cdDemo-chan\c-. You're about to step in on dangerous territory.";
-SWWM_SAYADIMPLE2 = "This is the first line of defense that's been set up around the inner starport, and it's a bitch.";
-SWWM_SAYADIMPLE3 = "Hopefully, you've got plenty of goodies on ya to smash through... You do, right?";
-SWWM_SAYADIMPLE4 = "Well, we've already seen what you've been able to do so far, so I'm sure you'll be fine.";
-SWWM_SAYADIMPLE5 = "Good luck!";
-// MAP11
-SWWM_SAYACIRCLE1 = "You're almost there, \cdDemo\c-. The main switch for the demonic barrier is nearby.";
-SWWM_SAYACIRCLE2 = "Since it's still intact, that means you're already ahead of the other guy, which is good.";
-SWWM_SAYACIRCLE3 = "Special forces are on stand-by to evacuate everyone once you hit that shit and secure the area.";
-SWWM_SAYACIRCLE4 = "With that, the last bastion of the local population will be gone, leaving just demons behind.";
-SWWM_SAYACIRCLE5 = "That'll give us time to think of our next step, I suppose.";
-// MAP20
-SWWM_SAYAGOTCHA1 = "This is the place, yup. Big fortress surrounded by a lake of toxic blood. Very demonic.";
-SWWM_SAYAGOTCHA2 = "These schmucks have the whole place well guarded, so you're gonna find a lot of resistance.";
-SWWM_SAYAGOTCHA3 = "Blast through, kill shit, and you'll be there in no time.";
-SWWM_SAYAGOTCHA4 = "Once you reach the portal, I'll hit up \cvCytho-sama\c- for instructions on how to close it.";
-SWWM_SAYAGOTCHA5 = "That's all, I guess. Good luck, my \cdDemolitionist\c-.";
-// MAP20 special (Ultimate Doom 2)
-SWWM_SAYAGOTCHAEND1 = "Wait, what the fuck is this? The readings show there's two portals?";
-SWWM_SAYAGOTCHAEND2 = "No, no, that's not right...";
-SWWM_SAYAGOTCHAEND3 = "Uh, ok, \cfDemo-chan\c-, see if you can find a way to close them up, okay?";
-SWWM_SAYAGOTCHAEND4 = "Meanwhile, I'm gonna go call \cvCytho-sama\c-. Something's iffy about this...";
-SWWM_SAYAGOTCHAEND5 = "Just... Try not to get in trouble while I'm away.";
-// MAP30
-SWWM_SAYAIOS1 = "\cdDemo-chan\c-... This is it, you're about to face the Psychic Commander, the leader of Hell's army.";
-SWWM_SAYAIOS2 = "I don't know if... ... W-well, I shouldn't be worrying about that at this point.";
-SWWM_SAYAIOS3 = "You can do it, you can put an end to all of this. You're... My... O-our hero.";
-SWWM_SAYAIOS4 = "Oh god I can't do this, my heart rate is spiking...";
-SWWM_SAYAIOS5 = "... \cdD-Demo-chan\c-... Please save the world and... Please return home.";
-// MAP30 with Rampancy
-SWWM_SAYARAMPANCY1 = "\cdDemo-chan\c-, that thing's bluffing, trust me. I saw those failed login attempts.";
-SWWM_SAYARAMPANCY2 = "I'm sure it's going to try pulling some cliched bullshit to \"turn you to its side\" or whatever.";
-SWWM_SAYARAMPANCY3 = "What a joke. Whatever it tries to say, don't listen to it. It's all bullshit and lies.";
-SWWM_SAYARAMPANCY4 = "Now, go kick some robotic ass, my brave \cdDemolitionist\c-. We're all counting on you over here.";
-// LEVEL08
-SWWM_CYTHONERVE1 = "I haven't been able to contact \cgSaya\c-, I assume she must be asleep, since it's so late over there in Japan.";
-SWWM_CYTHONERVE2 = "Many other groups have already been suppressed worldwide, their numbers are quickly waning.";
-SWWM_CYTHONERVE3 = "You, however, are up against a cybernetic lieutenant known as the \"Last Tyrant\". This will be tough.";
-SWWM_CYTHONERVE4 = "Nevertheless... You are the hero \cdDemolitionist\c-, and you are going to teach these vile fiends a lesson.";
-SWWM_CYTHONERVE5 = "Extinguish the flames of demonic corruption that tarnish this land.\nWe the Kuriste believe in you.";
-// Eviternity MAP30
-SWWM_SAYAEVIA1 = "Psch... Look at this place. This dude couldn't be more of a pretentious show-off even if he tried.";
-SWWM_SAYAEVIA2 = "However \"angelic\" he may look, he's just some dude in pretty armor, so you can kick his ass.";
-SWWM_SAYAEVIA3 = "This whole place, though... Damn, I sure hope you've taken a lot of high res shots like I told you.";
-SWWM_SAYAEVIA4 = "I'm gonna go grab some popcorn now. This is gonna be an epic battle for sure, kihihihihi...";
-SWWM_SAYAEVIB1 = "What? This is some fucking videogame bullshit right there. You're telling me the guy has TWO HEALTHBARS???";
-SWWM_SAYAEVIB2 = "Bullshit, fucking bullshit! Absolute trash garbage bullshit! Kill his ass, \cdDemo-chan\c-!";
-// Heretic E1M8
-SWWM_SAYAMAW1 = "Here we are, in \"Hell's Maw\".";
-SWWM_SAYAMAW2 = "According to the Sidhe this houses the portal that connects to the demons' realm.";
-SWWM_SAYAMAW3 = "I think it's gonna be pretty interesting to visit another universe's equivalent of hell, yeah.";
-SWWM_SAYAMAW4 = "... And of course, it's going to be even more interesting to blow shit up in it, too, right?";
-SWWM_SAYAMAW5 = "Just... Be on the lookout for whatever it is that's guarding the place.";
-// Heretic E2M8
-SWWM_SAYAMASTERS1 = "OK, so... We're one step closer to that serpent rider's home turf. But there's a problem.";
-SWWM_SAYAMASTERS2 = "Specifically, several problems. Big, bulky, muscular problems.";
-SWWM_SAYAMASTERS3 = "We're talking BIG MINOTAURS with BIG HAMMERS here.";
-SWWM_SAYAMASTERS4 = "I don't know about you, but I'm already hearing the Pillar Men theme in my head.";
-SWWM_SAYAMASTERS5 = "Go get them, \cdDemo Demostar\c-... ... ... OK maybe that's a terrible pun, forget about it.";
-// Heretic E3M8
-SWWM_SAYADSPARIL1 = "This is it, \cdDemo-chan\c-. You're about to face that stupid-ass wizard.";
-SWWM_SAYADSPARIL2 = "You're gonna save another world, and all in record time. You're on a roll!";
-SWWM_SAYADSPARIL3 = "... Oh, and remember, there's a surprise waiting for you at home. Oh, you're so gonna love it.";
-SWWM_SAYADSPARIL4 = "Splgslshglgh";
-SWWM_SAYADSPARIL5 = "Oh shit that got picked up by the voice recognition? Oops...";
-// Heretic E4M8
-SWWM_SAYAHEADS1 = "Geez, I'm getting impatient with all this stuff. I hope this really takes you back home.";
-SWWM_SAYAHEADS2 = "And if not, well, more time for me to refine this \"present\" that I'm going to give ya.";
-SWWM_SAYAHEADS3 = "Thanks to this, I've managed to improve its potency even further. This is going to be fun.";
-SWWM_SAYAHEADS4 = "I seriously can't wait to try it, and I'm sure you're also dying to know...";
-SWWM_SAYAHEADS5 = "Smite thy foes and come claim thy prize, o \cdDemolitionist\c-.";
-SWWM_SAYAHEADS6 = "... I seriously just fucking said that...";
-// Heretic E5M8
-SWWM_SAYABULLS1 = "And it still keeps going, oh my god...";
-SWWM_SAYABULLS2 = "It's like you're getting thrown around random realms. Look, I'm starting to get pissed.";
-SWWM_SAYABULLS3 = "I'm so pissed in fact that, if the next portal doesn't immediately send you back to Parthoris, I'll just...";
-SWWM_SAYABULLS4 = "Yeah...";
-SWWM_SAYABULLS5 = "I NEED you to come back home, \cdDemo-chan\c-. I desperately need you here to test this.";
-// Seven Portals
-SWWM_SAYAGREETA1 = "There it is, \cdDemo-chan\c-. That's your target, that big stinky ugly monster. That's Korax.";
-SWWM_SAYAGREETA2 = "... By the way, did you catch the guy's scent? It's bad, isn't it?";
-SWWM_SAYAGREETA3 = "God, imagine the smell in person... Just thinking about it is making my stomach turn.";
-SWWM_SAYAGREETB1 = "Coward... Taunting us from afar..."; // Kirin reply
-SWWM_SAYAGREETC1 = "Yeah, sneaky and stinky, telltale signs of an ugly bastard.";
-SWWM_SAYAGREETD1 = "Ugly... Bastard?"; // Kirin reply
-SWWM_SAYAGREETE1 = "I'd rather not explain, \cxKirin-kun\c-. You'd be very disappointed in all of humankind.";
-SWWM_SAYAGREETF1 = "That's certainly not reassuring to hear..."; // Kirin reply
-// Shadow Wood
-SWWM_SAYABLOODA1 = "I don't know how this dude can even smell anything other than that rancid old dog fart stench he wafts.";
-SWWM_SAYABLOODA2 = "Like seriously, jesus fucking christ...";
-SWWM_SAYABLOODB1 = "That ugly bastard needs to take a bath."; // Ibuki reply
-SWWM_SAYABLOODC1 = "Ugly bastard? What's this now, some lame-ass doujin?";
-SWWM_SAYABLOODD1 = "Heh, nice one, \cgSayacchi\c-."; // Ibuki reply
-// Hypostyle
-SWWM_SAYAHYPO1 = "Here we are, after all that roaming around. Whatever lies here, we gotta slay it to catch the next portal.";
-SWWM_SAYAHYPO2 = "I sure hope it's not a fucking dragon. That'd be the most cheap-ass generic boss ever.";
-SWWM_SAYAHYPO3 = "Uh... I totally jinxed it, didn't I? I bet I did. Yeah, I bet it's a fucking dragon.";
-SWWM_SAYAHYPO4 = "I bet THAT GUY is going to rise from the grave and fucking sell me his damn game for the thousandth time.";
-// Heresiarch's Seminary
-SWWM_KIRINWORSHIPA1 = "Pathetic, disgusting creature...\nWho would ever think of worshipping a foul beast such as yourself?";
-SWWM_KIRINWORSHIPB1 = "The only thing I'd worship is that juicy cock of yours, \cxKirin-kun\c-~"; // Saya reply
-SWWM_KIRINWORSHIPC1 = "PFFFFFFFFFFFFFF";
-SWWM_KIRINWORSHIPD1 = "Guh! \cxKiriiiiin\c-! You got cola all over me! God damn it you spit as hard as you cum!"; // Saya reply
-SWWM_KIRINWORSHIPD2 = "O-oh... Wait, this thing's still on. Shit... \cdDemo-chan\c- just read all of that.";
-// Castle of Grief
-SWWM_SAYAGAMEA1 = "Wow, look at fucking mister chessmaster over here... Fuck you!";
-SWWM_SAYAGAMEA2 = "This guy is a fucking idiot and he's pissing me off even more. I so want to watch you beat his sorry ass...";
-SWWM_SAYAGAMEB1 = "Chess nerd..."; // Ibuki
-SWWM_SAYAGAMEC1 = "I bet he was in the chess club.";
-// Necropolis
-SWWM_SAYAMASTERSA1 = "Masters, masters... Whose masters? Awaken my masters? Well, whatever, I don't care what he says.";
-SWWM_SAYAMASTERSA2 = "I so want you to kill this dude...";
-SWWM_SAYAMASTERSB1 = "Are you strong enough to face the fact you SMELL?"; // Ibuki reply
-SWWM_SAYAMASTERSC1 = "I showered this morning, \crIbuki\c-.";
-SWWM_SAYAMASTERSD1 = "I meant the stinky boy over there. You smell nice."; // Ibuki reply
-SWWM_SAYAMASTERSE1 = "\cgSayacchi\c- definitely has a pleasant scent to her."; // Kirin reply
-SWWM_SAYAMASTERSF1 = "Guhuhuhu... Thanks.";
-// Zedek
-SWWM_SAYAFIGHTER1 = "This is where Zedek lies, the fighty boy. He probably thinks he's strong, but he hasn't met you.";
-SWWM_SAYAFIGHTER2 = "Do watch out for any traps, though. I bet there's some nasty shit here.";
-// Traductus
-SWWM_SAYACLERICA1 = "If there's one thing I've learned from videogames is that clerics are the lowest trash.";
-SWWM_SAYACLERICA2 = "That's everything I have to say.";
-SWWM_SAYACLERICB1 = "I have never encountered a single cleric who hasn't attempted to assassinate me."; // Kirin reply
-SWWM_SAYACLERICC1 = "Oh yeah, the people from the Sacrosanct Empire, right? Totally forgot about those.";
-SWWM_SAYACLERICC2 = "Clerics fucking suck...";
-// Menelkir
-SWWM_SAYAMAGE1 = "Menelkir's lair, huh... ... Oh god, don't tell \cxKirin-kun\c-, there's puzzles here.";
-SWWM_SAYAMAGE2 = "Yeah, he's more than tired of stuff like this. And apparently now we're doing the picture matching kind.";
-SWWM_SAYAMAGE3 = "Well, at least those are actual puzzles, and not whatever the fuck the other stuff was.";
-SWWM_SAYAMAGE4 = "Even if they're... You know... The really lame and piss-easy kind.";
-// Dark Crucible
-SWWM_SAYAKORAXA1 = "This is it, \cdDemo\c-. The big stinky ugly bastard is waiting.";
-SWWM_SAYAKORAXB1 = "At last, that vile schemer's evil reign shall end."; // Kirin reply
-SWWM_SAYAKORAXC1 = "Time for him to take a fucking bath. After you rearrange his knees, of course."; // Ibuki reply
-SWWM_SAYAKORAXD1 = "Even though \cvMeido\c- isn't watching, I can tell you the four of us are cheering you on.";
-SWWM_SAYAKORAXE1 = "Fight on, \cdDemo-chan\c-. You can do it, we believe in you."; // Kirin reply
-// Blight
-SWWM_SAYABLIGHTA1 = "Hey, \cdDemo-chan\c-, remember puzzles?";
-SWWM_SAYABLIGHTB1 = "Nnnnngh..."; // Kirin reply
-SWWM_SAYABLIGHTC1 = "I think \cxKirin\c- just heard me. Well... You know what to do.";
-SWWM_SAYABLIGHTC2 = "I can tell this is going to be yet more bullshit, so be prepared for anything.";
-// Constable's Gate
-SWWM_SAYACONSTABLEA1 = "Castles and shit... It just keeps going. I said it in the briefing, anyway... So you know...";
-SWWM_SAYACONSTABLEA2 = "Please keep on exploding things. \cvMeido-chan\c- made some snacks, so we've got that at least.";
-SWWM_SAYACONSTABLEB1 = "She really is so thoughtful, that girl..."; // Ibuki reply
-SWWM_SAYACONSTABLEC1 = "Even though you can hear her curse everything under her breath about what's happening in there.";
-SWWM_SAYACONSTABLED1 = "Yeah, that's our \cvMeido\c- alright."; // Ibuki reply
-// Nave
-SWWM_SAYANAVEA1 = "I want to borrow the reality bending powers of the \ctMishe\c- to destroy this entire world.";
-SWWM_SAYANAVEA2 = "I'm seriously pissed, we all are pissed. Hell, even \cxKirin\c- is upset, and we can't calm him down anymore.";
-SWWM_SAYANAVEB1 = "It's kind of cute and worrying at the same time."; // Ibuki reply
-SWWM_SAYANAVEC1 = "NNNNNNNNGGGGGHHHHHHHH!"; // Kirin reply
-SWWM_SAYANAVED1 = "\cxKirin-kun\c-, you're going to suffocate if you keep screaming into the pillow like that.";
-SWWM_SAYANAVEE1 = "Maybe that's what he wants, \cgSaya\c-.\nHe seeks the sweet release of death to find inner peace."; // Ibuki
-SWWM_SAYANAVEF1 = "If he wasn't immortal that would be an extremely fucked up thing to say, \crIbuki\c-.";
-// Dark Citadel
-SWWM_SAYADEATHKINGS1 = "I'm so pissed I could punch a hole through reality to tell these fucking Deathkings to fuck off.";
-// Kirin's Thrilling Commentary on Puzzles™
-// first puzzle switch on Seven Portals
-SWWM_KIRINPUZZLEA1 = "A peculiar contraption... Allegedly it cites to be part of a larger whole, calling itself a \"puzzle\".";
-SWWM_KIRINPUZZLEA2 = "\cgSayacchi\c- did mention you'd be coming across these. That's most certainly intriguing...";
-// second puzzle switch on Seven Portals
-SWWM_KIRINPUZZLEB1 = "Another one... Interesting...";
-// third puzzle switch on Seven Portals
-SWWM_KIRINPUZZLEC1 = "I fail to see now what makes this exactly a \"puzzle\". This is no more than a switch hunt.";
-SWWM_KIRINPUZZLEC2 = "Hardly a challenge to one's intellect, wouldn't you agree, \cdDemo-chan\c-?";
-// first puzzle switch on Shadow Wood
-SWWM_KIRINPUZZLED1 = "It does seem that these \"puzzle switches\" simply keep on showing up wherever you go.";
-SWWM_KIRINPUZZLED2 = "I'm sure you are as tired as I am of them.";
-// fourth puzzle switch on Shadow Wood
-SWWM_KIRINPUZZLEE1 = "These so-called \"puzzles\"... They're an insult to our intelligence.";
-SWWM_KIRINPUZZLEE2 = "... I hope I'm not sending too many of these messages.";
-// first puzzle switch on Heresiarch's Seminary
-SWWM_KIRINPUZZLEF1 = "When will it end? Just how many fractions of \"puzzles\" are we to solve???";
-SWWM_KIRINPUZZLEF2 = "Is this how that sayzha axhkhashaar dares to mock us? With these tiresome games?";
-SWWM_KIRINPUZZLEF3 = "They... Nnngh... Kheza sakharei!";
-SWWM_KIRINPUZZLEG1 = "\cxKirin-kun\c-, I think you're getting a bit too worked up about this."; // Saya reply
-SWWM_KIRINPUZZLEH1 = "Yes... I... I'll just lie down for a while, s-sorry...";
-SWWM_KIRINPUZZLEI1 = "... Poor guy. I do agree with him, though... This shit really gets on your nerves, doesn't it?"; // Saya reply
-SWWM_KIRINPUZZLEI2 = "Well... I'm gonna go give \cxKirin-kun\c- some TLC now. Don't worry, he'll be fine. He's in good hands.";
-// first puzzle switch on Blight
-SWWM_KIRINPUZZLEJ1 = "We can't escape, can we? These \"puzzles\" continue to haunt us even now...";
-SWWM_KIRINPUZZLEJ2 = "This accursed land... Plagued by these vile contraptions... I shall never set foot in it. Mark my words.";
-// last puzzle switch on Blight
-SWWM_KIRINPUZZLEK1 = "Please... Make it stop...";
-SWWM_KIRINPUZZLEL1 = "\cxKirin-kun\c-, hey... It's alright. Here... Drink up, it'll help you relax.\c-"; // Ibuki reply
-SWWM_KIRINPUZZLEM1 = "Gulp... Gulp... Gulp...";
-SWWM_KIRINPUZZLEN1 = "Man, look at him go... Drinking it all up like a champ."; // Saya reply
-SWWM_KIRINPUZZLEO1 = "You know how it is... Once they find a breast to suckle on, all their worries fade away..."; // Ibuki reply
-SWWM_KIRINPUZZLEP1 = "You know \cdDemo-chan\c- can read what we're saying, right?"; // Saya reply
-SWWM_KIRINPUZZLEQ1 = "Oh, I'm sure they'd be more than happy to have their turn once the mission's over, hm?"; // Ibuki reply
-// first puzzle switch on Constable's Gate
-SWWM_KIRINPUZZLER1 = "Let this be the last of these \"puzzles\" that we may encounter...";
-SWWM_KIRINPUZZLER2 = "Urp...";
-SWWM_KIRINPUZZLER3 = "My apologies.";
-SWWM_KIRINPUZZLES1 = "That was some good milk, wasn't it?"; // Saya reply
-SWWM_KIRINPUZZLET1 = "Certainly... I am grateful for \crIbuki\c-'s blessing.";
-SWWM_KIRINPUZZLEU1 = "Making her able to lactate at will is a blessing, yeah. I'm sure \cdDemo\c- agrees too."; // Saya reply
-// super secret cheats
-SWWM_ZNVTXT1 = "\cdDemolitionist\c-, it is me, \chZanaveth The Corruptor\c-. I have been witness of the act you have now acted, yes.";
-SWWM_ZNVTXT2 = "It is \cf%d\c- years since... and those magic words, I can see them again. Much impressed, very much impressed.";
-SWWM_ZNVTXT3 = "So, you can do the thing... As have the \ctMishe\c- also taught to myself. This is a nonexpected surprise, yes.";
-SWWM_ZNVTXT4 = "There are many such powerful words to use, \cdDemolitionist\c-. Do keep keeping to discover all of them.";
-SWWM_ZNVTXT5 = "And now I have to take off. Please extend greetings to aunt \cgSaya\c- for my part. Good luck, \cdDemolitionist\c-.";
// boss tags
BT_BRUISERS = "Bruiser Brothers";
BT_CYBIE = "Tyrant of Babel";
@@ -1190,11 +926,11 @@ SWWM_INTERTIP12 = "The Refresher will always auto-activate if you're about to di
SWWM_INTERTIP13 = "The Ynykron Artifact will instantly kill everything you aim it at, unless it's really unkillable, though usually that's only the case for gods. You're not planning on going after any gods, right?";
SWWM_INTERTIP14 = "Do not be deceived by the Candy Gun, it may seem like a simple recolor, but it is A LOT stronger than your starting weapon.";
SWWM_INTERTIP15 = "The Ragekit will greatly increase the strength of your melee attacks and reduce incoming damage, but it'll also make you scream, all the time.";
-SWWM_INTERTIP16 = "You can share items with other players in multiplayer using the trading tab in your Demolitionist menu. Items that won't fit in the destination inventory will not be traded.";
+SWWM_INTERTIP16 = "Finding secrets, important items, and achieving certain milestones such as 100%-ing a map will grant you extra score.";
SWWM_INTERTIP17 = "The Demolitionist Menu is very helpful, do not forget to bind a key to open it.";
SWWM_INTERTIP18 = "All weapons have a quick melee attack available through a dedicated button. With one-handed weapons you will perform a punch, and with two-handed ones a bash.";
SWWM_INTERTIP19 = "With the right combination of boosting and wall jumping, it is perfectly possible to remain in the air for extended periods of time.";
-SWWM_INTERTIP20 = "In multiplayer, any keys you pick up will be immediately shared with other players.";
+SWWM_INTERTIP20 = "Keys and collectibles will play a first-person animation when picked up. If you feel this gets in the way, it can be disabled in the mod options.";
SWWM_INTERTIP21 = "Aim for a high score! The more enemies you kill the better. Don't forget to put that cash to use at the in-game store when you can.";
SWWM_INTERTIP22 = "With proper timing, you can use your quick melee attack to deflect projectiles. It is even possible to return these to the sender, with increased damage if you're under the effects of a Ragekit.";
SWWM_INTERTIP23 = "Did you know that Saya really hates the UAC?\n\nWhat? You already knew that? Geez, then I have no idea what else to tell you.";
@@ -1238,11 +974,11 @@ SWWM_INTERTIP60 = "Despite its seemingly puny size, the Plasma Blaster has a lot
SWWM_INTERTIP61 = "The Puntzer guns can easily pierce through solid objects or even thin walls. No enemy will ever be safe behind cover.";
SWWM_INTERTIP62 = "\"The Sheen HMG is such a delicious festival of dakka that the mere sound of it firing makes me unleash Leviathan in my panties, and you can quote me on that.\" — Saya Miyamoto";
SWWM_INTERTIP63 = "Pressing fire immediately after hitting something with the Quadravol's blades will result in a boosted point-blank explosion that'll send whatever's at the other end of the gun flying.";
-SWWM_INTERTIP64 = "The Blackfire Igniter leaves a lingering trail of coldness long after its flames have died down, dealing even more damage.";
-SWWM_INTERTIP65 = "The Blackfire Igniter can produce blocks of ice that float above liquids, becoming temporary walkable platforms. Do note that this obviously won't work on lava.";
-SWWM_INTERTIP66 = "You can mark multiple targets with the Rail Carbine's ionizer and then hit them all in a single discharge. Do be quick, however, because the charge fades over time.";
+SWWM_INTERTIP64 = "Holding down the triggers with the Sparkster Rifle will gradually increase firing potency upon release. Fortunately, there is no potential here for the weapon to blow up if you keep them held long enough, only badly designed human weaponry could be so haphazard.";
+SWWM_INTERTIP65 = "The Sparkster Rifle can fire both ammo types simultaneously, blending them together into a deadly combo projectile.";
+SWWM_INTERTIP66 = "The Mortal Rifle (\"Mister\" for short) was devised as a potential \"standard\" battle rifle for the X'Animen Coalition that \"even the Xekkians would consider powerful\". It seems to have succeeded in that aspect, considering how truly mortal it is, although it is not widely adopted... Yet.";
SWWM_INTERTIP67 = "Being primarily a coilgun, the Ray-Khom is almost entirely silent and perfect for stealthy kills. Do note though that the impact of the projectile itself will be very loud.";
-SWWM_INTERTIP68 = "The Grand Lance is a much safer alternative to the Ynykron Artifact if you don't want to accidentally kill yourself or your friends.";
+SWWM_INTERTIP68 = "The Rafan-Kos is truly an Ultimate Weapon, as its name implies.";
SWWM_INTERTIP69 = "Nice.";
SWWM_INTERTIP70 = "Did you know that even with seat belts people die all the time in car crashes? I thought that was interesting.";
SWWM_INTERTIP71 = "\"On the internet nobody can hear you being subtle.\" — Linus Torvalds";
@@ -1257,7 +993,7 @@ SWWM_INTERTIP79 = "Punching fascists is perfectly reasonable.";
SWWM_INTERTIP80 = "Ceci n'est pas un conseil.";
SWWM_INTERTIP81 = "Age only affects appearance, and has no bearing on ability. Gender has no bearing on ability. Everyone has imperfections, prejudice births malcontents, become a dark spirit.\nTime for crab.";
SWWM_INTERTIP82 = "\"IF THE ZOO BANS ME FOR HOLLERING AT THE ANIMALS I WILL FACE GOD AND WALK BACKWARDS INTO HELL\" — dril";
-SWWM_INTERTIP83 = "SWWM GZ is truly Some Weird Weapons Mod for GZDoom.";
+SWWM_INTERTIP83 = "This is truly some weird weapons mod for GZDoom.";
SWWM_INTERTIP84 = "\"In its vastness, the universe is no more than a mere grain of sand when compared to the limitless bounds of one's imagination.\" — Zanaveth Nekuraku III";
SWWM_INTERTIP85 = "You can shuffle the intermission art with Zoom, and these tips with Reload. Holding Altfire will hide the UI so you can see the art in full.";
SWWM_INTERTIP86 = "Add minced garlic, white pepper and basil to your tomato sauce, goes really well with pasta, you can thank me later.";
@@ -1290,7 +1026,7 @@ SWWM_INTERTIP112 = "There are no buses in Gensokyo.";
SWWM_INTERTIP113 = "Carbonated drinks are best consumed with a straw, to avoid damaging your teeth.";
SWWM_INTERTIP114 = "A non-lethal takedown is the most silent takedown.";
SWWM_INTERTIP115 = "There was a tip here, but it's gone now.";
-SWWM_INTERTIP116 = "Over two billion devices run Java. That's two billion too many.";
+SWWM_INTERTIP116 = "Over thirteen billion devices run Java. It is already too late, we're all doomed.";
SWWM_INTERTIP117 = "Food tastes best when you make it yourself.";
SWWM_INTERTIP118 = "This tip mesage contains a typo.";
SWWM_INTERTIP119 = "If enemies are getting in your way while you're admiring the shiny new key you just found, you can punch them with your free hand.";
@@ -1308,12 +1044,12 @@ SWWM_INTERTIP130 = "The Ragekit's speed boost may make you violently bump agains
SWWM_INTERTIP131 = "In Heretic and Hexen, an item known as the Safety Tether may appear. If by any chance you get stuck in some seemingly inescapable trap, this will be your trump card.";
SWWM_INTERTIP132 = "The Devastation Sigil is rather unstable, but provides a much higher boost of damage than the Ragekit, for ALL damage you may deal, including to yourself. Yeah, quite a dangerous little toy, that one.";
SWWM_INTERTIP133 = "The Divine Sprite can boost your health to absurd levels, but its effects fade quickly after a while. It is the most potent healing item you have in hand, but do keep in mind it has to be activated manually. Unlike most others, it won't come to save your ass by itself.";
-SWWM_INTERTIP134 = "The Hand of Divine is yet another weapon that can benefit from the effects of the Ragekit, turning what's already a lethal punch into something truly god-like.";
-SWWM_INTERTIP135 = "Holding down the triggers with the Sparkster Rifle will gradually increase firing potency upon release. Fortunately, there is no potential here for the weapon to blow up if you keep them held long enough, only badly designed human weaponry could be so haphazard.";
-SWWM_INTERTIP136 = "The Sparkster Rifle can fire both ammo types simultaneously, blending them together into a deadly combo projectile.";
-SWWM_INTERTIP137 = "The Mortal Rifle (\"Mister\" for short) was devised as a potential \"standard\" battle rifle for the X'Animen Coalition that \"even the Xekkians would consider powerful\". It seems to have succeeded in that aspect, considering how truly mortal it is, although it is not widely adopted... Yet.";
-SWWM_INTERTIP138 = "The Rafan-Kos is truly an Ultimate Weapon, as its name implies.";
-SWWM_INTERTIP139 = "It's said that the Hand of Divine bears only a minuscule fraction of its original creator's power. Guy must pack one hell of a wallop, then.";
+SWWM_INTERTIP134 = "The Demolitionist is not alone in their mission. Many more heroes have been known to be fighting out there as well.";
+SWWM_INTERTIP135 = "Demo-chan has a crush on a certain videogame robot who also kills demons in style.";
+SWWM_INTERTIP136 = "Generally, your enemies are stupid enough to run into your line of fire. If they were smarter, they wouldn't even try to fight you.";
+SWWM_INTERTIP137 = "Powerups exist to be used, so don't be afraid of \"wasting\" them. If the chance comes, just hit it. You'll find more eventually.";
+SWWM_INTERTIP138 = "The Demons avoided invading Australia for some reason. Maybe the climate there is worse than in Hell.";
+SWWM_INTERTIP139 = "If you feel the game is throwing way too much stuff at you, you can make some quick cash selling excess items.";
SWWM_INTERTIP140 = "The Demolitionist's chassis carries a faint lime scent.";
SWWM_INTERTIP141 = "\"In the future, everything is Chrome.\"\n\nNever has a line from a children's cartoon rung more true after the inevitable rise of the web-app supremacy.";
SWWM_INTERTIP142 = "This mod is in constant development. Remember to report any bugs you may find.";
@@ -1327,7 +1063,7 @@ SWWM_INTERTIP149 = "Always take breaks during long play sessions. You'll play be
SWWM_INTERTIP150 = "This is the 150th tip. I can't believe I've written so many of them.";
// intermission fanart
SWWM_FANART = "Art: ";
-SWWM_NFANART = "14";
+SWWM_NFANART = "27";
SWWM_FANART1 = "S20TBL.jpg;Substance20 (@S20_TBL)";
SWWM_FANART2 = "CaptainJ.png;Captain J (@Jho7835)";
SWWM_FANART3 = "RedeadITA.png;Redead-ITA";
@@ -1342,6 +1078,19 @@ SWWM_FANART11 = "Marisa4.jpg";
SWWM_FANART12 = "Marisa5.jpg";
SWWM_FANART13 = "Marisa6.jpg";
SWWM_FANART14 = "Marisa7.jpg";
+SWWM_FANART15 = "Marisa8.jpg";
+SWWM_FANART16 = "Marisa9.jpg";
+SWWM_FANART17 = "Marisa10.jpg";
+SWWM_FANART18 = "Marisa11.jpg";
+SWWM_FANART19 = "Marisa12.jpg";
+SWWM_FANART20 = "Marisa13.jpg";
+SWWM_FANART21 = "Marisa14.jpg";
+SWWM_FANART22 = "Monsoon.jpg;Monsoon-Soft (@MonsoonSoft)";
+SWWM_FANART23 = "Monsoon2.jpg;Monsoon-Soft (@MonsoonSoft)";
+SWWM_FANART24 = "Monsoon3.png;Monsoon-Soft (@MonsoonSoft)";
+SWWM_FANART25 = "Monsoon4.png;Monsoon-Soft (@MonsoonSoft)";
+SWWM_FANART26 = "Marisa15.jpg";
+SWWM_FANART27 = "Marisa16.jpg";
// achievements
SWWM_ACHIEVEMENT_ACID_TAG = "Fizzy Goodness";
SWWM_ACHIEVEMENT_ACID_TXT = "Melt %d enemies with Telebrium Flechettes";
@@ -1381,8 +1130,6 @@ SWWM_ACHIEVEMENT_BUTTS_TAG = "Let's get to Bashing Butts";
SWWM_ACHIEVEMENT_BUTTS_TXT = "Kill %d enemies by dashing backwards";
SWWM_ACHIEVEMENT_CANDY_TAG = "Piece of Candy";
SWWM_ACHIEVEMENT_CANDY_TXT = "Collect %d nuggets";
-SWWM_ACHIEVEMENT_CHEAT_TAG = "Mishe Trickery";
-SWWM_ACHIEVEMENT_CHEAT_TXT = "Successfully input a cheat code";
SWWM_ACHIEVEMENT_CLIFFYB_TAG = "Errand Boy Bullshit";
SWWM_ACHIEVEMENT_CLIFFYB_TXT = "Finish a map without collecting any keys";
SWWM_ACHIEVEMENT_CLONK_TAG = "CLONK";
@@ -1409,14 +1156,10 @@ SWWM_ACHIEVEMENT_DIVINE_TAG = "Divine Delight";
SWWM_ACHIEVEMENT_DIVINE_TXT = "Use %d Divine Sprites";
SWWM_ACHIEVEMENT_DOODLE_TAG = "Graffiti Master";
SWWM_ACHIEVEMENT_DOODLE_TXT = "Doodle mustaches on %d demon faces";
-SWWM_ACHIEVEMENT_DOSH_TAG = "Unchecked Capitalism";
-SWWM_ACHIEVEMENT_DOSH_TXT = "Accumulate ¥1,000,000,000 across your playthroughs";
SWWM_ACHIEVEMENT_EVERYTHING_TAG = "The Demolitionist";
SWWM_ACHIEVEMENT_EVERYTHING_TXT = "Unlock all achievements";
SWWM_ACHIEVEMENT_EZKILL_TAG = "Misa's Pride";
SWWM_ACHIEVEMENT_EZKILL_TXT = "Kill %d enemies with a single Ynykron Artifact shot (excluding altfire)";
-SWWM_ACHIEVEMENT_FISTO_TAG = "Facepunching Extraordinaire";
-SWWM_ACHIEVEMENT_FISTO_TXT = "Kill %d enemies with the Hand of Divine";
SWWM_ACHIEVEMENT_FLIGHT_TAG = "Blasting Off Again";
SWWM_ACHIEVEMENT_FLIGHT_TXT = "Send an enemy flying over %d map units away";
SWWM_ACHIEVEMENT_FRIEND_TAG = "Do You Like Caco?";
@@ -1447,8 +1190,6 @@ SWWM_ACHIEVEMENT_HND_TAG = "High Noon";
SWWM_ACHIEVEMENT_HND_TXT = "Land %d killing shots in a single Puntzer Beta reload";
SWWM_ACHIEVEMENT_HURRY_TAG = "In a Hurry";
SWWM_ACHIEVEMENT_HURRY_TXT = "Beat a map with 0 kills, items and secrets";
-SWWM_ACHIEVEMENT_ICE_TAG = "Ice Ice Baby";
-SWWM_ACHIEVEMENT_ICE_TXT = "Impale %d enemies with the Blackfire Igniter secondary";
SWWM_ACHIEVEMENT_JUMP_TAG = "Verticality";
SWWM_ACHIEVEMENT_JUMP_TXT = "Walljump %d times";
SWWM_ACHIEVEMENT_KANCHO_TAG = "Extreme Kancho";
@@ -1465,6 +1206,8 @@ SWWM_ACHIEVEMENT_LOVE_TAG = "Lethal Love";
SWWM_ACHIEVEMENT_LOVE_TXT = "Kill %d enemies with a blown kiss (not counting insta-kills)";
SWWM_ACHIEVEMENT_MASHIRO_TAG = "Layers of White";
SWWM_ACHIEVEMENT_MASHIRO_TXT = "Summon the White Lady";
+SWWM_ACHIEVEMENT_MATRYOSHKA_TAG = "Mishe Trickery";
+SWWM_ACHIEVEMENT_MATRYOSHKA_TXT = "A Chancebox inside a Chancebox inside a Chancebox inside a Chancebox inside a...";
SWWM_ACHIEVEMENT_MBF_TAG = "You can Pet the Dog";
SWWM_ACHIEVEMENT_MBF_TXT = "Pet a dog";
SWWM_ACHIEVEMENT_MEGA_TAG = "Mass Massacre";
@@ -1487,8 +1230,6 @@ SWWM_ACHIEVEMENT_PAR_TAG = "Fast";
SWWM_ACHIEVEMENT_PAR_TXT = "Beat the par time in %d maps";
SWWM_ACHIEVEMENT_PEACE_TAG = "Pacifist";
SWWM_ACHIEVEMENT_PEACE_TXT = "Finish a map without dealing damage";
-SWWM_ACHIEVEMENT_PENE_TAG = "Penetrator";
-SWWM_ACHIEVEMENT_PENE_TXT = "Strike through %d enemies in a row with a single Grand Lance secondary";
SWWM_ACHIEVEMENT_PLASMA_TAG = "Blastin' Plasma";
SWWM_ACHIEVEMENT_PLASMA_TXT = "Kill an enemy at full health with a Plasma Blaster charged shot %d times";
SWWM_ACHIEVEMENT_PLUSH_TAG = "Lovestruck";
@@ -1509,7 +1250,7 @@ SWWM_ACHIEVEMENT_ROAST_TXT = "Perform %d bayonet combos with the Quadravol";
SWWM_ACHIEVEMENT_SALT_TAG = "Maximum Oversalt";
SWWM_ACHIEVEMENT_SALT_TXT = "Shoot 25 Saltshot rounds simultaneously";
SWWM_ACHIEVEMENT_SANIC_TAG = "CHILLI DOGS";
-SWWM_ACHIEVEMENT_SANIC_TXT = "Reach a top speed of %d km/h";
+SWWM_ACHIEVEMENT_SANIC_TXT = "Reach a top speed of %d kph";
SWWM_ACHIEVEMENT_SEKIRO_TAG = "Hesitation is Defeat";
SWWM_ACHIEVEMENT_SEKIRO_TXT = "Die and reboot two times in the same map";
SWWM_ACHIEVEMENT_SHAME_TAG = "Shameful";
diff --git a/language.def_dlg b/language.def_dlg
new file mode 100644
index 000000000..d7afa1853
--- /dev/null
+++ b/language.def_dlg
@@ -0,0 +1,252 @@
+[default]
+// "Direct messages"
+SWWM_INCOMINGMSG = "Incoming direct message from %s...";
+SWWM_SAYANAME = "\cgSaya Miyamoto\c-";
+SWWM_SAYASNAME = "\cgSaya\c-";
+SWWM_CYTHONAME = "\cvArchduke Cytho Valathor\c-";
+SWWM_CYTHOSNAME = "\cvCytho\c-";
+SWWM_IBUKINAME = "\crIbuki Miyamoto\c-";
+SWWM_IBUKISNAME = "\crIbuki\c-";
+SWWM_KIRINNAME = "\cxKirin Xanai\c-";
+SWWM_KIRINSNAME = "\cxKirin\c-";
+SWWM_ZNVNAME = "\chZanaveth Nekuraku III\c-";
+SWWM_ZNVSNAME = "\chZanaveth\c-";
+// E1M8
+SWWM_SAYAPHOBOS1 = "I kinda forgot to mention this in the briefing but... There's a bit of an issue here, \cdDemo-chan\c-.";
+SWWM_SAYAPHOBOS2 = "The gate to Deimos is guarded by two nasty pieces of work, and you're gonna have to get rid of them.";
+SWWM_SAYAPHOBOS3 = "They're apparently \"replacements\" for whatever the other guy killed to go the same route.";
+SWWM_SAYAPHOBOS4 = "Well, knowing you, I'm sure they won't be a problem. Anyway, that's everything for now. Good luck.";
+// E2M8
+SWWM_SAYADEIMOS1 = "Be careful, \cdDemo\c-, I've got a bad feeling about this.";
+SWWM_SAYADEIMOS2 = "There's a large energy reading coming from outside, and I mean LARGE.";
+SWWM_SAYADEIMOS3 = "On top of that I can't seem to get in touch with \cvCytho-sama\c- for info on where to go.";
+SWWM_SAYADEIMOS4 = "You're on your own here, I guess. If you can't figure a way out, I'll be on stand-by for a recall.";
+// E3M8
+SWWM_SAYADIS1 = "And here we are... The very center of it all.";
+SWWM_SAYADIS2 = "This is where the first portal to Earth was opened, and you're gonna use it to get back.";
+SWWM_SAYADIS3 = "And of course, the place is guarded, why wouldn't it be. You've got to kill stuff, as usual.";
+SWWM_SAYADIS4 = "Let's just hope it drops you off at the right place. Keep going, \cdDemo-chan\c-, you're almost there.";
+// E4M8
+SWWM_SAYATHY1 = "Alright, good news for once. There's a portal nearby and I'm sure it'll take you to the right spot.";
+SWWM_SAYATHY2 = "But, of course, you gotta kick some ass to get there. I mean, nothing in life is easy, isn't it?";
+SWWM_SAYATHY3 = "I'll be ready to debrief you later on your ACTUAL mission.";
+SWWM_SAYATHY4 = "Yeah, still have no clue why this massive detour happened. But I'll get to the bottom of it, trust me.";
+// E5M8
+SWWM_CYTHOSIGIL1 = "\cdDemo\c-, this is \cvCytho\c-. I've got an important message to relay from the royal family.";
+SWWM_CYTHOSIGIL2 = "Prince Baphomet is satisfied with your efforts, and has opened a gate for you to return to Earth.";
+SWWM_CYTHOSIGIL3 = "Unfortunately, the gate is guarded by high level military demons, two of them, in fact.";
+SWWM_CYTHOSIGIL4 = "... Although, knowing you, I'm certain this will not be an issue, correct?";
+// MAP07
+SWWM_SAYADIMPLE1 = "Hold up right there, \cdDemo-chan\c-. You're about to step in on dangerous territory.";
+SWWM_SAYADIMPLE2 = "This is the first line of defense that's been set up around the inner starport, and it's a bitch.";
+SWWM_SAYADIMPLE3 = "Hopefully, you've got plenty of goodies on ya to smash through... You do, right?";
+SWWM_SAYADIMPLE4 = "Well, we've already seen what you've been able to do so far, so I'm sure you'll be fine.";
+SWWM_SAYADIMPLE5 = "Good luck!";
+// MAP11
+SWWM_SAYACIRCLE1 = "You're almost there, \cdDemo\c-. The main switch for the demonic barrier is nearby.";
+SWWM_SAYACIRCLE2 = "Since it's still intact, that means you're already ahead of the other guy, which is good.";
+SWWM_SAYACIRCLE3 = "Special forces are on stand-by to evacuate everyone once you hit that shit and secure the area.";
+SWWM_SAYACIRCLE4 = "With that, the last bastion of the local population will be gone, leaving just demons behind.";
+SWWM_SAYACIRCLE5 = "That'll give us time to think of our next step, I suppose.";
+// MAP20
+SWWM_SAYAGOTCHA1 = "This is the place, yup. Big fortress surrounded by a lake of toxic blood. Very demonic.";
+SWWM_SAYAGOTCHA2 = "These schmucks have the whole place well guarded, so you're gonna find a lot of resistance.";
+SWWM_SAYAGOTCHA3 = "Blast through, kill shit, and you'll be there in no time.";
+SWWM_SAYAGOTCHA4 = "Once you reach the portal, I'll hit up \cvCytho-sama\c- for instructions on how to close it.";
+SWWM_SAYAGOTCHA5 = "That's all, I guess. Good luck, my \cdDemolitionist\c-.";
+// MAP20 special (Ultimate Doom 2)
+SWWM_SAYAGOTCHAEND1 = "Wait, what the fuck is this? The readings show there's two portals?";
+SWWM_SAYAGOTCHAEND2 = "No, no, that's not right...";
+SWWM_SAYAGOTCHAEND3 = "Uh, ok, \cfDemo-chan\c-, see if you can find a way to close them up, okay?";
+SWWM_SAYAGOTCHAEND4 = "Meanwhile, I'm gonna go call \cvCytho-sama\c-. Something's iffy about this...";
+SWWM_SAYAGOTCHAEND5 = "Just... Try not to get in trouble while I'm away.";
+// MAP30
+SWWM_SAYAIOS1 = "\cdDemo-chan\c-... This is it, you're about to face the Psychic Commander, the leader of Hell's army.";
+SWWM_SAYAIOS2 = "I don't know if... ... W-well, I shouldn't be worrying about that at this point.";
+SWWM_SAYAIOS3 = "You can do it, you can put an end to all of this. You're... My... O-our hero.";
+SWWM_SAYAIOS4 = "Oh god I can't do this, my heart rate is spiking...";
+SWWM_SAYAIOS5 = "... \cdD-Demo-chan\c-... Please save the world and... Please return home.";
+// MAP30 with Rampancy
+SWWM_SAYARAMPANCY1 = "\cdDemo-chan\c-, that thing's bluffing, trust me. I saw those failed login attempts.";
+SWWM_SAYARAMPANCY2 = "I'm sure it's going to try pulling some cliched bullshit to \"turn you to its side\" or whatever.";
+SWWM_SAYARAMPANCY3 = "What a joke. Whatever it tries to say, don't listen to it. It's all bullshit and lies.";
+SWWM_SAYARAMPANCY4 = "Now, go kick some robotic ass, my brave \cdDemolitionist\c-. We're all counting on you over here.";
+// LEVEL08
+SWWM_CYTHONERVE1 = "I haven't been able to contact \cgSaya\c-, I assume she's asleep, seeing as it's night-time in Japan.";
+SWWM_CYTHONERVE2 = "Many other groups have already been suppressed worldwide, their numbers are quickly waning.";
+SWWM_CYTHONERVE3 = "You, however, are up against a cybernetic lieutenant known as the \"Last Tyrant\". This will be tough.";
+SWWM_CYTHONERVE4 = "Nevertheless... You are the hero \cdDemolitionist\c-, and you are going to teach these vile fiends a lesson.";
+SWWM_CYTHONERVE5 = "Extinguish the flames of demonic corruption that tarnish this land.\nWe the Kuriste believe in you.";
+// Eviternity MAP30
+SWWM_SAYAEVIA1 = "Psch... Look at this place. This dude couldn't be more of a pretentious show-off if he tried.";
+SWWM_SAYAEVIA2 = "However \"angelic\" he may look, he's just some dude in pretty armor, so you can kick his ass.";
+SWWM_SAYAEVIA3 = "This whole place, though... Damn, I sure hope you've taken a lot of high res shots like I told you.";
+SWWM_SAYAEVIA4 = "I'm gonna go grab some popcorn now. This is gonna be an epic battle for sure, kihihihihi...";
+SWWM_SAYAEVIB1 = "What? This is some fucking videogame bullshit right there. You're telling me the guy has TWO HEALTHBARS???";
+SWWM_SAYAEVIB2 = "Bullshit, fucking bullshit! Absolute trash garbage bullshit! Kill his ass, \cdDemo-chan\c-!";
+// Heretic E1M8
+SWWM_SAYAMAW1 = "Here we are, in \"Hell's Maw\".";
+SWWM_SAYAMAW2 = "According to the Sidhe this houses the portal that connects to the demons' realm.";
+SWWM_SAYAMAW3 = "I think it's gonna be pretty interesting to visit another universe's equivalent of hell, yeah.";
+SWWM_SAYAMAW4 = "... And of course, it's going to be even more interesting to blow shit up in it, too, right?";
+SWWM_SAYAMAW5 = "Just... Be on the lookout for whatever it is that's guarding the place.";
+// Heretic E2M8
+SWWM_SAYAMASTERS1 = "OK, so... We're one step closer to that serpent rider's home turf. But there's a problem.";
+SWWM_SAYAMASTERS2 = "Specifically, several problems. Big, bulky, muscular problems.";
+SWWM_SAYAMASTERS3 = "We're talking BIG MINOTAURS with BIG HAMMERS here.";
+SWWM_SAYAMASTERS4 = "I don't know about you, but I'm already hearing the Pillar Men theme in my head.";
+SWWM_SAYAMASTERS5 = "Go get them, \cdDemo Demostar\c-... ... ... OK maybe that's a terrible pun, forget about it.";
+// Heretic E3M8
+SWWM_SAYADSPARIL1 = "This is it, \cdDemo-chan\c-. You're about to face that stupid-ass wizard.";
+SWWM_SAYADSPARIL2 = "You're gonna save another world, and all in record time. You're on a roll!";
+SWWM_SAYADSPARIL3 = "... Oh, and remember, there's a surprise waiting for you at home. Oh, you're so gonna love it.";
+SWWM_SAYADSPARIL4 = "Splgslshglgh";
+SWWM_SAYADSPARIL5 = "Oh shit that got picked up by the voice recognition? Oops...";
+// Heretic E4M8
+SWWM_SAYAHEADS1 = "Geez, I'm getting impatient with all this stuff. I hope this really takes you back home.";
+SWWM_SAYAHEADS2 = "And if not, well, more time for me to refine this \"present\" that I'm going to give ya.";
+SWWM_SAYAHEADS3 = "Thanks to this, I've managed to improve its potency even further. This is going to be fun.";
+SWWM_SAYAHEADS4 = "I seriously can't wait to try it, and I'm sure you're also dying to know...";
+SWWM_SAYAHEADS5 = "Smite thy foes and come claim thy prize, o \cdDemolitionist\c-.";
+SWWM_SAYAHEADS6 = "... I seriously just fucking said that...";
+// Heretic E5M8
+SWWM_SAYABULLS1 = "And it still keeps going, oh my god...";
+SWWM_SAYABULLS2 = "It's like you're getting thrown around random realms. Look, I'm starting to get pissed.";
+SWWM_SAYABULLS3 = "I'm so pissed in fact that, if the next portal doesn't immediately send you back to Parthoris, I'll just...";
+SWWM_SAYABULLS4 = "Yeah...";
+SWWM_SAYABULLS5 = "I NEED you to come back home, \cdDemo-chan\c-. I desperately need you here to test this.";
+// Seven Portals
+SWWM_SAYAGREETA1 = "There it is, \cdDemo-chan\c-. That's your target, that big stinky ugly monster. That's Korax.";
+SWWM_SAYAGREETA2 = "... By the way, did you catch the guy's scent? It's bad, isn't it?";
+SWWM_SAYAGREETA3 = "God, imagine the smell in person... Just thinking about it is making my stomach turn.";
+SWWM_SAYAGREETB1 = "Coward... Taunting us from afar..."; // Kirin reply
+SWWM_SAYAGREETC1 = "Yeah, sneaky and stinky, telltale signs of an ugly bastard.";
+SWWM_SAYAGREETD1 = "Ugly... Bastard?"; // Kirin reply
+SWWM_SAYAGREETE1 = "I'd rather not explain, \cxKirin-kun\c-. You'd be very disappointed in all of humankind.";
+SWWM_SAYAGREETF1 = "That's certainly not reassuring to hear..."; // Kirin reply
+// Shadow Wood
+SWWM_SAYABLOODA1 = "I don't know how this dude can even smell anything other than that rancid old dog fart stench he wafts.";
+SWWM_SAYABLOODA2 = "Like seriously, jesus fucking christ...";
+SWWM_SAYABLOODB1 = "That ugly bastard needs to take a bath."; // Ibuki reply
+SWWM_SAYABLOODC1 = "Ugly bastard? What's this now, some lame-ass doujin?";
+SWWM_SAYABLOODD1 = "Heh, nice one, \cgSayacchi\c-."; // Ibuki reply
+// Hypostyle
+SWWM_SAYAHYPO1 = "Here we are, after all that roaming around. Whatever lies here, we gotta slay it to catch the next portal.";
+SWWM_SAYAHYPO2 = "I sure hope it's not a fucking dragon. That'd be the most cheap-ass generic boss ever.";
+SWWM_SAYAHYPO3 = "Uh... I totally jinxed it, didn't I? I bet I did. Yeah, I bet it's a fucking dragon.";
+SWWM_SAYAHYPO4 = "I bet THAT GUY is going to rise from the grave and fucking sell me his damn game for the thousandth time.";
+// Heresiarch's Seminary
+SWWM_KIRINWORSHIPA1 = "Pathetic, disgusting creature...\nWho would ever think of worshipping a foul beast such as yourself?";
+SWWM_KIRINWORSHIPB1 = "The only thing I'd worship is that juicy cock of yours, \cxKirin-kun\c-~"; // Saya reply
+SWWM_KIRINWORSHIPC1 = "PFFFFFFFFFFFFFF";
+SWWM_KIRINWORSHIPD1 = "Guh! \cxKiriiiiin\c-! You got cola all over me! God damn it you spit as hard as you cum!"; // Saya reply
+SWWM_KIRINWORSHIPD2 = "O-oh... Wait, this thing's still on. Shit... \cdDemo-chan\c- just read all of that.";
+// Castle of Grief
+SWWM_SAYAGAMEA1 = "Wow, look at fucking mister chessmaster over here... Fuck you!";
+SWWM_SAYAGAMEA2 = "This guy is a fucking idiot and he's pissing me off even more. I so want to watch you beat his sorry ass...";
+SWWM_SAYAGAMEB1 = "Chess nerd..."; // Ibuki
+SWWM_SAYAGAMEC1 = "I bet he was in the chess club.";
+// Necropolis
+SWWM_SAYAMASTERSA1 = "Masters, masters... Whose masters? Awaken my masters? Well, whatever, I don't care what he says.";
+SWWM_SAYAMASTERSA2 = "I so want you to kill this dude...";
+SWWM_SAYAMASTERSB1 = "Are you strong enough to face the fact you SMELL?"; // Ibuki reply
+SWWM_SAYAMASTERSC1 = "I showered this morning, \crIbuki\c-.";
+SWWM_SAYAMASTERSD1 = "I meant the stinky boy over there. You smell nice."; // Ibuki reply
+SWWM_SAYAMASTERSE1 = "\cgSayacchi\c- definitely has a pleasant scent to her."; // Kirin reply
+SWWM_SAYAMASTERSF1 = "Guhuhuhu... Thanks.";
+// Zedek
+SWWM_SAYAFIGHTER1 = "This is where Zedek lies, the fighty boy. He probably thinks he's strong, but he hasn't met you.";
+SWWM_SAYAFIGHTER2 = "Do watch out for any traps, though. I bet there's some nasty shit here.";
+// Traductus
+SWWM_SAYACLERICA1 = "If there's one thing I've learned from videogames is that clerics are the lowest trash.";
+SWWM_SAYACLERICA2 = "That's everything I have to say.";
+SWWM_SAYACLERICB1 = "I have never encountered a single cleric who hasn't attempted to assassinate me."; // Kirin reply
+SWWM_SAYACLERICC1 = "Oh yeah, the people from the Sacrosanct Empire, right? Totally forgot about those.";
+SWWM_SAYACLERICC2 = "Clerics fucking suck...";
+// Menelkir
+SWWM_SAYAMAGE1 = "Menelkir's lair, huh... ... Oh god, don't tell \cxKirin-kun\c-, there's puzzles here.";
+SWWM_SAYAMAGE2 = "Yeah, he's more than tired of stuff like this. And apparently now we're doing the picture matching kind.";
+SWWM_SAYAMAGE3 = "Well, at least those are actual puzzles, and not whatever the fuck the other stuff was.";
+SWWM_SAYAMAGE4 = "Even if they're... You know... The really lame and piss-easy kind.";
+// Dark Crucible
+SWWM_SAYAKORAXA1 = "This is it, \cdDemo\c-. The big stinky ugly bastard is waiting.";
+SWWM_SAYAKORAXB1 = "At last, that vile schemer's evil reign shall end."; // Kirin reply
+SWWM_SAYAKORAXC1 = "Time for him to take a fucking bath. After you rearrange his knees, of course."; // Ibuki reply
+SWWM_SAYAKORAXD1 = "Even though \cvMeido\c- isn't watching, I can tell you the four of us are cheering you on.";
+SWWM_SAYAKORAXE1 = "Fight on, \cdDemo-chan\c-. You can do it, we believe in you."; // Kirin reply
+// Blight
+SWWM_SAYABLIGHTA1 = "Hey, \cdDemo-chan\c-, remember puzzles?";
+SWWM_SAYABLIGHTB1 = "Nnnnngh..."; // Kirin reply
+SWWM_SAYABLIGHTC1 = "I think \cxKirin\c- just heard me. Well... You know what to do.";
+SWWM_SAYABLIGHTC2 = "I can tell this is going to be yet more bullshit, so be prepared for anything.";
+// Constable's Gate
+SWWM_SAYACONSTABLEA1 = "Castles and shit... It just keeps going. I said it in the briefing, anyway... So you know...";
+SWWM_SAYACONSTABLEA2 = "Please keep on exploding things. \cvMeido-chan\c- made some snacks, so we've got that at least.";
+SWWM_SAYACONSTABLEB1 = "She really is so thoughtful, that girl..."; // Ibuki reply
+SWWM_SAYACONSTABLEC1 = "Even though you can hear her curse everything under her breath about what's happening in there.";
+SWWM_SAYACONSTABLED1 = "Yeah, that's our \cvMeido\c- alright."; // Ibuki reply
+// Nave
+SWWM_SAYANAVEA1 = "I want to borrow the reality bending powers of the \ctMishe\c- to destroy this entire world.";
+SWWM_SAYANAVEA2 = "I'm seriously pissed, we all are pissed. Hell, even \cxKirin\c- is upset, and we can't calm him down anymore.";
+SWWM_SAYANAVEB1 = "It's kind of cute and worrying at the same time."; // Ibuki reply
+SWWM_SAYANAVEC1 = "NNNNNNNNGGGGGHHHHHHHH!"; // Kirin reply
+SWWM_SAYANAVED1 = "\cxKirin-kun\c-, you're going to suffocate if you keep screaming into the pillow like that.";
+SWWM_SAYANAVEE1 = "Maybe that's what he wants, \cgSaya\c-.\nHe seeks the sweet release of death to find inner peace."; // Ibuki
+SWWM_SAYANAVEF1 = "If he wasn't immortal that would be an extremely fucked up thing to say, \crIbuki\c-.";
+// Dark Citadel
+SWWM_SAYADEATHKINGS1 = "I'm so pissed I could punch a hole through reality to tell these fucking Deathkings to fuck off.";
+// Kirin's Thrilling Commentary on Puzzles™
+// first puzzle switch on Seven Portals
+SWWM_KIRINPUZZLEA1 = "A peculiar contraption... Allegedly it cites to be part of a larger whole, calling itself a \"puzzle\".";
+SWWM_KIRINPUZZLEA2 = "\cgSayacchi\c- did mention you'd be coming across these. That's most certainly intriguing...";
+// second puzzle switch on Seven Portals
+SWWM_KIRINPUZZLEB1 = "Another one... Interesting...";
+// third puzzle switch on Seven Portals
+SWWM_KIRINPUZZLEC1 = "I fail to see now what makes this exactly a \"puzzle\". This is no more than a switch hunt.";
+SWWM_KIRINPUZZLEC2 = "Hardly a challenge to one's intellect, wouldn't you agree, \cdDemo-chan\c-?";
+// first puzzle switch on Shadow Wood
+SWWM_KIRINPUZZLED1 = "It does seem that these \"puzzle switches\" simply keep on showing up wherever you go.";
+SWWM_KIRINPUZZLED2 = "I'm sure you are as tired as I am of them.";
+// fourth puzzle switch on Shadow Wood
+SWWM_KIRINPUZZLEE1 = "These so-called \"puzzles\"... They're an insult to our intelligence.";
+SWWM_KIRINPUZZLEE2 = "... I hope I'm not sending too many of these messages.";
+// first puzzle switch on Heresiarch's Seminary
+SWWM_KIRINPUZZLEF1 = "When will it end? Just how many fractions of \"puzzles\" are we to solve???";
+SWWM_KIRINPUZZLEF2 = "Is this how that sayzha axhkhashaar dares to mock us? With these tiresome games?";
+SWWM_KIRINPUZZLEF3 = "They... Nnngh... Kheza sakharei!";
+SWWM_KIRINPUZZLEG1 = "\cxKirin-kun\c-, I think you're getting a bit too worked up about this."; // Saya reply
+SWWM_KIRINPUZZLEH1 = "Yes... I... I'll just lie down for a while, s-sorry...";
+SWWM_KIRINPUZZLEI1 = "... Poor guy. I do agree with him, though... This shit really gets on your nerves, doesn't it?"; // Saya reply
+SWWM_KIRINPUZZLEI2 = "Well... Gonna go give \cxKirin-kun\c- some TLC now. Don't worry, he'll be fine. He's in good hands.";
+// first puzzle switch on Blight
+SWWM_KIRINPUZZLEJ1 = "We can't escape, can we? These \"puzzles\" continue to haunt us even now...";
+SWWM_KIRINPUZZLEJ2 = "This accursed land... Plagued by these vile contraptions... I shall never set foot in it. Mark my words.";
+// last puzzle switch on Blight
+SWWM_KIRINPUZZLEK1 = "Please... Make it stop...";
+SWWM_KIRINPUZZLEL1 = "\cxKirin-kun\c-, hey... It's alright. Here... Drink up, it'll help you relax.\c-"; // Ibuki reply
+SWWM_KIRINPUZZLEM1 = "Gulp... Gulp... Gulp...";
+SWWM_KIRINPUZZLEN1 = "Man, look at him go... Drinking it all up like a champ."; // Saya reply
+SWWM_KIRINPUZZLEO1 = "You know how it is... Once they find a breast to suckle on, all their worries fade away..."; // Ibuki reply
+SWWM_KIRINPUZZLEP1 = "You know \cdDemo-chan\c- can read what we're saying, right?"; // Saya reply
+SWWM_KIRINPUZZLEQ1 = "Oh, I'm sure they'd be more than happy to have their turn once the mission's over, hm?"; // Ibuki reply
+// first puzzle switch on Constable's Gate
+SWWM_KIRINPUZZLER1 = "Let this be the last of these \"puzzles\" that we may encounter...";
+SWWM_KIRINPUZZLER2 = "Urp...";
+SWWM_KIRINPUZZLER3 = "My apologies.";
+SWWM_KIRINPUZZLES1 = "That was some good milk, wasn't it?"; // Saya reply
+SWWM_KIRINPUZZLET1 = "Certainly... I am grateful for \crIbuki\c-'s blessing.";
+SWWM_KIRINPUZZLEU1 = "Making her able to lactate at will is a blessing, yeah. I'm sure \cdDemo\c- agrees too."; // Saya reply
+// super secret cheats
+SWWM_ZNVTXT1 = "\cdDemolitionist\c-, it is me, \chZanaveth The Corruptor\c-. I have been witness of the act you have now acted, yes.";
+SWWM_ZNVTXT2 = "It is \cf%d\c- years since... and those magic words, I can see them again. Much impressed, very much impressed.";
+SWWM_ZNVTXT3 = "So, you can do the thing... As have the \ctMishe\c- also taught to myself. This is a nonexpected surprise, yes.";
+SWWM_ZNVTXT4 = "There are many such powerful words to use, \cdDemolitionist\c-. Do keep keeping to discover all of them.";
+SWWM_ZNVTXT5 = "And now I have to take off. Please extend greetings to aunt \cgSaya\c- for my part. Good luck, \cdDemolitionist\c-.";
+// easter egg
+SWWM_SAYAWASTEA1 = "Quit wasting ammo!";
+SWWM_SAYAWASTEB1 = "You're still doing it? Seriously?";
+SWWM_SAYAWASTEC1 = "OK, you're clearly just doing this for your own personal satisfaction.";
+SWWM_SAYAWASTED1 = "It's almost like you're jerking it off, kinda...";
+SWWM_SAYAWASTED2 = "Uh, forget I said that.";
+SWWM_SAYAWASTEE1 = "And still going... Rackin' it along.";
+SWWM_SAYAWASTEF1 = "OK, I promise I'll stop messaging you about it. You do you, I guess.";
diff --git a/language.def_lore b/language.def_lore
index 7dbd26f19..6dc07187c 100644
--- a/language.def_lore
+++ b/language.def_lore
@@ -179,7 +179,7 @@ SWWM_LORETXT_ANARUKON =
"Among the many members of this race inhabiting Earth, one name many would recognize would be that of \cfAshley Knox\c-, lead singer and guitarist of \cfThe Black Rat's Coven\c-. The reveal of not being actually human was received with much surprise, though it was not as spectacular as the fact that two other members of the band were literal gods.\n"
"\n"
"\cxSaya's Notes:\c-\n"
-"\cfYeah, really cool stuff about parallel worlds and gods and warriors and shit, ain't it? Stuff like this really makes me wish I could just like... travel all over the multiverse finding neat stuff and meeting cool people, you know. Maybe one day, who knows. All the shit that those fucking UAC idiots have done honestly made me rethink ever getting into interdimensional travel. Seriously, it's like every single damn old story about \"opening a portal to hell\" was just a prediction for that. Anyway, I'm getting a bit sidetracked. So, Ashley-san is one of them, that's neat and all, at least Yu-chan gets to have her own immortal girlfriend, huh. Same for Taro nii-san, having that damn prankster gremlin Ellen-san, also one of these people, of course. When the hell is it going to be my turn? I mean, not that I mind, I'm fine with having Maidbot and Ibuki around, and... I guess you too but... *sigh*, makes me damn jealous, you know.\c-";
+"\cfYeah, really cool stuff about parallel worlds and gods and warriors and shit, ain't it? Stuff like this really makes me wish I could just like... travel all over the multiverse finding neat stuff and meeting cool people, you know. Maybe one day, who knows. All the shit that those fucking UAC idiots have done honestly made me rethink ever getting into interdimensional travel. Seriously, it's like every single damn old story about \"opening a portal to hell\" was just a prediction for that. Anyway, I'm getting a bit sidetracked. So, Ashley-san is one of them, that's neat and all, at least Yu-chan gets to have her own immortal girlfriend, huh. Same for Taro nii-san, having that damn prankster gremlin Ellen-san, also one of these people, of course. When the hell is it going to be my turn? I mean, not that I mind, I'm fine with having Meido and Ibuki around, and... I guess you too but... *sigh*, makes me damn jealous, you know.\c-";
SWWM_LORETXT_ANARUKON2 =
"\cxName:\c-\n"
"\cf Anarukon (\"Undying\")\c-\n"
@@ -232,17 +232,19 @@ SWWM_LORETAG_ASHLEY = "Knox, Ashley";
SWWM_LORETAB_ASHLEY = "People";
SWWM_LOREREL_ASHLEY = "Yui;Saya;Sankaideriha;Gods";
SWWM_LORETXT_ASHLEY =
-"\cxFull Name:\c-\n"
-"\cf Ashley Knox\c-\n"
-"\cf Axaleyu Yanikov (Anarukon name)\c-\n"
-"\cxNationality:\c-\n"
-"\cf British\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1964-10-31 (before reveal)\c-\n"
-"\cf 1887-10-31 (actual)\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @ashley_da_witch (main)\c-\n"
-"\cf @stylish_witch (art)\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Ashley Knox\c-\n"
+" \cf Axaleyu Yanikov (Anarukon name)\c-\n"
+" \cxNationality:\c-\n"
+" \cf British\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1964-10-31 (before reveal)\c-\n"
+" \cf 1887-10-31 (actual)\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Lead Singer, Guitarist (Black Rat's Coven)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @ashley_da_witch (main)\c-\n"
+" \cf @stylish_witch (art)\c-\n"
"\n"
"Born in London in 1887, to \cfYrikha Yanikov\c- and \cfMaxwell A. Knox\c-, \cfAshley\c- is the oldest of three children, the others being \cfAdrian Knox\c-, veteran of both WW1 and WW2, and \cfViola Knox\c-, a witch in training (still as of 2148). She spent most of her childhood in Cornwall, after her mother had to flee due to accusations of witchcraft (which weren't exactly false).\n"
"\n"
@@ -287,14 +289,17 @@ SWWM_LORETAG_BIGSHOT = "Mr. BIG SHOT";
SWWM_LORETAB_BIGSHOT = "People";
SWWM_LOREREL_BIGSHOT = "Blackmann;Saya";
SWWM_LORETXT_BIGSHOT =
-"\cxFull Name:\c-\n"
-"\cf John Gunns\c-\n"
-"\cxAlias:\c-\n"
-"\cf Mr. BIG SHOT\c-\n"
-"\cxNationality:\c-\n"
-"\cf American\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2110-11-12\c-\n"
+" \cxFull Name:\c-\n"
+" \cf John Gunns\c-\n"
+" \cxAlias:\c-\n"
+" \cf Mr. BIG SHOT\c-\n"
+" \cxNationality:\c-\n"
+" \cf American\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2110-11-12\c-\n"
+" \cxOccupation:\c-\n"
+" \cf CEO (BIGSHOT Industries)\c-\n"
+" \cf Advisor (Blackmann Arms)\c-\n"
"\n"
"A man shrouded in mystery, having appeared out of nowhere, announcing himself to be the son of \cfBenellus, God of Shotguns\c-. The believability of this story is quite questionable, despite the insistence of his own mother, who claims that the god descended from the heavens, and giving her one \"blessed shotgun shell\", she was ordered to plant it on the ground, as from it, a man would be born, who would become the \"mightiest wielder of the ultimate firearm\". She said that John, already fully grown, sprung up from the ground only days after the shell was planted, and immediately proceeded to \"make shotguns burst from the ground around himself\", and he used the metals from them to build the very fortress the family has in the Nevada desert.\n"
"\n"
@@ -303,14 +308,17 @@ SWWM_LORETXT_BIGSHOT =
"\cxSaya's Notes:\c-\n"
"\cfYeah, dude's crazy, but see, THAT thing... I really REALLY wanted it. I even met up with the guy to get my hands on it. That shit is like... completely fucking insane, and I bet no living human would be able to fucking use it, BUT... you definitely can. Just so you know, every time you whip out that ballbusting hunk of metal, I'll be watching, so you better give me some fine entertainment to munch popcorn to.\c-";
SWWM_LORETXT_BIGSHOT2 =
-"\cxFull Name:\c-\n"
-"\cf John Gunns\c-\n"
-"\cxAlias:\c-\n"
-"\cf Mr. BIG SHOT\c-\n"
-"\cxNationality:\c-\n"
-"\cf American\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2110-11-12\c-\n"
+" \cxFull Name:\c-\n"
+" \cf John Gunns\c-\n"
+" \cxAlias:\c-\n"
+" \cf Mr. BIG SHOT\c-\n"
+" \cxNationality:\c-\n"
+" \cf American\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2110-11-12\c-\n"
+" \cxOccupation:\c-\n"
+" \cf CEO (BIGSHOT Industries)\c-\n"
+" \cf Advisor (Blackmann Arms)\c-\n"
"\n"
"A man shrouded in mystery, having appeared out of nowhere, announcing himself to be the son of \cfBenellus, God of Shotguns\c-. The believability of this story is quite questionable, despite the insistence of his own mother, who claims that the god descended from the heavens, and giving her one \"blessed shotgun shell\", she was ordered to plant it on the ground, as from it, a man would be born, who would become the \"mightiest wielder of the ultimate firearm\". She said that John, already fully grown, sprung up from the ground only days after the shell was planted, and immediately proceeded to \"make shotguns burst from the ground around himself\", and he used the metals from them to build the very fortress the family has in the Nevada desert.\n"
"\n"
@@ -322,34 +330,6 @@ SWWM_LORETXT_BIGSHOT2 =
"\cfYeah, dude's crazy, but see, THAT thing... I really REALLY wanted it. I even met up with the guy to get my hands on it. That shit is like... completely fucking insane, and I bet no living human would be able to fucking use it, BUT... you definitely can. Just so you know, every time you whip out that ballbusting hunk of metal, I'll be watching, so you better give me some fine entertainment to munch popcorn to.\c-\n"
"\n"
"\cfHonestly I'm not surprised the guy survived the whole thing, probably blasted a thousand demons himself with the shit he's got in there, too. Also, no fucking clue what that thing about fights and faces and shit is, must've gone even crazier with all the demon invasion stuff happening.\c-";
-SWWM_LORETAG_BLACKFIREIGNITER = "Blackfire Igniter";
-SWWM_LORETAB_BLACKFIREIGNITER = "Item";
-SWWM_LOREREL_BLACKFIREIGNITER = "Sankaideriha;Unissix;Gods;Saya";
-SWWM_LORETXT_BLACKFIREIGNITER =
-"\cxDesignation:\c-\n"
-"\cf Blackfire Igniter\c-\n"
-"\cxManufacturer:\c-\n"
-"\cf Unissix Crafts\c-\n"
-"\cf Design by LS\c-\n"
-"\cxClassification:\c-\n"
-"\cf Flamethrower\c-\n"
-"\n"
-"Devised by the primordial god of magic themself, the \cfBlackfire Igniter\c- is rather surprisingly a very cold, dark weapon. Blackfire is a type of magical flame that absorbs heat and light, rather than emitting them.\n"
-"\n"
-"During the height of \cfUnissix Crafts\c-'s fame, the god personally approached \cfMisa Unissix\c- herself with a request for a weapon that would allow just about anyone to readily perform \cfBlackfire Manipulation Magic\c-.\n"
-"\n"
-"The Igniter is the perfect blend of magic and technology, weaponized. At your fingertips, you have the power to call forth freezing flames that will turn your enemies into pretty ice statues in mere seconds.\n"
-"\n"
-"\cfPrimary Fire:\c- Releases a continuous stream of Blackfire, with moderate range. The flames not only rapidly freeze whatever they touch, but also reduce the air temperature, leaving a lingering freeze effect.\n"
-"\n"
-"\cfSecondary Fire:\c- Concentrated bursts that form spears of supercooled air which can impale small targets, or tear right through them.\n"
-"\n"
-"\cfReloading:\c- Attach up to two canisters to replenish the weapon's internal dark mana reserves. Each canister will remain locked in until it's been emptied, otherwise residual energy could escape and bring harm to the user. If there is an empty canister attached, the reload action will detach it first. Fresh canisters can still be used even if the tank is full, and they will act as an extra \"buffer\" of mana until depleted.\n"
-"\n"
-"\cxSaya's Notes:\c-\n"
-"\cfSo yeah, Misa-Misa has other toys besides that one bigass gun. Pretty cool that she gets requests and whatnot, lil' cinnamon roll's quite popular there, heheheh...\c-\n"
-"\n"
-"\cfI heard very little of all this Blackfire stuff from LS-sama, but it sounds like fun. Wonder if it can be used in a spellcard...\c-";
SWWM_LORETAG_BLACKMANN = "Blackmann Arms";
SWWM_LORETAB_BLACKMANN = "People";
SWWM_LOREREL_BLACKMANN = "BigShot;Saya";
@@ -510,14 +490,17 @@ SWWM_LORETAG_CYTHO = "Valathor, Cytho";
SWWM_LORETAB_CYTHO = "People";
SWWM_LOREREL_CYTHO = "Hell;Ellen;Anarukon;DemonInvasion;UAC;Saya;AkariLabs;Demolitionist";
SWWM_LORETXT_CYTHO =
-"\cxFull Name:\c-\n"
-"\cf Archduke Cytho of House Valathor\c-\n"
-"\cxNationality:\c-\n"
-"\cf Kuriste\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2008-10-09\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @incuvalathor\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Archduke Cytho of House Valathor\c-\n"
+" \cxNationality:\c-\n"
+" \cf Kuriste\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2008-10-09\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Independent News Reporter\c-\n"
+" \cf Ambassador (Kuriste Kingdom)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @incuvalathor\c-\n"
"\n"
"Born in the now fallen Iskar township in 2008 as one of the youngest men of the humble \cfHouse Valathor\c-, \cfCytho\c- took to the family business upon reaching adulthood, quickly climbing the ranks of \cfHell\c-'s sex work industry, partly due to his innate beauty, but also the rapidly accumulating \"satisfied customers\" he would regularly service, and the many pupils he'd take under his wing. By 2028, he had made of Earth his second home, where he would open up an account on social media for a more modern method of attracting new clientele.\n"
"\n"
@@ -603,16 +586,18 @@ SWWM_LORETAG_DEMOLITIONIST = "Demolitionist";
SWWM_LORETAB_DEMOLITIONIST = "People";
SWWM_LOREREL_DEMOLITIONIST = "AkariLabs;Ibuki;Saya;Zanaveth2;Hell;UAC;Nekuratek;Belt;Collar;Propulsor;Hammerspace;Display;Voicebox;Maidbot;EngineTech;Kirin;DemonInvasion;Cytho";
SWWM_LORETXT_DEMOLITIONIST =
-"\cxFull Name:\c-\n"
-"\cf Akari Labs First Generation Autonomous Combat Unit\c-\n"
-"\cf Demolitionist (codename)\c-\n"
-"\cf Demo Miyamoto (first unit)\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2148-01-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @demolitionist_bot\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Akari Labs First Generation Autonomous Combat Unit\c-\n"
+" \cf Demolitionist (codename)\c-\n"
+" \cf Demo Miyamoto (first unit)\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2148-01-20\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Pro Hero\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @demolitionist_bot\c-\n"
"\n"
"The \cfDemolitionist\c- is one of the crowning achievements of \cfAkari Labs\c- on the field of robotics. An AI-driven combat unit capable of efficiently utilizing any weaponry at its disposition, highly resilient to damage and capable of operating in any environment, including the void of space. It can be seen as the spiritual successor of the \cfRed Oni\c- supersoldier program, in a way, as it also serves the same purpose of defending Earth from an overwhelming invading force. The project has been funded and sponsored by many partners of Akari Labs, and is the brainchild of both \cfSaya Miyamoto\c- and \cfArchduke Cytho Valathor\c-, representative of \cfHell\c-'s civilian population.\n"
"\n"
@@ -633,16 +618,18 @@ SWWM_LORETXT_DEMOLITIONIST =
"\n"
"\cfGet back to work, you silly robutt.\c-";
SWWM_LORETXT_DEMOLITIONIST2 =
-"\cxFull Name:\c-\n"
-"\cf Akari Labs First Generation Autonomous Combat Unit\c-\n"
-"\cf Demolitionist (codename)\c-\n"
-"\cf Demo Miyamoto (first unit)\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2148-01-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @demolitionist_bot\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Akari Labs First Generation Autonomous Combat Unit\c-\n"
+" \cf Demolitionist (codename)\c-\n"
+" \cf Demo Miyamoto (first unit)\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2148-01-20\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Pro Hero\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @demolitionist_bot\c-\n"
"\n"
"The \cfDemolitionist\c- is one of the crowning achievements of \cfAkari Labs\c- on the field of robotics. An AI-driven combat unit capable of efficiently utilizing any weaponry at its disposition, highly resilient to damage and capable of operating in any environment, including the void of space. It can be seen as the spiritual successor of the \cfRed Oni\c- supersoldier program, in a way, as it also serves the same purpose of defending Earth from an overwhelming invading force. The project has been funded and sponsored by many partners of Akari Labs, and is the brainchild of both \cfSaya Miyamoto\c- and \cfArchduke Cytho Valathor\c-, representative of \cfHell\c-'s civilian population.\n"
"\n"
@@ -654,7 +641,7 @@ SWWM_LORETXT_DEMOLITIONIST2 =
"\n"
"Of this previously mentioned first unit, there are many details known thanks to a Q&A session that Saya had livestreamed months prior to the deployment. The unit has been acknowledged as being part of the Miyamoto household, having the full name of \cfDemo Miyamoto\c-, and being referred to by Saya as her \"child\". Demo can be described as \"quite chatty\" and fond of joking around to try and put a smile on people's faces, but also very serious and determined in their desire to protect those in need. They are also quite popular within the LGBTQIA+ community due to their fierce support of also protecting the rights of those who face discrimination for their identities, and has even publicly come out themself as non-binary. This didn't really come as a surprise to most due to Saya's own involvements with the collective, however.\n"
"\n"
-"Following their success in fighting off Hell's armies, Saya realized that no other units would ever need to be made, so Demo themself became the \"ultimate weapon\" of Akari Labs, all by their lonesome. Furthermore, they were additionally rewarded with a separate Maidbot frame, which Demo freely makes use of during their free time, and has allowed them to truly express their feelings for Saya, becoming her third partner, together with Maidbot and Ibuki.\n"
+"Following their success in fighting off Hell's armies, Saya realized that no other units would ever need to be made, so Demo themself became the \"ultimate weapon\" of Akari Labs, all by their lonesome. Furthermore, they were additionally rewarded with a separate maidbot frame, which Demo freely makes use of during their free time, and has allowed them to truly express their feelings for Saya, becoming her third partner, together with Meido and Ibuki.\n"
"\n"
"\cxSaya's Notes:\c-\n"
"\cfYou're so cute, Demo-chan. I really outdid myself with that Maidbot body, for sure. It seriously caught me by surprise when, as soon as you swapped over to it, you just... jumped in my arms like that and started kissing me all over and... whew~\c-\n"
@@ -663,16 +650,18 @@ SWWM_LORETXT_DEMOLITIONIST2 =
"\n"
"\cfAnyway, no more reading about yourself while you're working. Go away, silly.\c-";
SWWM_LORETXT_DEMOLITIONIST3 =
-"\cxFull Name:\c-\n"
-"\cf Akari Labs First Generation Autonomous Combat Unit\c-\n"
-"\cf Demolitionist (codename)\c-\n"
-"\cf Demo Miyamoto (first unit)\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2148-01-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @demolitionist_bot\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Akari Labs First Generation Autonomous Combat Unit\c-\n"
+" \cf Demolitionist (codename)\c-\n"
+" \cf Demo Miyamoto (first unit)\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2148-01-20\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Pro Hero\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @demolitionist_bot\c-\n"
"\n"
"The \cfDemolitionist\c- is one of the crowning achievements of \cfAkari Labs\c- on the field of robotics. An AI-driven combat unit capable of efficiently utilizing any weaponry at its disposition, highly resilient to damage and capable of operating in any environment, including the void of space. It can be seen as the spiritual successor of the \cfRed Oni\c- supersoldier program, in a way, as it also serves the same purpose of defending Earth from an overwhelming invading force. The project has been funded and sponsored by many partners of Akari Labs, and is the brainchild of both \cfSaya Miyamoto\c- and \cfArchduke Cytho Valathor\c-, representative of \cfHell\c-'s civilian population.\n"
"\n"
@@ -684,7 +673,7 @@ SWWM_LORETXT_DEMOLITIONIST3 =
"\n"
"Of this previously mentioned first unit, there are many details known thanks to a Q&A session that Saya had livestreamed months prior to the deployment. The unit has been acknowledged as being part of the Miyamoto household, having the full name of \cfDemo Miyamoto\c-, and being referred to by Saya as her \"child\". Demo can be described as \"quite chatty\" and fond of joking around to try and put a smile on people's faces, but also very serious and determined in their desire to protect those in need. They are also quite popular within the LGBTQIA+ community due to their fierce support of also protecting the rights of those who face discrimination for their identities, and has even publicly come out themself as non-binary. This didn't really come as a surprise to most due to Saya's own involvements with the collective, however.\n"
"\n"
-"Following their success in fighting off Hell's armies, Saya realized that no other units would ever need to be made, so Demo themself became the \"ultimate weapon\" of Akari Labs, all by their lonesome. Furthermore, they were additionally rewarded with a separate Maidbot frame, which Demo freely makes use of during their free time, and has allowed them to truly express their feelings for Saya, becoming her third partner, together with Maidbot and Ibuki. Since May of 2171, they are also additionally engaged to \cfKirin Xanai\c-, leader of the \cfSykhai Empire of Akkou\c-.\n"
+"Following their success in fighting off Hell's armies, Saya realized that no other units would ever need to be made, so Demo themself became the \"ultimate weapon\" of Akari Labs, all by their lonesome. Furthermore, they were additionally rewarded with a separate maidbot frame, which Demo freely makes use of during their free time, and has allowed them to truly express their feelings for Saya, becoming her third partner, together with Meido and Ibuki. Since May of 2171, they are also additionally engaged to \cfKirin Xanai\c-, leader of the \cfSykhai Empire of Akkou\c-.\n"
"\n"
"\cxSaya's Notes:\c-\n"
"\cfYou're so cute, Demo-chan. I really outdid myself with that Maidbot body, for sure. It seriously caught me by surprise when, as soon as you swapped over to it, you just... jumped in my arms like that and started kissing me all over and... whew~\c-\n"
@@ -885,6 +874,8 @@ SWWM_LORETXT_DOOMGUY =
"\cf American\c-\n"
"\cxDate of Birth:\c-\n"
"\cf CLASSIFIED\c-\n"
+"\cxOccupation:\c-\n"
+"\cf Marine (UAC)\c-\n"
"\n"
"The \cfDoom Marine\c- is the lone survivor of the demonic invasions on the \cfUAC\c- bases of Phobos and Deimos. Having been transferred to \cfMars City\c- not long before the initial incidents, he was part of the detachment sent to defend the Phobos bases from the invading demons who had somehow hijacked the teleportation systems the UAC was experimenting with. Following this impressive feat of, as a one man army, fighting off the invaders on both Phobos and Deimos, along with taking the fight to \cfHell\c- itself and coming back, he was appointed as the organization's \"problem solver\".\n"
"\n"
@@ -907,6 +898,8 @@ SWWM_LORETXT_DOOMGUY2 =
"\cf American\c-\n"
"\cxDate of Birth:\c-\n"
"\cf CLASSIFIED\c-\n"
+"\cxOccupation:\c-\n"
+"\cf N/A\c-\n"
"\n"
"The \cfDoom Marine\c- is the lone survivor of the demonic invasions on the \cfUAC\c- bases of Phobos and Deimos. Having been transferred to \cfMars City\c- not long before the initial incidents, he was part of the detachment sent to defend the Phobos bases from the invading demons who had somehow hijacked the teleportation systems the UAC was experimenting with. Following this impressive feat of, as a one man army, fighting off the invaders on both Phobos and Deimos, along with taking the fight to \cfHell\c- itself and coming back, he was appointed as the organization's \"problem solver\".\n"
"\n"
@@ -929,6 +922,8 @@ SWWM_LORETXT_DOOMGUY3 =
"\cf American\c-\n"
"\cxDate of Birth:\c-\n"
"\cf CLASSIFIED\c-\n"
+"\cxOccupation:\c-\n"
+"\cf N/A\c-\n"
"\n"
"The \cfDoom Marine\c- is the lone survivor of the demonic invasions on the \cfUAC\c- bases of Phobos and Deimos. Having been transferred to \cfMars City\c- not long before the initial incidents, he was part of the detachment sent to defend the Phobos bases from the invading demons who had somehow hijacked the teleportation systems the UAC was experimenting with. Following this impressive feat of, as a one man army, fighting off the invaders on both Phobos and Deimos, along with taking the fight to \cfHell\c- itself and coming back, he was appointed as the organization's \"problem solver\".\n"
"\n"
@@ -961,14 +956,17 @@ SWWM_LORETAG_ELLEN = "Yanikov, Elena XXI";
SWWM_LORETAB_ELLEN = "People";
SWWM_LOREREL_ELLEN = "Ibuki;Taro;Ashley;Saya;Anarukon;WhiteScar;Hell;Yui;Cytho";
SWWM_LORETXT_ELLEN =
-"\cxFull Name:\c-\n"
-"\cf Elena \"Ellen\" Yanikov XXI\c-\n"
-"\cxNationality:\c-\n"
-"\cf American\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2066-06-06\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @Mischief_XXI\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Elena \"Ellen\" Yanikov XXI\c-\n"
+" \cxNationality:\c-\n"
+" \cf American\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2066-06-06\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Mercenary\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @Mischief_XXI\c-\n"
+"\n"
"\n"
"Born in Boston in 2066, to \cfElena Yanikov XIX\c- and \cfGottfried Steiner\c-, \cfEllen\c- is the younger of two sisters (both of them are named Elena). This oddity of all women in her family sharing the same name can be traced back to \cfElena Yanikov I\c-, born in 1703, who made this decision, out of some superstitious belief that it would \"preserve their immortality forever\". This was not far off from the truth, however, but it had nothing to do with inheritance of names. It has been verified that \cfAnarukon\c- genes are fully preserved across all female descendants, no matter how many generations, especially so for those from the Yanikov lineage.\n"
"\n"
@@ -986,37 +984,6 @@ SWWM_LORETXT_ELLEN =
"\cfOh yeah, speaking of Ellen-san. She's a goddamn massive prankster, like, the most awfully skilled troll you could ever imagine, even. See, there was this one time... actually, I think I'll keep quiet about it, because it was embarrassing as all hell. My ass is still sore from back then. I'm NOT going to explain, fuck no. Use your imagination, Demo-chan.\c-\n"
"\n"
"\cfAh, also, one super good thing about having her around. She's got some interesting connections. Yeah, most people don't know, but her gramps is a demon. Like, actual demon, from Hell and all. Some real cutie too. Name's Cytho Valathor, and he says he's a \"reformed incubus\", whatever that means. Whenever I need to know anything about what's going on in the land of fire 'n brimstone, he's the guy I go to.\c-";
-SWWM_LORETAG_EMPCARBINE = "Rail Carbine";
-SWWM_LORETAB_EMPCARBINE = "Item";
-SWWM_LOREREL_EMPCARBINE = "EngineTech;DecadeMech;UAC;Saya";
-SWWM_LORETXT_EMPCARBINE =
-"\cxDesignation:\c-\n"
-"\cf EMP Rail Carbine\c-\n"
-"\cxManufacturer:\c-\n"
-"\cf Tach-Engine Technology Institute\c-\n"
-"\cxClassification:\c-\n"
-"\cf Directed Energy Weapon\c-\n"
-"\n"
-"The \cfEMP Rail Carbine\c- is \cfTach-Engine\c-'s very first attempt at combining existing human technology with the retrieved experiments from their expedition to the ruined headquarters of \cfDecade Mechanics\c-. Akin to typical particle-beam weaponry, but with a boost of thundering, highly destructive exotic matter, it has been deemed far superior even to the mighty \cfThunder Buster\c- so well-prized by UAC troops.\n"
-"\n"
-"Unexpectedly, the Rail Carbine is a tube fed bolt-action rifle, which employs shielded rods of pure \cfDysedum\c-. Each of these allowing the weapon to discharge guided 20kA pulses towards an ionized target, frying it in an instant, and potentially spreading its deadly effects to others nearby.\n"
-"\n"
-"It should be noted that this weapon is unsafe to use in water, as the discharge will spread violently throughout the entire medium.\n"
-"\n"
-"\cfPrimary Fire:\c- Hold to emit a faint ionizing charge towards the aimed spot. The longer this is held, the more accurate the shot will be. Release to discharge the beam. If the rod has been depleted, cycle the bolt to load a new one.\n"
-"\n"
-"\cfSecondary Fire:\c- Also emits an ionizing charge, but does not discharge on release. Useful if you can't guarantee your target will always be in sight, or if you want to quickly mark several targets.\n"
-"\n"
-"\cfZoom:\c- Adjustable sight up to 8x.\n"
-"\n"
-"\cfReloading:\c- More rods can be fed into the weapon as needed, up to a maximum of three.\n"
-"\n"
-"\cfTechniques:\c- By ionizing several targets you can guarantee that the beam will branch out into lesser arcs and strike them all, though the damage potential will be divided among them.\n"
-"\n"
-"\cxSaya's Notes:\c-\n"
-"\cfYou know, anything that dabs on the UAC with its mere existence is good in my book.\c-\n"
-"\n"
-"\cfThis thing, though, also gets bonus points for its sheer pants-shittingly intense potential to deep fry sons of bitches. Seriously, it's like actual fucking lightning shooting out of this.\c-";
SWWM_LORETAG_ENGINETECH = "Tach-Engine";
SWWM_LORETAB_ENGINETECH = "People";
SWWM_LOREREL_ENGINETECH = "UAC;Nukuri;DecadeMech;Saya;Nekuratek;WhiteScar";
@@ -1133,30 +1100,6 @@ SWWM_LORETXT_FABRICATOR =
"\cfOh, you've got to be fucking kidding me. Now nerdboy's just straight up giving us bullshit gacha nonsense, with tiers and all.\c-\n"
"\n"
"\cfI swear, he's doing this shit on purpose to piss me off or something.\c-";
-SWWM_LORETAG_FISTGUN = "Hand of Divine";
-SWWM_LORETAB_FISTGUN = "Item";
-SWWM_LOREREL_FISTGUN = "Unissix;Gods;Zanaveth3;Saya";
-SWWM_LORETXT_FISTGUN =
-"\cxDesignation:\c-\n"
-"\cf Hand of Divine\c-\n"
-"\cxManufacturer:\c-\n"
-"\cf Korovithuhcp (original)\c-\n"
-"\cf Unissix Crafts (replica)\c-\n"
-"\cxDesignation:\c-\n"
-"\cf Magic Gauntlet\c-\n"
-"\n"
-"The \cfHand of Divine\c- was a weapon that the god \cfKorovithuhcp\c- constructed countless millenia ago, and had been passed down among many heroes of legend. Eventually it was lost, and the god had no interest in building a new one. This, obviously, did not stop \cfMisa Unissix\c- from attempting to do exactly just that. Following historical records of its use, she built her own version through a blend of arcane magic and modern technology. She gifted one to her daughter, \cfZanaveth Nekuraku III\c-, and another to the \cfDemolitionist\c-.\n"
-"\n"
-"\cfPrimary Fire:\c- Charges up a punch, and then releases it. The gauntlet will fling itself forward and then return to you.\n"
-"\n"
-"\cfSecondary Fire:\c- Charges up a wide arc slap. On release this will very loudly and violently whack all targets in front of you.\n"
-"\n"
-"\cfTechniques:\c- Due to its nature, the Hand of Divine is susceptible to the effects of a \cfRagekit\c-, increasing its strength and range.\n"
-"\n"
-"\cxSaya's Notes:\c-\n"
-"\cfMan that sure was a special delivery from Zana-chan. And when we showed that it was good, and fun, Misa-Misa got all excited and started mass-producing them. She's just too adorable, I swear.\c-\n"
-"\n"
-"\cfAnyway, those fiends are gonna get knocked the fuck out with this thing. Can't wait to see it in action on real targets. Especially after... that incident with the punching bag.\c-";
SWWM_LORETAG_FORX = "Forx Aeronautics";
SWWM_LORETAB_FORX = "People";
SWWM_LOREREL_FORX = "Propulsor;Saya;UAC";
@@ -1421,39 +1364,6 @@ SWWM_LORETXT_GODS2 =
"\cfYou know, some people ask me how I'm still agnostic. I doubt they really know what agnosticism even is.\c-\n"
"\n"
"\cfUpdate: The stuff about the admins is in another article. That really was fucking wild, I swear. There's no way in hell I'll ever forget about what happened the day after our wedding with Kirin-kun, holy fuck...\c-";
-SWWM_LORETAG_GRANDLANCE = "Grand Lance";
-SWWM_LORETAB_GRANDLANCE = "Item";
-SWWM_LOREREL_GRANDLANCE = "Kmonn;Xekke;Saya;Unissix";
-SWWM_LORETXT_GRANDLANCE =
-"\cxDesignation:\c-\n"
-"\cf Suvan-Kin (\"Grand Lance\")\c-\n"
-"\cxManufacturer:\c-\n"
-"\cf Eushura Kmonn Jr.\c-\n"
-"\cxClassification:\c-\n"
-"\cf Portable Rail Gun\c-\n"
-"\n"
-"Devised as the \"last word\" in weaponry, the \cfSuvan-Kin\c- (\"Grand Lance\" in the \cfXekkas\c- language) is the world's first truly portable rail gun, capable of launching projectiles at speeds of up to 7500km/h (or 14000km/h at full charge). The weapon is powered entirely by a compact quad-cell Korberon-Eneiebium battery pack, easy to replace when needed. The ammunition employed are high-resonant Almasteel spears, capable of piercing cleanly through anything, without even as much as a single dent.\n"
-"\n"
-"If the piercing potential of these spears isn't destructive enough, a miniature pure-fusion bomb embedded at the head will surely add up even more to that. In the words of the \cfXekkian\c- people: \cf\"The blinding flames of a sacrificed newborn star shall tear asunder all life, rend the soul from its body, and leave no trace whatsoever of those unfortunate to have wronged the wielder of the Grand Lance.\"\c-\n"
-"\n"
-"\cfPrimary Fire:\c- Single-target firing. The spear will automatically detonate on contact with anything. The area of effect is rather massive, so keep your distance. Due to the resilience of the material used, the spear will not be destroyed, and may potentially ricochet and hit something else.\n"
-"\n"
-"\cfSecondary Fire:\c- Multi-target firing. The spear is shot at a much higher velocity, and will penetrate multiple targets until finally stopping at something sufficiently solid.\n"
-"\n"
-"\cfPrimary Reload:\c- Reload the weapon.\n"
-"\n"
-"\cfSecondary Reload:\c- Swaps the battery. This action can only be performed once the charge is low enough, as it would be wasteful otherwise.\n"
-"\n"
-"\cfTechniques:\c- The longer you hold secondary fire, the stronger and faster the shot will be. At full charge it may even breach walls.\n"
-"\n"
-"\cfWarning:\c- Before firing, the rails must extend to their full length. If there are any obstacles in the way that can't be cleared, operation of the weapon is cancelled.\n"
-"\n"
-"\cxSaya's Notes:\c-\n"
-"\cfExcuse me, WHAT THE FUCK IS THIS???\c-\n"
-"\n"
-"\cfIs this a motherfucking rail gun? Like, the real deal? And it's actually portable?? AND IT SHOOTS MOTHERFUCKING SPEARS WITH MOTHERFUCKING FUSION BOMBS IN THEM??? OK, forget what I said about that other bigass gun from Kmonn, THIS SHIT is actually even more fucking ridiculous, like, what in the actual name of fuck???\c-\n"
-"\n"
-"\cfYeah, so that's why it's placed on the same slot as the Ynykron. Think of it as a \"safer\" alternative, basically. It's not world-ending, but it's still way too fucking strong.\c-";
SWWM_LORETAG_GRAVITYSUPPRESSOR = "Gravity Suppressor";
SWWM_LORETAB_GRAVITYSUPPRESSOR = "Item";
SWWM_LOREREL_GRAVITYSUPPRESSOR = "Cyrus;Saya";
@@ -1708,16 +1618,18 @@ SWWM_LORETAG_IBUKI = "Miyamoto, Ibuki";
SWWM_LORETAB_IBUKI = "People";
SWWM_LOREREL_IBUKI = "AkariLabs;WhiteScar;Taro;Saya";
SWWM_LORETXT_IBUKI =
-"\cxFull Name:\c-\n"
-"\cf Ibuki Miyamoto\c-\n"
-"\cf Red Oni (codename)\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2074-09-09\c-\n"
-"\cxTwitter\c-\n"
-"\cf @lewd_ibuki (main)\c-\n"
-"\cf @ibuki_tiddy (photosets)\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Ibuki Miyamoto\c-\n"
+" \cf Red Oni (codename)\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2074-09-09\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Mercenary, Nude Model, Vlogger\c-\n"
+" \cxTwitter\c-\n"
+" \cf @lewd_ibuki (main)\c-\n"
+" \cf @ibuki_tiddy (photosets)\c-\n"
"\n"
"\cfIbuki\c- is the result of the \cfRed Oni\c- supersoldier program, devised by \cfSaya Miyamoto\c- of \cfAkari Labs\c-. The existence of this project was kept completely secret until her public reveal in June of 2077. There was much controversy surrounding the Red Oni program, including Saya's personal involvement in it, having accepted a 40 billion USD payment in exchange for it (which was found to be related to Texas having been sold back to Mexico many weeks before). Despite her clear potential and outstanding combat abilities, she was deployed too late, as only moments later, the \cfWhite Scar\c- happened, and with it, the complete devastation of the \cfUnited States\c-.\n"
"\n"
@@ -1776,6 +1688,8 @@ SWWM_LORETXT_IMANAKIT =
"\cf Undetermined\c-\n"
"\cxDate of Birth:\c-\n"
"\cf Undetermined\c-\n"
+"\cxOccupation:\c-\n"
+"\cf CEO (Imanaki Corp)\c-\n"
"\n"
"The founder and CEO of \cfImanaki Corp\c-, and also last surviving member of the Imanaki family following the \cfOnoke Mansion Murders\c- of 2003. \cfTetsuya\c- had always been a very secretive individual, so nothing is really known of his personal life or history, nor even his appearance.\n"
"\n"
@@ -1903,16 +1817,18 @@ SWWM_LORETAG_KIRIN = "Xanai, Kirin";
SWWM_LORETAB_KIRIN = "People";
SWWM_LOREREL_KIRIN = "Anarukon;Novoskhana;Saya;GhoulHunt";
SWWM_LORETXT_KIRIN =
-"\cxFull Name:\c-\n"
-"\cf Kirin Xanai\c-\n"
-"\cxTitle:\c-\n"
-"\cf Child Emperor of the Sykhai Empire of Akkou\c-\n"
-"\cxNationality:\c-\n"
-"\cf Akkouxhei\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2080-04-13\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @kiririn_xanai\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Kirin Xanai\c-\n"
+" \cxTitle:\c-\n"
+" \cf Child Emperor of the Sykhai Empire of Akkou\c-\n"
+" \cxNationality:\c-\n"
+" \cf Akkouxhei\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2080-04-13\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Communal Advisor (Sykhai Empire)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @kiririn_xanai\c-\n"
"\n"
"Born in 2080 to \cfSyrakha Yanikov\c- and \cfAzya Xanai\c-, \cfKirin\c- became the emperor of \cfAkkou\c- at the young age of 12, having shown great interest in following the steps of his mother.\n"
"\n"
@@ -2005,12 +1921,17 @@ SWWM_LORETAG_KMONN = "Kmonn, Eushura Jr.";
SWWM_LORETAB_KMONN = "People";
SWWM_LOREREL_KMONN = "XAnimen;EngineTech;Gods;Xekke";
SWWM_LORETXT_KMONN =
-"\cxFull Name:\c-\n"
-"\cf Eushura Kmonn Jr.\c-\n"
-"\cxNationality:\c-\n"
-"\cf Xekkian\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 8731 BC\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Eushura Kmonn Jr.\c-\n"
+" \cxNationality:\c-\n"
+" \cf Xekkian\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 8731 BC\c-\n"
+" \cxOccupation:\c-\n"
+" \cf CTO (Kmonn Shuna)\c-\n"
+" \cf Advisor (Tach-Engine Technology Institute)\c-\n"
+"\n"
+"\n"
"\n"
"\cfEushura Kmonn Jr.\c-, son of \cfEushura Kmonn Sr.\c-, is a skilled inventor from the \cfKingdom of Xekke\c-, in the planet of \cfIxxeney\c-. From a young age he was raised to achieve the same grand goals as his father, and it wasn't long until he managed to earn his own fame after years of working under him as an assistant. His creativity and imagination knew no bounds, and he's been credited with a grand total of 279 major achievements in the fields of both offensive and defensive military technology, which has helped strengthen the kingdom's forces, making them one of the most trusted and requested across the \cfX'Animen Coalition\c- for allied defense tasks.\n"
"\n"
@@ -2045,12 +1966,17 @@ SWWM_LORETAG_LOCKE = "Dr. Locke";
SWWM_LORETAB_LOCKE = "People";
SWWM_LOREREL_LOCKE = "Kereshnovka;Saya";
SWWM_LORETXT_LOCKE =
-"\cxFull Name:\c-\n"
-"\cf Janus Locke Hoodth\c-\n"
-"\cxNationality:\c-\n"
-"\cf Qurensniv\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1980-07-30\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Janus Locke Hoodth\c-\n"
+" \cxNationality:\c-\n"
+" \cf Qurensniv\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1980-07-30\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Inventor\c-\n"
+"\n"
+"\n"
+"\n"
"\n"
"\cfJanus Locke\c- is the younger brother of the late \cfDr. Häzel Hoodth\c- known by many as the \cfMad Doctor of Kereshnovka\c-. After hearing the news of Häzel's death in 1987 (specifically, receiving them 10 years after the fact, while he was studying abroad), in an oil rig explosion near the town while he was performing an experiment to \"obtain the essence of immortality\", Locke changed entirely. He decided to continue his brother's work, while at the same time still maintaining his current job as a toy maker. However, the madness into which he fell would extend even to that, with the various products that would come out under his brand of \cfDr. Locke's Wonderful Toys\c- becoming increasingly dangerous, or even outright lethal.\n"
"\n"
@@ -2126,31 +2052,33 @@ SWWM_LORETXT_LUNA =
"\cfAnyway, life was good back then, with all those Nukuri cuties hanging out with us. You could see so many of them in the street, and well, that was also when I met Zana-sama too, best goddamn Christmas gift of my life, heh. Really REALLY miss those days, you know, pretty much hanging out with her every weekend or so. Nowadays, life just plain sucks, and I can only ever get the chance to like, send and get messages super-rarely by passing them through the Lunar Embassy (when those stupid-ass rabbits actually do their jobs).\c-\n"
"\n"
"\cfI really wish things would go back to how they used to be. I mean, sure, since our country didn't sign the bullshit White Scar treaty we can still use their tech, but they can't come here themselves, nor are we allowed to go there either. Fuck all that shit.\c-";
-SWWM_LORETAG_MAIDBOT = "Miyamoto, Maidbot";
+SWWM_LORETAG_MAIDBOT = "Miyamoto, Meido";
SWWM_LORETAB_MAIDBOT = "People";
SWWM_LOREREL_MAIDBOT = "Saya;Ibuki;Luna;Nukuri;Zanaveth2;Nekuratek;AkariLabs;Kirin";
SWWM_LORETXT_MAIDBOT =
-"\cxFull Name:\c-\n"
-"\cf Maidbot \"Meido\" Miyamoto\c-\n"
-"\cf Meidobot (artistic name)\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2017-07-07\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @meidobot\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Meido Miyamoto\c-\n"
+" \cf Meidobot (artistic name)\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2017-07-07\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Idol\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @meidobot\c-\n"
"\n"
-"As \cfSaya Miyamoto\c-'s very first AI project, \cfMaidbot\c- was initially rather rough around the edges, mainly serving as a cleaner robot with rather limited intelligence, mostly capable of taking simple orders. Over time, Saya would expand on her abilities, allowing for more complex interactivity, but still too limited. Saya had always felt that despite all her efforts, despite how close Maidbot gradually got to be more \"life-like\", it was never enough. In the end, she was \"still a machine\".\n"
+"As \cfSaya Miyamoto\c-'s very first AI project, \cfMeido\c- was initially rather rough around the edges, mainly serving as a cleaner robot with rather limited intelligence, mostly capable of taking simple orders. Over time, Saya would expand on her abilities, allowing for more complex interactivity, but still too limited. Saya had always felt that despite all her efforts, despite how close Meido gradually got to be more \"life-like\", it was never enough. In the end, she was \"still a machine\".\n"
"\n"
-"Of note was Saya's attempt to get her into singing, something which was an unexpected success, actually. After her initial debut, more and more artists would compose songs for Maidbot to perform. By 2020, Maidbot had become a full-fledged \"Artificial Idol\", famous enough to take part in the Tokyo Olympics, singing the national anthem.\n"
+"Of note was Saya's attempt to get her into singing, something which was an unexpected success, actually. After her initial debut, more and more artists would compose songs for Meido to perform. By 2020, Meido had become a full-fledged \"Artificial Idol\", famous enough to take part in the Tokyo Olympics, singing the national anthem.\n"
"\n"
-"Following the \cfLuna Event\c- of 2021, Saya received the visit of \cfZanaveth Nekuraku II\c-, head of AI research at \cfNekuratek\c-, the largest \cfNukuri\c- tech conglomerate. Curious about human culture, she decided to meet her, as they had quite similar interests. Zanaveth was quite impressed by all \cfAkari Labs\c- had achieved, and showed special interest in Maidbot, too.\n"
+"Following the \cfLuna Event\c- of 2021, Saya received the visit of \cfZanaveth Nekuraku II\c-, head of AI research at \cfNekuratek\c-, the largest \cfNukuri\c- tech conglomerate. Curious about human culture, she decided to meet her, as they had quite similar interests. Zanaveth was quite impressed by all \cfAkari Labs\c- had achieved, and showed special interest in Meido, too.\n"
"\n"
-"Having quickly befriended Saya at this point, she offered to enhance Maidbot's AI with the more advanced technology her people had: The \cfNekuronbot AI Framework\c-. Having accepted this offer, Maidbot was \"reborn\" from her previous, limited form. She was now fully capable of individual thought, free will, and most importantly, emotion.\n"
+"Having quickly befriended Saya at this point, she offered to enhance Meido's AI with the more advanced technology her people had: The \cfNekuronbot AI Framework\c-. Having accepted this offer, Meido was \"reborn\" from her previous, limited form. She was now fully capable of individual thought, free will, and most importantly, emotion.\n"
"\n"
-"It was not surprising that Saya had always felt something towards her, while still being fully aware of the impossibility of her being able to love her back, but now, everything had changed. Maidbot knew, and confessed that in her new form, she could \"feel something\" too. Over time, she came to better understand these feelings, and would become Saya's first girlfriend.\n"
+"It was not surprising that Saya had always felt something towards her, while still being fully aware of the impossibility of her being able to love her back, but now, everything had changed. Meido knew, and confessed that in her new form, she could \"feel something\" too. Over time, she came to better understand these feelings, and would become Saya's first girlfriend.\n"
"\n"
-"After these events, Maidbot became a full member of the family, adopting the Miyamoto name. Much later, and with Zanaveth's assistance, Saya would begin the creation of more maidbots, wishing for the whole world to be able to have a Maidbot of their own. An adoption service was set up in 2023, where maidbots, who'd be raised and prepared at Akari Labs, would hold interviews with potential adopters, allowing them to have the final choice on who to live with. This service was entirely free, as the company already had more than enough funds coming from their other services, which increased their popularity even more. Everyone wished to have their own Maidbot, and the Maidbots themselves were more than happy to live with their new families.\n"
+"After these events, Meido became a full member of the family, adopting the Miyamoto name. Much later, and with Zanaveth's assistance, Saya would begin the creation of more Maidbots, wishing for the whole world to be able to \"have a Meido of their own\". An adoption service was set up in 2023, where Maidbots, who'd be raised and prepared at Akari Labs, would hold interviews with potential adopters, allowing them to have the final choice on who to live with. This service was entirely free, as the company already had more than enough funds coming from their other services, which increased their popularity even more. Everyone wished to have their own Maidbot, and the Maidbots themselves were more than happy to live with their new families.\n"
"\n"
"\cxSaya's Notes:\c-\n"
"\cfMeido-chan is so sweet~ And her voice is so nice~\c-\n"
@@ -2161,27 +2089,29 @@ SWWM_LORETXT_MAIDBOT =
"\n"
"\cfHehe... I'm really quite proud of making her \"fully featured\", by the way... Best decision of my life. Let me tell you, when we do \"things\" together... it feels like heaven~\c- \cg♥\c-";
SWWM_LORETXT_MAIDBOT2 =
-"\cxFull Name:\c-\n"
-"\cf Maidbot \"Meido\" Miyamoto\c-\n"
-"\cf Meidobot (artistic name)\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2017-07-07\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @meidobot\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Meido Miyamoto\c-\n"
+" \cf Meidobot (artistic name)\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2017-07-07\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Idol\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @meidobot\c-\n"
"\n"
-"As \cfSaya Miyamoto\c-'s very first AI project, \cfMaidbot\c- was initially rather rough around the edges, mainly serving as a cleaner robot with rather limited intelligence, mostly capable of taking simple orders. Over time, Saya would expand on her abilities, allowing for more complex interactivity, but still too limited. Saya had always felt that despite all her efforts, despite how close Maidbot gradually got to be more \"life-like\", it was never enough. In the end, she was \"still a machine\".\n"
+"As \cfSaya Miyamoto\c-'s very first AI project, \cfMeido\c- was initially rather rough around the edges, mainly serving as a cleaner robot with rather limited intelligence, mostly capable of taking simple orders. Over time, Saya would expand on her abilities, allowing for more complex interactivity, but still too limited. Saya had always felt that despite all her efforts, despite how close Meido gradually got to be more \"life-like\", it was never enough. In the end, she was \"still a machine\".\n"
"\n"
-"Of note was Saya's attempt to get her into singing, something which was an unexpected success, actually. After her initial debut, more and more artists would compose songs for Maidbot to perform. By 2020, Maidbot had become a full-fledged \"Artificial Idol\", famous enough to take part in the Tokyo Olympics, singing the national anthem.\n"
+"Of note was Saya's attempt to get her into singing, something which was an unexpected success, actually. After her initial debut, more and more artists would compose songs for Meido to perform. By 2020, Meido had become a full-fledged \"Artificial Idol\", famous enough to take part in the Tokyo Olympics, singing the national anthem.\n"
"\n"
-"Following the \cfLuna Event\c- of 2021, Saya received the visit of \cfZanaveth Nekuraku II\c-, head of AI research at \cfNekuratek\c-, the largest \cfNukuri\c- tech conglomerate. Curious about human culture, she decided to meet her, as they had quite similar interests. Zanaveth was quite impressed by all \cfAkari Labs\c- had achieved, and showed special interest in Maidbot, too.\n"
+"Following the \cfLuna Event\c- of 2021, Saya received the visit of \cfZanaveth Nekuraku II\c-, head of AI research at \cfNekuratek\c-, the largest \cfNukuri\c- tech conglomerate. Curious about human culture, she decided to meet her, as they had quite similar interests. Zanaveth was quite impressed by all \cfAkari Labs\c- had achieved, and showed special interest in Meido, too.\n"
"\n"
-"Having quickly befriended Saya at this point, she offered to enhance Maidbot's AI with the more advanced technology her people had: The \cfNekuronbot AI Framework\c-. Having accepted this offer, Maidbot was \"reborn\" from her previous, limited form. She was now fully capable of individual thought, free will, and most importantly, emotion.\n"
+"Having quickly befriended Saya at this point, she offered to enhance Meido's AI with the more advanced technology her people had: The \cfNekuronbot AI Framework\c-. Having accepted this offer, Meido was \"reborn\" from her previous, limited form. She was now fully capable of individual thought, free will, and most importantly, emotion.\n"
"\n"
-"It was not surprising that Saya had always felt something towards her, while still being fully aware of the impossibility of her being able to love her back, but now, everything had changed. Maidbot knew, and confessed that in her new form, she could \"feel something\" too. Over time, she came to better understand these feelings, and would become Saya's first girlfriend.\n"
+"It was not surprising that Saya had always felt something towards her, while still being fully aware of the impossibility of her being able to love her back, but now, everything had changed. Meido knew, and confessed that in her new form, she could \"feel something\" too. Over time, she came to better understand these feelings, and would become Saya's first girlfriend.\n"
"\n"
-"After these events, Maidbot became a full member of the family, adopting the Miyamoto name. Much later, and with Zanaveth's assistance, Saya would begin the creation of more maidbots, wishing for the whole world to be able to have a Maidbot of their own. An adoption service was set up in 2023, where maidbots, who'd be raised and prepared at Akari Labs, would hold interviews with potential adopters, allowing them to have the final choice on who to live with. This service was entirely free, as the company already had more than enough funds coming from their other services, which increased their popularity even more. Everyone wished to have their own Maidbot, and the Maidbots themselves were more than happy to live with their new families.\n"
+"After these events, Meido became a full member of the family, adopting the Miyamoto name. Much later, and with Zanaveth's assistance, Saya would begin the creation of more Maidbots, wishing for the whole world to be able to \"have a Meido of their own\". An adoption service was set up in 2023, where Maidbots, who'd be raised and prepared at Akari Labs, would hold interviews with potential adopters, allowing them to have the final choice on who to live with. This service was entirely free, as the company already had more than enough funds coming from their other services, which increased their popularity even more. Everyone wished to have their own Maidbot, and the Maidbots themselves were more than happy to live with their new families.\n"
"\n"
"In May of 2171, together with Saya and her other partners, she married \cfEmperor Kirin Xanai\c-, of the \cfSykhai Empire\c-, and thanks to him, her passion for singing returned once again.\n"
"\n"
@@ -2268,7 +2198,9 @@ SWWM_LORETXT_MIXOM =
"\cxSaya's Notes:\c-\n"
"\cfMoney and power, absolute dominance, bullshit capitalism. Disgusting... I hope they all explode.\c-\n"
"\n"
-"\cfYou can't take two steps without coming across something made by them, they are FUCKING EVERYWHERE. Like, for example, all the screws in your body? Mixom branded. The liquid cooling? Also Mixom... I could keep going, but it makes me feel gross saying their name so often.\c-";
+"\cfExcept the CEO, she's the only sane person in there but they throw her under the bus whenever she tries to change things. I do commend her for the effort, but this is clearly a losing battle. She should quit already and come here.\c-\n"
+"\n"
+"\cfBy the way, you can't take two steps without coming across something made by them, they are FUCKING EVERYWHERE. Like, for example, all the screws in your body? Mixom branded. The liquid cooling? Also Mixom... I could keep going, but it makes me feel gross saying their name so often.\c-";
SWWM_LORETAG_MODERNSPARKSTER = "Sparkster Rifle";
SWWM_LORETAB_MODERNSPARKSTER = "Item";
SWWM_LOREREL_MODERNSPARKSTER = "EngineTech;Nekuratek;DecadeMech;Saya;WhiteScar";
@@ -2393,12 +2325,17 @@ SWWM_LORETAG_NANA = "Miyamoto, Nana";
SWWM_LORETAB_NANA = "People";
SWWM_LOREREL_NANA = "Ryuji;Saya;Gensokyo;Yui;Taro;Kirin";
SWWM_LORETXT_NANA =
-"\cxFull Name:\c-\n"
-"\cf Nana Miyamoto\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1907-07-07\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Nana Miyamoto\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1907-07-07\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Housemaker\c-\n"
+"\n"
+"\n"
+"\n"
"\n"
"\cfNana\c- is the sole daughter of \cfKaguya Houraisan\c-, the exiled \cfLunarian\c- princess who made \cfGensokyo\c- her home. Having been raised and homeschooled entirely within \cfEientei\c- she did not know much of the outside world, and would have spent the rest of her immortal life there, had it not been for a chance encounter with \cfRyuji Miyamoto\c- in the 60's. Having fled the \cfHuman Village\c-, he came across Nana. The two became close friends, and the young boy made a promise to marry her when he grew up, and take her outside, so she could \"see the world\". This would happen in 1973, with the two leaving Gensokyo to form a family of their own.\n"
"\n"
@@ -2409,12 +2346,17 @@ SWWM_LORETXT_NANA =
"\cxSaya's Notes:\c-\n"
"\cfThe bestest mom in the world, not gonna lie. She may be strict at times, or get mad at me for staying up late (if she actually finds out, heh), but she really is the best. You haven't actually met her yet, Demo-chan, but I bet she'd really like you. I assure you she's real nice despite how scary she may look sometimes. She totally is not like Kaguya obaa-san, who I swear always has that aura about her that's like... no wonder guys are scared of her, always in constant fear of being CBT'd at any moment.\c-";
SWWM_LORETXT_NANA2 =
-"\cxFull Name:\c-\n"
-"\cf Nana Miyamoto\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1907-07-07\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Nana Miyamoto\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1907-07-07\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Housemaker\c-\n"
+"\n"
+"\n"
+"\n"
"\n"
"\cfNana\c- is the sole daughter of \cfKaguya Houraisan\c-, the exiled \cfLunarian\c- princess who made \cfGensokyo\c- her home. Having been raised and homeschooled entirely within \cfEientei\c- she did not know much of the outside world, and would have spent the rest of her immortal life there, had it not been for a chance encounter with \cfRyuji Miyamoto\c- in the 60's. Having fled the \cfHuman Village\c-, he came across Nana. The two became close friends, and the young boy made a promise to marry her when he grew up, and take her outside, so she could \"see the world\". This would happen in 1973, with the two leaving Gensokyo to form a family of their own.\n"
"\n"
@@ -2427,12 +2369,17 @@ SWWM_LORETXT_NANA2 =
"\n"
"\cfBy the way I did notice it, you know, when she hugged you, yes. She hasn't really tried to see other guys after dad was gone... But I think that maybe... she likes you kind of in a different way, y'know...\c-";
SWWM_LORETXT_NANA3 =
-"\cxFull Name:\c-\n"
-"\cf Nana Miyamoto\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1907-07-07\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Nana Miyamoto\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1907-07-07\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Housemaker\c-\n"
+"\n"
+"\n"
+"\n"
"\n"
"\cfNana\c- is the sole daughter of \cfKaguya Houraisan\c-, the exiled \cfLunarian\c- princess who made \cfGensokyo\c- her home. Having been raised and homeschooled entirely within \cfEientei\c- she did not know much of the outside world, and would have spent the rest of her immortal life there, had it not been for a chance encounter with \cfRyuji Miyamoto\c- in the 60's. Having fled the \cfHuman Village\c-, he came across Nana. The two became close friends, and the young boy made a promise to marry her when he grew up, and take her outside, so she could \"see the world\". This would happen in 1973, with the two leaving Gensokyo to form a family of their own.\n"
"\n"
@@ -2836,9 +2783,9 @@ SWWM_LORETXT_PUNTZERGAMMA =
"\n"
"The \cfPuntzer Gamma\c- is a mostly compact bullpup submachine gun featuring a horizontal mag loading system akin to 21st century classics like the \cfBreakerTek P90\c-. The weapon is additionally capable of delivering \"Fuller Auto\" ultra-rapid fire, as seen in many other automatic weapons of Blackmann Arms manufacture.\n"
"\n"
-"\cfPrimary Fire:\c- Shoots the weapon.\n"
+"\cfPrimary Fire:\c- Full auto shooting.\n"
"\n"
-"\cfSecondary Fire:\c- Cycles fire modes, between single shot, 3-round burst, full auto and fuller auto.\n"
+"\cfSecondary Fire:\c- \"Fuller auto\" unloading.\n"
"\n"
"\cfReloading:\c- Reloads, as expected. Your \cfHammerspace™ Container\c-'s autoloaders will provide you with a fresh mag every time.\n"
"\n"
@@ -2938,7 +2885,7 @@ SWWM_LORETXT_RAFANKOS =
"\cxSaya's Notes:\c-\n"
"\cf\"Ultimate Weapon\"? Talk about pretentious... But you know, something about this was making my brains itch, and then it clicked. This is basically like that one spellcard, the Master Spark. Hell, it almost even sounds and looks the same...\c-\n"
"\n"
-"\cfThat's fucking cool, actually. I like it, so I put it in the same slot as the other two massive fuckoff guns.\c-";
+"\cfThat's fucking cool, actually. I like it, so I put it in the same slot as the other massive fuckoff gun. You know, as a safer alternative that you're less likely to kill yourself with. Gotta admit, Misa-Misa sure loaded us up with some powerful material bringing these two along.\c-";
SWWM_LORETAG_RAGEKIT = "Ragekit";
SWWM_LORETAB_RAGEKIT = "Item";
SWWM_LOREREL_RAGEKIT = "AkariLabs;Demolitionist;Saya;DecadeMech";
@@ -3012,7 +2959,7 @@ SWWM_LORETXT_RAYKHOM =
"\n"
"\cfSo by Xekkian standards this is a \"light weapon\", really now??? It's a good thing that your hands can somehow adapt to the grip of this thing, because holy fucking hell...\c-\n"
"\n"
-"\cfThis shit is like, where do I start. It's some serious fucking ass destroyer, that's what. Out of all the stuff in your arsenal, I'd say this is the second strongest weapon we've got. Misa actually delivered it herself way back when, and then we had a talk with the old man from Tach-Engine to have it available for purchase, since he does have that deal going with Kmonn and all (I'm pretty sure what those two have is more than just a business partnership, if you know what I mean).\c-\n"
+"\cfThis shit is like, where do I start. It's some serious fucking ass destroyer, that's what. Out of all the stuff in your arsenal, I'd say this is the third largest weapon we've got. Misa actually delivered it herself way back when, and then we had a talk with the old man from Tach-Engine to have it available for purchase, since he does have that deal going with Kmonn and all (I'm pretty sure what those two have is more than just a business partnership, if you know what I mean).\c-\n"
"\n"
"\cfWhen she came through the door lugging that thing around on her shoulders I knew it had to be ours.\c-";
SWWM_LORETAG_REFRESHER = "Refresher";
@@ -3038,14 +2985,17 @@ SWWM_LORETAG_RYUJI = "Miyamoto, Ryuji";
SWWM_LORETAB_RYUJI = "People";
SWWM_LOREREL_RYUJI = "Nana;Taro;Saya;Yui;AkariLabs;Gensokyo";
SWWM_LORETXT_RYUJI =
-"\cxFull Name:\c-\n"
-"\cf Ryuji Miyamoto\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1956-03-12\c-\n"
-"\cxDate of Death:\c-\n"
-"\cf 2054-06-22\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Ryuji Miyamoto\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1956-03-12\c-\n"
+" \cxDate of Death:\c-\n"
+" \cf 2054-06-22\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Inventor\c-\n"
+"\n"
"\n"
"\cfRyuji\c- was born in \cfGensokyo\c- in 1956, spending most of his life within the \cfHuman Village\c-, the only one settlement within the region inhabited entirely by humans, rather than Youkai. During his early teens, he became quite rebellious, desiring to leave the village and have \"adventures\". One day, he fled, and got himself lost in the bamboo forest surrounding \cfEientei\c-. There, he came across \cfNana\c-, the daughter of \cfKaguya Houraisan\c-, and the two became friends. After guiding him back to the village, Ryuji promised her that he'd return one day, to marry her, and take her with him to see the outside world.\n"
"\n"
@@ -3149,14 +3099,17 @@ SWWM_LORETAG_SAYA = "Miyamoto, Saya";
SWWM_LORETAB_SAYA = "People";
SWWM_LOREREL_SAYA = "Nana;Ryuji;Taro;Yui;Maidbot;Demolitionist;Kirin;AkariLabs;Ashley;UAC";
SWWM_LORETXT_SAYA =
-"\cxFull Name:\c-\n"
-"\cf Saya Miyamoto\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1993-03-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @AkariSaya\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Saya Miyamoto\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1993-03-20\c-\n"
+" \cxOccupation:\c-\n"
+" \cf CTO, Human Resources (Akari Labs)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @AkariSaya\c-\n"
+"\n"
"\n"
"\cfSaya Miyamoto\c- was born in 1993 as the middle child of \cfNana Miyamoto\c- and \cfRyuji Miyamoto\c-, her older brother being \cfTaro Miyamoto\c-, born in 1985, and her younger sister being \cfYui Miyamoto\c-, born in 2009. As a child, Saya already showed interest in science and technology, proudly looking up to her father and his inventions. She excelled greatly in school, having even been described as a \"child prodigy\". At the surprisingly early age of 13, having proven her outstanding abilities, she got herself into \cfMIT\c-, where she graduated in \cfComputer Science\c-.\n"
"\n"
@@ -3168,9 +3121,9 @@ SWWM_LORETXT_SAYA =
"\n"
"Saya is also known for being exaggeratedly flirty around attractive women, something which has resulted in many misunderstandings and awkward moments. She proudly states that she's \"always horny on main\", and never lets any chance to flirt with someone slip past her. She however remarks that this open flirting is \"just a friendly thing, between friends\".\n"
"\n"
-"Saya has many hobbies, including programming (her language of choice being \cfHaskell\c-), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called \cfMy Maid Is A Sex Robot\c-, partially based around her experiences with dating \cfMaidbot Miyamoto\c-. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, \cfThe Akari Project\c-, a story about teleportation experiments and interdimensional travel \"that doesn't go to shit like all the others\". Following the disaster on the \cfUAC\c- bases in regards to teleportation, she announced that she wished to make the Akari Project real, \"just to fuck those idiots over\".\n"
+"Saya has many hobbies, including programming (her language of choice being \cfHaskell\c-), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called \cfMy Maid Is A Sex Robot\c-, partially based around her experiences with dating \cfMeido Miyamoto\c-. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, \cfThe Akari Project\c-, a story about teleportation experiments and interdimensional travel \"that doesn't go to shit like all the others\". Following the disaster on the \cfUAC\c- bases in regards to teleportation, she announced that she wished to make the Akari Project real, \"just to fuck those idiots over\".\n"
"\n"
-"Currently, Saya has two girlfriends: Maidbot Miyamoto and \cfIbuki Miyamoto\c-. Both of them being creations of her own, prompting people online to make incestuous remarks, which she frequently fights against.\n"
+"Currently, Saya has two girlfriends: Meido Miyamoto and \cfIbuki Miyamoto\c-. Both of them being creations of her own, prompting people online to make incestuous remarks, which she frequently fights against.\n"
"\n"
"\cxSaya's Notes:\c-\n"
"\cfYou like reading about me, don't you? I bet you do, silly. Alright, here's some more about me, just for you.\c-\n"
@@ -3179,14 +3132,17 @@ SWWM_LORETXT_SAYA =
"\n"
"\cfWell, are you satisfied, Demo-chan? Have I sated your thirst for Saya Facts™? Good, then you should go back to work.\c-";
SWWM_LORETXT_SAYA2 =
-"\cxFull Name:\c-\n"
-"\cf Saya Miyamoto\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1993-03-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @AkariSaya\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Saya Miyamoto\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1993-03-20\c-\n"
+" \cxOccupation:\c-\n"
+" \cf CTO, Human Resources (Akari Labs)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @AkariSaya\c-\n"
+"\n"
"\n"
"\cfSaya Miyamoto\c- was born in 1993 as the middle child of \cfNana Miyamoto\c- and \cfRyuji Miyamoto\c-, her older brother being \cfTaro Miyamoto\c-, born in 1985, and her younger sister being \cfYui Miyamoto\c-, born in 2009. As a child, Saya already showed interest in science and technology, proudly looking up to her father and his inventions. She excelled greatly in school, having even been described as a \"child prodigy\". At the surprisingly early age of 13, having proven her outstanding abilities, she got herself into \cfMIT\c-, where she graduated in \cfComputer Science\c-.\n"
"\n"
@@ -3198,9 +3154,9 @@ SWWM_LORETXT_SAYA2 =
"\n"
"Saya is also known for being exaggeratedly flirty around attractive women, something which has resulted in many misunderstandings and awkward moments. She proudly states that she's \"always horny on main\", and never lets any chance to flirt with someone slip past her. She however remarks that this open flirting is \"just a friendly thing, between friends\".\n"
"\n"
-"Saya has many hobbies, including programming (her language of choice being \cfHaskell\c-), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called \cfMy Maid Is A Sex Robot\c-, partially based around her experiences with dating \cfMaidbot Miyamoto\c-. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, \cfThe Akari Project\c-, a story about teleportation experiments and interdimensional travel \"that doesn't go to shit like all the others\". Following the disaster on the \cfUAC\c- bases in regards to teleportation, she announced that she wished to make the Akari Project real, \"just to fuck those idiots over\".\n"
+"Saya has many hobbies, including programming (her language of choice being \cfHaskell\c-), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called \cfMy Maid Is A Sex Robot\c-, partially based around her experiences with dating \cfMeido Miyamoto\c-. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, \cfThe Akari Project\c-, a story about teleportation experiments and interdimensional travel \"that doesn't go to shit like all the others\". Following the disaster on the \cfUAC\c- bases in regards to teleportation, she announced that she wished to make the Akari Project real, \"just to fuck those idiots over\".\n"
"\n"
-"Currently, Saya has three girlfriends: Maidbot Miyamoto, \cfIbuki Miyamoto\c- and the \cfDemolitionist\c-. All of them being creations of her own, prompting people online to make incestuous remarks, which she frequently fights against.\n"
+"Currently, Saya has three girlfriends: Meido Miyamoto, \cfIbuki Miyamoto\c- and the \cfDemolitionist\c-. All of them being creations of her own, prompting people online to make incestuous remarks, which she frequently fights against.\n"
"\n"
"\cxSaya's Notes:\c-\n"
"\cfYou like reading about me, don't you? I bet you do, silly. Alright, here's some more about me, just for you.\c-\n"
@@ -3211,14 +3167,17 @@ SWWM_LORETXT_SAYA2 =
"\n"
"\cfNow go back to work, silly robutt.\c-";
SWWM_LORETXT_SAYA3 =
-"\cxFull Name:\c-\n"
-"\cf Saya Miyamoto\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1993-03-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @AkariSaya\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Saya Miyamoto\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1993-03-20\c-\n"
+" \cxOccupation:\c-\n"
+" \cf CTO, Human Resources (Akari Labs)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @AkariSaya\c-\n"
+"\n"
"\n"
"\cfSaya Miyamoto\c- was born in 1993 as the middle child of \cfNana Miyamoto\c- and \cfRyuji Miyamoto\c-, her older brother being \cfTaro Miyamoto\c-, born in 1985, and her younger sister being \cfYui Miyamoto\c-, born in 2009. As a child, Saya already showed interest in science and technology, proudly looking up to her father and his inventions. She excelled greatly in school, having even been described as a \"child prodigy\". At the surprisingly early age of 13, having proven her outstanding abilities, she got herself into \cfMIT\c-, where she graduated in \cfComputer Science\c-.\n"
"\n"
@@ -3230,9 +3189,9 @@ SWWM_LORETXT_SAYA3 =
"\n"
"Saya is also known for being exaggeratedly flirty around attractive women, something which has resulted in many misunderstandings and awkward moments. She proudly states that she's \"always horny on main\", and never lets any chance to flirt with someone slip past her. She however remarks that this open flirting is \"just a friendly thing, between friends\".\n"
"\n"
-"Saya has many hobbies, including programming (her language of choice being \cfHaskell\c-), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called \cfMy Maid Is A Sex Robot\c-, partially based around her experiences with dating \cfMaidbot Miyamoto\c-. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, \cfThe Akari Project\c-, a story about teleportation experiments and interdimensional travel \"that doesn't go to shit like all the others\". Following the disaster on the \cfUAC\c- bases in regards to teleportation, she announced that she wished to make the Akari Project real, \"just to fuck those idiots over\".\n"
+"Saya has many hobbies, including programming (her language of choice being \cfHaskell\c-), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called \cfMy Maid Is A Sex Robot\c-, partially based around her experiences with dating \cfMeido Miyamoto\c-. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, \cfThe Akari Project\c-, a story about teleportation experiments and interdimensional travel \"that doesn't go to shit like all the others\". Following the disaster on the \cfUAC\c- bases in regards to teleportation, she announced that she wished to make the Akari Project real, \"just to fuck those idiots over\".\n"
"\n"
-"Currently, Saya and her creations Maidbot Miyamoto, \cfIbuki Miyamoto\c- and the \cfDemolitionist\c- are all engaged to \cfKirin Xanai\c-, leader of the \cfSykhai Empire\c- of \cfAkkou\c-.\n"
+"Currently, Saya and her creations Meido Miyamoto, \cfIbuki Miyamoto\c- and the \cfDemolitionist\c- are all engaged to \cfKirin Xanai\c-, leader of the \cfSykhai Empire\c- of \cfAkkou\c-.\n"
"\n"
"\cxSaya's Notes:\c-\n"
"\cfYou like reading about me, don't you? I bet you do, silly. Alright, here's some more about me, just for you.\c-\n"
@@ -3541,14 +3500,17 @@ SWWM_LORETAG_TARO = "Miyamoto, Taro";
SWWM_LORETAB_TARO = "People";
SWWM_LOREREL_TARO = "Nana;Ryuji;Saya;Ellen;Ibuki;WhiteScar;AkariLabs";
SWWM_LORETXT_TARO =
-"\cxFull Name:\c-\n"
-"\cf Taro Miyamoto\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1985-10-06\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @AkariTaro\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Taro Miyamoto\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1985-10-06\c-\n"
+" \cxOccupation:\c-\n"
+" \cf CEO, Public Relations (Akari Labs)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @AkariTaro\c-\n"
+"\n"
"\n"
"Born in 1985 to \cfNana\c- and \cfRyuji Miyamoto\c-, \cfTaro\c- is the oldest of three siblings, despite what his looks might show. As a child, he was rather conflictive, but also notably studious. Having finished high school with excellent grades, he went on to study at many prestigious universities across the world, fueled by the desire to expand his knowledge, especially that of computer technology, which he was infatuated with. Alongside \cfSaya\c-, his younger sister, they founded \cfAkari Labs\c-, a company that specializes in Robotics and Artificial Intelligence, among others. There, Taro's specialties are Software Engineering and Design, and he's also in charge of managing public relations, due to Saya not being \"much of a people person\" unlike him.\n"
"\n"
@@ -3675,16 +3637,18 @@ SWWM_LORETAG_UNISSIX = "Unissix, Misa A.";
SWWM_LORETAB_UNISSIX = "People";
SWWM_LOREREL_UNISSIX = "Devanikna;Nedoshiaan;Zanaveth2;Zanaveth3;Nukuri;Saya;Yui;Taro;Ashley;Ellen;Sankaideriha";
SWWM_LORETXT_UNISSIX =
-"\cxFull Name:\c-\n"
-"\cf Misa Azadeku Unissix\c-\n"
-"\cxAlias:\c-\n"
-"\cf Unissix Bokurou Azadeku\c-\n"
-"\cxNationality:\c-\n"
-"\cf Devanikan\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1992-02-29\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @misamisa_unissix\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Misa Azadeku Unissix\c-\n"
+" \cxAlias:\c-\n"
+" \cf Unissix Bokurou Azadeku\c-\n"
+" \cxNationality:\c-\n"
+" \cf Devanikan\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1992-02-29\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Blacksmith (Unissix Crafts)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @misamisa_unissix\c-\n"
"\n"
"\cfMisa Azadeku Unissix\c- is the youngest member of the \cfUnissix Clan\c-, who leads the nation of \cfDevanikna\c-. She's the second child of \cfDevai Unissix\c- and \cfSerwand Nerukousei\c-, being the younger sister of \cfDeneva Unissix\c-, one of the most renowned warriors in the entire nation.\n"
"\n"
@@ -3757,7 +3721,23 @@ SWWM_LORETXT_VOICEBOX =
"The \cfAkari Labs\c- community offers a variety of custom-made voice packs for this device, too. Please visit our forums for more information.\n"
"\n"
"\cxSaya's Notes:\c-\n"
-"\cfHeh... Ibuki's so amused that I programmed your voicebox to sound exactly like her. I mean, it fits, a lil' bit, being her little sister in a way, but what amuses ME is that you've somehow picked up all her little mannerisms and stuff. It's like you're a smol Ibuki at times, just without the tiddy.\c-";
+"\cfHeh... I just love that cute voice you've got, it's a perfect complement to that sassy personality of yours. And what amuses me the most is how quickly you picked up all our little quirks and mannerisms, especially Ibuki's. In a way it's almost like you're sometimes a smol version of her, just without the tiddy.\c-";
+SWWM_LORETXT_VOICEBOX2 =
+"\cxDesignation:\c-\n"
+"\cf Loudboi Voicebox\c-\n"
+"\cxManufacturer:\c-\n"
+"\cf Akari Labs\c-\n"
+"\cxClassification:\c-\n"
+"\cf Voice Synthesizer\c-\n"
+"\n"
+"The \cfLoudboi\c- is a simple and lightweight device for AI units. Easy to install and program, perfect for those building on a budget. There are a wide variety of options for the voice type, along with multiple language support, including Japanese. Those who are rather displeased with the uncannily \"too human\" default voice synthesis also have the option of enabling a built-in \"robot voice\" filter.\n"
+"\n"
+"The \cfAkari Labs\c- community offers a variety of custom-made voice packs for this device, too. Please visit our forums for more information.\n"
+"\n"
+"\cxSaya's Notes:\c-\n"
+"\cfHeh... I just love that cute voice you've got, it's a perfect complement to that sassy personality of yours. And what amuses me the most is how quickly you picked up all our little quirks and mannerisms, especially Ibuki's. In a way it's almost like you're sometimes a smol version of her, just without the tiddy.\c-\n"
+"\n"
+"\cfUpdate: And then... Your true vocal chords as a maidbot came to be, no filters or anything, and my love for your charming voice only increased. My heart melts at the sound of it, hehehe...\c-";
SWWM_LORETAG_WALLBUSTER = "Wallbuster";
SWWM_LORETAB_WALLBUSTER = "Item";
SWWM_LOREREL_WALLBUSTER = "Blackmann;Bigshot;Demolitionist;Saya;Taro;Belt";
@@ -3828,14 +3808,17 @@ SWWM_LORETAG_WHITELADY = "White Lady";
SWWM_LORETAB_WHITELADY = "People";
SWWM_LOREREL_WHITELADY = "MothPlushy;Chancebox;MothLamp;XAnimen;Demolitionist;Saya";
SWWM_LORETXT_WHITELADY =
-"\cxFull Name:\c-\n"
-"\cf Andira Kyse\c-\n"
-"\cxTitle:\c-\n"
-"\cf White Lady of Aldabura\c-\n"
-"\cxNationality:\c-\n"
-"\cf Kantharei\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2674 BC\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Andira Kyse\c-\n"
+" \cxTitle:\c-\n"
+" \cf White Lady of Aldabura\c-\n"
+" \cxNationality:\c-\n"
+" \cf Kantharei\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2674 BC\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Mercenary\c-\n"
+"\n"
"\n"
"The \cfWhite Lady of Aldabura\c- is one of the most skilled mercenaries known within the \cfX'Animen Coalition\c-. As one of the \cfAldabura\c-, moth-like humanoids native to the small planet of \cfKantharo\c-, she is quite sensitive to bright lights, and is often easily charmed by them. At the same time, she's quite timid and prefers to focus on her work, rather than on any social interaction.\n"
"\n"
@@ -4204,14 +4187,17 @@ SWWM_LORETAG_YUI = "Miyamoto, Yui";
SWWM_LORETAB_YUI = "People";
SWWM_LOREREL_YUI = "Nana;Ryuji;Taro;Saya;Ashley";
SWWM_LORETXT_YUI =
-"\cxFull Name:\c-\n"
-"\cf Yui Miyamoto\c-\n"
-"\cxNationality:\c-\n"
-"\cf Japanese\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2009-07-02\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @yuchan09\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Yui Miyamoto\c-\n"
+" \cxNationality:\c-\n"
+" \cf Japanese\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2009-07-02\c-\n"
+" \cxOccupation:\c-\n"
+" \cf Neurosurgeon (Kasukabe Central Hospital)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @yuchan09\c-\n"
+"\n"
"\n"
"Born in 2009 to \cfNana\c- and \cfRyuji Miyamoto\c-, \cfYui\c- is the youngest of three siblings. She's quite an empathetic and sociable person, completely unlike her relatively gloomier, more reclusive older sister and brother \cfSaya\c- and \cfTaro\c-, having always shown a clear interest in helping other people. Since her childhood, her wish had been to become a doctor, \"to save lives\". This wish came to fruition after persevering through her studies, and many years slowly \"ascending the ranks\". As of this article's writing, Yui currently works as a neurosurgeon at \cfKasukabe Central Hospital\c-, and has received several awards for her outstanding achievements.\n"
"\n"
@@ -4233,14 +4219,17 @@ SWWM_LORETAG_ZANAVETH2 = "Zanaveth II";
SWWM_LORETAB_ZANAVETH2 = "People";
SWWM_LOREREL_ZANAVETH2 = "Nukuri;Devanikna;Unissix;Nekuratek;Zanaveth3;Kirin;WhiteScar;XAnimen";
SWWM_LORETXT_ZANAVETH2 =
-"\cxFull Name:\c-\n"
-"\cf Zanaveth Nekuraku II\c-\n"
-"\cxNationality:\c-\n"
-"\cf Nukuri\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1969-08-10\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @purple_emotion\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Zanaveth Nekuraku II\c-\n"
+" \cxNationality:\c-\n"
+" \cf Nukuri\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1969-08-10\c-\n"
+" \cxOccupation:\c-\n"
+" \cf CEO, AI Engineer (Nekuratek)\c-\n"
+" \cf Minister of Interspecies Relations (NUG)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @purple_emotion\c-\n"
"\n"
"\cfZanaveth Nekuraku II\c- was born in 1969, as the single child of \cfZanaveth Nekuraku I\c- and \cfDanakorn Kiyanou\c-. During her childhood, she showed great promise, being quite the quick learner, but rather than pressuring her to study harder, or putting her on a higher level place of study, her parents decided instead on letting her keep going at her own pace, which was something unheard of at the time.\n"
"\n"
@@ -4265,14 +4254,17 @@ SWWM_LORETXT_ZANAVETH2 =
"\n"
"\cfNowadays with the White Scar bullshit, we haven't been in touch much. Misa managed to visit a couple times, but it really wasn't the same, and I could tell that she wasn't enjoying it either. Yeah, fuck all that, I hope it ends someday and I can get the two in here again.\c-";
SWWM_LORETXT_ZANAVETH22 =
-"\cxFull Name:\c-\n"
-"\cf Zanaveth Nekuraku II\c-\n"
-"\cxNationality:\c-\n"
-"\cf Nukuri\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 1969-08-10\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @purple_emotion\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Zanaveth Nekuraku II\c-\n"
+" \cxNationality:\c-\n"
+" \cf Nukuri\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 1969-08-10\c-\n"
+" \cxOccupation:\c-\n"
+" \cf CEO, AI Engineer (Nekuratek)\c-\n"
+" \cf Minister of Interspecies Relations (NUG)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @purple_emotion\c-\n"
"\n"
"\cfZanaveth Nekuraku II\c- was born in 1969, as the single child of \cfZanaveth Nekuraku I\c- and \cfDanakorn Kiyanou\c-. During her childhood, she showed great promise, being quite the quick learner, but rather than pressuring her to study harder, or putting her on a higher level place of study, her parents decided instead on letting her keep going at her own pace, which was something unheard of at the time.\n"
"\n"
@@ -4302,17 +4294,19 @@ SWWM_LORETAG_ZANAVETH3 = "Zanaveth III";
SWWM_LORETAB_ZANAVETH3 = "People";
SWWM_LOREREL_ZANAVETH3 = "Nukuri;Unissix;Zanaveth2;NosKora;Saya;WhiteScar";
SWWM_LORETXT_ZANAVETH3 =
-"\cxFull Name:\c-\n"
-"\cf Zanaveth Nekuraku III\c-\n"
-"\cxAliases:\c-\n"
-"\cf The Corruptor\c-\n"
-"\cf Unissix Bokurou Azadeku II\c-\n"
-"\cxNationality:\c-\n"
-"\cf Nukuri\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2042-08-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @zanaveth\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Zanaveth Nekuraku III\c-\n"
+" \cxAliases:\c-\n"
+" \cf The Corruptor\c-\n"
+" \cf Unissix Bokurou Azadeku II\c-\n"
+" \cxNationality:\c-\n"
+" \cf Nukuri\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2042-08-20\c-\n"
+" \cxOccupation:\c-\n"
+" \cf AI Engineer (Nekuratek)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @zanaveth\c-\n"
"\n"
"\cfZanaveth Nekuraku III\c- is the sole daughter of \cfZanaveth Nekuraku II\c- and \cfMisa Azadeku Unissix\c-. She spent most of her early childhood on Earth, where she was born, though her and her family had to move back to \cfNahkami\c- once she turned four, since by law, she had to study at a Nukuri school. It was in school that the young child began to have notable issues.\n"
"\n"
@@ -4333,17 +4327,19 @@ SWWM_LORETXT_ZANAVETH3 =
"\n"
"\cfWell, if she comes here to Earth I'd welcome my new chuuni overlord with open arms.\c-";
SWWM_LORETXT_ZANAVETH32 =
-"\cxFull Name:\c-\n"
-"\cf Zanaveth Nekuraku III\c-\n"
-"\cxAliases:\c-\n"
-"\cf The Corruptor\c-\n"
-"\cf Unissix Bokurou Azadeku II\c-\n"
-"\cxNationality:\c-\n"
-"\cf Nukuri\c-\n"
-"\cxDate of Birth:\c-\n"
-"\cf 2042-08-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @zanaveth\c-\n"
+" \cxFull Name:\c-\n"
+" \cf Zanaveth Nekuraku III\c-\n"
+" \cxAliases:\c-\n"
+" \cf The Corruptor\c-\n"
+" \cf Unissix Bokurou Azadeku II\c-\n"
+" \cxNationality:\c-\n"
+" \cf Nukuri\c-\n"
+" \cxDate of Birth:\c-\n"
+" \cf 2042-08-20\c-\n"
+" \cxOccupation:\c-\n"
+" \cf AI Engineer (Nekuratek)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @zanaveth\c-\n"
"\n"
"\cfZanaveth Nekuraku III\c- is the sole daughter of \cfZanaveth Nekuraku II\c- and \cfMisa Azadeku Unissix\c-. She spent most of her early childhood on Earth, where she was born, though her and her family had to move back to \cfNahkami\c- once she turned four, since by law, she had to study at a Nukuri school. It was in school that the young child began to have notable issues.\n"
"\n"
diff --git a/language.def_menu b/language.def_menu
index 2805964ba..47522c3f4 100644
--- a/language.def_menu
+++ b/language.def_menu
@@ -1,6 +1,6 @@
[default]
// keybinds
-SWWM_KEYS = "SWWM GZ Bindings";
+SWWM_KEYS = "DEMOLITIONIST Bindings";
SWWM_PRIMARYFIRE = "Primary Fire";
SWWM_SECONDARYFIRE = "Secondary Fire";
SWWM_RELOADFIRE = "Reload";
@@ -20,16 +20,15 @@ SWWM_KBASE = "Demolitionist Menu";
SWWM_MINIMAPIN = "Minimap Zoom In";
SWWM_MINIMAPOUT = "Minimap Zoom Out";
// skills
-SWWM_SKCHILL = "\cvJust Chillin'\c-";
-SWWM_SKEASY = "\cdTaking It Easy~\c-";
-SWWM_SKNORMAL = "\cfAdequate Adventure\c-";
-SWWM_SKHARD = "\ciModerate Challenge\c-";
-SWWM_SKHARDCORE = "\cgI'm A Masochist\c-";
-SWWM_SKHARDCORECONFIRM = "\cgYou think the mod's too easy?\nPrepare yourself.\c-\n\n\cfFast monsters\n1.5x monster health & damage\n25% extra aggressiveness\nCheats are disabled\nCoop monsters will spawn\nThe store is disabled\nCan only revive once\c-\n\n(Press Y for a challenge)";
-SWWM_SKLUNATIC = "\crI WANT DIE\c-";
-SWWM_SKLUNATICCONFIRM = "\crYou will die, you will suffer.\nThat, I can guarantee.\c-\n\n\cfAll changes from Masochist\n+\n2x speedup for all enemy actions\nEnemy projectiles will multiply\nAdditional enemies may spawn\nEnemies react instantly\nEnemies don't flinch\nInfighting is disabled\c-\n\n(Press Y to die instantly)";
+SWWM_SKEASY = "\cvJust Blasting\c-";
+SWWM_SKNORMAL = "\cdDemolition Day\c-";
+SWWM_SKHARD = "\ciMostly Harmful\c-";
+SWWM_SKHARDCORE = "\cgPain Sandwich\c-";
+SWWM_SKHARDCORECONFIRM = "\cgThis is the Nightmare equivalent.\nPrepare to get your ass kicked.\c-\n\n\cfFast monsters\n1.5x monster health & damage\n25% extra aggressiveness\nCheats are disabled\nCoop monsters will spawn\nThe store is disabled\nCan only revive once\c-\n\n(Press Y for a challenge)";
+SWWM_SKLUNATIC = "\crDemo Must Die\c-";
+SWWM_SKLUNATICCONFIRM = "\crAre you sure you want that?\nYou're gonna have a REAL bad time.\c-\n\n\cfAll changes from \cgPain Sandwich\cf\n+\n2x speedup for all enemy actions\nEnemy projectiles will multiply\nAdditional enemies may spawn\nEnemies react instantly\nEnemies don't flinch\nInfighting is disabled\c-\n\n(Press Y to die instantly)";
// mod menu
-SWWM_MTITLE = "SWWM GZ Options";
+SWWM_MTITLE = "DEMOLITIONIST Options";
SWWM_PTITLE = "Player Options";
SWWM_VOICETYPE = "Demolitionist Voice Pack";
SWWM_MUTELEVEL = "Voice Muting Level";
@@ -51,14 +50,6 @@ SWWM_ITITLE = "Item Options";
SWWM_ARMORUSE = "Automatically Use Armor";
SWWM_HEALTHUSE = "Automatically Use Health";
SWWM_AMMOUSE = "Automatically Use Fabricators";
-SWWM_CTITLE = "Multiplayer Options";
-SWWM_SKEYS = "Share Keys";
-SWWM_SVARMORUSE = "Enforce Armor Auto-Use";
-SWWM_SVHEALTHUSE = "Enforce Health Auto-Use";
-SWWM_SVAMMOUSE = "Enforce Fabricator Auto-Use";
-SWWM_FORCEDISABLE = "Force Disable";
-SWWM_USERSET = "User Set";
-SWWM_FORCEENABLE = "Force Enable";
SWWM_6DOF = "6DOF Flight";
SWWM_TARGET = "Show Healthbars";
SWWM_TARGETTAG = "Show Monster Names";
@@ -68,13 +59,14 @@ SWWM_SCOREBONUS = "Show Score Bonuses";
SWWM_POIS = "Show Points of Interest";
SWWM_EARBUSTER = "Reduce Wallbuster Loudness";
SWWM_SHADERS = "Use Screen Shaders";
-SWWM_OTHERVOICE = "Co-op Voice";
SWWM_REVIVE = "Emergency Reboot System";
SWWM_REVIVECOOLDOWN = "Reboot Cooldown";
SWWM_UNLIMITED = "Unlimited";
SWWM_ONERETRY = "One Retry";
SWWM_NONE = "None";
SWWM_INTERART = "Intermission Art";
+SWWM_NORENDER = "Yes (Fanart Only)";
+SWWM_NOFANART = "Yes (Renders Only)";
SWWM_BALLUSE = "Lead Balls can Activate Switches";
SWWM_BOSSBAR = "Show Boss Healthbars";
SWWM_BTITLE = "Balance Options";
@@ -91,7 +83,8 @@ SWWM_NUMSCALE = "Number Scaling";
SWWM_SCRSCALE = "Score Scaling";
SWWM_POISCALE = "POI Scaling";
SWWM_DETSCALE = "Item Sense Scaling";
-SWWM_GZSCALE = "Use GZDoom Setting";
+SWWM_TFITSCALE = "Tight Fit";
+SWWM_LFITSCALE = "Loose Fit";
SWWM_BLOOD = "Enable Custom Blood";
SWWM_FUZZ = "Enable Animated Menu BG";
SWWM_BUSTERPAUSE = "Pause on Wallbuster Reload";
@@ -202,7 +195,6 @@ SWWM_ENGINE = "Engine";
SWWM_ITEMGLOWS = "Distant Items Glow";
SWWM_NOMAGDROP = "Drop Spent Mags";
SWWM_BARRIERUSE = "Automatically Use Coating";
-SWWM_SVBARRIERUSE = "Enforce Coating Auto-Use";
SWWM_NOMAPMSG = "Map Special Messages";
SWWM_WEAPONTOOLTIPS = "Weapon Tooltips";
SWWM_RESETTOOLTIPS = "Reset Weapon Tooltips";
@@ -210,7 +202,11 @@ SWWM_CRESET = "Reset to Defaults";
SWWM_ARESET = "Wipe Achievements";
SWWM_NOINTERTIPS = "Hide Intermission Tips";
SWWM_DEMOSLAYER = "Demoslayer Mode";
+SWWM_BEEPBOOP = "Switch Emoting";
+SWWM_VOICEAMP = "Voice Amplification";
SWWM_CLEARFX = "Clear All Effects";
+SWWM_OLDLOGO = "Old Branding";
+SWWM_NODEATHEXIT = "Disable Death Exits";
SWWM_MMTITLE = "Minimap Settings";
SWWM_MM_ENABLE = "Show Minimap";
SWWM_MM_ROTATE = "Rotate Minimap";
@@ -266,13 +262,9 @@ TOOLTIP_SWWM_MAXPICKUP = "Maximum pickup messages visible at any time.";
TOOLTIP_SWWM_CHATDURATION = "Duration of chat messages in seconds.";
TOOLTIP_SWWM_MSGDURATION = "Duration of obituaries and other messages in seconds.";
TOOLTIP_SWWM_PICKDURATION = "Duration of pickup messages in seconds.";
-TOOLTIP_SWWM_SHAREKEYS = "When this is enabled, picking up a key item will send a copy to all other players.";
TOOLTIP_SWWM_AUTOUSEARMOR = "When enabled, spare armors will be automatically used when needed (new armors are always automatically worn).";
TOOLTIP_SWWM_AUTOUSEHEALTH = "When enabled, health items are automatically used if they can heal (including spares). This excludes Refreshers since they count as powerups, and always autoactivate on fatal damage.";
TOOLTIP_SWWM_AUTOUSEAMMO = "When enabled, ammo fabricators are automatically used on pickup. This excludes Tier 4 fabricators since they count as powerups.";
-TOOLTIP_SWWM_ENFORCEAUTOUSEARMOR = "Enforce a specific armor auto-use setting for all players, or respects per-player settings.";
-TOOLTIP_SWWM_ENFORCEAUTOUSEHEALTH = "Enforce a specific health auto-use setting for all players, or respects per-player settings.";
-TOOLTIP_SWWM_ENFORCEAUTOUSEAMMO = "Enforce a specific ammo fabricator auto-use setting for all players, or respects per-player settings.";
TOOLTIP_SWWM_FLY6DOF = "Enable 6DOF movement when flying. Disable if this feature causes any discomfort.";
TOOLTIP_SWWM_TARGETER = "Show enemy/player healthbars. Disable if you'd prefer to use another mod for this, such as Target Spy.";
TOOLTIP_SWWM_TARGETTAGS = "Show enemy names above their healthbars.";
@@ -282,25 +274,24 @@ TOOLTIP_SWWM_SCOREBONUS = "Show additional bonus strings above score numbers (e.
TOOLTIP_SWWM_POIS = "Show points of interest (such as key items and exits) when you have Omnisight.";
TOOLTIP_SWWM_EARBUSTER = "The Wallbuster's firing sounds may be painfully loud at times. This setting will limit the loudness to something more bearable.";
TOOLTIP_SWWM_SHADERS = "Use postprocess shaders for things like powerups and the Silver Bullet scope. You can disable this if you'd prefer something lighter on the eyes.";
-TOOLTIP_SWWM_OTHERVOICE = "Allows you to hear other player's voice lines, provided you're close enough.";
TOOLTIP_SWWM_REVIVE = "Allows the player to get back up after dying by pressing Fire. Has a configurable cooldown.";
TOOLTIP_SWWM_REVIVECOOLDOWN = "Time in seconds of downtime after using a reboot, where if you die again, you can't get back up. Set to 0 to allow unlimited reboots. Alternatively, you can also set it to only allow one reboot per map (enforced on expert difficulties).";
-TOOLTIP_SWWM_INTERART = "If enabled, displays randomly selected fanart during intermissions.";
+TOOLTIP_SWWM_INTERART = "If enabled, displays randomly selected fanart and official renders during intermissions. There are extra options to only show each category.";
TOOLTIP_SWWM_BALLUSE = "Lead Ball projectiles can remotely activate use switches (excluding exits). Potentially OP.";
TOOLTIP_SWWM_BOSSHEALTHBARS = "Show a healthbar for vanilla boss encounters at the bottom of the screen. Just like Dark Souls™!";
TOOLTIP_SWWM_UPGRADEBOSSES = "Buffs the health of vanilla bosses in order to make the fights more \"fair\" with this mod, and less prone to instant wins.";
TOOLTIP_SWWM_EXTRAALERT = "Allows monsters to hear things such as bouncing projectiles, ricocheting bullets, and more. Due to the recursive nature of the A_AlertMonsters function, this has a MASSIVE performance hit on very complex maps.";
TOOLTIP_SWWM_ACCDAMAGE = "Damage dealt to a target within the same tic will be grouped into a single damage number, which may make the screen less cluttered in most cases.";
-TOOLTIP_SWWM_MAXTARGETDIST = "Limit the farthest distance at which healthbars for hostile targets are shown. Note that player healthbars in co-op will always show regardless of distance. Non-hostiles are always shown at one quarter of this distance.";
+TOOLTIP_SWWM_MAXTARGETDIST = "Limit the farthest distance at which healthbars for hostile targets are shown. Non-hostiles are always shown at one quarter of this distance.";
TOOLTIP_SWWM_MAXTARGETS = "Limit the amount of healthbars to display on-screen. Helps keep the screen less cluttered.";
TOOLTIP_SWWM_MAXDAMNUMS = "Limit the amount of damage/healing numbers to display on-screen. Helps keep the screen less cluttered.";
TOOLTIP_SWWM_MAXSCORENUMS = "Limit the amount of score numbers to display on-screen. Helps keep the screen less cluttered.";
-TOOLTIP_SWWM_HUDSCALE = "Scaling factor of the HUD. Set to 0 to use GZDoom's own HUD scaling.";
-TOOLTIP_SWWM_BARSCALE = "Scaling factor for targetter healthbars. Set to 0 to use GZDoom's own HUD scaling.";
-TOOLTIP_SWWM_NUMSCALE = "Scaling factor for damage/healing numbers. Set to 0 to use GZDoom's own HUD scaling.";
-TOOLTIP_SWWM_SCRSCALE = "Scaling factor for score numbers. Set to 0 to use GZDoom's own HUD scaling.";
-TOOLTIP_SWWM_POISCALE = "Scaling factor for points of interest. Set to 0 to use GZDoom's own HUD scaling.";
-TOOLTIP_SWWM_DETSCALE = "Scaling factor for sensed items. Set to 0 to use GZDoom's own HUD scaling.";
+TOOLTIP_SWWM_HUDSCALE = "Scaling factor of the HUD. \"Tight\" scales to fit the width of the full HUD, while \"Loose\" is recommended for ultrawide to avoid overlaps.";
+TOOLTIP_SWWM_BARSCALEREL = "Relative scaling factor for targetter healthbars. A factor of 0 matches the HUD scale.";
+TOOLTIP_SWWM_NUMSCALEREL = "Relative scaling factor for damage/healing numbers. A factor of 0 matches the HUD scale.";
+TOOLTIP_SWWM_SCRSCALEREL = "Relative scaling factor for score numbers. A factor of 0 matches the HUD scale.";
+TOOLTIP_SWWM_POISCALEREL = "Relative scaling factor for points of interest. A factor of 0 matches the HUD scale.";
+TOOLTIP_SWWM_DETSCALEREL = "Relative scaling factor for sensed items. A factor of 0 matches the HUD scale.";
TOOLTIP_SWWM_BLOOD = "Enable custom blood and gore effects, adapted from Soundless Mound. I'd honestly recommend Nashgore instead, it's better.";
TOOLTIP_SWWM_FUZZ = "Toggling this off is recommended if you're recording/streaming as this effect can harm video quality.";
TOOLTIP_SWWM_CBTPAUSE = "The game will pause while the Wallbuster reload menu is open (only in singleplayer).";
@@ -363,7 +354,6 @@ TOOLTIP_SWWM_ENGINE = "Don't touch this.";
TOOLTIP_SWWM_ITEMGLOWS = "If enabled, items that are far away from the player will display a shimmering glow (requires a map restart to take full effect).";
TOOLTIP_SWWM_NOMAGDROP = "By default, the Demolitionist will be somewhat environmentally conscious and not leave spent magazines lying around. Enable if you prefer the added clutter.";
TOOLTIP_SWWM_AUTOUSEBARRIER = "When enabled, elemental coating will be automatically used as needed if standing on damaging floors.";
-TOOLTIP_SWWM_ENFORCEAUTOUSEBARRIER = "Enforce a specific coating auto-use setting for all players, or respects per-player settings.";
TOOLTIP_SWWM_NOMAPMSG = "Toggles special animated character messages on certain maps (usually vanilla).";
TOOLTIP_SWWM_WEAPONTOOLTIPS = "Shows a summary of controls when a weapon is selected for the first time.";
TOOLTIP_EVENT_SWWMRESETTOOLTIPS = "Resets weapon tooltips so you can see them all over again.";
@@ -371,7 +361,11 @@ TOOLTIP_EVENT_SWWMRESETCVARS = "Resets all the mod's settings to their original
TOOLTIP_EVENT_SWWMRESETACHIEVEMENTS = "Erases all your archievement progress.";
TOOLTIP_SWWM_NOINTERTIPS = "Hides intermission tips, in case you don't want to see them.";
TOOLTIP_SWWM_DEMOSLAYER = "Killed enemies may drop health and armor orbs.";
+TOOLTIP_SWWM_BEEPBOOP = "The Demolitionist will make cute noises whenever pressing any usable line. This might get annoying, so it's optional.";
+TOOLTIP_SWWM_VOICEAMP = "At their default volume, the Demolitionist's voice lines might be drowned out by in-game audio. This sets an additional amplification level so they're louder than other sounds.";
TOOLTIP_NETEVENT_SWWMCLEAREFFECTS = "Fades out any active blood, gore, debris and casings.";
+TOOLTIP_SWWM_OLDLOGO = "For those who miss the days of SWWM GZ, you can restore the old title screen and main menu with this.";
+TOOLTIP_SWWM_NODEATHEXIT = "This option completely negates the effects of death exits, if you don't like losing all your stuff.";
TOOLTIP_SWWMMINIMAPMENU = "Configure the minimap.";
TOOLTIP_SWWMACHIEVEMENTMENU = "View your achievements.";
TOOLTIP_SWWM_MM_ENABLE = "Displays a minimap under the score counter.";
@@ -408,8 +402,31 @@ TOOLTIP_SWWM_MM_THINGCOLOR_CITEM = "Color for items that count towards map tally
TOOLTIP_SWWM_MM_THINGCOLOR_VIPITEM = "Color for very important items.";
TOOLTIP_SWWM_MM_THINGCOLOR_SHOOTABLE = "Color for things that can be damaged.";
TOOLTIP_SWWM_MM_THINGCOLOR_MISSILE = "Color for projectiles.";
+// main menu poses (do not localize)
+SWWM_NMENUPOSE = "21";
+SWWM_MENUPOSE1 = "graphics/M_DEMOCHAN_DEEPIMPACT.png";
+SWWM_MENUPOSE2 = "graphics/M_DEMOCHAN_EXPLOGUN.png";
+SWWM_MENUPOSE3 = "graphics/M_DEMOCHAN_SPREADGUN.png";
+SWWM_MENUPOSE4 = "graphics/M_DEMOCHAN_WALLBUSTER.png";
+SWWM_MENUPOSE5 = "graphics/M_DEMOCHAN_EVISCERATOR.png";
+SWWM_MENUPOSE6 = "graphics/M_DEMOCHAN_HELLBLAZER.png";
+SWWM_MENUPOSE7 = "graphics/M_DEMOCHAN_BIOSPARK.png";
+SWWM_MENUPOSE8 = "graphics/M_DEMOCHAN_SILVERBULLET.png";
+SWWM_MENUPOSE9 = "graphics/M_DEMOCHAN_CANDYGUN.png";
+SWWM_MENUPOSE10 = "graphics/M_DEMOCHAN_YNYKRON.png";
+SWWM_MENUPOSE11 = "graphics/M_DEMOCHAN_PUSHER.png";
+SWWM_MENUPOSE12 = "graphics/M_DEMOCHAN_DAB.png";
+SWWM_MENUPOSE13 = "graphics/M_DEMOCHAN_DOUBLEV.png";
+SWWM_MENUPOSE14 = "graphics/M_DEMOCHAN_HEALTH.png";
+SWWM_MENUPOSE15 = "graphics/M_DEMOCHAN_LOVE.png";
+SWWM_MENUPOSE16 = "graphics/M_DEMOCHAN_RAGEKIT.png";
+SWWM_MENUPOSE17 = "graphics/M_DEMOCHAN_SANDWICH.png";
+SWWM_MENUPOSE18 = "graphics/M_DEMOCHAN_SHELLS.png";
+SWWM_MENUPOSE19 = "graphics/M_DEMOCHAN_SKULL.png";
+SWWM_MENUPOSE20 = "graphics/M_DEMOCHAN_THONK.png";
+SWWM_MENUPOSE21 = "graphics/M_DEMOCHAN_THUMBUP.png";
// credits
-SWWM_MCREDS = "SWWM GZ Credits";
+SWWM_MCREDS = "DEMOLITIONIST Credits";
SWWM_CSTITLE = "UnSX Side Story: Demolitionist";
SWWM_CSTITLE2 = "Cute Robutt Whomst Love To Explode Demons";
SWWM_CLEAD = "Development Lead:";
@@ -420,6 +437,7 @@ SWWM_ASSOTHERS = "XDeath Sprites for Demon, Cacodemon, Revenant, Archvile";
SWWM_ASSEXTRA = "XDeath Sprites for Arachnotron, Mancubus";
SWWM_ASSKEEN = "Less Mean-Spirited Keen Replacement";
SWWM_CMUSIC = "Music Tracks Used:";
+SWWM_CVOICE = "Voices:";
SWWM_CFANART = "Intermission Fanart:";
SWWM_CPATRON = "Patreon Backers:";
SWWM_CTHANK = "Special Thanks:";
@@ -503,17 +521,8 @@ SWWM_STOREFULL = "You can't hold more of that.";
SWWM_STOREMUNS = "You don't have enough money.";
SWWM_NOSTORE = "(no items left to buy)";
SWWM_NOSTORESELL = "(no items to be sold)";
-SWWM_TRADETAB = "Trading";
-SWWM_TRADEFULL = "They can't hold more of that.";
-SWWM_TRADEFAIL = "You can't trade this item.";
-SWWM_NOTRADE = "(no units found nearby for trade)";
-SWWM_TRADETO = "Sent to";
-SWWM_TRADEFROM = "Received from";
-SWWM_NOTRADEHIST = "(no trades found in history)";
-SWWM_MSGSENT = "You sent %dx %s to %s.";
-SWWM_MSGRECV = "%s sent you %dx %s.";
-SWWM_CHATTAB = "Chat Log";
-SWWM_NOCHAT = "(chat history is empty)";
+SWWM_CHATTAB = "Messages";
+SWWM_NOCHAT = "(message history is empty)";
SWWM_SECRETTAB = "Secret";
SWWM_TODEMO = "\cx\"Fight for justice, Demo-chan! You can do it!\"\c- \cg♥\c- Ibuki & Saya";
SWWM_CUTIECLUB = "\cx\"Never lose hope, Demo-chan! We're all with you!\"\c- \cg♥\c- Cutie Club";
@@ -543,90 +552,71 @@ SWWM_KIRINPOEM =
SWWM_MAINCONTROLS = "Press F1 to see controls";
SWWM_LOREUNSEL = "(no entry chosen)";
SWWM_LORETAB0 = "Items";
-SWWM_LORETAB1 = "People";
-SWWM_LORETAB2 = "Lore";
+SWWM_LORETAB1 = "Enemies";
+SWWM_LORETAB2 = "People";
+SWWM_LORETAB3 = "Lore";
SWWM_HELPTAB = "Help";
SWWM_HELPTXT =
"\cxDemolitionist Menu - Basic Controls\c-\n"
-"\cx---------------------------------\c-\n"
+"\cx———————————————————————————————————\c-\n"
"\n"
"\cf%s:\c- Open/Close Demolitionist menu\n"
"\cfPageUp/PageDown:\c- Switch tabs\n"
"\cfF1:\c- Open/Close help tab\n"
"\n"
"\cxMission Tab - Controls\c-\n"
-"\cx--------------------\c-\n"
+"\cx——————————————————————\c-\n"
"\n"
"\cfUp/Down:\c- Scroll\n"
"\cfLeft/Right:\c- Switch through entries\n"
"\n"
"\cxStats Tab - Controls\c-\n"
-"\cx------------------\c-\n"
+"\cx————————————————————\c-\n"
"\n"
"\cfUp/Down:\c- Scroll\n"
"\cfLeft/Right:\c- Switch section\n"
"\n"
"\cxInventory Tab - Controls\c-\n"
-"\cx----------------------\c-\n"
+"\cx————————————————————————\c-\n"
"\n"
"\cfArrow Keys:\c- Navigate\n"
"\cfEnter/Left Click:\c- Use selected item\n"
"\cfBackspace/Right Click:\c- Drop selected item\n"
"\n"
"\cxKeychain Tab - Controls\c-\n"
-"\cx---------------------\c-\n"
+"\cx———————————————————————\c-\n"
"\n"
"\cfArrow Keys:\c- Navigate\n"
"\n"
"\cxLibrary Tab - Controls (Main)\c-\n"
-"\cx---------------------------\c-\n"
+"\cx—————————————————————————————\c-\n"
"\n"
"\cfUp/Down:\c- Scroll through entries\n"
"\cfLeft/Right:\c- Switch category\n"
"\cfEnter/Left Click:\c- Open entry\n"
"\n"
"\cxLibrary Tab - Controls (Entry Open)\c-\n"
-"\cx---------------------------------\c-\n"
+"\cx———————————————————————————————————\c-\n"
"\n"
"\cfUp/Down:\c- Scroll\n"
"\cfBackspace:\c- Return to entry list\n"
"\n"
"\cxStore Tab - Controls (Buying)\c-\n"
-"\cx---------------------------\c-\n"
+"\cx—————————————————————————————\c-\n"
"\n"
"\cfArrow Keys:\c- Navigate\n"
"\cfEnter/Left Click:\c- Buy\n"
"\cfBackspace/Right Click:\c- Switch to selling\n"
"\n"
"\cxStore Tab - Controls (Selling)\c-\n"
-"\cx----------------------------\c-\n"
+"\cx——————————————————————————————\c-\n"
"\n"
"\cfArrow Keys:\c- Navigate\n"
"\cfEnter/Left Click:\c- Sell\n"
"\cfBackspace/Right Click:\c- Switch to buying\n"
"\n"
-"\cxTrading Tab - Controls (Main)\c-\n"
-"\cx---------------------------\c-\n"
-"\n"
-"\cfUp/Down:\c- Navigate\n"
-"\cfEnter/Left Click:\c- Select recipient\n"
-"\cfBackspace/Right Click:\c- History\n"
-"\n"
-"\cxTrading Tab - Controls (Trade)\c-\n"
-"\cx----------------------------\c-\n"
-"\n"
-"\cfArrow Keys:\c- Navigate\n"
-"\cfEnter/Left Click:\c- Send item\n"
-"\cfBackspace/Right Click:\c- Return\n"
-"\n"
-"\cxTrading Tab - Controls (History)\c-\n"
-"\cx------------------------------\c-\n"
-"\n"
-"\cfUp/Down:\c- Scroll\n"
-"\cfBackspace/Right Click:\c- Return\n"
-"\n"
-"\cxChat Log Tab - Controls\c-\n"
-"\cx---------------------\c-\n"
+"\cxMessages Tab - Controls\c-\n"
+"\cx———————————————————————\c-\n"
"\n"
"\cfUp/Down:\c- Scroll";
// Wallbuster menu
@@ -709,7 +699,7 @@ SWWM_HELP_ARSE3TXT =
"Each and every active powerup will show up in your HUD, with some lil' numbers telling you how long it's going to last. Much better than just guessing, certainly.";
SWWM_HELP_KBASE = "The Demolitionist Menu";
SWWM_HELP_KBASETXT =
-"Lo and behold, the most essential part of this here mod. The \cfDemolitionist Menu\c-, activated through a dedicated keybind (don't forget to bind it). In here, you can do many things, including but not limited to: Managing your inventory in detail, check on your carried keys, look up various stats on your performances, buy goodies with your score points, share items in multiplayer, and also...\n"
+"Lo and behold, the most essential part of this here mod. The \cfDemolitionist Menu\c-, activated through a dedicated keybind (don't forget to bind it). In here, you can do many things, including but not limited to: Managing your inventory in detail, check on your carried keys, look up various stats on your performances, buy goodies with your score points, and also...\n"
"\n"
"\cfDEEP LORE!\c-\n"
"\n"
diff --git a/language.def_voice b/language.def_voice
index 1634d37d2..287263ba6 100644
--- a/language.def_voice
+++ b/language.def_voice
@@ -1,256 +1,661 @@
[default]
+//// DEFAULT VOICE - Vyolette
// voice name
-SWWM_VOICENAME_DEFAULT = "Demolitionist";
-// new weapon received
+SWWM_VOICENAME_DEFAULT = "Original";
+// new weapon received (generic, unspecified weapons)
SWWM_SUBS_DEFAULT_NGETWEAPON = "13";
-SWWM_SUBS_DEFAULT_GETWEAPON1 = "Not bad... Not bad at all...";
-SWWM_SUBS_DEFAULT_GETWEAPON2 = "Good find...";
-SWWM_SUBS_DEFAULT_GETWEAPON3 = "Mine now...";
-SWWM_SUBS_DEFAULT_GETWEAPON4 = "Nice...";
-SWWM_SUBS_DEFAULT_GETWEAPON5 = "Bingo...";
-SWWM_SUBS_DEFAULT_GETWEAPON6 = "Hell yeah...";
-SWWM_SUBS_DEFAULT_GETWEAPON7 = "Excellent...";
-SWWM_SUBS_DEFAULT_GETWEAPON8 = "Yes...";
-SWWM_SUBS_DEFAULT_GETWEAPON9 = "There we go...";
-SWWM_SUBS_DEFAULT_GETWEAPON10 = "Perfect...";
-SWWM_SUBS_DEFAULT_GETWEAPON11 = "I like it...";
-SWWM_SUBS_DEFAULT_GETWEAPON12 = "That looks nice...";
-SWWM_SUBS_DEFAULT_GETWEAPON13 = "It's probably worth a fortune...";
+SWWM_SUBS_DEFAULT_GETWEAPON1 = "Neat.";
+SWWM_SUBS_DEFAULT_GETWEAPON2 = "Mine.";
+SWWM_SUBS_DEFAULT_GETWEAPON3 = "This looks good.";
+SWWM_SUBS_DEFAULT_GETWEAPON4 = "Hm, nice.";
+SWWM_SUBS_DEFAULT_GETWEAPON5 = "Oh, cool!";
+SWWM_SUBS_DEFAULT_GETWEAPON6 = "Aw yeah.";
+SWWM_SUBS_DEFAULT_GETWEAPON7 = "Gimme.";
+SWWM_SUBS_DEFAULT_GETWEAPON8 = "Hell yeah.";
+SWWM_SUBS_DEFAULT_GETWEAPON9 = "Good.";
+SWWM_SUBS_DEFAULT_GETWEAPON10 = "Looking good.";
+SWWM_SUBS_DEFAULT_GETWEAPON11 = "I'll be taking this.";
+SWWM_SUBS_DEFAULT_GETWEAPON12 = "New gun, more fun.";
+SWWM_SUBS_DEFAULT_GETWEAPON13 = "You're coming with me.";
// locked door
-SWWM_SUBS_DEFAULT_NLOCKED = "4";
-SWWM_SUBS_DEFAULT_LOCKED1 = "Don't have the key.";
-SWWM_SUBS_DEFAULT_LOCKED2 = "Only opens with a key.";
-SWWM_SUBS_DEFAULT_LOCKED3 = "Would need the key.";
-SWWM_SUBS_DEFAULT_LOCKED4 = "Locked tight.";
-// jammed door (strife)
-SWWM_SUBS_DEFAULT_NJAMMED = "4";
-SWWM_SUBS_DEFAULT_JAMMED1 = "It's stuck.";
-SWWM_SUBS_DEFAULT_JAMMED2 = "No use.";
+SWWM_SUBS_DEFAULT_NLOCKED = "6";
+SWWM_SUBS_DEFAULT_LOCKED1 = "Welp, it's locked.";
+SWWM_SUBS_DEFAULT_LOCKED2 = "Gonna need a key for this.";
+SWWM_SUBS_DEFAULT_LOCKED3 = "Gotta find a key.";
+SWWM_SUBS_DEFAULT_LOCKED4 = "Needs a key.";
+SWWM_SUBS_DEFAULT_LOCKED5 = "God I hate keyhunts...";
+SWWM_SUBS_DEFAULT_LOCKED6 = "Goddamn keys...";
+// jammed door
+SWWM_SUBS_DEFAULT_NJAMMED = "7";
+SWWM_SUBS_DEFAULT_JAMMED1 = "Stuck.";
+SWWM_SUBS_DEFAULT_JAMMED2 = "Won't budge.";
SWWM_SUBS_DEFAULT_JAMMED3 = "Jammed.";
-SWWM_SUBS_DEFAULT_JAMMED4 = "Useless.";
+SWWM_SUBS_DEFAULT_JAMMED4 = "Won't open.";
+SWWM_SUBS_DEFAULT_JAMMED5 = "Shit's broken.";
+SWWM_SUBS_DEFAULT_JAMMED6 = "Not working.";
+SWWM_SUBS_DEFAULT_JAMMED7 = "The door is rusted shut.";
// puzzle item failure
SWWM_SUBS_DEFAULT_NPUZZFAIL = "6";
-SWWM_SUBS_DEFAULT_PUZZFAIL1 = "Damn.";
-SWWM_SUBS_DEFAULT_PUZZFAIL2 = "Damn it.";
-SWWM_SUBS_DEFAULT_PUZZFAIL3 = "No good.";
+SWWM_SUBS_DEFAULT_PUZZFAIL1 = "Dangit.";
+SWWM_SUBS_DEFAULT_PUZZFAIL2 = "Ah damn.";
+SWWM_SUBS_DEFAULT_PUZZFAIL3 = "Wait that's not right.";
SWWM_SUBS_DEFAULT_PUZZFAIL4 = "Nope.";
-SWWM_SUBS_DEFAULT_PUZZFAIL5 = "Uh uh.";
-SWWM_SUBS_DEFAULT_PUZZFAIL6 = "Hmmm.";
+SWWM_SUBS_DEFAULT_PUZZFAIL5 = "Uhhhhhh...";
+SWWM_SUBS_DEFAULT_PUZZFAIL6 = "Hmmm...";
// puzzle item success
-SWWM_SUBS_DEFAULT_NPUZZSUCC = "5";
+SWWM_SUBS_DEFAULT_NPUZZSUCC = "6";
SWWM_SUBS_DEFAULT_PUZZSUCC1 = "Nice.";
-SWWM_SUBS_DEFAULT_PUZZSUCC2 = "That's it.";
-SWWM_SUBS_DEFAULT_PUZZSUCC3 = "Got it.";
-SWWM_SUBS_DEFAULT_PUZZSUCC4 = "Yes.";
-SWWM_SUBS_DEFAULT_PUZZSUCC5 = "Sweet.";
+SWWM_SUBS_DEFAULT_PUZZSUCC2 = "Got it.";
+SWWM_SUBS_DEFAULT_PUZZSUCC3 = "There we go.";
+SWWM_SUBS_DEFAULT_PUZZSUCC4 = "Good.";
+SWWM_SUBS_DEFAULT_PUZZSUCC5 = "Yeah, that's it.";
+SWWM_SUBS_DEFAULT_PUZZSUCC6 = "Abracadabra.";
// first enemy encounter (20 seconds cooldown since all enemies dead)
SWWM_SUBS_DEFAULT_NFIGHTSTART = "21";
-SWWM_SUBS_DEFAULT_FIGHTSTART1 = "Here we go again.";
-SWWM_SUBS_DEFAULT_FIGHTSTART2 = "Let's get this show on the road.";
-SWWM_SUBS_DEFAULT_FIGHTSTART3 = "Time to die.";
-SWWM_SUBS_DEFAULT_FIGHTSTART4 = "Bring it on.";
-SWWM_SUBS_DEFAULT_FIGHTSTART5 = "You are all going to die.";
-SWWM_SUBS_DEFAULT_FIGHTSTART6 = "I've been spoiling for a fight.";
-SWWM_SUBS_DEFAULT_FIGHTSTART7 = "Let's do this.";
-SWWM_SUBS_DEFAULT_FIGHTSTART8 = "Time to get crazy! Kill 'em all!";
-SWWM_SUBS_DEFAULT_FIGHTSTART9 = "You really don't want to start a fight with me.";
-SWWM_SUBS_DEFAULT_FIGHTSTART10 = "Let's get on with it.";
-SWWM_SUBS_DEFAULT_FIGHTSTART11 = "Kill!";
+SWWM_SUBS_DEFAULT_FIGHTSTART1 = "Oh boy here we go.";
+SWWM_SUBS_DEFAULT_FIGHTSTART2 = "Alright, let's party.";
+SWWM_SUBS_DEFAULT_FIGHTSTART3 = "Oh, more baddies.";
+SWWM_SUBS_DEFAULT_FIGHTSTART4 = "Bring it on!";
+SWWM_SUBS_DEFAULT_FIGHTSTART5 = "This will be good.";
+SWWM_SUBS_DEFAULT_FIGHTSTART6 = "Ah, let the fun begin.";
+SWWM_SUBS_DEFAULT_FIGHTSTART7 = "Let's do this!";
+SWWM_SUBS_DEFAULT_FIGHTSTART8 = "You're going down!";
+SWWM_SUBS_DEFAULT_FIGHTSTART9 = "Oh, wanna fight?";
+SWWM_SUBS_DEFAULT_FIGHTSTART10 = "Alright, let's do this.";
+SWWM_SUBS_DEFAULT_FIGHTSTART11 = "You are already dead.";
SWWM_SUBS_DEFAULT_FIGHTSTART12 = "This won't be hard.";
-SWWM_SUBS_DEFAULT_FIGHTSTART13 = "Let's do it.";
-SWWM_SUBS_DEFAULT_FIGHTSTART14 = "Let's do this.";
-SWWM_SUBS_DEFAULT_FIGHTSTART15 = "Let's just get this over with.";
-SWWM_SUBS_DEFAULT_FIGHTSTART16 = "Well, this will be an interesting challenge.";
-SWWM_SUBS_DEFAULT_FIGHTSTART17 = "Okay. Let's get started.";
-SWWM_SUBS_DEFAULT_FIGHTSTART18 = "Oh, this is just what I need right now...";
-SWWM_SUBS_DEFAULT_FIGHTSTART19 = "Time to put on a show.";
-SWWM_SUBS_DEFAULT_FIGHTSTART20 = "I'm putting you down.";
-SWWM_SUBS_DEFAULT_FIGHTSTART21 = "Oh, good. Here I was afraid I'd have nothing to do.";
+SWWM_SUBS_DEFAULT_FIGHTSTART13 = "Time to fight!";
+SWWM_SUBS_DEFAULT_FIGHTSTART14 = "Here we go again.";
+SWWM_SUBS_DEFAULT_FIGHTSTART15 = "Oh you don't know who you're messing with.";
+SWWM_SUBS_DEFAULT_FIGHTSTART16 = "Well, here comes the party.";
+SWWM_SUBS_DEFAULT_FIGHTSTART17 = "Let's get this party started!";
+SWWM_SUBS_DEFAULT_FIGHTSTART18 = "Oh, finally, something to shoot.";
+SWWM_SUBS_DEFAULT_FIGHTSTART19 = "It's showtime!";
+SWWM_SUBS_DEFAULT_FIGHTSTART20 = "Oh, you're dead.";
+SWWM_SUBS_DEFAULT_FIGHTSTART21 = "Good. Was wondering when you'd show up.";
// played at map start
SWWM_SUBS_DEFAULT_NMAPSTART = "14";
-SWWM_SUBS_DEFAULT_MAPSTART1 = "Ugh... this place smells horrible.";
-SWWM_SUBS_DEFAULT_MAPSTART2 = "Okay, let's get to work.";
-SWWM_SUBS_DEFAULT_MAPSTART3 = "Let's hurry this up.";
-SWWM_SUBS_DEFAULT_MAPSTART4 = "This place is all kinds of strange.";
-SWWM_SUBS_DEFAULT_MAPSTART5 = "I was born ready.";
-SWWM_SUBS_DEFAULT_MAPSTART6 = "It's a hard world. I do what I have to.";
-SWWM_SUBS_DEFAULT_MAPSTART7 = "No robot is superior to me.";
-SWWM_SUBS_DEFAULT_MAPSTART8 = "I've seen better.";
-SWWM_SUBS_DEFAULT_MAPSTART9 = "Okay. Let's head in.";
-SWWM_SUBS_DEFAULT_MAPSTART10 = "I don't want any trouble. I'm just passing through.";
-SWWM_SUBS_DEFAULT_MAPSTART11 = "Sorry to keep you waiting.";
+SWWM_SUBS_DEFAULT_MAPSTART1 = "Ugh, fuck... This place reeks. I'd vomit if I could.";
+SWWM_SUBS_DEFAULT_MAPSTART2 = "Alright, let's get to work.";
+SWWM_SUBS_DEFAULT_MAPSTART3 = "Mission... start?";
+SWWM_SUBS_DEFAULT_MAPSTART4 = "Let's get this thing going.";
+SWWM_SUBS_DEFAULT_MAPSTART5 = "Oh, I'm so ready for this.";
+SWWM_SUBS_DEFAULT_MAPSTART6 = "Well, I'm not here for the sightseeing.";
+SWWM_SUBS_DEFAULT_MAPSTART7 = "Let the hunt begin.";
+SWWM_SUBS_DEFAULT_MAPSTART8 = "Well this looks interesting...";
+SWWM_SUBS_DEFAULT_MAPSTART9 = "Okay. Let's go.";
+SWWM_SUBS_DEFAULT_MAPSTART10 = "Time to blaze on through.";
+SWWM_SUBS_DEFAULT_MAPSTART11 = "Well, let's not keep everyone waiting.";
SWWM_SUBS_DEFAULT_MAPSTART12 = "I'll do my best.";
-SWWM_SUBS_DEFAULT_MAPSTART13 = "Just so we're clear: Anything good I find is mine.";
-SWWM_SUBS_DEFAULT_MAPSTART14 = "I bet the food here is terrible.";
+SWWM_SUBS_DEFAULT_MAPSTART13 = "Let me say this: Anything I find, I keep.";
+SWWM_SUBS_DEFAULT_MAPSTART14 = "I'm here to chew bubblegum and kick ass... And I don't have a mouth.";
// every time a secret is found
SWWM_SUBS_DEFAULT_NFINDSECRET = "13";
-SWWM_SUBS_DEFAULT_FINDSECRET1 = "Yeah, yeah, I'm the best.";
-SWWM_SUBS_DEFAULT_FINDSECRET2 = "It's true. I do know my shit.";
-SWWM_SUBS_DEFAULT_FINDSECRET3 = "What can I say? I'm good at what I do.";
-SWWM_SUBS_DEFAULT_FINDSECRET4 = "It was no big deal.";
-SWWM_SUBS_DEFAULT_FINDSECRET5 = "No trouble at all.";
-SWWM_SUBS_DEFAULT_FINDSECRET6 = "It was easy.";
-SWWM_SUBS_DEFAULT_FINDSECRET7 = "Thanks to me, yes.";
-SWWM_SUBS_DEFAULT_FINDSECRET8 = "It was a walk in the park.";
-SWWM_SUBS_DEFAULT_FINDSECRET9 = "It was a piece of cake.";
-SWWM_SUBS_DEFAULT_FINDSECRET10 = "I still got it.";
-SWWM_SUBS_DEFAULT_FINDSECRET11 = "I did good work, didn't I?";
-SWWM_SUBS_DEFAULT_FINDSECRET12 = "Wow, that's pretty lucky!";
-SWWM_SUBS_DEFAULT_FINDSECRET13 = "Yeah, well, I am pretty awesome.";
+SWWM_SUBS_DEFAULT_FINDSECRET1 = "Oh, that was a secret?";
+SWWM_SUBS_DEFAULT_FINDSECRET2 = "Yeah, I'm pretty cool.";
+SWWM_SUBS_DEFAULT_FINDSECRET3 = "Hahaha... That wasn't such a big deal.";
+SWWM_SUBS_DEFAULT_FINDSECRET4 = "Yeah, no trouble at all.";
+SWWM_SUBS_DEFAULT_FINDSECRET5 = "Easy peasy.";
+SWWM_SUBS_DEFAULT_FINDSECRET6 = "Easy as pie.";
+SWWM_SUBS_DEFAULT_FINDSECRET7 = "Yup, it's all me.";
+SWWM_SUBS_DEFAULT_FINDSECRET8 = "Really got that one.";
+SWWM_SUBS_DEFAULT_FINDSECRET9 = "Yeah, I'm quite the fortune finder.";
+SWWM_SUBS_DEFAULT_FINDSECRET10 = "Oh I got this.";
+SWWM_SUBS_DEFAULT_FINDSECRET11 = "That was good, wasn't it?";
+SWWM_SUBS_DEFAULT_FINDSECRET12 = "Lucky me, huh?";
+SWWM_SUBS_DEFAULT_FINDSECRET13 = "Well, I mean, I'm pretty good at this.";
// frag taunts
-SWWM_SUBS_DEFAULT_NSCOREKILL = "26";
-SWWM_SUBS_DEFAULT_SCOREKILL1 = "Good riddance.";
-SWWM_SUBS_DEFAULT_SCOREKILL2 = "One down.";
-SWWM_SUBS_DEFAULT_SCOREKILL3 = "Goodbye.";
-SWWM_SUBS_DEFAULT_SCOREKILL4 = "Heh! You can't stop me.";
-SWWM_SUBS_DEFAULT_SCOREKILL5 = "What a loser.";
-SWWM_SUBS_DEFAULT_SCOREKILL6 = "We're done.";
-SWWM_SUBS_DEFAULT_SCOREKILL7 = "Bye.";
-SWWM_SUBS_DEFAULT_SCOREKILL8 = "Dead as can be.";
-SWWM_SUBS_DEFAULT_SCOREKILL9 = "Another job done.";
-SWWM_SUBS_DEFAULT_SCOREKILL10 = "The pleasure was all mine.";
-SWWM_SUBS_DEFAULT_SCOREKILL11 = "How about something a little more challenging next time?";
-SWWM_SUBS_DEFAULT_SCOREKILL12 = "I'm glad that's over with.";
-SWWM_SUBS_DEFAULT_SCOREKILL13 = "Well, it's over. That's that.";
-SWWM_SUBS_DEFAULT_SCOREKILL14 = "It's done.";
-SWWM_SUBS_DEFAULT_SCOREKILL15 = "Get lost.";
-SWWM_SUBS_DEFAULT_SCOREKILL16 = "Is that all?";
-SWWM_SUBS_DEFAULT_SCOREKILL17 = "Is that the best you can do?";
-SWWM_SUBS_DEFAULT_SCOREKILL18 = "You annoy me.";
-SWWM_SUBS_DEFAULT_SCOREKILL19 = "Going to have to try harder than that.";
-SWWM_SUBS_DEFAULT_SCOREKILL20 = "What? That it?";
-SWWM_SUBS_DEFAULT_SCOREKILL21 = "Get outta here.";
-SWWM_SUBS_DEFAULT_SCOREKILL22 = "My pleasure.";
+SWWM_SUBS_DEFAULT_NSCOREKILL = "25";
+SWWM_SUBS_DEFAULT_SCOREKILL1 = "Get out.";
+SWWM_SUBS_DEFAULT_SCOREKILL2 = "One done.";
+SWWM_SUBS_DEFAULT_SCOREKILL3 = "Bye bye.";
+SWWM_SUBS_DEFAULT_SCOREKILL4 = "That's another one.";
+SWWM_SUBS_DEFAULT_SCOREKILL5 = "Not even a challenge.";
+SWWM_SUBS_DEFAULT_SCOREKILL6 = "Done and done.";
+SWWM_SUBS_DEFAULT_SCOREKILL7 = "See ya.";
+SWWM_SUBS_DEFAULT_SCOREKILL8 = "Another one dead.";
+SWWM_SUBS_DEFAULT_SCOREKILL9 = "Easy job.";
+SWWM_SUBS_DEFAULT_SCOREKILL10 = "The pleasure is mine.";
+SWWM_SUBS_DEFAULT_SCOREKILL11 = "Try harder next time.";
+SWWM_SUBS_DEFAULT_SCOREKILL12 = "Well, that's over.";
+SWWM_SUBS_DEFAULT_SCOREKILL13 = "Another one bites the dust ♪";
+SWWM_SUBS_DEFAULT_SCOREKILL14 = "Done.";
+SWWM_SUBS_DEFAULT_SCOREKILL15 = "Yeah, just die.";
+SWWM_SUBS_DEFAULT_SCOREKILL16 = "Huh? That was it?";
+SWWM_SUBS_DEFAULT_SCOREKILL17 = "Wow, what a weakling...";
+SWWM_SUBS_DEFAULT_SCOREKILL18 = "Just get out of here, you're annoying.";
+SWWM_SUBS_DEFAULT_SCOREKILL19 = "Gonna need more than that to take me down.";
+SWWM_SUBS_DEFAULT_SCOREKILL20 = "Huh? Dead already?";
+SWWM_SUBS_DEFAULT_SCOREKILL21 = "Fuck off.";
+SWWM_SUBS_DEFAULT_SCOREKILL22 = "You're welcome.";
SWWM_SUBS_DEFAULT_SCOREKILL23 = "Out of my way.";
-SWWM_SUBS_DEFAULT_SCOREKILL24 = "Get outta my way.";
-SWWM_SUBS_DEFAULT_SCOREKILL25 = "Want some more?";
-SWWM_SUBS_DEFAULT_SCOREKILL26 = "Done and done.";
+SWWM_SUBS_DEFAULT_SCOREKILL24 = "Here's your special serving of DIE.";
+SWWM_SUBS_DEFAULT_SCOREKILL25 = "Want more?";
// oopsies
SWWM_SUBS_DEFAULT_NFRIENDKILL = "4";
-SWWM_SUBS_DEFAULT_FRIENDKILL1 = "Oh my god.";
-SWWM_SUBS_DEFAULT_FRIENDKILL2 = "My god. I'm so sorry.";
-SWWM_SUBS_DEFAULT_FRIENDKILL3 = "Oh god...";
-SWWM_SUBS_DEFAULT_FRIENDKILL4 = "Oh my god. Are you alright?";
+SWWM_SUBS_DEFAULT_FRIENDKILL1 = "Oh no! No no no no I'm sorry oh my god!";
+SWWM_SUBS_DEFAULT_FRIENDKILL2 = "Oh my god! I'm so sorry...";
+SWWM_SUBS_DEFAULT_FRIENDKILL3 = "Oh... no...";
+SWWM_SUBS_DEFAULT_FRIENDKILL4 = "Oh my god no no no please...";
// getting hurt by monsters
SWWM_SUBS_DEFAULT_NGETHIT = "19";
-SWWM_SUBS_DEFAULT_GETHIT1 = "Whatever...";
+SWWM_SUBS_DEFAULT_GETHIT1 = "Ow! Fuck you!";
SWWM_SUBS_DEFAULT_GETHIT2 = "*sigh*";
-SWWM_SUBS_DEFAULT_GETHIT3 = "Hm hmm.";
-SWWM_SUBS_DEFAULT_GETHIT4 = "Bitch.";
-SWWM_SUBS_DEFAULT_GETHIT5 = "Asshole...";
-SWWM_SUBS_DEFAULT_GETHIT6 = "You annoy me.";
-SWWM_SUBS_DEFAULT_GETHIT7 = "Up yours.";
-SWWM_SUBS_DEFAULT_GETHIT8 = "You got my attention.";
-SWWM_SUBS_DEFAULT_GETHIT9 = "I'm ending this right now.";
-SWWM_SUBS_DEFAULT_GETHIT10 = "You're a pain in the ass.";
-SWWM_SUBS_DEFAULT_GETHIT11 = "That's bullshit.";
-SWWM_SUBS_DEFAULT_GETHIT12 = "Are you serious?";
-SWWM_SUBS_DEFAULT_GETHIT13 = "Going to have to try harder than that.";
-SWWM_SUBS_DEFAULT_GETHIT14 = "Get outta here.";
-SWWM_SUBS_DEFAULT_GETHIT15 = "And now it's your turn.";
-SWWM_SUBS_DEFAULT_GETHIT16 = "Time to shut you up for good.";
-SWWM_SUBS_DEFAULT_GETHIT17 = "You're not leaving here in one piece.";
-SWWM_SUBS_DEFAULT_GETHIT18 = "You're obviously upset...";
-SWWM_SUBS_DEFAULT_GETHIT19 = "Ugh. Just... go away.";
+SWWM_SUBS_DEFAULT_GETHIT3 = "Yeah, lucky hit. Now die.";
+SWWM_SUBS_DEFAULT_GETHIT4 = "Oh, you fucker.";
+SWWM_SUBS_DEFAULT_GETHIT5 = "How dare you...";
+SWWM_SUBS_DEFAULT_GETHIT6 = "Oh, you'll regret that.";
+SWWM_SUBS_DEFAULT_GETHIT7 = "Yeah? Well fuck you too.";
+SWWM_SUBS_DEFAULT_GETHIT8 = "Alright, now you have my attention.";
+SWWM_SUBS_DEFAULT_GETHIT9 = "This ends now.";
+SWWM_SUBS_DEFAULT_GETHIT10 = "You're pissing me off.";
+SWWM_SUBS_DEFAULT_GETHIT11 = "That's a load of ass (and not the good kind).";
+SWWM_SUBS_DEFAULT_GETHIT12 = "Seriously?";
+SWWM_SUBS_DEFAULT_GETHIT13 = "Just a scratch.";
+SWWM_SUBS_DEFAULT_GETHIT14 = "Oh, fuck off.";
+SWWM_SUBS_DEFAULT_GETHIT15 = "And now it's your turn...";
+SWWM_SUBS_DEFAULT_GETHIT16 = "You are already dead...";
+SWWM_SUBS_DEFAULT_GETHIT17 = "You're not getting out of here alive.";
+SWWM_SUBS_DEFAULT_GETHIT18 = "Okay, I get it.";
+SWWM_SUBS_DEFAULT_GETHIT19 = "Ugh! Just... fuck... off...";
// getting hurt by friendlies
SWWM_SUBS_DEFAULT_NFRIENDHIT = "7";
-SWWM_SUBS_DEFAULT_FRIENDHIT1 = "Are you ticked off at me?";
-SWWM_SUBS_DEFAULT_FRIENDHIT2 = "Are you serious?";
-SWWM_SUBS_DEFAULT_FRIENDHIT3 = "What? Why?";
-SWWM_SUBS_DEFAULT_FRIENDHIT4 = "That's awfully rude.";
-SWWM_SUBS_DEFAULT_FRIENDHIT5 = "Sorry, what?";
-SWWM_SUBS_DEFAULT_FRIENDHIT6 = "Not very friendly, are you?";
-SWWM_SUBS_DEFAULT_FRIENDHIT7 = "Whoa, whoa. Easy there.";
+SWWM_SUBS_DEFAULT_FRIENDHIT1 = "Hey what was that about?";
+SWWM_SUBS_DEFAULT_FRIENDHIT2 = "What are you doing?";
+SWWM_SUBS_DEFAULT_FRIENDHIT3 = "Huh? Why?";
+SWWM_SUBS_DEFAULT_FRIENDHIT4 = "Wow, rude!";
+SWWM_SUBS_DEFAULT_FRIENDHIT5 = "Excuse me?";
+SWWM_SUBS_DEFAULT_FRIENDHIT6 = "Well that wasn't very cash money of you...";
+SWWM_SUBS_DEFAULT_FRIENDHIT7 = "Hey! What are you doing?";
// hurting a friendly
SWWM_SUBS_DEFAULT_NHITFRIEND = "3";
-SWWM_SUBS_DEFAULT_HITFRIEND1 = "I... sorry.";
-SWWM_SUBS_DEFAULT_HITFRIEND2 = "I'm sorry.";
-SWWM_SUBS_DEFAULT_HITFRIEND3 = "Sorry.";
+SWWM_SUBS_DEFAULT_HITFRIEND1 = "Ah... Sorry!";
+SWWM_SUBS_DEFAULT_HITFRIEND2 = "Sorry!";
+SWWM_SUBS_DEFAULT_HITFRIEND3 = "My bad!";
// greeting another player
SWWM_SUBS_DEFAULT_NGREET = "7";
-SWWM_SUBS_DEFAULT_GREET1 = "Hi.";
-SWWM_SUBS_DEFAULT_GREET2 = "Hey there.";
-SWWM_SUBS_DEFAULT_GREET3 = "Hey.";
+SWWM_SUBS_DEFAULT_GREET1 = "Oh, hi.";
+SWWM_SUBS_DEFAULT_GREET2 = "Hello.";
+SWWM_SUBS_DEFAULT_GREET3 = "Hello there.";
SWWM_SUBS_DEFAULT_GREET4 = "Hey.";
-SWWM_SUBS_DEFAULT_GREET5 = "Hey.";
-SWWM_SUBS_DEFAULT_GREET6 = "Well hello.";
+SWWM_SUBS_DEFAULT_GREET5 = "'sup.";
+SWWM_SUBS_DEFAULT_GREET6 = "Hi.";
SWWM_SUBS_DEFAULT_GREET7 = "Hi there.";
// ragekit
-SWWM_SUBS_DEFAULT_NRAGEKIT = "6";
-SWWM_SUBS_DEFAULT_RAGEKIT1 = "AAAAAAAAAAAAAAAAAAAAAA!!!!!";
-SWWM_SUBS_DEFAULT_RAGEKIT2 = "FFFFFFUUUUUUUUUUUCKKKK!!!";
-SWWM_SUBS_DEFAULT_RAGEKIT3 = "FUCKFUCKFUCCKKKK!!";
+SWWM_SUBS_DEFAULT_NRAGEKIT = "17";
+SWWM_SUBS_DEFAULT_RAGEKIT1 = "AGH SHIT FUCK FUCK FUCK!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT2 = "FUCKDAMNITFUCK!";
+SWWM_SUBS_DEFAULT_RAGEKIT3 = "NNGNGNGHHHHFUCCCCKKKKK!!!";
SWWM_SUBS_DEFAULT_RAGEKIT4 = "AAAAAAAAAARGH!!!!";
-SWWM_SUBS_DEFAULT_RAGEKIT5 = "KILLLLL!!!!";
-SWWM_SUBS_DEFAULT_RAGEKIT6 = "RAAAARGH!!! BRING IT!!!";
-// --- comebacks for korax hub lines ---
+SWWM_SUBS_DEFAULT_RAGEKIT5 = "FUCKSHITDAMNFUCKFUCK!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT6 = "RAAAAAGHNGGHNHHGGAAAAAGGH!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT7 = "FFFFFFFUUUUUUUUUCCCCCKKK!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT8 = "FUCK SHIT FUCK PISS ASS FUCK!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT9 = "ASSFUCKINGFUCKPISSFUCKSHIT!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT10 = "GODFUCKDAMNSHITFUCKKKK!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT11 = "DEATH!!! DESTRUCTION!!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT12 = "YOUREALLFUCKINGDEAD!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT13 = "RRRGGHHH!!! KILLLLLLLLL!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT14 = "UUUUURRRRGGGGHHH!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT15 = "AAAAAAARGHGGGH!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT16 = "FUCKFUCKFUCKFUCKFUUUUUCKKKK!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT17 = "FUCKYOUFUCKYOUFUCKYOUUUUUU!!!";
// "Greetings mortal, are you ready to die?"
SWWM_SUBS_DEFAULT_NKORAXGREET = "13";
-SWWM_SUBS_DEFAULT_KORAXGREET1 = "Oh boy. That's it. I'm outta here";
-SWWM_SUBS_DEFAULT_KORAXGREET2 = "Great... That's just great.";
-SWWM_SUBS_DEFAULT_KORAXGREET3 = "I don't want whatever you're selling.";
-SWWM_SUBS_DEFAULT_KORAXGREET4 = "You're... not really my type.";
-SWWM_SUBS_DEFAULT_KORAXGREET5 = "The first word that comes to my mind is 'ugly'.";
-SWWM_SUBS_DEFAULT_KORAXGREET6 = "You look like something that was left in the fridge for too long.";
-SWWM_SUBS_DEFAULT_KORAXGREET7 = "I can see coming here was a mistake.";
-SWWM_SUBS_DEFAULT_KORAXGREET8 = "I'm not comfortable being watched so closely.";
-SWWM_SUBS_DEFAULT_KORAXGREET9 = "Nice attitude...";
-SWWM_SUBS_DEFAULT_KORAXGREET10 = "I could ask you the same question.";
-SWWM_SUBS_DEFAULT_KORAXGREET11 = "I was about to ask you the same thing.";
-SWWM_SUBS_DEFAULT_KORAXGREET12 = "I'm just looking for the mayonnaise. Maybe you could grab it for me. Second shelf, right next to the pudding.";
-SWWM_SUBS_DEFAULT_KORAXGREET13 = "I'm here to pick up an order. Two large pepperoni and a calzone. Name is 'Fuck you'.";
+SWWM_SUBS_DEFAULT_KORAXGREET1 = "Uhhhh... Is that a trick question?";
+SWWM_SUBS_DEFAULT_KORAXGREET2 = "Oh, great... This is so great...";
+SWWM_SUBS_DEFAULT_KORAXGREET3 = "Well, are you?";
+SWWM_SUBS_DEFAULT_KORAXGREET4 = "Ugh... Please don't get so close.";
+SWWM_SUBS_DEFAULT_KORAXGREET5 = "Wow... Real ugly bastard.";
+SWWM_SUBS_DEFAULT_KORAXGREET6 = "I don't even know where to begin with how hideous you are.";
+SWWM_SUBS_DEFAULT_KORAXGREET7 = "Ew, what the hell... You actually look like that?";
+SWWM_SUBS_DEFAULT_KORAXGREET8 = "Uhhhhhhhh... Excuse me?";
+SWWM_SUBS_DEFAULT_KORAXGREET9 = "Well that's not a friendly greeting.";
+SWWM_SUBS_DEFAULT_KORAXGREET10 = "You know, I could ask you the same question.";
+SWWM_SUBS_DEFAULT_KORAXGREET11 = "I was about to ask you that, actually.";
+SWWM_SUBS_DEFAULT_KORAXGREET12 = "Well, I'm ready to kick your ass, so there's that.";
+SWWM_SUBS_DEFAULT_KORAXGREET13 = "Nah, but I'm ready to dine. You know any good pizza places around here?";
// "My servants can smell your blood, human"
SWWM_SUBS_DEFAULT_NKORAXBLOOD = "13";
-SWWM_SUBS_DEFAULT_KORAXBLOOD1 = "Creep.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD2 = "That's good to know.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD3 = "Whatever you say.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD1 = "Blood? What blood?";
+SWWM_SUBS_DEFAULT_KORAXBLOOD2 = "Nah, you must be mistaken. My blood's currently in my other body.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD3 = "Yeah, yeah, whatever...";
SWWM_SUBS_DEFAULT_KORAXBLOOD4 = "I don't think so.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD5 = "Um... yeah... I don't think so...";
-SWWM_SUBS_DEFAULT_KORAXBLOOD6 = "If you say so.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD5 = "Um... You are aware I don't have any, right?";
+SWWM_SUBS_DEFAULT_KORAXBLOOD6 = "Well, if you say so...";
SWWM_SUBS_DEFAULT_KORAXBLOOD7 = "I don't care.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD8 = "Whatever. Not like I care anyway.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD9 = "I don't really give a shit.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD10 = "Like I give a shit...";
-SWWM_SUBS_DEFAULT_KORAXBLOOD11 = "I think you're confusing me with someone who gives a shit.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD12 = "I'm not so sure about that.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD13 = "Just shut up.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD8 = "Is that supposed to be a threat? Because it's not working.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD9 = "Well, I can smell them pissing themselves in fear. And boy did I not want to know what that smells like.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD10 = "I don't give a single flying fuck, dude.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD11 = "I think you're confusing me with someone else.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD12 = "... Are you sure about that?";
+SWWM_SUBS_DEFAULT_KORAXBLOOD13 = "Uhhhhh... What?";
// "You have played this game too long, mortal, I think I shall remove you from the board"
SWWM_SUBS_DEFAULT_NKORAXGAME = "14";
-SWWM_SUBS_DEFAULT_KORAXGAME1 = "I really don't care.";
-SWWM_SUBS_DEFAULT_KORAXGAME2 = "Go fuck yourself.";
-SWWM_SUBS_DEFAULT_KORAXGAME3 = "Oh, go cough up a hairball.";
-SWWM_SUBS_DEFAULT_KORAXGAME4 = "Not gonna happen.";
-SWWM_SUBS_DEFAULT_KORAXGAME5 = "Your threats don't scare me.";
-SWWM_SUBS_DEFAULT_KORAXGAME6 = "Not a chance.";
-SWWM_SUBS_DEFAULT_KORAXGAME7 = "I don't take kindly to threats.";
-SWWM_SUBS_DEFAULT_KORAXGAME8 = "Anything else I should know?";
-SWWM_SUBS_DEFAULT_KORAXGAME9 = "Shut up...";
-SWWM_SUBS_DEFAULT_KORAXGAME10 = "No one talks to me like that. Screw you.";
-SWWM_SUBS_DEFAULT_KORAXGAME11 = "You won't talk when you're dead.";
-SWWM_SUBS_DEFAULT_KORAXGAME12 = "I'd like to see you try.";
-SWWM_SUBS_DEFAULT_KORAXGAME13 = "Oh, please try.";
-SWWM_SUBS_DEFAULT_KORAXGAME14 = "I don't know what you're talking about, and I don't care.";
+SWWM_SUBS_DEFAULT_KORAXGAME1 = "Ohhhh... Not if I remove your face first.";
+SWWM_SUBS_DEFAULT_KORAXGAME2 = "Well, fuck you.";
+SWWM_SUBS_DEFAULT_KORAXGAME3 = "We ain't playing chess here.";
+SWWM_SUBS_DEFAULT_KORAXGAME4 = "I don't think so, ugly boy. I'll play all I want.";
+SWWM_SUBS_DEFAULT_KORAXGAME5 = "You trying to scare me or something?";
+SWWM_SUBS_DEFAULT_KORAXGAME6 = "Oh I'm so going to enjoy shutting you up.";
+SWWM_SUBS_DEFAULT_KORAXGAME7 = "Oh, you're so dead when I find you.";
+SWWM_SUBS_DEFAULT_KORAXGAME8 = "Really? And how are you going to do that exactly?";
+SWWM_SUBS_DEFAULT_KORAXGAME9 = "Please just shut up...";
+SWWM_SUBS_DEFAULT_KORAXGAME10 = "Oh, screw you. You ain't the boss here.";
+SWWM_SUBS_DEFAULT_KORAXGAME11 = "Yeah, keep speaking nonsense...";
+SWWM_SUBS_DEFAULT_KORAXGAME12 = "Oh, go and try. See what happens.";
+SWWM_SUBS_DEFAULT_KORAXGAME13 = "I'd love to see you try, ugly boy.";
+SWWM_SUBS_DEFAULT_KORAXGAME14 = "I have no idea what you're talking about and I don't care.";
// "Worship me and I may be yet merciful, then again, maybe not"
SWWM_SUBS_DEFAULT_NKORAXWORSHIP = "11";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP1 = "What?";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP2 = "What a scumbag...";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP3 = "Pompous ass...";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP4 = "Someone's a little full of himself.";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP5 = "So full of yourself...";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP6 = "I've heard enough of your bullshit.";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP1 = "... What?";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP2 = "Sorry, ugly bastards are not my type.";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP3 = "Ohhhhh, you almost got me there... NOT!";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP4 = "Like I'd do that. Fuck you.";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP5 = "Psch... What a monumental idiot...";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP6 = "Yeah yeah, whatever, more stupid shit...";
SWWM_SUBS_DEFAULT_KORAXWORSHIP7 = "Blah, blah, blah...";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP8 = "What? I can't hear you over this ringing in my ears.";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP9 = "You must think I'm an idiot.";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP10 = "Do I look like an idiot?";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP11 = "You have an awfully high opinion of yourself.";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP8 = "Sorry, can't hear you over the sound of how much of an idiot you are.";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP9 = "The hell are you smoking?";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP10 = "What, you think you're some kind of god now?";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP11 = "Just shut up. I don't care.";
// "Are you strong enough to face your own masters?"
SWWM_SUBS_DEFAULT_NKORAXMASTERS = "9";
-SWWM_SUBS_DEFAULT_KORAXMASTERS1 = "Can we move this along? I've got places to be.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS2 = "I don't appreciate people telling me what to do.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS3 = "Uh... yes, that's right.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS4 = "Suppose I've got nothing better to do.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS5 = "I'm asking myself the same thing.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS6 = "None of your damn business.";
+SWWM_SUBS_DEFAULT_KORAXMASTERS1 = "I'm strong enough to beat your sorry ass.";
+SWWM_SUBS_DEFAULT_KORAXMASTERS2 = "I don't care.";
+SWWM_SUBS_DEFAULT_KORAXMASTERS3 = "Yeah, I probably can.";
+SWWM_SUBS_DEFAULT_KORAXMASTERS4 = "Well, if you insist...";
+SWWM_SUBS_DEFAULT_KORAXMASTERS5 = "I seriously think you got me mistaken for someone else, dude.";
+SWWM_SUBS_DEFAULT_KORAXMASTERS6 = "Yes... yes, that's right.";
SWWM_SUBS_DEFAULT_KORAXMASTERS7 = "Yes, I am.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS8 = "That's none of your business.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS9 = "Just shut up already...";
+SWWM_SUBS_DEFAULT_KORAXMASTERS8 = "And why do you care?";
+SWWM_SUBS_DEFAULT_KORAXMASTERS9 = "Urgh... Please just shut the fuck up.";
+/// Extra lines that wouldn't be possible without original voice acting
+// per-weapon lines (alternative)
+SWWM_SUBS_DEFAULT_GETDEEPIMPACT = "I'll huff and I'll puff... and I'll blow your house in.";
+SWWM_SUBS_DEFAULT_GETPUSHERWEAPON = "Anyone wants their cavities removed?";
+SWWM_SUBS_DEFAULT_GETEXPLODIUMGUN1 = "Ah, my trusty old friend.";
+SWWM_SUBS_DEFAULT_GETEXPLODIUMGUN2 = "Twice the knee-exploding power.";
+SWWM_SUBS_DEFAULT_GETSPREADGUN = "Look at this pocket shotty.";
+SWWM_SUBS_DEFAULT_GETWALLBUSTER = "25 barrels, more than enough to bust everything.";
+SWWM_SUBS_DEFAULT_GETEVISCERATOR = "Flak cannon!";
+SWWM_SUBS_DEFAULT_GETHELLBLAZER = "Time to blaze some hell... heh.";
+SWWM_SUBS_DEFAULT_GETSPARKSTER = "Hello, sparky boy. Let's have some fun.";
+SWWM_SUBS_DEFAULT_GETSILVERBULLET = "Now THIS is a weapon.";
+SWWM_SUBS_DEFAULT_GETCANDYGUN = "Sweet... and lethal.";
+SWWM_SUBS_DEFAULT_GETYNYKRON = "Time to go supernova on these suckers.";
+SWWM_SUBS_DEFAULT_GETITAMEXHAMMER = "I'll hammer you all into shape.";
+SWWM_SUBS_DEFAULT_GETPLASMABLAST1 = "Blastin' plasma.";
+SWWM_SUBS_DEFAULT_GETPLASMABLAST2 = "Now we're talking. Double the fun.";
+SWWM_SUBS_DEFAULT_GETPUNTZERBETA = "Gonna drill some sense into y'all."; // said with a cheap cowboy accent
+SWWM_SUBS_DEFAULT_GETPUNTZERGAMMA = "Full auto and... fuller auto? Oh my...";
+SWWM_SUBS_DEFAULT_GETHEAVYMAHSHEENGUN = "Heavy Machine Gun!";
+SWWM_SUBS_DEFAULT_GETQUADRAVOL = "For the flames of the Ardent Cross spread throughout the horde...";
+SWWM_SUBS_DEFAULT_GETNEWSPARKSTER = "I like big plasma weapons.";
+SWWM_SUBS_DEFAULT_GETMORTALRIFLE = "Welcome aboard, Mister.";
+SWWM_SUBS_DEFAULT_GETRAYKHOM = "The absolute GIRTH of this thing, damn...";
+SWWM_SUBS_DEFAULT_GETRAFANKOS = "Ultimate... I like the sound of that.";
+// key received
+SWWM_SUBS_DEFAULT_NKEYGET = "5";
+SWWM_SUBS_DEFAULT_KEYGET1 = "Got ya.";
+SWWM_SUBS_DEFAULT_KEYGET2 = "Got the key.";
+SWWM_SUBS_DEFAULT_KEYGET3 = "Hm, shiny.";
+SWWM_SUBS_DEFAULT_KEYGET4 = "I'll be needing this one.";
+SWWM_SUBS_DEFAULT_KEYGET5 = "Who's got the key? I've got the key.";
+// use fail (randomly plays after humping walls too often)
+SWWM_SUBS_DEFAULT_NUSEFAIL = "9";
+SWWM_SUBS_DEFAULT_USEFAIL1 = "Nope.";
+SWWM_SUBS_DEFAULT_USEFAIL2 = "Nothing here.";
+SWWM_SUBS_DEFAULT_USEFAIL3 = "Hmmmm...";
+SWWM_SUBS_DEFAULT_USEFAIL4 = "No worky.";
+SWWM_SUBS_DEFAULT_USEFAIL5 = "Still nothing.";
+SWWM_SUBS_DEFAULT_USEFAIL6 = "Where is it...?";
+SWWM_SUBS_DEFAULT_USEFAIL7 = "Open sesame?";
+SWWM_SUBS_DEFAULT_USEFAIL8 = "That won't work.";
+SWWM_SUBS_DEFAULT_USEFAIL9 = "Yup, nothing.";
+// collectible received
+SWWM_SUBS_DEFAULT_CUBEGET = "Cube...";
+SWWM_SUBS_DEFAULT_AKARIGET = "Really ought to give this a read sometime.";
+SWWM_SUBS_DEFAULT_SIGNALSGET = "Ahhh... Meido-chan's singing, so good~";
+SWWM_SUBS_DEFAULT_NUTATCOGET = "NUTATCO?";
+SWWM_SUBS_DEFAULT_FRISPYGET = "*giggle* Sayacchi's top snack.";
+SWWM_SUBS_DEFAULT_SAYAGET = "Squishy bean...";
+SWWM_SUBS_DEFAULT_MOTHGET = "Ah, Sayacchi's waifu.";
+SWWM_SUBS_DEFAULT_DEMOGET = "Hehehe, my own plushie.";
+SWWM_SUBS_DEFAULT_PEACHGET = "Wait, this is... *snicker*";
+SWWM_SUBS_DEFAULT_BREADGET = "Soft, squishy buns...";
+SWWM_SUBS_DEFAULT_MANGAGET = "Subtle, Sayacchi. Very subtle...";
+SWWM_SUBS_DEFAULT_KIRINGET = "Kirin-kun~";
+// *ungodly screeching*
+SWWM_SUBS_DEFAULT_NKORAX = "9";
+SWWM_SUBS_DEFAULT_KORAX1 = "Oh my god you're even uglier in person!";
+SWWM_SUBS_DEFAULT_KORAX2 = "Ah, the ugly bastard in the flesh.";
+SWWM_SUBS_DEFAULT_KORAX3 = "The fuck is that? Did you fuse with your serpent or something?";
+SWWM_SUBS_DEFAULT_KORAX4 = "Well guess who's getting swept off the board today...";
+SWWM_SUBS_DEFAULT_KORAX5 = "Wow, that's an edgy look.";
+SWWM_SUBS_DEFAULT_KORAX6 = "No offense, but you look like a shitty fantasy monster.";
+SWWM_SUBS_DEFAULT_KORAX7 = "Yeah yeah, *screeeeeeee* to you too."; // use a robot-filtered version of Korax's sight sound there
+SWWM_SUBS_DEFAULT_KORAX8 = "What, not much of a talker in person, are ya?";
+SWWM_SUBS_DEFAULT_KORAX9 = "Oh, so that rancid smell was you, after all.";
+// "!oremoR nhoJ ,em llik tsum uoy emag eht niw oT"
+SWWM_SUBS_DEFAULT_NROMERO = "8";
+SWWM_SUBS_DEFAULT_ROMERO1 = "What?";
+SWWM_SUBS_DEFAULT_ROMERO2 = "Sorry, I don't speak whatever language that is.";
+SWWM_SUBS_DEFAULT_ROMERO3 = "That's a big boy alright...";
+SWWM_SUBS_DEFAULT_ROMERO4 = "Don't worry, I'll make it quick.";
+SWWM_SUBS_DEFAULT_ROMERO5 = "That's a big hole you got in there, mind if I shoot into it?";
+SWWM_SUBS_DEFAULT_ROMERO6 = "Dude, are you okay? Your brains are leaking something.";
+SWWM_SUBS_DEFAULT_ROMERO7 = "Final boss time, huh?";
+SWWM_SUBS_DEFAULT_ROMERO8 = ".oremoR nhoJ ,anatakiaD emag ruoy evol I";
+// "Foolish mortal, only your death is eternal!"
+SWWM_SUBS_DEFAULT_NARCHANGELUS = "8";
+SWWM_SUBS_DEFAULT_ARCHANGELUS1 = "... Huh?";
+SWWM_SUBS_DEFAULT_ARCHANGELUS2 = "Foolish is the fool who calls others foolish, fool.";
+SWWM_SUBS_DEFAULT_ARCHANGELUS3 = "What's gonna be eternal will be the ass kicking I'll give you.";
+SWWM_SUBS_DEFAULT_ARCHANGELUS4 = "Nice costume, did your mom make it for you?";
+SWWM_SUBS_DEFAULT_ARCHANGELUS5 = "Aw, look at you with your fancy lil' wings and everything.";
+SWWM_SUBS_DEFAULT_ARCHANGELUS6 = "Yeah yeah, it's always the same with you people.";
+SWWM_SUBS_DEFAULT_ARCHANGELUS7 = "Boy, you people really go hard on the pretend-god bullshit, huh?";
+SWWM_SUBS_DEFAULT_ARCHANGELUS8 = "I think I'm going to have to beat some sense into you.";
+// "hself ruoy erutrot lliw I" (supposedly)
+SWWM_SUBS_DEFAULT_NDSPARILA = "3";
+SWWM_SUBS_DEFAULT_DSPARILA1 = "Oh look at you, little red riding hood.";
+SWWM_SUBS_DEFAULT_DSPARILA2 = "How about you get down from that thing and we have a talk?";
+SWWM_SUBS_DEFAULT_DSPARILA3 = "I'm gonna wipe the floor with you, nerd.";
+SWWM_SUBS_DEFAULT_NDSPARILB = "3";
+SWWM_SUBS_DEFAULT_DSPARILB1 = "What's with you people and backwards speech?";
+SWWM_SUBS_DEFAULT_DSPARILB2 = "Sorry, could you repeat that?";
+SWWM_SUBS_DEFAULT_DSPARILB3 = ".oot sdrawkcab klat nac I"; // record this line normally then just reverse it, really
+// (H-Doom compat) Demon girl petting
+SWWM_SUBS_DEFAULT_NPETHDOOM = "9";
+SWWM_SUBS_DEFAULT_PETHDOOM1 = "That's a good girl~";
+SWWM_SUBS_DEFAULT_PETHDOOM2 = "Hey, there's no need to fight.";
+SWWM_SUBS_DEFAULT_PETHDOOM3 = "I'm not going to hurt you.";
+SWWM_SUBS_DEFAULT_PETHDOOM4 = "There, there...";
+SWWM_SUBS_DEFAULT_PETHDOOM5 = "It's okay, I'm your friend.";
+SWWM_SUBS_DEFAULT_PETHDOOM6 = "Calm down, everything's fine.";
+SWWM_SUBS_DEFAULT_PETHDOOM7 = "You're so cute~";
+SWWM_SUBS_DEFAULT_PETHDOOM8 = "Hehe... Your hair is so fluffy~";
+SWWM_SUBS_DEFAULT_PETHDOOM9 = "Good girl... Good girl...";
+// (H-Doom compat) Aroused demon girl petting
+SWWM_SUBS_DEFAULT_NPETHDOOMFINISH = "9";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH1 = "You really like being pet, don't you?";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH2 = "There, it's all good...";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH3 = "Getting off to my headpats, are you now?";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH4 = "I can do this much, at least.";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH5 = "It feels good, doesn't it?";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH6 = "A gentle touch is all you need~";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH7 = "Call me later, okay?";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH8 = "My, my... You're blushing so much...";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH9 = "Hehe... You're welcome, anytime.";
+// White Lady petting
+SWWM_SUBS_DEFAULT_NPETMASHIRO = "7";
+SWWM_SUBS_DEFAULT_PETMASHIRO1 = "Fluffy moth...";
+SWWM_SUBS_DEFAULT_PETMASHIRO2 = "You like my lamp, don't you?";
+SWWM_SUBS_DEFAULT_PETMASHIRO3 = "You're so pretty~";
+SWWM_SUBS_DEFAULT_PETMASHIRO4 = "Thanks for your help, miss.";
+SWWM_SUBS_DEFAULT_PETMASHIRO5 = "There... good girl...";
+SWWM_SUBS_DEFAULT_PETMASHIRO6 = "Hehe... cute moth girl~";
+SWWM_SUBS_DEFAULT_PETMASHIRO7 = "Good friend~";
+// Button pushing
+SWWM_SUBS_DEFAULT_NBUTTONPUSH = "3";
+SWWM_SUBS_DEFAULT_BUTTONPUSH1 = "Beep.";
+SWWM_SUBS_DEFAULT_BUTTONPUSH2 = "Boop.";
+SWWM_SUBS_DEFAULT_BUTTONPUSH3 = "Bop.";
+// Fall "scream"
+SWWM_SUBS_DEFAULT_FALLING = "Wheeeeeeeeeee~!";
+//// LEGACY VOICE - Fallout 4 JP Sole Survivor
+SWWM_VOICENAME_LEGACY = "Classic";
+// new weapon received
+SWWM_SUBS_LEGACY_NGETWEAPON = "13";
+SWWM_SUBS_LEGACY_GETWEAPON1 = "Not bad... Not bad at all...";
+SWWM_SUBS_LEGACY_GETWEAPON2 = "Good find...";
+SWWM_SUBS_LEGACY_GETWEAPON3 = "Mine now...";
+SWWM_SUBS_LEGACY_GETWEAPON4 = "Nice...";
+SWWM_SUBS_LEGACY_GETWEAPON5 = "Bingo...";
+SWWM_SUBS_LEGACY_GETWEAPON6 = "Hell yeah...";
+SWWM_SUBS_LEGACY_GETWEAPON7 = "Excellent...";
+SWWM_SUBS_LEGACY_GETWEAPON8 = "Yes...";
+SWWM_SUBS_LEGACY_GETWEAPON9 = "There we go...";
+SWWM_SUBS_LEGACY_GETWEAPON10 = "Perfect...";
+SWWM_SUBS_LEGACY_GETWEAPON11 = "I like it...";
+SWWM_SUBS_LEGACY_GETWEAPON12 = "That looks nice...";
+SWWM_SUBS_LEGACY_GETWEAPON13 = "It's probably worth a fortune...";
+// locked door
+SWWM_SUBS_LEGACY_NLOCKED = "4";
+SWWM_SUBS_LEGACY_LOCKED1 = "Don't have the key.";
+SWWM_SUBS_LEGACY_LOCKED2 = "Only opens with a key.";
+SWWM_SUBS_LEGACY_LOCKED3 = "Would need the key.";
+SWWM_SUBS_LEGACY_LOCKED4 = "Locked tight.";
+// jammed door (strife)
+SWWM_SUBS_LEGACY_NJAMMED = "4";
+SWWM_SUBS_LEGACY_JAMMED1 = "It's stuck.";
+SWWM_SUBS_LEGACY_JAMMED2 = "No use.";
+SWWM_SUBS_LEGACY_JAMMED3 = "Jammed.";
+SWWM_SUBS_LEGACY_JAMMED4 = "Useless.";
+// puzzle item failure
+SWWM_SUBS_LEGACY_NPUZZFAIL = "6";
+SWWM_SUBS_LEGACY_PUZZFAIL1 = "Damn.";
+SWWM_SUBS_LEGACY_PUZZFAIL2 = "Damn it.";
+SWWM_SUBS_LEGACY_PUZZFAIL3 = "No good.";
+SWWM_SUBS_LEGACY_PUZZFAIL4 = "Nope.";
+SWWM_SUBS_LEGACY_PUZZFAIL5 = "Uh uh.";
+SWWM_SUBS_LEGACY_PUZZFAIL6 = "Hmmm.";
+// puzzle item success
+SWWM_SUBS_LEGACY_NPUZZSUCC = "5";
+SWWM_SUBS_LEGACY_PUZZSUCC1 = "Nice.";
+SWWM_SUBS_LEGACY_PUZZSUCC2 = "That's it.";
+SWWM_SUBS_LEGACY_PUZZSUCC3 = "Got it.";
+SWWM_SUBS_LEGACY_PUZZSUCC4 = "Yes.";
+SWWM_SUBS_LEGACY_PUZZSUCC5 = "Sweet.";
+// first enemy encounter (20 seconds cooldown since all enemies dead)
+SWWM_SUBS_LEGACY_NFIGHTSTART = "21";
+SWWM_SUBS_LEGACY_FIGHTSTART1 = "Here we go again.";
+SWWM_SUBS_LEGACY_FIGHTSTART2 = "Let's get this show on the road.";
+SWWM_SUBS_LEGACY_FIGHTSTART3 = "Time to die.";
+SWWM_SUBS_LEGACY_FIGHTSTART4 = "Bring it on.";
+SWWM_SUBS_LEGACY_FIGHTSTART5 = "You are all going to die.";
+SWWM_SUBS_LEGACY_FIGHTSTART6 = "I've been spoiling for a fight.";
+SWWM_SUBS_LEGACY_FIGHTSTART7 = "Let's do this.";
+SWWM_SUBS_LEGACY_FIGHTSTART8 = "Time to get crazy! Kill 'em all!";
+SWWM_SUBS_LEGACY_FIGHTSTART9 = "You really don't want to start a fight with me.";
+SWWM_SUBS_LEGACY_FIGHTSTART10 = "Let's get on with it.";
+SWWM_SUBS_LEGACY_FIGHTSTART11 = "Kill!";
+SWWM_SUBS_LEGACY_FIGHTSTART12 = "This won't be hard.";
+SWWM_SUBS_LEGACY_FIGHTSTART13 = "Let's do it.";
+SWWM_SUBS_LEGACY_FIGHTSTART14 = "Let's do this.";
+SWWM_SUBS_LEGACY_FIGHTSTART15 = "Let's just get this over with.";
+SWWM_SUBS_LEGACY_FIGHTSTART16 = "Well, this will be an interesting challenge.";
+SWWM_SUBS_LEGACY_FIGHTSTART17 = "Okay. Let's get started.";
+SWWM_SUBS_LEGACY_FIGHTSTART18 = "Oh, this is just what I need right now...";
+SWWM_SUBS_LEGACY_FIGHTSTART19 = "Time to put on a show.";
+SWWM_SUBS_LEGACY_FIGHTSTART20 = "I'm putting you down.";
+SWWM_SUBS_LEGACY_FIGHTSTART21 = "Oh, good. Here I was afraid I'd have nothing to do.";
+// played at map start
+SWWM_SUBS_LEGACY_NMAPSTART = "14";
+SWWM_SUBS_LEGACY_MAPSTART1 = "Ugh... this place smells horrible.";
+SWWM_SUBS_LEGACY_MAPSTART2 = "Okay, let's get to work.";
+SWWM_SUBS_LEGACY_MAPSTART3 = "Let's hurry this up.";
+SWWM_SUBS_LEGACY_MAPSTART4 = "This place is all kinds of strange.";
+SWWM_SUBS_LEGACY_MAPSTART5 = "I was born ready.";
+SWWM_SUBS_LEGACY_MAPSTART6 = "It's a hard world. I do what I have to.";
+SWWM_SUBS_LEGACY_MAPSTART7 = "No robot is superior to me.";
+SWWM_SUBS_LEGACY_MAPSTART8 = "I've seen better.";
+SWWM_SUBS_LEGACY_MAPSTART9 = "Okay. Let's head in.";
+SWWM_SUBS_LEGACY_MAPSTART10 = "I don't want any trouble. I'm just passing through.";
+SWWM_SUBS_LEGACY_MAPSTART11 = "Sorry to keep you waiting.";
+SWWM_SUBS_LEGACY_MAPSTART12 = "I'll do my best.";
+SWWM_SUBS_LEGACY_MAPSTART13 = "Just so we're clear: Anything good I find is mine.";
+SWWM_SUBS_LEGACY_MAPSTART14 = "I bet the food here is terrible.";
+// every time a secret is found
+SWWM_SUBS_LEGACY_NFINDSECRET = "13";
+SWWM_SUBS_LEGACY_FINDSECRET1 = "Yeah, yeah, I'm the best.";
+SWWM_SUBS_LEGACY_FINDSECRET2 = "It's true. I do know my shit.";
+SWWM_SUBS_LEGACY_FINDSECRET3 = "What can I say? I'm good at what I do.";
+SWWM_SUBS_LEGACY_FINDSECRET4 = "It was no big deal.";
+SWWM_SUBS_LEGACY_FINDSECRET5 = "No trouble at all.";
+SWWM_SUBS_LEGACY_FINDSECRET6 = "It was easy.";
+SWWM_SUBS_LEGACY_FINDSECRET7 = "Thanks to me, yes.";
+SWWM_SUBS_LEGACY_FINDSECRET8 = "It was a walk in the park.";
+SWWM_SUBS_LEGACY_FINDSECRET9 = "It was a piece of cake.";
+SWWM_SUBS_LEGACY_FINDSECRET10 = "I still got it.";
+SWWM_SUBS_LEGACY_FINDSECRET11 = "I did good work, didn't I?";
+SWWM_SUBS_LEGACY_FINDSECRET12 = "Wow, that's pretty lucky!";
+SWWM_SUBS_LEGACY_FINDSECRET13 = "Yeah, well, I am pretty awesome.";
+// frag taunts
+SWWM_SUBS_LEGACY_NSCOREKILL = "26";
+SWWM_SUBS_LEGACY_SCOREKILL1 = "Good riddance.";
+SWWM_SUBS_LEGACY_SCOREKILL2 = "One down.";
+SWWM_SUBS_LEGACY_SCOREKILL3 = "Goodbye.";
+SWWM_SUBS_LEGACY_SCOREKILL4 = "Heh! You can't stop me.";
+SWWM_SUBS_LEGACY_SCOREKILL5 = "What a loser.";
+SWWM_SUBS_LEGACY_SCOREKILL6 = "We're done.";
+SWWM_SUBS_LEGACY_SCOREKILL7 = "Bye.";
+SWWM_SUBS_LEGACY_SCOREKILL8 = "Dead as can be.";
+SWWM_SUBS_LEGACY_SCOREKILL9 = "Another job done.";
+SWWM_SUBS_LEGACY_SCOREKILL10 = "The pleasure was all mine.";
+SWWM_SUBS_LEGACY_SCOREKILL11 = "How about something a little more challenging next time?";
+SWWM_SUBS_LEGACY_SCOREKILL12 = "I'm glad that's over with.";
+SWWM_SUBS_LEGACY_SCOREKILL13 = "Well, it's over. That's that.";
+SWWM_SUBS_LEGACY_SCOREKILL14 = "It's done.";
+SWWM_SUBS_LEGACY_SCOREKILL15 = "Get lost.";
+SWWM_SUBS_LEGACY_SCOREKILL16 = "Is that all?";
+SWWM_SUBS_LEGACY_SCOREKILL17 = "Is that the best you can do?";
+SWWM_SUBS_LEGACY_SCOREKILL18 = "You annoy me.";
+SWWM_SUBS_LEGACY_SCOREKILL19 = "Going to have to try harder than that.";
+SWWM_SUBS_LEGACY_SCOREKILL20 = "What? That it?";
+SWWM_SUBS_LEGACY_SCOREKILL21 = "Get outta here.";
+SWWM_SUBS_LEGACY_SCOREKILL22 = "My pleasure.";
+SWWM_SUBS_LEGACY_SCOREKILL23 = "Out of my way.";
+SWWM_SUBS_LEGACY_SCOREKILL24 = "Get outta my way.";
+SWWM_SUBS_LEGACY_SCOREKILL25 = "Want some more?";
+SWWM_SUBS_LEGACY_SCOREKILL26 = "Done and done.";
+// oopsies
+SWWM_SUBS_LEGACY_NFRIENDKILL = "4";
+SWWM_SUBS_LEGACY_FRIENDKILL1 = "Oh my god.";
+SWWM_SUBS_LEGACY_FRIENDKILL2 = "My god. I'm so sorry.";
+SWWM_SUBS_LEGACY_FRIENDKILL3 = "Oh god...";
+SWWM_SUBS_LEGACY_FRIENDKILL4 = "Oh my god. Are you alright?";
+// getting hurt by monsters
+SWWM_SUBS_LEGACY_NGETHIT = "19";
+SWWM_SUBS_LEGACY_GETHIT1 = "Whatever...";
+SWWM_SUBS_LEGACY_GETHIT2 = "*sigh*";
+SWWM_SUBS_LEGACY_GETHIT3 = "Hm hmm.";
+SWWM_SUBS_LEGACY_GETHIT4 = "Bitch.";
+SWWM_SUBS_LEGACY_GETHIT5 = "Asshole...";
+SWWM_SUBS_LEGACY_GETHIT6 = "You annoy me.";
+SWWM_SUBS_LEGACY_GETHIT7 = "Up yours.";
+SWWM_SUBS_LEGACY_GETHIT8 = "You got my attention.";
+SWWM_SUBS_LEGACY_GETHIT9 = "I'm ending this right now.";
+SWWM_SUBS_LEGACY_GETHIT10 = "You're a pain in the ass.";
+SWWM_SUBS_LEGACY_GETHIT11 = "That's bullshit.";
+SWWM_SUBS_LEGACY_GETHIT12 = "Are you serious?";
+SWWM_SUBS_LEGACY_GETHIT13 = "Going to have to try harder than that.";
+SWWM_SUBS_LEGACY_GETHIT14 = "Get outta here.";
+SWWM_SUBS_LEGACY_GETHIT15 = "And now it's your turn.";
+SWWM_SUBS_LEGACY_GETHIT16 = "Time to shut you up for good.";
+SWWM_SUBS_LEGACY_GETHIT17 = "You're not leaving here in one piece.";
+SWWM_SUBS_LEGACY_GETHIT18 = "You're obviously upset...";
+SWWM_SUBS_LEGACY_GETHIT19 = "Ugh. Just... go away.";
+// getting hurt by friendlies
+SWWM_SUBS_LEGACY_NFRIENDHIT = "7";
+SWWM_SUBS_LEGACY_FRIENDHIT1 = "Are you ticked off at me?";
+SWWM_SUBS_LEGACY_FRIENDHIT2 = "Are you serious?";
+SWWM_SUBS_LEGACY_FRIENDHIT3 = "What? Why?";
+SWWM_SUBS_LEGACY_FRIENDHIT4 = "That's awfully rude.";
+SWWM_SUBS_LEGACY_FRIENDHIT5 = "Sorry, what?";
+SWWM_SUBS_LEGACY_FRIENDHIT6 = "Not very friendly, are you?";
+SWWM_SUBS_LEGACY_FRIENDHIT7 = "Whoa, whoa. Easy there.";
+// hurting a friendly
+SWWM_SUBS_LEGACY_NHITFRIEND = "3";
+SWWM_SUBS_LEGACY_HITFRIEND1 = "I... sorry.";
+SWWM_SUBS_LEGACY_HITFRIEND2 = "I'm sorry.";
+SWWM_SUBS_LEGACY_HITFRIEND3 = "Sorry.";
+// greeting another player
+SWWM_SUBS_LEGACY_NGREET = "7";
+SWWM_SUBS_LEGACY_GREET1 = "Hi.";
+SWWM_SUBS_LEGACY_GREET2 = "Hey there.";
+SWWM_SUBS_LEGACY_GREET3 = "Hey.";
+SWWM_SUBS_LEGACY_GREET4 = "Hey.";
+SWWM_SUBS_LEGACY_GREET5 = "Hey.";
+SWWM_SUBS_LEGACY_GREET6 = "Well hello.";
+SWWM_SUBS_LEGACY_GREET7 = "Hi there.";
+// ragekit
+SWWM_SUBS_LEGACY_NRAGEKIT = "6";
+SWWM_SUBS_LEGACY_RAGEKIT1 = "AAAAAAAAAAAAAAAAAAAAAA!!!!!";
+SWWM_SUBS_LEGACY_RAGEKIT2 = "FFFFFFUUUUUUUUUUUCKKKK!!!";
+SWWM_SUBS_LEGACY_RAGEKIT3 = "FUCKFUCKFUCCKKKK!!";
+SWWM_SUBS_LEGACY_RAGEKIT4 = "AAAAAAAAAARGH!!!!";
+SWWM_SUBS_LEGACY_RAGEKIT5 = "KILLLLL!!!!";
+SWWM_SUBS_LEGACY_RAGEKIT6 = "RAAAARGH!!! BRING IT!!!";
+// --- comebacks for korax hub lines ---
+// "Greetings mortal, are you ready to die?"
+SWWM_SUBS_LEGACY_NKORAXGREET = "13";
+SWWM_SUBS_LEGACY_KORAXGREET1 = "Oh boy. That's it. I'm outta here";
+SWWM_SUBS_LEGACY_KORAXGREET2 = "Great... That's just great.";
+SWWM_SUBS_LEGACY_KORAXGREET3 = "I don't want whatever you're selling.";
+SWWM_SUBS_LEGACY_KORAXGREET4 = "You're... not really my type.";
+SWWM_SUBS_LEGACY_KORAXGREET5 = "The first word that comes to my mind is 'ugly'.";
+SWWM_SUBS_LEGACY_KORAXGREET6 = "You look like something that was left in the fridge for too long.";
+SWWM_SUBS_LEGACY_KORAXGREET7 = "I can see coming here was a mistake.";
+SWWM_SUBS_LEGACY_KORAXGREET8 = "I'm not comfortable being watched so closely.";
+SWWM_SUBS_LEGACY_KORAXGREET9 = "Nice attitude...";
+SWWM_SUBS_LEGACY_KORAXGREET10 = "I could ask you the same question.";
+SWWM_SUBS_LEGACY_KORAXGREET11 = "I was about to ask you the same thing.";
+SWWM_SUBS_LEGACY_KORAXGREET12 = "I'm just looking for the mayonnaise. Maybe you could grab it for me. Second shelf, right next to the pudding.";
+SWWM_SUBS_LEGACY_KORAXGREET13 = "I'm here to pick up an order. Two large pepperoni and a calzone. Name is 'Fuck you'.";
+// "My servants can smell your blood, human"
+SWWM_SUBS_LEGACY_NKORAXBLOOD = "13";
+SWWM_SUBS_LEGACY_KORAXBLOOD1 = "Creep.";
+SWWM_SUBS_LEGACY_KORAXBLOOD2 = "That's good to know.";
+SWWM_SUBS_LEGACY_KORAXBLOOD3 = "Whatever you say.";
+SWWM_SUBS_LEGACY_KORAXBLOOD4 = "I don't think so.";
+SWWM_SUBS_LEGACY_KORAXBLOOD5 = "Um... yeah... I don't think so...";
+SWWM_SUBS_LEGACY_KORAXBLOOD6 = "If you say so.";
+SWWM_SUBS_LEGACY_KORAXBLOOD7 = "I don't care.";
+SWWM_SUBS_LEGACY_KORAXBLOOD8 = "Whatever. Not like I care anyway.";
+SWWM_SUBS_LEGACY_KORAXBLOOD9 = "I don't really give a shit.";
+SWWM_SUBS_LEGACY_KORAXBLOOD10 = "Like I give a shit...";
+SWWM_SUBS_LEGACY_KORAXBLOOD11 = "I think you're confusing me with someone who gives a shit.";
+SWWM_SUBS_LEGACY_KORAXBLOOD12 = "I'm not so sure about that.";
+SWWM_SUBS_LEGACY_KORAXBLOOD13 = "Just shut up.";
+// "You have played this game too long, mortal, I think I shall remove you from the board"
+SWWM_SUBS_LEGACY_NKORAXGAME = "14";
+SWWM_SUBS_LEGACY_KORAXGAME1 = "I really don't care.";
+SWWM_SUBS_LEGACY_KORAXGAME2 = "Go fuck yourself.";
+SWWM_SUBS_LEGACY_KORAXGAME3 = "Oh, go cough up a hairball.";
+SWWM_SUBS_LEGACY_KORAXGAME4 = "Not gonna happen.";
+SWWM_SUBS_LEGACY_KORAXGAME5 = "Your threats don't scare me.";
+SWWM_SUBS_LEGACY_KORAXGAME6 = "Not a chance.";
+SWWM_SUBS_LEGACY_KORAXGAME7 = "I don't take kindly to threats.";
+SWWM_SUBS_LEGACY_KORAXGAME8 = "Anything else I should know?";
+SWWM_SUBS_LEGACY_KORAXGAME9 = "Shut up...";
+SWWM_SUBS_LEGACY_KORAXGAME10 = "No one talks to me like that. Screw you.";
+SWWM_SUBS_LEGACY_KORAXGAME11 = "You won't talk when you're dead.";
+SWWM_SUBS_LEGACY_KORAXGAME12 = "I'd like to see you try.";
+SWWM_SUBS_LEGACY_KORAXGAME13 = "Oh, please try.";
+SWWM_SUBS_LEGACY_KORAXGAME14 = "I don't know what you're talking about, and I don't care.";
+// "Worship me and I may be yet merciful, then again, maybe not"
+SWWM_SUBS_LEGACY_NKORAXWORSHIP = "11";
+SWWM_SUBS_LEGACY_KORAXWORSHIP1 = "What?";
+SWWM_SUBS_LEGACY_KORAXWORSHIP2 = "What a scumbag...";
+SWWM_SUBS_LEGACY_KORAXWORSHIP3 = "Pompous ass...";
+SWWM_SUBS_LEGACY_KORAXWORSHIP4 = "Someone's a little full of himself.";
+SWWM_SUBS_LEGACY_KORAXWORSHIP5 = "So full of yourself...";
+SWWM_SUBS_LEGACY_KORAXWORSHIP6 = "I've heard enough of your bullshit.";
+SWWM_SUBS_LEGACY_KORAXWORSHIP7 = "Blah, blah, blah...";
+SWWM_SUBS_LEGACY_KORAXWORSHIP8 = "What? I can't hear you over this ringing in my ears.";
+SWWM_SUBS_LEGACY_KORAXWORSHIP9 = "You must think I'm an idiot.";
+SWWM_SUBS_LEGACY_KORAXWORSHIP10 = "Do I look like an idiot?";
+SWWM_SUBS_LEGACY_KORAXWORSHIP11 = "You have an awfully high opinion of yourself.";
+// "Are you strong enough to face your own masters?"
+SWWM_SUBS_LEGACY_NKORAXMASTERS = "9";
+SWWM_SUBS_LEGACY_KORAXMASTERS1 = "Can we move this along? I've got places to be.";
+SWWM_SUBS_LEGACY_KORAXMASTERS2 = "I don't appreciate people telling me what to do.";
+SWWM_SUBS_LEGACY_KORAXMASTERS3 = "Uh... yes, that's right.";
+SWWM_SUBS_LEGACY_KORAXMASTERS4 = "Suppose I've got nothing better to do.";
+SWWM_SUBS_LEGACY_KORAXMASTERS5 = "I'm asking myself the same thing.";
+SWWM_SUBS_LEGACY_KORAXMASTERS6 = "None of your damn business.";
+SWWM_SUBS_LEGACY_KORAXMASTERS7 = "Yes, I am.";
+SWWM_SUBS_LEGACY_KORAXMASTERS8 = "That's none of your business.";
+SWWM_SUBS_LEGACY_KORAXMASTERS9 = "Just shut up already...";
diff --git a/language.es_base b/language.es_base
index f6e16cf6a..bedf919b0 100644
--- a/language.es_base
+++ b/language.es_base
@@ -25,11 +25,6 @@ I_PUNTZERGAMMA = "Carabina de Asalto Puntzer \"Gamma\"";
T_SHEENHMG = "Ametralladora Sheen";
I_SHEENHMG = "Ametralladora Pesada \"Sheen\"";
I_QUADRAVOL = "Lanzador de Bolas de Fuego \"Quadravol\"";
-T_BLACKFIRE = "Encendedor de Fuego Negro";
-T_EMPCARBINE = "Carabina Raíl";
-I_EMPCARBINE = "Carabina Raíl EMP";
-T_GRANDLANCE = "Gran Lanza";
-T_FISTGUN = "Mano Divina";
T_NEWSPARKSTER = "Rifle Sparkster";
I_NEWSPARKSTER = "Rifle Sparkster Serie x3";
T_MORTALRIFLE = "Rifle Mortal";
@@ -88,20 +83,6 @@ T_SHEENBULLET = "Bala 14.5x114mm MT";
T_SHEENBULLETS = "Balas 14.5x114mm MT";
T_QUADAMMO = "Célula de Quadravol";
T_QUADAMMOS = "Células de Quadravol";
-T_DARKAMMO = "Frasco de Fuego Negro";
-T_DARKAMMOS = "Frascos de Fuego Negro";
-T_EMPCORE = "Barra de Dysedum";
-T_EMPCORES = "Barras de Dysedum";
-T_RAYBOLT = "Proyectil de Ray-Khom";
-T_RAYBOLTS = "Proyectiles de Ray-Khom";
-T_RAYAMMO = "Cargador de Ray-Khom";
-T_RAYAMMOS = "Cargadores de Ray-Khom";
-T_RAYBATTERY = "Batería de Ray-Khom";
-T_RAYBATTERYS = "Baterías de Ray-Khom";
-T_GRANDSPEAR = "Arpón de Gran Lanza";
-T_GRANDSPEARS = "Arpones de Gran Lanza";
-T_GRANDAMMO = "Cargador de Gran Lanza";
-T_GRANDAMMOS = "Cargadores de Gran Lanza";
T_SPARKBAMMO = "Célula de Kinylum";
T_SPARKBAMMOS = "Células de Kinylum";
T_SPARKRAMMO = "Célula de Nokron";
@@ -112,6 +93,12 @@ T_MRAMMO = "Cargador Mortal";
T_MRAMMOS = "Cargadores Mortales";
T_MRGRENADE = "Granada Mortal";
T_MRGRENADES = "Granadas Mortales";
+T_RAYBOLT = "Proyectil de Ray-Khom";
+T_RAYBOLTS = "Proyectiles de Ray-Khom";
+T_RAYAMMO = "Cargador de Ray-Khom";
+T_RAYAMMOS = "Cargadores de Ray-Khom";
+T_RAYBATTERY = "Batería de Ray-Khom";
+T_RAYBATTERYS = "Baterías de Ray-Khom";
T_ULTIMATEPOD = "Cápsula de Rafan-Kos";
T_ULTIMATEPODS = "Cápsulas de Rafan-Kos";
T_ULTIMATEAMMO = "Cargador de Rafan-Kos";
@@ -158,12 +145,7 @@ T_MILKBREAD = "Pan de Leche Akkouxhei";
T_KIRINMANGA = "Saya Miyamoto - Me Casé Con Un Emperador Virgen Pero Resulta Que Es Monísimo Con Lencería?!";
T_KIRINPLUSH = "Peluche de Emperador Kirin";
T_MOTHPLUSH = "Peluche de Mashiro";
-T_AA12 = "Réplica de Auto Assault-12";
-T_HEGE = "Cactus Hege";
-T_HOAGIE = "Emparedado";
-T_IBUKIMILK = "Leche 100% Natural de Oni Rojo de Akari Labs";
-T_MANAROKOU = "Manaroca";
-T_LITHIUM = "Lithium - Volumen Uno";
+T_SAYASMUG = "Taza de Café de Saya";
// colored tags for keys
T_REDCARD = "\cgTarjeta Llave Roja\c-";
T_BLUECARD = "\chTarjeta Llave Azul\c-";
@@ -203,7 +185,7 @@ TXT_DEFAULTPICKUPMSG = "Ítem No Identificado";
QUITMSG = "¿En serio quieres irte?\nPues que pena...";
QUITMSG1 = "Wow, pero no te vayas aun,\n¡quedan muchas cosas que hacer!";
QUITMSG2 = "¿Oh, te marchas ya? Pues nada,\nnos vemos luego, supongo.";
-QUITMSG3 = "Gracias por jugar a \cySWWM GZ\c-.\nEspero volverte a ver pronto.";
+QUITMSG3 = "Gracias por jugar.\nEspero volverte a ver pronto.";
QUITMSG5 = "Ah, se acabó la fiesta, supongo...";
QUITMSG6 = "Mi amor por ti es como un camión.\n\cg!!BERSERKER!!\c-";
QUITMSG7 = "No te vayas ahora, o \cfSaya\c- hablará\nmal de ti en Twitter punto com.";
@@ -283,6 +265,7 @@ FN_ARCH_FUN2 = "Marsianito";
FN_ARCH_FUN3 = "No gracias";
FN_ARCH_FUN4 = "Te jodes";
FN_ARCH_FUN5 = "Tu día ha sido arruinado";
+FN_ARCH_FUN6 = "Nalgas Ardientes";
FN_SPIDER_FUN1 = "Mami araña";
FN_SPIDER_FUN2 = "Tu puta madre";
FN_SPIDER_FUN3 = "Krang en grande";
@@ -367,6 +350,7 @@ FN_HERESIARCH_FUN = "Hostia Puta";
FN_BOSSBRAIN_FUN = "¡ESPERABAS A JOHN ROMERO PERO ERA YO, MARISA!";
FN_KEEN_FUN = "Arruinado por Bethesda";
FN_VOODOO = "Muñeco Vudú de %s";
+FN_VOODOO_NP = "Muñeco Vudú";
FN_PIG = "Cerdo";
FN_PIG_FUN = "Cochinillo";
FN_WOLFGUARD_FUN1 = "Nazi de Bajo Presupuesto";
@@ -428,18 +412,11 @@ O_PUNTZERGAMMA = "%k taladró varios agujeros a través de %o.";
O_SHEENHMG = "%k ahogó a %o en balas.";
O_QUADRAVOL = "%k hizo deliciosa barbacoa de %o.";
O_QUADRAVOL2 = "%o fue ensartad@[ao_esp] por %k.";
-O_BLACKFIRE = "%k convirtió a %o en un helado.";
-O_BLACKFIRE2 = "%o fue empalado muy fríamente por %k.";
-O_EMPCARBINE = "%o quedó en shock tras presenciar los poderes de rayo de %k.";
-O_RAYKHOM = "%o recibió un envío exprés de plasma mortal de parte de %k.";
-O_RAYKHOM2 = "%o presenció el PODER ILIMITADO de %k.";
-O_GRANDLANCE = "%o fue despedazad@[ao_esp] por la Gran Lanza de %k.";
-O_GRANDLANCE2 = "%k mostró a %o lo eficiente que es la fusión nuclear.";
-O_FISTGUN = "%o se tragó el sándwich de puño divino de %k.";
-O_FISTGUN2 = "%k le mandó un guantazo divino a %o.";
O_NEWSPARKSTER = "%o fue testigo del poder de la artillería de plasma de %k.";
O_MORTALRIFLE = "%k mató a %o bien muert@[ao_esp].";
O_MORTALRIFLEALT = "%o atrapó una granada muy mortal de %k.";
+O_RAYKHOM = "%o recibió un envío exprés de plasma mortal de parte de %k.";
+O_RAYKHOM2 = "%o presenció el PODER ILIMITADO de %k.";
O_RAFANKOS = "%o no pudo hacer nada contra el arma definitiva de %k.";
O_POUND = "%o se llevó una gran impresión del aterrizaje de %k.";
O_DASH = "%o fue descuajeringad@[ao_esp] a todo gas por %k.";
@@ -471,7 +448,7 @@ OB_SPLASH = "%o casi que se puso demasiado cerca de eso.";
OB_R_SPLASH = "%o hizo un Icarus.";
OB_ROCKET = "%o se comió un cohete.";
OB_KILLEDSELF = "%o se autodestruyó.";
-OB_VOODOO = "%o violó las leyes de la causalidad.";
+OB_VOODOO = "%o no debería haber tocado ese muñeco.";
OB_MPTELEFRAG = "%k sobrescribió a %o.";
OB_MONTELEFRAG = "%o fue sobrescrit@[ao_esp].";
OB_DEFAULT = "%o hizo plaf.";
@@ -580,29 +557,43 @@ D_TETHERFAIL = "El vínculo del Enlace de Seguridad fue obstruído.";
D_MASHIRO = "\cjSabe donde estás...\c-";
SWWM_YNYKRONREADY = "Artefacto Ynykron listo para disparar.";
SWWM_SWAPWEAPON = "\cjPulsa \cfUsar\cj para cambiar \cf%s\cj por \cf%s\cj.\c-";
+SWWM_TITLEPRESENTSB = "presenta";
SWWM_TITLEPRESENTS = "presenta";
+SWWM_TITLEMODBYA = "un mod de";
SWWM_TITLEMODBY = "un mod de \cxMarisa Kirisame";
-SWWM_TITLESCROLL = "SWWM GZ ~ Cute Robutt Whomst Love To Explode Demons\n"
-"Un maravilleante mod de gameplay para GZDoom por Marisa Kirisame de UnSX Team\n"
-"Modelos 3D diseñados con cariño con texturas pintadas a mano de 256 colores con dithering\n"
-"Casi 60 mil líneas de ZScript, y aun contando (dios me ayude)\n"
-"El lore más profundo a este lado del Modiverso de Doom\n"
-"¡Y mucho mucho más!\nSaludos a Mub, Ribbed, Slemg, Bunr, Kegbine, Term-kun, Hype64, Bartendy, Skelly, Mr. BIG SHOT WildWeasel, Endy, Mima-sama, Sinkie, BillowPlaster, Disgusting Dog Water, Dangle Logo, Lämp Paipu, Leek Spah, Boingy, MarTREE, Dusty Demon Bread, Roasted Rock, Ed the Netcode Boy, Thirst Cactus, JimJam, Cappy Jay, A Nom, Missy Fits, Minor Cookie, Squid Kid, YukiCute, MafSulk, FineRaff25, NetroRutcase, ShudTheFugUpRyan, Kobl, Cacous Seriodemon, Zomb, Man of Chins, Bun Pun, Zikeous Shadestructor, Blimyot, Baja Blast Tittums, DrySpy.py, Typo Gem, Wantopus, Morf, Daedalus, Popato, SpengRob, Sgt. Shellpost, Loud M, Snk, Donut, C.Kid, Emit Birb, You Go To Sleep, Rach, Le No Chicken, Murasa, Smart Cactus Dude, Phantomboobs, Sanae Kochiya, Gardeboy, Cat, HK417, Smol Koa, Joe Mama, Jahn, Guta, Glue, Atan, Schweet Prints, Angury Teeth Practitioner, Sell Her, MiSiFu, Portuguese Sausage, Scoob Stub, Actually Jabba, Very Honest Cat, Chiaki's Tit Mole, Homie, Snacks, Tubz, Toof, Teef, Frisp, Trashkat, Succ 'n Spicy, Melissa Follower When, Shokku, Scummyboi, Kat Gravity Rush, John Romero, John Carmack, Tim Allen, Tim Sweeney y por último pero no menos importante mi querido dragón mascota\n"
-"He intentado estrujar todos los nombres que he podido ahí, que haya podido recordar, por lo menos, así que si no estás ahí y quieres entrar, solo pídelo\n"
-"Ya no queda nada más que ver aquí, el scroll ahora hará bucle, see you again, have a nice day";
+SWWM_TITLEINTROA = "Ese día, la humanidad se vió en peligro, enfrentándose a su propia perdición.";
+SWWM_TITLEINTROB = "Pero una máquina se alzó, decidida a luchar, y poner fin a toda esta invasión.";
+SWWM_TITLEINTROC = "Los demonios aprenderían a temer la máquina, la cual conocen por un solo nombre...";
+SWWM_TITLESCROLL2 = "Un maravilleante mod de gameplay para GZDoom por Marisa Kirisame de UnSX Team";
+SWWM_TITLESCROLL3 = "Modelos 3D diseñados con cariño con texturas pintadas a mano de 256 colores con dithering";
+SWWM_TITLESCROLL4 = "Más de 60 mil líneas de ZScript, y aun contando (dios me ayude)";
+SWWM_TITLESCROLL5 = "El lore más profundo a este lado del Modiverso de Doom";
+SWWM_TITLESCROLL6 = "¡Y mucho mucho más!";
+SWWM_TITLESCROLL7 = "Saludos a Mub, Ribbed, Slemg, Bunr, Kegbine, Term-kun, Hype64, Bartendy, Skelly, Mr. BIG SHOT WildWeasel, Endy, Mima-sama, Sinkie, BillowPlaster, Disgusting Dog Water, Dangle Logo, Lämp Paipu, Leek Spah, Boingy, MarTREE, Dusty Demon Bread, Roasted Rock, Ed the Netcode Boy, Thirst Cactus, JimJam, Cappy Jay, A Nom, Missy Fits, Minor Cookie, Squid Kid, YukiCute, MafSulk, FineRaff25, NetroRutcase, ShudTheFugUpRyan, Kobl, Cacous Seriodemon, Zomb, Man of Chins, Bun Pun, Zikeous Shadestructor, Blimyot, Baja Blast Tittums, DrySpy.py, Typo Gem, Wantopus, Morf, Daedalus, Popato, SpengRob, Sgt. Shellpost, Loud M, Snk, Donut, C.Kid, Emit Birb, You Go To Sleep, Rach, Le No Chicken, Murasa, Smart Cactus Dude, Phantomboobs, Sanae Kochiya, Gardeboy, Cat, HK417, Smol Koa, Joe Mama, Jahn, Guta, Glue, Atan, Schweet Prints, Angury Teeth Practitioner, Sell Her, MiSiFu, Portuguese Sausage, Scoob Stub, Actually Jabba, Very Honest Cat, Chiaki's Tit Mole, Homie, Snacks, Tubz, Toof, Teef, Frisp, Trashkat, Succ 'n Spicy, Melissa Follower When, Shokku, Scummyboi, Kat Gravity Rush, John Romero, John Carmack, Tim Allen, Tim Sweeney y por último pero no menos importante mi querido dragón mascota";
+SWWM_TITLESCROLL8 = "He intentado estrujar todos los nombres que he podido ahí, que haya podido recordar, por lo menos, así que si no estás ahí y quieres entrar, solo pídelo";
+SWWM_TITLESCROLL9 = "Ya no queda nada más que ver aquí, el scroll ahora hará bucle, see you again, have a nice day";
+SWWM_TITLESUB1 = "El Mundo Está En Peligro Y Acabamos De Mandar\nEste Robot Culogordo Guasón Para Salvarlo!?";
+SWWM_TITLESUB3 = "El mod anteriormente conocido como SWWM GZ";
+SWWM_TITLESUB4 = "Lo siento mucho, Icarus, pero ya\nno puedes llamarlo Swim Jizz";
+SWWM_TITLESUB5 = "¿Te gustan las armas? ¡Tenemos armas!\n¡Armas grandes! ¡Armas pequeñas! ¡Todas las armas!";
+SWWM_TITLESUB6 = "¡Con tecnología revolucionaria de Brillantes Nalgas Metálicas!";
+SWWM_TITLESUB7 = "Este no es el típico mod de gameplay, no señor";
+SWWM_TITLESUB8 = "Las desaventuras de un robot graciosillo\ny todos sus juguetes explosivos";
+SWWM_TITLESUB9 = "Presentando a Dante de la serie Devil May Cry\n(bueno no, es broma)";
+SWWM_TITLESUB10 = "";
+SWWM_TITLESUB11 = "¿Slaughterwads demasiado difíciles? ¡No hay problema!\n¡Solo tienes que jugarlos con este mod!";
+SWWM_TITLESUB12 = " ¿Sabías que este subtítulo está desencuadrado?";
+SWWM_TITLESUB13 = "Me gustan las grandes explosiones y no puedo mentir";
+SWWM_TITLESUB14 = "Si las gafas son buenas para la vista,\n¿por que no llevan lentes?";
SWWM_YOURSELF = "Tú";
SWWM_DOKIDOKI = "El Poder del Amor™";
SWWM_GRAVKILL = "Gravedad";
SWWM_PARRYKILL = "Proyectiles Devueltos";
-SWWM_SETSLOTSTRICT = "\cg!!!ADVERTENCIA!!!\c-\n\cj\"setslotstrict\" está activado. Esto causará que las armas de SWWM GZ no tengan ranuras asignadas. Por favor, ve a Opciones Misceláneas y cambia la opción de \"KEYCONF de Armas/Jugadores estricto\".\c-";
+SWWM_SETSLOTSTRICT = "\cg!!!ADVERTENCIA!!!\c-\n\cj\"setslotstrict\" está activado. Esto causará que las armas del mod no tengan ranuras asignadas. Por favor, ve a Opciones Misceláneas y cambia la opción de \"KEYCONF de Armas/Jugadores estricto\".\c-";
SWWM_WIDESPREAD = "Modo Amplio";
SWWM_TIGHTSPREAD = "Modo Concentrado";
SWWM_YNYKRONFORWARD = "Modo de Rayo"; // desya / forward
SWWM_YNYKRONBACKWARD = "Modo de Vórtice"; // busa / backward
-SWWM_GAMMAMODE1 = "Semiautomático";
-SWWM_GAMMAMODE2 = "Triple Ráfaga";
-SWWM_GAMMAMODE3 = "Automático";
-SWWM_GAMMAMODE4 = "SUPERAUTOMÁTICO";
SWWM_MRMODE1 = "Disparo de Precisión";
SWWM_MRMODE2 = "Disparo en Clúster";
SWWM_MRMODE3 = "Disparo en Chorro";
@@ -615,8 +606,9 @@ SWWM_PLACE3 = "3º";
SWWM_PLACE1_GENDER1 = "1ª";
SWWM_PLACE2_GENDER1 = "2ª";
SWWM_PLACE3_GENDER1 = "3ª";
+SWWM_PAUSE = "PAUSA";
// weapon tooltips
-SWWM_TTNOTE = "Nota: La ayuda de armas se puede desactivar en Opciones de SWWM GZ.";
+SWWM_TTNOTE = "Nota: La ayuda de armas se puede desactivar en Opciones de DEMOLITIONIST.";
TT_PUSHER =
"\cfPrimario:\c- Taladrar.\n"
"\cfSecundario:\c- Ataque cargado.";
@@ -647,8 +639,8 @@ TT_EVISCERATOR =
"\cfSecundario:\c- Disparo de granada.\n"
"\cfZoom:\c- Alternar dispersión.";
TT_HELLBLAZER =
-"\cfPrimario:\c- Cargar cohetes, soltar para disparar.\n"
-"\cfSecundario:\c- Cargar granadas, soltar para disparar.\n"
+"\cfPrimario:\c- Cargar / disparar cohetes.\n"
+"\cfSecundario:\c- Cargar / disparar granadas.\n"
"\cfZoom:\c- Seleccionar munición.\n"
"\cfRecarga:\c- Recargar / cambiar munición.\n"
"\cx(Más controles en la biblioteca)\c-";
@@ -689,8 +681,8 @@ TT_PUNTZERBETA =
"\cfSecundario:\c- Modo de disparo rápido.\n"
"\cfRecarga:\c- Recargar arma.";
TT_PUNTZERGAMMA =
-"\cfPrimario:\c- Disparar arma.\n"
-"\cfSecundario:\c- Cambiar modo de disparo.\n"
+"\cfPrimario:\c- Fuego automático.\n"
+"\cfSecundario:\c- Fuego super-automático.\n"
"\cfRecarga:\c- Recargar arma.";
TT_SHEENHMG =
"\cfPrimario:\c- Fuego lento.\n"
@@ -702,28 +694,6 @@ TT_QUADRAVOL =
"\cfRecarga:\c- Cargar células.\n"
"\cfZoom+Primario:\c- Alternar modo disperso.\n"
"\cfZoom+Secundario:\c- Cambiar postura de arma.";
-TT_BLACKFIRE =
-"\cfPrimario:\c- Lanzafrío.\n"
-"\cfSecundario:\c- Disparo de carámbano.\n"
-"\cfRecarga:\c- Recargar frasco(s).";
-TT_EMPCARBINE =
-"\cfPrimario:\c- Mantener para ionizar, soltar para disparar.\n"
-"\cfSecundario:\c- Ionización multi-objetivo.\n"
-"\cfZoom:\c- Usar mira.\n"
-"\cfRecarga:\c- Cargar barras.";
-TT_RAYKHOM =
-"\cfPrimario:\c- Disparar arma.\n"
-"\cfSecundario:\c- Ataque de rayo.\n"
-"\cfRecarga:\c- Recargar arma.\n"
-"\cfZoom:\c- Recargar batería.";
-TT_GRANDLANCE =
-"\cfPrimario:\c- Disparar arma.\n"
-"\cfSecundario:\c- Disparo cargado.\n"
-"\cfRecarga:\c- Recargar arma.\n"
-"\cfZoom:\c- Recargar batería.";
-TT_FISTGUN =
-"\cfPrimario:\c- Lanzar puño.\n"
-"\cfSecundario:\c- Bofetada en arco.";
TT_NEWSPARKSTER =
"\cfPrimario:\c- Disparo de Kinylum.\n"
"\cfSecundario:\c- Disparo de Nokron.\n"
@@ -735,244 +705,15 @@ TT_MORTALRIFLE =
"\cfSecundario:\c- Disparar granada.\n"
"\cfZoom:\c- Cambiar modo de disparo.\n"
"\cfRecarga:\c- Recargar arma.";
+TT_RAYKHOM =
+"\cfPrimario:\c- Disparar arma.\n"
+"\cfSecundario:\c- Ataque de rayo.\n"
+"\cfRecarga:\c- Recargar arma.\n"
+"\cfZoom:\c- Recargar batería.";
TT_RAFANKOS =
"\cfPrimario:\c- Haz singular.\n"
"\cfSecundario:\c- Haz múltiple.\n"
"\cfRecarga:\c- Recargar arma.";
-// "Direct messages"
-SWWM_INCOMINGMSG = "Mensaje directo entrante de %s...";
-SWWM_CYTHONAME = "\cvArchiduque Cytho Valathor\c-";
-// E1M8
-SWWM_SAYAPHOBOS1 = "Creo que olvidé decirlo en la misión pero... Hay un problemilla, \cdDemo-chan\c-.";
-SWWM_SAYAPHOBOS2 = "El portal a Deimos está guardado por dos malos malosos, y vas a tener que cargártelos.";
-SWWM_SAYAPHOBOS3 = "Son supuestamente el \"reemplazo\" de lo que sea que matara el otro tío para pasar por el mismo sitio.";
-SWWM_SAYAPHOBOS4 = "Bueno, conociéndote, estoy segura de que no será un problema. En fin, eso es todo de momento. Buena suerte.";
-// E2M8
-SWWM_SAYADEIMOS1 = "Cuidado, \cdDemo\c-, esto me da mala espina.";
-SWWM_SAYADEIMOS2 = "Me sale aquí una enorme marca de energía de ahí afuera, y digo ENORME.";
-SWWM_SAYADEIMOS3 = "Y encima no puedo contactar con \cvCytho-sama\c- para que nos informe de donde ir.";
-SWWM_SAYADEIMOS4 = "Bueno, vas por tu cuenta, supongo. Si no consigues encontrar una salida, estaré esperando para reclamarte.";
-// E3M8
-SWWM_SAYADIS1 = "Y aquí estamos... En el mismísimo centro de todo.";
-SWWM_SAYADIS2 = "Aquí es donde se abrió el primer portal a la Tierra, y vas a usarlo para volver.";
-SWWM_SAYADIS3 = "Y por supuesto, todo bien guardado, como no. Tienes que matar cosas, como siempre.";
-SWWM_SAYADIS4 = "Esperemos al menos que te eche en el sitio justo. Tu sigue, \cdDemo-chan\c-, que ya falta poco.";
-// E4M8
-SWWM_SAYATHY1 = "Vale, buenas noticias, al menos. Hay un portal cerca, y estoy segura de que te llevará al sitio correcto.";
-SWWM_SAYATHY2 = "Pero, por supuesto, tienes que patear más traseros para llegar. A ver, nada en la vida es fácil, ¿no?";
-SWWM_SAYATHY3 = "Estaré lista para informarte luego de tu misión DE VERDAD.";
-SWWM_SAYATHY4 = "Ya, aun no tengo ni idea de como salió el lío este. Pero ya llegaré al fondo de todo esto, ya verás.";
-// E5M8
-SWWM_CYTHOSIGIL1 = "\cdDemo\c-, soy \cvCytho\c-. Tengo un mensaje importante de parte de la familia real.";
-SWWM_CYTHOSIGIL2 = "El príncipe Baphomet está satisfecho con tus esfuerzos, y ha abierto un portal para que regreses a la Tierra.";
-SWWM_CYTHOSIGIL3 = "Desafortunadamente, dicho portal está guardado por demonios militares de alto rango, dos, de hecho.";
-SWWM_CYTHOSIGIL4 = "... Aunque, conociéndote, estoy seguro de que no será un problema, ¿cierto?";
-// MAP07
-SWWM_SAYADIMPLE1 = "Alto ahí, \cdDemo-chan\c-. Estás a punto de meterte en terreno peligroso.";
-SWWM_SAYADIMPLE2 = "Esta es la primera línea de defensa que se ha montado alrededor del puerto interior, y es una jodienda.";
-SWWM_SAYADIMPLE3 = "Con suerte, tienes bastante equipamiento para arrasarlo todo... Lo tienes, ¿verdad?";
-SWWM_SAYADIMPLE4 = "Bueno, ya hemos visto lo que puedes hacer, así que estoy segura de que irá todo bien.";
-SWWM_SAYADIMPLE5 = "¡Buena suerte!";
-// MAP11
-SWWM_SAYACIRCLE1 = "Ya casi estás, \cdDemo\c-. El interruptor principal de la barrera demoníaca está cerca.";
-SWWM_SAYACIRCLE2 = "Que esté todo intacto significa que ya le llevas ventaja al tío ese, lo cual es bueno.";
-SWWM_SAYACIRCLE3 = "Las fuerzas especiales esperan para evacuar a todos en cuanto le des al trasto y despejes la zona.";
-SWWM_SAYACIRCLE4 = "Con eso, el último bastión de la población local se marchará, dejando solo demonios detrás.";
-SWWM_SAYACIRCLE5 = "Eso nos dará tiempo para pensar en el siguiente paso, supongo.";
-// MAP20
-SWWM_SAYAGOTCHA1 = "Este es el sitio, sí. Gran fortaleza rodeada de un lago de sangre tóxica. Muy demoníaco.";
-SWWM_SAYAGOTCHA2 = "Los tipejos estos tienen el sitio bien guardado, así que vas a encontrar mucha resistencia.";
-SWWM_SAYAGOTCHA3 = "Tu revéntalo, mata a todos, y ya llegarás pronto al final.";
-SWWM_SAYAGOTCHA4 = "En cuanto llegues al portal, le daré un toque a \cvCytho-sama\c- para que nos diga como cerrarlo.";
-SWWM_SAYAGOTCHA5 = "Eso es todo, supongo. Buena suerte, mi \cdDemolicionista\c-.";
-// MAP20 special (Ultimate Doom 2)
-SWWM_SAYAGOTCHAEND1 = "Espera, ¿Que coño es esto? ¿La lectura cuenta dos portales?";
-SWWM_SAYAGOTCHAEND2 = "No, no, eso no puede estar bien...";
-SWWM_SAYAGOTCHAEND3 = "Uh, vale, \cfDemo-chan\c-, mira a ver como puedes cerrarlos, ¿vale?";
-SWWM_SAYAGOTCHAEND4 = "Mientras, voy a llamar a \cvCytho-sama\c-. Algo me da mala espina de esto...";
-SWWM_SAYAGOTCHAEND5 = "Solo... Intenta no meterte en problemas mientras estoy fuera.";
-// MAP30
-SWWM_SAYAIOS1 = "\cdDemo-chan\c-... Ya está, vas a enfrentarte al Comandante Psíquico, el líder del ejército Infernal.";
-SWWM_SAYAIOS2 = "No sé si... ... B-bueno, no debería preocuparme llegado este punto.";
-SWWM_SAYAIOS3 = "Puedes hacerlo, puedes poner fin a todo esto. Eres... Mi... N-nuestro héroe.";
-SWWM_SAYAIOS4 = "Oh dios no puedo hacer esto, tengo el pulso a tope...";
-SWWM_SAYAIOS5 = "... \cdD-Demo-chan\c-... Por favor salva el mundo y... Por favor vuelve a casa.";
-// MAP30 with Rampancy
-SWWM_SAYARAMPANCY1 = "\cdDemo-chan\c-, esa cosa te toma el pelo, confía en mí. Vi los fallos de login.";
-SWWM_SAYARAMPANCY2 = "Estoy segura de que sacará alguna mierda de cliché para \"atraerte a su bando\" o mierdas.";
-SWWM_SAYARAMPANCY3 = "Menudo chiste. Sea lo que sea que te diga, no lo escuches. Es todo mentiras y mierdas.";
-SWWM_SAYARAMPANCY4 = "Ahora, ve y patea traseros de robot, mi valiente \cdDemolicionista\c-. Todos contamos contigo aquí.";
-// LEVEL08
-SWWM_CYTHONERVE1 = "No he podido contactar con \cgSaya\c-, asumo entonces que está durmiendo, ya que es bastante tarde en Japón.";
-SWWM_CYTHONERVE2 = "Muchos otros grupos ya han sido suprimidos a escala mundial, sus fuerzas rápidamente declinan.";
-SWWM_CYTHONERVE3 = "Tú, sin embargo, te enfrentas a un teniente cibernético conocido como el \"Último Tirano\". Esto será difícil.";
-SWWM_CYTHONERVE4 = "Sin embargo... Eres la heroica \cdDemolicionista\c-, y les darás una lección a estas viles bestias.";
-SWWM_CYTHONERVE5 = "Extingue las llamas de corrupción demoníaca que mancillan esta tierra. Los Kuriste creemos en ti.";
-// Eviternity MAP30
-SWWM_SAYAEVIA1 = "Pst... Mira este sitio. Este tío no podía ser más pretencioso ni aunque lo intentara.";
-SWWM_SAYAEVIA2 = "Da igual lo \"angelical\" que parezca, es solo un tío con armadura bonita, le puedes patear el culo.";
-SWWM_SAYAEVIA3 = "Todo este sitio, es que... Joder, espero que hayas sacado muchas fotos de alta resolución como te pedí.";
-SWWM_SAYAEVIA4 = "Voy a por unas palomitas. Esto va a ser desde luego una batalla épica, jijijijiji...";
-SWWM_SAYAEVIB1 = "¿Que? Pero menuda mierda salida de videojuego. ¿¿¿Me estás contando que el tío tiene DOS BARRAS DE VIDA???";
-SWWM_SAYAEVIB2 = "¡Una mierda, una puta mierda así de grande! ¡Esto es una putísima mierda! ¡Cárgatelo, \cdDemo-chan\c-!";
-// Heretic E1M8
-SWWM_SAYAMAW1 = "Y aquí estamos, en las \"Fauces del Infierno\".";
-SWWM_SAYAMAW2 = "Según los Sidhe esto contiene el portal que conecta con el mundo de los demonios.";
-SWWM_SAYAMAW3 = "Creo que va a ser interesante visitar el equivalente al infierno de otro universo, vaya que sí.";
-SWWM_SAYAMAW4 = "... Y por supuesto, va a ser mucho más interesante reventarlo todo también, ¿verdad?";
-SWWM_SAYAMAW5 = "Solo... Ten cuidado con lo que sea que guarde el sitio este.";
-// Heretic E2M8
-SWWM_SAYAMASTERS1 = "Vale, a ver... Estamos a un paso más de la guarida del jinete de serpiente ese. Pero hay un problema.";
-SWWM_SAYAMASTERS2 = "Específicamente, varios problemas. Problemas grandes, tochos, y todo musculosos.";
-SWWM_SAYAMASTERS3 = "Es que estamos hablando de MINOTAUROS ENORMES con MAZOS ENORMES.";
-SWWM_SAYAMASTERS4 = "No se tú, pero yo ya estoy escuchando el tema de los Hombres del Pilar en mi cabeza.";
-SWWM_SAYAMASTERS5 = "A por ellos, \cdDemo Demostar\c-... ... ... Vale puede que ese haya sido un chiste muy malo, olvídalo.";
-// Heretic E3M8
-SWWM_SAYADSPARIL1 = "Ya está, \cdDemo-chan\c-. Vas a enfrentarte al brujo capullo ese.";
-SWWM_SAYADSPARIL2 = "Vas a salvar otro mundo, y todo en tiempo récord. ¡Estás en racha!";
-SWWM_SAYADSPARIL3 = "... Oh, y recuerda, te espera una sorpresa en casa. Oh, es que te va a encantar.";
-SWWM_SAYADSPARIL4 = "Splgslshglgh";
-SWWM_SAYADSPARIL5 = "Oh mierda ¿eso lo pillo el reconocimiento de voz? Ups...";
-// Heretic E4M8
-SWWM_SAYAHEADS1 = "Vamos, es que se me acaba la paciencia con todo. Espero que esto de verdad te traiga de vuelta a casa.";
-SWWM_SAYAHEADS2 = "Y si no, bueno, más tiempo para refinar este \"regalo\" que te voy a dar.";
-SWWM_SAYAHEADS3 = "Gracias a esto, he conseguido mejorar su potencia aun más. Nos divertiremos a tope.";
-SWWM_SAYAHEADS4 = "En serio no puedo esperar a que lo pruebes, y estoy segura de que te mueres de ganas de saber que es...";
-SWWM_SAYAHEADS5 = "Eliminad aquestos enemigos y venid por vuestra recompensa, oh \cdDemolicionista\c-.";
-SWWM_SAYAHEADS6 = "... Puto en serio acabo de decir eso...";
-// Heretic E5M8
-SWWM_SAYABULLS1 = "Y es que sigue, su puta madre...";
-SWWM_SAYABULLS2 = "Es que te están mandando por mundos al azar. Mira, ya me estoy cabreando basto.";
-SWWM_SAYABULLS3 = "Estoy tan cabreada que, si el próximo portal no te manda inmediatamente de vuelta a Parthoris, es que...";
-SWWM_SAYABULLS4 = "Eso...";
-SWWM_SAYABULLS5 = "NECESITO que vuelvas a casa, \cdDemo-chan\c-. Te necesito desesperadamente para probar esto.";
-// Seven Portals
-SWWM_SAYAGREETA1 = "Ahí lo tienes, \cdDemo-chan\c-. Ese es tu objetivo, ese bicho grande y feo apestoso. Ese es Korax.";
-SWWM_SAYAGREETA2 = "... Por cierto, te has fijado en como huele? Atufa, ¿a que sí?";
-SWWM_SAYAGREETA3 = "Dios, imagina el olor en persona... Solo de pensarlo se me revuelve el estómago.";
-SWWM_SAYAGREETB1 = "Cobarde... Burlándose desde la distancia..."; // Kirin reply
-SWWM_SAYAGREETC1 = "Sí, cobarde y asqueroso, los típicos signos de un bastardo feo.";
-SWWM_SAYAGREETD1 = "¿Bastardo... Feo?"; // Kirin reply
-SWWM_SAYAGREETE1 = "Es mejor no explicártelo, \cxKirin-kun\c-. Sentirías una decepción muy grande por toda la raza humana..";
-SWWM_SAYAGREETF1 = "Eso ciertamente no es tranquilizador de oír..."; // Kirin reply
-// Shadow Wood
-SWWM_SAYABLOODA1 = "No se como el tío este puede oler nada aparte de ese tufo de pedo de perro viejo que suelta.";
-SWWM_SAYABLOODA2 = "Es que en serio, la puta virgen...";
-SWWM_SAYABLOODB1 = "El bastardo feo ese necesita un baño."; // Ibuki reply
-SWWM_SAYABLOODC1 = "¿Bastardo feo? ¿Que es esto ahora, un doujin cutre?";
-SWWM_SAYABLOODD1 = "Ja, muy buena, \cgSayacchi\c-."; // Ibuki reply
-// Hypostyle
-SWWM_SAYAHYPO1 = "Y ya está, después de tantas vueltas. Lo que haya aquí, habrá que matarlo para pillar el siguiente portal.";
-SWWM_SAYAHYPO2 = "En serio espero que no sea un puto dragón. Sería el boss más cutre y genérico posible.";
-SWWM_SAYAHYPO3 = "Uh... Lo he gafado, ¿no? Seguro que sí. Ya, apuesto a que es un puto dragón.";
-SWWM_SAYAHYPO4 = "Apuesto que el TÍO ESE va a salir de su tumba y puto venderme su maldito juego por milésima vez.";
-// Heresiarch's Seminary
-SWWM_KIRINWORSHIPA1 = "Patética criatura repugnante...\n¿Quien pensaría jamas en adorar a una vil bestia como tú?";
-SWWM_KIRINWORSHIPB1 = "Pues yo lo que adoro es esa jugosa polla que tienes, \cxKirin-kun\c-~"; // Saya reply
-SWWM_KIRINWORSHIPC1 = "PFFFFFFFFFFFFFF";
-SWWM_KIRINWORSHIPD1 = "¡Guh! \cx¡Kiriiiiin\c-! ¡Me acabas de echar cola todo por encima! ¡Joder es que escupes tan fuerte como te corres!"; // Saya reply
-SWWM_KIRINWORSHIPD2 = "O-oh... Espera, esta cosa sigue encendida. Mierda... \cdDemo-chan\c- acaba de leer todo eso.";
-// Castle of Grief
-SWWM_SAYAGAMEA1 = "Guau, mira al puto maestro del ajedrez este... ¡Que te jodan!";
-SWWM_SAYAGAMEA2 = "Este tío es un puto idiota y me sigue cabreando más. Que ganas tengo de verte partirle el maldito culo...";
-SWWM_SAYAGAMEB1 = "Friki del ajedrez..."; // Ibuki
-SWWM_SAYAGAMEC1 = "Apuesto a que estaba en el club de ajedrez.";
-// Necropolis
-SWWM_SAYAMASTERSA1 = "Maestros, maestros... ¿De quien? ¿Despertad mis maestros? Bueno, es igual, me da lo mismo lo que diga.";
-SWWM_SAYAMASTERSA2 = "Es que que ganas tengo de que te lo cargues...";
-SWWM_SAYAMASTERSB1 = "¿Eres lo suficientemente fuerte para enfrentarte al hecho de que HUELES?"; // Ibuki reply
-SWWM_SAYAMASTERSC1 = "Me duché esta mañana, \crIbuki\c-.";
-SWWM_SAYAMASTERSD1 = "Me refiero al señorito apestoso de ahí. Tú hueles bien."; // Ibuki reply
-SWWM_SAYAMASTERSE1 = "\cgSayacchi\c- definitivamente posee un aroma agradable."; // Kirin reply
-SWWM_SAYAMASTERSF1 = "Jujujuju... Gracias.";
-// Zedek
-SWWM_SAYAFIGHTER1 = "Y aquí es donde está Zedek, el luchadorcillo. Tal vez crea que es fuerte, pero aun no te ha conocido.";
-SWWM_SAYAFIGHTER2 = "Oh, y tú fíjate por si hay trampas. Seguro que las hay traicioneras por aquí.";
-// Traductus
-SWWM_SAYACLERICA1 = "Si hay algo que he aprendido de los videojuegos es que los clérigos son la peor escoria.";
-SWWM_SAYACLERICA2 = "Eso es todo lo que tengo que decir.";
-SWWM_SAYACLERICB1 = "Nunca he encontrado ni un solo clérigo que no haya intentado asesinarme."; // Kirin reply
-SWWM_SAYACLERICC1 = "Oh cierto, la gente del Imperio Sacrosanto, ¿verdad? Me olvidé por completo de esos.";
-SWWM_SAYACLERICC2 = "Los clérigos son una puta mierda...";
-// Menelkir
-SWWM_SAYAMAGE1 = "La guarida de Menelkir, eh... ...\nOh dios, no se lo digas a \cxKirin-kun\c-, aquí hay puzzles.";
-SWWM_SAYAMAGE2 = "Sí, es que está ya más que cansado de todo este tema. Y aparentemente ahora los tenemos de coincidir dibujos.";
-SWWM_SAYAMAGE3 = "Bueno, al menos estos son puzzles de verdad, y no lo que coño sea que fuera todo aquello.";
-SWWM_SAYAMAGE4 = "Aun que sean... Ya sabes... De los que son todo cutres y chupadísimos.";
-// Dark Crucible
-SWWM_SAYAKORAXA1 = "Aquí estamos, \cdDemo\c-. El gran bastardo feo apestoso ese espera.";
-SWWM_SAYAKORAXB1 = "Al fin, el reinado maligno del vil conspirador encontrará su fin."; // Kirin reply
-SWWM_SAYAKORAXC1 = "Hora de que se dé un puto baño. Después de que le descoloques las rodillas, por supuesto."; // Ibuki reply
-SWWM_SAYAKORAXD1 = "Aunque \cvMeido\c- no lo esté viendo, te puedo decir que los cuatro te estamos dando ánimos.";
-SWWM_SAYAKORAXE1 = "Sigue luchando, \cdDemo-chan\c-. Puedes hacerlo, creemos en ti."; // Kirin reply
-// Blight
-SWWM_SAYABLIGHTA1 = "Oye, \cdDemo-chan\c-, ¿recuerdas los puzzles?";
-SWWM_SAYABLIGHTB1 = "Nnnnngh..."; // Kirin reply
-SWWM_SAYABLIGHTC1 = "Creo que \cxKirin\c- acaba de oírme. Bueno... Ya sabes que hacer.";
-SWWM_SAYABLIGHTC2 = "Puedo sentir que esto va a ser todo un paripé, así que estate preparada para todo.";
-// Constable's Gate
-SWWM_SAYACONSTABLEA1 = "Castillos y más mierdas... Y sigue. Ya lo dije en la misión, pero... Ya sabes...";
-SWWM_SAYACONSTABLEA2 = "Sigue reventando cosas, porfa. \cvMeido-chan\c- nos hizo aperitivos, así que al menos tenemos eso.";
-SWWM_SAYACONSTABLEB1 = "En serio que es tan atenta, esa chica..."; // Ibuki reply
-SWWM_SAYACONSTABLEC1 = "Aunque puedas oír como cuchichea maldiciones por todo lo que está pasando ahí.";
-SWWM_SAYACONSTABLED1 = "Ya, esa sí que es nuestra \cvMeido\c-."; // Ibuki reply
-// Nave
-SWWM_SAYANAVEA1 = "Ojalá pudiera tomar prestado el poder anti-realidad de los \ctMishe\c- para destruir este mundo entero.";
-SWWM_SAYANAVEA2 = "En serio estoy cabreada, todos lo estamos. Joder, hasta \cxKirin\c- está furioso, y ya no podemos calmarlo.";
-SWWM_SAYANAVEB1 = "Es algo así como adorable y preocupante a la vez."; // Ibuki reply
-SWWM_SAYANAVEC1 = "¡NNNNNNNNGGGGGHHHHHHHH!"; // Kirin reply
-SWWM_SAYANAVED1 = "\cxKirin-kun\c-, te vas a asfixiar si sigues gritando así contra la almohada.";
-SWWM_SAYANAVEE1 = "A lo mejor es lo que quiere, \cgSaya\c-. Busca la dulce libertad de la muerte para encontrar la paz interior."; // Ibuki
-SWWM_SAYANAVEF1 = "Si no fuera inmortal eso sería la cosa más jodidamente horrible que podrías decir, \crIbuki\c-.";
-// Dark Citadel
-SWWM_SAYADEATHKINGS1 = "Estoy tan cabreada que pegaría un puñetazo a través de la realidad para mandar a la mierda a los reyes estos.";
-// Kirin's Thrilling Commentary on Puzzles™
-// first puzzle switch on Seven Portals
-SWWM_KIRINPUZZLEA1 = "Un peculiar mecanismo... Supuestamente cita ser parte de algo mayor, haciéndose llamar \"puzzle\".";
-SWWM_KIRINPUZZLEA2 = "\cgSayacchi\c- mencionó que los encontrarías. Es algo ciertamente intrigante...";
-// second puzzle switch on Seven Portals
-SWWM_KIRINPUZZLEB1 = "Otro más... Interesante...";
-// third puzzle switch on Seven Portals
-SWWM_KIRINPUZZLEC1 = "Me falta ver que exactamente hace de esto un \"puzzle\". No es mas que una búsqueda de interruptores.";
-SWWM_KIRINPUZZLEC2 = "Difícilmente un desafío para el intelecto de uno, ¿no crees, \cdDemo-chan\c-?";
-// first puzzle switch on Shadow Wood
-SWWM_KIRINPUZZLED1 = "Parece ser que estos \"interruptores de puzzle\" simplemente siguen apareciendo a tu paso.";
-SWWM_KIRINPUZZLED2 = "Tengo la certeza de que ambos estamos cansados de verlos.";
-// fourth puzzle switch on Shadow Wood
-SWWM_KIRINPUZZLEE1 = "Estos supuestos \"puzzles\"... Son un insulto a nuestra inteligencia.";
-SWWM_KIRINPUZZLEE2 = "... Espero no estar enviando demasiados mensajes.";
-// first puzzle switch on Heresiarch's Seminary
-SWWM_KIRINPUZZLEF1 = "¿Cuando acabará? ¿¿¿Cuantas más fracciones de \"puzzles\" debemos resolver???";
-SWWM_KIRINPUZZLEF2 = "¿Es así como ese sayzha axhkhashaar se atreve a mofarse de nosotros? ¿Con estos tediosos juegos?";
-SWWM_KIRINPUZZLEF3 = "Son... Nnngh... ¡Kheza sakharei!";
-SWWM_KIRINPUZZLEG1 = "\cxKirin-kun\c-, creo que te estás dejando afectar demasiado por esto."; // Saya reply
-SWWM_KIRINPUZZLEH1 = "Sí... Yo... Voy a tumbarme un rato, p-perdón...";
-SWWM_KIRINPUZZLEI1 = "... Pobre. Aunque estoy de acuerdo con él... Esta mierda es que te pone de los nervios, ¿a que sí?"; // Saya reply
-SWWM_KIRINPUZZLEI2 = "Bueno... Me voy a darle mimos a \cxKirin-kun\c-. No te preocupes, se pondrá mejor. Está en buenas manos.";
-// first puzzle switch on Blight
-SWWM_KIRINPUZZLEJ1 = "No podemos huír, ¿no? Estos \"puzzles\" todavía nos persiguen incluso ahora...";
-SWWM_KIRINPUZZLEJ2 = "Este maldito lugar... Plagado por estos viles mecanismos... Juro que jamás daré un paso en él.";
-// last puzzle switch on Blight
-SWWM_KIRINPUZZLEK1 = "Por favor... Haz que pare...";
-SWWM_KIRINPUZZLEL1 = "\cxKirin-kun\c-, oye... No pasa nada. Toma... Bebe, te ayudará a relajarte.\c-"; // Ibuki reply
-SWWM_KIRINPUZZLEM1 = "Glu... Glu... Glu...";
-SWWM_KIRINPUZZLEN1 = "Bueno, pero míralo... Ahí bebiéndolo todo como un campeón."; // Saya reply
-SWWM_KIRINPUZZLEO1 = "Ya sabes como va el tema... En cuanto encuentran una teta de la que mamar, ya se acabaron todos sus problemas..."; // Ibuki reply
-SWWM_KIRINPUZZLEP1 = "Sabes que \cdDemo-chan\c- puede leer lo que decimos, ¿verdad?"; // Saya reply
-SWWM_KIRINPUZZLEQ1 = "Oh, estoy segura de que le encantaría tomar su turno una vez se acabe la misión, ¿hm?"; // Ibuki reply
-// first puzzle switch on Constable's Gate
-SWWM_KIRINPUZZLER1 = "Más vale que este sea el último de estos \"puzzles\" que vayamos a encontrar...";
-SWWM_KIRINPUZZLER2 = "Urp...";
-SWWM_KIRINPUZZLER3 = "Mis disculpas.";
-SWWM_KIRINPUZZLES1 = "Estaba buena la leche, ¿a que sí?"; // Saya reply
-SWWM_KIRINPUZZLET1 = "Ciertamente... Doy gracias por la bendición de \crIbuki\c-.";
-SWWM_KIRINPUZZLEU1 = "Hacer que pueda lactar a voluntad es una bendición, vaya que sí. Seguro que \cdDemo\c- está también de acuerdo."; // Saya reply
-// super secret cheats
-SWWM_ZNVTXT1 = "\cdDemolicionista\c-, soy yo, \chZanaveth El Corruptor\c-. He testificado del acto que has actuado, sí.";
-SWWM_ZNVTXT2 = "Son \cf%d\c- años... y las mágicas palabras veo en nuevo. Muy impresionada, múchamente impresionada.";
-SWWM_ZNVTXT3 = "Así, puedes hacer la cosa... Como los \ctMishe\c- enseñaron también a mí. Una sorpresa no esperada, sí.";
-SWWM_ZNVTXT4 = "Hay tantas muchas palabras poderosas a usar, \cdDemolicionista\c-. Sigue siguiendo para descubrirlas todas.";
-SWWM_ZNVTXT5 = "Y ahora debo dar marcha. A favor extender saludos a tía \cgSaya\c- por parte mía. Buena suerte, \cdDemolicionista\c-.";
// boss tags
BT_BRUISERS = "Hermanos de Guerra";
BT_CYBIE = "Tirano de Babel";
@@ -1066,11 +807,11 @@ SWWM_INTERTIP12 = "El Refrescador siempre se autoactivará si estás a punto de
SWWM_INTERTIP13 = "El Artefacto Ynykron mata instantáneamente todo lo que tengas en el punto de mira, a menos que sea realmente indestructible, aunque normalmente eso solo puede ser si es un dios. ¿No estarás pensando en enfrentarte a algún dios, verdad?";
SWWM_INTERTIP14 = "No te dejes engañar por la Pistola Caramelo, puede parecer solo un recoloreado, pero es MUCHO MÁS fuerte que tu arma inicial.";
SWWM_INTERTIP15 = "El Ragekit potenciará enormemente la fuerza de tus ataques a melé y reducirá el daño recibido, pero también te hará gritar, todo el rato.";
-SWWM_INTERTIP16 = "Puedes compartir ítems con otros en multijugador en la pestaña de intercambio de tu Menú de Demolicionista. Los ítems que no quepan en su inventario no serán intercambiados.";
+SWWM_INTERTIP16 = "Encontrar secretos, ítems importantes, y conseguir ciertos logros como completar un mapa al 100% te dará puntos extra.";
SWWM_INTERTIP17 = "El Menú de Demolicionista es muy útil, no te olvides de asignar una tecla para abrirlo.";
SWWM_INTERTIP18 = "Todas las armas tienen un ataque rápido a melé disponible a través de un botón dedicado. Con armas a una mano darás un puñetazo, con armas a dos manos golpearás con ellas.";
SWWM_INTERTIP19 = "Con la combinación adecuada de impulsar y saltar por las paredes, es perfectamente posible mantenerse en el aire durante largos periodos de tiempo.";
-SWWM_INTERTIP20 = "En multijugador, cualquier llave que recojas será compartida inmediatemente con otros jugadores.";
+SWWM_INTERTIP20 = "Las llaves y coleccionables tienen animaciones en primera persona al recogerse. Si esto resulta molesto puedes desactivarlo en las opciones del mod.";
SWWM_INTERTIP21 = "¡Aumenta tu puntuación! Cuantos más enemigos elimines, mejor. No te olvides de hacer uso de esos puntos en la tienda in-game cuando puedas.";
SWWM_INTERTIP22 = "Con el ritmo adecuado, puedes usar el ataque rápido a melé para desviar proyectiles. Incluso es posible mandarlos de vuelta a su dueño, con daño incrementado si te encuentras bajo los efectos de un Ragekit.";
SWWM_INTERTIP23 = "¿Sabías que Saya realmente odia la UAC?\n\n¿Que? ¿Ya sabías eso? Vaya, pues entonces ya no se me ocurre que otra cosa contarte.";
@@ -1114,11 +855,11 @@ SWWM_INTERTIP60 = "A pesar de su aparentemente penoso tamaño, el Blaster de Pla
SWWM_INTERTIP61 = "Las armas Puntzer pueden penetrar fácilmente objetos sólidos e incluso paredes de poco grosor. Ningún enemigo estará seguro detrás de su cobertura.";
SWWM_INTERTIP62 = "\"La Ametralladora Sheen es tal festival delicioso de dakka que el mero sonido de dispararla hace que desate a Leviatán en mis bragas, y puedes citarme en eso.\" — Saya Miyamoto";
SWWM_INTERTIP63 = "Pulsando disparo inmediatamente después de golpear algo con las bayonetas del Quadravol resultará en una explosión aumentada a bocajarro que mandará a lo que sea que esté al otro lado volando.";
-SWWM_INTERTIP64 = "El Encendedor de Fuego Negro deja un rastro prolongado de frío mucho después de que sus llamas se hayan apagado, causando mucho más daño.";
-SWWM_INTERTIP65 = "El Encendedor de Fuego Negro puede producir bloques de hielo que flotan sobre líquidos, convirtiéndose en plataformas temporales. Ten en cuenta que esto obviamente no funcionará en lava.";
-SWWM_INTERTIP66 = "Puedes marcar múltiples objetivos con el ionizador de la Carabina de Raíl y luego alcanzarlos a todos en una sola descarga. Pero debes hacerlo rápido, ya que la carga se disipa con el tiempo.";
+SWWM_INTERTIP64 = "Mantener los gatillos del Rifle Sparkster pulsados incrementará gradualmente la potencia de disparo al soltarlos. Afortunadamente, no existe la posibilidad de que el arma explote si los mantienes demasiado tiempo, solo un arma mal diseñada por humanos podría ser tan disfuncional.";
+SWWM_INTERTIP65 = "El Rifle Sparkster puede disparar ambos tipos de munición simultáneamente, mezclando todo en un mortífero proyectil combinado.";
+SWWM_INTERTIP66 = "El Rifle Mortal (\"Míster\" para los amigos) fue ideado como un posible rifle de batalla \"estándar\" para la Coalición X'Animen que \"incluso los Xekkian considerarían poderoso\". Parece que en ese aspecto ha sido un éxito, considerando lo verdaderamente mortal que es, aunque no tiene mucha adopción... Por ahora.";
SWWM_INTERTIP67 = "Siendo principalmente una pistola de bobina, la Ray-Khom es casi completamente silenciosa y perfecta para matar sigilosamente. Ten en cuenta sin embargo que el impacto del proyectil en sí será muy ruidoso.";
-SWWM_INTERTIP68 = "La Gran Lanza es una alternativa más segura al Artefacto Ynykron si no quieres matarte a ti o a tus amigos accidentalmente.";
+SWWM_INTERTIP68 = "La Rafan-Kos es ciertamente un Arma Definitiva, como su nombre implica.";
SWWM_INTERTIP70 = "¿Sabíais que incluso con cinturones de seguridad la gente muere todo el tiempo en accidentes de coche? Pensé que era interesante.";
SWWM_INTERTIP71 = "\"En internet nadie puede escucharte ser sutil.\" — Linus Torvalds";
SWWM_INTERTIP72 = "Hay aproximadamente 9.3 mil millones de demonios criados solo para la guerra en el Infierno. Eso es ochocientas setenta y seis mil veces el conteo de monstruos de nuts.wad, y eso es terrible.";
@@ -1130,7 +871,7 @@ SWWM_INTERTIP78 = "Xenia > Tux\n\nDevolvednos a la chica zorro molona de Linux.
SWWM_INTERTIP79 = "Abofetear fachas es perfectamente razonable.";
SWWM_INTERTIP81 = "La edad solo afecta a la apariencia, y no tiene relación a la habilidad. El género no tiene relación a la habilidad. Todo el mundo tiene imperfecciones, los prejuicios traen consigo malcontentos, conviertete en un espíritu oscuro.\nHora de cangrejo.";
SWWM_INTERTIP82 = "\"SI EL ZOO ME PROHIBE LA ENTRADA POR GRITAR A LOS ANIMALES PLANTARÉ CARA A DIOS Y CAMINARÉ DE ESPALDAS AL INFIERNO\" — dril";
-SWWM_INTERTIP83 = "SWWM GZ es realmente Un Extraño Mod de Armas (Some Weird Weapons Mod) para GZDoom.";
+SWWM_INTERTIP83 = "Este es realmente un extraño mod de armas para GZDoom.";
SWWM_INTERTIP84 = "\"En su inmensidad, el universo no es más que un mero grano de arena cuando se compara a los límites ilimitados de nuestra imaginación.\" — Zanaveth Nekuraku III";
SWWM_INTERTIP85 = "Puedes alternar el arte de intermisión con Zoom, y estos consejos con Recarga. Mantener Fuego Secundario ocultará la interfaz para que puedas ver el arte al completo.";
SWWM_INTERTIP86 = "Mezcla ajo molido, pimienta blanca y albahaca con tu salsa de tomate, va ideal con pasta, puedes darme las gracias luego.";
@@ -1163,7 +904,7 @@ SWWM_INTERTIP112 = "No hay autobuses en Gensokyo.";
SWWM_INTERTIP113 = "Las bebidas carbonatadas se toman mejor con una pajita, para evitar dañar tus dientes.";
SWWM_INTERTIP114 = "Un derribo no letal es el derribo más silencioso.";
SWWM_INTERTIP115 = "Había un consejo aquí, pero se ha ido ahora.";
-SWWM_INTERTIP116 = "Más de dos mil millones de dispositivos ejecutan Java. Eso es dos mil millones de más.";
+SWWM_INTERTIP116 = "Más de trece mil millones de dispositivos ejecutan Java. Ya es demasiado tarde, estamos todos condenados.";
SWWM_INTERTIP117 = "La comida sabe mejor cuando te la preparas tú.";
SWWM_INTERTIP118 = "Este mesaje de consejo tiene una errata.";
SWWM_INTERTIP119 = "Si los enemigos se entrometen mientras estás admirando la brillante llave nueva que acabas de encontrar, puedes darles un puñetazo con tu mano libre.";
@@ -1181,12 +922,12 @@ SWWM_INTERTIP130 = "El potenciado de velocidad del Ragekit puede hacerte rebotar
SWWM_INTERTIP131 = "En Heretic y Hexen, un ítem conocido como el Enlace de Seguridad puede aparecer. Si por cualquier razón te has atascado en algún tipo de trampa de la que no parece que haya salida, este será tu as en la manga.";
SWWM_INTERTIP132 = "La Marca de Devastación es bastante inestable, pero provee de un mayor potenciado de daño que el Ragekit, para TODO el daño que puedas causar, incluso a ti. Sí, un juguetito bastante peligroso, desde luego.";
SWWM_INTERTIP133 = "El Sprite Divino puede potenciar tu salud hasta niveles absurdos, pero sus efectos se desvanecen rápidamente después de un rato. Es el ítem de salud más potente que tienes al alcance, pero ten en cuenta que debe ser activado manualmente. A diferencia de muchos otros, no te va a salvar el trasero por su cuenta.";
-SWWM_INTERTIP134 = "La Mano Divina es otra arma que se puede beneficiar de los efectos del Ragekit, convirtiendo lo que ya es un puñetazo letal en algo realmente divino.";
-SWWM_INTERTIP135 = "Mantener los gatillos del Rifle Sparkster pulsados incrementará gradualmente la potencia de disparo al soltarlos. Afortunadamente, no existe la posibilidad de que el arma explote si los mantienes demasiado tiempo, solo un arma mal diseñada por humanos podría ser tan disfuncional.";
-SWWM_INTERTIP136 = "El Rifle Sparkster puede disparar ambos tipos de munición simultáneamente, mezclando todo en un mortífero proyectil combinado.";
-SWWM_INTERTIP137 = "El Rifle Mortal (\"Míster\" para los amigos) fue ideado como un posible rifle de batalla \"estándar\" para la Coalición X'Animen que \"incluso los Xekkian considerarían poderoso\". Parece que en ese aspecto ha sido un éxito, considerando lo verdaderamente mortal que es, aunque no tiene mucha adopción... Por ahora.";
-SWWM_INTERTIP138 = "La Rafan-Kos es ciertamente un Arma Definitiva, como su nombre implica.";
-SWWM_INTERTIP139 = "Se dice que la Mano Divina trae consigo solo una minúscula fracción del poder de su creador original. El tipo debe de pegar unas hostias de aúpa, entonces.";
+SWWM_INTERTIP134 = "La Demolicionista no está sola en su misión. Se sabe que hay muchos más héroes luchando ahí afuera también.";
+SWWM_INTERTIP135 = "A Demo-chan le gusta un cierto robot de videojuego que también mata demonios con estilo.";
+SWWM_INTERTIP136 = "Generalmente, tus enemigos son lo suficientemente estúpidos como para plantarse delante de tu línea de fuego. Si fueran más listos, no intentarían enfrentarse a ti.";
+SWWM_INTERTIP137 = "Los potenciadores existen para ser usados, no tengas miedo de \"malgastarlos\". Si la situación lo llama, dale caña. Ya encontrarás más luego.";
+SWWM_INTERTIP138 = "Los demonios evitaron invadir Australia por alguna razón. Tal vez el clima de ahí es peor que en el Infierno.";
+SWWM_INTERTIP139 = "Si parece que el juego te está dando demasiadas cosas, puedes ganarte un dinero extra vendiendo lo que no necesites.";
SWWM_INTERTIP140 = "El chasis de la Demolicionista tiene un ligero aroma a lima.";
SWWM_INTERTIP141 = "\"En el futuro, todo es Cromado.\"\n\nNunca una frase de una serie de dibujos pudo ser más acertada tras el inevitable auge de la supremacía web-app.";
SWWM_INTERTIP142 = "Este mod está en desarrollo constante. Recuerda reportar cualquier bug que encuentres.";
@@ -1239,8 +980,6 @@ SWWM_ACHIEVEMENT_BUTTS_TAG = "Esos Glúteos Firmes";
SWWM_ACHIEVEMENT_BUTTS_TXT = "Mata %d enemigos embistiendo marcha atrás";
SWWM_ACHIEVEMENT_CANDY_TAG = "Oh un Caramelo";
SWWM_ACHIEVEMENT_CANDY_TXT = "Recoge %d pepitas";
-SWWM_ACHIEVEMENT_CHEAT_TAG = "Astucia Mishe";
-SWWM_ACHIEVEMENT_CHEAT_TXT = "Consigue meter un código de trampa";
SWWM_ACHIEVEMENT_CLIFFYB_TAG = "Mierdas de Recadero";
SWWM_ACHIEVEMENT_CLIFFYB_TXT = "Termina un mapa sin obtener ninguna llave";
SWWM_ACHIEVEMENT_CLONK_TAG = "CLONK";
@@ -1263,14 +1002,10 @@ SWWM_ACHIEVEMENT_DIVINE_TAG = "Deleite Divino";
SWWM_ACHIEVEMENT_DIVINE_TXT = "Usa %d Sprites Divinos";
SWWM_ACHIEVEMENT_DOODLE_TAG = "Maestro del Grafiti";
SWWM_ACHIEVEMENT_DOODLE_TAG = "Garabatea mostachos en %d caras de demonio";
-SWWM_ACHIEVEMENT_DOSH_TAG = "Capitalismo Desenfrenado";
-SWWM_ACHIEVEMENT_DOSH_TXT = "Acumula ¥1.000.000.000 entre todas tus partidas";
SWWM_ACHIEVEMENT_EVERYTHING_TAG = "La Demolicionista";
SWWM_ACHIEVEMENT_EVERYTHING_TXT = "Desbloquea todos los logros";
SWWM_ACHIEVEMENT_EZKILL_TAG = "El Orgullo de Misa";
SWWM_ACHIEVEMENT_EZKILL_TXT = "Mata %d enemigos con un solo disparo de Artefacto Ynykron (excluyendo modo secundario)";
-SWWM_ACHIEVEMENT_FISTO_TAG = "Rompejetas Excepcional";
-SWWM_ACHIEVEMENT_FISTO_TXT = "Mata %d enemigos con la Mano Divina";
SWWM_ACHIEVEMENT_FLIGHT_TAG = "Despega de Nuevo";
SWWM_ACHIEVEMENT_FLIGHT_TXT = "Lanza a un enemigo en volandas más allá de %d unidades de mapa";
SWWM_ACHIEVEMENT_FRIEND_TAG = "¿Te Gusta Caco?";
@@ -1300,7 +1035,6 @@ SWWM_ACHIEVEMENT_HND_TAG = "Mediodía";
SWWM_ACHIEVEMENT_HND_TXT = "Realiza %d disparos mortales en una única recarga de Puntzer Beta";
SWWM_ACHIEVEMENT_HURRY_TAG = "Con Prisas";
SWWM_ACHIEVEMENT_HURRY_TXT = "Termina un mapa con 0 muertes, ítems y secretos";
-SWWM_ACHIEVEMENT_ICE_TXT = "Empala %d enemigos con el disparo secundario del Encendedor de Fuego Negro";
SWWM_ACHIEVEMENT_JUMP_TAG = "Verticalidad";
SWWM_ACHIEVEMENT_JUMP_TXT = "Salta paredes %d veces";
SWWM_ACHIEVEMENT_KANCHO_TAG = "Kancho Extremo";
@@ -1317,6 +1051,8 @@ SWWM_ACHIEVEMENT_LOVE_TAG = "Amor Letal";
SWWM_ACHIEVEMENT_LOVE_TXT = "Mata %d enemigos con un beso lanzado (sin contar insta-kills)";
SWWM_ACHIEVEMENT_MASHIRO_TAG = "Capas de Blanco";
SWWM_ACHIEVEMENT_MASHIRO_TXT = "Invoca a la Dama Blanca";
+SWWM_ACHIEVEMENT_MATRYOSHKA_TAG = "Astucia Mishe";
+SWWM_ACHIEVEMENT_MATRYOSHKA_TXT = "Una Caja Afortunada dentro de una Caja Afortunada dentro de una Caja Afortunada dentro de una Caja Afortunada dentro de...";
SWWM_ACHIEVEMENT_MBF_TAG = "Puedes Acariciar el Perro";
SWWM_ACHIEVEMENT_MBF_TXT = "Acaricia un perro";
SWWM_ACHIEVEMENT_MEGA_TAG = "Masacre Masiva";
@@ -1338,8 +1074,6 @@ SWWM_ACHIEVEMENT_PAR_TAG = "Rápido";
SWWM_ACHIEVEMENT_PAR_TXT = "Supera el tiempo par en %d mapas";
SWWM_ACHIEVEMENT_PEACE_TAG = "Pacifista";
SWWM_ACHIEVEMENT_PEACE_TXT = "Termina un mapa sin causar daño";
-SWWM_ACHIEVEMENT_PENE_TAG = "Penetrador";
-SWWM_ACHIEVEMENT_PENE_TXT = "Atraviesa %d enemigos en fila con un solo secundario de la Gran Lanza";
SWWM_ACHIEVEMENT_PLASMA_TAG = "Echando Plasmas";
SWWM_ACHIEVEMENT_PLASMA_TXT = "Mata un enemigo a 100%% de salud con un disparo cargado del Blaster de Plasma %d veces";
SWWM_ACHIEVEMENT_PLUSH_TAG = "Amorcito";
diff --git a/language.es_dlg b/language.es_dlg
new file mode 100644
index 000000000..4559c3ed1
--- /dev/null
+++ b/language.es_dlg
@@ -0,0 +1,243 @@
+[es]
+// "Direct messages"
+SWWM_INCOMINGMSG = "Mensaje directo entrante de %s...";
+SWWM_CYTHONAME = "\cvArchiduque Cytho Valathor\c-";
+// E1M8
+SWWM_SAYAPHOBOS1 = "Creo que olvidé decirlo en la misión pero... Hay un problemilla, \cdDemo-chan\c-.";
+SWWM_SAYAPHOBOS2 = "El portal a Deimos está guardado por dos malos malosos, y vas a tener que cargártelos.";
+SWWM_SAYAPHOBOS3 = "Son supuestamente el \"reemplazo\" de lo que sea que matara el otro tío para pasar por el mismo sitio.";
+SWWM_SAYAPHOBOS4 = "Bueno, conociéndote, estoy segura de que no será un problema. En fin, eso es todo de momento. Buena suerte.";
+// E2M8
+SWWM_SAYADEIMOS1 = "Cuidado, \cdDemo\c-, esto me da mala espina.";
+SWWM_SAYADEIMOS2 = "Me sale aquí una enorme marca de energía de ahí afuera, y digo ENORME.";
+SWWM_SAYADEIMOS3 = "Y encima no puedo contactar con \cvCytho-sama\c- para que nos informe de donde ir.";
+SWWM_SAYADEIMOS4 = "Bueno, vas por tu cuenta, supongo. Si no encuentras una salida, estaré esperando para reclamarte.";
+// E3M8
+SWWM_SAYADIS1 = "Y aquí estamos... En el mismísimo centro de todo.";
+SWWM_SAYADIS2 = "Aquí es donde se abrió el primer portal a la Tierra, y vas a usarlo para volver.";
+SWWM_SAYADIS3 = "Y por supuesto, todo bien guardado, como no. Tienes que matar cosas, como siempre.";
+SWWM_SAYADIS4 = "Esperemos al menos que te eche en el sitio justo. Tu sigue, \cdDemo-chan\c-, que ya falta poco.";
+// E4M8
+SWWM_SAYATHY1 = "Vale, buenas noticias, al menos. Hay un portal cerca, y estoy segura de que te llevará al sitio correcto.";
+SWWM_SAYATHY2 = "Pero, por supuesto, tienes que patear más traseros para llegar. A ver, nada en la vida es fácil, ¿no?";
+SWWM_SAYATHY3 = "Estaré lista para informarte luego de tu misión DE VERDAD.";
+SWWM_SAYATHY4 = "Ya, aun no tengo ni idea de como salió el lío este. Pero ya llegaré al fondo de todo esto, ya verás.";
+// E5M8
+SWWM_CYTHOSIGIL1 = "\cdDemo\c-, soy \cvCytho\c-. Tengo un mensaje importante de parte de la familia real.";
+SWWM_CYTHOSIGIL2 = "El príncipe Baphomet está satisfecho con tus esfuerzos, y ha abierto un portal para regresar a la Tierra.";
+SWWM_CYTHOSIGIL3 = "Desafortunadamente, dicho portal está guardado por demonios militares de alto rango, dos, de hecho.";
+SWWM_CYTHOSIGIL4 = "... Aunque, conociéndote, estoy seguro de que no será un problema, ¿cierto?";
+// MAP07
+SWWM_SAYADIMPLE1 = "Alto ahí, \cdDemo-chan\c-. Estás a punto de meterte en terreno peligroso.";
+SWWM_SAYADIMPLE2 = "Esta es la primera línea de defensa que se ha montado alrededor del puerto interior, y es una jodienda.";
+SWWM_SAYADIMPLE3 = "Con suerte, tienes bastante equipamiento para arrasarlo todo... Lo tienes, ¿verdad?";
+SWWM_SAYADIMPLE4 = "Bueno, ya hemos visto lo que puedes hacer, así que estoy segura de que irá todo bien.";
+SWWM_SAYADIMPLE5 = "¡Buena suerte!";
+// MAP11
+SWWM_SAYACIRCLE1 = "Ya casi estás, \cdDemo\c-. El interruptor principal de la barrera demoníaca está cerca.";
+SWWM_SAYACIRCLE2 = "Que esté todo intacto significa que ya le llevas ventaja al tío ese, lo cual es bueno.";
+SWWM_SAYACIRCLE3 = "Las fuerzas especiales esperan para evacuar a todos en cuanto le des al trasto y despejes la zona.";
+SWWM_SAYACIRCLE4 = "Con eso, el último bastión de la población local se marchará, dejando solo demonios detrás.";
+SWWM_SAYACIRCLE5 = "Eso nos dará tiempo para pensar en el siguiente paso, supongo.";
+// MAP20
+SWWM_SAYAGOTCHA1 = "Este es el sitio, sí. Gran fortaleza rodeada de un lago de sangre tóxica. Muy demoníaco.";
+SWWM_SAYAGOTCHA2 = "Los tipejos estos tienen el sitio bien guardado, así que vas a encontrar mucha resistencia.";
+SWWM_SAYAGOTCHA3 = "Tu revéntalo, mata a todos, y ya llegarás pronto al final.";
+SWWM_SAYAGOTCHA4 = "En cuanto llegues al portal, le daré un toque a \cvCytho-sama\c- para que nos diga como cerrarlo.";
+SWWM_SAYAGOTCHA5 = "Eso es todo, supongo. Buena suerte, mi \cdDemolicionista\c-.";
+// MAP20 special (Ultimate Doom 2)
+SWWM_SAYAGOTCHAEND1 = "Espera, ¿Que coño es esto? ¿La lectura cuenta dos portales?";
+SWWM_SAYAGOTCHAEND2 = "No, no, eso no puede estar bien...";
+SWWM_SAYAGOTCHAEND3 = "Uh, vale, \cfDemo-chan\c-, mira a ver como puedes cerrarlos, ¿vale?";
+SWWM_SAYAGOTCHAEND4 = "Mientras, voy a llamar a \cvCytho-sama\c-. Algo me da mala espina de esto...";
+SWWM_SAYAGOTCHAEND5 = "Solo... Intenta no meterte en problemas mientras estoy fuera.";
+// MAP30
+SWWM_SAYAIOS1 = "\cdDemo-chan\c-... Ya está, vas a enfrentarte al Comandante Psíquico, el líder del ejército Infernal.";
+SWWM_SAYAIOS2 = "No sé si... ... B-bueno, no debería preocuparme llegado este punto.";
+SWWM_SAYAIOS3 = "Puedes hacerlo, puedes poner fin a todo esto. Eres... Mi... N-nuestro héroe.";
+SWWM_SAYAIOS4 = "Oh dios no puedo hacer esto, tengo el pulso a tope...";
+SWWM_SAYAIOS5 = "... \cdD-Demo-chan\c-... Por favor salva el mundo y... Por favor vuelve a casa.";
+// MAP30 with Rampancy
+SWWM_SAYARAMPANCY1 = "\cdDemo-chan\c-, esa cosa te toma el pelo, confía en mí. Vi los fallos de login.";
+SWWM_SAYARAMPANCY2 = "Estoy segura de que sacará alguna mierda de cliché para \"atraerte a su bando\" o mierdas.";
+SWWM_SAYARAMPANCY3 = "Menudo chiste. Sea lo que sea que te diga, no lo escuches. Es todo mentiras y mierdas.";
+SWWM_SAYARAMPANCY4 = "Ahora, ve y patea traseros de robot, mi valiente \cdDemolicionista\c-. Todos contamos contigo aquí.";
+// LEVEL08
+SWWM_CYTHONERVE1 = "No he podido contactar con \cgSaya\c-, supongo que está durmiendo, ya que es de noche en Japón.";
+SWWM_CYTHONERVE2 = "Muchos otros grupos ya han sido suprimidos a escala mundial, sus fuerzas rápidamente declinan.";
+SWWM_CYTHONERVE3 = "Tú, sin embargo, te enfrentas a un teniente cibernético conocido como el \"Último Tirano\". Será difícil.";
+SWWM_CYTHONERVE4 = "Sin embargo... Eres la heroica \cdDemolicionista\c-, y les darás una lección a estas viles bestias.";
+SWWM_CYTHONERVE5 = "Extingue las llamas de corrupción demoníaca que mancillan esta tierra. Los Kuriste creemos en ti.";
+// Eviternity MAP30
+SWWM_SAYAEVIA1 = "Pst... Mira este sitio. Este tío no podía ser más pretencioso ni aunque lo intentara.";
+SWWM_SAYAEVIA2 = "Da igual lo \"angelical\" que parezca, es solo un tío con armadura bonita, le puedes patear el culo.";
+SWWM_SAYAEVIA3 = "Todo este sitio, es que... Joder, espero que hayas sacado muchas fotos de alta resolución como te pedí.";
+SWWM_SAYAEVIA4 = "Voy a por unas palomitas. Esto va a ser desde luego una batalla épica, jijijijiji...";
+SWWM_SAYAEVIB1 = "¿Que? Pero menuda mierda salida de videojuego. ¿¿¿Me estás contando que el tío tiene DOS BARRAS DE VIDA???";
+SWWM_SAYAEVIB2 = "¡Una mierda, una puta mierda así de grande! ¡Esto es una putísima mierda! ¡Cárgatelo, \cdDemo-chan\c-!";
+// Heretic E1M8
+SWWM_SAYAMAW1 = "Y aquí estamos, en las \"Fauces del Infierno\".";
+SWWM_SAYAMAW2 = "Según los Sidhe esto contiene el portal que conecta con el mundo de los demonios.";
+SWWM_SAYAMAW3 = "Creo que va a ser interesante visitar el equivalente al infierno de otro universo, vaya que sí.";
+SWWM_SAYAMAW4 = "... Y por supuesto, va a ser mucho más interesante reventarlo todo también, ¿verdad?";
+SWWM_SAYAMAW5 = "Solo... Ten cuidado con lo que sea que guarde el sitio este.";
+// Heretic E2M8
+SWWM_SAYAMASTERS1 = "Vale, a ver... Estamos a un paso más de la guarida del jinete de serpiente ese. Pero hay un problema.";
+SWWM_SAYAMASTERS2 = "Específicamente, varios problemas. Problemas grandes, tochos, y todo musculosos.";
+SWWM_SAYAMASTERS3 = "Es que estamos hablando de MINOTAUROS ENORMES con MAZOS ENORMES.";
+SWWM_SAYAMASTERS4 = "No se tú, pero yo ya estoy escuchando el tema de los Hombres del Pilar en mi cabeza.";
+SWWM_SAYAMASTERS5 = "A por ellos, \cdDemo Demostar\c-... ... ... Vale puede que ese haya sido un chiste muy malo, olvídalo.";
+// Heretic E3M8
+SWWM_SAYADSPARIL1 = "Ya está, \cdDemo-chan\c-. Vas a enfrentarte al brujo capullo ese.";
+SWWM_SAYADSPARIL2 = "Vas a salvar otro mundo, y todo en tiempo récord. ¡Estás en racha!";
+SWWM_SAYADSPARIL3 = "... Oh, y recuerda, te espera una sorpresa en casa. Oh, es que te va a encantar.";
+SWWM_SAYADSPARIL4 = "Splgslshglgh";
+SWWM_SAYADSPARIL5 = "Oh mierda ¿eso lo pillo el reconocimiento de voz? Ups...";
+// Heretic E4M8
+SWWM_SAYAHEADS1 = "Es que se me acaba la paciencia con todo. Espero que esto de verdad te traiga de vuelta a casa.";
+SWWM_SAYAHEADS2 = "Y si no, bueno, más tiempo para refinar este \"regalo\" que te voy a dar.";
+SWWM_SAYAHEADS3 = "Gracias a esto, he conseguido mejorar su potencia aun más. Nos divertiremos a tope.";
+SWWM_SAYAHEADS4 = "En serio no puedo esperar a que lo pruebes, y estoy segura de que te mueres de ganas de saber que es...";
+SWWM_SAYAHEADS5 = "Eliminad aquestos enemigos y venid por vuestra recompensa, oh \cdDemolicionista\c-.";
+SWWM_SAYAHEADS6 = "... Puto en serio acabo de decir eso...";
+// Heretic E5M8
+SWWM_SAYABULLS1 = "Y es que sigue, su puta madre...";
+SWWM_SAYABULLS2 = "Es que te están mandando por mundos al azar. Mira, ya me estoy cabreando basto.";
+SWWM_SAYABULLS3 = "Estoy tan cabreada que, si el próximo portal no te trae de vuelta a Parthoris, es que...";
+SWWM_SAYABULLS4 = "Eso...";
+SWWM_SAYABULLS5 = "NECESITO que vuelvas a casa, \cdDemo-chan\c-. Te necesito desesperadamente para probar esto.";
+// Seven Portals
+SWWM_SAYAGREETA1 = "Ahí lo tienes, \cdDemo-chan\c-. Ese es tu objetivo, ese bicho grande y feo apestoso. Ese es Korax.";
+SWWM_SAYAGREETA2 = "... Por cierto, te has fijado en como huele? Atufa, ¿a que sí?";
+SWWM_SAYAGREETA3 = "Dios, imagina el olor en persona... Solo de pensarlo se me revuelve el estómago.";
+SWWM_SAYAGREETB1 = "Cobarde... Burlándose desde la distancia..."; // Kirin reply
+SWWM_SAYAGREETC1 = "Sí, cobarde y asqueroso, los típicos signos de un bastardo feo.";
+SWWM_SAYAGREETD1 = "¿Bastardo... Feo?"; // Kirin reply
+SWWM_SAYAGREETE1 = "Es mejor no explicártelo, \cxKirin-kun\c-. Sentirías una decepción muy grande por toda la raza humana..";
+SWWM_SAYAGREETF1 = "Eso ciertamente no es tranquilizador de oír..."; // Kirin reply
+// Shadow Wood
+SWWM_SAYABLOODA1 = "No se como el tío este puede oler nada aparte de ese tufo de pedo de perro viejo que suelta.";
+SWWM_SAYABLOODA2 = "Es que en serio, la puta virgen...";
+SWWM_SAYABLOODB1 = "El bastardo feo ese necesita un baño."; // Ibuki reply
+SWWM_SAYABLOODC1 = "¿Bastardo feo? ¿Que es esto ahora, un doujin cutre?";
+SWWM_SAYABLOODD1 = "Ja, muy buena, \cgSayacchi\c-."; // Ibuki reply
+// Hypostyle
+SWWM_SAYAHYPO1 = "Y ya, después de tantas vueltas. Lo que haya aquí, habrá que matarlo para pillar el siguiente portal.";
+SWWM_SAYAHYPO2 = "En serio espero que no sea un puto dragón. Sería el boss más cutre y genérico posible.";
+SWWM_SAYAHYPO3 = "Uh... Lo he gafado, ¿no? Seguro que sí. Ya, apuesto a que es un puto dragón.";
+SWWM_SAYAHYPO4 = "Apuesto que el TÍO ESE va a salir de su tumba y puto venderme su maldito juego por milésima vez.";
+// Heresiarch's Seminary
+SWWM_KIRINWORSHIPA1 = "Patética criatura repugnante...\n¿Quien pensaría jamas en adorar a una vil bestia como tú?";
+SWWM_KIRINWORSHIPB1 = "Pues yo lo que adoro es esa jugosa polla que tienes, \cxKirin-kun\c-~"; // Saya reply
+SWWM_KIRINWORSHIPC1 = "PFFFFFFFFFFFFFF";
+SWWM_KIRINWORSHIPD1 = "¡Guh! \cx¡Kiriiiiin\c-! ¡Me acabas de echar cola todo por encima! ¡Joder escupes tan fuerte como te corres!"; // Saya reply
+SWWM_KIRINWORSHIPD2 = "O-oh... Espera, esta cosa sigue encendida. Mierda... \cdDemo-chan\c- acaba de leer todo eso.";
+// Castle of Grief
+SWWM_SAYAGAMEA1 = "Guau, mira al puto maestro del ajedrez este... ¡Que te jodan!";
+SWWM_SAYAGAMEA2 = "Este tío es un puto idiota y me sigue cabreando más. Que ganas tengo de verte partirle el maldito culo...";
+SWWM_SAYAGAMEB1 = "Friki del ajedrez..."; // Ibuki
+SWWM_SAYAGAMEC1 = "Apuesto a que estaba en el club de ajedrez.";
+// Necropolis
+SWWM_SAYAMASTERSA1 = "Maestros, maestros... ¿De quien? ¿Despertad mis maestros? Bueno, es igual, me da lo mismo lo que diga.";
+SWWM_SAYAMASTERSA2 = "Es que que ganas tengo de que te lo cargues...";
+SWWM_SAYAMASTERSB1 = "¿Eres lo suficientemente fuerte para enfrentarte al hecho de que HUELES?"; // Ibuki reply
+SWWM_SAYAMASTERSC1 = "Me duché esta mañana, \crIbuki\c-.";
+SWWM_SAYAMASTERSD1 = "Me refiero al señorito apestoso de ahí. Tú hueles bien."; // Ibuki reply
+SWWM_SAYAMASTERSE1 = "\cgSayacchi\c- definitivamente posee un aroma agradable."; // Kirin reply
+SWWM_SAYAMASTERSF1 = "Jujujuju... Gracias.";
+// Zedek
+SWWM_SAYAFIGHTER1 = "Y aquí es donde está Zedek, el luchadorcillo. Tal vez crea que es fuerte, pero aun no te ha conocido.";
+SWWM_SAYAFIGHTER2 = "Oh, y tú fíjate por si hay trampas. Seguro que las hay traicioneras por aquí.";
+// Traductus
+SWWM_SAYACLERICA1 = "Si hay algo que he aprendido de los videojuegos es que los clérigos son la peor escoria.";
+SWWM_SAYACLERICA2 = "Eso es todo lo que tengo que decir.";
+SWWM_SAYACLERICB1 = "Nunca he encontrado ni un solo clérigo que no haya intentado asesinarme."; // Kirin reply
+SWWM_SAYACLERICC1 = "Oh cierto, la gente del Imperio Sacrosanto, ¿verdad? Me olvidé por completo de esos.";
+SWWM_SAYACLERICC2 = "Los clérigos son una puta mierda...";
+// Menelkir
+SWWM_SAYAMAGE1 = "La guarida de Menelkir, eh... ...\nOh dios, no se lo digas a \cxKirin-kun\c-, aquí hay puzzles.";
+SWWM_SAYAMAGE2 = "Sí, está ya más que cansado de todo este tema. Y aparentemente ahora los tenemos de coincidir dibujos.";
+SWWM_SAYAMAGE3 = "Bueno, al menos estos son puzzles de verdad, y no lo que coño sea que fuera todo aquello.";
+SWWM_SAYAMAGE4 = "Aun que sean... Ya sabes... De los que son todo cutres y chupadísimos.";
+// Dark Crucible
+SWWM_SAYAKORAXA1 = "Aquí estamos, \cdDemo\c-. El gran bastardo feo apestoso ese espera.";
+SWWM_SAYAKORAXB1 = "Al fin, el reinado maligno del vil conspirador encontrará su fin."; // Kirin reply
+SWWM_SAYAKORAXC1 = "Hora de que se dé un puto baño. Después de que le descoloques las rodillas, por supuesto."; // Ibuki reply
+SWWM_SAYAKORAXD1 = "Aunque \cvMeido\c- no lo esté viendo, te puedo decir que los cuatro te estamos dando ánimos.";
+SWWM_SAYAKORAXE1 = "Sigue luchando, \cdDemo-chan\c-. Puedes hacerlo, creemos en ti."; // Kirin reply
+// Blight
+SWWM_SAYABLIGHTA1 = "Oye, \cdDemo-chan\c-, ¿recuerdas los puzzles?";
+SWWM_SAYABLIGHTB1 = "Nnnnngh..."; // Kirin reply
+SWWM_SAYABLIGHTC1 = "Creo que \cxKirin\c- acaba de oírme. Bueno... Ya sabes que hacer.";
+SWWM_SAYABLIGHTC2 = "Puedo sentir que esto va a ser todo un paripé, así que estate preparada para todo.";
+// Constable's Gate
+SWWM_SAYACONSTABLEA1 = "Castillos y más mierdas... Y sigue. Ya lo dije en la misión, pero... Ya sabes...";
+SWWM_SAYACONSTABLEA2 = "Sigue reventando cosas, porfa. \cvMeido-chan\c- nos hizo aperitivos, así que al menos tenemos eso.";
+SWWM_SAYACONSTABLEB1 = "En serio que es tan atenta, esa chica..."; // Ibuki reply
+SWWM_SAYACONSTABLEC1 = "Aunque puedas oír como cuchichea maldiciones por todo lo que está pasando ahí.";
+SWWM_SAYACONSTABLED1 = "Ya, esa sí que es nuestra \cvMeido\c-."; // Ibuki reply
+// Nave
+SWWM_SAYANAVEA1 = "Ojalá pudiera tomar prestado el poder anti-realidad de los \ctMishe\c- para destruir este mundo entero.";
+SWWM_SAYANAVEA2 = "En serio estoy cabreada, todos lo estamos. Joder, hasta \cxKirin\c- está furioso, y ya no podemos calmarlo.";
+SWWM_SAYANAVEB1 = "Es algo así como adorable y preocupante a la vez."; // Ibuki reply
+SWWM_SAYANAVEC1 = "¡NNNNNNNNGGGGGHHHHHHHH!"; // Kirin reply
+SWWM_SAYANAVED1 = "\cxKirin-kun\c-, te vas a asfixiar si sigues gritando así contra la almohada.";
+SWWM_SAYANAVEE1 = "A lo mejor es lo que quiere, \cgSaya\c-. Busca la dulce libertad de la muerte para encontrar la paz interior."; // Ibuki
+SWWM_SAYANAVEF1 = "Si no fuera inmortal eso sería la cosa más jodidamente horrible que podrías decir, \crIbuki\c-.";
+// Dark Citadel
+SWWM_SAYADEATHKINGS1 = "Estoy tan cabreada que pegaría una hostia a través de la realidad para mandar a fregar a los reyes esos.";
+// Kirin's Thrilling Commentary on Puzzles™
+// first puzzle switch on Seven Portals
+SWWM_KIRINPUZZLEA1 = "Un peculiar mecanismo... Supuestamente cita ser parte de algo mayor, haciéndose llamar \"puzzle\".";
+SWWM_KIRINPUZZLEA2 = "\cgSayacchi\c- mencionó que los encontrarías. Es algo ciertamente intrigante...";
+// second puzzle switch on Seven Portals
+SWWM_KIRINPUZZLEB1 = "Otro más... Interesante...";
+// third puzzle switch on Seven Portals
+SWWM_KIRINPUZZLEC1 = "Me falta ver que exactamente hace de esto un \"puzzle\". No es mas que una búsqueda de interruptores.";
+SWWM_KIRINPUZZLEC2 = "Difícilmente un desafío para el intelecto de uno, ¿no crees, \cdDemo-chan\c-?";
+// first puzzle switch on Shadow Wood
+SWWM_KIRINPUZZLED1 = "Parece ser que estos \"interruptores de puzzle\" simplemente siguen apareciendo a tu paso.";
+SWWM_KIRINPUZZLED2 = "Tengo la certeza de que ambos estamos cansados de verlos.";
+// fourth puzzle switch on Shadow Wood
+SWWM_KIRINPUZZLEE1 = "Estos supuestos \"puzzles\"... Son un insulto a nuestra inteligencia.";
+SWWM_KIRINPUZZLEE2 = "... Espero no estar enviando demasiados mensajes.";
+// first puzzle switch on Heresiarch's Seminary
+SWWM_KIRINPUZZLEF1 = "¿Cuando acabará? ¿¿¿Cuantas más fracciones de \"puzzles\" debemos resolver???";
+SWWM_KIRINPUZZLEF2 = "¿Es así como ese sayzha axhkhashaar se atreve a mofarse de nosotros? ¿Con estos tediosos juegos?";
+SWWM_KIRINPUZZLEF3 = "Son... Nnngh... ¡Kheza sakharei!";
+SWWM_KIRINPUZZLEG1 = "\cxKirin-kun\c-, creo que te estás dejando afectar demasiado por esto."; // Saya reply
+SWWM_KIRINPUZZLEH1 = "Sí... Yo... Voy a tumbarme un rato, p-perdón...";
+SWWM_KIRINPUZZLEI1 = "... Pobre. Aunque estoy de acuerdo con él... Esta mierda es que te pone de los nervios, ¿a que sí?"; // Saya reply
+SWWM_KIRINPUZZLEI2 = "Bueno... Me voy a darle mimos a \cxKirin-kun\c-. No te preocupes, se pondrá mejor. Está en buenas manos.";
+// first puzzle switch on Blight
+SWWM_KIRINPUZZLEJ1 = "No podemos huír, ¿no? Estos \"puzzles\" todavía nos persiguen incluso ahora...";
+SWWM_KIRINPUZZLEJ2 = "Este maldito lugar... Plagado por estos viles mecanismos... Juro que jamás daré un paso en él.";
+// last puzzle switch on Blight
+SWWM_KIRINPUZZLEK1 = "Por favor... Haz que pare...";
+SWWM_KIRINPUZZLEL1 = "\cxKirin-kun\c-, oye... No pasa nada. Toma... Bebe, te ayudará a relajarte.\c-"; // Ibuki reply
+SWWM_KIRINPUZZLEM1 = "Glu... Glu... Glu...";
+SWWM_KIRINPUZZLEN1 = "Bueno, pero míralo... Ahí bebiéndolo todo como un campeón."; // Saya reply
+SWWM_KIRINPUZZLEO1 = "Ya sabes como va... En cuanto encuentran una teta que mamar, se acabaron todos sus problemas..."; // Ibuki reply
+SWWM_KIRINPUZZLEP1 = "Sabes que \cdDemo-chan\c- puede leer lo que decimos, ¿verdad?"; // Saya reply
+SWWM_KIRINPUZZLEQ1 = "Oh, estoy segura de que le encantaría tomar su turno una vez se acabe la misión, ¿hm?"; // Ibuki reply
+// first puzzle switch on Constable's Gate
+SWWM_KIRINPUZZLER1 = "Más vale que este sea el último de estos \"puzzles\" que vayamos a encontrar...";
+SWWM_KIRINPUZZLER2 = "Urp...";
+SWWM_KIRINPUZZLER3 = "Mis disculpas.";
+SWWM_KIRINPUZZLES1 = "Estaba buena la leche, ¿a que sí?"; // Saya reply
+SWWM_KIRINPUZZLET1 = "Ciertamente... Doy gracias por la bendición de \crIbuki\c-.";
+SWWM_KIRINPUZZLEU1 = "Hacer que pueda lactar a voluntad es una bendición, vaya que sí. Seguro que \cdDemo\c- está también de acuerdo."; // Saya reply
+// super secret cheats
+SWWM_ZNVTXT1 = "\cdDemolicionista\c-, soy yo, \chZanaveth El Corruptor\c-. He testificado del acto que has actuado, sí.";
+SWWM_ZNVTXT2 = "Son \cf%d\c- años... y las mágicas palabras veo en nuevo. Muy impresionada, mucho impresionada.";
+SWWM_ZNVTXT3 = "Así, puedes hacer la cosa... Como los \ctMishe\c- enseñaron también a mí. Una sorpresa no esperada, sí.";
+SWWM_ZNVTXT4 = "Hay tantas muchas palabras poderosas a usar, \cdDemolicionista\c-. Sigue siguiendo para descubrirlas todas.";
+SWWM_ZNVTXT5 = "Debo dar marcha. A favor extender saludos a tía \cgSaya\c- en parte mía. Buena suerte, \cdDemolicionista\c-.";
+// easter egg
+SWWM_SAYAWASTEA1 = "¡Deja de malgastar balas!";
+SWWM_SAYAWASTEB1 = "¿Aun sigues? ¿En serio?";
+SWWM_SAYAWASTEC1 = "Vale, se nota que lo estás haciendo por tu propia satisfacción personal.";
+SWWM_SAYAWASTED1 = "Es casi como si le estuvieras haciendo una paja, o algo...";
+SWWM_SAYAWASTED2 = "Ehm, olvida lo que he dicho.";
+SWWM_SAYAWASTEE1 = "Y sigue... Dándole a la manivela.";
+SWWM_SAYAWASTEF1 = "Vale, te prometo que voy a dejar de mensajearte ya con todo esto. Tú a lo tuyo, supongo.";
diff --git a/language.es_lore b/language.es_lore
index 34e3cf66b..f3f62a168 100644
--- a/language.es_lore
+++ b/language.es_lore
@@ -170,7 +170,7 @@ SWWM_LORETXT_ANARUKON =
"Entre 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"
-"\cfSí, cosa tope molona de mundos paralelos y dioses y guerreros y esas mierdas, ¿verdad? Con cosas así me dan ganas de poder... ya sabes, viajar por todo el multiverso encontrando chismes guays así y conocer gente y tal. A lo mejor un día, quien sabe. Todas las mierdas de los capullos esos de la UAC en serio me hacen reconsiderarlo un poco, lo de los viajes interdimensionales. En serio, es que es como si todas esas típicas viejas historias de \"abrir un portal al infierno\" fueran predicciones de eso. Bueno, me estoy saliendo un poco del tema. Así que, Ashley-san es una de ellos, mola y tal, al menos Yu-chan tiene su novia inmortal. Lo mismo con Taro nii-san, con la monstruito bromista de Ellen-san, también de esa gente, por supuesto. ¿Cuando coño me va a tocar a mí? A ver, tampoco es que me importe mucho, me alegro de tener a Maidbot y a Ibuki y tal, y... supongo que también a ti pero... *suspiro*, estoy celosísima, sabes.\c-";
+"\cfSí, cosa tope molona de mundos paralelos y dioses y guerreros y esas mierdas, ¿verdad? Con cosas así me dan ganas de poder... ya sabes, viajar por todo el multiverso encontrando chismes guays así y conocer gente y tal. A lo mejor un día, quien sabe. Todas las mierdas de los capullos esos de la UAC en serio me hacen reconsiderarlo un poco, lo de los viajes interdimensionales. En serio, es que es como si todas esas típicas viejas historias de \"abrir un portal al infierno\" fueran predicciones de eso. Bueno, me estoy saliendo un poco del tema. Así que, Ashley-san es una de ellos, mola y tal, al menos Yu-chan tiene su novia inmortal. Lo mismo con Taro nii-san, con la monstruito bromista de Ellen-san, también de esa gente, por supuesto. ¿Cuando coño me va a tocar a mí? A ver, tampoco es que me importe mucho, me alegro de tener a Meido y a Ibuki y tal, y... supongo que también a ti pero... *suspiro*, estoy celosísima, sabes.\c-";
SWWM_LORETXT_ANARUKON2 =
"\cxNombre:\c-\n"
"\cf Anarukon (\"Imperecedero\")\c-\n"
@@ -197,7 +197,7 @@ SWWM_LORETXT_ANARUKON2 =
"\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 recordatorio. ¿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 de nuestra boda (cosa fina por cierto). Y ahora, las cuatro estamos casadas con él, y a vivir la buena vida.\c-\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 recordatorio. ¿No es monísimo? Recuerdo como de supertímidas estabais tú y Meido 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 de nuestra boda (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 ahí va y EXPLOTA de repente, soltándome 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_LORETAG_ANGERYSIGIL = "Marca Devastación";
@@ -218,17 +218,19 @@ SWWM_LORETXT_ANGERYSIGIL =
"\n"
"\cfCreo que podría ganarte en una pelea si usara esto. A ver, tampoco es que quiera hacerte daño pero... Solo lo digo hipotéticamente, ya sabes.\c-";
SWWM_LORETXT_ASHLEY =
-"\cxNombre Completo:\c-\n"
-"\cf Ashley Knox\c-\n"
-"\cf Axaleyu Yanikov (nombre Anarukon)\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Británica\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 1964-10-31 (antes de revelación)\c-\n"
-"\cf 1887-10-31 (real)\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @ashley_da_witch (principal)\c-\n"
-"\cf @stylish_witch (arte)\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Ashley Knox\c-\n"
+" \cf Axaleyu Yanikov (nombre Anarukon)\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Británica\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 1964-10-31 (antes de revelación)\c-\n"
+" \cf 1887-10-31 (real)\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Vocalista Principal, Guitarrista (Black Rat's Coven)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @ashley_da_witch (principal)\c-\n"
+" \cf @stylish_witch (arte)\c-\n"
"\n"
"Nacida en Londres en 1887, hija de \cfYrikha Yanikov\c- y \cfMaxwell A. Knox\c-, \cfAshley\c- es la mayor de tres hijos, los otros siendo \cfAdrian Knox\c-, veterano de la Primera y Segunda Guerras Mundiales, y \cfViola Knox\c-, una bruja en prácticas (todavía hasta la fecha actual de 2148). Pasó la mayor parte de su infancia en Cornualles, después de que su madre tuviera que darse a la fuga por acusaciones de brujería (las cuales no eran exactamente falsas).\n"
"\n"
@@ -269,14 +271,17 @@ SWWM_LORETXT_BELT =
"\cfNUNCA te pilles los dedos con esto, duele un huevo.\c-";
SWWM_LORETAG_BIGSHOT = "Don BIG SHOT";
SWWM_LORETXT_BIGSHOT =
-"\cxNombre Completo:\c-\n"
-"\cf John Gunns\c-\n"
-"\cxAlias:\c-\n"
-"\cf Don BIG SHOT\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Americano\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2110-11-12\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf John Gunns\c-\n"
+" \cxAlias:\c-\n"
+" \cf Don BIG SHOT\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Americano\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2110-11-12\c-\n"
+" \cxOcupación:\c-\n"
+" \cf CEO (Industrias BIGSHOT)\c-\n"
+" \cf Consejero (Blackmann Arms)\c-\n"
"\n"
"Un hombre rodeado de misterios, habiendo aparecido de la nada, anunciando ser el hijo de \cfBenellus, Dios de las Escopetas\c-. La credibilidad de esta historia es bastante cuestionable, a pesar de la insistencia de su propia madre, quien cuenta que el dios descendió del cielo, y dándole un \"cartucho bendecido\", la ordenó plantarlo en la tierra, ya que de él, un hombre nacería, quien se convertiría en \"el más poderoso portador del arma definitiva\". Cuenta que John, ya completamente adulto, salió del suelo pocos días después de haber plantado el cartucho, e inmediatamente empezó a \"hacer salir escopetas de la tierra a su alrededor\", y usó los metales de éstas para construir la fortaleza que la familia tiene en el desierto de Nevada.\n"
"\n"
@@ -285,14 +290,17 @@ SWWM_LORETXT_BIGSHOT =
"\cxNotas de Saya:\c-\n"
"\cfSí, el tío está loco perdido, pero mira, ESA cosa... muy MUY en serio que la quería. Hasta me reuní con el tío para poder tocarla con mis propias manos. Esa cosa es... jodidamente bestial, y seguro que no hay persona viviente que pueda usarla, PERO... tú seguro que puedes. Te digo una cosa, cada vez que te saques ese monumental pedazo de metal rompecojones, estaré mirando, así que más te vale ofrecerme un buen espectáculo con el que comer palomitas.\c-";
SWWM_LORETXT_BIGSHOT2 =
-"\cxNombre Completo:\c-\n"
-"\cf John Gunns\c-\n"
-"\cxAlias:\c-\n"
-"\cf Don BIG SHOT\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Americano\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2110-11-12\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf John Gunns\c-\n"
+" \cxAlias:\c-\n"
+" \cf Don BIG SHOT\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Americano\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2110-11-12\c-\n"
+" \cxOcupación:\c-\n"
+" \cf CEO (Industrias BIGSHOT)\c-\n"
+" \cf Consejero (Blackmann Arms)\c-\n"
"\n"
"Un hombre rodeado de misterios, habiendo aparecido de la nada, anunciando ser el hijo de \cfBenellus, Dios de las Escopetas\c-. La credibilidad de esta historia es bastante cuestionable, a pesar de la insistencia de su propia madre, quien cuenta que el dios descendió del cielo, y dándole un \"cartucho bendecido\", la ordenó plantarlo en la tierra, ya que de él, un hombre nacería, quien se convertiría en \"el más poderoso portador del arma definitiva\". Cuenta que John, ya completamente adulto, salió del suelo pocos días después de haber plantado el cartucho, e inmediatamente empezó a \"hacer salir escopetas de la tierra a su alrededor\", y usó los metales de éstas para construir la fortaleza que la familia tiene en el desierto de Nevada.\n"
"\n"
@@ -304,32 +312,6 @@ SWWM_LORETXT_BIGSHOT2 =
"\cfSí, el tío está loco perdido, pero mira, ESA cosa... muy MUY en serio que la quería. Hasta me reuní con el tío para poder tocarla con mis propias manos. Esa cosa es... jodidamente bestial, y seguro que no hay persona viviente que pueda usarla, PERO... tú seguro que puedes. Te digo una cosa, cada vez que te saques ese monumental pedazo de metal rompecojones, estaré mirando, así que más te vale ofrecerme un buen espectáculo con el que comer palomitas.\c-\n"
"\n"
"\cfSinceramente no me sorprende que el tío sobreviviera toda la mierda, probablemente se cargó mil demonios él mismo con todas las mierdas que tiene por ahí, seguro. Y, ni puta idea lo que sea que signifique todo eso de batallas y caras y tal, se habrá vuelto tolai perdido con la invasión y tal.\c-";
-SWWM_LORETAG_BLACKFIREIGNITER = "Encendedor F.N.";
-SWWM_LORETXT_BLACKFIREIGNITER =
-"\cxDesignación:\c-\n"
-"\cf Encendedor de Fuego Negro\c-\n"
-"\cxFabricante:\c-\n"
-"\cf Artesanía Unissix\c-\n"
-"\cf Diseño de LS\c-\n"
-"\cxClasificación:\c-\n"
-"\cf Lanzallamas\c-\n"
-"\n"
-"Ideado por el propio dios primordial de la magia, el \cfEncendedor de Fuego negro\c- es sorprendentemente un arma muy fría y oscura. El fuego negro es un tipo de llama mágica que absorbe el calor y la luz, en lugar de emitirlos.\n"
-"\n"
-"Durante la cumbre de fama de \cfArtesanía Unissix\c-, el dios se presentó personalmente ante \cfMisa Unissix\c- con una petición de un arma que permitiría a prácticamente cualquiera realizar fácilmente \cfMagia de Manipulación de Fuego Negro\c-.\n"
-"\n"
-"El Encendedor es la mezcla perfecta de magia y tecnología, hecha arma. Tienes a tu alcance el poder de invocar llamas congelantes que transformarán a tus enemigos en estatuas de hielo en pocos segundos.\n"
-"\n"
-"\cfFuego Primario:\c- Libera un chorro continuo de Fuego Negro, con rango moderado. Las llamas no solo congelarán rápidamente lo que toquen, también reducirán la temperatura del aire, dejando un rastro de frío persistente.\n"
-"\n"
-"\cfFuego Secundario:\c- Estallidos concentrados que forman lanzas de aire supercongelado las cuales empalarán objetivos pequeños, o simplemente los atravesarán.\n"
-"\n"
-"\cfRecarga:\c- Acopla hasta dos frascos para rellenar la reserva interna de maná oscuro del arma. Cada frasco permanecerá enganchado hasta que se haya vaciado, ya que de otro modo podría escapar energía residual y causar daño al usuario. Si hay un frasco vacío acoplado, la acción de recarga lo desacoplará primero. Los frascos pueden ser usados aun si el depósito está lleno, y actuarán como un \"búfer\" extra de maná hasta vaciarse.\n"
-"\n"
-"\cxNotas de Saya:\c-\n"
-"\cfO sea, que Misa-Misa tiene otros juguetes aparte del trasto enorme ese. Mola que le hagan encargos y tal, el rollito de canela es muy popular por ahí, jejeje...\c-\n"
-"\n"
-"\cfNo he oído mucho sobre todo el tema del Fuego Negro de LS-sama, pero tiene pinta de ser divertido. Me pregunto si se puede usar en una carta mágica...\c-";
SWWM_LORETXT_BLACKMANN =
"\cxNombre:\c-\n"
"\cf Blackmann Arms S.L.\c-\n"
@@ -470,14 +452,17 @@ SWWM_LORETXT_CYRUS =
"\n"
"\cfA ver, puede que me ponga de los nervios a veces, pero el tío fue mi primer socio ahí en plan negocios serios, y joder, tampoco es tan malo aparte de todo el frikismo que suelta... Y bueno, siendo sincera, yo también soy toda una friki repelente, y puedes citarme en eso.\c-";
SWWM_LORETXT_CYTHO =
-"\cxNombre Completo:\c-\n"
-"\cf Archiduque Cytho de la Casa Valathor\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Kuriste\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2008-10-09\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @incuvalathor\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Archiduque Cytho de la Casa Valathor\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Kuriste\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2008-10-09\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Reportero de Noticias Independiente\c-\n"
+" \cf Embajador (Reino Kuriste)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @incuvalathor\c-\n"
"\n"
"Nacido en la ahora caída villa de Iskar en 2008 como uno de los varones más jóvenes de la humilde \cfCasa Valathor\c-, \cfCytho\c- entró al negocio familiar al llegar a la edad adulta, rápidamente ascendiendo en rango en la industria del trabajo sexual del \cfInfierno\c-, en parte dada su belleza innata, pero también por la rápida acumulación de \"clientes satisfechos\" a los que daría servicio regularmente, y los muchos alumnos que tomó bajo su tutela. Ya en 2028, había hecho de la Tierra su segundo hogar, donde abriría una cuenta en redes sociales como una forma más moderna de atraer nueva clientela.\n"
"\n"
@@ -555,16 +540,18 @@ SWWM_LORETXT_DEEPIMPACT =
"\cfSé que eres tope de fuerte, así que más te vale no darle mucho a la manivela. Espera, eso no suena muy bien... mierda. Olvida lo que acabo de decir. Olvida que lo has leído, también.\c-";
SWWM_LORETAG_DEMOLITIONIST = "Demolicionista";
SWWM_LORETXT_DEMOLITIONIST =
-"\cxNombre Completo:\c-\n"
-"\cf Unidad de Combate Autónoma de Primera Generación de Akari Labs\c-\n"
-"\cf Demolicionista (nombre en clave)\c-\n"
-"\cf Demo Miyamoto (primera unidad)\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Japonesa\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2148-01-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @demolitionist_bot\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Unidad de Combate Autónoma de Primera Generación de Akari Labs\c-\n"
+" \cf Demolicionista (nombre en clave)\c-\n"
+" \cf Demo Miyamoto (primera unidad)\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Japonesa\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2148-01-20\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Héroe Profesional\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @demolitionist_bot\c-\n"
"\n"
"El \cfDemolicionista\c- es uno de los mayores logros de \cfAkari Labs\c- en el campo de la robótica. Una unidad de combate manejada por IA capaz de usar eficientemente todo tipo de armamento a su disposición, altamente resistente a todo tipo de daño y capaz de operar en cualquier entorno, incluyendo el vacío del espacio. Puede considerarse el sucesor espiritual del programa de supersoldado \cfOni Rojo\c-, en cierto modo, ya que también sirve el mismo propósito de defender a la Tierra de una fuerza invasora mayor. El proyecto ha sido financiado y patrocinado por los muchos socios de Akari Labs, y es fruto de la colaboración entre \cfSaya Miyamoto\c- y el \cfArchiduque Cytho Valathor\c-, representante de la población civil del \cfInfierno\c-.\n"
"\n"
@@ -606,7 +593,7 @@ SWWM_LORETXT_DEMOLITIONIST2 =
"\n"
"De esta primera unidad anteriormente mencionada, se conocen muchos más detalles gracias a la sesión de preguntas y respuestas que Saya realizó en directo meses antes del despliegue. La unidad es reconocida como parte de la familia Miyamoto, teniendo el nombre completo de \cfDemo Miyamoto\c-, y Saya se refiere a ella como su \"hija\". Se puede describir a Demo como \"muy habladora\" y aficionada a hacer chistes para poner una sonrisa en las caras de la gente, aunque también es muy seria y determinada en su deseo de proteger a quien lo necesita. También es bastante popular con la comunidad LGBTQIA+ dado su feroz soporte de proteger los derechos de aquellos que sufren discriminación por su identidad, e incluso ha anunciado públicamente ser no-binaria. Esto fue algo poco inesperado, dada la experiencia de Saya con el colectivo.\n"
"\n"
-"Tras su éxito luchando contra los ejércitos del Infierno, Saya se dio cuenta de que no haría falta fabricar más unidades, así que Demo se convirtió en el \"arma definitiva\" de Akari Labs, ella sola. Además, fue recompensada adicionalmente con un cuerpo adjunto de Maidbot, el cual Demo usa libremente durante su tiempo libre, y le ha permitido expresar verdaderamente sus sentimientos hacia Saya, convirtiéndose en su tercera pareja, junto con Maidbot e Ibuki.\n"
+"Tras su éxito luchando contra los ejércitos del Infierno, Saya se dio cuenta de que no haría falta fabricar más unidades, así que Demo se convirtió en el \"arma definitiva\" de Akari Labs, ella sola. Además, fue recompensada adicionalmente con un cuerpo adjunto de Maidbot, el cual Demo usa libremente durante su tiempo libre, y le ha permitido expresar verdaderamente sus sentimientos hacia Saya, convirtiéndose en su tercera pareja, junto con Meido e Ibuki.\n"
"\n"
"\cxNotas de Saya:\c-\n"
"\cfEres tan mona, Demo-chan. Desde luego, mira que me he lucido con ese cuerpo de Maidbot. En serio me pilló por sorpresa cuando, justo al pasarte a él, así de repente... te me echaste encima abrazándome y besándome tanto y... buf~\c-\n"
@@ -615,16 +602,18 @@ SWWM_LORETXT_DEMOLITIONIST2 =
"\n"
"\cfEn fin, ya vale de leer sobre ti mientras trabajas. Sal de aquí, tonti.\c-";
SWWM_LORETXT_DEMOLITIONIST3 =
-"\cxNombre Completo:\c-\n"
-"\cf Unidad de Combate Autónoma de Primera Generación de Akari Labs\c-\n"
-"\cf Demolicionista (nombre en clave)\c-\n"
-"\cf Demo Miyamoto (primera unidad)\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Japonesa\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2148-01-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @demolitionist_bot\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Unidad de Combate Autónoma de Primera Generación de Akari Labs\c-\n"
+" \cf Demolicionista (nombre en clave)\c-\n"
+" \cf Demo Miyamoto (primera unidad)\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Japonesa\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2148-01-20\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Héroe Profesional\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @demolitionist_bot\c-\n"
"\n"
"El \cfDemolicionista\c- es uno de los mayores logros de \cfAkari Labs\c- en el campo de la robótica. Una unidad de combate manejada por IA capaz de usar eficientemente todo tipo de armamento a su disposición, altamente resistente a todo tipo de daño y capaz de operar en cualquier entorno, incluyendo el vacío del espacio. Puede considerarse el sucesor espiritual del programa de supersoldado \cfOni Rojo\c-, en cierto modo, ya que también sirve el mismo propósito de defender a la Tierra de una fuerza invasora mayor. El proyecto ha sido financiado y patrocinado por los muchos socios de Akari Labs, y es fruto de la colaboración entre \cfSaya Miyamoto\c- y el \cfArchiduque Cytho Valathor\c-, representante de la población civil del \cfInfierno\c-.\n"
"\n"
@@ -636,7 +625,7 @@ SWWM_LORETXT_DEMOLITIONIST3 =
"\n"
"De esta primera unidad anteriormente mencionada, se conocen muchos más detalles gracias a la sesión de preguntas y respuestas que Saya realizó en directo meses antes del despliegue. La unidad es reconocida como parte de la familia Miyamoto, teniendo el nombre completo de \cfDemo Miyamoto\c-, y Saya se refiere a ella como su \"hija\". Se puede describir a Demo como \"muy habladora\" y aficionada a hacer chistes para poner una sonrisa en las caras de la gente, aunque también es muy seria y determinada en su deseo de proteger a quien lo necesita. También es bastante popular con la comunidad LGBTQIA+ dado su feroz soporte de proteger los derechos de aquellos que sufren discriminación por su identidad, e incluso ha anunciado públicamente ser no-binaria. Esto fue algo poco inesperado, dada la experiencia de Saya con el colectivo.\n"
"\n"
-"Tras su éxito luchando contra los ejércitos del Infierno, Saya se dio cuenta de que no haría falta fabricar más unidades, así que Demo se convirtió en el \"arma definitiva\" de Akari Labs, ella sola. Además, fue recompensada adicionalmente con un cuerpo adjunto de Maidbot, el cual Demo usa libremente durante su tiempo libre, y le ha permitido expresar verdaderamente sus sentimientos hacia Saya, convirtiéndose en su tercera pareja, junto con Maidbot e Ibuki. Desde Mayo de 2171, está adicionalmente casada con \cfKirin Xanai\c-, líder del \cfImperio Sykhai de Akkou\c-.\n"
+"Tras su éxito luchando contra los ejércitos del Infierno, Saya se dio cuenta de que no haría falta fabricar más unidades, así que Demo se convirtió en el \"arma definitiva\" de Akari Labs, ella sola. Además, fue recompensada adicionalmente con un cuerpo adjunto de Maidbot, el cual Demo usa libremente durante su tiempo libre, y le ha permitido expresar verdaderamente sus sentimientos hacia Saya, convirtiéndose en su tercera pareja, junto con Meido e Ibuki. Desde Mayo de 2171, está adicionalmente casada con \cfKirin Xanai\c-, líder del \cfImperio Sykhai de Akkou\c-.\n"
"\n"
"\cxNotas de Saya:\c-\n"
"\cfEres tan mona, Demo-chan. Desde luego, mira que me he lucido con ese cuerpo de Maidbot. En serio me pilló por sorpresa cuando, justo al pasarte a él, así de repente... te me echaste encima abrazándome y besándome tanto y... buf~\c-\n"
@@ -823,6 +812,8 @@ SWWM_LORETXT_DOOMGUY =
"\cf Americano\c-\n"
"\cxFecha de Nacimiento:\c-\n"
"\cf CLASIFICADO\c-\n"
+"\cxOcupación:\c-\n"
+"\cf Marine (UAC)\c-\n"
"\n"
"El \cfMarine de Doom\c- es el único superviviente de las invasiones demoníacas en las bases de la \cfUAC\c- en Fobos y Deimos. Habiendo sido transferido a \cfMars City\c- no mucho antes de aquellos incidentes, formó parte del destacamento enviado a defender las bases de Fobos de los demonios invasores que habían de alguna forma tomado el control de los sistemas de teletransporte con los que la UAC estaba experimentando. Tras su impresionante hazaña de, solo por su cuenta, haber suprimido la invasión tanto en Fobos como Deimos, junto con haber llevado su batalla al mismo \cfInfierno\c- y haber vuelto, fue nombrado \"solucionador de problemas\" de la organización.\n"
"\n"
@@ -845,6 +836,8 @@ SWWM_LORETXT_DOOMGUY2 =
"\cf Americano\c-\n"
"\cxFecha de Nacimiento:\c-\n"
"\cf CLASIFICADO\c-\n"
+"\cxOcupación:\c-\n"
+"\cf N/A\c-\n"
"\n"
"El \cfMarine de Doom\c- es el único superviviente de las invasiones demoníacas en las bases de la \cfUAC\c- en Fobos y Deimos. Habiendo sido transferido a \cfMars City\c- no mucho antes de aquellos incidentes, formó parte del destacamento enviado a defender las bases de Fobos de los demonios invasores que habían de alguna forma tomado el control de los sistemas de teletransporte con los que la UAC estaba experimentando. Tras su impresionante hazaña de, solo por su cuenta, haber suprimido la invasión tanto en Fobos como Deimos, junto con haber llevado su batalla al mismo \cfInfierno\c- y haber vuelto, fue nombrado \"solucionador de problemas\" de la organización.\n"
"\n"
@@ -867,6 +860,8 @@ SWWM_LORETXT_DOOMGUY3 =
"\cf Americano\c-\n"
"\cxFecha de Nacimiento:\c-\n"
"\cf CLASIFICADO\c-\n"
+"\cxOcupación:\c-\n"
+"\cf N/A\c-\n"
"\n"
"El \cfMarine de Doom\c- es el único superviviente de las invasiones demoníacas en las bases de la \cfUAC\c- en Fobos y Deimos. Habiendo sido transferido a \cfMars City\c- no mucho antes de aquellos incidentes, formó parte del destacamento enviado a defender las bases de Fobos de los demonios invasores que habían de alguna forma tomado el control de los sistemas de teletransporte con los que la UAC estaba experimentando. Tras su impresionante hazaña de, solo por su cuenta, haber suprimido la invasión tanto en Fobos como Deimos, junto con haber llevado su batalla al mismo \cfInfierno\c- y haber vuelto, fue nombrado \"solucionador de problemas\" de la organización.\n"
"\n"
@@ -895,14 +890,17 @@ SWWM_LORETXT_EBARRIER =
"\cfUna pequeña recomendación de Misa. Si funciona tan bien como dice, no tendrás mucho problema con todo el lodo asqueroso ese que los cazurros de la UAC van soltando por ahí (pues vaya si no les importa una mierda el medio ambiente). O... bueno, supongo que las llamas del Infierno tampoco te van a tostar los circuitos.\c-\n"
"";
SWWM_LORETXT_ELLEN =
-"\cxNombre Completo:\c-\n"
-"\cf Elena \"Ellen\" Yanikov XXI\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Americana\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2066-06-06\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @Mischief_XXI\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Elena \"Ellen\" Yanikov XXI\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Americana\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2066-06-06\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Mercenaria\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @Mischief_XXI\c-\n"
+"\n"
"\n"
"Nacida en Boston en 2066, hija de \cfElena Yanikov XIX\c- y \cfGottfried Steiner\c-, \cfEllen\c- es la menor de dos hermanas (ambas con el nombre de Elena). Esta curiosidad de que todas las mujeres en su familia compartan el mismo nombre se puede trazar de vuelta hasta \cfElena Yanikov I\c-, nacida en 1703, quien tomó esta decisión, en base a una creencia supersticiosa de que esto \"preservará su inmortalidad para siempre\". Esto no se alejaba mucho de la verdad, en cierto modo, pero no tenía nada que ver con la herencia de nombres. Se ha verificado que los genes \cfAnarukon\c- son preservados en su totalidad por todas las descendientes mujer, no importa cuantas generaciones, muy especialmente entre aquellas del linaje Yanikov.\n"
"\n"
@@ -920,35 +918,6 @@ SWWM_LORETXT_ELLEN =
"\cfOh ya, hablando de Ellen-san. Es una puta bromista de cuidado, es que vamos, una súper troll de la vida. Mira, una vez... bueno, mejor creo que me lo voy a callar, porque es que me da muchísima vergüenza. Aún me duele el culo desde entonces. Que va, NO pienso explicarlo, coño si no. Usa tu imaginación, Demo-chan.\c-\n"
"\n"
"\cfAh, y también, cosa tope de buena de tenerla por aquí. Tiene unos contactos muy interesantes. Sí, la mayoría de la gente no lo sabe, pero su abuelo es un demonio. Sí, uno de verdad, del Infierno y todo. Y es una monada, también. Se llama Cytho Valathor, y dice que es un \"íncubo reformado\", lo que sea que signifique eso. Siempre que necesite saber algo sobre lo que pasa en la tierra de fuego eterno, es el tío al que acudo.\c-";
-SWWM_LORETAG_EMPCARBINE = "Carabina Raíl";
-SWWM_LORETXT_EMPCARBINE =
-"\cxDesignación:\c-\n"
-"\cf Carabina de Raíl de Impulsos Electromagnéticos\c-\n"
-"\cxFabricante:\c-\n"
-"\cf Instituto Tecnológico Tach-Engine\c-\n"
-"\cxClasificación:\c-\n"
-"\cf Arma de Energía Dirigida\c-\n"
-"\n"
-"La \cfCarabina de Raíl de Impulsos Electromagnéticos\c- es el primerísimo intento de \cfTach-Engine\c- de combinar la tecnología humana actual con la de los experimentos recuperados de su expedición a las oficinas arruinadas de \cfDecade Mechanics\c-. Muy similar a otras armas típicas de rayos de partículas, pero con el impulso atronador de materia exótica altamente destructiva, ha sido considerada muy superior incluso a la potente \cfThunder Buster\c- tan preciada por las tropas de la UAC.\n"
-"\n"
-"Inesperadamente, la Carabina de Raíl es un fusil de cerrojo con depósito tubular, el cual emplea barras de puro \cfDysedum\c-. Cada una de estas permitiendo al arma descargar pulsos dirigidos de 20kA hacia un objetivo ionizado, friéndolo al instante, y potencialmente esparciendo sus efectos mortíferos a otros cercanos.\n"
-"\n"
-"Se ha de tener en cuenta que el uso de este arma en el agua es inseguro, ya que la descarga se dispersará violentamente a través de todo el medio.\n"
-"\n"
-"\cfFuego Primario:\c- Mantén para emitir una leve carga ionizante a la zona apuntada. Cuanto más se mantenga, más preciso será el disparo. Suelta para liberar el rayo. Si la barra está gastada, acciona el perno para cargar una nueva.\n"
-"\n"
-"\cfFuego Secundario:\c- También emite una carga ionizante, pero no libera al soltar. Útil si no puedes garantizar que tu objetivo esté siempre visible, o si quieres marcar rápidamente varios objetivos.\n"
-"\n"
-"\cfRecarga:\c- Se pueden depositar más barras en el arma a necesidad, hasta un máximo de tres.\n"
-"\n"
-"\cfZoom:\c- Mira ajustable de hasta 8 aumentos.\n"
-"\n"
-"\cfTécnicas:\c- Al ionizar varios objetivos puedes garantizar que el rayo se bifurque en arcos menores y los alcance a todos, aunque el potencial de daño será dividido entre ellos.\n"
-"\n"
-"\cxNotas de Saya:\c-\n"
-"\cfSabes, cualquier cosa que se cague en la UAC solo con existir me parece buena.\c-\n"
-"\n"
-"\cfPero esta cosa, además, también se lleva puntos extra por su descojonante potencial para freír hijos de puta. En serio, es que es como un puto relámpago saliendo de esto.\c-";
SWWM_LORETXT_ENGINETECH =
"\cxNombre:\c-\n"
"\cf Instituto Tecnológico Tach-Engine\c-\n"
@@ -1053,28 +1022,6 @@ SWWM_LORETXT_FABRICATOR =
"\cfOh, tienes que estar de puta broma. Ahora el friki este va y nos mete mierda de gacha, con tiers y todo.\c-\n"
"\n"
"\cfEn serio, juro que el tío hace esto a propósito para joderme o algo.\c-";
-SWWM_LORETAG_FISTGUN = "Mano Divina";
-SWWM_LORETXT_FISTGUN =
-"\cxDesignación:\c-\n"
-"\cf Mano Divina\c-\n"
-"\cxFabricante:\c-\n"
-"\cf Korovithuhcp (original)\c-\n"
-"\cf Artesanía Unissix (réplica)\c-\n"
-"\cxDesignación:\c-\n"
-"\cf Guantelete Mágico\c-\n"
-"\n"
-"La \cfMano Divina\c- fue un arma que el dios \cfKorovithuhcp\c- construyó incontables milenios atrás, y fue pasando entre muchos héroes de leyenda. Finalmente se perdió, y el dios no mostró interés en crear una nueva. Esto, obviamente, no detuvo a \cfMisa Unissix\c- en el intento de hacer exactamente eso. Siguiendo documentos históricos de su uso, construyó su propia versión en base a una mezcla de magia arcana y tecnología moderna. Regaló una a su hija, \cfZanaveth Nekuraku III\c-, y otra a la \cfDemolicionista\c-.\n"
-"\n"
-"\cfFuego Primario:\c- Carga un puñetazo, y luego lo suelta. El guantelete se lanzará de frente y luego volverá a ti.\n"
-"\n"
-"\cfFuego Secundario:\c- Carga una bofetada de ancho rango. Al soltarlo abofeteará de forma muy ruidosa y violenta todos los objetivos que tengas delante.\n"
-"\n"
-"\cfTécnicas:\c- Dada su naturaleza, la Mano Divina es susceptible a los efectos de un \cfRagekit\c-, incrementando su fuerza y rango.\n"
-"\n"
-"\cxNotas de Saya:\c-\n"
-"\cfMenudo envío especial que nos mandó Zana-chan. Y cuando enseñamos que iba bien, y molaba, Misa-Misa se puso a tope y empezó a fabricarlas en masa. Si es que es juro que es demasiado adorable.\c-\n"
-"\n"
-"\cfEn fin, esos bichos van a recibir una buena somanta con esta cosa. Que ganas tengo de verla en acción con objetivos de verdad. Especialmente después de... Aquel incidente con el saco de boxeo.\c-";
SWWM_LORETAG_FORX = "Aeronáutica Forx";
SWWM_LORETXT_FORX =
"\cxNombre:\c-\n"
@@ -1319,37 +1266,6 @@ SWWM_LORETXT_GODS2 =
"\cfSabes, hay gente que me pregunta como es que aun soy agnóstica. Dudo que sepan realmente lo que es el agnosticismo.\c-\n"
"\n"
"\cfActualización: El tema ese de los admins está en otro artículo. En serio, fue una puta locura todo eso. Ni de puta coña me voy a olvidar de todo lo que pasó el día después de nuestra boda con Kirin-kun, madre de dios...\c-";
-SWWM_LORETAG_GRANDLANCE = "Gran Lanza";
-SWWM_LORETXT_GRANDLANCE =
-"\cxDesignación:\c-\n"
-"\cf Suvan-Kin (\"Gran Lanza\")\c-\n"
-"\cxFabricante:\c-\n"
-"\cf Eushura Kmonn Jr.\c-\n"
-"\cxClasificación:\c-\n"
-"\cf Cañón de Riel Portátil\c-\n"
-"\n"
-"Ideado como la \"última palabra\" en armamento, la \cfSuvan-Kin\c- (\"Gran Lanza\" en el idioma \cfXekkas\c-) es el primer cañón de riel realmente portátil del mundo, capaz de lanzar proyectiles a velocidades de hasta 7500km/h (o 14000km/h a carga máxima). El arma es potenciada en su totalidad por un compacto paquete de batería de cuatro celdas de Korberon-Eneiebium, fácil de reemplazar cuando se necesite. La munición empleada son arpones de Almacero de alta resonancia, capaces de atravesar limpiamente todo, sin llevar ni un solo rasguño.\n"
-"\n"
-"Si el potencial penetrante de estos arpones no es lo suficientemente destructivo, una bomba de fusión pura en miniatura incrustada a la cabeza ciertamente añadirá aun más a eso. En palabras de la gente \cfXekkian\c-: \cf\"Las llamas cegadoras de un sol sacrificado a su nacer desgarrarán toda vida, arrancarán el alma de su cuerpo, y no dejarán rastro alguno de aquellos desafortunados que hayan agraviado al portador de la Gran Lanza.\"\c-\n"
-"\n"
-"\cfFuego Primario:\c- Disparo de único objetivo. El arpón detonará automáticamente en contacto con cualquier cosa. El área de efecto es bastante enorme, así que mantén la distancia.\n"
-"\n"
-"\cfFuego Secundario:\c- Disparo de múltiple objetivo. El arpón es disparado a mayor velocidad, y penetrará varios objetivos hasta detenerse finalmente contra algo suficientemente sólido.\n"
-"\n"
-"\cfRecarga Primaria:\c- Recarga el arma.\n"
-"\n"
-"\cfRecarga Secundaria:\c- Cambia la batería. Esta acción solo puede hacerse en cuanto la carga sea lo suficientemente baja, ya que sería un derroche de otro modo.\n"
-"\n"
-"\cfTécnicas:\c- Cuanto más mantengas el fuego secundario, con más fuerza y velocidad se disparará. A carga máxima podrá incluso derribar paredes.\n"
-"\n"
-"\cfAdvertencia:\c- Antes de disparar, los rieles deben extenderse hasta su longitud completa. Si hay algún obstáculo en medio que no pueda ser apartado, la operación del arma será cancelada.\n"
-"\n"
-"\cxNotas de Saya:\c-\n"
-"\cfPerdón pero, ¿¿¿QUE COÑO ES ESTO???\c-\n"
-"\n"
-"\cf¿Es esto un puto cañón de riel? Vamos, ¿uno de verdad? ¿¿Y resulta que es portátil?? ¿¿¿Y DISPARA PUTOS ARPONES CON PUTAS BOMBAS DE FUSIÓN EN ELLOS??? Vale, olvida lo que dije sobre la otra arma enorme de Kmonn, ESTA MIERDA es incluso aun más puto ridícula, es que, ¿¿¿que puto cojones es todo esto???\c-\n"
-"\n"
-"\cfPues eso, por eso está colocada en el mismo puesto que el Ynykron. Piensa en ella como una alternativa \"más segura\", básicamente. No es apocalíptica, pero sigue siendo jodidamente fuerte.\c-";
SWWM_LORETAG_GRAVITYSUPPRESSOR = "Supr. de Gravedad";
SWWM_LORETXT_GRAVITYSUPPRESSOR =
"\cxDesignación:\c-\n"
@@ -1585,16 +1501,18 @@ SWWM_LORETXT_HELLBLAZER =
"\n"
"\cfAhora que lo miro, lo de que las réplicas usen Nokron fue una buena idea. No sabía yo que esa cosa explotara. Realmente da que pensar sobre todos esos mecanismos de seguridad que tienen los motores de Microfusión, definitivamente justificados si ESO puede pasar.\c-";
SWWM_LORETXT_IBUKI =
-"\cxNombre Completo:\c-\n"
-"\cf Ibuki Miyamoto\c-\n"
-"\cf Oni Rojo (nombre en clave)\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Japonesa\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2074-09-09\c-\n"
-"\cxTwitter\c-\n"
-"\cf @lewd_ibuki (principal)\c-\n"
-"\cf @ibuki_tiddy (fotos)\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Ibuki Miyamoto\c-\n"
+" \cf Oni Rojo (nombre en clave)\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Japonesa\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2074-09-09\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Mercenaria, Modelo de Desnudos, Vlogger\c-\n"
+" \cxTwitter\c-\n"
+" \cf @lewd_ibuki (principal)\c-\n"
+" \cf @ibuki_tiddy (fotos)\c-\n"
"\n"
"\cfIbuki\c- es el resultado del programa de supersoldado \cfOni Rojo\c-, ideado por \cfSaya Miyamoto\c- de \cfAkari Labs\c-. La existencia de este proyecto se mantuvo en secreto hasta su revelación pública en Junio de 2077. Hubo considerable controversia alrededor del programa Oni Rojo, incluyendo la implicación personal de Saya en él, habiendo aceptado un pago de 40 mil millones de dólares a cambio (lo cual se descubrió tener relación con la anterior venta del estado de Texas a México semanas antes). A pesar de su claro potencial y extraordinarias habilidades de combate, fue enviada demasiado tarde, ya que solo momentos después, la \cfCicatriz Blanca\c- ocurrió, y con ella, la devastación total de los \cfEstados Unidos\c-.\n"
"\n"
@@ -1647,6 +1565,8 @@ SWWM_LORETXT_IMANAKIT =
"\cf Indeterminado\c-\n"
"\cxFecha de Nacimiento:\c-\n"
"\cf Indeterminado\c-\n"
+"\cxOcupación:\c-\n"
+"\cf CEO (Imanaki Corp)\c-\n"
"\n"
"El fundador y CEO de \cfImanaki Corp\c-, y también el único miembro restante de la familia Imanaki tras los \cfAsesinatos de la Mansión Onoke\c- de 2003. \cfTetsuya\c- siempre ha mantenido mucho secretismo acerca de sí mismo, así que no se sabe nada realmente de su vida personal o historia, ni su apariencia física.\n"
"\n"
@@ -1762,16 +1682,18 @@ SWWM_LORETXT_KEYCHAIN =
"\n"
"\cfTRANS RIGHTS! FUCK YEAH!\c-";
SWWM_LORETXT_KIRIN =
-"\cxNombre Completo:\c-\n"
-"\cf Kirin Xanai\c-\n"
-"\cxTítulo:\c-\n"
-"\cf Emperador Infantil del Imperio Sykhai de Akkou\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Akkouxhei\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2080-04-13\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @kiririn_xanai\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Kirin Xanai\c-\n"
+" \cxTítulo:\c-\n"
+" \cf Emperador Infantil del Imperio Sykhai de Akkou\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Akkouxhei\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2080-04-13\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Consejero Comunal (Imperio Sykhai)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @kiririn_xanai\c-\n"
"\n"
"Nacido en 2080, hijo de \cfSyrakha Yanikov\c- y \cfAzya Xanai\c-, \cfKirin\c- se convirtió en emperador de \cfAkkou\c- a la temprana edad de 12 años, habiendo demostrado un gran interés en seguir los pasos de su madre.\n"
"\n"
@@ -1855,12 +1777,17 @@ SWWM_LORETXT_KIRINPLUSH =
"\n"
"\cfAhhhh... Es tan mono, y puedes oírlo reír cuando lo aprietas, oh dios es tan... ¡absolutamente adorable! Seguro que vas a estar ya lista para darle todos los achuchones en cuanto lo tengas, también. Joder... Kirin-kun... necesito el de verdad ahora mismo, ¡voy a darle un ABRAZO ENORME!\c-";
SWWM_LORETXT_KMONN =
-"\cxNombre Completo:\c-\n"
-"\cf Eushura Kmonn Jr.\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Xekkian\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 8731 BC\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Eushura Kmonn Jr.\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Xekkian\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 8731 BC\c-\n"
+" \cxOcupación:\c-\n"
+" \cf CTO (Kmonn Shuna)\c-\n"
+" \cf Consejero (Instituto Tecnológico Tach-Engine)\c-\n"
+"\n"
+"\n"
"\n"
"\cfEushura Kmonn Jr.\c-, hijo de \cfEushura Kmonn Sr.\c-, es un gran inventor del \cfReino de Xekke\c-, en el planeta de \cfIxxeney\c-. Desde una edad temprana fue preparado para igualar la grandeza de su padre, y no tardó mucho en conseguir realizar su propia fama tras años de trabajo como su ayudante. Su creatividad e imaginación no tenían límites, y hay a su nombre un gran total de 279 logros notables en los campos tanto de la ofensa como defensa militar, lo cual ha ayudado a potenciar las fuerzas del reino, haciendo de ellos uno de los más fiables y reclamados por toda la \cfCoalición X'Animen\c- para tareas de defensa aliada.\n"
"\n"
@@ -1890,12 +1817,18 @@ SWWM_LORETXT_KNOWLEDGEBASE =
"\n"
"\cfAh, y de paso, gracias muchas a Ana-san por la traducción al Castellano. No pude resistirme, es que estaba tan ilusionada por hacerlo y es tan mona... Me ha dicho que le hace mucha gracia como suenan todos mis desvaríos en su idioma, juju.\c-";
SWWM_LORETXT_LOCKE =
-"\cxNombre Completo:\c-\n"
-"\cf Janus Locke Hoodth\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Qurensniv\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 1980-07-30\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Janus Locke Hoodth\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Qurensniv\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 1980-07-30\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Inventor\c-\n"
+"\n"
+"\n"
+"\n"
+"\n"
"\n"
"\cfJanus Locke\c- es el hermano menor del difunto \cfDr. Häzel Hoodth\c- conocido por muchos como el \cfDoctor Chiflado de Kereshnovka\c-. Tras oír noticias de la muerte de Häzel en 1987 (especificamente, habiendo recibido dichas noticias 10 años después, mientras estudiaba en el extranjero), en la explosión de una plataforma petrolífera cercana al pueblo mientras realizaba sus experimentos para \"obtener la esencia de la inmortalidad\", Locke cambió por completo. Decidió continuar el trabajo de su hermano, mientras al mismo tiempo aun mantenía su empleo actual como fabricante de juguetes. Sin embargo, la locura en la que cayó se extendería también a eso, con los muchos productos que saldrían con su marca de \cfJuguetes Maravillosos del Dr. Locke\c- volviéndose cada vez más peligrosos, o incluso letales.\n"
"\n"
@@ -1967,27 +1900,29 @@ SWWM_LORETXT_LUNA =
"\n"
"\cfOjalá todo volviese a como era antes. A ver, ya, como nuestro país no firmó la mierda esa del tratado de la Cicatriz Blanca podemos seguir usando sus cosas, pero no pueden venir ellos aquí, ni se nos permite ir allá tampoco. Puta mierda todo.\c-";
SWWM_LORETXT_MAIDBOT =
-"\cxNombre Completo:\c-\n"
-"\cf Maidbot \"Meido\" Miyamoto\c-\n"
-"\cf Meidobot (nombre artístico)\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Japonesa\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2017-07-07\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @meidobot\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Meido Miyamoto\c-\n"
+" \cf Meidobot (nombre artístico)\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Japonesa\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2017-07-07\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Idol\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @meidobot\c-\n"
"\n"
-"Siendo el primer proyecto de IA de \cfSaya Miyamoto\c-, \cfMaidbot\c- inicialmente era poca cosa, sirviendo principalmente como un robot de limpieza con una inteligencia muy limitada, mayormente capaz de recibir órdenes simples. Con el tiempo, Saya expandiría sus habilidades, permitiendo una interactividad más compleja, pero aún limitada. Saya siempre sentía que a pesar de sus esfuerzos, a pesar de lo mucho que Maidbot gradualmente parecía más \"real\", nunca era suficiente. Al final, era \"śolo una máquina\".\n"
+"Siendo el primer proyecto de IA de \cfSaya Miyamoto\c-, \cfMeido\c- inicialmente era poca cosa, sirviendo principalmente como un robot de limpieza con una inteligencia muy limitada, mayormente capaz de recibir órdenes simples. Con el tiempo, Saya expandiría sus habilidades, permitiendo una interactividad más compleja, pero aún limitada. Saya siempre sentía que a pesar de sus esfuerzos, a pesar de lo mucho que Meido gradualmente parecía más \"real\", nunca era suficiente. Al final, era \"śolo una máquina\".\n"
"\n"
-"Notablemente, se ha de mencionar el intento de Saya de hacerla cantante, algo que tuvo un éxito inesperado, realmente. Tras su debut inicial, más y más artistas compondrían canciones para que Maidbot las interpretara. En 2020, Maidbot se había convertido en una completa \"Idol Artificial\", suficientemente famosa como par tomar parte en los Juegos Olímpicos de Tokio, cantando el himno nacional.\n"
+"Notablemente, se ha de mencionar el intento de Saya de hacerla cantante, algo que tuvo un éxito inesperado, realmente. Tras su debut inicial, más y más artistas compondrían canciones para que Meido las interpretara. En 2020, Meido se había convertido en una completa \"Idol Artificial\", suficientemente famosa como par tomar parte en los Juegos Olímpicos de Tokio, cantando el himno nacional.\n"
"\n"
-"Tras el \cfEvento Luna\c- de 2021, Saya recibió la visita de \cfZanaveth Nekuraku II\c-, jefa de investigación de IA en \cfNekuratek\c-, el mayor gigante tecnológico \cfNukuri\c-. Curiosa por la cultura humana, decidió conocerla, ya que tenían intereses similares. Zanaveth quedó bastante impresionada por todo lo que \cfAkari Labs\c- había logrado, y mostró un interés especial por Maidbot, también.\n"
+"Tras el \cfEvento Luna\c- de 2021, Saya recibió la visita de \cfZanaveth Nekuraku II\c-, jefa de investigación de IA en \cfNekuratek\c-, el mayor gigante tecnológico \cfNukuri\c-. Curiosa por la cultura humana, decidió conocerla, ya que tenían intereses similares. Zanaveth quedó bastante impresionada por todo lo que \cfAkari Labs\c- había logrado, y mostró un interés especial por Meido, también.\n"
"\n"
-"Habiendo entablado amistad rápidamente con Saya llegado este punto, se ofreció a mejorar la IA de Maidbot con la tecnología más avanzada que tenían: El \cfFramework de IA Nekuronbot\c-. Habiendo aceptado esta oferta, Maidbot \"renació\" de su anterior forma limitada. Era ahora completamente capaz de pensamiento individual, libre albedrío y, más importante, emociones.\n"
+"Habiendo entablado amistad rápidamente con Saya llegado este punto, se ofreció a mejorar la IA de Meido con la tecnología más avanzada que tenían: El \cfFramework de IA Nekuronbot\c-. Habiendo aceptado esta oferta, Meido \"renació\" de su anterior forma limitada. Era ahora completamente capaz de pensamiento individual, libre albedrío y, más importante, emociones.\n"
"\n"
-"No es sorpresa que Saya siempre sintió algo por ella, al mismo tiempo que era completamente consciente de la imposibilidad de que ella correspondiera a su amor, pero ahora, todo había cambiado. Maidbot lo sabía, y confesó que en su nueva forma, ella podía \"sentir algo\" también. Con el tiempo, logró comprender mejor estos sentimientos, y se convertiría en la primera novia de Saya.\n"
+"No es sorpresa que Saya siempre sintió algo por ella, al mismo tiempo que era completamente consciente de la imposibilidad de que ella correspondiera a su amor, pero ahora, todo había cambiado. Meido lo sabía, y confesó que en su nueva forma, ella podía \"sentir algo\" también. Con el tiempo, logró comprender mejor estos sentimientos, y se convertiría en la primera novia de Saya.\n"
"\n"
-"Tras estos eventos, Maidbot pasó a formar parte de la familia, adoptando el apellido Miyamoto. Mucho después, y con la ayuda de Zanaveth, Saya comenzaría la creación de más maidbots, deseando que todo el mundo pudiera tener a su propia Maidbot. Se estableció un servicio de adopción en 2023, donde las maidbots, quienes eran criadas y preparadas en Akari Labs, podrían entrevistarse con adoptadores en potencia, permitiendo tener la decisión final sobre con quién vivir. Este servicio fue completamente gratuito, ya que la compañía tenía más que suficientes fondos con sus otros servicios, lo cual incrementó su popularidad aun más. Todos querían tener su propia Maidbot, y las Maidbots en sí eran felices de tener una familia con la que vivir.\n"
+"Tras estos eventos, Meido pasó a formar parte de la familia, adoptando el apellido Miyamoto. Mucho después, y con la ayuda de Zanaveth, Saya comenzaría la creación de más maidbots, deseando que todo el mundo pudiera \"tener a su propia Meido\". Se estableció un servicio de adopción en 2023, donde las maidbots, quienes eran criadas y preparadas en Akari Labs, podrían entrevistarse con adoptadores en potencia, permitiendo tener la decisión final sobre con quién vivir. Este servicio fue completamente gratuito, ya que la compañía tenía más que suficientes fondos con sus otros servicios, lo cual incrementó su popularidad aun más. Todos querían tener su propia Maidbot, y las Maidbots en sí eran felices de tener una familia con la que vivir.\n"
"\n"
"\cxNotas de Saya:\c-\n"
"\cfMeido-chan es tan dulce~ Y su voz es tan bonita~\c-\n"
@@ -1999,7 +1934,7 @@ SWWM_LORETXT_MAIDBOT =
"\cfJeje... Desde luego me alegro mucho de hacerla \"completa\", por cierto... Mejor decisión de mi vida. Deja que te diga, cuando hacemos \"cositas\" las dos... es como estar en el cielo~\c- \cg♥\c-";
SWWM_LORETXT_MAIDBOT2 =
"\cxNombre Completo:\c-\n"
-"\cf Maidbot \"Meido\" Miyamoto\c-\n"
+"\cf Meido Miyamoto\c-\n"
"\cf Meidobot (nombre artístico)\c-\n"
"\cxNacionalidad:\c-\n"
"\cf Japonesa\c-\n"
@@ -2008,17 +1943,17 @@ SWWM_LORETXT_MAIDBOT2 =
"\cxTwitter:\c-\n"
"\cf @meidobot\c-\n"
"\n"
-"Siendo el primer proyecto de IA de \cfSaya Miyamoto\c-, \cfMaidbot\c- inicialmente era poca cosa, sirviendo principalmente como un robot de limpieza con una inteligencia muy limitada, mayormente capaz de recibir órdenes simples. Con el tiempo, Saya expandiría sus habilidades, permitiendo una interactividad más compleja, pero aún limitada. Saya siempre sentía que a pesar de sus esfuerzos, a pesar de lo mucho que Maidbot gradualmente parecía más \"real\", nunca era suficiente. Al final, era \"śolo una máquina\".\n"
+"Siendo el primer proyecto de IA de \cfSaya Miyamoto\c-, \cfMeido\c- inicialmente era poca cosa, sirviendo principalmente como un robot de limpieza con una inteligencia muy limitada, mayormente capaz de recibir órdenes simples. Con el tiempo, Saya expandiría sus habilidades, permitiendo una interactividad más compleja, pero aún limitada. Saya siempre sentía que a pesar de sus esfuerzos, a pesar de lo mucho que Meido gradualmente parecía más \"real\", nunca era suficiente. Al final, era \"śolo una máquina\".\n"
"\n"
-"Notablemente, se ha de mencionar el intento de Saya de hacerla cantante, algo que tuvo un éxito inesperado, realmente. Tras su debut inicial, más y más artistas compondrían canciones para que Maidbot las interpretara. En 2020, Maidbot se había convertido en una completa \"Idol Artificial\", suficientemente famosa como par tomar parte en los Juegos Olímpicos de Tokio, cantando el himno nacional.\n"
+"Notablemente, se ha de mencionar el intento de Saya de hacerla cantante, algo que tuvo un éxito inesperado, realmente. Tras su debut inicial, más y más artistas compondrían canciones para que Meido las interpretara. En 2020, Meido se había convertido en una completa \"Idol Artificial\", suficientemente famosa como par tomar parte en los Juegos Olímpicos de Tokio, cantando el himno nacional.\n"
"\n"
-"Tras el \cfEvento Luna\c- de 2021, Saya recibió la visita de \cfZanaveth Nekuraku II\c-, jefa de investigación de IA en \cfNekuratek\c-, el mayor gigante tecnológico \cfNukuri\c-. Curiosa por la cultura humana, decidió conocerla, ya que tenían intereses similares. Zanaveth quedó bastante impresionada por todo lo que \cfAkari Labs\c- había logrado, y mostró un interés especial por Maidbot, también.\n"
+"Tras el \cfEvento Luna\c- de 2021, Saya recibió la visita de \cfZanaveth Nekuraku II\c-, jefa de investigación de IA en \cfNekuratek\c-, el mayor gigante tecnológico \cfNukuri\c-. Curiosa por la cultura humana, decidió conocerla, ya que tenían intereses similares. Zanaveth quedó bastante impresionada por todo lo que \cfAkari Labs\c- había logrado, y mostró un interés especial por Meido, también.\n"
"\n"
-"Habiendo entablado amistad rápidamente con Saya llegado este punto, se ofreció a mejorar la IA de Maidbot con la tecnología más avanzada que tenían: El \cfFramework de IA Nekuronbot\c-. Habiendo aceptado esta oferta, Maidbot \"renació\" de su anterior forma limitada. Era ahora completamente capaz de pensamiento individual, libre albedrío y, más importante, emociones.\n"
+"Habiendo entablado amistad rápidamente con Saya llegado este punto, se ofreció a mejorar la IA de Meido con la tecnología más avanzada que tenían: El \cfFramework de IA Nekuronbot\c-. Habiendo aceptado esta oferta, Meido \"renació\" de su anterior forma limitada. Era ahora completamente capaz de pensamiento individual, libre albedrío y, más importante, emociones.\n"
"\n"
-"No es sorpresa que Saya siempre sintió algo por ella, al mismo tiempo que era completamente consciente de la imposibilidad de que ella correspondiera a su amor, pero ahora, todo había cambiado. Maidbot lo sabía, y confesó que en su nueva forma, ella podía \"sentir algo\" también. Con el tiempo, logró comprender mejor estos sentimientos, y se convertiría en la primera novia de Saya.\n"
+"No es sorpresa que Saya siempre sintió algo por ella, al mismo tiempo que era completamente consciente de la imposibilidad de que ella correspondiera a su amor, pero ahora, todo había cambiado. Meido lo sabía, y confesó que en su nueva forma, ella podía \"sentir algo\" también. Con el tiempo, logró comprender mejor estos sentimientos, y se convertiría en la primera novia de Saya.\n"
"\n"
-"Tras estos eventos, Maidbot pasó a formar parte de la familia, adoptando el apellido Miyamoto. Mucho después, y con la ayuda de Zanaveth, Saya comenzaría la creación de más maidbots, deseando que todo el mundo pudiera tener a su propia Maidbot. Se estableció un servicio de adopción en 2023, donde las maidbots, quienes eran criadas y preparadas en Akari Labs, podrían entrevistarse con adoptadores en potencia, permitiendo tener la decisión final sobre con quién vivir. Este servicio fue completamente gratuito, ya que la compañía tenía más que suficientes fondos con sus otros servicios, lo cual incrementó su popularidad aun más. Todos querían tener su propia Maidbot, y las Maidbots en sí eran felices de tener una familia con la que vivir.\n"
+"Tras estos eventos, Meido pasó a formar parte de la familia, adoptando el apellido Miyamoto. Mucho después, y con la ayuda de Zanaveth, Saya comenzaría la creación de más maidbots, deseando que todo el mundo pudiera \"tener a su propia Meido\". Se estableció un servicio de adopción en 2023, donde las maidbots, quienes eran criadas y preparadas en Akari Labs, podrían entrevistarse con adoptadores en potencia, permitiendo tener la decisión final sobre con quién vivir. Este servicio fue completamente gratuito, ya que la compañía tenía más que suficientes fondos con sus otros servicios, lo cual incrementó su popularidad aun más. Todos querían tener su propia Maidbot, y las Maidbots en sí eran felices de tener una familia con la que vivir.\n"
"\n"
"En Mayo de 2171, junto con Saya y sus otras parejas, se casó con el \cfEmperador Kirin Xanai\c-, del \cfImperio Sykhai\c-, y gracias a él, su pasión por el canto ha vuelto una vez más.\n"
"\n"
@@ -2098,7 +2033,9 @@ SWWM_LORETXT_MIXOM =
"\cxNotas de Saya:\c-\n"
"\cfDinero y poder, dominio absoluto, mierda de capitalismo. Asco grande... Ojalá exploten todos.\c-\n"
"\n"
-"\cfNo puedes dar dos pasos sin cruzarte con algo que han hecho, están EN PUTAS TODAS PARTES. Como, por ejemplo, ¿todos los tornillos en tu cuerpo? Marca Mixom. ¿La refrigeración líquida? También Mixom... Seguiría, pero es que me da todo el asco decir su nombre tanto.\c-";
+"\cfMenos la presidenta, es la única persona cuerda que queda ahí pero es que no podían ser más rastreros cada vez que intenta cambiar las cosas. Es comendable, cierto, pero me parece una batalla perdida ya. Debería tirar la toalla y venirse a trabajar aquí.\c-\n"
+"\n"
+"\cfPor cierto, no puedes dar dos pasos sin cruzarte con algo que han hecho, están EN PUTAS TODAS PARTES. Como, por ejemplo, ¿todos los tornillos en tu cuerpo? Marca Mixom. ¿La refrigeración líquida? También Mixom... Seguiría, pero es que me da todo el asco decir su nombre tanto.\c-";
SWWM_LORETAG_MODERNSPARKSTER = "Rifle Sparkster";
SWWM_LORETXT_MODERNSPARKSTER =
"\cxDesignación:\c-\n"
@@ -2210,12 +2147,18 @@ SWWM_LORETXT_MYKRADVO =
"\n"
"\cfRecuerdo una vez que lo apreté sin querer y no hizo nada. Supongo que es lo bastante listo como para no reventar si no hay nadie por ahí que te quiera matar. Muy útil.\c-";
SWWM_LORETXT_NANA =
-"\cxNombre Completo:\c-\n"
-"\cf Nana Miyamoto\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Japonesa\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 1907-07-07\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Nana Miyamoto\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Japonesa\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 1907-07-07\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Ama de Casa\c-\n"
+"\n"
+"\n"
+"\n"
+"\n"
"\n"
"\cfNana\c- es la hija única de \cfKaguya Houraisan\c-, la princesa \cfLunar\c- exiliada que hizo de \cfGensokyo\c- su hogar. Habiendo sido criada y educada completamente dentro de los confines de \cfEientei\c- no sabía mucho del mundo exterior, y habría pasado el resto de su vida eterna ahí, de no haber sido por un encuentro inesperado con \cfRyuji Miyamoto\c- en los años 60. Habiendo huido de la \cfAldea Humana\c-, se cruzó con Nana. Los dos entablaron una amistad cercana, y el joven chico hizo la promesa de casarse con ella cuando creciera, y llevarla al exterior, para que pudiese \"ver el mundo\". Esto ocurriría en 1973, con los dos dejando atrás Gensokyo para formar una familia.\n"
"\n"
@@ -2226,12 +2169,18 @@ SWWM_LORETXT_NANA =
"\cxNotas de Saya:\c-\n"
"\cfLa más mejor mamá del mundo, no voy a mentir. Puede que sea estricta a veces, o se enfade conmigo por estar despierta hasta muy tarde (si es que se da cuenta, je), pero realmente es la mejor. Aun no la has conocido, Demo-chan, pero seguro que le vas a caer muy bien. Te aseguro que es muy maja a pesar del miedo que da la pinta que tiene a veces. No es para nada como Kaguya obaa-san, que juro que siempre tiene ese aura que es como... normal que los tíos le tengan miedo, siempre con un miedo constante a que les haga CBT en cualquier momento.\c-";
SWWM_LORETXT_NANA2 =
-"\cxNombre Completo:\c-\n"
-"\cf Nana Miyamoto\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Japonesa\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 1907-07-07\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Nana Miyamoto\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Japonesa\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 1907-07-07\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Ama de Casa\c-\n"
+"\n"
+"\n"
+"\n"
+"\n"
"\n"
"\cfNana\c- es la hija única de \cfKaguya Houraisan\c-, la princesa \cfLunar\c- exiliada que hizo de \cfGensokyo\c- su hogar. Habiendo sido criada y educada completamente dentro de los confines de \cfEientei\c- no sabía mucho del mundo exterior, y habría pasado el resto de su vida eterna ahí, de no haber sido por un encuentro inesperado con \cfRyuji Miyamoto\c- en los años 60. Habiendo huido de la \cfAldea Humana\c-, se cruzó con Nana. Los dos entablaron una amistad cercana, y el joven chico hizo la promesa de casarse con ella cuando creciera, y llevarla al exterior, para que pudiese \"ver el mundo\". Esto ocurriría en 1973, con los dos dejando atrás Gensokyo para formar una familia.\n"
"\n"
@@ -2244,12 +2193,18 @@ SWWM_LORETXT_NANA2 =
"\n"
"\cfPor cierto, me di cuenta, sabes, cuando te dio ese abrazo, sí. No ha intentado ver a otros tíos desde que perdimos a papá... Pero creo que a lo mejor... puede que le gustes de una forma algo diferente, ya sabes...\c-";
SWWM_LORETXT_NANA3 =
-"\cxNombre Completo:\c-\n"
-"\cf Nana Miyamoto\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Japonesa\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 1907-07-07\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Nana Miyamoto\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Japonesa\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 1907-07-07\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Ama de Casa\c-\n"
+"\n"
+"\n"
+"\n"
+"\n"
"\n"
"\cfNana\c- es la hija única de \cfKaguya Houraisan\c-, la princesa \cfLunar\c- exiliada que hizo de \cfGensokyo\c- su hogar. Habiendo sido criada y educada completamente dentro de los confines de \cfEientei\c- no sabía mucho del mundo exterior, y habría pasado el resto de su vida eterna ahí, de no haber sido por un encuentro inesperado con \cfRyuji Miyamoto\c- en los años 60. Habiendo huido de la \cfAldea Humana\c-, se cruzó con Nana. Los dos entablaron una amistad cercana, y el joven chico hizo la promesa de casarse con ella cuando creciera, y llevarla al exterior, para que pudiese \"ver el mundo\". Esto ocurriría en 1973, con los dos dejando atrás Gensokyo para formar una familia.\n"
"\n"
@@ -2614,9 +2569,9 @@ SWWM_LORETXT_PUNTZERGAMMA =
"\n"
"El \cfPuntzer Gamma\c- es un subfusil bullpup mayormente compacto con un sistema de cargador horizontal similar a clásicos del siglo 21 como el \cfBreakerTek P90\c-. El arma es adicionalmente capaz de ejecutar un modo \"Súper-Automático\" de disparo ultrarrápido, visto también en otras armas automáticas fabricadas por Blackmann Arms.\n"
"\n"
-"\cfFuego Primario:\c- Dispara el arma.\n"
+"\cfFuego Primario:\c- Disparo en modo automático.\n"
"\n"
-"\cfFuego Secundario:\c- Alterna modos de disparo, entre simple, ráfaga de tres, automático y súper-automático.\n"
+"\cfFuego Secundario:\c- Ráfaga en modo \"super-automático\".\n"
"\n"
"\cfRecarga:\c- Recarga, obviamente. Los autocargadores de tu \cfContenedor de Hammerspace™\c- te proveerán de un cargador nuevo en cada momento.\n"
"\n"
@@ -2707,7 +2662,7 @@ SWWM_LORETXT_RAFANKOS =
"\cxNotas de Saya:\c-\n"
"\cf¿\"Arma Definitiva\"? Menuda cursilada... Pero sabes, algo de todo esto hacía que me picotearan los sesos, y entonces todo encajó. Esta cosa es básicamente como esa carta de hechizo, la Chispa Maestra. Hostia, es que hasta suena y pinta igual...\c-\n"
"\n"
-"\cfJoder, si mola y todo, en serio. Me gusta, así que la puse en el mismo sitio que las otras dos armas súper descoyuntantes.\c-";
+"\cfJoder, si mola y todo, en serio. Me gusta, así que la puse en el mismo sitio que el otro armatoste súper descoyuntante. Ya sabes, como una alternativa más segura con la que tendrás menos posibilidades de matarte. He de admitir que Misa-Misa nos ha cargado con un material potente al traernos estas dos.\c-";
SWWM_LORETXT_RAGEKIT =
"\cxDesignación:\c-\n"
"\cf Ragekit\c-\n"
@@ -2775,7 +2730,7 @@ SWWM_LORETXT_RAYKHOM =
"\n"
"\cfAsí que según los Xekkian esto es un \"arma ligera\", ¿¿¿en serio??? Menos mal que tus manos se pueden adaptar no se como a la empuñadura de la cosa esta, porque hostia putísima...\c-\n"
"\n"
-"\cfEsta mierda es como, no se por donde empezar. Es en serio un puto revientaculos, eso es lo que es. De todo lo que hay en tu arsenal, yo diría que esta es la segunda arma más fuerte que tenemos. Misa aparte la trajo ella misma entonces, y luego hablamos con el viejales de Tach-Engine para poder meterla en la tienda, ya que tiene el trato ese con Kmonn y tal (Estoy segura de que esos dos son algo mas que compañeros de negocios, si sabes a lo que me refiero).\c-\n"
+"\cfEsta mierda es como, no se por donde empezar. Es en serio un puto revientaculos, eso es lo que es. De todo lo que hay en tu arsenal, yo diría que esta es la tercera arma más tocha que tenemos. Misa aparte la trajo ella misma entonces, y luego hablamos con el viejales de Tach-Engine para poder meterla en la tienda, ya que tiene el trato ese con Kmonn y tal (Estoy segura de que esos dos son algo mas que compañeros de negocios, si sabes a lo que me refiero).\c-\n"
"\n"
"\cfCuando entró por la puerta cargando a hombros con esa cosa supe entonces que tenía que ser nuestra.\c-";
SWWM_LORETAG_REFRESHER = "Refrescador";
@@ -2796,14 +2751,17 @@ SWWM_LORETXT_REFRESHER =
"\cxNotas de Saya:\c-\n"
"\cfAlienígenas Egipcios Antiguos™. Bien, mola, pues sí, cosa buena. Pero los chismes estos mira que son útiles, son casi como... ah, joder, voy a sonar como el friki ese pero sí, son como... vidas extra, ¿más o menos?\c-";
SWWM_LORETXT_RYUJI =
-"\cxNombre Completo:\c-\n"
-"\cf Ryuji Miyamoto\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Japonés\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 1956-03-12\c-\n"
-"\cxFecha de Defunción:\c-\n"
-"\cf 2054-06-22\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Ryuji Miyamoto\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Japonés\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 1956-03-12\c-\n"
+" \cxFecha de Defunción:\c-\n"
+" \cf 2054-06-22\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Inventor\c-\n"
+"\n"
"\n"
"\cfRyuji\c- nació en \cfGensokyo\c- en 1956, pasando la mayor parte de su vida en la \cfAldea Humana\c-, el único asentamiento de la región habitado completamente por humanos, en lugar de Youkai. Durante su adolescencia, se volvió bastante rebelde, deseando abandonar la aldea y tener \"aventuras\". Un día, escapó, y se perdió en el bosque de bambú rodeando \cfEientei\c-. Ahí, se cruzó con \cfNana\c-, la hija de \cfKaguya Houraisan\c-, y los dos se hicieron amigos. Después de ella lo guiara de vuelta a la aldea, Ryuji le prometió que regresaría un día, para casarse con ella, y llevarla con él a ver el mundo exterior.\n"
"\n"
@@ -2899,14 +2857,17 @@ SWWM_LORETXT_SANKAIDERIHA2 =
"\n"
"\cfOh sí, la primera vez que fue conocí al gran dios. Es uhhhhh... interesante, por decirlo así. No le importó hablar con una doña nadie aleatoria como yo con magia súper-mediocre, estuvo bien. Un día de estos, cuando Kirin se jubile, nos vamos a mudar ahí y estudiar un montón de magia juntos. Tengo unas ganas enormes...\c-";
SWWM_LORETXT_SAYA =
-"\cxNombre Completo:\c-\n"
-"\cf Saya Miyamoto\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Japonesa\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 1993-03-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @AkariSaya\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Saya Miyamoto\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Japonesa\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 1993-03-20\c-\n"
+" \cxOcupación:\c-\n"
+" \cf CTO, Recursos Humanos (Akari Labs)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @AkariSaya\c-\n"
+"\n"
"\n"
"\cfSaya Miyamoto\c- nació en 1993, siendo la hija mediana de \cfNana Miyamoto\c- y \cfRyuji Miyamoto\c-, su hermano mayor es \cfTaro Miyamoto\c-, nacido en 1985, y su hermana menor es \cfYui Miyamoto\c-, nacida en 2009. Ya de niña, Saya mostraba un interés por la ciencia y tecnología, admirando orgullosa a su padre y sus inventos. Fue una estudiante de sobresaliente, habiendo sido incluso descrita como \"niña prodigio\". A la sorprendentemente temprana edad de 13 años, habiendo demostrado sus habilidades excepcionales, consiguió entrar en el \cfMIT\c-, donde se graduó en \cfCiencias de Computación\c-.\n"
"\n"
@@ -2918,9 +2879,9 @@ SWWM_LORETXT_SAYA =
"\n"
"Saya es conocida también por ser exageradamente coqueta con mujeres atractivas, algo que ha resultado en muchos malentendidos y momentos incómodos. Con orgullo suele decir que está \"siempre horny on main\", y nunca deja pasar la oportunidad de flirtear con alguien. Sin embargo si menciona que este flirteo abierto es \"sólo amistoso, entre amigos\".\n"
"\n"
-"Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo \cfHaskell\c-), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada \cfMi Maid Es Un Robot Del Sexo\c-, basado parcialmente en sus experiencias saliendo con \cfMaidbot Miyamoto\c-. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, \cfEl Proyecto Akari\c-, una historia sobre experimentos de teletransporte y viajes interdimensionales \"que no se va a la mierda como el resto\". Tras el desastre en las bases de la \cfUAC\c- en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, \"solo para joder a esos idiotas\".\n"
+"Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo \cfHaskell\c-), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada \cfMi Maid Es Un Robot Del Sexo\c-, basado parcialmente en sus experiencias saliendo con \cfMeido Miyamoto\c-. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, \cfEl Proyecto Akari\c-, una historia sobre experimentos de teletransporte y viajes interdimensionales \"que no se va a la mierda como el resto\". Tras el desastre en las bases de la \cfUAC\c- en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, \"solo para joder a esos idiotas\".\n"
"\n"
-"Actualmente, Saya tiene dos novias: Maidbot Miyamoto e \cfIbuki Miyamoto\c-. Ambas siendo sus propias creaciones, lo que ha hecho que la gente haga comentarios incestuosos en las redes, contra los que lucha frecuentemente.\n"
+"Actualmente, Saya tiene dos novias: Meido Miyamoto e \cfIbuki Miyamoto\c-. Ambas siendo sus propias creaciones, lo que ha hecho que la gente haga comentarios incestuosos en las redes, contra los que lucha frecuentemente.\n"
"\n"
"\cxNotas de Saya:\c-\n"
"\cfTe gusta leer sobre mi, ¿verdad? Seguro que sí, tonti. Muy bien, pues aquí tienes mas cosas sobre mí, sólo para ti.\c-\n"
@@ -2929,14 +2890,17 @@ SWWM_LORETXT_SAYA =
"\n"
"\cfBueno, ¿satisfecha, Demo-chan? ¿He saciado tu sed de Saya Facts™? Bien, entonces deberías volver al trabajo.\c-";
SWWM_LORETXT_SAYA2 =
-"\cxNombre Completo:\c-\n"
-"\cf Saya Miyamoto\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Japonesa\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 1993-03-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @AkariSaya\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Saya Miyamoto\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Japonesa\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 1993-03-20\c-\n"
+" \cxOcupación:\c-\n"
+" \cf CTO, Recursos Humanos (Akari Labs)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @AkariSaya\c-\n"
+"\n"
"\n"
"\cfSaya Miyamoto\c- nació en 1993, siendo la hija mediana de \cfNana Miyamoto\c- y \cfRyuji Miyamoto\c-, su hermano mayor es \cfTaro Miyamoto\c-, nacido en 1985, y su hermana menor es \cfYui Miyamoto\c-, nacida en 2009. Ya de niña, Saya mostraba un interés por la ciencia y tecnología, admirando orgullosa a su padre y sus inventos. Fue una estudiante de sobresaliente, habiendo sido incluso descrita como \"niña prodigio\". A la sorprendentemente temprana edad de 13 años, habiendo demostrado sus habilidades excepcionales, consiguió entrar en el \cfMIT\c-, donde se graduó en \cfCiencias de Computación\c-.\n"
"\n"
@@ -2948,9 +2912,9 @@ SWWM_LORETXT_SAYA2 =
"\n"
"Saya es conocida también por ser exageradamente coqueta con mujeres atractivas, algo que ha resultado en muchos malentendidos y momentos incómodos. Con orgullo suele decir que está \"siempre horny on main\", y nunca deja pasar la oportunidad de flirtear con alguien. Sin embargo si menciona que este flirteo abierto es \"sólo amistoso, entre amigos\".\n"
"\n"
-"Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo \cfHaskell\c-), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada \cfMi Maid Es Un Robot Del Sexo\c-, basado parcialmente en sus experiencias saliendo con \cfMaidbot Miyamoto\c-. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, \cfEl Proyecto Akari\c-, una historia sobre experimentos de teletransporte y viajes interdimensionales \"que no se va a la mierda como el resto\". Tras el desastre en las bases de la \cfUAC\c- en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, \"solo para joder a esos idiotas\".\n"
+"Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo \cfHaskell\c-), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada \cfMi Maid Es Un Robot Del Sexo\c-, basado parcialmente en sus experiencias saliendo con \cfMeido Miyamoto\c-. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, \cfEl Proyecto Akari\c-, una historia sobre experimentos de teletransporte y viajes interdimensionales \"que no se va a la mierda como el resto\". Tras el desastre en las bases de la \cfUAC\c- en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, \"solo para joder a esos idiotas\".\n"
"\n"
-"Actualmente, Saya tiene tres novias: Maidbot Miyamoto, \cfIbuki Miyamoto\c- y el \cfDemolicionista\c-. Todas siendo sus propias creaciones, lo que ha hecho que la gente haga comentarios incestuosos en las redes, contra los que lucha frecuentemente.\n"
+"Actualmente, Saya tiene tres novias: Meido Miyamoto, \cfIbuki Miyamoto\c- y el \cfDemolicionista\c-. Todas siendo sus propias creaciones, lo que ha hecho que la gente haga comentarios incestuosos en las redes, contra los que lucha frecuentemente.\n"
"\n"
"\cxNotas de Saya:\c-\n"
"\cfTe gusta leer sobre mi, ¿verdad? Seguro que sí, tonti. Muy bien, pues aquí tienes mas cosas sobre mí, sólo para ti.\c-\n"
@@ -2961,14 +2925,17 @@ SWWM_LORETXT_SAYA2 =
"\n"
"\cfAnda, vuelve al trabajo, robotita tontita.\c-";
SWWM_LORETXT_SAYA3 =
-"\cxNombre Completo:\c-\n"
-"\cf Saya Miyamoto\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Japonesa\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 1993-03-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @AkariSaya\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Saya Miyamoto\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Japonesa\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 1993-03-20\c-\n"
+" \cxOcupación:\c-\n"
+" \cf CTO, Recursos Humanos (Akari Labs)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @AkariSaya\c-\n"
+"\n"
"\n"
"\cfSaya Miyamoto\c- nació en 1993, siendo la hija mediana de \cfNana Miyamoto\c- y \cfRyuji Miyamoto\c-, su hermano mayor es \cfTaro Miyamoto\c-, nacido en 1985, y su hermana menor es \cfYui Miyamoto\c-, nacida en 2009. Ya de niña, Saya mostraba un interés por la ciencia y tecnología, admirando orgullosa a su padre y sus inventos. Fue una estudiante de sobresaliente, habiendo sido incluso descrita como \"niña prodigio\". A la sorprendentemente temprana edad de 13 años, habiendo demostrado sus habilidades excepcionales, consiguió entrar en el \cfMIT\c-, donde se graduó en \cfCiencias de Computación\c-.\n"
"\n"
@@ -2980,9 +2947,9 @@ SWWM_LORETXT_SAYA3 =
"\n"
"Saya es conocida también por ser exageradamente coqueta con mujeres atractivas, algo que ha resultado en muchos malentendidos y momentos incómodos. Con orgullo suele decir que está \"siempre horny on main\", y nunca deja pasar la oportunidad de flirtear con alguien. Sin embargo si menciona que este flirteo abierto es \"sólo amistoso, entre amigos\".\n"
"\n"
-"Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo \cfHaskell\c-), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada \cfMi Maid Es Un Robot Del Sexo\c-, basado parcialmente en sus experiencias saliendo con \cfMaidbot Miyamoto\c-. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, \cfEl Proyecto Akari\c-, una historia sobre experimentos de teletransporte y viajes interdimensionales \"que no se va a la mierda como el resto\". Tras el desastre en las bases de la \cfUAC\c- en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, \"solo para joder a esos idiotas\".\n"
+"Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo \cfHaskell\c-), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada \cfMi Maid Es Un Robot Del Sexo\c-, basado parcialmente en sus experiencias saliendo con \cfMeido Miyamoto\c-. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, \cfEl Proyecto Akari\c-, una historia sobre experimentos de teletransporte y viajes interdimensionales \"que no se va a la mierda como el resto\". Tras el desastre en las bases de la \cfUAC\c- en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, \"solo para joder a esos idiotas\".\n"
"\n"
-"Actualmente, Saya y sus creaciones Maidbot Miyamoto, \cfIbuki Miyamoto\c- y el \cfDemolicionista\c- están todas casadas con \cfKirin Xanai\c-, líder del \cfImperio Sykhai\c- de \cfAkkou\c-.\n"
+"Actualmente, Saya y sus creaciones Meido Miyamoto, \cfIbuki Miyamoto\c- y el \cfDemolicionista\c- están todas casadas con \cfKirin Xanai\c-, líder del \cfImperio Sykhai\c- de \cfAkkou\c-.\n"
"\n"
"\cxNotas de Saya:\c-\n"
"\cfTe gusta leer sobre mi, ¿verdad? Seguro que sí, tonti. Muy bien, pues aquí tienes mas cosas sobre mí, sólo para ti.\c-\n"
@@ -3267,14 +3234,17 @@ SWWM_LORETXT_SYMNATEK =
"\n"
"\cfOh apuesto a que estarás pensando: \"Pero Saya, ¿como puedes decir eso, cuando hiciste a Ibuki para el ejército de los EEUU?\", y a eso contestaré: \"¿Quien ha dicho que la hice para ellos?\"\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"
+" \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"
+" \cxOcupación:\c-\n"
+" \cf CEO, Relaciones Públicas (Akari Labs)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @AkariTaro\c-\n"
+"\n"
"\n"
"Nacido 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 cargo de las relaciones públicas, ya que Saya no \"tiene mucho don de gentes\" a diferencia de él.\n"
"\n"
@@ -3395,16 +3365,18 @@ SWWM_LORETXT_UAC3 =
"\n"
"\cfY aquí acaba la historia de la Epístolas de Dumbo estas o lo que sea, uno de los mayores ejemplos de las consecuencias del capitalismo desenfrenado™.\c-";
SWWM_LORETXT_UNISSIX =
-"\cxNombre Completo:\c-\n"
-"\cf Misa Azadeku Unissix\c-\n"
-"\cxAlias:\c-\n"
-"\cf Unissix Bokurou Azadeku\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Devanikan\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 1992-02-29\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @misamisa_unissix\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Misa Azadeku Unissix\c-\n"
+" \cxAlias:\c-\n"
+" \cf Unissix Bokurou Azadeku\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Devanikan\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 1992-02-29\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Herrera (Artesanía Unissix)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @misamisa_unissix\c-\n"
"\n"
"\cfMisa Azadeku Unissix\c- es el miembro más joven del \cfClan Unissix\c-, quien lidera la nación de \cfDevanikna\c-. Es la segunda hija de \cfDevai Unissix\c- y \cfSerwand Nerukousei\c-, siendo hermana menor de \cfDeneva Unissix\c-, una de las guerreras de mayor renombre de toda la nación.\n"
"\n"
@@ -3473,7 +3445,23 @@ SWWM_LORETXT_VOICEBOX =
"La comunidad de \cfAkari Labs\c- también ofrece una gran variedad de paquetes de voz personalizados para este dispositivo. Puedes visitar nuestros foros para más información.\n"
"\n"
"\cxNotas de Saya:\c-\n"
-"\cfJe... A Ibuki le encanta lo de que programara tu caja de voz para sonar igualita que ella. A ver, es que cuadra un poco, siendo algo como su hermana pequeña, pero lo que me mola a MÍ es que de algún modo le has pillado todas sus chorradillas y tal. Es como si fueses una mini Ibuki a veces, solo que sin pechotes.\c-";
+"\cfJe... Es que me encanta esa voz tan adorable que tienes, complementa perfectamente esa personalidad tuya tan descarada. Y lo que me mola más es lo rápido que has pillado todas nuestras coletillas y temas, especialmente las de Ibuki. A veces eres como una versión mini suya, solo que sin pechotes.\c-";
+SWWM_LORETXT_VOICEBOX2 =
+"\cxDesignación\c-\n"
+"\cf Caja de Voz Loudboi\c-\n"
+"\cxFabricante:\c-\n"
+"\cf Akari Labs\c-\n"
+"\cxClasificación:\c-\n"
+"\cf Sintetizador de Voz\c-\n"
+"\n"
+"El \cfLoudboi\c- es un dispositivo simple y ligero para unidades de IA. Fácil de instalar y programar, perfecto para aquellos que construyen con un presupuesto ajustado. Hay una gran variedad de opciones para el tipo de voz, junto con el soporte de múltiples idiomas, incluyendo el Japonés. Para aquellos que se sientan incómodos con el desconcertante \"realismo\" de la síntesis de voz por defecto también existe la opción de activar un filtro integrado de \"voz robótica\".\n"
+"\n"
+"La comunidad de \cfAkari Labs\c- también ofrece una gran variedad de paquetes de voz personalizados para este dispositivo. Puedes visitar nuestros foros para más información.\n"
+"\n"
+"\cxNotas de Saya:\c-\n"
+"\cfJe... Es que me encanta esa voz tan adorable que tienes, complementa perfectamente esa personalidad tuya tan descarada. Y lo que me mola más es lo rápido que has pillado todas nuestras coletillas y temas, especialmente las de Ibuki. A veces eres como una versión mini suya, solo que sin pechotes.\c-\n"
+"\n"
+"\cfActualización: Y entonces... Vinieron tus verdaderas cuerdas vocales como maidbot, sin filtros ni nada, y mi amor por tu encantadora voz solo pudo aumentar. Se me derrite el corazón solo con oírla, jejeje...\c-";
SWWM_LORETXT_WALLBUSTER =
"\cxDesignación:\c-\n"
"\cf Escopeta de Brecha de Armaduras Pesadas \"Wallbuster\"\c-\n"
@@ -3537,14 +3525,17 @@ SWWM_LORETXT_WARARMOR =
"\cfEeeeeen fin, Misa hace cosas tope de guays. Aunque me parece un poco redundante lo de que lleves armadura hecha de lo mismo que tu chasis. A ver, es que un robot llevando armadura.. ya, ¿por que no? Siempre es importante usar protección, juju...\c-";
SWWM_LORETAG_WHITELADY = "Dama Blanca";
SWWM_LORETXT_WHITELADY =
-"\cxNombre Completo:\c-\n"
-"\cf Andira Kyse\c-\n"
-"\cxTítulo:\c-\n"
-"\cf Dama Blanca de los Aldabura\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Kantharei\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2674 AC\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Andira Kyse\c-\n"
+" \cxTítulo:\c-\n"
+" \cf Dama Blanca de los Aldabura\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Kantharei\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2674 AC\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Mercenaria\c-\n"
+"\n"
"\n"
"La \cfDama Blanca de los Aldabura\c- es uno de los mejores mercenarios conocidos en la \cfCoalición X'Animen\c-. Como una de los \cfAldabura\c-, polillas humanoides nativas del pequeño planeta \cfKantharo\c-, es muy sensible a las luces potentes, y es fácilmente encantada por ellas. Al mismo tiempo, es bastante tímida y prefiere centrarse en su trabajo, más que en cualquier interacción social.\n"
"\n"
@@ -3900,14 +3891,17 @@ SWWM_LORETXT_YNYKRON2 =
"\n"
"\cfAh... y creo que esta va a ser la última vez que podamos usar la nuestra en una misión. Misa ya no quiere tener nada que ver con todo esto. En cuanto termine todo tenemos que llevársela para se destruida. Una pena, pero a ver, lo entiendo perfectamente, esta clase de arma no debería existir.\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"
+" \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"
+" \cxOcupación:\c-\n"
+" \cf Neurocirujana (Hospital Central de Kasukabe)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @yuchan09\c-\n"
+"\n"
"\n"
"Nacida 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 solitarios 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"
"\n"
@@ -3926,14 +3920,17 @@ SWWM_LORETXT_YUI =
"\n"
"\cfJoder la envidia que tenía... con su novia gótica tetuda todo mazizorra... Bueno, la tenía, hasta que llegó Ibuki, jejejeje...\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"
+" \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"
+" \cxOcupación:\c-\n"
+" \cf CEO, Ingeneriera de IA (Nekuratek)\c-\n"
+" \cf Ministra de Relaciones Interespecie (GUN)\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"
"\n"
@@ -3958,14 +3955,17 @@ SWWM_LORETXT_ZANAVETH2 =
"\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"
+" \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"
+" \cxOcupación:\c-\n"
+" \cf CEO, Ingeneriera de IA (Nekuratek)\c-\n"
+" \cf Ministra de Relaciones Interespecie (GUN)\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"
"\n"
@@ -3992,17 +3992,19 @@ SWWM_LORETXT_ZANAVETH22 =
"\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 la boda con Kirin-kun casi me puse a llorar. La echaba jodidamente tanto de menos, es que... en serio.\c-";
SWWM_LORETXT_ZANAVETH3 =
-"\cxNombre Completo:\c-\n"
-"\cf Zanaveth Nekuraku III\c-\n"
-"\cxApodos:\c-\n"
-"\cf El Corruptor\c-\n"
-"\cf Unissix Bokurou Azadeku II\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Nukuri\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2042-08-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @zanaveth\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Zanaveth Nekuraku III\c-\n"
+" \cxApodos:\c-\n"
+" \cf El Corruptor\c-\n"
+" \cf Unissix Bokurou Azadeku II\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Nukuri\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2042-08-20\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Ingeniera de IA (Nekuratek)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @zanaveth\c-\n"
"\n"
"\cfZanaveth Nekuraku III\c- es la hija única de \cfZanaveth Nekuraku II\c- y \cfMisa Azadeku Unissix\c-. Pasó la mayor parte de su infancia en la Tierra, donde había nacido, aunque ella y su familia tuvieron que mudarse de vuelta a \cfNahkami\c- una vez cumplió los cuatro años, ya que por ley, debía estudiar en un colegio Nukuri. Fue en el colegio donde la joven niña comenzaría a tener problemas notables.\n"
"\n"
@@ -4023,17 +4025,19 @@ SWWM_LORETXT_ZANAVETH3 =
"\n"
"\cfBueno, si vuelve a la Tierra, yo por mí aceptaría con los brazos abiertos a mi nueva gran señora chuuni.\c-";
SWWM_LORETXT_ZANAVETH32 =
-"\cxNombre Completo:\c-\n"
-"\cf Zanaveth Nekuraku III\c-\n"
-"\cxApodos:\c-\n"
-"\cf El Corruptor\c-\n"
-"\cf Unissix Bokurou Azadeku II\c-\n"
-"\cxNacionalidad:\c-\n"
-"\cf Nukuri\c-\n"
-"\cxFecha de Nacimiento:\c-\n"
-"\cf 2042-08-20\c-\n"
-"\cxTwitter:\c-\n"
-"\cf @zanaveth\c-\n"
+" \cxNombre Completo:\c-\n"
+" \cf Zanaveth Nekuraku III\c-\n"
+" \cxApodos:\c-\n"
+" \cf El Corruptor\c-\n"
+" \cf Unissix Bokurou Azadeku II\c-\n"
+" \cxNacionalidad:\c-\n"
+" \cf Nukuri\c-\n"
+" \cxFecha de Nacimiento:\c-\n"
+" \cf 2042-08-20\c-\n"
+" \cxOcupación:\c-\n"
+" \cf Ingeniera de IA (Nekuratek)\c-\n"
+" \cxTwitter:\c-\n"
+" \cf @zanaveth\c-\n"
"\n"
"\cfZanaveth Nekuraku III\c- es la hija única de \cfZanaveth Nekuraku II\c- y \cfMisa Azadeku Unissix\c-. Pasó la mayor parte de su infancia en la Tierra, donde había nacido, aunque ella y su familia tuvieron que mudarse de vuelta a \cfNahkami\c- una vez cumplió los cuatro años, ya que por ley, debía estudiar en un colegio Nukuri. Fue en el colegio donde la joven niña comenzaría a tener problemas notables.\n"
"\n"
diff --git a/language.es_menu b/language.es_menu
index be8deaa38..3ba59dd1f 100644
--- a/language.es_menu
+++ b/language.es_menu
@@ -1,6 +1,6 @@
[es]
// keybinds
-SWWM_KEYS = "Controles de SWWM GZ";
+SWWM_KEYS = "Controles de DEMOLITIONIST";
SWWM_PRIMARYFIRE = "Fuego Primario";
SWWM_SECONDARYFIRE = "Fuego Secundario";
SWWM_RELOADFIRE = "Recargar";
@@ -20,16 +20,15 @@ SWWM_KBASE = "Menú de Demolicionista";
SWWM_MINIMAPIN = "Acercar Zoom de Minimapa";
SWWM_MINIMAPOUT = "Alejar Zoom de Minimapa";
// skills
-SWWM_SKCHILL = "\cvDe Relax\c-";
-SWWM_SKEASY = "\cdCon Calmita~\c-";
-SWWM_SKNORMAL = "\cfAventura Adecuada\c-";
-SWWM_SKHARD = "\ciDesafío Moderado\c-";
-SWWM_SKHARDCORE = "\cgSoy Masoca\c-";
-SWWM_SKHARDCORECONFIRM = "\cg¿Crees que el mod es muy fácil?\nPues prepárate.\c-\n\n\cfMonstruos rápidos\n1.5x salud y daño de monstruos\n25% de agresividad extra\nTrucos deshabilitados\nMonstruos de cooperativo\nLa tienda está desactivada\nSolo se puede revivir una vez\c-\n\n(Pulsa Y para un desafío)";
-SWWM_SKLUNATIC = "\crINTENTA MUERTE\c-";
-SWWM_SKLUNATICCONFIRM = "\crVas a morir, vas a sufrir.\nEso te lo puedo garantizar.\c-\n\n\cfTodos los cambios de Masoca\n+\nDoble velocidad de enemigos\nProyectiles enemigos duplicados\nPueden aparecer enemigos extra\nReflejos instantáneos de enemigo\nLos enemigos no se estremecen\nLos enemigos no pelean entre si\c-\n\n(Pulsa Y para morir al instante)";
+SWWM_SKEASY = "\cvSimple Reventamiento\c-";
+SWWM_SKNORMAL = "\cdDía De Demolición\c-";
+SWWM_SKHARD = "\ciMayormente Dañino\c-";
+SWWM_SKHARDCORE = "\cgBocata De Dolor\c-";
+SWWM_SKHARDCORECONFIRM = "\cgEsta dificultad equivale a Pesadilla.\nPrepárate para una patada en el culo.\c-\n\n\cfMonstruos rápidos\n1.5x salud y daño de monstruos\n25% de agresividad extra\nTrucos deshabilitados\nMonstruos de cooperativo\nLa tienda está desactivada\nSolo se puede revivir una vez\c-\n\n(Pulsa Y para un desafío)";
+SWWM_SKLUNATIC = "\crDemo Debe Morir\c-";
+SWWM_SKLUNATICCONFIRM = "\cr¿Seguro que quieres eso?\nLo vas a pasar MUY mal.\c-\n\n\cfTodos los cambios de \cgBocata De Dolor\cf\n+\nDoble velocidad de enemigos\nProyectiles enemigos duplicados\nPueden aparecer enemigos extra\nReflejos instantáneos de enemigo\nLos enemigos no se estremecen\nLos enemigos no pelean entre si\c-\n\n(Pulsa Y para morir al instante)";
// mod menu
-SWWM_MTITLE = "Opciones de SWWM GZ";
+SWWM_MTITLE = "Opciones de DEMOLITIONIST";
SWWM_PTITLE = "Opciones de Jugador";
SWWM_VOICETYPE = "Pack de Voz de Demolicionista";
SWWM_MUTELEVEL = "Nivel de Muteo de Voz";
@@ -51,14 +50,6 @@ SWWM_ITITLE = "Opciones de Ítems";
SWWM_ARMORUSE = "Usar Armadura Automáticamente";
SWWM_HEALTHUSE = "Usar Salud Automáticamente";
SWWM_AMMOUSE = "Usar Fabricadores Automáticamente";
-SWWM_CTITLE = "Opciones de Multijugador";
-SWWM_SKEYS = "Compartir Llaves";
-SWWM_SVARMORUSE = "Forzar Auto-Uso de Armadura";
-SWWM_SVHEALTHUSE = "Forzar Auto-Uso de Salud";
-SWWM_SVAMMOUSE = "Forzar Auto-Uso de Fabricadores";
-SWWM_FORCEDISABLE = "Forzar Desactivado";
-SWWM_USERSET = "Elegido por Usuario";
-SWWM_FORCEENABLE = "Forzar Activado";
SWWM_6DOF = "Vuelo con 6DOF";
SWWM_TARGET = "Mostrar Barras de Salud";
SWWM_TARGETTAG = "Mostrar Nombres de Enemigos";
@@ -68,13 +59,14 @@ SWWM_SCOREBONUS = "Mostrar Bonificaciones de Puntuación";
SWWM_POIS = "Mostrar Puntos de Interés";
SWWM_EARBUSTER = "Reducir Estruendo del Wallbuster";
SWWM_SHADERS = "Usar Shaders de Pantalla";
-SWWM_OTHERVOICE = "Voz en Cooperativo";
SWWM_REVIVE = "Sistema de Reinicio de Emergencia";
SWWM_REVIVECOOLDOWN = "Tiempo de recarga de Reinicio";
SWWM_UNLIMITED = "Ilimitado";
SWWM_ONERETRY = "Un Reintento";
SWWM_NONE = "Ninguno";
SWWM_INTERART = "Arte de Intermisión";
+SWWM_NORENDER = "Sí (Sólo Fanart)";
+SWWM_NOFANART = "Sí (Sólo Renders)";
SWWM_BALLUSE = "Las Bolas de Plomo Activan Botones";
SWWM_BOSSBAR = "Mostrar Barras de Salud de Bosses";
SWWM_BTITLE = "Opciones de Balance";
@@ -91,7 +83,8 @@ SWWM_NUMSCALE = "Escala de Números";
SWWM_SCRSCALE = "Escala de Puntuaciones";
SWWM_POISCALE = "Escala de Puntos de Interés";
SWWM_DETSCALE = "Escala de Sensor de Ítems";
-SWWM_GZSCALE = "Usar Opción de GZDoom";
+SWWM_TFITSCALE = "Escalado Ajustado";
+SWWM_LFITSCALE = "Escalado Holgado";
SWWM_BLOOD = "Habilitar Sangre Personalizada";
SWWM_FUZZ = "Habilitar Fondo Animado de Menú";
SWWM_BUSTERPAUSE = "Pausar en Recarga de Wallbuster";
@@ -201,7 +194,6 @@ SWWM_ENGINE = "Motor";
SWWM_ITEMGLOWS = "Los Ítems Lejanos Brillan";
SWWM_NOMAGDROP = "Tirar Cargadores Usados";
SWWM_BARRIERUSE = "Usar Revestimiento Automáticamente";
-SWWM_SVBARRIERUSE = "Forzar Auto-Uso de Revestimiento";
SWWM_NOMAPMSG = "Mensajes Especiales de Mapa";
SWWM_WEAPONTOOLTIPS = "Ayuda de Armas";
SWWM_RESETTOOLTIPS = "Resetear Ayuda de Armas";
@@ -209,7 +201,11 @@ SWWM_CRESET = "Restaurar Predeterminado";
SWWM_ARESET = "Borrar Logros";
SWWM_NOINTERTIPS = "Ocultar Consejos de Intermisión";
SWWM_DEMOSLAYER = "Modo Demoslayer";
+SWWM_BEEPBOOP = "Ruiditos de Activación";
+SWWM_VOICEAMP = "Amplificación de Voz";
SWWM_CLEARFX = "Limpiar todos los Efectos";
+SWWM_OLDLOGO = "Marca Antigua";
+SWWM_NODEATHEXIT = "Desactivar Salidas de Muerte";
SWWM_MMTITLE = "Opciones de Minimapa";
SWWM_MM_ENABLE = "Mostrar Minimapa";
SWWM_MM_ROTATE = "Rotar Minimapa";
@@ -281,25 +277,24 @@ TOOLTIP_SWWM_SCOREBONUS = "Muestra textos de bonificación extra sobre los punto
TOOLTIP_SWWM_POIS = "Muestra puntos de interés (tales como llaves y salidas) cuando tienes Omnivisión.";
TOOLTIP_SWWM_EARBUSTER = "Los sonidos de disparo del Wallbuster pueden a veces ser dolorosamente estridentes. Esta opción limitará la intensidad a un valor más soportable.";
TOOLTIP_SWWM_SHADERS = "Usa shaders de postprocesado para cosas como potenciadores y la mira del Silver Bullet. Puedes desactivar esto si prefieres algo más ligero para la vista.";
-TOOLTIP_SWWM_OTHERVOICE = "Te permite oír los comentarios de voz de otros jugadores, si estás lo suficientemente cerca.";
TOOLTIP_SWWM_REVIVE = "Permite al jugador volver a levantarse tras morir pulsando Fuego. Tiene un cooldown configurable.";
TOOLTIP_SWWM_REVIVECOOLDOWN = "Tiempo en segundos tras reiniciar, durante el cual si mueres otra vez, no puedes volver a levantarte. Pon a 0 para permitir reinicios ilimitados. Alternativamente, puedes elegir que solo se permita un reinicio por mapa (forzado en dificultades expertas).";
-TOOLTIP_SWWM_INTERART = "Si está activado, muestra fanart aleatorio durante intermisiones.";
+TOOLTIP_SWWM_INTERART = "Si está activado, muestra fanart y renders oficiales aleatorios durante intermisiones. Hay opciones extra para mostrar sólo una categoría.";
TOOLTIP_SWWM_BALLUSE = "Los proyectiles de Bola de Plomo pueden activar botones utilizables remotamente (excluyendo salidas). Potencialmente roto.";
TOOLTIP_SWWM_BOSSHEALTHBARS = "Muestra una barra de vida para bosses vanilla en la parte inferior de la pantalla. ¡Es justo como Dark Souls™!";
TOOLTIP_SWWM_UPGRADEBOSSES = "Incrementa la salud de bosses vanilla para hacer que las peleas sean más \"justas\" con este mod, y no tan propensas a ganarse al instante.";
TOOLTIP_SWWM_EXTRAALERT = "Permite a los enemigos oír cosas como proyectiles y balas rebotando, entre otros. Debido a la naturaleza recursiva de la función A_AlertMonsters, esto puede tener un impacto MASIVO en el rendimiento en mapas muy complejos.";
TOOLTIP_SWWM_ACCDAMAGE = "El daño hecho a un objetivo en el mismo tic será agrupado en un único número, lo cual resultará en una pantalla más despejada en la mayoría de casos.";
-TOOLTIP_SWWM_MAXTARGETDIST = "Limita la distancia máxima a la que se muestran las barras de salud de enemigos hostiles. Ten en cuenta que las barras de vida para jugadores en cooperativo se mostrarán siempre sin importar la distancia. Los objetivos no hostiles se muestran siempre a un cuarto de esta distancia.";
+TOOLTIP_SWWM_MAXTARGETDIST = "Limita la distancia máxima a la que se muestran las barras de salud de enemigos hostiles. Los objetivos no hostiles se muestran siempre a un cuarto de esta distancia.";
TOOLTIP_SWWM_MAXTARGETS = "Limita la cantidad de barras de salud a mostrar en pantalla. Ayuda a mantener la pantalla más despejada.";
TOOLTIP_SWWM_MAXDAMNUMS = "Limita la cantidad de números de daño/curación a mostrar en pantalla. Ayuda a mantener la pantalla más despejada.";
TOOLTIP_SWWM_MAXSCORENUMS = "Limita la cantidad de números de puntuación a mostrar en pantalla. Ayuda a mantener la pantalla más despejada.";
-TOOLTIP_SWWM_HUDSCALE = "Factor de escalado del HUD. Pon a 0 para usar el escalado de HUD de GZDoom.";
-TOOLTIP_SWWM_BARSCALE = "Factor de escalado para las barras de salud. Pon a 0 para usar el escalado de HUD de GZDoom.";
-TOOLTIP_SWWM_NUMSCALE = "Factor de escalado para los números de daño/salud. Pon a 0 para usar el escalado de HUD de GZDoom.";
-TOOLTIP_SWWM_SCRSCALE = "Factor de escalado para los números de puntuación. Pon a 0 para usar el escalado de HUD de GZDoom.";
-TOOLTIP_SWWM_POISCALE = "Factor de escalado para los puntos de interés. Pon a 0 para usar el escalado de HUD de GZDoom.";
-TOOLTIP_SWWM_DETSCALE = "Factor de escalado para los ítems detectados. Pon a 0 para usar el escalado de HUD de GZDoom.";
+TOOLTIP_SWWM_HUDSCALE = "Factor de escalado del HUD. El escalado \"Ajustado\" intenta que quepa todo el HUD en el ancho de la pantalla, mientras que el \"Holgado\" está recomendado para pantallas ultrawide.";
+TOOLTIP_SWWM_BARSCALEREL = "Factor de escalado relativo para las barras de salud. Un factor de 0 es igual al escalado del HUD.";
+TOOLTIP_SWWM_NUMSCALEREL = "Factor de escalado relativo para los números de daño/salud. Un factor de 0 es igual al escalado del HUD.";
+TOOLTIP_SWWM_SCRSCALEREL = "Factor de escalado relativo para los números de puntuación. Un factor de 0 es igual al escalado del HUD.";
+TOOLTIP_SWWM_POISCALEREL = "Factor de escalado relativo para los puntos de interés. Un factor de 0 es igual al escalado del HUD.";
+TOOLTIP_SWWM_DETSCALEREL = "Factor de escalado relativo para los ítems detectados. Un factor de 0 es igual al escalado del HUD.";
TOOLTIP_SWWM_BLOOD = "Activa efectos de sangre y vísceras personalizados, adaptados de Soundless Mound. Sinceramente, recomendaría usar Nashgore, es mejor.";
TOOLTIP_SWWM_FUZZ = "Desactivar esto es recomendado si estás grabando o haciendo streaming, ya que este effecto puede dañar la calidad del vídeo.";
TOOLTIP_SWWM_CBTPAUSE = "El juego será pausado mientras el menú de recarga de Wallbuster está abierto (sólo en modo de un jugador).";
@@ -370,7 +365,11 @@ TOOLTIP_EVENT_SWWMRESETCVARS = "Resetea todas las opciones del mod a sus valores
TOOLTIP_EVENT_SWWMRESETACHIEVEMENTS = "Borra todo tu progreso de logros.";
TOOLTIP_SWWM_NOINTERTIPS = "Oculta los consejos de intermisión, por si no quieres verlos.";
TOOLTIP_SWWM_DEMOSLAYER = "Los enemigos que mates soltarán orbes de salud y armadura.";
+TOOLTIP_SWWM_BEEPBOOP = "La Demolicionista hará ruiditos adorables cuando pulse cualquier línea utilizable. Esto puede que resulte cansino, así que es opcional.";
+TOOLTIP_SWWM_VOICEAMP = "A su volumen normal, las voces de la Demolicionista pueden ser ahogadas por el audio del juego. Con esto se le dá un nivel de amplificación extra para que sean más estridentes que otros sonidos.";
TOOLTIP_NETEVENT_SWWMCLEAREFFECTS = "Desvanece cualquier sangre, vísceras, escombros y casquillos activos.";
+TOOLTIP_SWWM_OLDLOGO = "Para quienes echan de menos los viejos tiempos de SWWM GZ, podeis restaurar la antigua pantalla de inicio y menú principal con esto.";
+TOOLTIP_SWWM_NODEATHEXIT = "Esta opción invalida completamente los efectos de las salidas de muerte, si no te gusta perder todas tus cosas.";
TOOLTIP_SWWMMINIMAPMENU = "Configura el minimapa.";
TOOLTIP_SWWMACHIEVEMENTMENU = "Revisa tus logros.";
TOOLTIP_SWWM_MM_ENABLE = "Muestra un minimapa bajo el contador de puntuación.";
@@ -408,7 +407,7 @@ TOOLTIP_SWWM_MM_THINGCOLOR_VIPITEM = "Color para ítems muy importantes.";
TOOLTIP_SWWM_MM_THINGCOLOR_SHOOTABLE = "Color para cosas que pueden ser dañadas.";
TOOLTIP_SWWM_MM_THINGCOLOR_MISSILE = "Color para proyectiles.";
// credits
-SWWM_MCREDS = "Créditos de SWWM GZ";
+SWWM_MCREDS = "Créditos de DEMOLITIONIST";
SWWM_CLEAD = "Desarrollo Principal:";
SWWM_CDEV2 = "Autoproclamada Maga de ZScript";
SWWM_CASSETS = "Assets Adicionales:";
@@ -417,6 +416,7 @@ SWWM_ASSOTHERS = "Sprites de XDeath para Demonio, Cacodemonio, Renacido, Archvil
SWWM_ASSEXTRA = "Sprites de XDeath para Aracnotrón, Mancubus";
SWWM_ASSKEEN = "Reemplazo Menos Vil de Keen";
SWWM_CMUSIC = "Música Usada:";
+SWWM_CVOICE = "Voces:";
SWWM_CFANART = "Fanart de Intermisión:";
SWWM_CPATRON = "Mecenas de Patreon:";
SWWM_CTHANK = "Agradecimientos Especiales:";
@@ -500,17 +500,8 @@ SWWM_STOREFULL = "No puedes llevar más de eso.";
SWWM_STOREMUNS = "No tienes suficiente dinero.";
SWWM_NOSTORE = "(no queda nada que comprar)";
SWWM_NOSTORESELL = "(no tienes ítems que vender)";
-SWWM_TRADETAB = "Intercambio";
-SWWM_TRADEFULL = "No puede llevar más de eso.";
-SWWM_TRADEFAIL = "No puedes enviar este ítem.";
-SWWM_NOTRADE = "(no hay unidades con las que intercambiar)";
-SWWM_TRADETO = "Enviado a";
-SWWM_TRADEFROM = "Recibido de";
-SWWM_NOTRADEHIST = "(no hay intercambios en el historial)";
-SWWM_MSGSENT = "Has enviado %dx %s a %s.";
-SWWM_MSGRECV = "%s te ha enviado %dx %s.";
-SWWM_CHATTAB = "Hist. de Chat";
-SWWM_NOCHAT = "(historial de chat vacío)";
+SWWM_CHATTAB = "Mensajes";
+SWWM_NOCHAT = "(historial de mensajes vacío)";
SWWM_SECRETTAB = "Secreto";
SWWM_TODEMO = "\cx\"¡Lucha por la justicia, Demo-chan! ¡Tú puedes!\"\c- \cg♥\c- Ibuki y Saya";
SWWM_CUTIECLUB = "\cx\"¡Jamás pierdas la esperanza, Demo-chan! ¡Estamos todas contigo!\"\c- \cg♥\c- Club Cuqui";
@@ -540,90 +531,71 @@ SWWM_KIRINPOEM =
SWWM_MAINCONTROLS = "Pulsa F1 para ver controles";
SWWM_LOREUNSEL = "(ninguna entrada elegida)";
SWWM_LORETAB0 = "Ítems";
-SWWM_LORETAB1 = "Gente";
-SWWM_LORETAB2 = "Lore";
+SWWM_LORETAB1 = "Enemigos";
+SWWM_LORETAB2 = "Gente";
+SWWM_LORETAB3 = "Lore";
SWWM_HELPTAB = "Ayuda";
SWWM_HELPTXT =
"\cxMenú de Demolicionista - Controles Básicos\c-\n"
-"\cx----------------------------------------\c-\n"
+"\cx——————————————————————————————————————————\c-\n"
"\n"
"\cf%s:\c- Abrir/Cerrar menú de Demolicionista\n"
"\cfRePág/AvPág:\c- Cambiar pestaña\n"
"\cfF1:\c- Abrir/Cerrar pestaña de ayuda\n"
"\n"
"\cxPestaña de Misión - Controles\c-\n"
-"\cx---------------------------\c-\n"
+"\cx—————————————————————————————\c-\n"
"\n"
"\cfArriba/Abajo:\c- Scroll\n"
"\cfIzquierda/Derecha:\c- Cambiar entre entradas\n"
"\n"
"\cxPestaña de Estadísticas - Controles\c-\n"
-"\cx---------------------------------\c-\n"
+"\cx———————————————————————————————————\c-\n"
"\n"
"\cfArriba/Abajo:\c- Scroll\n"
"\cfIzquierda/Derecha:\c- Cambiar sección\n"
"\n"
"\cxPestaña de Inventario - Controles\c-\n"
-"\cx-------------------------------\c-\n"
+"\cx—————————————————————————————————\c-\n"
"\n"
"\cfFlechas:\c- Navegar\n"
"\cfEnter/Click Izdo.:\c- Usar ítem seleccionado\n"
"\cfRetroceso/Click Dcho.:\c- Descartar ítem seleccionado\n"
"\n"
"\cxPestaña de Llavero - Controles\c-\n"
-"\cx----------------------------\c-\n"
+"\cx——————————————————————————————\c-\n"
"\n"
"\cfFlechas:\c- Navegar\n"
"\n"
"\cxPestaña de Biblioteca - Controles (Principal)\c-\n"
-"\cx-------------------------------------------\c-\n"
+"\cx—————————————————————————————————————————————\c-\n"
"\n"
"\cfArriba/Abajo:\c- Scroll por entradas\n"
"\cfIzquierda/Derecha:\c- Cambiar categoría\n"
"\cfEnter/Click Izdo.:\c- Abrir entrada\n"
"\n"
"\cxPestaña de Biblioteca - Controles (Entrada Abierta)\c-\n"
-"\cx-------------------------------------------------\c-\n"
+"\cx———————————————————————————————————————————————————\c-\n"
"\n"
"\cfArriba/Abajo:\c- Scroll\n"
"\cfRetroceso:\c- Volver a lista de entradas\n"
"\n"
"\cxPestaña de Tienda - Controles (Compra)\c-\n"
-"\cx------------------------------------\c-\n"
+"\cx——————————————————————————————————————\c-\n"
"\n"
"\cfFlechas:\c- Navegar\n"
"\cfEnter/Click Izdo.:\c- Comprar\n"
"\cfRetroceso/Click Dcho.:\c- Cambiar a venta\n"
"\n"
"\cxPestaña de Tienda - Controles (Venta)\c-\n"
-"\cx-----------------------------------\c-\n"
+"\cx—————————————————————————————————————\c-\n"
"\n"
"\cfFlechas:\c- Navegar\n"
"\cfEnter/Click Izdo.:\c- Vender\n"
"\cfRetroceso/Click Dcho.:\c- Cambiar a compra\n"
"\n"
-"\cxPestaña de Intercambio - Controles (Principal)\c-\n"
-"\cx---------------------------\c-\n"
-"\n"
-"\cfArriba/Abajo:\c- Navegar\n"
-"\cfEnter/Click Izdo.:\c- Elegir destinatario\n"
-"\cfRetroceso/Click Dcho.:\c- Historial\n"
-"\n"
-"\cxPestaña de Intercambio - Controles (Intercambio)\c-\n"
-"\cx-----------------------------------------------\c-\n"
-"\n"
-"\cfFlechas:\c- Navegar\n"
-"\cfEnter/Click Izdo.:\c- Enviar ítem\n"
-"\cfRetroceso/Click Dcho.:\c- Volver\n"
-"\n"
-"\cxPestaña de Intercambio - Controles (Historial)\c-\n"
-"\cx--------------------------------------------\c-\n"
-"\n"
-"\cfArriba/Abajo:\c- Scroll\n"
-"\cfRetroceso/Click Dcho.:\c- Volver\n"
-"\n"
-"\cxPestaña de Historial de Chat - Controles\c-\n"
-"\cx--------------------------------------\c-\n"
+"\cxPestaña de Mensajes - Controles\c-\n"
+"\cx———————————————————————————————\c-\n"
"\n"
"\cfArriba/Abajo:\c- Scroll";
// Wallbuster menu
@@ -706,7 +678,7 @@ SWWM_HELP_ARSE3TXT =
"Todos y cada uno de los potenciadores activos aparecerá en tu HUD, con unos bonitos numeritos indicándote cuanto van a durar. Mucho mejor que tener que adivinarlo, desde luego.";
SWWM_HELP_KBASE = "El Menú de Demolicionista";
SWWM_HELP_KBASETXT =
-"He aquí, la parte más esencial de este mod. El \cfMenú de Demolicionista\c-, activado con una tecla dedicada (no te olvides de asignarla). En él, puedes hacer toda clase de cosas, incluyendo: Manejar tu inventario al detalle, comprobar las llaves que tengas, ver estadísticas de tu rendimiento, comprar cositas con tus puntos, compartir ítems en multijugador, y también...\n"
+"He aquí, la parte más esencial de este mod. El \cfMenú de Demolicionista\c-, activado con una tecla dedicada (no te olvides de asignarla). En él, puedes hacer toda clase de cosas, incluyendo: Manejar tu inventario al detalle, comprobar las llaves que tengas, ver estadísticas de tu rendimiento, comprar cositas con tus puntos, y también...\n"
"\n"
"\cf¡LORE PROFUNDO!\c-\n"
"\n"
diff --git a/language.es_voice b/language.es_voice
index e2a75105d..e6e8b708e 100644
--- a/language.es_voice
+++ b/language.es_voice
@@ -1,233 +1,597 @@
[es]
-// voice name
-SWWM_VOICENAME_DEFAULT = "Demolicionista";
-// new weapon received
-SWWM_SUBS_DEFAULT_GETWEAPON1 = "No está mal... No está mal para nada...";
-SWWM_SUBS_DEFAULT_GETWEAPON2 = "Buena pesca...";
-SWWM_SUBS_DEFAULT_GETWEAPON3 = "Ahora es mío...";
-SWWM_SUBS_DEFAULT_GETWEAPON4 = "Bien...";
-SWWM_SUBS_DEFAULT_GETWEAPON5 = "Bingo...";
-SWWM_SUBS_DEFAULT_GETWEAPON6 = "Toma ya...";
-SWWM_SUBS_DEFAULT_GETWEAPON7 = "Excelente...";
-SWWM_SUBS_DEFAULT_GETWEAPON8 = "Sí...";
-SWWM_SUBS_DEFAULT_GETWEAPON9 = "Eso es...";
-SWWM_SUBS_DEFAULT_GETWEAPON10 = "Perfecto...";
-SWWM_SUBS_DEFAULT_GETWEAPON11 = "Me gusta...";
-SWWM_SUBS_DEFAULT_GETWEAPON12 = "Tiene buena pinta...";
-SWWM_SUBS_DEFAULT_GETWEAPON13 = "Probablemente cueste una fortuna...";
+//// DEFAULT VOICE - Vyolette
+// new weapon received (generic, unspecified weapons)
+SWWM_SUBS_DEFAULT_GETWEAPON1 = "Bueno.";
+SWWM_SUBS_DEFAULT_GETWEAPON2 = "Mío.";
+SWWM_SUBS_DEFAULT_GETWEAPON3 = "Esto tiene buena pinta.";
+SWWM_SUBS_DEFAULT_GETWEAPON4 = "Hm, bueno.";
+SWWM_SUBS_DEFAULT_GETWEAPON5 = "Oh, ¡mola!";
+SWWM_SUBS_DEFAULT_GETWEAPON6 = "Oh sí.";
+SWWM_SUBS_DEFAULT_GETWEAPON7 = "Dame.";
+SWWM_SUBS_DEFAULT_GETWEAPON8 = "Toma ya.";
+SWWM_SUBS_DEFAULT_GETWEAPON9 = "Bien.";
+SWWM_SUBS_DEFAULT_GETWEAPON10 = "Buena pinta.";
+SWWM_SUBS_DEFAULT_GETWEAPON11 = "Me lo llevo.";
+SWWM_SUBS_DEFAULT_GETWEAPON12 = "Arma nueva, más diversión.";
+SWWM_SUBS_DEFAULT_GETWEAPON13 = "Te vienes conmigo.";
// locked door
-SWWM_SUBS_DEFAULT_LOCKED1 = "No tengo la llave.";
-SWWM_SUBS_DEFAULT_LOCKED2 = "Solo abre con una llave.";
-SWWM_SUBS_DEFAULT_LOCKED3 = "Necesitaría la llave.";
-SWWM_SUBS_DEFAULT_LOCKED4 = "Cerrado a cal y canto.";
-// jammed door (strife)
-SWWM_SUBS_DEFAULT_JAMMED1 = "Está atrancada.";
-SWWM_SUBS_DEFAULT_JAMMED2 = "Nada.";
-SWWM_SUBS_DEFAULT_JAMMED3 = "Atrancada.";
-SWWM_SUBS_DEFAULT_JAMMED4 = "Es inútil.";
+SWWM_SUBS_DEFAULT_LOCKED1 = "Bueno, está cerrado.";
+SWWM_SUBS_DEFAULT_LOCKED2 = "Voy a necesitar una llave para esto.";
+SWWM_SUBS_DEFAULT_LOCKED3 = "Tengo que encontrar la llave.";
+SWWM_SUBS_DEFAULT_LOCKED4 = "Necesita una llave.";
+SWWM_SUBS_DEFAULT_LOCKED5 = "Dios odio buscar llaves...";
+SWWM_SUBS_DEFAULT_LOCKED6 = "Malditas llaves...";
+// jammed door
+SWWM_SUBS_DEFAULT_JAMMED1 = "Atascado.";
+SWWM_SUBS_DEFAULT_JAMMED2 = "No se mueve.";
+SWWM_SUBS_DEFAULT_JAMMED3 = "Atrancado.";
+SWWM_SUBS_DEFAULT_JAMMED4 = "No se abre.";
+SWWM_SUBS_DEFAULT_JAMMED5 = "Esta mierda está rota.";
+SWWM_SUBS_DEFAULT_JAMMED6 = "No funciona.";
+SWWM_SUBS_DEFAULT_JAMMED7 = "La puerta está oxidada.";
// puzzle item failure
-SWWM_SUBS_DEFAULT_PUZZFAIL1 = "Maldición.";
-SWWM_SUBS_DEFAULT_PUZZFAIL2 = "Maldita sea.";
-SWWM_SUBS_DEFAULT_PUZZFAIL3 = "No bueno.";
+SWWM_SUBS_DEFAULT_PUZZFAIL1 = "Dita sea.";
+SWWM_SUBS_DEFAULT_PUZZFAIL2 = "Ah leñe.";
+SWWM_SUBS_DEFAULT_PUZZFAIL3 = "Espera eso no vale.";
SWWM_SUBS_DEFAULT_PUZZFAIL4 = "Pues no.";
// puzzle item success
-SWWM_SUBS_DEFAULT_PUZZSUCC1 = "Bien.";
-SWWM_SUBS_DEFAULT_PUZZSUCC2 = "Eso es.";
-SWWM_SUBS_DEFAULT_PUZZSUCC3 = "Lo tengo.";
-SWWM_SUBS_DEFAULT_PUZZSUCC4 = "Sí.";
-SWWM_SUBS_DEFAULT_PUZZSUCC5 = "Mola.";
+SWWM_SUBS_DEFAULT_PUZZSUCC1 = "Buena.";
+SWWM_SUBS_DEFAULT_PUZZSUCC2 = "Lo tengo.";
+SWWM_SUBS_DEFAULT_PUZZSUCC3 = "Vamos allá.";
+SWWM_SUBS_DEFAULT_PUZZSUCC4 = "Bien.";
+SWWM_SUBS_DEFAULT_PUZZSUCC5 = "Sí, eso es.";
// first enemy encounter (20 seconds cooldown since all enemies dead)
-SWWM_SUBS_DEFAULT_FIGHTSTART1 = "Ya estamos otra vez.";
-SWWM_SUBS_DEFAULT_FIGHTSTART2 = "Que empiece el espectáculo.";
-SWWM_SUBS_DEFAULT_FIGHTSTART3 = "Hora de morir.";
-SWWM_SUBS_DEFAULT_FIGHTSTART4 = "Ven a por mí.";
-SWWM_SUBS_DEFAULT_FIGHTSTART5 = "Vais a morir todos.";
-SWWM_SUBS_DEFAULT_FIGHTSTART6 = "Ya tenía ganas de pelea.";
-SWWM_SUBS_DEFAULT_FIGHTSTART7 = "Vamos con esto.";
-SWWM_SUBS_DEFAULT_FIGHTSTART8 = "¡Hora de liarla! ¡A matarlos a todos!";
-SWWM_SUBS_DEFAULT_FIGHTSTART9 = "En serio que no querrías empezar una pelea conmigo.";
-SWWM_SUBS_DEFAULT_FIGHTSTART10 = "Vamos al asunto.";
-SWWM_SUBS_DEFAULT_FIGHTSTART11 = "¡Matar!";
+SWWM_SUBS_DEFAULT_FIGHTSTART1 = "Bueno ya empezamos.";
+SWWM_SUBS_DEFAULT_FIGHTSTART2 = "Venga, fiesta.";
+SWWM_SUBS_DEFAULT_FIGHTSTART3 = "Oh, más malos.";
+SWWM_SUBS_DEFAULT_FIGHTSTART4 = "¡Vamos allá!";
+SWWM_SUBS_DEFAULT_FIGHTSTART5 = "Esta va a ser buena.";
+SWWM_SUBS_DEFAULT_FIGHTSTART6 = "Ah, que empieze la diversión.";
+SWWM_SUBS_DEFAULT_FIGHTSTART7 = "¡Hagamos esto!";
+SWWM_SUBS_DEFAULT_FIGHTSTART8 = "¡Vas a caer!";
+SWWM_SUBS_DEFAULT_FIGHTSTART9 = "Oh, ¿quieres pelea?";
+SWWM_SUBS_DEFAULT_FIGHTSTART10 = "Muy bien, hagamos esto.";
+SWWM_SUBS_DEFAULT_FIGHTSTART11 = "Ya estás muerto.";
SWWM_SUBS_DEFAULT_FIGHTSTART12 = "Esto no será difícil.";
-SWWM_SUBS_DEFAULT_FIGHTSTART13 = "Vamos allá.";
-SWWM_SUBS_DEFAULT_FIGHTSTART14 = "Hagamos esto.";
-SWWM_SUBS_DEFAULT_FIGHTSTART15 = "Acabemos con esto.";
-SWWM_SUBS_DEFAULT_FIGHTSTART16 = "Bueno, esto será un desafío interesante.";
-SWWM_SUBS_DEFAULT_FIGHTSTART17 = "OK. Empecemos con esto.";
-SWWM_SUBS_DEFAULT_FIGHTSTART18 = "Oh, esto es justo lo que necesitaba ahora...";
-SWWM_SUBS_DEFAULT_FIGHTSTART19 = "Hora de montar un espectáculo.";
-SWWM_SUBS_DEFAULT_FIGHTSTART20 = "Te voy a eliminar.";
-SWWM_SUBS_DEFAULT_FIGHTSTART21 = "Oh, bien. Y yo que me temía no tener nada que hacer..";
+SWWM_SUBS_DEFAULT_FIGHTSTART13 = "¡Hora de luchar!";
+SWWM_SUBS_DEFAULT_FIGHTSTART14 = "Ya estamos otra vez.";
+SWWM_SUBS_DEFAULT_FIGHTSTART15 = "Oh no sabes con quien te estás metiendo.";
+SWWM_SUBS_DEFAULT_FIGHTSTART16 = "Bueno, aquí viene la fiesta.";
+SWWM_SUBS_DEFAULT_FIGHTSTART17 = "¡Que empiece la fiesta!";
+SWWM_SUBS_DEFAULT_FIGHTSTART18 = "Oh, por fin, algo que disparar.";
+SWWM_SUBS_DEFAULT_FIGHTSTART19 = "¡Empieza el show!";
+SWWM_SUBS_DEFAULT_FIGHTSTART20 = "Oh, estás muerto.";
+SWWM_SUBS_DEFAULT_FIGHTSTART21 = "Bien. Ya me preguntaba cuando ibas a aparecer.";
// played at map start
-SWWM_SUBS_DEFAULT_MAPSTART1 = "Ugh... este sitio apesta.";
-SWWM_SUBS_DEFAULT_MAPSTART2 = "OK, manos a la obra.";
-SWWM_SUBS_DEFAULT_MAPSTART3 = "Arreando que es gerundio.";
-SWWM_SUBS_DEFAULT_MAPSTART4 = "Este sitio tiene muy mala pinta.";
-SWWM_SUBS_DEFAULT_MAPSTART5 = "Nací preparada.";
-SWWM_SUBS_DEFAULT_MAPSTART6 = "La vida es dura, hago lo que tengo que hacer.";
-SWWM_SUBS_DEFAULT_MAPSTART7 = "Ningún robot es mejor que yo.";
-SWWM_SUBS_DEFAULT_MAPSTART8 = "Los he visto mejores.";
-SWWM_SUBS_DEFAULT_MAPSTART9 = "OK. Vamos para allá.";
-SWWM_SUBS_DEFAULT_MAPSTART10 = "No quiero problemas. Solo estoy de camino.";
-SWWM_SUBS_DEFAULT_MAPSTART11 = "Siento haceros esperar.";
-SWWM_SUBS_DEFAULT_MAPSTART12 = "Haré lo mejor que pueda.";
-SWWM_SUBS_DEFAULT_MAPSTART13 = "Que quede claro: Todo lo bueno que encuentre es mío.";
-SWWM_SUBS_DEFAULT_MAPSTART14 = "Seguro que la comida aquí es terrible.";
+SWWM_SUBS_DEFAULT_MAPSTART1 = "Ugh, joder... Este sitio apesta. Vomitaría si pudiera.";
+SWWM_SUBS_DEFAULT_MAPSTART2 = "Muy bien, manos a la obra.";
+SWWM_SUBS_DEFAULT_MAPSTART3 = "¿Misión... empieza?";
+SWWM_SUBS_DEFAULT_MAPSTART4 = "Vamos al tajo.";
+SWWM_SUBS_DEFAULT_MAPSTART5 = "Oh, estoy bien preparada para esto.";
+SWWM_SUBS_DEFAULT_MAPSTART6 = "Bueno, no estoy aquí por el paisaje.";
+SWWM_SUBS_DEFAULT_MAPSTART7 = "Que empiece la caza.";
+SWWM_SUBS_DEFAULT_MAPSTART8 = "Bueno esto pinta interesante...";
+SWWM_SUBS_DEFAULT_MAPSTART9 = "Vale. Vamos allá.";
+SWWM_SUBS_DEFAULT_MAPSTART10 = "Hora de pisar a fondo.";
+SWWM_SUBS_DEFAULT_MAPSTART11 = "Bueno, mas vale no dejar a todos esperando.";
+SWWM_SUBS_DEFAULT_MAPSTART12 = "Me esforzaré al máximo.";
+SWWM_SUBS_DEFAULT_MAPSTART13 = "Deja que diga una cosa: Todo lo que encuentre, me lo quedo.";
+SWWM_SUBS_DEFAULT_MAPSTART14 = "Vengo a mascar chicle y patear traseros... Y no tengo boca.";
// every time a secret is found
-SWWM_SUBS_DEFAULT_FINDSECRET1 = "Sí, sí, soy la mejor.";
-SWWM_SUBS_DEFAULT_FINDSECRET2 = "Es verdad. Molo bastante.";
-SWWM_SUBS_DEFAULT_FINDSECRET3 = "¿Que puedo decir? Se me da bien lo que hago.";
-SWWM_SUBS_DEFAULT_FINDSECRET4 = "No ha sido para tanto.";
-SWWM_SUBS_DEFAULT_FINDSECRET5 = "Ningún problema en absoluto.";
-SWWM_SUBS_DEFAULT_FINDSECRET6 = "Fue fácil.";
-SWWM_SUBS_DEFAULT_FINDSECRET7 = "Gracias a mí, sí.";
-SWWM_SUBS_DEFAULT_FINDSECRET8 = "Fue visto y no visto.";
-SWWM_SUBS_DEFAULT_FINDSECRET9 = "Fue pan comido.";
-SWWM_SUBS_DEFAULT_FINDSECRET10 = "Todavía tengo mi don.";
-SWWM_SUBS_DEFAULT_FINDSECRET11 = "He hecho un buen trabajo, ¿verdad?";
-SWWM_SUBS_DEFAULT_FINDSECRET12 = "Wow, ¡mira que suerte!";
-SWWM_SUBS_DEFAULT_FINDSECRET13 = "Sí, bueno, soy bastante guay.";
+SWWM_SUBS_DEFAULT_FINDSECRET1 = "Oh, ¿eso era un secreto?";
+SWWM_SUBS_DEFAULT_FINDSECRET2 = "Sí, molo bastante.";
+SWWM_SUBS_DEFAULT_FINDSECRET3 = "Jajaja... Eso no ha sido para tanto.";
+SWWM_SUBS_DEFAULT_FINDSECRET4 = "Sí, ningún problema en absoluto.";
+SWWM_SUBS_DEFAULT_FINDSECRET5 = "Facilísimo.";
+SWWM_SUBS_DEFAULT_FINDSECRET6 = "Está chupado.";
+SWWM_SUBS_DEFAULT_FINDSECRET7 = "Sí, todo cosa mía.";
+SWWM_SUBS_DEFAULT_FINDSECRET8 = "Vaya si pillé ese.";
+SWWM_SUBS_DEFAULT_FINDSECRET9 = "Sí, se me da bien encontrar tesoros.";
+SWWM_SUBS_DEFAULT_FINDSECRET10 = "Oh lo tengo pillado.";
+SWWM_SUBS_DEFAULT_FINDSECRET11 = "Eso estuvo bien, ¿a que sí?";
+SWWM_SUBS_DEFAULT_FINDSECRET12 = "Que suerte tengo, ¿eh?";
+SWWM_SUBS_DEFAULT_FINDSECRET13 = "Bueno, a ver, se me da muy bien esto.";
// frag taunts
-SWWM_SUBS_DEFAULT_SCOREKILL1 = "A tomar viento.";
-SWWM_SUBS_DEFAULT_SCOREKILL2 = "Uno menos.";
-SWWM_SUBS_DEFAULT_SCOREKILL3 = "Adiós.";
-SWWM_SUBS_DEFAULT_SCOREKILL4 = "¡Heh! No puedes pararme.";
-SWWM_SUBS_DEFAULT_SCOREKILL5 = "Perdedor.";
-SWWM_SUBS_DEFAULT_SCOREKILL6 = "Se acabó lo nuestro.";
-SWWM_SUBS_DEFAULT_SCOREKILL7 = "Chao.";
-SWWM_SUBS_DEFAULT_SCOREKILL8 = "Bien muerto.";
-SWWM_SUBS_DEFAULT_SCOREKILL9 = "Otro trabajo hecho.";
-SWWM_SUBS_DEFAULT_SCOREKILL10 = "El placer ha sido mío.";
-SWWM_SUBS_DEFAULT_SCOREKILL11 = "¿Que tal algo más desafiante la próxima vez?";
-SWWM_SUBS_DEFAULT_SCOREKILL12 = "Me alegro de que se haya terminado.";
-SWWM_SUBS_DEFAULT_SCOREKILL13 = "Bueno, se acabó. Ya está.";
-SWWM_SUBS_DEFAULT_SCOREKILL14 = "Hecho.";
-SWWM_SUBS_DEFAULT_SCOREKILL15 = "Piérdete.";
-SWWM_SUBS_DEFAULT_SCOREKILL16 = "¿Eso es todo?";
-SWWM_SUBS_DEFAULT_SCOREKILL17 = "¿Eso es lo mejor que puedes hacer?";
-SWWM_SUBS_DEFAULT_SCOREKILL18 = "Molestas.";
-SWWM_SUBS_DEFAULT_SCOREKILL19 = "Vas a tener que esforzarte más.";
-SWWM_SUBS_DEFAULT_SCOREKILL20 = "¿Que? ¿Ya está?";
-SWWM_SUBS_DEFAULT_SCOREKILL21 = "Fuera de aquí.";
+SWWM_SUBS_DEFAULT_SCOREKILL1 = "Pírate.";
+SWWM_SUBS_DEFAULT_SCOREKILL2 = "Uno más.";
+SWWM_SUBS_DEFAULT_SCOREKILL3 = "Chao.";
+SWWM_SUBS_DEFAULT_SCOREKILL4 = "Y otro más.";
+SWWM_SUBS_DEFAULT_SCOREKILL5 = "Ni siquiera fue difícil.";
+SWWM_SUBS_DEFAULT_SCOREKILL6 = "Hecho y hecho.";
+SWWM_SUBS_DEFAULT_SCOREKILL7 = "Hasta luego.";
+SWWM_SUBS_DEFAULT_SCOREKILL8 = "Otro más muerto.";
+SWWM_SUBS_DEFAULT_SCOREKILL9 = "Así de fácil.";
+SWWM_SUBS_DEFAULT_SCOREKILL10 = "El placer es mio.";
+SWWM_SUBS_DEFAULT_SCOREKILL11 = "Intenta esforzarte más la próxima vez.";
+SWWM_SUBS_DEFAULT_SCOREKILL12 = "Bueno, se acabó.";
+SWWM_SUBS_DEFAULT_SCOREKILL14 = "Ya está.";
+SWWM_SUBS_DEFAULT_SCOREKILL15 = "Eso, muérete.";
+SWWM_SUBS_DEFAULT_SCOREKILL16 = "¿Que? ¿Eso era todo?";
+SWWM_SUBS_DEFAULT_SCOREKILL17 = "Guau, mira si era débil...";
+SWWM_SUBS_DEFAULT_SCOREKILL18 = "Date el piro ya, que molestas.";
+SWWM_SUBS_DEFAULT_SCOREKILL19 = "Vas a necesitar más que eso para derrotarme.";
+SWWM_SUBS_DEFAULT_SCOREKILL20 = "¿Que? ¿Muerto ya?";
+SWWM_SUBS_DEFAULT_SCOREKILL21 = "Jódete.";
SWWM_SUBS_DEFAULT_SCOREKILL22 = "Un placer.";
SWWM_SUBS_DEFAULT_SCOREKILL23 = "Fuera de mi camino.";
-SWWM_SUBS_DEFAULT_SCOREKILL24 = "Quita de en medio.";
+SWWM_SUBS_DEFAULT_SCOREKILL24 = "Aquí tienes tu ración especial de MUERE.";
SWWM_SUBS_DEFAULT_SCOREKILL25 = "¿Quieres más?";
-SWWM_SUBS_DEFAULT_SCOREKILL26 = "Hecho y hecho.";
// oopsies
-SWWM_SUBS_DEFAULT_FRIENDKILL1 = "Oh dios mío.";
-SWWM_SUBS_DEFAULT_FRIENDKILL2 = "Dios mío. Lo siento mucho.";
-SWWM_SUBS_DEFAULT_FRIENDKILL3 = "Oh dios...";
-SWWM_SUBS_DEFAULT_FRIENDKILL4 = "Oh dios mío. ¿Estás bien?";
+SWWM_SUBS_DEFAULT_FRIENDKILL1 = "¡Oh no! ¡No no no no lo siento oh dios mío!";
+SWWM_SUBS_DEFAULT_FRIENDKILL2 = "¡Oh dios mío! Lo siento mucho...";
+SWWM_SUBS_DEFAULT_FRIENDKILL4 = "Oh dios mío no no no por favor...";
// getting hurt by monsters
-SWWM_SUBS_DEFAULT_GETHIT1 = "Pues vale...";
+SWWM_SUBS_DEFAULT_GETHIT1 = "¡Au! ¡Que te jodan!";
SWWM_SUBS_DEFAULT_GETHIT2 = "*suspiro*";
-SWWM_SUBS_DEFAULT_GETHIT4 = "Perra.";
-SWWM_SUBS_DEFAULT_GETHIT5 = "Capullo...";
-SWWM_SUBS_DEFAULT_GETHIT6 = "Molestas.";
-SWWM_SUBS_DEFAULT_GETHIT7 = "Que te den.";
-SWWM_SUBS_DEFAULT_GETHIT8 = "Tienes toda mi atención.";
-SWWM_SUBS_DEFAULT_GETHIT9 = "Voy a acabar con esto ahora mismo.";
-SWWM_SUBS_DEFAULT_GETHIT10 = "Mira que eres cansino.";
-SWWM_SUBS_DEFAULT_GETHIT11 = "Eso no ha valido.";
+SWWM_SUBS_DEFAULT_GETHIT3 = "Sí, buen disparo. Ahora muere.";
+SWWM_SUBS_DEFAULT_GETHIT4 = "Oh, serás capullo.";
+SWWM_SUBS_DEFAULT_GETHIT5 = "Cómo te atreves...";
+SWWM_SUBS_DEFAULT_GETHIT6 = "Oh, vas a lamentar eso.";
+SWWM_SUBS_DEFAULT_GETHIT7 = "¿Sí? ¡Pues que te jodan a ti también.";
+SWWM_SUBS_DEFAULT_GETHIT8 = "Vale, ya me has llamado la atención.";
+SWWM_SUBS_DEFAULT_GETHIT9 = "Esto acaba ahora.";
+SWWM_SUBS_DEFAULT_GETHIT10 = "Me estás cabreando.";
+SWWM_SUBS_DEFAULT_GETHIT11 = "Y una polla como la manga de un abrigo (lo cual no estaría mal).";
SWWM_SUBS_DEFAULT_GETHIT12 = "¿En serio?";
-SWWM_SUBS_DEFAULT_GETHIT13 = "Vas a tener que esforzarte más.";
-SWWM_SUBS_DEFAULT_GETHIT14 = "Fuera de aquí.";
-SWWM_SUBS_DEFAULT_GETHIT15 = "Y ahora es tu turno.";
-SWWM_SUBS_DEFAULT_GETHIT16 = "Hora de hacerte callar de una vez por todas.";
-SWWM_SUBS_DEFAULT_GETHIT17 = "No vas a salir de aquí de una pieza.";
-SWWM_SUBS_DEFAULT_GETHIT18 = "Parece que estás enfadado...";
-SWWM_SUBS_DEFAULT_GETHIT19 = "Ugh. Déjame en paz.";
+SWWM_SUBS_DEFAULT_GETHIT13 = "Es solo un rasguño.";
+SWWM_SUBS_DEFAULT_GETHIT14 = "Oh, jódete.";
+SWWM_SUBS_DEFAULT_GETHIT15 = "Y ahora es tu turno...";
+SWWM_SUBS_DEFAULT_GETHIT16 = "Ya estás muerto...";
+SWWM_SUBS_DEFAULT_GETHIT17 = "No vas a salir de aquí con vida.";
+SWWM_SUBS_DEFAULT_GETHIT18 = "Vale, ya lo pillo.";
+SWWM_SUBS_DEFAULT_GETHIT19 = "¡Ugh! Puto... déjame... joder...";
// getting hurt by friendlies
-SWWM_SUBS_DEFAULT_FRIENDHIT1 = "¿Te has enfadado conmigo?";
-SWWM_SUBS_DEFAULT_FRIENDHIT2 = "¿En serio?";
-SWWM_SUBS_DEFAULT_FRIENDHIT3 = "¿Que? ¿Por que?";
-SWWM_SUBS_DEFAULT_FRIENDHIT4 = "Eso no ha sido muy educado.";
-SWWM_SUBS_DEFAULT_FRIENDHIT5 = "Perdona, ¿que?";
-SWWM_SUBS_DEFAULT_FRIENDHIT6 = "No eres muy amigable, ¿verdad?";
-SWWM_SUBS_DEFAULT_FRIENDHIT7 = "Eh, eh. Tranquilidad.";
+SWWM_SUBS_DEFAULT_FRIENDHIT1 = "¿Eh a que ha venido eso?";
+SWWM_SUBS_DEFAULT_FRIENDHIT2 = "¿Que estas haciendo?";
+SWWM_SUBS_DEFAULT_FRIENDHIT3 = "¿Eh? ¿Por que?";
+SWWM_SUBS_DEFAULT_FRIENDHIT4 = "¡Guau, que grosero!";
+SWWM_SUBS_DEFAULT_FRIENDHIT5 = "¿Perdona?";
+SWWM_SUBS_DEFAULT_FRIENDHIT6 = "Eso no ha estado muy bien de tu parte...";
+SWWM_SUBS_DEFAULT_FRIENDHIT7 = "¡Eh! ¿Que haces?";
// hurting a friendly
-SWWM_SUBS_DEFAULT_HITFRIEND1 = "Lo... siento.";
-SWWM_SUBS_DEFAULT_HITFRIEND2 = "Lo siento.";
-SWWM_SUBS_DEFAULT_HITFRIEND3 = "Perdón.";
+SWWM_SUBS_DEFAULT_HITFRIEND1 = "Ah... ¡Lo siento!";
+SWWM_SUBS_DEFAULT_HITFRIEND2 = "¡Lo siento!";
+SWWM_SUBS_DEFAULT_HITFRIEND3 = "¡Culpa mía!";
// greeting another player
-SWWM_SUBS_DEFAULT_GREET1 = "Hola.";
-SWWM_SUBS_DEFAULT_GREET2 = "Hola que tal.";
-SWWM_SUBS_DEFAULT_GREET3 = "Ey.";
-SWWM_SUBS_DEFAULT_GREET4 = "Ey.";
-SWWM_SUBS_DEFAULT_GREET5 = "Ey.";
-SWWM_SUBS_DEFAULT_GREET6 = "Ey hola.";
+SWWM_SUBS_DEFAULT_GREET1 = "Oh, hola.";
+SWWM_SUBS_DEFAULT_GREET2 = "Hola.";
+SWWM_SUBS_DEFAULT_GREET3 = "Hola que tal.";
+SWWM_SUBS_DEFAULT_GREET5 = "Que tal.";
+SWWM_SUBS_DEFAULT_GREET6 = "Hola.";
SWWM_SUBS_DEFAULT_GREET7 = "Buenas.";
// ragekit
-SWWM_SUBS_DEFAULT_RAGEKIT1 = "¡¡¡¡¡AAAAAAAAAAAAAAAAAAAAAA!!!!!";
-SWWM_SUBS_DEFAULT_RAGEKIT2 = "¡¡¡JODEEEEEEEEERRRRRRRRRRR!!!";
-SWWM_SUBS_DEFAULT_RAGEKIT3 = "¡¡JODERJODERJODERR!!";
+SWWM_SUBS_DEFAULT_RAGEKIT1 = "¡¡¡AGH MIERDA JODER JODER JODER!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT2 = "¡JODERJODERJODER!";
+SWWM_SUBS_DEFAULT_RAGEKIT3 = "¡¡¡NNGNGNGHHHHJODERRRRRRR!!!";
SWWM_SUBS_DEFAULT_RAGEKIT4 = "¡¡¡¡AAAAAAAAAARGH!!!!";
-SWWM_SUBS_DEFAULT_RAGEKIT5 = "¡¡¡¡MATARRRRRRR!!!!";
-SWWM_SUBS_DEFAULT_RAGEKIT6 = "¡¡¡RAAAARGH!!! ¡¡¡VENGAAAA!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT5 = "¡¡¡JODERMIEDAJODERJODERJODER!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT6 = "¡¡¡RAAAAAGHNGGHNHHGGAAAAAGGH!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT7 = "¡¡¡JODEEEEEEEERRRRRRRR!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT8 = "¡¡¡JODER MIERDA JODER PIS CULO JODER!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT9 = "¡¡¡PORCULOJODERPISJODERMIERDA!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT10 = "¡¡¡PUTAVIRGENJODERMECAGOENTODOJODERRRR!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT11 = "¡¡¡MUERTE!!! ¡¡¡¡DESTRUCCIÓN!!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT12 = "¡¡¡VAISAMORIRTODOS!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT13 = "¡¡¡RRRGGHHH!!! ¡¡¡MATARRRRRRRRR!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT14 = "¡¡¡UUUUURRRRGGGGHHH!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT15 = "¡¡¡AAAAAAARGHGGGH!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT16 = "¡¡¡JODERJODERJODERJODERJODEEEEEEERRRRR!!!";
+SWWM_SUBS_DEFAULT_RAGEKIT17 = "¡¡¡JÓDETEJÓDETEJÓDETEEEEEEE!!!";
+// "Greetings mortal, are you ready to die?"
+SWWM_SUBS_DEFAULT_KORAXGREET1 = "Ehhhh... ¿Es una pregunta con trampa?";
+SWWM_SUBS_DEFAULT_KORAXGREET2 = "Oh, bien... Me encanta todo esto...";
+SWWM_SUBS_DEFAULT_KORAXGREET3 = "Bueno, ¿y tú?";
+SWWM_SUBS_DEFAULT_KORAXGREET4 = "Ugh... Por favor no te acerques tanto.";
+SWWM_SUBS_DEFAULT_KORAXGREET5 = "Guau... Un bastardo feo de verdad.";
+SWWM_SUBS_DEFAULT_KORAXGREET6 = "No sé ni por donde empezar con lo horrendo que eres.";
+SWWM_SUBS_DEFAULT_KORAXGREET7 = "Puaj, que demonios... ¿En serio tienes esa pinta?";
+SWWM_SUBS_DEFAULT_KORAXGREET8 = "Ehhhhhhhh... ¿Perdona?";
+SWWM_SUBS_DEFAULT_KORAXGREET9 = "Bueno eso no es un saludo amigable.";
+SWWM_SUBS_DEFAULT_KORAXGREET10 = "Sabes, te podría hacer la misma pregunta.";
+SWWM_SUBS_DEFAULT_KORAXGREET11 = "Pues te iba a preguntar lo mismo.";
+SWWM_SUBS_DEFAULT_KORAXGREET12 = "Bueno, estoy lista para patearte el trasero, ya que estamos.";
+SWWM_SUBS_DEFAULT_KORAXGREET13 = "No, pero estoy lista para cenar. ¿Sabes si hay alguna buena pizzería por aquí?";
+// "My servants can smell your blood, human"
+SWWM_SUBS_DEFAULT_KORAXBLOOD1 = "¿Sangre? ¿Que sangre?";
+SWWM_SUBS_DEFAULT_KORAXBLOOD2 = "No, debes de estar equivocado. Mi sangre está en mi otro cuerpo.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD3 = "Sí, sí, lo que tu digas...";
+SWWM_SUBS_DEFAULT_KORAXBLOOD4 = "Pues creo que no.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD5 = "Ehm... Sabes que yo no tengo de eso, ¿verdad?";
+SWWM_SUBS_DEFAULT_KORAXBLOOD6 = "Bueno, si tu lo dices...";
+SWWM_SUBS_DEFAULT_KORAXBLOOD7 = "Me da igual.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD8 = "¿Se supone que eso es una amenaza? Porque no está funcionando.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD9 = "Bueno, pues yo huelo como se mean encima de miedo. Y madre mía no quería saber como huele eso.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD10 = "Me importa un cagao, tío.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD11 = "Creo que me estás confundiendo con otra persona.";
+SWWM_SUBS_DEFAULT_KORAXBLOOD12 = "... ¿Estás seguro de eso?";
+SWWM_SUBS_DEFAULT_KORAXBLOOD13 = "Ehhhhh... ¿Que?";
+// "You have played this game too long, mortal, I think I shall remove you from the board"
+SWWM_SUBS_DEFAULT_KORAXGAME1 = "Ohhhh... No si te retiro yo a ti ese careto tuyo.";
+SWWM_SUBS_DEFAULT_KORAXGAME2 = "Bueno, pues que te jodan.";
+SWWM_SUBS_DEFAULT_KORAXGAME3 = "No estamos jugando al ajedrez.";
+SWWM_SUBS_DEFAULT_KORAXGAME4 = "No lo creo, cara anchoa. Jugaré todo el tiempo que quiera.";
+SWWM_SUBS_DEFAULT_KORAXGAME5 = "¿Estás intentando asustarme o algo?";
+SWWM_SUBS_DEFAULT_KORAXGAME6 = "Oh es que me va a encantar hacerte callar.";
+SWWM_SUBS_DEFAULT_KORAXGAME7 = "Oh, estás muerto en cuanto te encuentre.";
+SWWM_SUBS_DEFAULT_KORAXGAME8 = "¿De verdad? ¿Y como vas a hacer eso exactamente?";
+SWWM_SUBS_DEFAULT_KORAXGAME9 = "Por favor cállate ya...";
+SWWM_SUBS_DEFAULT_KORAXGAME10 = "Oh, que te follen. No eres quien manda aquí.";
+SWWM_SUBS_DEFAULT_KORAXGAME11 = "Sí, tú sigue diciendo chorradas...";
+SWWM_SUBS_DEFAULT_KORAXGAME12 = "Oh, tú inténtalo. Ya verás lo que pasa.";
+SWWM_SUBS_DEFAULT_KORAXGAME13 = "Me encantaría verte intentarlo, cara anchoa.";
+SWWM_SUBS_DEFAULT_KORAXGAME14 = "No se de qué hablas y no me importa.";
+// "Worship me and I may be yet merciful, then again, maybe not"
+SWWM_SUBS_DEFAULT_KORAXWORSHIP1 = "... ¿Que?";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP2 = "Lo siento, los bastardos feos no son mi tipo.";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP3 = "Ohhhhh, casi me pillas... ¡PUES NO!";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP4 = "Como si fuera a hacer eso. Que te jodan.";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP5 = "Psch... Menudo capullo monumental...";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP6 = "Sí sí, lo que sea, más mierdas...";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP7 = "Bla, bla, bla...";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP8 = "Lo siento, no te oigo con el sonido de lo idiota que eres.";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP9 = "¿Que coño te estás fumando?";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP10 = "¿Que, crees que eres un dios ahora?";
+SWWM_SUBS_DEFAULT_KORAXWORSHIP11 = "Cállate ya. Me da igual.";
+// "Are you strong enough to face your own masters?"
+SWWM_SUBS_DEFAULT_KORAXMASTERS1 = "Soy lo bastante fuerte como para partirte el puto culo.";
+SWWM_SUBS_DEFAULT_KORAXMASTERS2 = "Me da igual.";
+SWWM_SUBS_DEFAULT_KORAXMASTERS3 = "Sí, puede que sí.";
+SWWM_SUBS_DEFAULT_KORAXMASTERS4 = "Bueno, si insistes...";
+SWWM_SUBS_DEFAULT_KORAXMASTERS5 = "En serio que me estás confundiendo con otra persona, tío.";
+SWWM_SUBS_DEFAULT_KORAXMASTERS6 = "Sí... sí, así es.";
+SWWM_SUBS_DEFAULT_KORAXMASTERS7 = "Sí, lo soy.";
+SWWM_SUBS_DEFAULT_KORAXMASTERS8 = "¿Y a ti que te importa?";
+SWWM_SUBS_DEFAULT_KORAXMASTERS9 = "Urgh... Por favor cállate la puta boca ya.";
+/// Extra lines that wouldn't be possible without original voice acting
+// per-weapon lines (alternative)
+SWWM_SUBS_DEFAULT_GETDEEPIMPACT = "Soplaré y soplaré... y vuestra casa derribaré.";
+SWWM_SUBS_DEFAULT_GETPUSHERWEAPON = "¿Alguien quiere que le quite las caries?";
+SWWM_SUBS_DEFAULT_GETEXPLODIUMGUN1 = "Ah, mi fiel amigo.";
+SWWM_SUBS_DEFAULT_GETEXPLODIUMGUN2 = "Doble poder revienta-rodillas.";
+SWWM_SUBS_DEFAULT_GETSPREADGUN = "Mira que escopetita.";
+SWWM_SUBS_DEFAULT_GETWALLBUSTER = "25 cañones, más que suficiente para reventar todo.";
+SWWM_SUBS_DEFAULT_GETEVISCERATOR = "¡Cañón antiaéreo!";
+SWWM_SUBS_DEFAULT_GETHELLBLAZER = "Hora de que arda el infierno... je.";
+SWWM_SUBS_DEFAULT_GETSPARKSTER = "Hola, chispín. Vamos a divertirnos.";
+SWWM_SUBS_DEFAULT_GETSILVERBULLET = "Ahora ESTO si que es un arma.";
+SWWM_SUBS_DEFAULT_GETCANDYGUN = "Dulce... y letal.";
+SWWM_SUBS_DEFAULT_GETYNYKRON = "Hora de soltarle una supernova a estos capullos.";
+SWWM_SUBS_DEFAULT_GETITAMEXHAMMER = "Os voy a martillear bien.";
+SWWM_SUBS_DEFAULT_GETPLASMABLAST1 = "Soltando plasma.";
+SWWM_SUBS_DEFAULT_GETPLASMABLAST2 = "Ahora sí. El doble de diversión.";
+SWWM_SUBS_DEFAULT_GETPUNTZERBETA = "Os voy a taladrar bien taladrados."; // said with a cheap cowboy accent
+SWWM_SUBS_DEFAULT_GETPUNTZERGAMMA = "¿Automático y... superautomático? Vaya vaya...";
+SWWM_SUBS_DEFAULT_GETHEAVYMAHSHEENGUN = "¡Metralleta Pesada!";
+SWWM_SUBS_DEFAULT_GETQUADRAVOL = "Así las llamas de la Cruz Ardiente se propagaron a través de la horda...";
+SWWM_SUBS_DEFAULT_GETNEWSPARKSTER = "Me gustan las armas de plasma grandes.";
+SWWM_SUBS_DEFAULT_GETMORTALRIFLE = "Bienvenido a bordo, Míster.";
+SWWM_SUBS_DEFAULT_GETRAYKHOM = "Pero mira que TOCHO es esto, joder...";
+SWWM_SUBS_DEFAULT_GETRAFANKOS = "Definitiva... Me gusta como suena eso.";
+// key received
+SWWM_SUBS_DEFAULT_KEYGET1 = "Te tengo.";
+SWWM_SUBS_DEFAULT_KEYGET2 = "Tengo la llave.";
+SWWM_SUBS_DEFAULT_KEYGET3 = "Hm, brilla.";
+SWWM_SUBS_DEFAULT_KEYGET4 = "Esto me va a hacer falta.";
+SWWM_SUBS_DEFAULT_KEYGET5 = "¿Quien tiene la llave? Yo tengo la llave.";
+// use fail (randomly plays after humping walls too often)
+SWWM_SUBS_DEFAULT_USEFAIL1 = "Pues no.";
+SWWM_SUBS_DEFAULT_USEFAIL2 = "Aquí no hay nada.";
+SWWM_SUBS_DEFAULT_USEFAIL4 = "No furrula.";
+SWWM_SUBS_DEFAULT_USEFAIL5 = "Todavía nada.";
+SWWM_SUBS_DEFAULT_USEFAIL6 = "¿Donde está...?";
+SWWM_SUBS_DEFAULT_USEFAIL7 = "¿Ábrete sésamo?";
+SWWM_SUBS_DEFAULT_USEFAIL8 = "Eso no va a funcionar.";
+SWWM_SUBS_DEFAULT_USEFAIL9 = "Pues sí, nada.";
+// collectible received
+SWWM_SUBS_DEFAULT_CUBEGET = "Cubo...";
+SWWM_SUBS_DEFAULT_AKARIGET = "Realmente tengo que leer esto cuando pueda.";
+SWWM_SUBS_DEFAULT_SIGNALSGET = "Ahhh... Las canciones de Meido-chan, son tan buenas~";
+SWWM_SUBS_DEFAULT_NUTATCOGET = "¿NUTATCO?";
+SWWM_SUBS_DEFAULT_FRISPYGET = "*risita* El aperitivo favorito de Sayacchi.";
+SWWM_SUBS_DEFAULT_SAYAGET = "Peluchito suave...";
+SWWM_SUBS_DEFAULT_MOTHGET = "Ah, la waifu de Sayacchi.";
+SWWM_SUBS_DEFAULT_DEMOGET = "Jejeje, mi propio peluche.";
+SWWM_SUBS_DEFAULT_PEACHGET = "Espera, esto es... *risita*";
+SWWM_SUBS_DEFAULT_BREADGET = "Suaves bollitos jugosos...";
+SWWM_SUBS_DEFAULT_MANGAGET = "Sutil, Sayacchi. Muy sutil...";
+// *ungodly screeching*
+SWWM_SUBS_DEFAULT_KORAX1 = "¡Oh dios mío eres aun más feo en persona!";
+SWWM_SUBS_DEFAULT_KORAX2 = "Ah, el bastardo feo en persona.";
+SWWM_SUBS_DEFAULT_KORAX3 = "¿Que coño es eso? ¿Te has fusionado con tu serpiente o algo?";
+SWWM_SUBS_DEFAULT_KORAX4 = "Bueno adivina quien se va a retirar del tablero hoy...";
+SWWM_SUBS_DEFAULT_KORAX5 = "Guau, menuda pinta.";
+SWWM_SUBS_DEFAULT_KORAX6 = "No es por ofender, pero pareces un monstruo de fantasía cutre.";
+SWWM_SUBS_DEFAULT_KORAX7 = "Ya ya, *griiiiiiii* a ti también."; // use a robot-filtered version of Korax's sight sound there
+SWWM_SUBS_DEFAULT_KORAX8 = "Qué, no eres tan hablador en persona, ¿eh?";
+SWWM_SUBS_DEFAULT_KORAX9 = "Oh, así que ese olor a rancio eras tú al final.";
+// "!oremoR nhoJ ,em llik tsum uoy emag eht niw oT"
+SWWM_SUBS_DEFAULT_ROMERO1 = "¿Que?";
+SWWM_SUBS_DEFAULT_ROMERO2 = "Lo siento, no hablo el idioma que sea ese.";
+SWWM_SUBS_DEFAULT_ROMERO3 = "Vaya si es grandote...";
+SWWM_SUBS_DEFAULT_ROMERO4 = "No te preocupes, acabaré rápido.";
+SWWM_SUBS_DEFAULT_ROMERO5 = "Tienes un agujero muy grande ahí, ¿te importa que dispare dentro?";
+SWWM_SUBS_DEFAULT_ROMERO6 = "Tío, ¿estás bien? Tu cerebro está chorreando algo.";
+SWWM_SUBS_DEFAULT_ROMERO7 = "Hora del jefe final, ¿eh?";
+SWWM_SUBS_DEFAULT_ROMERO8 = ".oremoR nhoJ ,anatakiaD ed ogeuj ut atnacne eM";
+// "Foolish mortal, only your death is eternal!"
+SWWM_SUBS_DEFAULT_ARCHANGELUS1 = "... ¿Que?";
+SWWM_SUBS_DEFAULT_ARCHANGELUS2 = "Necio es el necio que llama a otros necios, necio.";
+SWWM_SUBS_DEFAULT_ARCHANGELUS3 = "Lo que va a ser eterna es la patada en el culo que te voy a dar.";
+SWWM_SUBS_DEFAULT_ARCHANGELUS4 = "Bonito disfraz, ¿te lo hizo tu mamá?";
+SWWM_SUBS_DEFAULT_ARCHANGELUS5 = "Oh, pero mírate con tus bonitas alitas y todo.";
+SWWM_SUBS_DEFAULT_ARCHANGELUS6 = "Ya ya, siempre es lo mismo con gente como tú.";
+SWWM_SUBS_DEFAULT_ARCHANGELUS7 = "Bueno, pero vosotros vais a tope con la mierda de pretender ser dioses, ¿no?";
+SWWM_SUBS_DEFAULT_ARCHANGELUS8 = "Me parece que voy a tener que hacerte entenderlo a ostias.";
+// "hself ruoy erutrot lliw I" (supposedly)
+SWWM_SUBS_DEFAULT_DSPARILA1 = "Oh pero mírate, si es caperucita roja.";
+SWWM_SUBS_DEFAULT_DSPARILA2 = "¿Por que no te bajas de esa cosa y hablamos?";
+SWWM_SUBS_DEFAULT_DSPARILA3 = "Voy a fregar el suelo contigo, friki.";
+SWWM_SUBS_DEFAULT_DSPARILB1 = "¿Pero que os pasa a todos con lo de hablar al revés?";
+SWWM_SUBS_DEFAULT_DSPARILB2 = "Lo siento, ¿podrías repetir eso?";
+SWWM_SUBS_DEFAULT_DSPARILB3 = "séver la ralbah odeup néibmat oY."; // record this line normally then just reverse it, really
+// (H-Doom compat) Demon girl petting
+SWWM_SUBS_DEFAULT_PETHDOOM1 = "Buena chica~";
+SWWM_SUBS_DEFAULT_PETHDOOM2 = "Eh, no tienes por qué pelear.";
+SWWM_SUBS_DEFAULT_PETHDOOM3 = "No te voy a hacer daño.";
+SWWM_SUBS_DEFAULT_PETHDOOM4 = "Ya está, ya pasó...";
+SWWM_SUBS_DEFAULT_PETHDOOM5 = "No pasa nada, seamos amigas.";
+SWWM_SUBS_DEFAULT_PETHDOOM6 = "Tranquila, todo está bien.";
+SWWM_SUBS_DEFAULT_PETHDOOM7 = "Que mona eres~";
+SWWM_SUBS_DEFAULT_PETHDOOM8 = "Jeje... Tienes un pelo tan suave~";
+SWWM_SUBS_DEFAULT_PETHDOOM9 = "Buena chica... Buena chica...";
+// (H-Doom compat) Aroused demon girl petting
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH1 = "Te gusta que te acaricien, ¿no?";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH2 = "Ya está, todo va bien...";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH3 = "Te ponen mis caricias, ¿a que sí?";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH4 = "Puedo hacer esto, por lo menos.";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH5 = "Sienta bien, ¿verdad?";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH6 = "Un tacto cariñoso es todo lo que necesitas~";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH7 = "Llámame luego, ¿vale?";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH8 = "Vaya, vaya... Estás tan sonrojada...";
+SWWM_SUBS_DEFAULT_PETHDOOMFINISH9 = "Jeje... De nada.";
+// White Lady petting
+SWWM_SUBS_DEFAULT_PETMASHIRO1 = "Polilla suave...";
+SWWM_SUBS_DEFAULT_PETMASHIRO2 = "Te gusta mi lámpara, ¿verdad?";
+SWWM_SUBS_DEFAULT_PETMASHIRO3 = "Eres tan guapa~";
+SWWM_SUBS_DEFAULT_PETMASHIRO4 = "Gracias por tu ayuda, señorita.";
+SWWM_SUBS_DEFAULT_PETMASHIRO5 = "Ya está... buena chica...";
+SWWM_SUBS_DEFAULT_PETMASHIRO6 = "Jeje... bonita chica polilla~";
+SWWM_SUBS_DEFAULT_PETMASHIRO7 = "Buena amiga~";
+// Button pushing
+SWWM_SUBS_DEFAULT_BUTTONPUSH1 = "Bip.";
+SWWM_SUBS_DEFAULT_BUTTONPUSH2 = "Bup.";
+// Fall "scream"
+SWWM_SUBS_DEFAULT_FALLING = "¡Wiiiiiiiiiiii~!";
+//// LEGACY VOICE - Fallout 4 JP Sole Survivor
+// voice name
+SWWM_VOICENAME_DEFAULT = "Clásico";
+// new weapon received
+SWWM_SUBS_LEGACY_GETWEAPON1 = "No está mal... No está mal para nada...";
+SWWM_SUBS_LEGACY_GETWEAPON2 = "Buena pesca...";
+SWWM_SUBS_LEGACY_GETWEAPON3 = "Ahora es mío...";
+SWWM_SUBS_LEGACY_GETWEAPON4 = "Bien...";
+SWWM_SUBS_LEGACY_GETWEAPON5 = "Bingo...";
+SWWM_SUBS_LEGACY_GETWEAPON6 = "Toma ya...";
+SWWM_SUBS_LEGACY_GETWEAPON7 = "Excelente...";
+SWWM_SUBS_LEGACY_GETWEAPON8 = "Sí...";
+SWWM_SUBS_LEGACY_GETWEAPON9 = "Eso es...";
+SWWM_SUBS_LEGACY_GETWEAPON10 = "Perfecto...";
+SWWM_SUBS_LEGACY_GETWEAPON11 = "Me gusta...";
+SWWM_SUBS_LEGACY_GETWEAPON12 = "Tiene buena pinta...";
+SWWM_SUBS_LEGACY_GETWEAPON13 = "Probablemente cueste una fortuna...";
+// locked door
+SWWM_SUBS_LEGACY_LOCKED1 = "No tengo la llave.";
+SWWM_SUBS_LEGACY_LOCKED2 = "Solo abre con una llave.";
+SWWM_SUBS_LEGACY_LOCKED3 = "Necesitaría la llave.";
+SWWM_SUBS_LEGACY_LOCKED4 = "Cerrado a cal y canto.";
+// jammed door (strife)
+SWWM_SUBS_LEGACY_JAMMED1 = "Está atrancada.";
+SWWM_SUBS_LEGACY_JAMMED2 = "Nada.";
+SWWM_SUBS_LEGACY_JAMMED3 = "Atrancada.";
+SWWM_SUBS_LEGACY_JAMMED4 = "Es inútil.";
+// puzzle item failure
+SWWM_SUBS_LEGACY_PUZZFAIL1 = "Maldición.";
+SWWM_SUBS_LEGACY_PUZZFAIL2 = "Maldita sea.";
+SWWM_SUBS_LEGACY_PUZZFAIL3 = "No bueno.";
+SWWM_SUBS_LEGACY_PUZZFAIL4 = "Pues no.";
+// puzzle item success
+SWWM_SUBS_LEGACY_PUZZSUCC1 = "Bien.";
+SWWM_SUBS_LEGACY_PUZZSUCC2 = "Eso es.";
+SWWM_SUBS_LEGACY_PUZZSUCC3 = "Lo tengo.";
+SWWM_SUBS_LEGACY_PUZZSUCC4 = "Sí.";
+SWWM_SUBS_LEGACY_PUZZSUCC5 = "Mola.";
+// first enemy encounter (20 seconds cooldown since all enemies dead)
+SWWM_SUBS_LEGACY_FIGHTSTART1 = "Ya estamos otra vez.";
+SWWM_SUBS_LEGACY_FIGHTSTART2 = "Que empiece el espectáculo.";
+SWWM_SUBS_LEGACY_FIGHTSTART3 = "Hora de morir.";
+SWWM_SUBS_LEGACY_FIGHTSTART4 = "Ven a por mí.";
+SWWM_SUBS_LEGACY_FIGHTSTART5 = "Vais a morir todos.";
+SWWM_SUBS_LEGACY_FIGHTSTART6 = "Ya tenía ganas de pelea.";
+SWWM_SUBS_LEGACY_FIGHTSTART7 = "Vamos con esto.";
+SWWM_SUBS_LEGACY_FIGHTSTART8 = "¡Hora de liarla! ¡A matarlos a todos!";
+SWWM_SUBS_LEGACY_FIGHTSTART9 = "En serio que no querrías empezar una pelea conmigo.";
+SWWM_SUBS_LEGACY_FIGHTSTART10 = "Vamos al asunto.";
+SWWM_SUBS_LEGACY_FIGHTSTART11 = "¡Matar!";
+SWWM_SUBS_LEGACY_FIGHTSTART12 = "Esto no será difícil.";
+SWWM_SUBS_LEGACY_FIGHTSTART13 = "Vamos allá.";
+SWWM_SUBS_LEGACY_FIGHTSTART14 = "Hagamos esto.";
+SWWM_SUBS_LEGACY_FIGHTSTART15 = "Acabemos con esto.";
+SWWM_SUBS_LEGACY_FIGHTSTART16 = "Bueno, esto será un desafío interesante.";
+SWWM_SUBS_LEGACY_FIGHTSTART17 = "OK. Empecemos con esto.";
+SWWM_SUBS_LEGACY_FIGHTSTART18 = "Oh, esto es justo lo que necesitaba ahora...";
+SWWM_SUBS_LEGACY_FIGHTSTART19 = "Hora de montar un espectáculo.";
+SWWM_SUBS_LEGACY_FIGHTSTART20 = "Te voy a eliminar.";
+SWWM_SUBS_LEGACY_FIGHTSTART21 = "Oh, bien. Y yo que me temía no tener nada que hacer..";
+// played at map start
+SWWM_SUBS_LEGACY_MAPSTART1 = "Ugh... este sitio apesta.";
+SWWM_SUBS_LEGACY_MAPSTART2 = "OK, manos a la obra.";
+SWWM_SUBS_LEGACY_MAPSTART3 = "Arreando que es gerundio.";
+SWWM_SUBS_LEGACY_MAPSTART4 = "Este sitio tiene muy mala pinta.";
+SWWM_SUBS_LEGACY_MAPSTART5 = "Nací preparada.";
+SWWM_SUBS_LEGACY_MAPSTART6 = "La vida es dura, hago lo que tengo que hacer.";
+SWWM_SUBS_LEGACY_MAPSTART7 = "Ningún robot es mejor que yo.";
+SWWM_SUBS_LEGACY_MAPSTART8 = "Los he visto mejores.";
+SWWM_SUBS_LEGACY_MAPSTART9 = "OK. Vamos para allá.";
+SWWM_SUBS_LEGACY_MAPSTART10 = "No quiero problemas. Solo estoy de camino.";
+SWWM_SUBS_LEGACY_MAPSTART11 = "Siento haceros esperar.";
+SWWM_SUBS_LEGACY_MAPSTART12 = "Haré lo mejor que pueda.";
+SWWM_SUBS_LEGACY_MAPSTART13 = "Que quede claro: Todo lo bueno que encuentre es mío.";
+SWWM_SUBS_LEGACY_MAPSTART14 = "Seguro que la comida aquí es terrible.";
+// every time a secret is found
+SWWM_SUBS_LEGACY_FINDSECRET1 = "Sí, sí, soy la mejor.";
+SWWM_SUBS_LEGACY_FINDSECRET2 = "Es verdad. Molo bastante.";
+SWWM_SUBS_LEGACY_FINDSECRET3 = "¿Que puedo decir? Se me da bien lo que hago.";
+SWWM_SUBS_LEGACY_FINDSECRET4 = "No ha sido para tanto.";
+SWWM_SUBS_LEGACY_FINDSECRET5 = "Ningún problema en absoluto.";
+SWWM_SUBS_LEGACY_FINDSECRET6 = "Fue fácil.";
+SWWM_SUBS_LEGACY_FINDSECRET7 = "Gracias a mí, sí.";
+SWWM_SUBS_LEGACY_FINDSECRET8 = "Fue visto y no visto.";
+SWWM_SUBS_LEGACY_FINDSECRET9 = "Fue pan comido.";
+SWWM_SUBS_LEGACY_FINDSECRET10 = "Todavía tengo mi don.";
+SWWM_SUBS_LEGACY_FINDSECRET11 = "He hecho un buen trabajo, ¿verdad?";
+SWWM_SUBS_LEGACY_FINDSECRET12 = "Wow, ¡mira que suerte!";
+SWWM_SUBS_LEGACY_FINDSECRET13 = "Sí, bueno, soy bastante guay.";
+// frag taunts
+SWWM_SUBS_LEGACY_SCOREKILL1 = "A tomar viento.";
+SWWM_SUBS_LEGACY_SCOREKILL2 = "Uno menos.";
+SWWM_SUBS_LEGACY_SCOREKILL3 = "Adiós.";
+SWWM_SUBS_LEGACY_SCOREKILL4 = "¡Heh! No puedes pararme.";
+SWWM_SUBS_LEGACY_SCOREKILL5 = "Perdedor.";
+SWWM_SUBS_LEGACY_SCOREKILL6 = "Se acabó lo nuestro.";
+SWWM_SUBS_LEGACY_SCOREKILL7 = "Chao.";
+SWWM_SUBS_LEGACY_SCOREKILL8 = "Bien muerto.";
+SWWM_SUBS_LEGACY_SCOREKILL9 = "Otro trabajo hecho.";
+SWWM_SUBS_LEGACY_SCOREKILL10 = "El placer ha sido mío.";
+SWWM_SUBS_LEGACY_SCOREKILL11 = "¿Que tal algo más desafiante la próxima vez?";
+SWWM_SUBS_LEGACY_SCOREKILL12 = "Me alegro de que se haya terminado.";
+SWWM_SUBS_LEGACY_SCOREKILL13 = "Bueno, se acabó. Ya está.";
+SWWM_SUBS_LEGACY_SCOREKILL14 = "Hecho.";
+SWWM_SUBS_LEGACY_SCOREKILL15 = "Piérdete.";
+SWWM_SUBS_LEGACY_SCOREKILL16 = "¿Eso es todo?";
+SWWM_SUBS_LEGACY_SCOREKILL17 = "¿Eso es lo mejor que puedes hacer?";
+SWWM_SUBS_LEGACY_SCOREKILL18 = "Molestas.";
+SWWM_SUBS_LEGACY_SCOREKILL19 = "Vas a tener que esforzarte más.";
+SWWM_SUBS_LEGACY_SCOREKILL20 = "¿Que? ¿Ya está?";
+SWWM_SUBS_LEGACY_SCOREKILL21 = "Fuera de aquí.";
+SWWM_SUBS_LEGACY_SCOREKILL22 = "Un placer.";
+SWWM_SUBS_LEGACY_SCOREKILL23 = "Fuera de mi camino.";
+SWWM_SUBS_LEGACY_SCOREKILL24 = "Quita de en medio.";
+SWWM_SUBS_LEGACY_SCOREKILL25 = "¿Quieres más?";
+SWWM_SUBS_LEGACY_SCOREKILL26 = "Hecho y hecho.";
+// oopsies
+SWWM_SUBS_LEGACY_FRIENDKILL1 = "Oh dios mío.";
+SWWM_SUBS_LEGACY_FRIENDKILL2 = "Dios mío. Lo siento mucho.";
+SWWM_SUBS_LEGACY_FRIENDKILL3 = "Oh dios...";
+SWWM_SUBS_LEGACY_FRIENDKILL4 = "Oh dios mío. ¿Estás bien?";
+// getting hurt by monsters
+SWWM_SUBS_LEGACY_GETHIT1 = "Pues vale...";
+SWWM_SUBS_LEGACY_GETHIT2 = "*suspiro*";
+SWWM_SUBS_LEGACY_GETHIT4 = "Perra.";
+SWWM_SUBS_LEGACY_GETHIT5 = "Capullo...";
+SWWM_SUBS_LEGACY_GETHIT6 = "Molestas.";
+SWWM_SUBS_LEGACY_GETHIT7 = "Que te den.";
+SWWM_SUBS_LEGACY_GETHIT8 = "Tienes toda mi atención.";
+SWWM_SUBS_LEGACY_GETHIT9 = "Voy a acabar con esto ahora mismo.";
+SWWM_SUBS_LEGACY_GETHIT10 = "Mira que eres cansino.";
+SWWM_SUBS_LEGACY_GETHIT11 = "Eso no ha valido.";
+SWWM_SUBS_LEGACY_GETHIT12 = "¿En serio?";
+SWWM_SUBS_LEGACY_GETHIT13 = "Vas a tener que esforzarte más.";
+SWWM_SUBS_LEGACY_GETHIT14 = "Fuera de aquí.";
+SWWM_SUBS_LEGACY_GETHIT15 = "Y ahora es tu turno.";
+SWWM_SUBS_LEGACY_GETHIT16 = "Hora de hacerte callar de una vez por todas.";
+SWWM_SUBS_LEGACY_GETHIT17 = "No vas a salir de aquí de una pieza.";
+SWWM_SUBS_LEGACY_GETHIT18 = "Parece que estás enfadado...";
+SWWM_SUBS_LEGACY_GETHIT19 = "Ugh. Déjame en paz.";
+// getting hurt by friendlies
+SWWM_SUBS_LEGACY_FRIENDHIT1 = "¿Te has enfadado conmigo?";
+SWWM_SUBS_LEGACY_FRIENDHIT2 = "¿En serio?";
+SWWM_SUBS_LEGACY_FRIENDHIT3 = "¿Que? ¿Por que?";
+SWWM_SUBS_LEGACY_FRIENDHIT4 = "Eso no ha sido muy educado.";
+SWWM_SUBS_LEGACY_FRIENDHIT5 = "Perdona, ¿que?";
+SWWM_SUBS_LEGACY_FRIENDHIT6 = "No eres muy amigable, ¿verdad?";
+SWWM_SUBS_LEGACY_FRIENDHIT7 = "Eh, eh. Tranquilidad.";
+// hurting a friendly
+SWWM_SUBS_LEGACY_HITFRIEND1 = "Lo... siento.";
+SWWM_SUBS_LEGACY_HITFRIEND2 = "Lo siento.";
+SWWM_SUBS_LEGACY_HITFRIEND3 = "Perdón.";
+// greeting another player
+SWWM_SUBS_LEGACY_GREET1 = "Hola.";
+SWWM_SUBS_LEGACY_GREET2 = "Hola que tal.";
+SWWM_SUBS_LEGACY_GREET3 = "Ey.";
+SWWM_SUBS_LEGACY_GREET4 = "Ey.";
+SWWM_SUBS_LEGACY_GREET5 = "Ey.";
+SWWM_SUBS_LEGACY_GREET6 = "Ey hola.";
+SWWM_SUBS_LEGACY_GREET7 = "Buenas.";
+// ragekit
+SWWM_SUBS_LEGACY_RAGEKIT1 = "¡¡¡¡¡AAAAAAAAAAAAAAAAAAAAAA!!!!!";
+SWWM_SUBS_LEGACY_RAGEKIT2 = "¡¡¡JODEEEEEEEEERRRRRRRRRRR!!!";
+SWWM_SUBS_LEGACY_RAGEKIT3 = "¡¡JODERJODERJODERR!!";
+SWWM_SUBS_LEGACY_RAGEKIT4 = "¡¡¡¡AAAAAAAAAARGH!!!!";
+SWWM_SUBS_LEGACY_RAGEKIT5 = "¡¡¡¡MATARRRRRRR!!!!";
+SWWM_SUBS_LEGACY_RAGEKIT6 = "¡¡¡RAAAARGH!!! ¡¡¡VENGAAAA!!!";
// --- comebacks for korax hub lines ---
// "Greetings mortal, are you ready to die?"
-SWWM_SUBS_DEFAULT_KORAXGREET1 = "Oh vaya. Ya está. Yo me largo.";
-SWWM_SUBS_DEFAULT_KORAXGREET2 = "Bien... todo muy bien.";
-SWWM_SUBS_DEFAULT_KORAXGREET3 = "No quiero lo que sea que me estés vendiendo.";
-SWWM_SUBS_DEFAULT_KORAXGREET4 = "La verdad... no eres mi tipo.";
-SWWM_SUBS_DEFAULT_KORAXGREET5 = "La primera palabra que tengo en mente es 'feo'.";
-SWWM_SUBS_DEFAULT_KORAXGREET6 = "Pareces como algo que quedó en la nevera demasiado tiempo.";
-SWWM_SUBS_DEFAULT_KORAXGREET7 = "Veo que venir aquí fue un error.";
-SWWM_SUBS_DEFAULT_KORAXGREET8 = "Me incomoda que me miren tan de cerca.";
-SWWM_SUBS_DEFAULT_KORAXGREET9 = "Buena actitud...";
-SWWM_SUBS_DEFAULT_KORAXGREET10 = "Te podría preguntar lo mismo.";
-SWWM_SUBS_DEFAULT_KORAXGREET11 = "Te iba a preguntar lo mismo.";
-SWWM_SUBS_DEFAULT_KORAXGREET12 = "Solo busco la mayonesa. A lo mejor me la puedes dar. Segundo estante, justo al lado del flan.";
-SWWM_SUBS_DEFAULT_KORAXGREET13 = "Vengo a recoger un pedido. Dos de peperoni grandes y un calzone. A nombre de 'Jódete'.";
+SWWM_SUBS_LEGACY_KORAXGREET1 = "Oh vaya. Ya está. Yo me largo.";
+SWWM_SUBS_LEGACY_KORAXGREET2 = "Bien... todo muy bien.";
+SWWM_SUBS_LEGACY_KORAXGREET3 = "No quiero lo que sea que me estés vendiendo.";
+SWWM_SUBS_LEGACY_KORAXGREET4 = "La verdad... no eres mi tipo.";
+SWWM_SUBS_LEGACY_KORAXGREET5 = "La primera palabra que tengo en mente es 'feo'.";
+SWWM_SUBS_LEGACY_KORAXGREET6 = "Pareces como algo que quedó en la nevera demasiado tiempo.";
+SWWM_SUBS_LEGACY_KORAXGREET7 = "Veo que venir aquí fue un error.";
+SWWM_SUBS_LEGACY_KORAXGREET8 = "Me incomoda que me miren tan de cerca.";
+SWWM_SUBS_LEGACY_KORAXGREET9 = "Buena actitud...";
+SWWM_SUBS_LEGACY_KORAXGREET10 = "Te podría preguntar lo mismo.";
+SWWM_SUBS_LEGACY_KORAXGREET11 = "Te iba a preguntar lo mismo.";
+SWWM_SUBS_LEGACY_KORAXGREET12 = "Solo busco la mayonesa. A lo mejor me la puedes dar. Segundo estante, justo al lado del flan.";
+SWWM_SUBS_LEGACY_KORAXGREET13 = "Vengo a recoger un pedido. Dos de peperoni grandes y un calzone. A nombre de 'Jódete'.";
// "My servants can smell your blood, human"
-SWWM_SUBS_DEFAULT_KORAXBLOOD1 = "Pervertido.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD2 = "Interesante saberlo.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD3 = "Lo que tú digas.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD4 = "Pues no creo yo.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD5 = "Um... sí... no lo creo...";
-SWWM_SUBS_DEFAULT_KORAXBLOOD6 = "Si tú lo dices.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD7 = "Me da igual.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD8 = "Lo que sea. Tampoco es que me importe.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD9 = "Me importa un cagao.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD10 = "Como si me importara una mierda...";
-SWWM_SUBS_DEFAULT_KORAXBLOOD11 = "Creo que me confundes con alguien a quien le importara una mierda.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD12 = "No estoy tan segura de eso.";
-SWWM_SUBS_DEFAULT_KORAXBLOOD13 = "Cállate ya.";
+SWWM_SUBS_LEGACY_KORAXBLOOD1 = "Pervertido.";
+SWWM_SUBS_LEGACY_KORAXBLOOD2 = "Interesante saberlo.";
+SWWM_SUBS_LEGACY_KORAXBLOOD3 = "Lo que tú digas.";
+SWWM_SUBS_LEGACY_KORAXBLOOD4 = "Pues no creo yo.";
+SWWM_SUBS_LEGACY_KORAXBLOOD5 = "Um... sí... no lo creo...";
+SWWM_SUBS_LEGACY_KORAXBLOOD6 = "Si tú lo dices.";
+SWWM_SUBS_LEGACY_KORAXBLOOD7 = "Me da igual.";
+SWWM_SUBS_LEGACY_KORAXBLOOD8 = "Lo que sea. Tampoco es que me importe.";
+SWWM_SUBS_LEGACY_KORAXBLOOD9 = "Me importa un cagao.";
+SWWM_SUBS_LEGACY_KORAXBLOOD10 = "Como si me importara una mierda...";
+SWWM_SUBS_LEGACY_KORAXBLOOD11 = "Creo que me confundes con alguien a quien le importara una mierda.";
+SWWM_SUBS_LEGACY_KORAXBLOOD12 = "No estoy tan segura de eso.";
+SWWM_SUBS_LEGACY_KORAXBLOOD13 = "Cállate ya.";
// "You have played this game too long, mortal, I think I shall remove you from the board"
-SWWM_SUBS_DEFAULT_KORAXGAME1 = "Me da lo mismo.";
-SWWM_SUBS_DEFAULT_KORAXGAME2 = "Vete a tomar por culo.";
-SWWM_SUBS_DEFAULT_KORAXGAME3 = "Oh, vete a tomar por saco.";
-SWWM_SUBS_DEFAULT_KORAXGAME4 = "No va a pasar.";
-SWWM_SUBS_DEFAULT_KORAXGAME5 = "Tus amenazas no me asustan.";
-SWWM_SUBS_DEFAULT_KORAXGAME6 = "Y una porra.";
-SWWM_SUBS_DEFAULT_KORAXGAME7 = "No me gusta que me amenacen.";
-SWWM_SUBS_DEFAULT_KORAXGAME8 = "¿Algo más que tenga que saber?";
-SWWM_SUBS_DEFAULT_KORAXGAME9 = "Cállate...";
-SWWM_SUBS_DEFAULT_KORAXGAME10 = "Nadie me habla así. Que te zurzan.";
-SWWM_SUBS_DEFAULT_KORAXGAME11 = "No hablarás cuando estés muerto.";
-SWWM_SUBS_DEFAULT_KORAXGAME12 = "Me gustaría verte intentarlo.";
-SWWM_SUBS_DEFAULT_KORAXGAME13 = "Oh, inténtalo.";
-SWWM_SUBS_DEFAULT_KORAXGAME14 = "No sé de que me hablas, y no me importa.";
+SWWM_SUBS_LEGACY_KORAXGAME1 = "Me da lo mismo.";
+SWWM_SUBS_LEGACY_KORAXGAME2 = "Vete a tomar por culo.";
+SWWM_SUBS_LEGACY_KORAXGAME3 = "Oh, vete a tomar por saco.";
+SWWM_SUBS_LEGACY_KORAXGAME4 = "No va a pasar.";
+SWWM_SUBS_LEGACY_KORAXGAME5 = "Tus amenazas no me asustan.";
+SWWM_SUBS_LEGACY_KORAXGAME6 = "Y una porra.";
+SWWM_SUBS_LEGACY_KORAXGAME7 = "No me gusta que me amenacen.";
+SWWM_SUBS_LEGACY_KORAXGAME8 = "¿Algo más que tenga que saber?";
+SWWM_SUBS_LEGACY_KORAXGAME9 = "Cállate...";
+SWWM_SUBS_LEGACY_KORAXGAME10 = "Nadie me habla así. Que te zurzan.";
+SWWM_SUBS_LEGACY_KORAXGAME11 = "No hablarás cuando estés muerto.";
+SWWM_SUBS_LEGACY_KORAXGAME12 = "Me gustaría verte intentarlo.";
+SWWM_SUBS_LEGACY_KORAXGAME13 = "Oh, inténtalo.";
+SWWM_SUBS_LEGACY_KORAXGAME14 = "No sé de que me hablas, y no me importa.";
// "Worship me and I may be yet merciful, then again, maybe not"
-SWWM_SUBS_DEFAULT_KORAXWORSHIP1 = "¿Que?";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP2 = "Menudo idiota...";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP3 = "Capullo presumido...";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP4 = "Parece que a alguien se le ha inflado el ego.";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP5 = "Tan ensimismado...";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP6 = "Ya he oído bastantes chorradas tuyas.";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP7 = "Bla, bla, bla...";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP8 = "¿Que? No te oigo con este zumbido en mis oidos.";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP9 = "Debes de pensar que soy idiota.";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP10 = "¿Te parezco idiota?";
-SWWM_SUBS_DEFAULT_KORAXWORSHIP11 = "Tienes una opinión bastante elevada de ti mismo.";
+SWWM_SUBS_LEGACY_KORAXWORSHIP1 = "¿Que?";
+SWWM_SUBS_LEGACY_KORAXWORSHIP2 = "Menudo idiota...";
+SWWM_SUBS_LEGACY_KORAXWORSHIP3 = "Capullo presumido...";
+SWWM_SUBS_LEGACY_KORAXWORSHIP4 = "Parece que a alguien se le ha inflado el ego.";
+SWWM_SUBS_LEGACY_KORAXWORSHIP5 = "Tan ensimismado...";
+SWWM_SUBS_LEGACY_KORAXWORSHIP6 = "Ya he oído bastantes chorradas tuyas.";
+SWWM_SUBS_LEGACY_KORAXWORSHIP7 = "Bla, bla, bla...";
+SWWM_SUBS_LEGACY_KORAXWORSHIP8 = "¿Que? No te oigo con este zumbido en mis oidos.";
+SWWM_SUBS_LEGACY_KORAXWORSHIP9 = "Debes de pensar que soy idiota.";
+SWWM_SUBS_LEGACY_KORAXWORSHIP10 = "¿Te parezco idiota?";
+SWWM_SUBS_LEGACY_KORAXWORSHIP11 = "Tienes una opinión bastante elevada de ti mismo.";
// "Are you strong enough to face your own masters?"
-SWWM_SUBS_DEFAULT_KORAXMASTERS1 = "¿Podemos ir aligerando? Tengo sitios a los que ir.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS2 = "No me gusta que la gente me diga lo que tengo que hacer.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS3 = "Uh... sí, eso es.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS4 = "Supongo que no tengo nada mejor que hacer.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS5 = "Me estoy preguntando lo mismo.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS6 = "No es asunto tuyo.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS7 = "Sí, lo soy.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS8 = "Eso no es asunto tuyo.";
-SWWM_SUBS_DEFAULT_KORAXMASTERS9 = "Por favor cállate ya...";
+SWWM_SUBS_LEGACY_KORAXMASTERS1 = "¿Podemos ir aligerando? Tengo sitios a los que ir.";
+SWWM_SUBS_LEGACY_KORAXMASTERS2 = "No me gusta que la gente me diga lo que tengo que hacer.";
+SWWM_SUBS_LEGACY_KORAXMASTERS3 = "Uh... sí, eso es.";
+SWWM_SUBS_LEGACY_KORAXMASTERS4 = "Supongo que no tengo nada mejor que hacer.";
+SWWM_SUBS_LEGACY_KORAXMASTERS5 = "Me estoy preguntando lo mismo.";
+SWWM_SUBS_LEGACY_KORAXMASTERS6 = "No es asunto tuyo.";
+SWWM_SUBS_LEGACY_KORAXMASTERS7 = "Sí, lo soy.";
+SWWM_SUBS_LEGACY_KORAXMASTERS8 = "Eso no es asunto tuyo.";
+SWWM_SUBS_LEGACY_KORAXMASTERS9 = "Por favor cállate ya...";
diff --git a/language.version b/language.version
index cb8c4547c..16823fa6e 100644
--- a/language.version
+++ b/language.version
@@ -1,3 +1,3 @@
[default]
-SWWM_MODVER="\cyDEMOLITIONIST \cw1.1.46 \cu(Mon 14 Feb 01:27:36 CET 2022)\c-";
-SWWM_SHORTVER="\cw1.1.46 \cu(2022-02-14 01:27:36)\c-";
+SWWM_MODVER="\cyDEMOLITIONIST \cw1.1.46 \cu(Sat 26 Mar 21:11:03 CET 2022)\c-";
+SWWM_SHORTVER="\cw1.1.46 \cu(2022-03-26 21:11:03)\c-";
diff --git a/lore/default/anarukon.txt b/lore/default/anarukon.txt
index 803614a57..f4a0d11f7 100644
--- a/lore/default/anarukon.txt
+++ b/lore/default/anarukon.txt
@@ -26,7 +26,7 @@ Many people of this race can be found on Earth, a fact that was mostly kept well
Among the many members of this race inhabiting Earth, one name many would recognize would be that of **Ashley Knox**, lead singer and guitarist of **The Black Rat's Coven**. The reveal of not being actually human was received with much surprise, though it was not as spectacular as the fact that two other members of the band were literal gods.
\cxSaya's Notes:\c-
-\cfYeah, really cool stuff about parallel worlds and gods and warriors and shit, ain't it? Stuff like this really makes me wish I could just like... travel all over the multiverse finding neat stuff and meeting cool people, you know. Maybe one day, who knows. All the shit that those fucking UAC idiots have done honestly made me rethink ever getting into interdimensional travel. Seriously, it's like every single damn old story about "opening a portal to hell" was just a prediction for that. Anyway, I'm getting a bit sidetracked. So, Ashley-san is one of them, that's neat and all, at least Yu-chan gets to have her own immortal girlfriend, huh. Same for Taro nii-san, having that damn prankster gremlin Ellen-san, also one of these people, of course. When the hell is it going to be my turn? I mean, not that I mind, I'm fine with having Maidbot and Ibuki around, and... I guess you too but... *sigh*, makes me damn jealous, you know.\c-
+\cfYeah, really cool stuff about parallel worlds and gods and warriors and shit, ain't it? Stuff like this really makes me wish I could just like... travel all over the multiverse finding neat stuff and meeting cool people, you know. Maybe one day, who knows. All the shit that those fucking UAC idiots have done honestly made me rethink ever getting into interdimensional travel. Seriously, it's like every single damn old story about "opening a portal to hell" was just a prediction for that. Anyway, I'm getting a bit sidetracked. So, Ashley-san is one of them, that's neat and all, at least Yu-chan gets to have her own immortal girlfriend, huh. Same for Taro nii-san, having that damn prankster gremlin Ellen-san, also one of these people, of course. When the hell is it going to be my turn? I mean, not that I mind, I'm fine with having Meido and Ibuki around, and... I guess you too but... *sigh*, makes me damn jealous, you know.\c-
TXT
\cxName:\c-
\cf Anarukon ("Undying")\c-
diff --git a/lore/default/ashley.txt b/lore/default/ashley.txt
index a4acf6d10..d86b6062c 100644
--- a/lore/default/ashley.txt
+++ b/lore/default/ashley.txt
@@ -5,17 +5,19 @@ People
REL
Yui;Saya;Sankaideriha;Gods
TXT
-\cxFull Name:\c-
-\cf Ashley Knox\c-
-\cf Axaleyu Yanikov (Anarukon name)\c-
-\cxNationality:\c-
-\cf British\c-
-\cxDate of Birth:\c-
-\cf 1964-10-31 (before reveal)\c-
-\cf 1887-10-31 (actual)\c-
-\cxTwitter:\c-
-\cf @ashley_da_witch (main)\c-
-\cf @stylish_witch (art)\c-
+ \cxFull Name:\c-
+ \cf Ashley Knox\c-
+ \cf Axaleyu Yanikov (Anarukon name)\c-
+ \cxNationality:\c-
+ \cf British\c-
+ \cxDate of Birth:\c-
+ \cf 1964-10-31 (before reveal)\c-
+ \cf 1887-10-31 (actual)\c-
+ \cxOccupation:\c-
+ \cf Lead Singer, Guitarist (Black Rat's Coven)\c-
+ \cxTwitter:\c-
+ \cf @ashley_da_witch (main)\c-
+ \cf @stylish_witch (art)\c-
Born in London in 1887, to **Yrikha Yanikov** and **Maxwell A. Knox**, **Ashley** is the oldest of three children, the others being **Adrian Knox**, veteran of both WW1 and WW2, and **Viola Knox**, a witch in training (still as of 2148). She spent most of her childhood in Cornwall, after her mother had to flee due to accusations of witchcraft (which weren't exactly false).
diff --git a/lore/default/bigshot.txt b/lore/default/bigshot.txt
index 972c6d2a4..726f10989 100644
--- a/lore/default/bigshot.txt
+++ b/lore/default/bigshot.txt
@@ -5,14 +5,17 @@ People
REL
Blackmann;Saya
TXT
-\cxFull Name:\c-
-\cf John Gunns\c-
-\cxAlias:\c-
-\cf Mr. BIG SHOT\c-
-\cxNationality:\c-
-\cf American\c-
-\cxDate of Birth:\c-
-\cf 2110-11-12\c-
+ \cxFull Name:\c-
+ \cf John Gunns\c-
+ \cxAlias:\c-
+ \cf Mr. BIG SHOT\c-
+ \cxNationality:\c-
+ \cf American\c-
+ \cxDate of Birth:\c-
+ \cf 2110-11-12\c-
+ \cxOccupation:\c-
+ \cf CEO (BIGSHOT Industries)\c-
+ \cf Advisor (Blackmann Arms)\c-
A man shrouded in mystery, having appeared out of nowhere, announcing himself to be the son of **Benellus, God of Shotguns**. The believability of this story is quite questionable, despite the insistence of his own mother, who claims that the god descended from the heavens, and giving her one "blessed shotgun shell", she was ordered to plant it on the ground, as from it, a man would be born, who would become the "mightiest wielder of the ultimate firearm". She said that John, already fully grown, sprung up from the ground only days after the shell was planted, and immediately proceeded to "make shotguns burst from the ground around himself", and he used the metals from them to build the very fortress the family has in the Nevada desert.
@@ -21,14 +24,17 @@ Despite all this odd storytelling, the man himself does appear to hold quite a l
\cxSaya's Notes:\c-
\cfYeah, dude's crazy, but see, THAT thing... I really REALLY wanted it. I even met up with the guy to get my hands on it. That shit is like... completely fucking insane, and I bet no living human would be able to fucking use it, BUT... you definitely can. Just so you know, every time you whip out that ballbusting hunk of metal, I'll be watching, so you better give me some fine entertainment to munch popcorn to.\c-
TXT
-\cxFull Name:\c-
-\cf John Gunns\c-
-\cxAlias:\c-
-\cf Mr. BIG SHOT\c-
-\cxNationality:\c-
-\cf American\c-
-\cxDate of Birth:\c-
-\cf 2110-11-12\c-
+ \cxFull Name:\c-
+ \cf John Gunns\c-
+ \cxAlias:\c-
+ \cf Mr. BIG SHOT\c-
+ \cxNationality:\c-
+ \cf American\c-
+ \cxDate of Birth:\c-
+ \cf 2110-11-12\c-
+ \cxOccupation:\c-
+ \cf CEO (BIGSHOT Industries)\c-
+ \cf Advisor (Blackmann Arms)\c-
A man shrouded in mystery, having appeared out of nowhere, announcing himself to be the son of **Benellus, God of Shotguns**. The believability of this story is quite questionable, despite the insistence of his own mother, who claims that the god descended from the heavens, and giving her one "blessed shotgun shell", she was ordered to plant it on the ground, as from it, a man would be born, who would become the "mightiest wielder of the ultimate firearm". She said that John, already fully grown, sprung up from the ground only days after the shell was planted, and immediately proceeded to "make shotguns burst from the ground around himself", and he used the metals from them to build the very fortress the family has in the Nevada desert.
diff --git a/lore/default/blackfireigniter.txt b/lore/default/blackfireigniter.txt
deleted file mode 100644
index 060bf482f..000000000
--- a/lore/default/blackfireigniter.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-TAG
-Blackfire Igniter
-TAB
-Item
-REL
-Sankaideriha;Unissix;Gods;Saya
-TXT
-\cxDesignation:\c-
-\cf Blackfire Igniter\c-
-\cxManufacturer:\c-
-\cf Unissix Crafts\c-
-\cf Design by LS\c-
-\cxClassification:\c-
-\cf Flamethrower\c-
-
-Devised by the primordial god of magic themself, the **Blackfire Igniter** is rather surprisingly a very cold, dark weapon. Blackfire is a type of magical flame that absorbs heat and light, rather than emitting them.
-
-During the height of **Unissix Crafts**'s fame, the god personally approached **Misa Unissix** herself with a request for a weapon that would allow just about anyone to readily perform **Blackfire Manipulation Magic**.
-
-The Igniter is the perfect blend of magic and technology, weaponized. At your fingertips, you have the power to call forth freezing flames that will turn your enemies into pretty ice statues in mere seconds.
-
-\cfPrimary Fire:\c- Releases a continuous stream of Blackfire, with moderate range. The flames not only rapidly freeze whatever they touch, but also reduce the air temperature, leaving a lingering freeze effect.
-
-\cfSecondary Fire:\c- Concentrated bursts that form spears of supercooled air which can impale small targets, or tear right through them.
-
-\cfReloading:\c- Attach up to two canisters to replenish the weapon's internal dark mana reserves. Each canister will remain locked in until it's been emptied, otherwise residual energy could escape and bring harm to the user. If there is an empty canister attached, the reload action will detach it first. Fresh canisters can still be used even if the tank is full, and they will act as an extra "buffer" of mana until depleted.
-
-\cxSaya's Notes:\c-
-\cfSo yeah, Misa-Misa has other toys besides that one bigass gun. Pretty cool that she gets requests and whatnot, lil' cinnamon roll's quite popular there, heheheh...\c-
-
-\cfI heard very little of all this Blackfire stuff from LS-sama, but it sounds like fun. Wonder if it can be used in a spellcard...\c-
diff --git a/lore/default/cytho.txt b/lore/default/cytho.txt
index a40e5a40a..f91472ea7 100644
--- a/lore/default/cytho.txt
+++ b/lore/default/cytho.txt
@@ -5,14 +5,17 @@ People
REL
Hell;Ellen;Anarukon;DemonInvasion;UAC;Saya;AkariLabs;Demolitionist
TXT
-\cxFull Name:\c-
-\cf Archduke Cytho of House Valathor\c-
-\cxNationality:\c-
-\cf Kuriste\c-
-\cxDate of Birth:\c-
-\cf 2008-10-09\c-
-\cxTwitter:\c-
-\cf @incuvalathor\c-
+ \cxFull Name:\c-
+ \cf Archduke Cytho of House Valathor\c-
+ \cxNationality:\c-
+ \cf Kuriste\c-
+ \cxDate of Birth:\c-
+ \cf 2008-10-09\c-
+ \cxOccupation:\c-
+ \cf Independent News Reporter\c-
+ \cf Ambassador (Kuriste Kingdom)\c-
+ \cxTwitter:\c-
+ \cf @incuvalathor\c-
Born in the now fallen Iskar township in 2008 as one of the youngest men of the humble **House Valathor**, **Cytho** took to the family business upon reaching adulthood, quickly climbing the ranks of **Hell**'s sex work industry, partly due to his innate beauty, but also the rapidly accumulating "satisfied customers" he would regularly service, and the many pupils he'd take under his wing. By 2028, he had made of Earth his second home, where he would open up an account on social media for a more modern method of attracting new clientele.
diff --git a/lore/default/demolitionist.txt b/lore/default/demolitionist.txt
index a23a628b9..3ec2d0a2c 100644
--- a/lore/default/demolitionist.txt
+++ b/lore/default/demolitionist.txt
@@ -5,16 +5,18 @@ People
REL
AkariLabs;Ibuki;Saya;Zanaveth2;Hell;UAC;Nekuratek;Belt;Collar;Propulsor;Hammerspace;Display;Voicebox;Maidbot;EngineTech;Kirin;DemonInvasion;Cytho
TXT
-\cxFull Name:\c-
-\cf Akari Labs First Generation Autonomous Combat Unit\c-
-\cf Demolitionist (codename)\c-
-\cf Demo Miyamoto (first unit)\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 2148-01-20\c-
-\cxTwitter:\c-
-\cf @demolitionist_bot\c-
+ \cxFull Name:\c-
+ \cf Akari Labs First Generation Autonomous Combat Unit\c-
+ \cf Demolitionist (codename)\c-
+ \cf Demo Miyamoto (first unit)\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 2148-01-20\c-
+ \cxOccupation:\c-
+ \cf Pro Hero\c-
+ \cxTwitter:\c-
+ \cf @demolitionist_bot\c-
The **Demolitionist** is one of the crowning achievements of **Akari Labs** on the field of robotics. An AI-driven combat unit capable of efficiently utilizing any weaponry at its disposition, highly resilient to damage and capable of operating in any environment, including the void of space. It can be seen as the spiritual successor of the **Red Oni** supersoldier program, in a way, as it also serves the same purpose of defending Earth from an overwhelming invading force. The project has been funded and sponsored by many partners of Akari Labs, and is the brainchild of both **Saya Miyamoto** and **Archduke Cytho Valathor**, representative of **Hell**'s civilian population.
@@ -35,16 +37,18 @@ Of this previously mentioned first unit, there are many details known thanks to
\cfGet back to work, you silly robutt.\c-
TXT
-\cxFull Name:\c-
-\cf Akari Labs First Generation Autonomous Combat Unit\c-
-\cf Demolitionist (codename)\c-
-\cf Demo Miyamoto (first unit)\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 2148-01-20\c-
-\cxTwitter:\c-
-\cf @demolitionist_bot\c-
+ \cxFull Name:\c-
+ \cf Akari Labs First Generation Autonomous Combat Unit\c-
+ \cf Demolitionist (codename)\c-
+ \cf Demo Miyamoto (first unit)\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 2148-01-20\c-
+ \cxOccupation:\c-
+ \cf Pro Hero\c-
+ \cxTwitter:\c-
+ \cf @demolitionist_bot\c-
The **Demolitionist** is one of the crowning achievements of **Akari Labs** on the field of robotics. An AI-driven combat unit capable of efficiently utilizing any weaponry at its disposition, highly resilient to damage and capable of operating in any environment, including the void of space. It can be seen as the spiritual successor of the **Red Oni** supersoldier program, in a way, as it also serves the same purpose of defending Earth from an overwhelming invading force. The project has been funded and sponsored by many partners of Akari Labs, and is the brainchild of both **Saya Miyamoto** and **Archduke Cytho Valathor**, representative of **Hell**'s civilian population.
@@ -56,7 +60,7 @@ The first unit, affectionately known as **Demo-chan** by Saya, was deployed in J
Of this previously mentioned first unit, there are many details known thanks to a Q&A session that Saya had livestreamed months prior to the deployment. The unit has been acknowledged as being part of the Miyamoto household, having the full name of **Demo Miyamoto**, and being referred to by Saya as her "child". Demo can be described as "quite chatty" and fond of joking around to try and put a smile on people's faces, but also very serious and determined in their desire to protect those in need. They are also quite popular within the LGBTQIA+ community due to their fierce support of also protecting the rights of those who face discrimination for their identities, and has even publicly come out themself as non-binary. This didn't really come as a surprise to most due to Saya's own involvements with the collective, however.
-Following their success in fighting off Hell's armies, Saya realized that no other units would ever need to be made, so Demo themself became the "ultimate weapon" of Akari Labs, all by their lonesome. Furthermore, they were additionally rewarded with a separate Maidbot frame, which Demo freely makes use of during their free time, and has allowed them to truly express their feelings for Saya, becoming her third partner, together with Maidbot and Ibuki.
+Following their success in fighting off Hell's armies, Saya realized that no other units would ever need to be made, so Demo themself became the "ultimate weapon" of Akari Labs, all by their lonesome. Furthermore, they were additionally rewarded with a separate maidbot frame, which Demo freely makes use of during their free time, and has allowed them to truly express their feelings for Saya, becoming her third partner, together with Meido and Ibuki.
\cxSaya's Notes:\c-
\cfYou're so cute, Demo-chan. I really outdid myself with that Maidbot body, for sure. It seriously caught me by surprise when, as soon as you swapped over to it, you just... jumped in my arms like that and started kissing me all over and... whew~\c-
@@ -65,16 +69,18 @@ Following their success in fighting off Hell's armies, Saya realized that no oth
\cfAnyway, no more reading about yourself while you're working. Go away, silly.\c-
TXT
-\cxFull Name:\c-
-\cf Akari Labs First Generation Autonomous Combat Unit\c-
-\cf Demolitionist (codename)\c-
-\cf Demo Miyamoto (first unit)\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 2148-01-20\c-
-\cxTwitter:\c-
-\cf @demolitionist_bot\c-
+ \cxFull Name:\c-
+ \cf Akari Labs First Generation Autonomous Combat Unit\c-
+ \cf Demolitionist (codename)\c-
+ \cf Demo Miyamoto (first unit)\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 2148-01-20\c-
+ \cxOccupation:\c-
+ \cf Pro Hero\c-
+ \cxTwitter:\c-
+ \cf @demolitionist_bot\c-
The **Demolitionist** is one of the crowning achievements of **Akari Labs** on the field of robotics. An AI-driven combat unit capable of efficiently utilizing any weaponry at its disposition, highly resilient to damage and capable of operating in any environment, including the void of space. It can be seen as the spiritual successor of the **Red Oni** supersoldier program, in a way, as it also serves the same purpose of defending Earth from an overwhelming invading force. The project has been funded and sponsored by many partners of Akari Labs, and is the brainchild of both **Saya Miyamoto** and **Archduke Cytho Valathor**, representative of **Hell**'s civilian population.
@@ -86,7 +92,7 @@ The first unit, affectionately known as **Demo-chan** by Saya, was deployed in J
Of this previously mentioned first unit, there are many details known thanks to a Q&A session that Saya had livestreamed months prior to the deployment. The unit has been acknowledged as being part of the Miyamoto household, having the full name of **Demo Miyamoto**, and being referred to by Saya as her "child". Demo can be described as "quite chatty" and fond of joking around to try and put a smile on people's faces, but also very serious and determined in their desire to protect those in need. They are also quite popular within the LGBTQIA+ community due to their fierce support of also protecting the rights of those who face discrimination for their identities, and has even publicly come out themself as non-binary. This didn't really come as a surprise to most due to Saya's own involvements with the collective, however.
-Following their success in fighting off Hell's armies, Saya realized that no other units would ever need to be made, so Demo themself became the "ultimate weapon" of Akari Labs, all by their lonesome. Furthermore, they were additionally rewarded with a separate Maidbot frame, which Demo freely makes use of during their free time, and has allowed them to truly express their feelings for Saya, becoming her third partner, together with Maidbot and Ibuki. Since May of 2171, they are also additionally engaged to **Kirin Xanai**, leader of the **Sykhai Empire of Akkou**.
+Following their success in fighting off Hell's armies, Saya realized that no other units would ever need to be made, so Demo themself became the "ultimate weapon" of Akari Labs, all by their lonesome. Furthermore, they were additionally rewarded with a separate maidbot frame, which Demo freely makes use of during their free time, and has allowed them to truly express their feelings for Saya, becoming her third partner, together with Meido and Ibuki. Since May of 2171, they are also additionally engaged to **Kirin Xanai**, leader of the **Sykhai Empire of Akkou**.
\cxSaya's Notes:\c-
\cfYou're so cute, Demo-chan. I really outdid myself with that Maidbot body, for sure. It seriously caught me by surprise when, as soon as you swapped over to it, you just... jumped in my arms like that and started kissing me all over and... whew~\c-
diff --git a/lore/default/doomguy.txt b/lore/default/doomguy.txt
index 281da3d7f..9d4203866 100644
--- a/lore/default/doomguy.txt
+++ b/lore/default/doomguy.txt
@@ -15,6 +15,8 @@ TXT
\cf American\c-
\cxDate of Birth:\c-
\cf CLASSIFIED\c-
+\cxOccupation:\c-
+\cf Marine (UAC)\c-
The **Doom Marine** is the lone survivor of the demonic invasions on the **UAC** bases of Phobos and Deimos. Having been transferred to **Mars City** not long before the initial incidents, he was part of the detachment sent to defend the Phobos bases from the invading demons who had somehow hijacked the teleportation systems the UAC was experimenting with. Following this impressive feat of, as a one man army, fighting off the invaders on both Phobos and Deimos, along with taking the fight to **Hell** itself and coming back, he was appointed as the organization's "problem solver".
@@ -37,6 +39,8 @@ TXT
\cf American\c-
\cxDate of Birth:\c-
\cf CLASSIFIED\c-
+\cxOccupation:\c-
+\cf N/A\c-
The **Doom Marine** is the lone survivor of the demonic invasions on the **UAC** bases of Phobos and Deimos. Having been transferred to **Mars City** not long before the initial incidents, he was part of the detachment sent to defend the Phobos bases from the invading demons who had somehow hijacked the teleportation systems the UAC was experimenting with. Following this impressive feat of, as a one man army, fighting off the invaders on both Phobos and Deimos, along with taking the fight to **Hell** itself and coming back, he was appointed as the organization's "problem solver".
@@ -59,6 +63,8 @@ TXT
\cf American\c-
\cxDate of Birth:\c-
\cf CLASSIFIED\c-
+\cxOccupation:\c-
+\cf N/A\c-
The **Doom Marine** is the lone survivor of the demonic invasions on the **UAC** bases of Phobos and Deimos. Having been transferred to **Mars City** not long before the initial incidents, he was part of the detachment sent to defend the Phobos bases from the invading demons who had somehow hijacked the teleportation systems the UAC was experimenting with. Following this impressive feat of, as a one man army, fighting off the invaders on both Phobos and Deimos, along with taking the fight to **Hell** itself and coming back, he was appointed as the organization's "problem solver".
diff --git a/lore/default/ellen.txt b/lore/default/ellen.txt
index 24b8b8067..438bab41a 100644
--- a/lore/default/ellen.txt
+++ b/lore/default/ellen.txt
@@ -5,14 +5,17 @@ People
REL
Ibuki;Taro;Ashley;Saya;Anarukon;WhiteScar;Hell;Yui;Cytho
TXT
-\cxFull Name:\c-
-\cf Elena "Ellen" Yanikov XXI\c-
-\cxNationality:\c-
-\cf American\c-
-\cxDate of Birth:\c-
-\cf 2066-06-06\c-
-\cxTwitter:\c-
-\cf @Mischief_XXI\c-
+ \cxFull Name:\c-
+ \cf Elena "Ellen" Yanikov XXI\c-
+ \cxNationality:\c-
+ \cf American\c-
+ \cxDate of Birth:\c-
+ \cf 2066-06-06\c-
+ \cxOccupation:\c-
+ \cf Mercenary\c-
+ \cxTwitter:\c-
+ \cf @Mischief_XXI\c-
+
Born in Boston in 2066, to **Elena Yanikov XIX** and **Gottfried Steiner**, **Ellen** is the younger of two sisters (both of them are named Elena). This oddity of all women in her family sharing the same name can be traced back to **Elena Yanikov I**, born in 1703, who made this decision, out of some superstitious belief that it would "preserve their immortality forever". This was not far off from the truth, however, but it had nothing to do with inheritance of names. It has been verified that **Anarukon** genes are fully preserved across all female descendants, no matter how many generations, especially so for those from the Yanikov lineage.
diff --git a/lore/default/empcarbine.txt b/lore/default/empcarbine.txt
deleted file mode 100644
index 94ce03ad3..000000000
--- a/lore/default/empcarbine.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-TAG
-Rail Carbine
-TAB
-Item
-REL
-EngineTech;DecadeMech;UAC;Saya
-TXT
-\cxDesignation:\c-
-\cf EMP Rail Carbine\c-
-\cxManufacturer:\c-
-\cf Tach-Engine Technology Institute\c-
-\cxClassification:\c-
-\cf Directed Energy Weapon\c-
-
-The **EMP Rail Carbine** is **Tach-Engine**'s very first attempt at combining existing human technology with the retrieved experiments from their expedition to the ruined headquarters of **Decade Mechanics**. Akin to typical particle-beam weaponry, but with a boost of thundering, highly destructive exotic matter, it has been deemed far superior even to the mighty **Thunder Buster** so well-prized by UAC troops.
-
-Unexpectedly, the Rail Carbine is a tube fed bolt-action rifle, which employs shielded rods of pure **Dysedum**. Each of these allowing the weapon to discharge guided 20kA pulses towards an ionized target, frying it in an instant, and potentially spreading its deadly effects to others nearby.
-
-It should be noted that this weapon is unsafe to use in water, as the discharge will spread violently throughout the entire medium.
-
-\cfPrimary Fire:\c- Hold to emit a faint ionizing charge towards the aimed spot. The longer this is held, the more accurate the shot will be. Release to discharge the beam. If the rod has been depleted, cycle the bolt to load a new one.
-
-\cfSecondary Fire:\c- Also emits an ionizing charge, but does not discharge on release. Useful if you can't guarantee your target will always be in sight, or if you want to quickly mark several targets.
-
-\cfZoom:\c- Adjustable sight up to 8x.
-
-\cfReloading:\c- More rods can be fed into the weapon as needed, up to a maximum of three.
-
-\cfTechniques:\c- By ionizing several targets you can guarantee that the beam will branch out into lesser arcs and strike them all, though the damage potential will be divided among them.
-
-\cxSaya's Notes:\c-
-\cfYou know, anything that dabs on the UAC with its mere existence is good in my book.\c-
-
-\cfThis thing, though, also gets bonus points for its sheer pants-shittingly intense potential to deep fry sons of bitches. Seriously, it's like actual fucking lightning shooting out of this.\c-
diff --git a/lore/default/fistgun.txt b/lore/default/fistgun.txt
deleted file mode 100644
index 7ef5e5be8..000000000
--- a/lore/default/fistgun.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-TAG
-Hand of Divine
-TAB
-Item
-REL
-Unissix;Gods;Zanaveth3;Saya
-TXT
-\cxDesignation:\c-
-\cf Hand of Divine\c-
-\cxManufacturer:\c-
-\cf Korovithuhcp (original)\c-
-\cf Unissix Crafts (replica)\c-
-\cxDesignation:\c-
-\cf Magic Gauntlet\c-
-
-The **Hand of Divine** was a weapon that the god **Korovithuhcp** constructed countless millenia ago, and had been passed down among many heroes of legend. Eventually it was lost, and the god had no interest in building a new one. This, obviously, did not stop **Misa Unissix** from attempting to do exactly just that. Following historical records of its use, she built her own version through a blend of arcane magic and modern technology. She gifted one to her daughter, **Zanaveth Nekuraku III**, and another to the **Demolitionist**.
-
-\cfPrimary Fire:\c- Charges up a punch, and then releases it. The gauntlet will fling itself forward and then return to you.
-
-\cfSecondary Fire:\c- Charges up a wide arc slap. On release this will very loudly and violently whack all targets in front of you.
-
-\cfTechniques:\c- Due to its nature, the Hand of Divine is susceptible to the effects of a **Ragekit**, increasing its strength and range.
-
-\cxSaya's Notes:\c-
-\cfMan that sure was a special delivery from Zana-chan. And when we showed that it was good, and fun, Misa-Misa got all excited and started mass-producing them. She's just too adorable, I swear.\c-
-
-\cfAnyway, those fiends are gonna get knocked the fuck out with this thing. Can't wait to see it in action on real targets. Especially after... that incident with the punching bag.\c-
diff --git a/lore/default/grandlance.txt b/lore/default/grandlance.txt
deleted file mode 100644
index e440eb6eb..000000000
--- a/lore/default/grandlance.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-TAG
-Grand Lance
-TAB
-Item
-REL
-Kmonn;Xekke;Saya;Unissix
-TXT
-\cxDesignation:\c-
-\cf Suvan-Kin ("Grand Lance")\c-
-\cxManufacturer:\c-
-\cf Eushura Kmonn Jr.\c-
-\cxClassification:\c-
-\cf Portable Rail Gun\c-
-
-Devised as the "last word" in weaponry, the **Suvan-Kin** ("Grand Lance" in the **Xekkas** language) is the world's first truly portable rail gun, capable of launching projectiles at speeds of up to 7500km/h (or 14000km/h at full charge). The weapon is powered entirely by a compact quad-cell Korberon-Eneiebium battery pack, easy to replace when needed. The ammunition employed are high-resonant Almasteel spears, capable of piercing cleanly through anything, without even as much as a single dent.
-
-If the piercing potential of these spears isn't destructive enough, a miniature pure-fusion bomb embedded at the head will surely add up even more to that. In the words of the **Xekkian** people: **"The blinding flames of a sacrificed newborn star shall tear asunder all life, rend the soul from its body, and leave no trace whatsoever of those unfortunate to have wronged the wielder of the Grand Lance."**
-
-\cfPrimary Fire:\c- Single-target firing. The spear will automatically detonate on contact with anything. The area of effect is rather massive, so keep your distance. Due to the resilience of the material used, the spear will not be destroyed, and may potentially ricochet and hit something else.
-
-\cfSecondary Fire:\c- Multi-target firing. The spear is shot at a much higher velocity, and will penetrate multiple targets until finally stopping at something sufficiently solid.
-
-\cfPrimary Reload:\c- Reload the weapon.
-
-\cfSecondary Reload:\c- Swaps the battery. This action can only be performed once the charge is low enough, as it would be wasteful otherwise.
-
-\cfTechniques:\c- The longer you hold secondary fire, the stronger and faster the shot will be. At full charge it may even breach walls.
-
-\cfWarning:\c- Before firing, the rails must extend to their full length. If there are any obstacles in the way that can't be cleared, operation of the weapon is cancelled.
-
-\cxSaya's Notes:\c-
-\cfExcuse me, WHAT THE FUCK IS THIS???\c-
-
-\cfIs this a motherfucking rail gun? Like, the real deal? And it's actually portable?? AND IT SHOOTS MOTHERFUCKING SPEARS WITH MOTHERFUCKING FUSION BOMBS IN THEM??? OK, forget what I said about that other bigass gun from Kmonn, THIS SHIT is actually even more fucking ridiculous, like, what in the actual name of fuck???\c-
-
-\cfYeah, so that's why it's placed on the same slot as the Ynykron. Think of it as a "safer" alternative, basically. It's not world-ending, but it's still way too fucking strong.\c-
diff --git a/lore/default/ibuki.txt b/lore/default/ibuki.txt
index ea529c183..993048604 100644
--- a/lore/default/ibuki.txt
+++ b/lore/default/ibuki.txt
@@ -5,16 +5,18 @@ People
REL
AkariLabs;WhiteScar;Taro;Saya
TXT
-\cxFull Name:\c-
-\cf Ibuki Miyamoto\c-
-\cf Red Oni (codename)\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 2074-09-09\c-
-\cxTwitter\c-
-\cf @lewd_ibuki (main)\c-
-\cf @ibuki_tiddy (photosets)\c-
+ \cxFull Name:\c-
+ \cf Ibuki Miyamoto\c-
+ \cf Red Oni (codename)\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 2074-09-09\c-
+ \cxOccupation:\c-
+ \cf Mercenary, Nude Model, Vlogger\c-
+ \cxTwitter\c-
+ \cf @lewd_ibuki (main)\c-
+ \cf @ibuki_tiddy (photosets)\c-
**Ibuki** is the result of the **Red Oni** supersoldier program, devised by **Saya Miyamoto** of **Akari Labs**. The existence of this project was kept completely secret until her public reveal in June of 2077. There was much controversy surrounding the Red Oni program, including Saya's personal involvement in it, having accepted a 40 billion USD payment in exchange for it (which was found to be related to Texas having been sold back to Mexico many weeks before). Despite her clear potential and outstanding combat abilities, she was deployed too late, as only moments later, the **White Scar** happened, and with it, the complete devastation of the **United States**.
diff --git a/lore/default/imanakit.txt b/lore/default/imanakit.txt
index d70393fcf..0988e9f88 100644
--- a/lore/default/imanakit.txt
+++ b/lore/default/imanakit.txt
@@ -11,6 +11,8 @@ TXT
\cf Undetermined\c-
\cxDate of Birth:\c-
\cf Undetermined\c-
+\cxOccupation:\c-
+\cf CEO (Imanaki Corp)\c-
The founder and CEO of **Imanaki Corp**, and also last surviving member of the Imanaki family following the **Onoke Mansion Murders** of 2003. **Tetsuya** had always been a very secretive individual, so nothing is really known of his personal life or history, nor even his appearance.
diff --git a/lore/default/kirin.txt b/lore/default/kirin.txt
index daa958243..2e43086ad 100644
--- a/lore/default/kirin.txt
+++ b/lore/default/kirin.txt
@@ -5,16 +5,18 @@ People
REL
Anarukon;Novoskhana;Saya;GhoulHunt
TXT
-\cxFull Name:\c-
-\cf Kirin Xanai\c-
-\cxTitle:\c-
-\cf Child Emperor of the Sykhai Empire of Akkou\c-
-\cxNationality:\c-
-\cf Akkouxhei\c-
-\cxDate of Birth:\c-
-\cf 2080-04-13\c-
-\cxTwitter:\c-
-\cf @kiririn_xanai\c-
+ \cxFull Name:\c-
+ \cf Kirin Xanai\c-
+ \cxTitle:\c-
+ \cf Child Emperor of the Sykhai Empire of Akkou\c-
+ \cxNationality:\c-
+ \cf Akkouxhei\c-
+ \cxDate of Birth:\c-
+ \cf 2080-04-13\c-
+ \cxOccupation:\c-
+ \cf Communal Advisor (Sykhai Empire)\c-
+ \cxTwitter:\c-
+ \cf @kiririn_xanai\c-
Born in 2080 to **Syrakha Yanikov** and **Azya Xanai**, **Kirin** became the emperor of **Akkou** at the young age of 12, having shown great interest in following the steps of his mother.
diff --git a/lore/default/kmonn.txt b/lore/default/kmonn.txt
index 7cd9bd338..db7e188d3 100644
--- a/lore/default/kmonn.txt
+++ b/lore/default/kmonn.txt
@@ -5,12 +5,17 @@ People
REL
XAnimen;EngineTech;Gods;Xekke
TXT
-\cxFull Name:\c-
-\cf Eushura Kmonn Jr.\c-
-\cxNationality:\c-
-\cf Xekkian\c-
-\cxDate of Birth:\c-
-\cf 8731 BC\c-
+ \cxFull Name:\c-
+ \cf Eushura Kmonn Jr.\c-
+ \cxNationality:\c-
+ \cf Xekkian\c-
+ \cxDate of Birth:\c-
+ \cf 8731 BC\c-
+ \cxOccupation:\c-
+ \cf CTO (Kmonn Shuna)\c-
+ \cf Advisor (Tach-Engine Technology Institute)\c-
+
+
**Eushura Kmonn Jr.**, son of **Eushura Kmonn Sr.**, is a skilled inventor from the **Kingdom of Xekke**, in the planet of **Ixxeney**. From a young age he was raised to achieve the same grand goals as his father, and it wasn't long until he managed to earn his own fame after years of working under him as an assistant. His creativity and imagination knew no bounds, and he's been credited with a grand total of 279 major achievements in the fields of both offensive and defensive military technology, which has helped strengthen the kingdom's forces, making them one of the most trusted and requested across the **X'Animen Coalition** for allied defense tasks.
diff --git a/lore/default/locke.txt b/lore/default/locke.txt
index 47b025c3b..e641a630c 100644
--- a/lore/default/locke.txt
+++ b/lore/default/locke.txt
@@ -5,12 +5,17 @@ People
REL
Kereshnovka;Saya
TXT
-\cxFull Name:\c-
-\cf Janus Locke Hoodth\c-
-\cxNationality:\c-
-\cf Qurensniv\c-
-\cxDate of Birth:\c-
-\cf 1980-07-30\c-
+ \cxFull Name:\c-
+ \cf Janus Locke Hoodth\c-
+ \cxNationality:\c-
+ \cf Qurensniv\c-
+ \cxDate of Birth:\c-
+ \cf 1980-07-30\c-
+ \cxOccupation:\c-
+ \cf Inventor\c-
+
+
+
**Janus Locke** is the younger brother of the late **Dr. Häzel Hoodth** known by many as the **Mad Doctor of Kereshnovka**. After hearing the news of Häzel's death in 1987 (specifically, receiving them 10 years after the fact, while he was studying abroad), in an oil rig explosion near the town while he was performing an experiment to "obtain the essence of immortality", Locke changed entirely. He decided to continue his brother's work, while at the same time still maintaining his current job as a toy maker. However, the madness into which he fell would extend even to that, with the various products that would come out under his brand of **Dr. Locke's Wonderful Toys** becoming increasingly dangerous, or even outright lethal.
diff --git a/lore/default/maidbot.txt b/lore/default/maidbot.txt
index acb03da1c..0fb6a5b10 100644
--- a/lore/default/maidbot.txt
+++ b/lore/default/maidbot.txt
@@ -1,31 +1,33 @@
TAG
-Miyamoto, Maidbot
+Miyamoto, Meido
TAB
People
REL
Saya;Ibuki;Luna;Nukuri;Zanaveth2;Nekuratek;AkariLabs;Kirin
TXT
-\cxFull Name:\c-
-\cf Maidbot "Meido" Miyamoto\c-
-\cf Meidobot (artistic name)\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 2017-07-07\c-
-\cxTwitter:\c-
-\cf @meidobot\c-
+ \cxFull Name:\c-
+ \cf Meido Miyamoto\c-
+ \cf Meidobot (artistic name)\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 2017-07-07\c-
+ \cxOccupation:\c-
+ \cf Idol\c-
+ \cxTwitter:\c-
+ \cf @meidobot\c-
-As **Saya Miyamoto**'s very first AI project, **Maidbot** was initially rather rough around the edges, mainly serving as a cleaner robot with rather limited intelligence, mostly capable of taking simple orders. Over time, Saya would expand on her abilities, allowing for more complex interactivity, but still too limited. Saya had always felt that despite all her efforts, despite how close Maidbot gradually got to be more "life-like", it was never enough. In the end, she was "still a machine".
+As **Saya Miyamoto**'s very first AI project, **Meido** was initially rather rough around the edges, mainly serving as a cleaner robot with rather limited intelligence, mostly capable of taking simple orders. Over time, Saya would expand on her abilities, allowing for more complex interactivity, but still too limited. Saya had always felt that despite all her efforts, despite how close Meido gradually got to be more "life-like", it was never enough. In the end, she was "still a machine".
-Of note was Saya's attempt to get her into singing, something which was an unexpected success, actually. After her initial debut, more and more artists would compose songs for Maidbot to perform. By 2020, Maidbot had become a full-fledged "Artificial Idol", famous enough to take part in the Tokyo Olympics, singing the national anthem.
+Of note was Saya's attempt to get her into singing, something which was an unexpected success, actually. After her initial debut, more and more artists would compose songs for Meido to perform. By 2020, Meido had become a full-fledged "Artificial Idol", famous enough to take part in the Tokyo Olympics, singing the national anthem.
-Following the **Luna Event** of 2021, Saya received the visit of **Zanaveth Nekuraku II**, head of AI research at **Nekuratek**, the largest **Nukuri** tech conglomerate. Curious about human culture, she decided to meet her, as they had quite similar interests. Zanaveth was quite impressed by all **Akari Labs** had achieved, and showed special interest in Maidbot, too.
+Following the **Luna Event** of 2021, Saya received the visit of **Zanaveth Nekuraku II**, head of AI research at **Nekuratek**, the largest **Nukuri** tech conglomerate. Curious about human culture, she decided to meet her, as they had quite similar interests. Zanaveth was quite impressed by all **Akari Labs** had achieved, and showed special interest in Meido, too.
-Having quickly befriended Saya at this point, she offered to enhance Maidbot's AI with the more advanced technology her people had: The **Nekuronbot AI Framework**. Having accepted this offer, Maidbot was "reborn" from her previous, limited form. She was now fully capable of individual thought, free will, and most importantly, emotion.
+Having quickly befriended Saya at this point, she offered to enhance Meido's AI with the more advanced technology her people had: The **Nekuronbot AI Framework**. Having accepted this offer, Meido was "reborn" from her previous, limited form. She was now fully capable of individual thought, free will, and most importantly, emotion.
-It was not surprising that Saya had always felt something towards her, while still being fully aware of the impossibility of her being able to love her back, but now, everything had changed. Maidbot knew, and confessed that in her new form, she could "feel something" too. Over time, she came to better understand these feelings, and would become Saya's first girlfriend.
+It was not surprising that Saya had always felt something towards her, while still being fully aware of the impossibility of her being able to love her back, but now, everything had changed. Meido knew, and confessed that in her new form, she could "feel something" too. Over time, she came to better understand these feelings, and would become Saya's first girlfriend.
-After these events, Maidbot became a full member of the family, adopting the Miyamoto name. Much later, and with Zanaveth's assistance, Saya would begin the creation of more maidbots, wishing for the whole world to be able to have a Maidbot of their own. An adoption service was set up in 2023, where maidbots, who'd be raised and prepared at Akari Labs, would hold interviews with potential adopters, allowing them to have the final choice on who to live with. This service was entirely free, as the company already had more than enough funds coming from their other services, which increased their popularity even more. Everyone wished to have their own Maidbot, and the Maidbots themselves were more than happy to live with their new families.
+After these events, Meido became a full member of the family, adopting the Miyamoto name. Much later, and with Zanaveth's assistance, Saya would begin the creation of more Maidbots, wishing for the whole world to be able to "have a Meido of their own". An adoption service was set up in 2023, where Maidbots, who'd be raised and prepared at Akari Labs, would hold interviews with potential adopters, allowing them to have the final choice on who to live with. This service was entirely free, as the company already had more than enough funds coming from their other services, which increased their popularity even more. Everyone wished to have their own Maidbot, and the Maidbots themselves were more than happy to live with their new families.
\cxSaya's Notes:\c-
\cfMeido-chan is so sweet~ And her voice is so nice~\c-
@@ -36,27 +38,29 @@ After these events, Maidbot became a full member of the family, adopting the Miy
\cfHehe... I'm really quite proud of making her "fully featured", by the way... Best decision of my life. Let me tell you, when we do "things" together... it feels like heaven~\c- \cg♥\c-
TXT
-\cxFull Name:\c-
-\cf Maidbot "Meido" Miyamoto\c-
-\cf Meidobot (artistic name)\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 2017-07-07\c-
-\cxTwitter:\c-
-\cf @meidobot\c-
+ \cxFull Name:\c-
+ \cf Meido Miyamoto\c-
+ \cf Meidobot (artistic name)\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 2017-07-07\c-
+ \cxOccupation:\c-
+ \cf Idol\c-
+ \cxTwitter:\c-
+ \cf @meidobot\c-
-As **Saya Miyamoto**'s very first AI project, **Maidbot** was initially rather rough around the edges, mainly serving as a cleaner robot with rather limited intelligence, mostly capable of taking simple orders. Over time, Saya would expand on her abilities, allowing for more complex interactivity, but still too limited. Saya had always felt that despite all her efforts, despite how close Maidbot gradually got to be more "life-like", it was never enough. In the end, she was "still a machine".
+As **Saya Miyamoto**'s very first AI project, **Meido** was initially rather rough around the edges, mainly serving as a cleaner robot with rather limited intelligence, mostly capable of taking simple orders. Over time, Saya would expand on her abilities, allowing for more complex interactivity, but still too limited. Saya had always felt that despite all her efforts, despite how close Meido gradually got to be more "life-like", it was never enough. In the end, she was "still a machine".
-Of note was Saya's attempt to get her into singing, something which was an unexpected success, actually. After her initial debut, more and more artists would compose songs for Maidbot to perform. By 2020, Maidbot had become a full-fledged "Artificial Idol", famous enough to take part in the Tokyo Olympics, singing the national anthem.
+Of note was Saya's attempt to get her into singing, something which was an unexpected success, actually. After her initial debut, more and more artists would compose songs for Meido to perform. By 2020, Meido had become a full-fledged "Artificial Idol", famous enough to take part in the Tokyo Olympics, singing the national anthem.
-Following the **Luna Event** of 2021, Saya received the visit of **Zanaveth Nekuraku II**, head of AI research at **Nekuratek**, the largest **Nukuri** tech conglomerate. Curious about human culture, she decided to meet her, as they had quite similar interests. Zanaveth was quite impressed by all **Akari Labs** had achieved, and showed special interest in Maidbot, too.
+Following the **Luna Event** of 2021, Saya received the visit of **Zanaveth Nekuraku II**, head of AI research at **Nekuratek**, the largest **Nukuri** tech conglomerate. Curious about human culture, she decided to meet her, as they had quite similar interests. Zanaveth was quite impressed by all **Akari Labs** had achieved, and showed special interest in Meido, too.
-Having quickly befriended Saya at this point, she offered to enhance Maidbot's AI with the more advanced technology her people had: The **Nekuronbot AI Framework**. Having accepted this offer, Maidbot was "reborn" from her previous, limited form. She was now fully capable of individual thought, free will, and most importantly, emotion.
+Having quickly befriended Saya at this point, she offered to enhance Meido's AI with the more advanced technology her people had: The **Nekuronbot AI Framework**. Having accepted this offer, Meido was "reborn" from her previous, limited form. She was now fully capable of individual thought, free will, and most importantly, emotion.
-It was not surprising that Saya had always felt something towards her, while still being fully aware of the impossibility of her being able to love her back, but now, everything had changed. Maidbot knew, and confessed that in her new form, she could "feel something" too. Over time, she came to better understand these feelings, and would become Saya's first girlfriend.
+It was not surprising that Saya had always felt something towards her, while still being fully aware of the impossibility of her being able to love her back, but now, everything had changed. Meido knew, and confessed that in her new form, she could "feel something" too. Over time, she came to better understand these feelings, and would become Saya's first girlfriend.
-After these events, Maidbot became a full member of the family, adopting the Miyamoto name. Much later, and with Zanaveth's assistance, Saya would begin the creation of more maidbots, wishing for the whole world to be able to have a Maidbot of their own. An adoption service was set up in 2023, where maidbots, who'd be raised and prepared at Akari Labs, would hold interviews with potential adopters, allowing them to have the final choice on who to live with. This service was entirely free, as the company already had more than enough funds coming from their other services, which increased their popularity even more. Everyone wished to have their own Maidbot, and the Maidbots themselves were more than happy to live with their new families.
+After these events, Meido became a full member of the family, adopting the Miyamoto name. Much later, and with Zanaveth's assistance, Saya would begin the creation of more Maidbots, wishing for the whole world to be able to "have a Meido of their own". An adoption service was set up in 2023, where Maidbots, who'd be raised and prepared at Akari Labs, would hold interviews with potential adopters, allowing them to have the final choice on who to live with. This service was entirely free, as the company already had more than enough funds coming from their other services, which increased their popularity even more. Everyone wished to have their own Maidbot, and the Maidbots themselves were more than happy to live with their new families.
In May of 2171, together with Saya and her other partners, she married **Emperor Kirin Xanai**, of the **Sykhai Empire**, and thanks to him, her passion for singing returned once again.
diff --git a/lore/default/mixom.txt b/lore/default/mixom.txt
index 508fba6cb..9d71e57be 100644
--- a/lore/default/mixom.txt
+++ b/lore/default/mixom.txt
@@ -23,4 +23,6 @@ Mixom is, in addition, one of the last bastions of capitalism remaining in the c
\cxSaya's Notes:\c-
\cfMoney and power, absolute dominance, bullshit capitalism. Disgusting... I hope they all explode.\c-
-\cfYou can't take two steps without coming across something made by them, they are FUCKING EVERYWHERE. Like, for example, all the screws in your body? Mixom branded. The liquid cooling? Also Mixom... I could keep going, but it makes me feel gross saying their name so often.\c-
+\cfExcept the CEO, she's the only sane person in there but they throw her under the bus whenever she tries to change things. I do commend her for the effort, but this is clearly a losing battle. She should quit already and come here.\c-
+
+\cfBy the way, you can't take two steps without coming across something made by them, they are FUCKING EVERYWHERE. Like, for example, all the screws in your body? Mixom branded. The liquid cooling? Also Mixom... I could keep going, but it makes me feel gross saying their name so often.\c-
diff --git a/lore/default/nana.txt b/lore/default/nana.txt
index 967a67f2d..587e217b2 100644
--- a/lore/default/nana.txt
+++ b/lore/default/nana.txt
@@ -5,12 +5,17 @@ People
REL
Ryuji;Saya;Gensokyo;Yui;Taro;Kirin
TXT
-\cxFull Name:\c-
-\cf Nana Miyamoto\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 1907-07-07\c-
+ \cxFull Name:\c-
+ \cf Nana Miyamoto\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 1907-07-07\c-
+ \cxOccupation:\c-
+ \cf Housemaker\c-
+
+
+
**Nana** is the sole daughter of **Kaguya Houraisan**, the exiled **Lunarian** princess who made **Gensokyo** her home. Having been raised and homeschooled entirely within **Eientei** she did not know much of the outside world, and would have spent the rest of her immortal life there, had it not been for a chance encounter with **Ryuji Miyamoto** in the 60's. Having fled the **Human Village**, he came across Nana. The two became close friends, and the young boy made a promise to marry her when he grew up, and take her outside, so she could "see the world". This would happen in 1973, with the two leaving Gensokyo to form a family of their own.
@@ -21,12 +26,17 @@ Nana has three children, who, like her, have also inherited the immortal blood o
\cxSaya's Notes:\c-
\cfThe bestest mom in the world, not gonna lie. She may be strict at times, or get mad at me for staying up late (if she actually finds out, heh), but she really is the best. You haven't actually met her yet, Demo-chan, but I bet she'd really like you. I assure you she's real nice despite how scary she may look sometimes. She totally is not like Kaguya obaa-san, who I swear always has that aura about her that's like... no wonder guys are scared of her, always in constant fear of being CBT'd at any moment.\c-
TXT
-\cxFull Name:\c-
-\cf Nana Miyamoto\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 1907-07-07\c-
+ \cxFull Name:\c-
+ \cf Nana Miyamoto\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 1907-07-07\c-
+ \cxOccupation:\c-
+ \cf Housemaker\c-
+
+
+
**Nana** is the sole daughter of **Kaguya Houraisan**, the exiled **Lunarian** princess who made **Gensokyo** her home. Having been raised and homeschooled entirely within **Eientei** she did not know much of the outside world, and would have spent the rest of her immortal life there, had it not been for a chance encounter with **Ryuji Miyamoto** in the 60's. Having fled the **Human Village**, he came across Nana. The two became close friends, and the young boy made a promise to marry her when he grew up, and take her outside, so she could "see the world". This would happen in 1973, with the two leaving Gensokyo to form a family of their own.
@@ -39,12 +49,17 @@ Nana has three children, who, like her, have also inherited the immortal blood o
\cfBy the way I did notice it, you know, when she hugged you, yes. She hasn't really tried to see other guys after dad was gone... But I think that maybe... she likes you kind of in a different way, y'know...\c-
TXT
-\cxFull Name:\c-
-\cf Nana Miyamoto\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 1907-07-07\c-
+ \cxFull Name:\c-
+ \cf Nana Miyamoto\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 1907-07-07\c-
+ \cxOccupation:\c-
+ \cf Housemaker\c-
+
+
+
**Nana** is the sole daughter of **Kaguya Houraisan**, the exiled **Lunarian** princess who made **Gensokyo** her home. Having been raised and homeschooled entirely within **Eientei** she did not know much of the outside world, and would have spent the rest of her immortal life there, had it not been for a chance encounter with **Ryuji Miyamoto** in the 60's. Having fled the **Human Village**, he came across Nana. The two became close friends, and the young boy made a promise to marry her when he grew up, and take her outside, so she could "see the world". This would happen in 1973, with the two leaving Gensokyo to form a family of their own.
diff --git a/lore/default/puntzergamma.txt b/lore/default/puntzergamma.txt
index 4ce637733..01ed47ce3 100644
--- a/lore/default/puntzergamma.txt
+++ b/lore/default/puntzergamma.txt
@@ -16,9 +16,9 @@ The **Puntzer** series of weapons from **Blackmann Arms** are prime examples of
The **Puntzer Gamma** is a mostly compact bullpup submachine gun featuring a horizontal mag loading system akin to 21st century classics like the **BreakerTek P90**. The weapon is additionally capable of delivering "Fuller Auto" ultra-rapid fire, as seen in many other automatic weapons of Blackmann Arms manufacture.
-\cfPrimary Fire:\c- Shoots the weapon.
+\cfPrimary Fire:\c- Full auto shooting.
-\cfSecondary Fire:\c- Cycles fire modes, between single shot, 3-round burst, full auto and fuller auto.
+\cfSecondary Fire:\c- "Fuller auto" unloading.
\cfReloading:\c- Reloads, as expected. Your **Hammerspace™ Container**'s autoloaders will provide you with a fresh mag every time.
diff --git a/lore/default/rafankos.txt b/lore/default/rafankos.txt
index 402ab066e..61f335d9c 100644
--- a/lore/default/rafankos.txt
+++ b/lore/default/rafankos.txt
@@ -27,4 +27,4 @@ The weapon employs **Kabbadon** as fuel, a common byproduct of **Nokorokinylum**
\cxSaya's Notes:\c-
\cf"Ultimate Weapon"? Talk about pretentious... But you know, something about this was making my brains itch, and then it clicked. This is basically like that one spellcard, the Master Spark. Hell, it almost even sounds and looks the same...\c-
-\cfThat's fucking cool, actually. I like it, so I put it in the same slot as the other two massive fuckoff guns.\c-
+\cfThat's fucking cool, actually. I like it, so I put it in the same slot as the other massive fuckoff gun. You know, as a safer alternative that you're less likely to kill yourself with. Gotta admit, Misa-Misa sure loaded us up with some powerful material bringing these two along.\c-
diff --git a/lore/default/raykhom.txt b/lore/default/raykhom.txt
index b559587ea..3a00416fa 100644
--- a/lore/default/raykhom.txt
+++ b/lore/default/raykhom.txt
@@ -31,6 +31,6 @@ The weapon is powered entirely by a compact quad-cell Korberon-Eneiebium battery
\cfSo by Xekkian standards this is a "light weapon", really now??? It's a good thing that your hands can somehow adapt to the grip of this thing, because holy fucking hell...\c-
-\cfThis shit is like, where do I start. It's some serious fucking ass destroyer, that's what. Out of all the stuff in your arsenal, I'd say this is the second strongest weapon we've got. Misa actually delivered it herself way back when, and then we had a talk with the old man from Tach-Engine to have it available for purchase, since he does have that deal going with Kmonn and all (I'm pretty sure what those two have is more than just a business partnership, if you know what I mean).\c-
+\cfThis shit is like, where do I start. It's some serious fucking ass destroyer, that's what. Out of all the stuff in your arsenal, I'd say this is the third largest weapon we've got. Misa actually delivered it herself way back when, and then we had a talk with the old man from Tach-Engine to have it available for purchase, since he does have that deal going with Kmonn and all (I'm pretty sure what those two have is more than just a business partnership, if you know what I mean).\c-
\cfWhen she came through the door lugging that thing around on her shoulders I knew it had to be ours.\c-
diff --git a/lore/default/ryuji.txt b/lore/default/ryuji.txt
index a5036deef..8722d5a7a 100644
--- a/lore/default/ryuji.txt
+++ b/lore/default/ryuji.txt
@@ -5,14 +5,17 @@ People
REL
Nana;Taro;Saya;Yui;AkariLabs;Gensokyo
TXT
-\cxFull Name:\c-
-\cf Ryuji Miyamoto\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 1956-03-12\c-
-\cxDate of Death:\c-
-\cf 2054-06-22\c-
+ \cxFull Name:\c-
+ \cf Ryuji Miyamoto\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 1956-03-12\c-
+ \cxDate of Death:\c-
+ \cf 2054-06-22\c-
+ \cxOccupation:\c-
+ \cf Inventor\c-
+
**Ryuji** was born in **Gensokyo** in 1956, spending most of his life within the **Human Village**, the only one settlement within the region inhabited entirely by humans, rather than Youkai. During his early teens, he became quite rebellious, desiring to leave the village and have "adventures". One day, he fled, and got himself lost in the bamboo forest surrounding **Eientei**. There, he came across **Nana**, the daughter of **Kaguya Houraisan**, and the two became friends. After guiding him back to the village, Ryuji promised her that he'd return one day, to marry her, and take her with him to see the outside world.
diff --git a/lore/default/saya.txt b/lore/default/saya.txt
index fe889727c..dfba3a6ea 100644
--- a/lore/default/saya.txt
+++ b/lore/default/saya.txt
@@ -5,14 +5,17 @@ People
REL
Nana;Ryuji;Taro;Yui;Maidbot;Demolitionist;Kirin;AkariLabs;Ashley;UAC
TXT
-\cxFull Name:\c-
-\cf Saya Miyamoto\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 1993-03-20\c-
-\cxTwitter:\c-
-\cf @AkariSaya\c-
+ \cxFull Name:\c-
+ \cf Saya Miyamoto\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 1993-03-20\c-
+ \cxOccupation:\c-
+ \cf CTO, Human Resources (Akari Labs)\c-
+ \cxTwitter:\c-
+ \cf @AkariSaya\c-
+
**Saya Miyamoto** was born in 1993 as the middle child of **Nana Miyamoto** and **Ryuji Miyamoto**, her older brother being **Taro Miyamoto**, born in 1985, and her younger sister being **Yui Miyamoto**, born in 2009. As a child, Saya already showed interest in science and technology, proudly looking up to her father and his inventions. She excelled greatly in school, having even been described as a "child prodigy". At the surprisingly early age of 13, having proven her outstanding abilities, she got herself into **MIT**, where she graduated in **Computer Science**.
@@ -24,9 +27,9 @@ Saya would frequently be nicknamed **"Not-Tomoko"** around the net, in reference
Saya is also known for being exaggeratedly flirty around attractive women, something which has resulted in many misunderstandings and awkward moments. She proudly states that she's "always horny on main", and never lets any chance to flirt with someone slip past her. She however remarks that this open flirting is "just a friendly thing, between friends".
-Saya has many hobbies, including programming (her language of choice being **Haskell**), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called **My Maid Is A Sex Robot**, partially based around her experiences with dating **Maidbot Miyamoto**. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, **The Akari Project**, a story about teleportation experiments and interdimensional travel "that doesn't go to shit like all the others". Following the disaster on the **UAC** bases in regards to teleportation, she announced that she wished to make the Akari Project real, "just to fuck those idiots over".
+Saya has many hobbies, including programming (her language of choice being **Haskell**), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called **My Maid Is A Sex Robot**, partially based around her experiences with dating **Meido Miyamoto**. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, **The Akari Project**, a story about teleportation experiments and interdimensional travel "that doesn't go to shit like all the others". Following the disaster on the **UAC** bases in regards to teleportation, she announced that she wished to make the Akari Project real, "just to fuck those idiots over".
-Currently, Saya has two girlfriends: Maidbot Miyamoto and **Ibuki Miyamoto**. Both of them being creations of her own, prompting people online to make incestuous remarks, which she frequently fights against.
+Currently, Saya has two girlfriends: Meido Miyamoto and **Ibuki Miyamoto**. Both of them being creations of her own, prompting people online to make incestuous remarks, which she frequently fights against.
\cxSaya's Notes:\c-
\cfYou like reading about me, don't you? I bet you do, silly. Alright, here's some more about me, just for you.\c-
@@ -35,14 +38,17 @@ Currently, Saya has two girlfriends: Maidbot Miyamoto and **Ibuki Miyamoto**. Bo
\cfWell, are you satisfied, Demo-chan? Have I sated your thirst for Saya Facts™? Good, then you should go back to work.\c-
TXT
-\cxFull Name:\c-
-\cf Saya Miyamoto\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 1993-03-20\c-
-\cxTwitter:\c-
-\cf @AkariSaya\c-
+ \cxFull Name:\c-
+ \cf Saya Miyamoto\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 1993-03-20\c-
+ \cxOccupation:\c-
+ \cf CTO, Human Resources (Akari Labs)\c-
+ \cxTwitter:\c-
+ \cf @AkariSaya\c-
+
**Saya Miyamoto** was born in 1993 as the middle child of **Nana Miyamoto** and **Ryuji Miyamoto**, her older brother being **Taro Miyamoto**, born in 1985, and her younger sister being **Yui Miyamoto**, born in 2009. As a child, Saya already showed interest in science and technology, proudly looking up to her father and his inventions. She excelled greatly in school, having even been described as a "child prodigy". At the surprisingly early age of 13, having proven her outstanding abilities, she got herself into **MIT**, where she graduated in **Computer Science**.
@@ -54,9 +60,9 @@ Saya would frequently be nicknamed **"Not-Tomoko"** around the net, in reference
Saya is also known for being exaggeratedly flirty around attractive women, something which has resulted in many misunderstandings and awkward moments. She proudly states that she's "always horny on main", and never lets any chance to flirt with someone slip past her. She however remarks that this open flirting is "just a friendly thing, between friends".
-Saya has many hobbies, including programming (her language of choice being **Haskell**), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called **My Maid Is A Sex Robot**, partially based around her experiences with dating **Maidbot Miyamoto**. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, **The Akari Project**, a story about teleportation experiments and interdimensional travel "that doesn't go to shit like all the others". Following the disaster on the **UAC** bases in regards to teleportation, she announced that she wished to make the Akari Project real, "just to fuck those idiots over".
+Saya has many hobbies, including programming (her language of choice being **Haskell**), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called **My Maid Is A Sex Robot**, partially based around her experiences with dating **Meido Miyamoto**. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, **The Akari Project**, a story about teleportation experiments and interdimensional travel "that doesn't go to shit like all the others". Following the disaster on the **UAC** bases in regards to teleportation, she announced that she wished to make the Akari Project real, "just to fuck those idiots over".
-Currently, Saya has three girlfriends: Maidbot Miyamoto, **Ibuki Miyamoto** and the **Demolitionist**. All of them being creations of her own, prompting people online to make incestuous remarks, which she frequently fights against.
+Currently, Saya has three girlfriends: Meido Miyamoto, **Ibuki Miyamoto** and the **Demolitionist**. All of them being creations of her own, prompting people online to make incestuous remarks, which she frequently fights against.
\cxSaya's Notes:\c-
\cfYou like reading about me, don't you? I bet you do, silly. Alright, here's some more about me, just for you.\c-
@@ -67,14 +73,17 @@ Currently, Saya has three girlfriends: Maidbot Miyamoto, **Ibuki Miyamoto** and
\cfNow go back to work, silly robutt.\c-
TXT
-\cxFull Name:\c-
-\cf Saya Miyamoto\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 1993-03-20\c-
-\cxTwitter:\c-
-\cf @AkariSaya\c-
+ \cxFull Name:\c-
+ \cf Saya Miyamoto\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 1993-03-20\c-
+ \cxOccupation:\c-
+ \cf CTO, Human Resources (Akari Labs)\c-
+ \cxTwitter:\c-
+ \cf @AkariSaya\c-
+
**Saya Miyamoto** was born in 1993 as the middle child of **Nana Miyamoto** and **Ryuji Miyamoto**, her older brother being **Taro Miyamoto**, born in 1985, and her younger sister being **Yui Miyamoto**, born in 2009. As a child, Saya already showed interest in science and technology, proudly looking up to her father and his inventions. She excelled greatly in school, having even been described as a "child prodigy". At the surprisingly early age of 13, having proven her outstanding abilities, she got herself into **MIT**, where she graduated in **Computer Science**.
@@ -86,9 +95,9 @@ Saya would frequently be nicknamed **"Not-Tomoko"** around the net, in reference
Saya is also known for being exaggeratedly flirty around attractive women, something which has resulted in many misunderstandings and awkward moments. She proudly states that she's "always horny on main", and never lets any chance to flirt with someone slip past her. She however remarks that this open flirting is "just a friendly thing, between friends".
-Saya has many hobbies, including programming (her language of choice being **Haskell**), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called **My Maid Is A Sex Robot**, partially based around her experiences with dating **Maidbot Miyamoto**. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, **The Akari Project**, a story about teleportation experiments and interdimensional travel "that doesn't go to shit like all the others". Following the disaster on the **UAC** bases in regards to teleportation, she announced that she wished to make the Akari Project real, "just to fuck those idiots over".
+Saya has many hobbies, including programming (her language of choice being **Haskell**), collecting videogames (most of which she doesn't actually play), drawing, 3d modeling and writing. Her fascination with anime and manga got her to write her very own: a three-volume series called **My Maid Is A Sex Robot**, partially based around her experiences with dating **Meido Miyamoto**. It became so popular it managed to get its own anime adaptation years later. Saya also wrote a science fiction novel, **The Akari Project**, a story about teleportation experiments and interdimensional travel "that doesn't go to shit like all the others". Following the disaster on the **UAC** bases in regards to teleportation, she announced that she wished to make the Akari Project real, "just to fuck those idiots over".
-Currently, Saya and her creations Maidbot Miyamoto, **Ibuki Miyamoto** and the **Demolitionist** are all engaged to **Kirin Xanai**, leader of the **Sykhai Empire** of **Akkou**.
+Currently, Saya and her creations Meido Miyamoto, **Ibuki Miyamoto** and the **Demolitionist** are all engaged to **Kirin Xanai**, leader of the **Sykhai Empire** of **Akkou**.
\cxSaya's Notes:\c-
\cfYou like reading about me, don't you? I bet you do, silly. Alright, here's some more about me, just for you.\c-
diff --git a/lore/default/taro.txt b/lore/default/taro.txt
index 869281e78..3efe506b7 100644
--- a/lore/default/taro.txt
+++ b/lore/default/taro.txt
@@ -5,14 +5,17 @@ People
REL
Nana;Ryuji;Saya;Ellen;Ibuki;WhiteScar;AkariLabs
TXT
-\cxFull Name:\c-
-\cf Taro Miyamoto\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 1985-10-06\c-
-\cxTwitter:\c-
-\cf @AkariTaro\c-
+ \cxFull Name:\c-
+ \cf Taro Miyamoto\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 1985-10-06\c-
+ \cxOccupation:\c-
+ \cf CEO, Public Relations (Akari Labs)\c-
+ \cxTwitter:\c-
+ \cf @AkariTaro\c-
+
Born in 1985 to **Nana** and **Ryuji Miyamoto**, **Taro** is the oldest of three siblings, despite what his looks might show. As a child, he was rather conflictive, but also notably studious. Having finished high school with excellent grades, he went on to study at many prestigious universities across the world, fueled by the desire to expand his knowledge, especially that of computer technology, which he was infatuated with. Alongside **Saya**, his younger sister, they founded **Akari Labs**, a company that specializes in Robotics and Artificial Intelligence, among others. There, Taro's specialties are Software Engineering and Design, and he's also in charge of managing public relations, due to Saya not being "much of a people person" unlike him.
diff --git a/lore/default/unissix.txt b/lore/default/unissix.txt
index 0ae5d42e4..7af5ac7c7 100644
--- a/lore/default/unissix.txt
+++ b/lore/default/unissix.txt
@@ -5,16 +5,18 @@ People
REL
Devanikna;Nedoshiaan;Zanaveth2;Zanaveth3;Nukuri;Saya;Yui;Taro;Ashley;Ellen;Sankaideriha
TXT
-\cxFull Name:\c-
-\cf Misa Azadeku Unissix\c-
-\cxAlias:\c-
-\cf Unissix Bokurou Azadeku\c-
-\cxNationality:\c-
-\cf Devanikan\c-
-\cxDate of Birth:\c-
-\cf 1992-02-29\c-
-\cxTwitter:\c-
-\cf @misamisa_unissix\c-
+ \cxFull Name:\c-
+ \cf Misa Azadeku Unissix\c-
+ \cxAlias:\c-
+ \cf Unissix Bokurou Azadeku\c-
+ \cxNationality:\c-
+ \cf Devanikan\c-
+ \cxDate of Birth:\c-
+ \cf 1992-02-29\c-
+ \cxOccupation:\c-
+ \cf Blacksmith (Unissix Crafts)\c-
+ \cxTwitter:\c-
+ \cf @misamisa_unissix\c-
**Misa Azadeku Unissix** is the youngest member of the **Unissix Clan**, who leads the nation of **Devanikna**. She's the second child of **Devai Unissix** and **Serwand Nerukousei**, being the younger sister of **Deneva Unissix**, one of the most renowned warriors in the entire nation.
diff --git a/lore/default/voicebox.txt b/lore/default/voicebox.txt
index 843c0de96..73a2caeb0 100644
--- a/lore/default/voicebox.txt
+++ b/lore/default/voicebox.txt
@@ -17,4 +17,20 @@ The **Loudboi** is a simple and lightweight device for AI units. Easy to install
The **Akari Labs** community offers a variety of custom-made voice packs for this device, too. Please visit our forums for more information.
\cxSaya's Notes:\c-
-\cfHeh... Ibuki's so amused that I programmed your voicebox to sound exactly like her. I mean, it fits, a lil' bit, being her little sister in a way, but what amuses ME is that you've somehow picked up all her little mannerisms and stuff. It's like you're a smol Ibuki at times, just without the tiddy.\c-
+\cfHeh... I just love that cute voice you've got, it's a perfect complement to that sassy personality of yours. And what amuses me the most is how quickly you picked up all our little quirks and mannerisms, especially Ibuki's. In a way it's almost like you're sometimes a smol version of her, just without the tiddy.\c-
+TXT
+\cxDesignation:\c-
+\cf Loudboi Voicebox\c-
+\cxManufacturer:\c-
+\cf Akari Labs\c-
+\cxClassification:\c-
+\cf Voice Synthesizer\c-
+
+The **Loudboi** is a simple and lightweight device for AI units. Easy to install and program, perfect for those building on a budget. There are a wide variety of options for the voice type, along with multiple language support, including Japanese. Those who are rather displeased with the uncannily "too human" default voice synthesis also have the option of enabling a built-in "robot voice" filter.
+
+The **Akari Labs** community offers a variety of custom-made voice packs for this device, too. Please visit our forums for more information.
+
+\cxSaya's Notes:\c-
+\cfHeh... I just love that cute voice you've got, it's a perfect complement to that sassy personality of yours. And what amuses me the most is how quickly you picked up all our little quirks and mannerisms, especially Ibuki's. In a way it's almost like you're sometimes a smol version of her, just without the tiddy.\c-
+
+\cfUpdate: And then... Your true vocal chords as a maidbot came to be, no filters or anything, and my love for your charming voice only increased. My heart melts at the sound of it, hehehe...\c-
diff --git a/lore/default/whitelady.txt b/lore/default/whitelady.txt
index ee882face..e46eae8a1 100644
--- a/lore/default/whitelady.txt
+++ b/lore/default/whitelady.txt
@@ -5,14 +5,17 @@ People
REL
MothPlushy;Chancebox;MothLamp;XAnimen;Demolitionist;Saya
TXT
-\cxFull Name:\c-
-\cf Andira Kyse\c-
-\cxTitle:\c-
-\cf White Lady of Aldabura\c-
-\cxNationality:\c-
-\cf Kantharei\c-
-\cxDate of Birth:\c-
-\cf 2674 BC\c-
+ \cxFull Name:\c-
+ \cf Andira Kyse\c-
+ \cxTitle:\c-
+ \cf White Lady of Aldabura\c-
+ \cxNationality:\c-
+ \cf Kantharei\c-
+ \cxDate of Birth:\c-
+ \cf 2674 BC\c-
+ \cxOccupation:\c-
+ \cf Mercenary\c-
+
The **White Lady of Aldabura** is one of the most skilled mercenaries known within the **X'Animen Coalition**. As one of the **Aldabura**, moth-like humanoids native to the small planet of **Kantharo**, she is quite sensitive to bright lights, and is often easily charmed by them. At the same time, she's quite timid and prefers to focus on her work, rather than on any social interaction.
diff --git a/lore/default/yui.txt b/lore/default/yui.txt
index ca4c7fe1b..a50ba9fb0 100644
--- a/lore/default/yui.txt
+++ b/lore/default/yui.txt
@@ -5,14 +5,17 @@ People
REL
Nana;Ryuji;Taro;Saya;Ashley
TXT
-\cxFull Name:\c-
-\cf Yui Miyamoto\c-
-\cxNationality:\c-
-\cf Japanese\c-
-\cxDate of Birth:\c-
-\cf 2009-07-02\c-
-\cxTwitter:\c-
-\cf @yuchan09\c-
+ \cxFull Name:\c-
+ \cf Yui Miyamoto\c-
+ \cxNationality:\c-
+ \cf Japanese\c-
+ \cxDate of Birth:\c-
+ \cf 2009-07-02\c-
+ \cxOccupation:\c-
+ \cf Neurosurgeon (Kasukabe Central Hospital)\c-
+ \cxTwitter:\c-
+ \cf @yuchan09\c-
+
Born in 2009 to **Nana** and **Ryuji Miyamoto**, **Yui** is the youngest of three siblings. She's quite an empathetic and sociable person, completely unlike her relatively gloomier, more reclusive older sister and brother **Saya** and **Taro**, having always shown a clear interest in helping other people. Since her childhood, her wish had been to become a doctor, "to save lives". This wish came to fruition after persevering through her studies, and many years slowly "ascending the ranks". As of this article's writing, Yui currently works as a neurosurgeon at **Kasukabe Central Hospital**, and has received several awards for her outstanding achievements.
diff --git a/lore/default/zanaveth2.txt b/lore/default/zanaveth2.txt
index a6c3ea9a1..be273abbd 100644
--- a/lore/default/zanaveth2.txt
+++ b/lore/default/zanaveth2.txt
@@ -5,14 +5,17 @@ People
REL
Nukuri;Devanikna;Unissix;Nekuratek;Zanaveth3;Kirin;WhiteScar;XAnimen
TXT
-\cxFull Name:\c-
-\cf Zanaveth Nekuraku II\c-
-\cxNationality:\c-
-\cf Nukuri\c-
-\cxDate of Birth:\c-
-\cf 1969-08-10\c-
-\cxTwitter:\c-
-\cf @purple_emotion\c-
+ \cxFull Name:\c-
+ \cf Zanaveth Nekuraku II\c-
+ \cxNationality:\c-
+ \cf Nukuri\c-
+ \cxDate of Birth:\c-
+ \cf 1969-08-10\c-
+ \cxOccupation:\c-
+ \cf CEO, AI Engineer (Nekuratek)\c-
+ \cf Minister of Interspecies Relations (NUG)\c-
+ \cxTwitter:\c-
+ \cf @purple_emotion\c-
**Zanaveth Nekuraku II** was born in 1969, as the single child of **Zanaveth Nekuraku I** and **Danakorn Kiyanou**. During her childhood, she showed great promise, being quite the quick learner, but rather than pressuring her to study harder, or putting her on a higher level place of study, her parents decided instead on letting her keep going at her own pace, which was something unheard of at the time.
@@ -37,14 +40,17 @@ Since the formation of the **Nukuri Unified Government** in 2108, Zanaveth II ho
\cfNowadays with the White Scar bullshit, we haven't been in touch much. Misa managed to visit a couple times, but it really wasn't the same, and I could tell that she wasn't enjoying it either. Yeah, fuck all that, I hope it ends someday and I can get the two in here again.\c-
TXT
-\cxFull Name:\c-
-\cf Zanaveth Nekuraku II\c-
-\cxNationality:\c-
-\cf Nukuri\c-
-\cxDate of Birth:\c-
-\cf 1969-08-10\c-
-\cxTwitter:\c-
-\cf @purple_emotion\c-
+ \cxFull Name:\c-
+ \cf Zanaveth Nekuraku II\c-
+ \cxNationality:\c-
+ \cf Nukuri\c-
+ \cxDate of Birth:\c-
+ \cf 1969-08-10\c-
+ \cxOccupation:\c-
+ \cf CEO, AI Engineer (Nekuratek)\c-
+ \cf Minister of Interspecies Relations (NUG)\c-
+ \cxTwitter:\c-
+ \cf @purple_emotion\c-
**Zanaveth Nekuraku II** was born in 1969, as the single child of **Zanaveth Nekuraku I** and **Danakorn Kiyanou**. During her childhood, she showed great promise, being quite the quick learner, but rather than pressuring her to study harder, or putting her on a higher level place of study, her parents decided instead on letting her keep going at her own pace, which was something unheard of at the time.
diff --git a/lore/default/zanaveth3.txt b/lore/default/zanaveth3.txt
index 0665ccfe9..324e8c807 100644
--- a/lore/default/zanaveth3.txt
+++ b/lore/default/zanaveth3.txt
@@ -5,17 +5,19 @@ People
REL
Nukuri;Unissix;Zanaveth2;NosKora;Saya;WhiteScar
TXT
-\cxFull Name:\c-
-\cf Zanaveth Nekuraku III\c-
-\cxAliases:\c-
-\cf The Corruptor\c-
-\cf Unissix Bokurou Azadeku II\c-
-\cxNationality:\c-
-\cf Nukuri\c-
-\cxDate of Birth:\c-
-\cf 2042-08-20\c-
-\cxTwitter:\c-
-\cf @zanaveth\c-
+ \cxFull Name:\c-
+ \cf Zanaveth Nekuraku III\c-
+ \cxAliases:\c-
+ \cf The Corruptor\c-
+ \cf Unissix Bokurou Azadeku II\c-
+ \cxNationality:\c-
+ \cf Nukuri\c-
+ \cxDate of Birth:\c-
+ \cf 2042-08-20\c-
+ \cxOccupation:\c-
+ \cf AI Engineer (Nekuratek)\c-
+ \cxTwitter:\c-
+ \cf @zanaveth\c-
**Zanaveth Nekuraku III** is the sole daughter of **Zanaveth Nekuraku II** and **Misa Azadeku Unissix**. She spent most of her early childhood on Earth, where she was born, though her and her family had to move back to **Nahkami** once she turned four, since by law, she had to study at a Nukuri school. It was in school that the young child began to have notable issues.
@@ -36,17 +38,19 @@ During her stay on Earth, Zanaveth III has had quite a noteworthy history on soc
\cfWell, if she comes here to Earth I'd welcome my new chuuni overlord with open arms.\c-
TXT
-\cxFull Name:\c-
-\cf Zanaveth Nekuraku III\c-
-\cxAliases:\c-
-\cf The Corruptor\c-
-\cf Unissix Bokurou Azadeku II\c-
-\cxNationality:\c-
-\cf Nukuri\c-
-\cxDate of Birth:\c-
-\cf 2042-08-20\c-
-\cxTwitter:\c-
-\cf @zanaveth\c-
+ \cxFull Name:\c-
+ \cf Zanaveth Nekuraku III\c-
+ \cxAliases:\c-
+ \cf The Corruptor\c-
+ \cf Unissix Bokurou Azadeku II\c-
+ \cxNationality:\c-
+ \cf Nukuri\c-
+ \cxDate of Birth:\c-
+ \cf 2042-08-20\c-
+ \cxOccupation:\c-
+ \cf AI Engineer (Nekuratek)\c-
+ \cxTwitter:\c-
+ \cf @zanaveth\c-
**Zanaveth Nekuraku III** is the sole daughter of **Zanaveth Nekuraku II** and **Misa Azadeku Unissix**. She spent most of her early childhood on Earth, where she was born, though her and her family had to move back to **Nahkami** once she turned four, since by law, she had to study at a Nukuri school. It was in school that the young child began to have notable issues.
diff --git a/lore/es/anarukon.txt b/lore/es/anarukon.txt
index 9ecf01522..7b39f45b3 100644
--- a/lore/es/anarukon.txt
+++ b/lore/es/anarukon.txt
@@ -20,7 +20,7 @@ Mucha gente de esta especie puede ser encontrada en la Tierra, un hecho ocultado
Entre los varios miembros de esta especie en la Tierra, un nombre que muchos reconocerán es el de **Ashley Knox**, cantante y guitarrista de **The Black Rat's Coven**. 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.
\cxNotas de Saya:\c-
-\cfSí, cosa tope molona de mundos paralelos y dioses y guerreros y esas mierdas, ¿verdad? Con cosas así me dan ganas de poder... ya sabes, viajar por todo el multiverso encontrando chismes guays así y conocer gente y tal. A lo mejor un día, quien sabe. Todas las mierdas de los capullos esos de la UAC en serio me hacen reconsiderarlo un poco, lo de los viajes interdimensionales. En serio, es que es como si todas esas típicas viejas historias de "abrir un portal al infierno" fueran predicciones de eso. Bueno, me estoy saliendo un poco del tema. Así que, Ashley-san es una de ellos, mola y tal, al menos Yu-chan tiene su novia inmortal. Lo mismo con Taro nii-san, con la monstruito bromista de Ellen-san, también de esa gente, por supuesto. ¿Cuando coño me va a tocar a mí? A ver, tampoco es que me importe mucho, me alegro de tener a Maidbot y a Ibuki y tal, y... supongo que también a ti pero... *suspiro*, estoy celosísima, sabes.\c-
+\cfSí, cosa tope molona de mundos paralelos y dioses y guerreros y esas mierdas, ¿verdad? Con cosas así me dan ganas de poder... ya sabes, viajar por todo el multiverso encontrando chismes guays así y conocer gente y tal. A lo mejor un día, quien sabe. Todas las mierdas de los capullos esos de la UAC en serio me hacen reconsiderarlo un poco, lo de los viajes interdimensionales. En serio, es que es como si todas esas típicas viejas historias de "abrir un portal al infierno" fueran predicciones de eso. Bueno, me estoy saliendo un poco del tema. Así que, Ashley-san es una de ellos, mola y tal, al menos Yu-chan tiene su novia inmortal. Lo mismo con Taro nii-san, con la monstruito bromista de Ellen-san, también de esa gente, por supuesto. ¿Cuando coño me va a tocar a mí? A ver, tampoco es que me importe mucho, me alegro de tener a Meido y a Ibuki y tal, y... supongo que también a ti pero... *suspiro*, estoy celosísima, sabes.\c-
TXT
\cxNombre:\c-
\cf Anarukon ("Imperecedero")\c-
@@ -47,6 +47,6 @@ Entre los varios miembros de esta especie en la Tierra, un nombre que muchos rec
\cg♥\c- \ca¡TE AMO KIRIN-KUN!\c- \cg♥\c-
-\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 recordatorio. ¿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 de nuestra boda (cosa fina por cierto). Y ahora, las cuatro estamos casadas con él, y a vivir la buena vida.\c-
+\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 recordatorio. ¿No es monísimo? Recuerdo como de supertímidas estabais tú y Meido 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 de nuestra boda (cosa fina por cierto). Y ahora, las cuatro estamos casadas con él, y a vivir la buena vida.\c-
\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 ahí va y EXPLOTA de repente, soltándome 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-
diff --git a/lore/es/ashley.txt b/lore/es/ashley.txt
index 3ea6946f5..564075b13 100644
--- a/lore/es/ashley.txt
+++ b/lore/es/ashley.txt
@@ -1,15 +1,17 @@
TXT
-\cxNombre Completo:\c-
-\cf Ashley Knox\c-
-\cf Axaleyu Yanikov (nombre Anarukon)\c-
-\cxNacionalidad:\c-
-\cf Británica\c-
-\cxFecha de Nacimiento:\c-
-\cf 1964-10-31 (antes de revelación)\c-
-\cf 1887-10-31 (real)\c-
-\cxTwitter:\c-
-\cf @ashley_da_witch (principal)\c-
-\cf @stylish_witch (arte)\c-
+ \cxNombre Completo:\c-
+ \cf Ashley Knox\c-
+ \cf Axaleyu Yanikov (nombre Anarukon)\c-
+ \cxNacionalidad:\c-
+ \cf Británica\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1964-10-31 (antes de revelación)\c-
+ \cf 1887-10-31 (real)\c-
+ \cxOcupación:\c-
+ \cf Vocalista Principal, Guitarrista (Black Rat's Coven)\c-
+ \cxTwitter:\c-
+ \cf @ashley_da_witch (principal)\c-
+ \cf @stylish_witch (arte)\c-
Nacida en Londres en 1887, hija de **Yrikha Yanikov** y **Maxwell A. Knox**, **Ashley** es la mayor de tres hijos, los otros siendo **Adrian Knox**, veterano de la Primera y Segunda Guerras Mundiales, y **Viola Knox**, una bruja en prácticas (todavía hasta la fecha actual de 2148). Pasó la mayor parte de su infancia en Cornualles, después de que su madre tuviera que darse a la fuga por acusaciones de brujería (las cuales no eran exactamente falsas).
diff --git a/lore/es/bigshot.txt b/lore/es/bigshot.txt
index 15d5cac62..2cbc71923 100644
--- a/lore/es/bigshot.txt
+++ b/lore/es/bigshot.txt
@@ -1,14 +1,17 @@
TAG
Don BIG SHOT
TXT
-\cxNombre Completo:\c-
-\cf John Gunns\c-
-\cxAlias:\c-
-\cf Don BIG SHOT\c-
-\cxNacionalidad:\c-
-\cf Americano\c-
-\cxFecha de Nacimiento:\c-
-\cf 2110-11-12\c-
+ \cxNombre Completo:\c-
+ \cf John Gunns\c-
+ \cxAlias:\c-
+ \cf Don BIG SHOT\c-
+ \cxNacionalidad:\c-
+ \cf Americano\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2110-11-12\c-
+ \cxOcupación:\c-
+ \cf CEO (Industrias BIGSHOT)\c-
+ \cf Consejero (Blackmann Arms)\c-
Un hombre rodeado de misterios, habiendo aparecido de la nada, anunciando ser el hijo de **Benellus, Dios de las Escopetas**. La credibilidad de esta historia es bastante cuestionable, a pesar de la insistencia de su propia madre, quien cuenta que el dios descendió del cielo, y dándole un "cartucho bendecido", la ordenó plantarlo en la tierra, ya que de él, un hombre nacería, quien se convertiría en "el más poderoso portador del arma definitiva". Cuenta que John, ya completamente adulto, salió del suelo pocos días después de haber plantado el cartucho, e inmediatamente empezó a "hacer salir escopetas de la tierra a su alrededor", y usó los metales de éstas para construir la fortaleza que la familia tiene en el desierto de Nevada.
@@ -17,14 +20,17 @@ A pesar de toda esta historia descabellada, el hombre tiene un poder considerabl
\cxNotas de Saya:\c-
\cfSí, el tío está loco perdido, pero mira, ESA cosa... muy MUY en serio que la quería. Hasta me reuní con el tío para poder tocarla con mis propias manos. Esa cosa es... jodidamente bestial, y seguro que no hay persona viviente que pueda usarla, PERO... tú seguro que puedes. Te digo una cosa, cada vez que te saques ese monumental pedazo de metal rompecojones, estaré mirando, así que más te vale ofrecerme un buen espectáculo con el que comer palomitas.\c-
TXT
-\cxNombre Completo:\c-
-\cf John Gunns\c-
-\cxAlias:\c-
-\cf Don BIG SHOT\c-
-\cxNacionalidad:\c-
-\cf Americano\c-
-\cxFecha de Nacimiento:\c-
-\cf 2110-11-12\c-
+ \cxNombre Completo:\c-
+ \cf John Gunns\c-
+ \cxAlias:\c-
+ \cf Don BIG SHOT\c-
+ \cxNacionalidad:\c-
+ \cf Americano\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2110-11-12\c-
+ \cxOcupación:\c-
+ \cf CEO (Industrias BIGSHOT)\c-
+ \cf Consejero (Blackmann Arms)\c-
Un hombre rodeado de misterios, habiendo aparecido de la nada, anunciando ser el hijo de **Benellus, Dios de las Escopetas**. La credibilidad de esta historia es bastante cuestionable, a pesar de la insistencia de su propia madre, quien cuenta que el dios descendió del cielo, y dándole un "cartucho bendecido", la ordenó plantarlo en la tierra, ya que de él, un hombre nacería, quien se convertiría en "el más poderoso portador del arma definitiva". Cuenta que John, ya completamente adulto, salió del suelo pocos días después de haber plantado el cartucho, e inmediatamente empezó a "hacer salir escopetas de la tierra a su alrededor", y usó los metales de éstas para construir la fortaleza que la familia tiene en el desierto de Nevada.
diff --git a/lore/es/blackfireigniter.txt b/lore/es/blackfireigniter.txt
deleted file mode 100644
index 705eca422..000000000
--- a/lore/es/blackfireigniter.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-TAG
-Encendedor F.N.
-TXT
-\cxDesignación:\c-
-\cf Encendedor de Fuego Negro\c-
-\cxFabricante:\c-
-\cf Artesanía Unissix\c-
-\cf Diseño de LS\c-
-\cxClasificación:\c-
-\cf Lanzallamas\c-
-
-Ideado por el propio dios primordial de la magia, el **Encendedor de Fuego negro** es sorprendentemente un arma muy fría y oscura. El fuego negro es un tipo de llama mágica que absorbe el calor y la luz, en lugar de emitirlos.
-
-Durante la cumbre de fama de **Artesanía Unissix**, el dios se presentó personalmente ante **Misa Unissix** con una petición de un arma que permitiría a prácticamente cualquiera realizar fácilmente **Magia de Manipulación de Fuego Negro**.
-
-El Encendedor es la mezcla perfecta de magia y tecnología, hecha arma. Tienes a tu alcance el poder de invocar llamas congelantes que transformarán a tus enemigos en estatuas de hielo en pocos segundos.
-
-\cfFuego Primario:\c- Libera un chorro continuo de Fuego Negro, con rango moderado. Las llamas no solo congelarán rápidamente lo que toquen, también reducirán la temperatura del aire, dejando un rastro de frío persistente.
-
-\cfFuego Secundario:\c- Estallidos concentrados que forman lanzas de aire supercongelado las cuales empalarán objetivos pequeños, o simplemente los atravesarán.
-
-\cfRecarga:\c- Acopla hasta dos frascos para rellenar la reserva interna de maná oscuro del arma. Cada frasco permanecerá enganchado hasta que se haya vaciado, ya que de otro modo podría escapar energía residual y causar daño al usuario. Si hay un frasco vacío acoplado, la acción de recarga lo desacoplará primero. Los frascos pueden ser usados aun si el depósito está lleno, y actuarán como un "búfer" extra de maná hasta vaciarse.
-
-\cxNotas de Saya:\c-
-\cfO sea, que Misa-Misa tiene otros juguetes aparte del trasto enorme ese. Mola que le hagan encargos y tal, el rollito de canela es muy popular por ahí, jejeje...\c-
-
-\cfNo he oído mucho sobre todo el tema del Fuego Negro de LS-sama, pero tiene pinta de ser divertido. Me pregunto si se puede usar en una carta mágica...\c-
diff --git a/lore/es/cytho.txt b/lore/es/cytho.txt
index a5677374b..1b3e65864 100644
--- a/lore/es/cytho.txt
+++ b/lore/es/cytho.txt
@@ -1,12 +1,15 @@
TXT
-\cxNombre Completo:\c-
-\cf Archiduque Cytho de la Casa Valathor\c-
-\cxNacionalidad:\c-
-\cf Kuriste\c-
-\cxFecha de Nacimiento:\c-
-\cf 2008-10-09\c-
-\cxTwitter:\c-
-\cf @incuvalathor\c-
+ \cxNombre Completo:\c-
+ \cf Archiduque Cytho de la Casa Valathor\c-
+ \cxNacionalidad:\c-
+ \cf Kuriste\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2008-10-09\c-
+ \cxOcupación:\c-
+ \cf Reportero de Noticias Independiente\c-
+ \cf Embajador (Reino Kuriste)\c-
+ \cxTwitter:\c-
+ \cf @incuvalathor\c-
Nacido en la ahora caída villa de Iskar en 2008 como uno de los varones más jóvenes de la humilde **Casa Valathor**, **Cytho** entró al negocio familiar al llegar a la edad adulta, rápidamente ascendiendo en rango en la industria del trabajo sexual del **Infierno**, en parte dada su belleza innata, pero también por la rápida acumulación de "clientes satisfechos" a los que daría servicio regularmente, y los muchos alumnos que tomó bajo su tutela. Ya en 2028, había hecho de la Tierra su segundo hogar, donde abriría una cuenta en redes sociales como una forma más moderna de atraer nueva clientela.
diff --git a/lore/es/demolitionist.txt b/lore/es/demolitionist.txt
index 957951403..2fc5d8801 100644
--- a/lore/es/demolitionist.txt
+++ b/lore/es/demolitionist.txt
@@ -1,16 +1,18 @@
TAG
Demolicionista
TXT
-\cxNombre Completo:\c-
-\cf Unidad de Combate Autónoma de Primera Generación de Akari Labs\c-
-\cf Demolicionista (nombre en clave)\c-
-\cf Demo Miyamoto (primera unidad)\c-
-\cxNacionalidad:\c-
-\cf Japonesa\c-
-\cxFecha de Nacimiento:\c-
-\cf 2148-01-20\c-
-\cxTwitter:\c-
-\cf @demolitionist_bot\c-
+ \cxNombre Completo:\c-
+ \cf Unidad de Combate Autónoma de Primera Generación de Akari Labs\c-
+ \cf Demolicionista (nombre en clave)\c-
+ \cf Demo Miyamoto (primera unidad)\c-
+ \cxNacionalidad:\c-
+ \cf Japonesa\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2148-01-20\c-
+ \cxOcupación:\c-
+ \cf Héroe Profesional\c-
+ \cxTwitter:\c-
+ \cf @demolitionist_bot\c-
El **Demolicionista** es uno de los mayores logros de **Akari Labs** en el campo de la robótica. Una unidad de combate manejada por IA capaz de usar eficientemente todo tipo de armamento a su disposición, altamente resistente a todo tipo de daño y capaz de operar en cualquier entorno, incluyendo el vacío del espacio. Puede considerarse el sucesor espiritual del programa de supersoldado **Oni Rojo**, en cierto modo, ya que también sirve el mismo propósito de defender a la Tierra de una fuerza invasora mayor. El proyecto ha sido financiado y patrocinado por los muchos socios de Akari Labs, y es fruto de la colaboración entre **Saya Miyamoto** y el **Archiduque Cytho Valathor**, representante de la población civil del **Infierno**.
@@ -52,7 +54,7 @@ La primera unidad, conocida afectivamente como **Demo-chan** por Saya, fue despl
De esta primera unidad anteriormente mencionada, se conocen muchos más detalles gracias a la sesión de preguntas y respuestas que Saya realizó en directo meses antes del despliegue. La unidad es reconocida como parte de la familia Miyamoto, teniendo el nombre completo de **Demo Miyamoto**, y Saya se refiere a ella como su "hija". Se puede describir a Demo como "muy habladora" y aficionada a hacer chistes para poner una sonrisa en las caras de la gente, aunque también es muy seria y determinada en su deseo de proteger a quien lo necesita. También es bastante popular con la comunidad LGBTQIA+ dado su feroz soporte de proteger los derechos de aquellos que sufren discriminación por su identidad, e incluso ha anunciado públicamente ser no-binaria. Esto fue algo poco inesperado, dada la experiencia de Saya con el colectivo.
-Tras su éxito luchando contra los ejércitos del Infierno, Saya se dio cuenta de que no haría falta fabricar más unidades, así que Demo se convirtió en el "arma definitiva" de Akari Labs, ella sola. Además, fue recompensada adicionalmente con un cuerpo adjunto de Maidbot, el cual Demo usa libremente durante su tiempo libre, y le ha permitido expresar verdaderamente sus sentimientos hacia Saya, convirtiéndose en su tercera pareja, junto con Maidbot e Ibuki.
+Tras su éxito luchando contra los ejércitos del Infierno, Saya se dio cuenta de que no haría falta fabricar más unidades, así que Demo se convirtió en el "arma definitiva" de Akari Labs, ella sola. Además, fue recompensada adicionalmente con un cuerpo adjunto de Maidbot, el cual Demo usa libremente durante su tiempo libre, y le ha permitido expresar verdaderamente sus sentimientos hacia Saya, convirtiéndose en su tercera pareja, junto con Meido e Ibuki.
\cxNotas de Saya:\c-
\cfEres tan mona, Demo-chan. Desde luego, mira que me he lucido con ese cuerpo de Maidbot. En serio me pilló por sorpresa cuando, justo al pasarte a él, así de repente... te me echaste encima abrazándome y besándome tanto y... buf~\c-
@@ -61,16 +63,18 @@ Tras su éxito luchando contra los ejércitos del Infierno, Saya se dio cuenta d
\cfEn fin, ya vale de leer sobre ti mientras trabajas. Sal de aquí, tonti.\c-
TXT
-\cxNombre Completo:\c-
-\cf Unidad de Combate Autónoma de Primera Generación de Akari Labs\c-
-\cf Demolicionista (nombre en clave)\c-
-\cf Demo Miyamoto (primera unidad)\c-
-\cxNacionalidad:\c-
-\cf Japonesa\c-
-\cxFecha de Nacimiento:\c-
-\cf 2148-01-20\c-
-\cxTwitter:\c-
-\cf @demolitionist_bot\c-
+ \cxNombre Completo:\c-
+ \cf Unidad de Combate Autónoma de Primera Generación de Akari Labs\c-
+ \cf Demolicionista (nombre en clave)\c-
+ \cf Demo Miyamoto (primera unidad)\c-
+ \cxNacionalidad:\c-
+ \cf Japonesa\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2148-01-20\c-
+ \cxOcupación:\c-
+ \cf Héroe Profesional\c-
+ \cxTwitter:\c-
+ \cf @demolitionist_bot\c-
El **Demolicionista** es uno de los mayores logros de **Akari Labs** en el campo de la robótica. Una unidad de combate manejada por IA capaz de usar eficientemente todo tipo de armamento a su disposición, altamente resistente a todo tipo de daño y capaz de operar en cualquier entorno, incluyendo el vacío del espacio. Puede considerarse el sucesor espiritual del programa de supersoldado **Oni Rojo**, en cierto modo, ya que también sirve el mismo propósito de defender a la Tierra de una fuerza invasora mayor. El proyecto ha sido financiado y patrocinado por los muchos socios de Akari Labs, y es fruto de la colaboración entre **Saya Miyamoto** y el **Archiduque Cytho Valathor**, representante de la población civil del **Infierno**.
@@ -82,7 +86,7 @@ La primera unidad, conocida afectivamente como **Demo-chan** por Saya, fue despl
De esta primera unidad anteriormente mencionada, se conocen muchos más detalles gracias a la sesión de preguntas y respuestas que Saya realizó en directo meses antes del despliegue. La unidad es reconocida como parte de la familia Miyamoto, teniendo el nombre completo de **Demo Miyamoto**, y Saya se refiere a ella como su "hija". Se puede describir a Demo como "muy habladora" y aficionada a hacer chistes para poner una sonrisa en las caras de la gente, aunque también es muy seria y determinada en su deseo de proteger a quien lo necesita. También es bastante popular con la comunidad LGBTQIA+ dado su feroz soporte de proteger los derechos de aquellos que sufren discriminación por su identidad, e incluso ha anunciado públicamente ser no-binaria. Esto fue algo poco inesperado, dada la experiencia de Saya con el colectivo.
-Tras su éxito luchando contra los ejércitos del Infierno, Saya se dio cuenta de que no haría falta fabricar más unidades, así que Demo se convirtió en el "arma definitiva" de Akari Labs, ella sola. Además, fue recompensada adicionalmente con un cuerpo adjunto de Maidbot, el cual Demo usa libremente durante su tiempo libre, y le ha permitido expresar verdaderamente sus sentimientos hacia Saya, convirtiéndose en su tercera pareja, junto con Maidbot e Ibuki. Desde Mayo de 2171, está adicionalmente casada con **Kirin Xanai**, líder del **Imperio Sykhai de Akkou**.
+Tras su éxito luchando contra los ejércitos del Infierno, Saya se dio cuenta de que no haría falta fabricar más unidades, así que Demo se convirtió en el "arma definitiva" de Akari Labs, ella sola. Además, fue recompensada adicionalmente con un cuerpo adjunto de Maidbot, el cual Demo usa libremente durante su tiempo libre, y le ha permitido expresar verdaderamente sus sentimientos hacia Saya, convirtiéndose en su tercera pareja, junto con Meido e Ibuki. Desde Mayo de 2171, está adicionalmente casada con **Kirin Xanai**, líder del **Imperio Sykhai de Akkou**.
\cxNotas de Saya:\c-
\cfEres tan mona, Demo-chan. Desde luego, mira que me he lucido con ese cuerpo de Maidbot. En serio me pilló por sorpresa cuando, justo al pasarte a él, así de repente... te me echaste encima abrazándome y besándome tanto y... buf~\c-
diff --git a/lore/es/doomguy.txt b/lore/es/doomguy.txt
index 00873697a..266b9c567 100644
--- a/lore/es/doomguy.txt
+++ b/lore/es/doomguy.txt
@@ -11,6 +11,8 @@ TXT
\cf Americano\c-
\cxFecha de Nacimiento:\c-
\cf CLASIFICADO\c-
+\cxOcupación:\c-
+\cf Marine (UAC)\c-
El **Marine de Doom** es el único superviviente de las invasiones demoníacas en las bases de la **UAC** en Fobos y Deimos. Habiendo sido transferido a **Mars City** no mucho antes de aquellos incidentes, formó parte del destacamento enviado a defender las bases de Fobos de los demonios invasores que habían de alguna forma tomado el control de los sistemas de teletransporte con los que la UAC estaba experimentando. Tras su impresionante hazaña de, solo por su cuenta, haber suprimido la invasión tanto en Fobos como Deimos, junto con haber llevado su batalla al mismo **Infierno** y haber vuelto, fue nombrado "solucionador de problemas" de la organización.
@@ -33,6 +35,8 @@ TXT
\cf Americano\c-
\cxFecha de Nacimiento:\c-
\cf CLASIFICADO\c-
+\cxOcupación:\c-
+\cf N/A\c-
El **Marine de Doom** es el único superviviente de las invasiones demoníacas en las bases de la **UAC** en Fobos y Deimos. Habiendo sido transferido a **Mars City** no mucho antes de aquellos incidentes, formó parte del destacamento enviado a defender las bases de Fobos de los demonios invasores que habían de alguna forma tomado el control de los sistemas de teletransporte con los que la UAC estaba experimentando. Tras su impresionante hazaña de, solo por su cuenta, haber suprimido la invasión tanto en Fobos como Deimos, junto con haber llevado su batalla al mismo **Infierno** y haber vuelto, fue nombrado "solucionador de problemas" de la organización.
@@ -55,6 +59,8 @@ TXT
\cf Americano\c-
\cxFecha de Nacimiento:\c-
\cf CLASIFICADO\c-
+\cxOcupación:\c-
+\cf N/A\c-
El **Marine de Doom** es el único superviviente de las invasiones demoníacas en las bases de la **UAC** en Fobos y Deimos. Habiendo sido transferido a **Mars City** no mucho antes de aquellos incidentes, formó parte del destacamento enviado a defender las bases de Fobos de los demonios invasores que habían de alguna forma tomado el control de los sistemas de teletransporte con los que la UAC estaba experimentando. Tras su impresionante hazaña de, solo por su cuenta, haber suprimido la invasión tanto en Fobos como Deimos, junto con haber llevado su batalla al mismo **Infierno** y haber vuelto, fue nombrado "solucionador de problemas" de la organización.
diff --git a/lore/es/ellen.txt b/lore/es/ellen.txt
index e90246ca3..9a2a1e383 100644
--- a/lore/es/ellen.txt
+++ b/lore/es/ellen.txt
@@ -1,12 +1,15 @@
TXT
-\cxNombre Completo:\c-
-\cf Elena "Ellen" Yanikov XXI\c-
-\cxNacionalidad:\c-
-\cf Americana\c-
-\cxFecha de Nacimiento:\c-
-\cf 2066-06-06\c-
-\cxTwitter:\c-
-\cf @Mischief_XXI\c-
+ \cxNombre Completo:\c-
+ \cf Elena "Ellen" Yanikov XXI\c-
+ \cxNacionalidad:\c-
+ \cf Americana\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2066-06-06\c-
+ \cxOcupación:\c-
+ \cf Mercenaria\c-
+ \cxTwitter:\c-
+ \cf @Mischief_XXI\c-
+
Nacida en Boston en 2066, hija de **Elena Yanikov XIX** y **Gottfried Steiner**, **Ellen** es la menor de dos hermanas (ambas con el nombre de Elena). Esta curiosidad de que todas las mujeres en su familia compartan el mismo nombre se puede trazar de vuelta hasta **Elena Yanikov I**, nacida en 1703, quien tomó esta decisión, en base a una creencia supersticiosa de que esto "preservará su inmortalidad para siempre". Esto no se alejaba mucho de la verdad, en cierto modo, pero no tenía nada que ver con la herencia de nombres. Se ha verificado que los genes **Anarukon** son preservados en su totalidad por todas las descendientes mujer, no importa cuantas generaciones, muy especialmente entre aquellas del linaje Yanikov.
diff --git a/lore/es/empcarbine.txt b/lore/es/empcarbine.txt
deleted file mode 100644
index dede978d0..000000000
--- a/lore/es/empcarbine.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-TAG
-Carabina Raíl
-TXT
-\cxDesignación:\c-
-\cf Carabina de Raíl de Impulsos Electromagnéticos\c-
-\cxFabricante:\c-
-\cf Instituto Tecnológico Tach-Engine\c-
-\cxClasificación:\c-
-\cf Arma de Energía Dirigida\c-
-
-La **Carabina de Raíl de Impulsos Electromagnéticos** es el primerísimo intento de **Tach-Engine** de combinar la tecnología humana actual con la de los experimentos recuperados de su expedición a las oficinas arruinadas de **Decade Mechanics**. Muy similar a otras armas típicas de rayos de partículas, pero con el impulso atronador de materia exótica altamente destructiva, ha sido considerada muy superior incluso a la potente **Thunder Buster** tan preciada por las tropas de la UAC.
-
-Inesperadamente, la Carabina de Raíl es un fusil de cerrojo con depósito tubular, el cual emplea barras de puro **Dysedum**. Cada una de estas permitiendo al arma descargar pulsos dirigidos de 20kA hacia un objetivo ionizado, friéndolo al instante, y potencialmente esparciendo sus efectos mortíferos a otros cercanos.
-
-Se ha de tener en cuenta que el uso de este arma en el agua es inseguro, ya que la descarga se dispersará violentamente a través de todo el medio.
-
-\cfFuego Primario:\c- Mantén para emitir una leve carga ionizante a la zona apuntada. Cuanto más se mantenga, más preciso será el disparo. Suelta para liberar el rayo. Si la barra está gastada, acciona el perno para cargar una nueva.
-
-\cfFuego Secundario:\c- También emite una carga ionizante, pero no libera al soltar. Útil si no puedes garantizar que tu objetivo esté siempre visible, o si quieres marcar rápidamente varios objetivos.
-
-\cfRecarga:\c- Se pueden depositar más barras en el arma a necesidad, hasta un máximo de tres.
-
-\cfZoom:\c- Mira ajustable de hasta 8 aumentos.
-
-\cfTécnicas:\c- Al ionizar varios objetivos puedes garantizar que el rayo se bifurque en arcos menores y los alcance a todos, aunque el potencial de daño será dividido entre ellos.
-
-\cxNotas de Saya:\c-
-\cfSabes, cualquier cosa que se cague en la UAC solo con existir me parece buena.\c-
-
-\cfPero esta cosa, además, también se lleva puntos extra por su descojonante potencial para freír hijos de puta. En serio, es que es como un puto relámpago saliendo de esto.\c-
diff --git a/lore/es/fistgun.txt b/lore/es/fistgun.txt
deleted file mode 100644
index 1a17cbc86..000000000
--- a/lore/es/fistgun.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-TAG
-Mano Divina
-TXT
-\cxDesignación:\c-
-\cf Mano Divina\c-
-\cxFabricante:\c-
-\cf Korovithuhcp (original)\c-
-\cf Artesanía Unissix (réplica)\c-
-\cxDesignación:\c-
-\cf Guantelete Mágico\c-
-
-La **Mano Divina** fue un arma que el dios **Korovithuhcp** construyó incontables milenios atrás, y fue pasando entre muchos héroes de leyenda. Finalmente se perdió, y el dios no mostró interés en crear una nueva. Esto, obviamente, no detuvo a **Misa Unissix** en el intento de hacer exactamente eso. Siguiendo documentos históricos de su uso, construyó su propia versión en base a una mezcla de magia arcana y tecnología moderna. Regaló una a su hija, **Zanaveth Nekuraku III**, y otra a la **Demolicionista**.
-
-\cfFuego Primario:\c- Carga un puñetazo, y luego lo suelta. El guantelete se lanzará de frente y luego volverá a ti.
-
-\cfFuego Secundario:\c- Carga una bofetada de ancho rango. Al soltarlo abofeteará de forma muy ruidosa y violenta todos los objetivos que tengas delante.
-
-\cfTécnicas:\c- Dada su naturaleza, la Mano Divina es susceptible a los efectos de un **Ragekit**, incrementando su fuerza y rango.
-
-\cxNotas de Saya:\c-
-\cfMenudo envío especial que nos mandó Zana-chan. Y cuando enseñamos que iba bien, y molaba, Misa-Misa se puso a tope y empezó a fabricarlas en masa. Si es que es juro que es demasiado adorable.\c-
-
-\cfEn fin, esos bichos van a recibir una buena somanta con esta cosa. Que ganas tengo de verla en acción con objetivos de verdad. Especialmente después de... Aquel incidente con el saco de boxeo.\c-
diff --git a/lore/es/grandlance.txt b/lore/es/grandlance.txt
deleted file mode 100644
index 8677dd9e9..000000000
--- a/lore/es/grandlance.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-TAG
-Gran Lanza
-TXT
-\cxDesignación:\c-
-\cf Suvan-Kin ("Gran Lanza")\c-
-\cxFabricante:\c-
-\cf Eushura Kmonn Jr.\c-
-\cxClasificación:\c-
-\cf Cañón de Riel Portátil\c-
-
-Ideado como la "última palabra" en armamento, la **Suvan-Kin** ("Gran Lanza" en el idioma **Xekkas**) es el primer cañón de riel realmente portátil del mundo, capaz de lanzar proyectiles a velocidades de hasta 7500km/h (o 14000km/h a carga máxima). El arma es potenciada en su totalidad por un compacto paquete de batería de cuatro celdas de Korberon-Eneiebium, fácil de reemplazar cuando se necesite. La munición empleada son arpones de Almacero de alta resonancia, capaces de atravesar limpiamente todo, sin llevar ni un solo rasguño.
-
-Si el potencial penetrante de estos arpones no es lo suficientemente destructivo, una bomba de fusión pura en miniatura incrustada a la cabeza ciertamente añadirá aun más a eso. En palabras de la gente **Xekkian**: **"Las llamas cegadoras de un sol sacrificado a su nacer desgarrarán toda vida, arrancarán el alma de su cuerpo, y no dejarán rastro alguno de aquellos desafortunados que hayan agraviado al portador de la Gran Lanza."**
-
-\cfFuego Primario:\c- Disparo de único objetivo. El arpón detonará automáticamente en contacto con cualquier cosa. El área de efecto es bastante enorme, así que mantén la distancia.
-
-\cfFuego Secundario:\c- Disparo de múltiple objetivo. El arpón es disparado a mayor velocidad, y penetrará varios objetivos hasta detenerse finalmente contra algo suficientemente sólido.
-
-\cfRecarga Primaria:\c- Recarga el arma.
-
-\cfRecarga Secundaria:\c- Cambia la batería. Esta acción solo puede hacerse en cuanto la carga sea lo suficientemente baja, ya que sería un derroche de otro modo.
-
-\cfTécnicas:\c- Cuanto más mantengas el fuego secundario, con más fuerza y velocidad se disparará. A carga máxima podrá incluso derribar paredes.
-
-\cfAdvertencia:\c- Antes de disparar, los rieles deben extenderse hasta su longitud completa. Si hay algún obstáculo en medio que no pueda ser apartado, la operación del arma será cancelada.
-
-\cxNotas de Saya:\c-
-\cfPerdón pero, ¿¿¿QUE COÑO ES ESTO???\c-
-
-\cf¿Es esto un puto cañón de riel? Vamos, ¿uno de verdad? ¿¿Y resulta que es portátil?? ¿¿¿Y DISPARA PUTOS ARPONES CON PUTAS BOMBAS DE FUSIÓN EN ELLOS??? Vale, olvida lo que dije sobre la otra arma enorme de Kmonn, ESTA MIERDA es incluso aun más puto ridícula, es que, ¿¿¿que puto cojones es todo esto???\c-
-
-\cfPues eso, por eso está colocada en el mismo puesto que el Ynykron. Piensa en ella como una alternativa "más segura", básicamente. No es apocalíptica, pero sigue siendo jodidamente fuerte.\c-
diff --git a/lore/es/ibuki.txt b/lore/es/ibuki.txt
index d53ed767d..8759d34c0 100644
--- a/lore/es/ibuki.txt
+++ b/lore/es/ibuki.txt
@@ -1,14 +1,16 @@
TXT
-\cxNombre Completo:\c-
-\cf Ibuki Miyamoto\c-
-\cf Oni Rojo (nombre en clave)\c-
-\cxNacionalidad:\c-
-\cf Japonesa\c-
-\cxFecha de Nacimiento:\c-
-\cf 2074-09-09\c-
-\cxTwitter\c-
-\cf @lewd_ibuki (principal)\c-
-\cf @ibuki_tiddy (fotos)\c-
+ \cxNombre Completo:\c-
+ \cf Ibuki Miyamoto\c-
+ \cf Oni Rojo (nombre en clave)\c-
+ \cxNacionalidad:\c-
+ \cf Japonesa\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2074-09-09\c-
+ \cxOcupación:\c-
+ \cf Mercenaria, Modelo de Desnudos, Vlogger\c-
+ \cxTwitter\c-
+ \cf @lewd_ibuki (principal)\c-
+ \cf @ibuki_tiddy (fotos)\c-
**Ibuki** es el resultado del programa de supersoldado **Oni Rojo**, ideado por **Saya Miyamoto** de **Akari Labs**. La existencia de este proyecto se mantuvo en secreto hasta su revelación pública en Junio de 2077. Hubo considerable controversia alrededor del programa Oni Rojo, incluyendo la implicación personal de Saya en él, habiendo aceptado un pago de 40 mil millones de dólares a cambio (lo cual se descubrió tener relación con la anterior venta del estado de Texas a México semanas antes). A pesar de su claro potencial y extraordinarias habilidades de combate, fue enviada demasiado tarde, ya que solo momentos después, la **Cicatriz Blanca** ocurrió, y con ella, la devastación total de los **Estados Unidos**.
diff --git a/lore/es/imanakit.txt b/lore/es/imanakit.txt
index 416198c35..f484ac8eb 100644
--- a/lore/es/imanakit.txt
+++ b/lore/es/imanakit.txt
@@ -5,6 +5,8 @@ TXT
\cf Indeterminado\c-
\cxFecha de Nacimiento:\c-
\cf Indeterminado\c-
+\cxOcupación:\c-
+\cf CEO (Imanaki Corp)\c-
El fundador y CEO de **Imanaki Corp**, y también el único miembro restante de la familia Imanaki tras los **Asesinatos de la Mansión Onoke** de 2003. **Tetsuya** siempre ha mantenido mucho secretismo acerca de sí mismo, así que no se sabe nada realmente de su vida personal o historia, ni su apariencia física.
diff --git a/lore/es/kirin.txt b/lore/es/kirin.txt
index def3b2ad0..8efc16738 100644
--- a/lore/es/kirin.txt
+++ b/lore/es/kirin.txt
@@ -1,14 +1,16 @@
TXT
-\cxNombre Completo:\c-
-\cf Kirin Xanai\c-
-\cxTítulo:\c-
-\cf Emperador Infantil del Imperio Sykhai de Akkou\c-
-\cxNacionalidad:\c-
-\cf Akkouxhei\c-
-\cxFecha de Nacimiento:\c-
-\cf 2080-04-13\c-
-\cxTwitter:\c-
-\cf @kiririn_xanai\c-
+ \cxNombre Completo:\c-
+ \cf Kirin Xanai\c-
+ \cxTítulo:\c-
+ \cf Emperador Infantil del Imperio Sykhai de Akkou\c-
+ \cxNacionalidad:\c-
+ \cf Akkouxhei\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2080-04-13\c-
+ \cxOcupación:\c-
+ \cf Consejero Comunal (Imperio Sykhai)\c-
+ \cxTwitter:\c-
+ \cf @kiririn_xanai\c-
Nacido en 2080, hijo de **Syrakha Yanikov** y **Azya Xanai**, **Kirin** se convirtió en emperador de **Akkou** a la temprana edad de 12 años, habiendo demostrado un gran interés en seguir los pasos de su madre.
diff --git a/lore/es/kmonn.txt b/lore/es/kmonn.txt
index d41d6b436..3970a17e2 100644
--- a/lore/es/kmonn.txt
+++ b/lore/es/kmonn.txt
@@ -1,10 +1,15 @@
TXT
-\cxNombre Completo:\c-
-\cf Eushura Kmonn Jr.\c-
-\cxNacionalidad:\c-
-\cf Xekkian\c-
-\cxFecha de Nacimiento:\c-
-\cf 8731 BC\c-
+ \cxNombre Completo:\c-
+ \cf Eushura Kmonn Jr.\c-
+ \cxNacionalidad:\c-
+ \cf Xekkian\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 8731 BC\c-
+ \cxOcupación:\c-
+ \cf CTO (Kmonn Shuna)\c-
+ \cf Consejero (Instituto Tecnológico Tach-Engine)\c-
+
+
**Eushura Kmonn Jr.**, hijo de **Eushura Kmonn Sr.**, es un gran inventor del **Reino de Xekke**, en el planeta de **Ixxeney**. Desde una edad temprana fue preparado para igualar la grandeza de su padre, y no tardó mucho en conseguir realizar su propia fama tras años de trabajo como su ayudante. Su creatividad e imaginación no tenían límites, y hay a su nombre un gran total de 279 logros notables en los campos tanto de la ofensa como defensa militar, lo cual ha ayudado a potenciar las fuerzas del reino, haciendo de ellos uno de los más fiables y reclamados por toda la **Coalición X'Animen** para tareas de defensa aliada.
diff --git a/lore/es/locke.txt b/lore/es/locke.txt
index 197254d40..7ceb460c1 100644
--- a/lore/es/locke.txt
+++ b/lore/es/locke.txt
@@ -1,10 +1,16 @@
TXT
-\cxNombre Completo:\c-
-\cf Janus Locke Hoodth\c-
-\cxNacionalidad:\c-
-\cf Qurensniv\c-
-\cxFecha de Nacimiento:\c-
-\cf 1980-07-30\c-
+ \cxNombre Completo:\c-
+ \cf Janus Locke Hoodth\c-
+ \cxNacionalidad:\c-
+ \cf Qurensniv\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1980-07-30\c-
+ \cxOcupación:\c-
+ \cf Inventor\c-
+
+
+
+
**Janus Locke** es el hermano menor del difunto **Dr. Häzel Hoodth** conocido por muchos como el **Doctor Chiflado de Kereshnovka**. Tras oír noticias de la muerte de Häzel en 1987 (especificamente, habiendo recibido dichas noticias 10 años después, mientras estudiaba en el extranjero), en la explosión de una plataforma petrolífera cercana al pueblo mientras realizaba sus experimentos para "obtener la esencia de la inmortalidad", Locke cambió por completo. Decidió continuar el trabajo de su hermano, mientras al mismo tiempo aun mantenía su empleo actual como fabricante de juguetes. Sin embargo, la locura en la que cayó se extendería también a eso, con los muchos productos que saldrían con su marca de **Juguetes Maravillosos del Dr. Locke** volviéndose cada vez más peligrosos, o incluso letales.
diff --git a/lore/es/maidbot.txt b/lore/es/maidbot.txt
index 0476ba443..30593c973 100644
--- a/lore/es/maidbot.txt
+++ b/lore/es/maidbot.txt
@@ -1,25 +1,27 @@
TXT
-\cxNombre Completo:\c-
-\cf Maidbot "Meido" Miyamoto\c-
-\cf Meidobot (nombre artístico)\c-
-\cxNacionalidad:\c-
-\cf Japonesa\c-
-\cxFecha de Nacimiento:\c-
-\cf 2017-07-07\c-
-\cxTwitter:\c-
-\cf @meidobot\c-
+ \cxNombre Completo:\c-
+ \cf Meido Miyamoto\c-
+ \cf Meidobot (nombre artístico)\c-
+ \cxNacionalidad:\c-
+ \cf Japonesa\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2017-07-07\c-
+ \cxOcupación:\c-
+ \cf Idol\c-
+ \cxTwitter:\c-
+ \cf @meidobot\c-
-Siendo el primer proyecto de IA de **Saya Miyamoto**, **Maidbot** inicialmente era poca cosa, sirviendo principalmente como un robot de limpieza con una inteligencia muy limitada, mayormente capaz de recibir órdenes simples. Con el tiempo, Saya expandiría sus habilidades, permitiendo una interactividad más compleja, pero aún limitada. Saya siempre sentía que a pesar de sus esfuerzos, a pesar de lo mucho que Maidbot gradualmente parecía más "real", nunca era suficiente. Al final, era "śolo una máquina".
+Siendo el primer proyecto de IA de **Saya Miyamoto**, **Meido** inicialmente era poca cosa, sirviendo principalmente como un robot de limpieza con una inteligencia muy limitada, mayormente capaz de recibir órdenes simples. Con el tiempo, Saya expandiría sus habilidades, permitiendo una interactividad más compleja, pero aún limitada. Saya siempre sentía que a pesar de sus esfuerzos, a pesar de lo mucho que Meido gradualmente parecía más "real", nunca era suficiente. Al final, era "śolo una máquina".
-Notablemente, se ha de mencionar el intento de Saya de hacerla cantante, algo que tuvo un éxito inesperado, realmente. Tras su debut inicial, más y más artistas compondrían canciones para que Maidbot las interpretara. En 2020, Maidbot se había convertido en una completa "Idol Artificial", suficientemente famosa como par tomar parte en los Juegos Olímpicos de Tokio, cantando el himno nacional.
+Notablemente, se ha de mencionar el intento de Saya de hacerla cantante, algo que tuvo un éxito inesperado, realmente. Tras su debut inicial, más y más artistas compondrían canciones para que Meido las interpretara. En 2020, Meido se había convertido en una completa "Idol Artificial", suficientemente famosa como par tomar parte en los Juegos Olímpicos de Tokio, cantando el himno nacional.
-Tras el **Evento Luna** de 2021, Saya recibió la visita de **Zanaveth Nekuraku II**, jefa de investigación de IA en **Nekuratek**, el mayor gigante tecnológico **Nukuri**. Curiosa por la cultura humana, decidió conocerla, ya que tenían intereses similares. Zanaveth quedó bastante impresionada por todo lo que **Akari Labs** había logrado, y mostró un interés especial por Maidbot, también.
+Tras el **Evento Luna** de 2021, Saya recibió la visita de **Zanaveth Nekuraku II**, jefa de investigación de IA en **Nekuratek**, el mayor gigante tecnológico **Nukuri**. Curiosa por la cultura humana, decidió conocerla, ya que tenían intereses similares. Zanaveth quedó bastante impresionada por todo lo que **Akari Labs** había logrado, y mostró un interés especial por Meido, también.
-Habiendo entablado amistad rápidamente con Saya llegado este punto, se ofreció a mejorar la IA de Maidbot con la tecnología más avanzada que tenían: El **Framework de IA Nekuronbot**. Habiendo aceptado esta oferta, Maidbot "renació" de su anterior forma limitada. Era ahora completamente capaz de pensamiento individual, libre albedrío y, más importante, emociones.
+Habiendo entablado amistad rápidamente con Saya llegado este punto, se ofreció a mejorar la IA de Meido con la tecnología más avanzada que tenían: El **Framework de IA Nekuronbot**. Habiendo aceptado esta oferta, Meido "renació" de su anterior forma limitada. Era ahora completamente capaz de pensamiento individual, libre albedrío y, más importante, emociones.
-No es sorpresa que Saya siempre sintió algo por ella, al mismo tiempo que era completamente consciente de la imposibilidad de que ella correspondiera a su amor, pero ahora, todo había cambiado. Maidbot lo sabía, y confesó que en su nueva forma, ella podía "sentir algo" también. Con el tiempo, logró comprender mejor estos sentimientos, y se convertiría en la primera novia de Saya.
+No es sorpresa que Saya siempre sintió algo por ella, al mismo tiempo que era completamente consciente de la imposibilidad de que ella correspondiera a su amor, pero ahora, todo había cambiado. Meido lo sabía, y confesó que en su nueva forma, ella podía "sentir algo" también. Con el tiempo, logró comprender mejor estos sentimientos, y se convertiría en la primera novia de Saya.
-Tras estos eventos, Maidbot pasó a formar parte de la familia, adoptando el apellido Miyamoto. Mucho después, y con la ayuda de Zanaveth, Saya comenzaría la creación de más maidbots, deseando que todo el mundo pudiera tener a su propia Maidbot. Se estableció un servicio de adopción en 2023, donde las maidbots, quienes eran criadas y preparadas en Akari Labs, podrían entrevistarse con adoptadores en potencia, permitiendo tener la decisión final sobre con quién vivir. Este servicio fue completamente gratuito, ya que la compañía tenía más que suficientes fondos con sus otros servicios, lo cual incrementó su popularidad aun más. Todos querían tener su propia Maidbot, y las Maidbots en sí eran felices de tener una familia con la que vivir.
+Tras estos eventos, Meido pasó a formar parte de la familia, adoptando el apellido Miyamoto. Mucho después, y con la ayuda de Zanaveth, Saya comenzaría la creación de más maidbots, deseando que todo el mundo pudiera "tener a su propia Meido". Se estableció un servicio de adopción en 2023, donde las maidbots, quienes eran criadas y preparadas en Akari Labs, podrían entrevistarse con adoptadores en potencia, permitiendo tener la decisión final sobre con quién vivir. Este servicio fue completamente gratuito, ya que la compañía tenía más que suficientes fondos con sus otros servicios, lo cual incrementó su popularidad aun más. Todos querían tener su propia Maidbot, y las Maidbots en sí eran felices de tener una familia con la que vivir.
\cxNotas de Saya:\c-
\cfMeido-chan es tan dulce~ Y su voz es tan bonita~\c-
@@ -31,7 +33,7 @@ Tras estos eventos, Maidbot pasó a formar parte de la familia, adoptando el ape
\cfJeje... Desde luego me alegro mucho de hacerla "completa", por cierto... Mejor decisión de mi vida. Deja que te diga, cuando hacemos "cositas" las dos... es como estar en el cielo~\c- \cg♥\c-
TXT
\cxNombre Completo:\c-
-\cf Maidbot "Meido" Miyamoto\c-
+\cf Meido Miyamoto\c-
\cf Meidobot (nombre artístico)\c-
\cxNacionalidad:\c-
\cf Japonesa\c-
@@ -40,17 +42,17 @@ TXT
\cxTwitter:\c-
\cf @meidobot\c-
-Siendo el primer proyecto de IA de **Saya Miyamoto**, **Maidbot** inicialmente era poca cosa, sirviendo principalmente como un robot de limpieza con una inteligencia muy limitada, mayormente capaz de recibir órdenes simples. Con el tiempo, Saya expandiría sus habilidades, permitiendo una interactividad más compleja, pero aún limitada. Saya siempre sentía que a pesar de sus esfuerzos, a pesar de lo mucho que Maidbot gradualmente parecía más "real", nunca era suficiente. Al final, era "śolo una máquina".
+Siendo el primer proyecto de IA de **Saya Miyamoto**, **Meido** inicialmente era poca cosa, sirviendo principalmente como un robot de limpieza con una inteligencia muy limitada, mayormente capaz de recibir órdenes simples. Con el tiempo, Saya expandiría sus habilidades, permitiendo una interactividad más compleja, pero aún limitada. Saya siempre sentía que a pesar de sus esfuerzos, a pesar de lo mucho que Meido gradualmente parecía más "real", nunca era suficiente. Al final, era "śolo una máquina".
-Notablemente, se ha de mencionar el intento de Saya de hacerla cantante, algo que tuvo un éxito inesperado, realmente. Tras su debut inicial, más y más artistas compondrían canciones para que Maidbot las interpretara. En 2020, Maidbot se había convertido en una completa "Idol Artificial", suficientemente famosa como par tomar parte en los Juegos Olímpicos de Tokio, cantando el himno nacional.
+Notablemente, se ha de mencionar el intento de Saya de hacerla cantante, algo que tuvo un éxito inesperado, realmente. Tras su debut inicial, más y más artistas compondrían canciones para que Meido las interpretara. En 2020, Meido se había convertido en una completa "Idol Artificial", suficientemente famosa como par tomar parte en los Juegos Olímpicos de Tokio, cantando el himno nacional.
-Tras el **Evento Luna** de 2021, Saya recibió la visita de **Zanaveth Nekuraku II**, jefa de investigación de IA en **Nekuratek**, el mayor gigante tecnológico **Nukuri**. Curiosa por la cultura humana, decidió conocerla, ya que tenían intereses similares. Zanaveth quedó bastante impresionada por todo lo que **Akari Labs** había logrado, y mostró un interés especial por Maidbot, también.
+Tras el **Evento Luna** de 2021, Saya recibió la visita de **Zanaveth Nekuraku II**, jefa de investigación de IA en **Nekuratek**, el mayor gigante tecnológico **Nukuri**. Curiosa por la cultura humana, decidió conocerla, ya que tenían intereses similares. Zanaveth quedó bastante impresionada por todo lo que **Akari Labs** había logrado, y mostró un interés especial por Meido, también.
-Habiendo entablado amistad rápidamente con Saya llegado este punto, se ofreció a mejorar la IA de Maidbot con la tecnología más avanzada que tenían: El **Framework de IA Nekuronbot**. Habiendo aceptado esta oferta, Maidbot "renació" de su anterior forma limitada. Era ahora completamente capaz de pensamiento individual, libre albedrío y, más importante, emociones.
+Habiendo entablado amistad rápidamente con Saya llegado este punto, se ofreció a mejorar la IA de Meido con la tecnología más avanzada que tenían: El **Framework de IA Nekuronbot**. Habiendo aceptado esta oferta, Meido "renació" de su anterior forma limitada. Era ahora completamente capaz de pensamiento individual, libre albedrío y, más importante, emociones.
-No es sorpresa que Saya siempre sintió algo por ella, al mismo tiempo que era completamente consciente de la imposibilidad de que ella correspondiera a su amor, pero ahora, todo había cambiado. Maidbot lo sabía, y confesó que en su nueva forma, ella podía "sentir algo" también. Con el tiempo, logró comprender mejor estos sentimientos, y se convertiría en la primera novia de Saya.
+No es sorpresa que Saya siempre sintió algo por ella, al mismo tiempo que era completamente consciente de la imposibilidad de que ella correspondiera a su amor, pero ahora, todo había cambiado. Meido lo sabía, y confesó que en su nueva forma, ella podía "sentir algo" también. Con el tiempo, logró comprender mejor estos sentimientos, y se convertiría en la primera novia de Saya.
-Tras estos eventos, Maidbot pasó a formar parte de la familia, adoptando el apellido Miyamoto. Mucho después, y con la ayuda de Zanaveth, Saya comenzaría la creación de más maidbots, deseando que todo el mundo pudiera tener a su propia Maidbot. Se estableció un servicio de adopción en 2023, donde las maidbots, quienes eran criadas y preparadas en Akari Labs, podrían entrevistarse con adoptadores en potencia, permitiendo tener la decisión final sobre con quién vivir. Este servicio fue completamente gratuito, ya que la compañía tenía más que suficientes fondos con sus otros servicios, lo cual incrementó su popularidad aun más. Todos querían tener su propia Maidbot, y las Maidbots en sí eran felices de tener una familia con la que vivir.
+Tras estos eventos, Meido pasó a formar parte de la familia, adoptando el apellido Miyamoto. Mucho después, y con la ayuda de Zanaveth, Saya comenzaría la creación de más maidbots, deseando que todo el mundo pudiera "tener a su propia Meido". Se estableció un servicio de adopción en 2023, donde las maidbots, quienes eran criadas y preparadas en Akari Labs, podrían entrevistarse con adoptadores en potencia, permitiendo tener la decisión final sobre con quién vivir. Este servicio fue completamente gratuito, ya que la compañía tenía más que suficientes fondos con sus otros servicios, lo cual incrementó su popularidad aun más. Todos querían tener su propia Maidbot, y las Maidbots en sí eran felices de tener una familia con la que vivir.
En Mayo de 2171, junto con Saya y sus otras parejas, se casó con el **Emperador Kirin Xanai**, del **Imperio Sykhai**, y gracias a él, su pasión por el canto ha vuelto una vez más.
diff --git a/lore/es/mixom.txt b/lore/es/mixom.txt
index 22d0f2d40..0d7d31449 100644
--- a/lore/es/mixom.txt
+++ b/lore/es/mixom.txt
@@ -17,4 +17,6 @@ Mixom es, además, uno de los últimos bastiones del capitalismo restantes en el
\cxNotas de Saya:\c-
\cfDinero y poder, dominio absoluto, mierda de capitalismo. Asco grande... Ojalá exploten todos.\c-
-\cfNo puedes dar dos pasos sin cruzarte con algo que han hecho, están EN PUTAS TODAS PARTES. Como, por ejemplo, ¿todos los tornillos en tu cuerpo? Marca Mixom. ¿La refrigeración líquida? También Mixom... Seguiría, pero es que me da todo el asco decir su nombre tanto.\c-
+\cfMenos la presidenta, es la única persona cuerda que queda ahí pero es que no podían ser más rastreros cada vez que intenta cambiar las cosas. Es comendable, cierto, pero me parece una batalla perdida ya. Debería tirar la toalla y venirse a trabajar aquí.\c-
+
+\cfPor cierto, no puedes dar dos pasos sin cruzarte con algo que han hecho, están EN PUTAS TODAS PARTES. Como, por ejemplo, ¿todos los tornillos en tu cuerpo? Marca Mixom. ¿La refrigeración líquida? También Mixom... Seguiría, pero es que me da todo el asco decir su nombre tanto.\c-
diff --git a/lore/es/nana.txt b/lore/es/nana.txt
index e32469e7e..38c2a1cb9 100644
--- a/lore/es/nana.txt
+++ b/lore/es/nana.txt
@@ -1,10 +1,16 @@
TXT
-\cxNombre Completo:\c-
-\cf Nana Miyamoto\c-
-\cxNacionalidad:\c-
-\cf Japonesa\c-
-\cxFecha de Nacimiento:\c-
-\cf 1907-07-07\c-
+ \cxNombre Completo:\c-
+ \cf Nana Miyamoto\c-
+ \cxNacionalidad:\c-
+ \cf Japonesa\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1907-07-07\c-
+ \cxOcupación:\c-
+ \cf Ama de Casa\c-
+
+
+
+
**Nana** es la hija única de **Kaguya Houraisan**, la princesa **Lunar** exiliada que hizo de **Gensokyo** su hogar. Habiendo sido criada y educada completamente dentro de los confines de **Eientei** no sabía mucho del mundo exterior, y habría pasado el resto de su vida eterna ahí, de no haber sido por un encuentro inesperado con **Ryuji Miyamoto** en los años 60. Habiendo huido de la **Aldea Humana**, se cruzó con Nana. Los dos entablaron una amistad cercana, y el joven chico hizo la promesa de casarse con ella cuando creciera, y llevarla al exterior, para que pudiese "ver el mundo". Esto ocurriría en 1973, con los dos dejando atrás Gensokyo para formar una familia.
@@ -15,12 +21,18 @@ Nana tiene tres hijos, los cuales, como ella, han heredado la sangre inmortal de
\cxNotas de Saya:\c-
\cfLa más mejor mamá del mundo, no voy a mentir. Puede que sea estricta a veces, o se enfade conmigo por estar despierta hasta muy tarde (si es que se da cuenta, je), pero realmente es la mejor. Aun no la has conocido, Demo-chan, pero seguro que le vas a caer muy bien. Te aseguro que es muy maja a pesar del miedo que da la pinta que tiene a veces. No es para nada como Kaguya obaa-san, que juro que siempre tiene ese aura que es como... normal que los tíos le tengan miedo, siempre con un miedo constante a que les haga CBT en cualquier momento.\c-
TXT
-\cxNombre Completo:\c-
-\cf Nana Miyamoto\c-
-\cxNacionalidad:\c-
-\cf Japonesa\c-
-\cxFecha de Nacimiento:\c-
-\cf 1907-07-07\c-
+ \cxNombre Completo:\c-
+ \cf Nana Miyamoto\c-
+ \cxNacionalidad:\c-
+ \cf Japonesa\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1907-07-07\c-
+ \cxOcupación:\c-
+ \cf Ama de Casa\c-
+
+
+
+
**Nana** es la hija única de **Kaguya Houraisan**, la princesa **Lunar** exiliada que hizo de **Gensokyo** su hogar. Habiendo sido criada y educada completamente dentro de los confines de **Eientei** no sabía mucho del mundo exterior, y habría pasado el resto de su vida eterna ahí, de no haber sido por un encuentro inesperado con **Ryuji Miyamoto** en los años 60. Habiendo huido de la **Aldea Humana**, se cruzó con Nana. Los dos entablaron una amistad cercana, y el joven chico hizo la promesa de casarse con ella cuando creciera, y llevarla al exterior, para que pudiese "ver el mundo". Esto ocurriría en 1973, con los dos dejando atrás Gensokyo para formar una familia.
@@ -33,12 +45,18 @@ Nana tiene tres hijos, los cuales, como ella, han heredado la sangre inmortal de
\cfPor cierto, me di cuenta, sabes, cuando te dio ese abrazo, sí. No ha intentado ver a otros tíos desde que perdimos a papá... Pero creo que a lo mejor... puede que le gustes de una forma algo diferente, ya sabes...\c-
TXT
-\cxNombre Completo:\c-
-\cf Nana Miyamoto\c-
-\cxNacionalidad:\c-
-\cf Japonesa\c-
-\cxFecha de Nacimiento:\c-
-\cf 1907-07-07\c-
+ \cxNombre Completo:\c-
+ \cf Nana Miyamoto\c-
+ \cxNacionalidad:\c-
+ \cf Japonesa\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1907-07-07\c-
+ \cxOcupación:\c-
+ \cf Ama de Casa\c-
+
+
+
+
**Nana** es la hija única de **Kaguya Houraisan**, la princesa **Lunar** exiliada que hizo de **Gensokyo** su hogar. Habiendo sido criada y educada completamente dentro de los confines de **Eientei** no sabía mucho del mundo exterior, y habría pasado el resto de su vida eterna ahí, de no haber sido por un encuentro inesperado con **Ryuji Miyamoto** en los años 60. Habiendo huido de la **Aldea Humana**, se cruzó con Nana. Los dos entablaron una amistad cercana, y el joven chico hizo la promesa de casarse con ella cuando creciera, y llevarla al exterior, para que pudiese "ver el mundo". Esto ocurriría en 1973, con los dos dejando atrás Gensokyo para formar una familia.
diff --git a/lore/es/puntzergamma.txt b/lore/es/puntzergamma.txt
index 006807b68..6b66f4484 100644
--- a/lore/es/puntzergamma.txt
+++ b/lore/es/puntzergamma.txt
@@ -10,9 +10,9 @@ La serie **Puntzer** de armas de **Blackmann Arms** son el principal ejemplo del
El **Puntzer Gamma** es un subfusil bullpup mayormente compacto con un sistema de cargador horizontal similar a clásicos del siglo 21 como el **BreakerTek P90**. El arma es adicionalmente capaz de ejecutar un modo "Súper-Automático" de disparo ultrarrápido, visto también en otras armas automáticas fabricadas por Blackmann Arms.
-\cfFuego Primario:\c- Dispara el arma.
+\cfFuego Primario:\c- Disparo en modo automático.
-\cfFuego Secundario:\c- Alterna modos de disparo, entre simple, ráfaga de tres, automático y súper-automático.
+\cfFuego Secundario:\c- Ráfaga en modo "super-automático".
\cfRecarga:\c- Recarga, obviamente. Los autocargadores de tu **Contenedor de Hammerspace™** te proveerán de un cargador nuevo en cada momento.
diff --git a/lore/es/rafankos.txt b/lore/es/rafankos.txt
index 78fdbc032..242ad29d2 100644
--- a/lore/es/rafankos.txt
+++ b/lore/es/rafankos.txt
@@ -21,4 +21,4 @@ El arma emplea **Kabbadon** como combustible, un subproducto común de la fusió
\cxNotas de Saya:\c-
\cf¿"Arma Definitiva"? Menuda cursilada... Pero sabes, algo de todo esto hacía que me picotearan los sesos, y entonces todo encajó. Esta cosa es básicamente como esa carta de hechizo, la Chispa Maestra. Hostia, es que hasta suena y pinta igual...\c-
-\cfJoder, si mola y todo, en serio. Me gusta, así que la puse en el mismo sitio que las otras dos armas súper descoyuntantes.\c-
+\cfJoder, si mola y todo, en serio. Me gusta, así que la puse en el mismo sitio que el otro armatoste súper descoyuntante. Ya sabes, como una alternativa más segura con la que tendrás menos posibilidades de matarte. He de admitir que Misa-Misa nos ha cargado con un material potente al traernos estas dos.\c-
diff --git a/lore/es/raykhom.txt b/lore/es/raykhom.txt
index ca7cd0b45..99c1ce728 100644
--- a/lore/es/raykhom.txt
+++ b/lore/es/raykhom.txt
@@ -25,6 +25,6 @@ El arma es potenciada en su totalidad por un compacto paquete de batería de cua
\cfAsí que según los Xekkian esto es un "arma ligera", ¿¿¿en serio??? Menos mal que tus manos se pueden adaptar no se como a la empuñadura de la cosa esta, porque hostia putísima...\c-
-\cfEsta mierda es como, no se por donde empezar. Es en serio un puto revientaculos, eso es lo que es. De todo lo que hay en tu arsenal, yo diría que esta es la segunda arma más fuerte que tenemos. Misa aparte la trajo ella misma entonces, y luego hablamos con el viejales de Tach-Engine para poder meterla en la tienda, ya que tiene el trato ese con Kmonn y tal (Estoy segura de que esos dos son algo mas que compañeros de negocios, si sabes a lo que me refiero).\c-
+\cfEsta mierda es como, no se por donde empezar. Es en serio un puto revientaculos, eso es lo que es. De todo lo que hay en tu arsenal, yo diría que esta es la tercera arma más tocha que tenemos. Misa aparte la trajo ella misma entonces, y luego hablamos con el viejales de Tach-Engine para poder meterla en la tienda, ya que tiene el trato ese con Kmonn y tal (Estoy segura de que esos dos son algo mas que compañeros de negocios, si sabes a lo que me refiero).\c-
\cfCuando entró por la puerta cargando a hombros con esa cosa supe entonces que tenía que ser nuestra.\c-
diff --git a/lore/es/ryuji.txt b/lore/es/ryuji.txt
index 5f6436ce5..e1b319e26 100644
--- a/lore/es/ryuji.txt
+++ b/lore/es/ryuji.txt
@@ -1,12 +1,15 @@
TXT
-\cxNombre Completo:\c-
-\cf Ryuji Miyamoto\c-
-\cxNacionalidad:\c-
-\cf Japonés\c-
-\cxFecha de Nacimiento:\c-
-\cf 1956-03-12\c-
-\cxFecha de Defunción:\c-
-\cf 2054-06-22\c-
+ \cxNombre Completo:\c-
+ \cf Ryuji Miyamoto\c-
+ \cxNacionalidad:\c-
+ \cf Japonés\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1956-03-12\c-
+ \cxFecha de Defunción:\c-
+ \cf 2054-06-22\c-
+ \cxOcupación:\c-
+ \cf Inventor\c-
+
**Ryuji** nació en **Gensokyo** en 1956, pasando la mayor parte de su vida en la **Aldea Humana**, el único asentamiento de la región habitado completamente por humanos, en lugar de Youkai. Durante su adolescencia, se volvió bastante rebelde, deseando abandonar la aldea y tener "aventuras". Un día, escapó, y se perdió en el bosque de bambú rodeando **Eientei**. Ahí, se cruzó con **Nana**, la hija de **Kaguya Houraisan**, y los dos se hicieron amigos. Después de ella lo guiara de vuelta a la aldea, Ryuji le prometió que regresaría un día, para casarse con ella, y llevarla con él a ver el mundo exterior.
diff --git a/lore/es/saya.txt b/lore/es/saya.txt
index 779e784e7..5f91cd82b 100644
--- a/lore/es/saya.txt
+++ b/lore/es/saya.txt
@@ -1,12 +1,15 @@
TXT
-\cxNombre Completo:\c-
-\cf Saya Miyamoto\c-
-\cxNacionalidad:\c-
-\cf Japonesa\c-
-\cxFecha de Nacimiento:\c-
-\cf 1993-03-20\c-
-\cxTwitter:\c-
-\cf @AkariSaya\c-
+ \cxNombre Completo:\c-
+ \cf Saya Miyamoto\c-
+ \cxNacionalidad:\c-
+ \cf Japonesa\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1993-03-20\c-
+ \cxOcupación:\c-
+ \cf CTO, Recursos Humanos (Akari Labs)\c-
+ \cxTwitter:\c-
+ \cf @AkariSaya\c-
+
**Saya Miyamoto** nació en 1993, siendo la hija mediana de **Nana Miyamoto** y **Ryuji Miyamoto**, su hermano mayor es **Taro Miyamoto**, nacido en 1985, y su hermana menor es **Yui Miyamoto**, nacida en 2009. Ya de niña, Saya mostraba un interés por la ciencia y tecnología, admirando orgullosa a su padre y sus inventos. Fue una estudiante de sobresaliente, habiendo sido incluso descrita como "niña prodigio". A la sorprendentemente temprana edad de 13 años, habiendo demostrado sus habilidades excepcionales, consiguió entrar en el **MIT**, donde se graduó en **Ciencias de Computación**.
@@ -18,9 +21,9 @@ Saya recibiría frecuentemente el apodo de **No-Tomoko** en las redes, en refere
Saya es conocida también por ser exageradamente coqueta con mujeres atractivas, algo que ha resultado en muchos malentendidos y momentos incómodos. Con orgullo suele decir que está "siempre horny on main", y nunca deja pasar la oportunidad de flirtear con alguien. Sin embargo si menciona que este flirteo abierto es "sólo amistoso, entre amigos".
-Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo **Haskell**), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada **Mi Maid Es Un Robot Del Sexo**, basado parcialmente en sus experiencias saliendo con **Maidbot Miyamoto**. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, **El Proyecto Akari**, una historia sobre experimentos de teletransporte y viajes interdimensionales "que no se va a la mierda como el resto". Tras el desastre en las bases de la **UAC** en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, "solo para joder a esos idiotas".
+Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo **Haskell**), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada **Mi Maid Es Un Robot Del Sexo**, basado parcialmente en sus experiencias saliendo con **Meido Miyamoto**. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, **El Proyecto Akari**, una historia sobre experimentos de teletransporte y viajes interdimensionales "que no se va a la mierda como el resto". Tras el desastre en las bases de la **UAC** en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, "solo para joder a esos idiotas".
-Actualmente, Saya tiene dos novias: Maidbot Miyamoto e **Ibuki Miyamoto**. Ambas siendo sus propias creaciones, lo que ha hecho que la gente haga comentarios incestuosos en las redes, contra los que lucha frecuentemente.
+Actualmente, Saya tiene dos novias: Meido Miyamoto e **Ibuki Miyamoto**. Ambas siendo sus propias creaciones, lo que ha hecho que la gente haga comentarios incestuosos en las redes, contra los que lucha frecuentemente.
\cxNotas de Saya:\c-
\cfTe gusta leer sobre mi, ¿verdad? Seguro que sí, tonti. Muy bien, pues aquí tienes mas cosas sobre mí, sólo para ti.\c-
@@ -29,14 +32,17 @@ Actualmente, Saya tiene dos novias: Maidbot Miyamoto e **Ibuki Miyamoto**. Ambas
\cfBueno, ¿satisfecha, Demo-chan? ¿He saciado tu sed de Saya Facts™? Bien, entonces deberías volver al trabajo.\c-
TXT
-\cxNombre Completo:\c-
-\cf Saya Miyamoto\c-
-\cxNacionalidad:\c-
-\cf Japonesa\c-
-\cxFecha de Nacimiento:\c-
-\cf 1993-03-20\c-
-\cxTwitter:\c-
-\cf @AkariSaya\c-
+ \cxNombre Completo:\c-
+ \cf Saya Miyamoto\c-
+ \cxNacionalidad:\c-
+ \cf Japonesa\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1993-03-20\c-
+ \cxOcupación:\c-
+ \cf CTO, Recursos Humanos (Akari Labs)\c-
+ \cxTwitter:\c-
+ \cf @AkariSaya\c-
+
**Saya Miyamoto** nació en 1993, siendo la hija mediana de **Nana Miyamoto** y **Ryuji Miyamoto**, su hermano mayor es **Taro Miyamoto**, nacido en 1985, y su hermana menor es **Yui Miyamoto**, nacida en 2009. Ya de niña, Saya mostraba un interés por la ciencia y tecnología, admirando orgullosa a su padre y sus inventos. Fue una estudiante de sobresaliente, habiendo sido incluso descrita como "niña prodigio". A la sorprendentemente temprana edad de 13 años, habiendo demostrado sus habilidades excepcionales, consiguió entrar en el **MIT**, donde se graduó en **Ciencias de Computación**.
@@ -48,9 +54,9 @@ Saya recibiría frecuentemente el apodo de **No-Tomoko** en las redes, en refere
Saya es conocida también por ser exageradamente coqueta con mujeres atractivas, algo que ha resultado en muchos malentendidos y momentos incómodos. Con orgullo suele decir que está "siempre horny on main", y nunca deja pasar la oportunidad de flirtear con alguien. Sin embargo si menciona que este flirteo abierto es "sólo amistoso, entre amigos".
-Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo **Haskell**), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada **Mi Maid Es Un Robot Del Sexo**, basado parcialmente en sus experiencias saliendo con **Maidbot Miyamoto**. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, **El Proyecto Akari**, una historia sobre experimentos de teletransporte y viajes interdimensionales "que no se va a la mierda como el resto". Tras el desastre en las bases de la **UAC** en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, "solo para joder a esos idiotas".
+Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo **Haskell**), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada **Mi Maid Es Un Robot Del Sexo**, basado parcialmente en sus experiencias saliendo con **Meido Miyamoto**. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, **El Proyecto Akari**, una historia sobre experimentos de teletransporte y viajes interdimensionales "que no se va a la mierda como el resto". Tras el desastre en las bases de la **UAC** en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, "solo para joder a esos idiotas".
-Actualmente, Saya tiene tres novias: Maidbot Miyamoto, **Ibuki Miyamoto** y el **Demolicionista**. Todas siendo sus propias creaciones, lo que ha hecho que la gente haga comentarios incestuosos en las redes, contra los que lucha frecuentemente.
+Actualmente, Saya tiene tres novias: Meido Miyamoto, **Ibuki Miyamoto** y el **Demolicionista**. Todas siendo sus propias creaciones, lo que ha hecho que la gente haga comentarios incestuosos en las redes, contra los que lucha frecuentemente.
\cxNotas de Saya:\c-
\cfTe gusta leer sobre mi, ¿verdad? Seguro que sí, tonti. Muy bien, pues aquí tienes mas cosas sobre mí, sólo para ti.\c-
@@ -61,14 +67,17 @@ Actualmente, Saya tiene tres novias: Maidbot Miyamoto, **Ibuki Miyamoto** y el *
\cfAnda, vuelve al trabajo, robotita tontita.\c-
TXT
-\cxNombre Completo:\c-
-\cf Saya Miyamoto\c-
-\cxNacionalidad:\c-
-\cf Japonesa\c-
-\cxFecha de Nacimiento:\c-
-\cf 1993-03-20\c-
-\cxTwitter:\c-
-\cf @AkariSaya\c-
+ \cxNombre Completo:\c-
+ \cf Saya Miyamoto\c-
+ \cxNacionalidad:\c-
+ \cf Japonesa\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1993-03-20\c-
+ \cxOcupación:\c-
+ \cf CTO, Recursos Humanos (Akari Labs)\c-
+ \cxTwitter:\c-
+ \cf @AkariSaya\c-
+
**Saya Miyamoto** nació en 1993, siendo la hija mediana de **Nana Miyamoto** y **Ryuji Miyamoto**, su hermano mayor es **Taro Miyamoto**, nacido en 1985, y su hermana menor es **Yui Miyamoto**, nacida en 2009. Ya de niña, Saya mostraba un interés por la ciencia y tecnología, admirando orgullosa a su padre y sus inventos. Fue una estudiante de sobresaliente, habiendo sido incluso descrita como "niña prodigio". A la sorprendentemente temprana edad de 13 años, habiendo demostrado sus habilidades excepcionales, consiguió entrar en el **MIT**, donde se graduó en **Ciencias de Computación**.
@@ -80,9 +89,9 @@ Saya recibiría frecuentemente el apodo de **No-Tomoko** en las redes, en refere
Saya es conocida también por ser exageradamente coqueta con mujeres atractivas, algo que ha resultado en muchos malentendidos y momentos incómodos. Con orgullo suele decir que está "siempre horny on main", y nunca deja pasar la oportunidad de flirtear con alguien. Sin embargo si menciona que este flirteo abierto es "sólo amistoso, entre amigos".
-Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo **Haskell**), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada **Mi Maid Es Un Robot Del Sexo**, basado parcialmente en sus experiencias saliendo con **Maidbot Miyamoto**. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, **El Proyecto Akari**, una historia sobre experimentos de teletransporte y viajes interdimensionales "que no se va a la mierda como el resto". Tras el desastre en las bases de la **UAC** en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, "solo para joder a esos idiotas".
+Saya tiene muchos hobbies, incluyendo la programación (su lenguaje preferido siendo **Haskell**), coleccionar videojuegos (la mayoría sin jugarlos), dibujar, modelar en 3D y escribir. Su fascinación por el anime y manga la llevó a escribir el suyo propio: una serie de tres volúmenes llamada **Mi Maid Es Un Robot Del Sexo**, basado parcialmente en sus experiencias saliendo con **Meido Miyamoto**. Se hizo tan popular que consiguió tener su propia adaptación al anime años después. Saya también escribió una novela de ciencia ficción, **El Proyecto Akari**, una historia sobre experimentos de teletransporte y viajes interdimensionales "que no se va a la mierda como el resto". Tras el desastre en las bases de la **UAC** en cuanto a teletransporte, anunció que deseaba hacer real el Proyecto Akari, "solo para joder a esos idiotas".
-Actualmente, Saya y sus creaciones Maidbot Miyamoto, **Ibuki Miyamoto** y el **Demolicionista** están todas casadas con **Kirin Xanai**, líder del **Imperio Sykhai** de **Akkou**.
+Actualmente, Saya y sus creaciones Meido Miyamoto, **Ibuki Miyamoto** y el **Demolicionista** están todas casadas con **Kirin Xanai**, líder del **Imperio Sykhai** de **Akkou**.
\cxNotas de Saya:\c-
\cfTe gusta leer sobre mi, ¿verdad? Seguro que sí, tonti. Muy bien, pues aquí tienes mas cosas sobre mí, sólo para ti.\c-
diff --git a/lore/es/taro.txt b/lore/es/taro.txt
index d00a0105f..592567a18 100644
--- a/lore/es/taro.txt
+++ b/lore/es/taro.txt
@@ -1,12 +1,15 @@
TXT
-\cxNombre Completo:\c-
-\cf Taro Miyamoto\c-
-\cxNacionalidad:\c-
-\cf Japonés\c-
-\cxFecha de Nacimiento:\c-
-\cf 1985-10-06\c-
-\cxTwitter:\c-
-\cf @AkariTaro\c-
+ \cxNombre Completo:\c-
+ \cf Taro Miyamoto\c-
+ \cxNacionalidad:\c-
+ \cf Japonés\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1985-10-06\c-
+ \cxOcupación:\c-
+ \cf CEO, Relaciones Públicas (Akari Labs)\c-
+ \cxTwitter:\c-
+ \cf @AkariTaro\c-
+
Nacido en 1985, hijo de **Nana** y **Ryuji Miyamoto**, **Taro** 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 **Saya**, su hermana menor, fundaron **Akari Labs**, 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 cargo de las relaciones públicas, ya que Saya no "tiene mucho don de gentes" a diferencia de él.
diff --git a/lore/es/unissix.txt b/lore/es/unissix.txt
index 536bb0a9a..1b8472008 100644
--- a/lore/es/unissix.txt
+++ b/lore/es/unissix.txt
@@ -1,14 +1,16 @@
TXT
-\cxNombre Completo:\c-
-\cf Misa Azadeku Unissix\c-
-\cxAlias:\c-
-\cf Unissix Bokurou Azadeku\c-
-\cxNacionalidad:\c-
-\cf Devanikan\c-
-\cxFecha de Nacimiento:\c-
-\cf 1992-02-29\c-
-\cxTwitter:\c-
-\cf @misamisa_unissix\c-
+ \cxNombre Completo:\c-
+ \cf Misa Azadeku Unissix\c-
+ \cxAlias:\c-
+ \cf Unissix Bokurou Azadeku\c-
+ \cxNacionalidad:\c-
+ \cf Devanikan\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1992-02-29\c-
+ \cxOcupación:\c-
+ \cf Herrera (Artesanía Unissix)\c-
+ \cxTwitter:\c-
+ \cf @misamisa_unissix\c-
**Misa Azadeku Unissix** es el miembro más joven del **Clan Unissix**, quien lidera la nación de **Devanikna**. Es la segunda hija de **Devai Unissix** y **Serwand Nerukousei**, siendo hermana menor de **Deneva Unissix**, una de las guerreras de mayor renombre de toda la nación.
diff --git a/lore/es/voicebox.txt b/lore/es/voicebox.txt
index dba80f76c..96eca4439 100644
--- a/lore/es/voicebox.txt
+++ b/lore/es/voicebox.txt
@@ -13,4 +13,20 @@ El **Loudboi** es un dispositivo simple y ligero para unidades de IA. Fácil de
La comunidad de **Akari Labs** también ofrece una gran variedad de paquetes de voz personalizados para este dispositivo. Puedes visitar nuestros foros para más información.
\cxNotas de Saya:\c-
-\cfJe... A Ibuki le encanta lo de que programara tu caja de voz para sonar igualita que ella. A ver, es que cuadra un poco, siendo algo como su hermana pequeña, pero lo que me mola a MÍ es que de algún modo le has pillado todas sus chorradillas y tal. Es como si fueses una mini Ibuki a veces, solo que sin pechotes.\c-
+\cfJe... Es que me encanta esa voz tan adorable que tienes, complementa perfectamente esa personalidad tuya tan descarada. Y lo que me mola más es lo rápido que has pillado todas nuestras coletillas y temas, especialmente las de Ibuki. A veces eres como una versión mini suya, solo que sin pechotes.\c-
+TXT
+\cxDesignación\c-
+\cf Caja de Voz Loudboi\c-
+\cxFabricante:\c-
+\cf Akari Labs\c-
+\cxClasificación:\c-
+\cf Sintetizador de Voz\c-
+
+El **Loudboi** es un dispositivo simple y ligero para unidades de IA. Fácil de instalar y programar, perfecto para aquellos que construyen con un presupuesto ajustado. Hay una gran variedad de opciones para el tipo de voz, junto con el soporte de múltiples idiomas, incluyendo el Japonés. Para aquellos que se sientan incómodos con el desconcertante "realismo" de la síntesis de voz por defecto también existe la opción de activar un filtro integrado de "voz robótica".
+
+La comunidad de **Akari Labs** también ofrece una gran variedad de paquetes de voz personalizados para este dispositivo. Puedes visitar nuestros foros para más información.
+
+\cxNotas de Saya:\c-
+\cfJe... Es que me encanta esa voz tan adorable que tienes, complementa perfectamente esa personalidad tuya tan descarada. Y lo que me mola más es lo rápido que has pillado todas nuestras coletillas y temas, especialmente las de Ibuki. A veces eres como una versión mini suya, solo que sin pechotes.\c-
+
+\cfActualización: Y entonces... Vinieron tus verdaderas cuerdas vocales como maidbot, sin filtros ni nada, y mi amor por tu encantadora voz solo pudo aumentar. Se me derrite el corazón solo con oírla, jejeje...\c-
diff --git a/lore/es/whitelady.txt b/lore/es/whitelady.txt
index a8ab0735f..d45c46f5b 100644
--- a/lore/es/whitelady.txt
+++ b/lore/es/whitelady.txt
@@ -1,14 +1,17 @@
TAG
Dama Blanca
TXT
-\cxNombre Completo:\c-
-\cf Andira Kyse\c-
-\cxTítulo:\c-
-\cf Dama Blanca de los Aldabura\c-
-\cxNacionalidad:\c-
-\cf Kantharei\c-
-\cxFecha de Nacimiento:\c-
-\cf 2674 AC\c-
+ \cxNombre Completo:\c-
+ \cf Andira Kyse\c-
+ \cxTítulo:\c-
+ \cf Dama Blanca de los Aldabura\c-
+ \cxNacionalidad:\c-
+ \cf Kantharei\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2674 AC\c-
+ \cxOcupación:\c-
+ \cf Mercenaria\c-
+
La **Dama Blanca de los Aldabura** es uno de los mejores mercenarios conocidos en la **Coalición X'Animen**. Como una de los **Aldabura**, polillas humanoides nativas del pequeño planeta **Kantharo**, es muy sensible a las luces potentes, y es fácilmente encantada por ellas. Al mismo tiempo, es bastante tímida y prefiere centrarse en su trabajo, más que en cualquier interacción social.
diff --git a/lore/es/yui.txt b/lore/es/yui.txt
index faa1aa271..642ffe889 100644
--- a/lore/es/yui.txt
+++ b/lore/es/yui.txt
@@ -1,12 +1,15 @@
TXT
-\cxNombre Completo:\c-
-\cf Yui Miyamoto\c-
-\cxNacionalidad:\c-
-\cf Japonesa\c-
-\cxFecha de Nacimiento:\c-
-\cf 2009-07-02\c-
-\cxTwitter:\c-
-\cf @yuchan09\c-
+ \cxNombre Completo:\c-
+ \cf Yui Miyamoto\c-
+ \cxNacionalidad:\c-
+ \cf Japonesa\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2009-07-02\c-
+ \cxOcupación:\c-
+ \cf Neurocirujana (Hospital Central de Kasukabe)\c-
+ \cxTwitter:\c-
+ \cf @yuchan09\c-
+
Nacida en 2009, hija de **Nana** y **Ryuji Miyamoto**, **Yui** es la más joven de tres hermanos. Es una persona muy sociable y empática, totalmente diferente a sus más solitarios y antisociales hermanos **Saya** y **Taro**, 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 **Hospital Central de Kasukabe**, y ha recibido varios premios por sus logros excepcionales.
diff --git a/lore/es/zanaveth2.txt b/lore/es/zanaveth2.txt
index d5031238f..18b82efec 100644
--- a/lore/es/zanaveth2.txt
+++ b/lore/es/zanaveth2.txt
@@ -1,12 +1,15 @@
TXT
-\cxNombre Completo:\c-
-\cf Zanaveth Nekuraku II\c-
-\cxNacionalidad:\c-
-\cf Nukuri\c-
-\cxFecha de Nacimiento:\c-
-\cf 1969-08-10\c-
-\cxTwitter:\c-
-\cf @purple_emotion\c-
+ \cxNombre Completo:\c-
+ \cf Zanaveth Nekuraku II\c-
+ \cxNacionalidad:\c-
+ \cf Nukuri\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1969-08-10\c-
+ \cxOcupación:\c-
+ \cf CEO, Ingeneriera de IA (Nekuratek)\c-
+ \cf Ministra de Relaciones Interespecie (GUN)\c-
+ \cxTwitter:\c-
+ \cf @purple_emotion\c-
**Zanaveth Nekuraku II** nació en 1969, siendo la hija única de **Zanaveth Nekuraku I** y **Danakorn Kiyanou**. 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.
@@ -31,14 +34,17 @@ Desde la formación del **Gobierno Unificado Nukuri** en 2108, Zanaveth II manti
\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-
TXT
-\cxNombre Completo:\c-
-\cf Zanaveth Nekuraku II\c-
-\cxNacionalidad:\c-
-\cf Nukuri\c-
-\cxFecha de Nacimiento:\c-
-\cf 1969-08-10\c-
-\cxTwitter:\c-
-\cf @purple_emotion\c-
+ \cxNombre Completo:\c-
+ \cf Zanaveth Nekuraku II\c-
+ \cxNacionalidad:\c-
+ \cf Nukuri\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 1969-08-10\c-
+ \cxOcupación:\c-
+ \cf CEO, Ingeneriera de IA (Nekuratek)\c-
+ \cf Ministra de Relaciones Interespecie (GUN)\c-
+ \cxTwitter:\c-
+ \cf @purple_emotion\c-
**Zanaveth Nekuraku II** nació en 1969, siendo la hija única de **Zanaveth Nekuraku I** y **Danakorn Kiyanou**. 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.
diff --git a/lore/es/zanaveth3.txt b/lore/es/zanaveth3.txt
index ea921e71a..2ea18d54f 100644
--- a/lore/es/zanaveth3.txt
+++ b/lore/es/zanaveth3.txt
@@ -1,15 +1,17 @@
TXT
-\cxNombre Completo:\c-
-\cf Zanaveth Nekuraku III\c-
-\cxApodos:\c-
-\cf El Corruptor\c-
-\cf Unissix Bokurou Azadeku II\c-
-\cxNacionalidad:\c-
-\cf Nukuri\c-
-\cxFecha de Nacimiento:\c-
-\cf 2042-08-20\c-
-\cxTwitter:\c-
-\cf @zanaveth\c-
+ \cxNombre Completo:\c-
+ \cf Zanaveth Nekuraku III\c-
+ \cxApodos:\c-
+ \cf El Corruptor\c-
+ \cf Unissix Bokurou Azadeku II\c-
+ \cxNacionalidad:\c-
+ \cf Nukuri\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2042-08-20\c-
+ \cxOcupación:\c-
+ \cf Ingeniera de IA (Nekuratek)\c-
+ \cxTwitter:\c-
+ \cf @zanaveth\c-
**Zanaveth Nekuraku III** es la hija única de **Zanaveth Nekuraku II** y **Misa Azadeku Unissix**. Pasó la mayor parte de su infancia en la Tierra, donde había nacido, aunque ella y su familia tuvieron que mudarse de vuelta a **Nahkami** una vez cumplió los cuatro años, ya que por ley, debía estudiar en un colegio Nukuri. Fue en el colegio donde la joven niña comenzaría a tener problemas notables.
@@ -30,17 +32,19 @@ Durante su estancia en la Tierra, Zanaveth III tuvo un historial notable en rede
\cfBueno, si vuelve a la Tierra, yo por mí aceptaría con los brazos abiertos a mi nueva gran señora chuuni.\c-
TXT
-\cxNombre Completo:\c-
-\cf Zanaveth Nekuraku III\c-
-\cxApodos:\c-
-\cf El Corruptor\c-
-\cf Unissix Bokurou Azadeku II\c-
-\cxNacionalidad:\c-
-\cf Nukuri\c-
-\cxFecha de Nacimiento:\c-
-\cf 2042-08-20\c-
-\cxTwitter:\c-
-\cf @zanaveth\c-
+ \cxNombre Completo:\c-
+ \cf Zanaveth Nekuraku III\c-
+ \cxApodos:\c-
+ \cf El Corruptor\c-
+ \cf Unissix Bokurou Azadeku II\c-
+ \cxNacionalidad:\c-
+ \cf Nukuri\c-
+ \cxFecha de Nacimiento:\c-
+ \cf 2042-08-20\c-
+ \cxOcupación:\c-
+ \cf Ingeniera de IA (Nekuratek)\c-
+ \cxTwitter:\c-
+ \cf @zanaveth\c-
**Zanaveth Nekuraku III** es la hija única de **Zanaveth Nekuraku II** y **Misa Azadeku Unissix**. Pasó la mayor parte de su infancia en la Tierra, donde había nacido, aunque ella y su familia tuvieron que mudarse de vuelta a **Nahkami** una vez cumplió los cuatro años, ya que por ley, debía estudiar en un colegio Nukuri. Fue en el colegio donde la joven niña comenzaría a tener problemas notables.
diff --git a/menudef.txt b/menudef.txt
index cd32773d5..7cdfaca39 100644
--- a/menudef.txt
+++ b/menudef.txt
@@ -73,6 +73,18 @@ OptionValue "SWWMPistolStart"
1, "$SWWM_PISTOLSTART_MAP"
2, "$SWWM_PISTOLSTART_CLUSTER"
}
+OptionValue "SWWMHUDScale"
+{
+ 0, "$SWWM_TFITSCALE"
+ 1, "$SWWM_LFITSCALE"
+}
+OptionValue "SWWMInterArt"
+{
+ 0, "$TXT_NO"
+ 1, "$TXT_YES"
+ 2, "$SWWM_NORENDER"
+ 3, "$SWWM_NOFANART"
+}
OptionMenu "SWWMOptionMenu"
{
Class "SWWMOptionMenu"
@@ -83,11 +95,16 @@ OptionMenu "SWWMOptionMenu"
SafeCommand "$SWWM_ARESET", "event swwmresetachievements"
StaticText " "
- StaticText "$SWWM_PTITLE", "Blue"
+ StaticText "$SWWM_PTITLE", 1
SWWMPlayTime "$SWWM_PLAYTIME", "swwm_playtime"
SWWMVoiceOption "$SWWM_VOICETYPE", "swwm_voicetype"
Option "$SWWM_MUTELEVEL", "swwm_mutevoice", "SWWMVoice"
- Option "$SWWM_6DOF", "swwm_fly6dof", "YesNo"
+ Slider "$SWWM_VOICEAMP", "swwm_voiceamp", 1, 4, 1, 0
+ Option "$SWWM_BEEPBOOP", "swwm_beepboop", "YesNo"
+ IfGame(Heretic, Hexen)
+ {
+ Option "$SWWM_6DOF", "swwm_fly6dof", "YesNo"
+ }
Option "$SWWM_REVIVE", "swwm_revive", "YesNo"
ScaleSliderFix "$SWWM_REVIVECOOLDOWN", "swwm_revivecooldown", -1, 300, 30, "$SWWM_UNLIMITED", "$SWWM_ONERETRY"
Option "$SWWM_MENUPAUSE", "swwm_menupause", "YesNo"
@@ -95,7 +112,7 @@ OptionMenu "SWWMOptionMenu"
Option "$SWWM_SELFLIGHT", "swwm_selflight", "YesNo"
Submenu "$SWWM_ATITLE", "SWWMAchievementMenu"
StaticText " "
- StaticText "$SWWM_OTITLE", "Blue"
+ StaticText "$SWWM_OTITLE", 1
Option "$SWWM_SHADERS", "swwm_shaders", "YesNo"
Slider "$SWWM_FLASH", "swwm_flashstrength", 0.0, 1.0, 0.1, 1
Slider "$SWWM_BUMP", "swwm_bumpstrength", 0.0, 1.0, 0.1, 1
@@ -118,31 +135,44 @@ OptionMenu "SWWMOptionMenu"
Option "$SWWM_ACCDAMAGE", "swwm_accdamage", "YesNo"
Option "$SWWM_SCORENUMS", "swwm_scorenums", "YesNo"
Option "$SWWM_SCOREBONUS", "swwm_scorebonus", "YesNo"
- Option "$SWWM_POIS", "swwm_pois", "YesNo"
+ IfGame(Doom, Heretic)
+ {
+ Option "$SWWM_POIS", "swwm_pois", "YesNo"
+ }
Option "$SWWM_NOMAPMSG", "swwm_nomapmsg", "NoYes"
ScaleSlider "$SWWM_MAXTARGETDIST", "swwm_maxtargetdist", 0, 6000, 100, "$SWWM_UNLIMITED"
ScaleSlider "$SWWM_MAXTARGETS", "swwm_maxtargets", 0, 1000, 1, "$SWWM_UNLIMITED"
ScaleSlider "$SWWM_MAXDAMNUMS", "swwm_maxdamnums", 0, 1000, 1, "$SWWM_UNLIMITED"
ScaleSlider "$SWWM_MAXSCORENUMS", "swwm_maxscorenums", 0, 1000, 1, "$SWWM_UNLIMITED"
- ScaleSlider "$SWWM_HUDSCALE", "swwm_hudscale", 0, 8, 1, "$SWWM_GZSCALE"
- ScaleSlider "$SWWM_BARSCALE", "swwm_barscale", 0, 8, 1, "$SWWM_GZSCALE"
- ScaleSlider "$SWWM_NUMSCALE", "swwm_numscale", 0, 8, 1, "$SWWM_GZSCALE"
- ScaleSlider "$SWWM_SCRSCALE", "swwm_scrscale", 0, 8, 1, "$SWWM_GZSCALE"
- ScaleSlider "$SWWM_POISCALE", "swwm_poiscale", 0, 8, 1, "$SWWM_GZSCALE"
- ScaleSlider "$SWWM_DETSCALE", "swwm_detscale", 0, 8, 1, "$SWWM_GZSCALE"
+ Option "$SWWM_HUDSCALE", "swwm_hudscale", "SWWMHudScale"
+ Slider "$SWWM_BARSCALE", "swwm_barscalerel", -4, 4, 1, 0
+ Slider "$SWWM_NUMSCALE", "swwm_numscalerel", -4, 4, 1, 0
+ Slider "$SWWM_SCRSCALE", "swwm_scrscalerel", -4, 4, 1, 0
+ IfGame(Doom, Heretic)
+ {
+ Slider "$SWWM_POISCALE", "swwm_poiscalerel", -4, 4, 1, 0
+ }
+ Slider "$SWWM_DETSCALE", "swwm_detscalerel", -4, 4, 1, 0
Option "$SWWM_NUMCOLOR_SCR", "swwm_numcolor_scr", "TextColors"
Option "$SWWM_NUMCOLOR_BONUS", "swwm_numcolor_bonus", "TextColors"
Option "$SWWM_NUMCOLOR_DMG", "swwm_numcolor_dmg", "TextColors"
Option "$SWWM_NUMCOLOR_HP", "swwm_numcolor_hp", "TextColors"
Option "$SWWM_NUMCOLOR_AP", "swwm_numcolor_ap", "TextColors"
- Option "$SWWM_INTERART", "swwm_interart", "YesNo"
- Option "$SWWM_NOINTERTIPS", "swwm_nointertips", "YesNo"
- Option "$SWWM_INTERMUSIC", "swwm_intermusic", "YesNo"
+ IfGame(Doom, Heretic)
+ {
+ Option "$SWWM_INTERART", "swwm_interart", "SWWMInterArt"
+ Option "$SWWM_NOINTERTIPS", "swwm_nointertips", "YesNo"
+ Option "$SWWM_INTERMUSIC", "swwm_intermusic", "YesNo"
+ }
Option "$SWWM_FUZZ", "swwm_fuzz", "YesNo"
- Option "$SWWM_SILENCEMAP", "swwm_silencemap", "YesNo"
+ Option "$SWWM_OLDLOGO", "swwm_oldlogo", "YesNo"
+ IfGame(Doom, Heretic)
+ {
+ Option "$SWWM_SILENCEMAP", "swwm_silencemap", "YesNo"
+ }
Option "$SWWM_FILTERACHIEVEMENTS", "swwm_filterachievements", "SWWMFilterAchievements"
StaticText " "
- StaticText "$SWWM_ETITLE", "Blue"
+ StaticText "$SWWM_ETITLE", 1
Option "$SWWM_SHADOWS", "swwm_shadows", "YesNo"
ScaleSlider "$SWWM_SHADOWDIST", "swwm_shadowdist", -1, 4000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
Option "$SWWM_ITEMSPARKLES", "swwm_itemsparkles", "YesNo"
@@ -155,7 +185,7 @@ OptionMenu "SWWMOptionMenu"
ScaleSlider "$SWWM_MAXDEBRIS", "swwm_maxdebris", -1, 1000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
SafeCommand "$SWWM_CLEARFX", "netevent swwmcleareffects"
StaticText " "
- StaticText "$SWWM_FTITLE", "Blue"
+ StaticText "$SWWM_FTITLE", 1
Option "$SWWM_FUNTAGS", "swwm_funtags", "YesNo"
Option "$SWWM_BUTTSFX", "swwm_buttsfx", "YesNo"
Option "$SWWM_OMNIBUST", "swwm_omnibust", "YesNo"
@@ -165,17 +195,21 @@ OptionMenu "SWWMOptionMenu"
Option "$SWWM_FUNTRAILS", "swwm_funtrails", "SWWMFunTrails"
TrapOption "$SWWM_ENGINE", "swwm_engine"
StaticText " "
- StaticText "$SWWM_BTITLE", "Blue"
+ StaticText "$SWWM_BTITLE", 1
Option "$SWWM_PS_FULLRESET", "swwm_ps_fullreset", "SWWMPistolStart"
Option "$SWWM_PS_RESETAMMO", "swwm_ps_resetammo", "SWWMPistolStart"
Option "$SWWM_PS_RESETITEMS", "swwm_ps_resetitems", "SWWMPistolStart"
Option "$SWWM_PS_RESETHEALTH", "swwm_ps_resethealth", "SWWMPistolStart"
+ Option "$SWWM_NODEATHEXIT", "swwm_nodeathexit", "YesNo"
Option "$SWWM_ENEMYDROPS", "swwm_enemydrops", "SWWMEnemyDropType"
Option "$SWWM_ONDEMANDAMMO", "swwm_ondemandammo", "YesNo"
Option "$SWWM_RESETSCORE", "swwm_resetscore", "YesNo"
Option "$SWWM_EXTRAALERT", "swwm_extraalert", "YesNo"
Option "$SWWM_BOSSENHANCE", "swwm_upgradebosses", "YesNo"
- Option "$SWWM_DOOMFALL", "swwm_doomfall", "YesNo"
+ IfGame(Doom, Heretic)
+ {
+ Option "$SWWM_DOOMFALL", "swwm_doomfall", "YesNo"
+ }
Option "$SWWM_BALLUSE", "swwm_balluse", "YesNo"
Option "$SWWM_CBTALL", "swwm_cbtall", "YesNo"
Option "$SWWM_UNCAPALERT", "swwm_uncapalert", "YesNo"
@@ -187,12 +221,15 @@ OptionMenu "SWWMOptionMenu"
Option "$SWWM_STRICTUNTOUCHABLE", "swwm_strictuntouchable", "SWWMUntouchableStrictness"
//Option "$SWWM_SWAPWEAPONS", "swwm_swapweapons", "YesNo" // comment out until DLC1
StaticText " "
- StaticText "$SWWM_ITITLE", "Blue"
+ StaticText "$SWWM_ITITLE", 1
Option "$SWWM_USETOPICKUP", "swwm_usetopickup", "YesNo"
Option "$SWWM_MELEEPICKUP", "swwm_meleepickup", "YesNo"
Option "$SWWM_ARMORUSE", "swwm_autousearmor", "YesNo"
Option "$SWWM_HEALTHUSE", "swwm_autousehealth", "YesNo"
- Option "$SWWM_BARRIERUSE", "swwm_autousebarrier", "YesNo"
+ IfGame(Doom)
+ {
+ Option "$SWWM_BARRIERUSE", "swwm_autousebarrier", "YesNo"
+ }
Option "$SWWM_SINGLEFIRST", "swwm_singlefirst", "YesNo"
Option "$SWWM_EARBUSTER", "swwm_earbuster", "YesNo"
Option "$SWWM_BUSTERPAUSE", "swwm_cbtpause", "YesNo"
@@ -201,22 +238,12 @@ OptionMenu "SWWMOptionMenu"
Option "$SWWM_WEAPONTOOLTIPS", "swwm_weapontooltips", "YesNo"
SafeCommand "$SWWM_RESETTOOLTIPS", "event swwmresettooltips"
StaticText " "
- StaticText "$SWWM_CTITLE", "Blue"
- Option "$SWWM_SKEYS", "swwm_sharekeys", "YesNo"
- Option "$SWWM_SVARMORUSE", "swwm_enforceautousearmor", "SWWMEnforce"
- Option "$SWWM_SVHEALTHUSE", "swwm_enforceautousehealth", "SWWMEnforce"
- Option "$SWWM_SVBARRIERUSE", "swwm_enforceautousebarrier", "SWWMEnforce"
- Option "$SWWM_OTHERVOICE", "swwm_othervoice", "YesNo"
- StaticText " "
- StaticText "$SWWM_MCTITLE", "Blue"
+ StaticText "$SWWM_MCTITLE", 1
Option "$SWWM_LDSPOIL", "swwm_ldspoil", "YesNo"
IfGame(Doom)
{
Option "$SWWM_DRLASKILL", "swwm_drlaskill", "SWWMDRLASkill"
}
- StaticText " "
- StaticText " "
-
}
OptionValue "SWWMMinimapColorset"
{
@@ -282,7 +309,7 @@ ListMenu "MainMenu"
{
Class "SWWMMainMenu"
Size Clean
- Font "TewiShadedOutline", "White", "Sapphire"
+ Font "BigFont", "White", "Sapphire"
Selector "graphics/DemoIcon.png", -24, 0
LineSpacing 36
SWWMLogo
@@ -297,7 +324,7 @@ ListMenu "MainMenuTextOnly"
{
Class "SWWMMainMenu"
Size Clean
- Font "TewiShadedOutline", "White", "Sapphire"
+ Font "BigFont", "White", "Sapphire"
Selector "graphics/DemoIcon.png", -24, 0
LineSpacing 36
SWWMLogo
@@ -312,7 +339,7 @@ ListMenu "GameFilesMenu"
{
Class "SWWMCleanMenu"
Size Clean
- Font "TewiShadedOutline", "White", "Sapphire"
+ Font "BigFont", "White", "Sapphire"
Selector "graphics/DemoIcon.png", -24, 0
LineSpacing 36
Position 0, 88
@@ -331,7 +358,7 @@ ListMenu "EpisodeMenu"
{
NetgameMessage "$CNEWGAME"
}
- Font "TewiShadedOutline", "White", "Sapphire"
+ Font "BigFont", "White", "Sapphire"
Selector "graphics/DemoIcon.png", -24, 0
LineSpacing 0
SWWMStaticTextM 0, 0, "$MNU_EPISODE", "Blue"
@@ -342,7 +369,7 @@ ListMenu "SkillMenu"
{
Class "SWWMBigMenuHack"
Size Clean
- Font "TewiShadedOutline", "White", "Sapphire"
+ Font "BigFont", "White", "Sapphire"
Selector "graphics/DemoIcon.png", -24, 0
LineSpacing 0
SWWMStaticTextM 0, 0, "$MNU_CHOOSESKILL", "Blue"
diff --git a/modeldef.blackfire b/modeldef.blackfire
deleted file mode 100644
index 600baa7cc..000000000
--- a/modeldef.blackfire
+++ /dev/null
@@ -1,13 +0,0 @@
-Model "BlackfireIgniter"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.05 0.05 0.05
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
diff --git a/modeldef.demolitionist b/modeldef.demolitionist
index d9a42de62..6d63ded14 100644
--- a/modeldef.demolitionist
+++ b/modeldef.demolitionist
@@ -578,19 +578,14 @@ Model "Demolitionist"
}
// Voodoo Doll
-Model "Demolitionist"
+Model "SWWMVoodooDoll"
{
Path "models"
- Model 1 "DemolitionistDoll_d.3d"
- SurfaceSkin 1 0 "DemoTags.png"
- SurfaceSkin 1 1 "DemoFace_Dead.png"
- SurfaceSkin 1 2 "DemoBody.png"
- SurfaceSkin 1 3 "DemoHead.png"
- SurfaceSkin 1 4 "DemoArms.png"
- SurfaceSkin 1 5 "DemoLegs.png"
- SurfaceSkin 1 6 "DemoSoft.png"
- SurfaceSkin 1 7 "DemoMisc.png"
+ Model 1 "VoodooDoll_d.3d"
+ SurfaceSkin 1 0 "VoodooDoll.png"
+ SurfaceSkin 1 1 "VoodooDollFace.png"
Scale 0.0025 0.0025 0.0025
+ AngleOffset -90
IGNORETRANSLATION
// Still
@@ -605,24 +600,14 @@ Model "Demolitionist"
FrameIndex XZWZ G 1 8
FrameIndex XZWZ H 1 9
FrameIndex XZWZ I 1 10
- SurfaceSkin 1 1 "DemoFace_Off.png"
FrameIndex XZWZ J 1 11
- SurfaceSkin 1 1 "DemoFace_Dead.png"
FrameIndex XZWZ K 1 12
- SurfaceSkin 1 1 "DemoFace_Off.png"
FrameIndex XZWZ L 1 13
FrameIndex XZWZ M 1 14
- SurfaceSkin 1 1 "DemoFace_Dead.png"
FrameIndex XZWZ N 1 15
- SurfaceSkin 1 1 "DemoFace_Off.png"
FrameIndex XZWZ O 1 16
- SurfaceSkin 1 1 "DemoFace_Dead.png"
FrameIndex XZWZ P 1 17
- SurfaceSkin 1 1 "DemoFace_Off.png"
FrameIndex XZWZ Q 1 18
- SurfaceSkin 1 1 "DemoFace_Dead.png"
FrameIndex XZWZ R 1 19
- SurfaceSkin 1 1 "DemoFace_Off.png"
FrameIndex XZWZ S 1 20
- SurfaceSkin 1 1 "DemoFace_Dead.png"
}
diff --git a/modeldef.dlcammo b/modeldef.dlcammo
index ecd31cfc0..832ceb53a 100644
--- a/modeldef.dlcammo
+++ b/modeldef.dlcammo
@@ -3,7 +3,7 @@ Model "SMW05Ammo"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.02 0.02 0.02
ZOffset 16
PitchOffset 30
@@ -16,7 +16,7 @@ Model "SMW05Ammo2"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.02 0.02 0.02
ZOffset 16
PitchOffset 30
@@ -29,7 +29,7 @@ Model "SMW05Ammo3"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.02 0.02 0.02
ZOffset 16
PitchOffset 30
@@ -42,7 +42,7 @@ Model "SMW05SmallAmmo"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.025 0.025 0.025
ZOffset 16
PitchOffset 30
@@ -55,7 +55,7 @@ Model "SMW05BigAmmo"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.03 0.03 0.03
ZOffset 16
PitchOffset 30
@@ -69,7 +69,7 @@ Model "SheenAmmo"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.015 0.015 0.015
ZOffset 16
PitchOffset 30
@@ -82,7 +82,7 @@ Model "SheenAmmo2"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.015 0.015 0.015
ZOffset 16
PitchOffset 30
@@ -95,7 +95,7 @@ Model "SheenAmmo3"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.015 0.015 0.015
ZOffset 16
PitchOffset 30
@@ -108,7 +108,7 @@ Model "SheenTinyAmmo"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.02 0.02 0.02
ZOffset 16
PitchOffset 30
@@ -121,7 +121,7 @@ Model "SheenSmallAmmo"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.025 0.025 0.025
ZOffset 16
PitchOffset 30
@@ -134,7 +134,7 @@ Model "SheenBigAmmo"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.03 0.03 0.03
ZOffset 16
PitchOffset 30
@@ -148,7 +148,7 @@ Model "QuadravolAmmo"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.025 0.025 0.025
ZOffset 16
PitchOffset 30
@@ -161,7 +161,7 @@ Model "QuadravolAmmo2"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.025 0.025 0.025
ZOffset 16
PitchOffset 30
@@ -174,7 +174,7 @@ Model "QuadravolAmmo3"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.025 0.025 0.025
ZOffset 16
PitchOffset 30
@@ -183,12 +183,156 @@ Model "QuadravolAmmo3"
FrameIndex XZW1 A 0 0
}
-Model "DarkCanister"
+Model "SparksterBAmmo"
{
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
+ Scale 0.025 0.025 0.025
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+Model "SparksterBAmmo2"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
+ Scale 0.025 0.025 0.025
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+Model "SparksterBAmmo3"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
+ Scale 0.025 0.025 0.025
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+Model "SparksterRAmmo"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
+ Scale 0.025 0.025 0.025
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+Model "SparksterRAmmo2"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
+ Scale 0.025 0.025 0.025
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+Model "SparksterRAmmo3"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
+ Scale 0.025 0.025 0.025
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+
+Model "MisterRound"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
+ Scale 0.02 0.02 0.02
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+Model "MisterRound2"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
+ Scale 0.02 0.02 0.02
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+Model "MisterRound3"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
+ Scale 0.02 0.02 0.02
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+Model "MisterRound5"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
+ Scale 0.02 0.02 0.02
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+Model "MisterRound10"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
+ Scale 0.02 0.02 0.02
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+Model "MisterAmmo"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
Scale 0.03 0.03 0.03
ZOffset 16
PitchOffset 30
@@ -196,13 +340,25 @@ Model "DarkCanister"
FrameIndex XZW1 A 0 0
}
-
-Model "EMPCore"
+Model "MisterGAmmo"
{
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
+ Scale 0.02 0.02 0.02
+ ZOffset 16
+ PitchOffset 30
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
+Model "MisterGAmmo2"
+{
+ Path "models/extra"
+
+ Model 0 "BaseCube_d.3d"
+ Skin 0 "CHIPTILY"
Scale 0.025 0.025 0.025
ZOffset 16
PitchOffset 30
@@ -210,13 +366,13 @@ Model "EMPCore"
FrameIndex XZW1 A 0 0
}
-Model "EMPCore2"
+Model "MisterGAmmo3"
{
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.025 0.025 0.025
+ Skin 0 "CHIPTILY"
+ Scale 0.03 0.03 0.03
ZOffset 16
PitchOffset 30
ROTATING
@@ -229,7 +385,7 @@ Model "RayBolt"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.025 0.025 0.025
ZOffset 16
PitchOffset 30
@@ -242,7 +398,7 @@ Model "RayBolt2"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.025 0.025 0.025
ZOffset 16
PitchOffset 30
@@ -255,7 +411,7 @@ Model "RayBolt5"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.025 0.025 0.025
ZOffset 16
PitchOffset 30
@@ -268,7 +424,7 @@ Model "RayAmmo"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.04 0.04 0.04
ZOffset 16
PitchOffset 30
@@ -281,7 +437,7 @@ Model "RayBattery"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.035 0.035 0.035
ZOffset 16
PitchOffset 30
@@ -290,12 +446,12 @@ Model "RayBattery"
FrameIndex XZW1 A 0 0
}
-Model "GrandSpear"
+Model "UltimatePod"
{
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.03 0.03 0.03
ZOffset 16
PitchOffset 30
@@ -303,12 +459,12 @@ Model "GrandSpear"
FrameIndex XZW1 A 0 0
}
-Model "GrandAmmo"
+Model "UltimateAmmo"
{
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILY"
Scale 0.04 0.04 0.04
ZOffset 16
PitchOffset 30
diff --git a/modeldef.dlcammo2 b/modeldef.dlcammo2
deleted file mode 100644
index ba7193c0b..000000000
--- a/modeldef.dlcammo2
+++ /dev/null
@@ -1,223 +0,0 @@
-Model "SparksterBAmmo"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.025 0.025 0.025
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "SparksterBAmmo2"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.025 0.025 0.025
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "SparksterBAmmo3"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.025 0.025 0.025
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "SparksterRAmmo"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.025 0.025 0.025
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "SparksterRAmmo2"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.025 0.025 0.025
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "SparksterRAmmo3"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.025 0.025 0.025
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-
-Model "MisterRound"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.02 0.02 0.02
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "MisterRound2"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.02 0.02 0.02
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "MisterRound3"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.02 0.02 0.02
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "MisterRound5"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.02 0.02 0.02
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "MisterRound10"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.02 0.02 0.02
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "MisterAmmo"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.03 0.03 0.03
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "MisterGAmmo"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.02 0.02 0.02
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "MisterGAmmo2"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.025 0.025 0.025
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "MisterGAmmo3"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.03 0.03 0.03
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-
-Model "UltimatePod"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.03 0.03 0.03
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
-Model "UltimateAmmo"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.04 0.04 0.04
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
diff --git a/modeldef.empcarbine b/modeldef.empcarbine
deleted file mode 100644
index 320c976d4..000000000
--- a/modeldef.empcarbine
+++ /dev/null
@@ -1,13 +0,0 @@
-Model "EMPCarbine"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.05 0.05 0.05
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
diff --git a/modeldef.explodiumgun2 b/modeldef.explodiumgun2
index 91faa2578..3779c0385 100644
--- a/modeldef.explodiumgun2
+++ b/modeldef.explodiumgun2
@@ -99,68 +99,59 @@ Model "DualExplodiumGun"
FrameIndex XZW2 R 1 22
FrameIndex XZW2 S 1 23
// Reload (Part 1)
- FrameIndex XZW2 T 1 25
- FrameIndex XZW2 U 1 26
- FrameIndex XZW2 V 1 27
- FrameIndex XZW2 W 1 28
- FrameIndex XZW2 X 1 29
- FrameIndex XZW2 Y 1 30
- FrameIndex XZW2 Z 1 31
- FrameIndex XZW3 A 1 32
- FrameIndex XZW3 B 1 33
- FrameIndex XZW3 C 1 34
- FrameIndex XZW3 D 1 35
- FrameIndex XZW3 E 1 36
- FrameIndex XZW3 F 1 37
- FrameIndex XZW3 G 1 38
- FrameIndex XZW3 H 1 39
- FrameIndex XZW3 I 1 40
+ FrameIndex XZW2 T 1 310
+ FrameIndex XZW2 U 1 311
+ FrameIndex XZW2 V 1 312
+ FrameIndex XZW2 W 1 313
+ FrameIndex XZW2 X 1 314
+ FrameIndex XZW2 Y 1 315
+ FrameIndex XZW2 Z 1 316
+ FrameIndex XZW3 A 1 317
+ FrameIndex XZW3 B 1 318
+ FrameIndex XZW3 C 1 319
+ FrameIndex XZW3 D 1 320
+ FrameIndex XZW3 E 1 321
+ FrameIndex XZW3 F 1 322
+ FrameIndex XZW3 G 1 323
+ FrameIndex XZW3 H 1 324
// Reload (Part 1 w/ Empty Mag)
- SurfaceSkin 1 5 "ExplodiumGun_EmptyMag.png" // empty mag
- FrameIndex XZW3 J 1 25
- FrameIndex XZW3 K 1 26
- FrameIndex XZW3 L 1 27
- FrameIndex XZW3 M 1 28
- FrameIndex XZW3 N 1 29
- FrameIndex XZW3 O 1 30
- FrameIndex XZW3 P 1 31
- FrameIndex XZW3 Q 1 32
- FrameIndex XZW3 R 1 33
- FrameIndex XZW3 S 1 34
- FrameIndex XZW3 T 1 35
- FrameIndex XZW3 U 1 36
- FrameIndex XZW3 V 1 37
- FrameIndex XZW3 W 1 38
- FrameIndex XZW3 X 1 39
- FrameIndex XZW3 Y 1 40
+ SurfaceSkin 1 3 "ExplodiumGun_EmptyMag.png"
+ FrameIndex XZW3 I 1 310
+ FrameIndex XZW3 J 1 311
+ FrameIndex XZW3 K 1 312
+ FrameIndex XZW3 L 1 313
+ FrameIndex XZW3 M 1 314
+ FrameIndex XZW3 N 1 315
+ FrameIndex XZW3 O 1 316
+ FrameIndex XZW3 P 1 317
+ FrameIndex XZW3 Q 1 318
+ FrameIndex XZW3 R 1 319
+ FrameIndex XZW3 S 1 320
+ FrameIndex XZW3 T 1 321
+ FrameIndex XZW3 U 1 322
+ FrameIndex XZW3 V 1 323
+ FrameIndex XZW3 W 1 324
// Reload (Part 2)
- SurfaceSkin 1 5 "" // hide mag
- SurfaceSkin 1 6 "ExplodiumGun.png" // show new mag
- FrameIndex XZW3 Z 1 41
- FrameIndex XZW4 A 1 42
- FrameIndex XZW4 B 1 43
- FrameIndex XZW4 C 1 44
- FrameIndex XZW4 D 1 45
- FrameIndex XZW4 E 1 46
- FrameIndex XZW4 F 1 47
- FrameIndex XZW4 G 1 48
- SurfaceSkin 1 6 "" // hide new mag
- FrameIndex XZW4 H 1 49
- FrameIndex XZW4 I 1 50
- FrameIndex XZW4 J 1 51
- SurfaceSkin 1 5 "ExplodiumGun.png" // show mag
- FrameIndex XZW4 K 1 52
- FrameIndex XZW4 L 1 53
- FrameIndex XZW4 M 1 54
- FrameIndex XZW4 N 1 55
- FrameIndex XZW4 O 1 56
- FrameIndex XZW4 P 1 57
- FrameIndex XZW4 Q 1 58
- FrameIndex XZW4 R 1 59
- FrameIndex XZW4 S 1 60
- FrameIndex XZW4 T 1 61
- FrameIndex XZW4 U 1 62
- FrameIndex XZW4 V 1 63
+ SurfaceSkin 1 3 "ExplodiumGun.png"
+ FrameIndex XZW3 X 1 325
+ FrameIndex XZW3 Y 1 326
+ FrameIndex XZW3 Z 1 327
+ FrameIndex XZW4 A 1 328
+ FrameIndex XZW4 B 1 329
+ FrameIndex XZW4 C 1 330
+ FrameIndex XZW4 D 1 331
+ FrameIndex XZW4 E 1 332
+ FrameIndex XZW4 F 1 333
+ FrameIndex XZW4 G 1 334
+ FrameIndex XZW4 H 1 335
+ FrameIndex XZW4 I 1 336
+ FrameIndex XZW4 J 1 337
+ FrameIndex XZW4 K 1 338
+ FrameIndex XZW4 L 1 339
+ FrameIndex XZW4 M 1 340
+ FrameIndex XZW4 N 1 341
+ FrameIndex XZW4 O 1 342
+ FrameIndex XZW4 P 1 343
// Slide
FrameIndex XZW4 W 1 65
FrameIndex XZW4 X 1 66
@@ -251,68 +242,59 @@ Model "DualExplodiumGun"
FrameIndex XZWB R 1 22
FrameIndex XZWB S 1 23
// Reload (Part 1)
- FrameIndex XZWB T 1 25
- FrameIndex XZWB U 1 26
- FrameIndex XZWB V 1 27
- FrameIndex XZWB W 1 28
- FrameIndex XZWB X 1 29
- FrameIndex XZWB Y 1 30
- FrameIndex XZWB Z 1 31
- FrameIndex XZWC A 1 32
- FrameIndex XZWC B 1 33
- FrameIndex XZWC C 1 34
- FrameIndex XZWC D 1 35
- FrameIndex XZWC E 1 36
- FrameIndex XZWC F 1 37
- FrameIndex XZWC G 1 38
- FrameIndex XZWC H 1 39
- FrameIndex XZWC I 1 40
+ FrameIndex XZWB T 1 310
+ FrameIndex XZWB U 1 311
+ FrameIndex XZWB V 1 312
+ FrameIndex XZWB W 1 313
+ FrameIndex XZWB X 1 314
+ FrameIndex XZWB Y 1 315
+ FrameIndex XZWB Z 1 316
+ FrameIndex XZWC A 1 317
+ FrameIndex XZWC B 1 318
+ FrameIndex XZWC C 1 319
+ FrameIndex XZWC D 1 320
+ FrameIndex XZWC E 1 321
+ FrameIndex XZWC F 1 322
+ FrameIndex XZWC G 1 323
+ FrameIndex XZWC H 1 324
// Reload (Part 1 w/ Empty Mag)
- SurfaceSkin 1 5 "ExplodiumGun_EmptyMag.png" // empty mag
- FrameIndex XZWC J 1 25
- FrameIndex XZWC K 1 26
- FrameIndex XZWC L 1 27
- FrameIndex XZWC M 1 28
- FrameIndex XZWC N 1 29
- FrameIndex XZWC O 1 30
- FrameIndex XZWC P 1 31
- FrameIndex XZWC Q 1 32
- FrameIndex XZWC R 1 33
- FrameIndex XZWC S 1 34
- FrameIndex XZWC T 1 35
- FrameIndex XZWC U 1 36
- FrameIndex XZWC V 1 37
- FrameIndex XZWC W 1 38
- FrameIndex XZWC X 1 39
- FrameIndex XZWC Y 1 40
+ SurfaceSkin 1 3 "ExplodiumGun_EmptyMag.png"
+ FrameIndex XZWC I 1 310
+ FrameIndex XZWC J 1 311
+ FrameIndex XZWC K 1 312
+ FrameIndex XZWC L 1 313
+ FrameIndex XZWC M 1 314
+ FrameIndex XZWC N 1 315
+ FrameIndex XZWC O 1 316
+ FrameIndex XZWC P 1 317
+ FrameIndex XZWC Q 1 318
+ FrameIndex XZWC R 1 319
+ FrameIndex XZWC S 1 320
+ FrameIndex XZWC T 1 321
+ FrameIndex XZWC U 1 322
+ FrameIndex XZWC V 1 323
+ FrameIndex XZWC W 1 324
// Reload (Part 2)
- SurfaceSkin 1 5 "" // hide mag
- SurfaceSkin 1 6 "ExplodiumGun.png" // show new mag
- FrameIndex XZWC Z 1 41
- FrameIndex XZWD A 1 42
- FrameIndex XZWD B 1 43
- FrameIndex XZWD C 1 44
- FrameIndex XZWD D 1 45
- FrameIndex XZWD E 1 46
- FrameIndex XZWD F 1 47
- FrameIndex XZWD G 1 48
- SurfaceSkin 1 6 "" // hide new mag
- FrameIndex XZWD H 1 49
- FrameIndex XZWD I 1 50
- FrameIndex XZWD J 1 51
- SurfaceSkin 1 5 "ExplodiumGun.png" // show mag
- FrameIndex XZWD K 1 52
- FrameIndex XZWD L 1 53
- FrameIndex XZWD M 1 54
- FrameIndex XZWD N 1 55
- FrameIndex XZWD O 1 56
- FrameIndex XZWD P 1 57
- FrameIndex XZWD Q 1 58
- FrameIndex XZWD R 1 59
- FrameIndex XZWD S 1 60
- FrameIndex XZWD T 1 61
- FrameIndex XZWD U 1 62
- FrameIndex XZWD V 1 63
+ SurfaceSkin 1 3 "ExplodiumGun.png"
+ FrameIndex XZWC X 1 325
+ FrameIndex XZWC Y 1 326
+ FrameIndex XZWC Z 1 327
+ FrameIndex XZWD A 1 328
+ FrameIndex XZWD B 1 329
+ FrameIndex XZWD C 1 330
+ FrameIndex XZWD D 1 331
+ FrameIndex XZWD E 1 332
+ FrameIndex XZWD F 1 333
+ FrameIndex XZWD G 1 334
+ FrameIndex XZWD H 1 335
+ FrameIndex XZWD I 1 336
+ FrameIndex XZWD J 1 337
+ FrameIndex XZWD K 1 338
+ FrameIndex XZWD L 1 339
+ FrameIndex XZWD M 1 340
+ FrameIndex XZWD N 1 341
+ FrameIndex XZWD O 1 342
+ FrameIndex XZWD P 1 343
// Slide
FrameIndex XZWD W 1 65
FrameIndex XZWD X 1 66
@@ -425,58 +407,43 @@ Model "DualExplodiumGun"
// Still
FrameIndex XZWI V 1 248
// Reload (Part 1)
- SurfaceSkin 1 5 "ExplodiumGun_EmptyMag.png" // empty mag
- FrameIndex XZWI W 1 249
- FrameIndex XZWI X 1 250
- FrameIndex XZWI Y 1 251
- FrameIndex XZWI Z 1 252
- FrameIndex XZWJ A 1 253
- FrameIndex XZWJ B 1 254
- FrameIndex XZWJ C 1 255
- FrameIndex XZWJ D 1 256
- FrameIndex XZWJ E 1 257
- FrameIndex XZWJ F 1 258
- FrameIndex XZWJ G 1 259
- FrameIndex XZWJ H 1 260
- FrameIndex XZWJ I 1 261
- FrameIndex XZWJ J 1 262
- FrameIndex XZWJ K 1 263
- FrameIndex XZWJ L 1 264
+ SurfaceSkin 1 3 "ExplodiumGun_EmptyMag.png"
+ FrameIndex XZWI W 1 346
+ FrameIndex XZWI X 1 347
+ FrameIndex XZWI Y 1 348
+ FrameIndex XZWI Z 1 349
+ FrameIndex XZWJ A 1 350
+ FrameIndex XZWJ B 1 351
+ FrameIndex XZWJ C 1 352
+ FrameIndex XZWJ D 1 353
+ FrameIndex XZWJ E 1 354
+ FrameIndex XZWJ F 1 355
+ FrameIndex XZWJ G 1 356
+ FrameIndex XZWJ H 1 357
+ FrameIndex XZWJ I 1 358
+ FrameIndex XZWJ J 1 359
+ FrameIndex XZWJ K 1 360
// Reload (Part 2)
- SurfaceSkin 1 5 "" // hide mag
- SurfaceSkin 1 6 "ExplodiumGun.png" // show new mag
- FrameIndex XZWJ M 1 265
- FrameIndex XZWJ N 1 266
- FrameIndex XZWJ O 1 267
- FrameIndex XZWJ P 1 268
- FrameIndex XZWJ Q 1 269
- FrameIndex XZWJ R 1 270
- FrameIndex XZWJ S 1 271
- FrameIndex XZWJ T 1 272
- SurfaceSkin 1 6 "" // hide new mag
- FrameIndex XZWJ U 1 273
- FrameIndex XZWJ V 1 274
- FrameIndex XZWJ W 1 275
- SurfaceSkin 1 5 "ExplodiumGun.png" // show mag
- FrameIndex XZWJ X 1 276
- FrameIndex XZWJ Y 1 277
- FrameIndex XZWJ Z 1 278
- FrameIndex XZWK A 1 279
- FrameIndex XZWK B 1 280
- FrameIndex XZWK C 1 281
- FrameIndex XZWK D 1 282
- FrameIndex XZWK E 1 283
- FrameIndex XZWK F 1 284
- FrameIndex XZWK G 1 285
- FrameIndex XZWK H 1 286
- FrameIndex XZWK I 1 287
- FrameIndex XZWK J 1 288
- FrameIndex XZWK K 1 289
- FrameIndex XZWK L 1 290
- FrameIndex XZWK M 1 291
- FrameIndex XZWK N 1 292
- FrameIndex XZWK O 1 293
- FrameIndex XZWK P 1 294
+ FrameIndex XZWJ L 1 361
+ FrameIndex XZWJ M 1 362
+ FrameIndex XZWJ N 1 363
+ FrameIndex XZWJ O 1 364
+ FrameIndex XZWJ P 1 365
+ FrameIndex XZWJ Q 1 366
+ FrameIndex XZWJ R 1 367
+ FrameIndex XZWJ S 1 368
+ FrameIndex XZWJ T 1 369
+ FrameIndex XZWJ U 1 370
+ FrameIndex XZWJ V 1 371
+ FrameIndex XZWJ W 1 372
+ FrameIndex XZWJ X 1 373
+ FrameIndex XZWJ Y 1 374
+ FrameIndex XZWJ Z 1 375
+ FrameIndex XZWK A 1 376
+ FrameIndex XZWK B 1 377
+ FrameIndex XZWK C 1 378
+ FrameIndex XZWK D 1 379
+ SurfaceSkin 1 3 "ExplodiumGun.png"
// Lower
FrameIndex XZWM U 1 297
FrameIndex XZWM V 1 298
@@ -505,58 +472,43 @@ Model "DualExplodiumGun"
// Still
FrameIndex XZWK Z 1 248
// Reload (Part 1)
- SurfaceSkin 1 5 "ExplodiumGun_EmptyMag.png" // empty mag
- FrameIndex XZWL A 1 249
- FrameIndex XZWL B 1 250
- FrameIndex XZWL C 1 251
- FrameIndex XZWL D 1 252
- FrameIndex XZWL E 1 253
- FrameIndex XZWL F 1 254
- FrameIndex XZWL G 1 255
- FrameIndex XZWL H 1 256
- FrameIndex XZWL I 1 257
- FrameIndex XZWL J 1 258
- FrameIndex XZWL K 1 259
- FrameIndex XZWL L 1 260
- FrameIndex XZWL M 1 261
- FrameIndex XZWL N 1 262
- FrameIndex XZWL O 1 263
- FrameIndex XZWL P 1 264
+ SurfaceSkin 1 3 "ExplodiumGun_EmptyMag.png"
+ FrameIndex XZWL A 1 346
+ FrameIndex XZWL B 1 347
+ FrameIndex XZWL C 1 348
+ FrameIndex XZWL D 1 349
+ FrameIndex XZWL E 1 350
+ FrameIndex XZWL F 1 351
+ FrameIndex XZWL G 1 352
+ FrameIndex XZWL H 1 353
+ FrameIndex XZWL I 1 354
+ FrameIndex XZWL J 1 355
+ FrameIndex XZWL K 1 356
+ FrameIndex XZWL L 1 357
+ FrameIndex XZWL M 1 358
+ FrameIndex XZWL N 1 359
+ FrameIndex XZWL O 1 360
// Reload (Part 2)
- SurfaceSkin 1 5 "" // hide mag
- SurfaceSkin 1 6 "ExplodiumGun.png" // show new mag
- FrameIndex XZWL Q 1 265
- FrameIndex XZWL R 1 266
- FrameIndex XZWL S 1 267
- FrameIndex XZWL T 1 268
- FrameIndex XZWL U 1 269
- FrameIndex XZWL V 1 270
- FrameIndex XZWL W 1 271
- FrameIndex XZWL X 1 272
- SurfaceSkin 1 6 "" // hide new mag
- FrameIndex XZWL Y 1 273
- FrameIndex XZWL Z 1 274
- FrameIndex XZWM A 1 275
- SurfaceSkin 1 5 "ExplodiumGun.png" // show mag
- FrameIndex XZWM B 1 276
- FrameIndex XZWM C 1 277
- FrameIndex XZWM D 1 278
- FrameIndex XZWM E 1 279
- FrameIndex XZWM F 1 280
- FrameIndex XZWM G 1 281
- FrameIndex XZWM H 1 282
- FrameIndex XZWM I 1 283
- FrameIndex XZWM J 1 284
- FrameIndex XZWM K 1 285
- FrameIndex XZWM L 1 286
- FrameIndex XZWM M 1 287
- FrameIndex XZWM N 1 288
- FrameIndex XZWM O 1 289
- FrameIndex XZWM P 1 290
- FrameIndex XZWM Q 1 291
- FrameIndex XZWM R 1 292
- FrameIndex XZWM S 1 293
- FrameIndex XZWM T 1 294
+ SurfaceSkin 1 3 "ExplodiumGun.png"
+ FrameIndex XZWL P 1 361
+ FrameIndex XZWL Q 1 362
+ FrameIndex XZWL R 1 363
+ FrameIndex XZWL S 1 364
+ FrameIndex XZWL T 1 365
+ FrameIndex XZWL U 1 366
+ FrameIndex XZWL V 1 367
+ FrameIndex XZWL W 1 368
+ FrameIndex XZWL X 1 369
+ FrameIndex XZWL Y 1 370
+ FrameIndex XZWL Z 1 371
+ FrameIndex XZWM A 1 372
+ FrameIndex XZWM B 1 373
+ FrameIndex XZWM C 1 374
+ FrameIndex XZWM D 1 375
+ FrameIndex XZWM E 1 376
+ FrameIndex XZWM F 1 377
+ FrameIndex XZWM G 1 378
+ FrameIndex XZWM H 1 379
// Lower
FrameIndex XZWN F 1 297
FrameIndex XZWN G 1 298
@@ -570,3 +522,16 @@ Model "DualExplodiumGun"
FrameIndex XZWN O 1 306
FrameIndex XZWN P 1 307
}
+
+Model "SWWMDualWeaponGiver"
+{
+ Path "models"
+
+ Model 0 "ExplodiumGunPickupDual_d.3d"
+ Skin 0 "ExplodiumGun.png"
+ Scale 0.05 0.05 0.05
+ ZOffset 16
+ ROTATING
+
+ FrameIndex XZW1 A 0 0
+}
diff --git a/modeldef.fistgun b/modeldef.fistgun
deleted file mode 100644
index 037f2b553..000000000
--- a/modeldef.fistgun
+++ /dev/null
@@ -1,13 +0,0 @@
-Model "FistGun"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.04 0.04 0.04
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
diff --git a/modeldef.grandlance b/modeldef.grandlance
deleted file mode 100644
index 09ef6cbeb..000000000
--- a/modeldef.grandlance
+++ /dev/null
@@ -1,13 +0,0 @@
-Model "GrandLance"
-{
- Path "models/extra"
-
- Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
- Scale 0.06 0.06 0.06
- ZOffset 16
- PitchOffset 30
- ROTATING
-
- FrameIndex XZW1 A 0 0
-}
diff --git a/modeldef.hammer b/modeldef.hammer
index 934dcc178..d54f2b479 100644
--- a/modeldef.hammer
+++ b/modeldef.hammer
@@ -3,7 +3,7 @@ Model "ItamexHammer"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILR"
Scale 0.04 0.04 0.04
ZOffset 16
PitchOffset 30
diff --git a/modeldef.mortalrifle b/modeldef.mortalrifle
index 320c976d4..b061c084e 100644
--- a/modeldef.mortalrifle
+++ b/modeldef.mortalrifle
@@ -1,9 +1,9 @@
-Model "EMPCarbine"
+Model "MisterRifle"
{
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILR"
Scale 0.05 0.05 0.05
ZOffset 16
PitchOffset 30
diff --git a/modeldef.newsparkster b/modeldef.newsparkster
index 6baf9ea09..2feb8cc2f 100644
--- a/modeldef.newsparkster
+++ b/modeldef.newsparkster
@@ -3,7 +3,7 @@ Model "ModernSparkster"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILR"
Scale 0.05 0.05 0.05
ZOffset 16
PitchOffset 30
diff --git a/modeldef.plasmablast b/modeldef.plasmablast
index 5a87838ed..560f0c5ae 100644
--- a/modeldef.plasmablast
+++ b/modeldef.plasmablast
@@ -3,7 +3,7 @@ Model "PlasmaBlast"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILR"
Scale 0.04 0.04 0.04
ZOffset 16
PitchOffset 30
diff --git a/modeldef.puntzerbeta b/modeldef.puntzerbeta
index 313632a4a..d834de2b3 100644
--- a/modeldef.puntzerbeta
+++ b/modeldef.puntzerbeta
@@ -3,7 +3,7 @@ Model "PuntzerBeta"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILR"
Scale 0.04 0.04 0.04
ZOffset 16
PitchOffset 30
diff --git a/modeldef.puntzergamma b/modeldef.puntzergamma
index 68fb062c2..bbabcb626 100644
--- a/modeldef.puntzergamma
+++ b/modeldef.puntzergamma
@@ -3,7 +3,7 @@ Model "PuntzerGamma"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILR"
Scale 0.045 0.045 0.045
ZOffset 16
PitchOffset 30
diff --git a/modeldef.quadravol b/modeldef.quadravol
index b1333acee..2cd0ae4e2 100644
--- a/modeldef.quadravol
+++ b/modeldef.quadravol
@@ -3,7 +3,7 @@ Model "Quadravol"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILR"
Scale 0.05 0.05 0.05
ZOffset 16
PitchOffset 30
diff --git a/modeldef.rafankos b/modeldef.rafankos
index e2e39fff6..2de18920d 100644
--- a/modeldef.rafankos
+++ b/modeldef.rafankos
@@ -3,7 +3,7 @@ Model "RafanKos"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILR"
Scale 0.055 0.055 0.055
ZOffset 16
PitchOffset 30
diff --git a/modeldef.raykhom b/modeldef.raykhom
index 7a06bb9dc..269b440c4 100644
--- a/modeldef.raykhom
+++ b/modeldef.raykhom
@@ -3,7 +3,7 @@ Model "RayKhom"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILR"
Scale 0.055 0.055 0.055
ZOffset 16
PitchOffset 30
diff --git a/modeldef.sheenhmg b/modeldef.sheenhmg
index 7e916967b..3931ee5ed 100644
--- a/modeldef.sheenhmg
+++ b/modeldef.sheenhmg
@@ -3,7 +3,7 @@ Model "HeavyMahSheenGun"
Path "models/extra"
Model 0 "BaseCube_d.3d"
- Skin 0 "CHIPTILE"
+ Skin 0 "CHIPTILR"
Scale 0.05 0.05 0.05
ZOffset 16
PitchOffset 30
diff --git a/models/DemolitionistDoll_a.3d b/models/DemolitionistDoll_a.3d
deleted file mode 100644
index 6f3b037e4..000000000
Binary files a/models/DemolitionistDoll_a.3d and /dev/null differ
diff --git a/models/DemolitionistDoll_d.3d b/models/DemolitionistDoll_d.3d
deleted file mode 100644
index 627b77ea8..000000000
Binary files a/models/DemolitionistDoll_d.3d and /dev/null differ
diff --git a/models/Demolitionist_IK.blend b/models/Demolitionist_IK.blend
new file mode 100644
index 000000000..1c70cd196
Binary files /dev/null and b/models/Demolitionist_IK.blend differ
diff --git a/models/ExplodiumGun1st.blend b/models/ExplodiumGun1st.blend
index 4264edf19..9a912d7f6 100644
Binary files a/models/ExplodiumGun1st.blend and b/models/ExplodiumGun1st.blend differ
diff --git a/models/ExplodiumGun1stL_a.3d b/models/ExplodiumGun1stL_a.3d
index b20598c1e..314993e0b 100644
Binary files a/models/ExplodiumGun1stL_a.3d and b/models/ExplodiumGun1stL_a.3d differ
diff --git a/models/ExplodiumGun1stL_d.3d b/models/ExplodiumGun1stL_d.3d
index 60a1d4b2c..ffc69d204 100644
Binary files a/models/ExplodiumGun1stL_d.3d and b/models/ExplodiumGun1stL_d.3d differ
diff --git a/models/ExplodiumGun1st_a.3d b/models/ExplodiumGun1st_a.3d
index 2912fdfea..33ba085b7 100644
Binary files a/models/ExplodiumGun1st_a.3d and b/models/ExplodiumGun1st_a.3d differ
diff --git a/models/ExplodiumGunPickupDual_a.3d b/models/ExplodiumGunPickupDual_a.3d
new file mode 100644
index 000000000..a7e512b88
Binary files /dev/null and b/models/ExplodiumGunPickupDual_a.3d differ
diff --git a/models/ExplodiumGunPickupDual_d.3d b/models/ExplodiumGunPickupDual_d.3d
new file mode 100644
index 000000000..0bc243ca8
Binary files /dev/null and b/models/ExplodiumGunPickupDual_d.3d differ
diff --git a/models/GibBreast.png b/models/GibBreast.png
new file mode 100644
index 000000000..0e8713283
Binary files /dev/null and b/models/GibBreast.png differ
diff --git a/models/GibBreast_a.3d b/models/GibBreast_a.3d
new file mode 100644
index 000000000..ccd2a102c
Binary files /dev/null and b/models/GibBreast_a.3d differ
diff --git a/models/GibBreast_d.3d b/models/GibBreast_d.3d
new file mode 100644
index 000000000..20f66c5eb
Binary files /dev/null and b/models/GibBreast_d.3d differ
diff --git a/models/GibDrumstick.png b/models/GibDrumstick.png
new file mode 100644
index 000000000..a2d7493f6
Binary files /dev/null and b/models/GibDrumstick.png differ
diff --git a/models/GibDrumstick_a.3d b/models/GibDrumstick_a.3d
new file mode 100644
index 000000000..e9d4c22e5
Binary files /dev/null and b/models/GibDrumstick_a.3d differ
diff --git a/models/GibDrumstick_d.3d b/models/GibDrumstick_d.3d
new file mode 100644
index 000000000..9533fb649
Binary files /dev/null and b/models/GibDrumstick_d.3d differ
diff --git a/models/GibModels.blend b/models/GibModels.blend
new file mode 100644
index 000000000..b1ce7ebfa
Binary files /dev/null and b/models/GibModels.blend differ
diff --git a/models/GibSteak.png b/models/GibSteak.png
new file mode 100644
index 000000000..444457040
Binary files /dev/null and b/models/GibSteak.png differ
diff --git a/models/GibSteak_a.3d b/models/GibSteak_a.3d
new file mode 100644
index 000000000..454c16317
Binary files /dev/null and b/models/GibSteak_a.3d differ
diff --git a/models/GibSteak_d.3d b/models/GibSteak_d.3d
new file mode 100644
index 000000000..07932d77a
Binary files /dev/null and b/models/GibSteak_d.3d differ
diff --git a/models/VoodooDoll.blend b/models/VoodooDoll.blend
new file mode 100644
index 000000000..796a9c2d7
Binary files /dev/null and b/models/VoodooDoll.blend differ
diff --git a/models/VoodooDoll.png b/models/VoodooDoll.png
new file mode 100644
index 000000000..bc68f40b5
Binary files /dev/null and b/models/VoodooDoll.png differ
diff --git a/models/VoodooDollFace.png b/models/VoodooDollFace.png
new file mode 100644
index 000000000..0785942e7
Binary files /dev/null and b/models/VoodooDollFace.png differ
diff --git a/models/VoodooDoll_a.3d b/models/VoodooDoll_a.3d
new file mode 100644
index 000000000..14fd66eb0
Binary files /dev/null and b/models/VoodooDoll_a.3d differ
diff --git a/models/VoodooDoll_d.3d b/models/VoodooDoll_d.3d
new file mode 100644
index 000000000..c9dba2dd8
Binary files /dev/null and b/models/VoodooDoll_d.3d differ
diff --git a/models/extra/dlc1/BlastMuz0.png b/models/extra/dlc/BlastMuz0.png
similarity index 100%
rename from models/extra/dlc1/BlastMuz0.png
rename to models/extra/dlc/BlastMuz0.png
diff --git a/models/extra/dlc1/BlastMuz1.png b/models/extra/dlc/BlastMuz1.png
similarity index 100%
rename from models/extra/dlc1/BlastMuz1.png
rename to models/extra/dlc/BlastMuz1.png
diff --git a/models/extra/dlc1/BlastMuz2.png b/models/extra/dlc/BlastMuz2.png
similarity index 100%
rename from models/extra/dlc1/BlastMuz2.png
rename to models/extra/dlc/BlastMuz2.png
diff --git a/models/extra/dlc1/BlastMuz3.png b/models/extra/dlc/BlastMuz3.png
similarity index 100%
rename from models/extra/dlc1/BlastMuz3.png
rename to models/extra/dlc/BlastMuz3.png
diff --git a/models/extra/dlc1/BlastMuz4.png b/models/extra/dlc/BlastMuz4.png
similarity index 100%
rename from models/extra/dlc1/BlastMuz4.png
rename to models/extra/dlc/BlastMuz4.png
diff --git a/models/extra/dlc1/BlastMuz5.png b/models/extra/dlc/BlastMuz5.png
similarity index 100%
rename from models/extra/dlc1/BlastMuz5.png
rename to models/extra/dlc/BlastMuz5.png
diff --git a/models/extra/dlc1/BlastMuz6.png b/models/extra/dlc/BlastMuz6.png
similarity index 100%
rename from models/extra/dlc1/BlastMuz6.png
rename to models/extra/dlc/BlastMuz6.png
diff --git a/models/extra/dlc1/BlastMuz7.png b/models/extra/dlc/BlastMuz7.png
similarity index 100%
rename from models/extra/dlc1/BlastMuz7.png
rename to models/extra/dlc/BlastMuz7.png
diff --git a/models/extra/dlc1/BlastMuz8.png b/models/extra/dlc/BlastMuz8.png
similarity index 100%
rename from models/extra/dlc1/BlastMuz8.png
rename to models/extra/dlc/BlastMuz8.png
diff --git a/models/extra/dlc1/BlastMuz9.png b/models/extra/dlc/BlastMuz9.png
similarity index 100%
rename from models/extra/dlc1/BlastMuz9.png
rename to models/extra/dlc/BlastMuz9.png
diff --git a/models/extra/dlc1/LanceTracer.png b/models/extra/dlc/LanceTracer.png
similarity index 100%
rename from models/extra/dlc1/LanceTracer.png
rename to models/extra/dlc/LanceTracer.png
diff --git a/models/extra/dlc2/MRBolt.png b/models/extra/dlc/MRBolt.png
similarity index 100%
rename from models/extra/dlc2/MRBolt.png
rename to models/extra/dlc/MRBolt.png
diff --git a/models/extra/dlc2/MRBoltS.png b/models/extra/dlc/MRBoltS.png
similarity index 100%
rename from models/extra/dlc2/MRBoltS.png
rename to models/extra/dlc/MRBoltS.png
diff --git a/models/extra/dlc2/MRMuz0.png b/models/extra/dlc/MRMuz0.png
similarity index 100%
rename from models/extra/dlc2/MRMuz0.png
rename to models/extra/dlc/MRMuz0.png
diff --git a/models/extra/dlc2/MRMuz1.png b/models/extra/dlc/MRMuz1.png
similarity index 100%
rename from models/extra/dlc2/MRMuz1.png
rename to models/extra/dlc/MRMuz1.png
diff --git a/models/extra/dlc2/MRMuz2.png b/models/extra/dlc/MRMuz2.png
similarity index 100%
rename from models/extra/dlc2/MRMuz2.png
rename to models/extra/dlc/MRMuz2.png
diff --git a/models/extra/dlc2/MRMuz3.png b/models/extra/dlc/MRMuz3.png
similarity index 100%
rename from models/extra/dlc2/MRMuz3.png
rename to models/extra/dlc/MRMuz3.png
diff --git a/models/extra/dlc2/NewSparkMuzK.png b/models/extra/dlc/NewSparkMuzK.png
similarity index 100%
rename from models/extra/dlc2/NewSparkMuzK.png
rename to models/extra/dlc/NewSparkMuzK.png
diff --git a/models/extra/dlc2/NewSparkMuzN.png b/models/extra/dlc/NewSparkMuzN.png
similarity index 100%
rename from models/extra/dlc2/NewSparkMuzN.png
rename to models/extra/dlc/NewSparkMuzN.png
diff --git a/models/extra/dlc2/NewSparkMuzNK.png b/models/extra/dlc/NewSparkMuzNK.png
similarity index 100%
rename from models/extra/dlc2/NewSparkMuzNK.png
rename to models/extra/dlc/NewSparkMuzNK.png
diff --git a/models/extra/dlc1/PlasmaTracer.png b/models/extra/dlc/PlasmaTracer.png
similarity index 100%
rename from models/extra/dlc1/PlasmaTracer.png
rename to models/extra/dlc/PlasmaTracer.png
diff --git a/models/extra/dlc1/PlasmaTrail.png b/models/extra/dlc/PlasmaTrail.png
similarity index 100%
rename from models/extra/dlc1/PlasmaTrail.png
rename to models/extra/dlc/PlasmaTrail.png
diff --git a/models/extra/dlc1/PuntzerMuz0.png b/models/extra/dlc/PuntzerMuz0.png
similarity index 100%
rename from models/extra/dlc1/PuntzerMuz0.png
rename to models/extra/dlc/PuntzerMuz0.png
diff --git a/models/extra/dlc1/PuntzerMuz1.png b/models/extra/dlc/PuntzerMuz1.png
similarity index 100%
rename from models/extra/dlc1/PuntzerMuz1.png
rename to models/extra/dlc/PuntzerMuz1.png
diff --git a/models/extra/dlc1/PuntzerMuz2.png b/models/extra/dlc/PuntzerMuz2.png
similarity index 100%
rename from models/extra/dlc1/PuntzerMuz2.png
rename to models/extra/dlc/PuntzerMuz2.png
diff --git a/models/extra/dlc1/PuntzerMuz3.png b/models/extra/dlc/PuntzerMuz3.png
similarity index 100%
rename from models/extra/dlc1/PuntzerMuz3.png
rename to models/extra/dlc/PuntzerMuz3.png
diff --git a/models/extra/dlc1/PuntzerMuz4.png b/models/extra/dlc/PuntzerMuz4.png
similarity index 100%
rename from models/extra/dlc1/PuntzerMuz4.png
rename to models/extra/dlc/PuntzerMuz4.png
diff --git a/models/extra/dlc1/PuntzerMuz5.png b/models/extra/dlc/PuntzerMuz5.png
similarity index 100%
rename from models/extra/dlc1/PuntzerMuz5.png
rename to models/extra/dlc/PuntzerMuz5.png
diff --git a/models/extra/dlc1/PuntzerMuz6.png b/models/extra/dlc/PuntzerMuz6.png
similarity index 100%
rename from models/extra/dlc1/PuntzerMuz6.png
rename to models/extra/dlc/PuntzerMuz6.png
diff --git a/models/extra/dlc1/PuntzerMuz7.png b/models/extra/dlc/PuntzerMuz7.png
similarity index 100%
rename from models/extra/dlc1/PuntzerMuz7.png
rename to models/extra/dlc/PuntzerMuz7.png
diff --git a/models/extra/dlc1/QuadMuz0.png b/models/extra/dlc/QuadMuz0.png
similarity index 100%
rename from models/extra/dlc1/QuadMuz0.png
rename to models/extra/dlc/QuadMuz0.png
diff --git a/models/extra/dlc1/QuadMuz1.png b/models/extra/dlc/QuadMuz1.png
similarity index 100%
rename from models/extra/dlc1/QuadMuz1.png
rename to models/extra/dlc/QuadMuz1.png
diff --git a/models/extra/dlc1/QuadMuz2.png b/models/extra/dlc/QuadMuz2.png
similarity index 100%
rename from models/extra/dlc1/QuadMuz2.png
rename to models/extra/dlc/QuadMuz2.png
diff --git a/models/extra/dlc1/QuadMuz3.png b/models/extra/dlc/QuadMuz3.png
similarity index 100%
rename from models/extra/dlc1/QuadMuz3.png
rename to models/extra/dlc/QuadMuz3.png
diff --git a/models/extra/dlc1/QuadMuz4.png b/models/extra/dlc/QuadMuz4.png
similarity index 100%
rename from models/extra/dlc1/QuadMuz4.png
rename to models/extra/dlc/QuadMuz4.png
diff --git a/models/extra/dlc1/QuadMuz5.png b/models/extra/dlc/QuadMuz5.png
similarity index 100%
rename from models/extra/dlc1/QuadMuz5.png
rename to models/extra/dlc/QuadMuz5.png
diff --git a/models/extra/dlc1/QuadMuz6.png b/models/extra/dlc/QuadMuz6.png
similarity index 100%
rename from models/extra/dlc1/QuadMuz6.png
rename to models/extra/dlc/QuadMuz6.png
diff --git a/models/extra/dlc1/QuadMuz7.png b/models/extra/dlc/QuadMuz7.png
similarity index 100%
rename from models/extra/dlc1/QuadMuz7.png
rename to models/extra/dlc/QuadMuz7.png
diff --git a/models/extra/dlc1/QuadMuz8.png b/models/extra/dlc/QuadMuz8.png
similarity index 100%
rename from models/extra/dlc1/QuadMuz8.png
rename to models/extra/dlc/QuadMuz8.png
diff --git a/models/extra/dlc1/QuadMuz9.png b/models/extra/dlc/QuadMuz9.png
similarity index 100%
rename from models/extra/dlc1/QuadMuz9.png
rename to models/extra/dlc/QuadMuz9.png
diff --git a/models/extra/dlc1/RailMuz0.png b/models/extra/dlc/RailMuz0.png
similarity index 100%
rename from models/extra/dlc1/RailMuz0.png
rename to models/extra/dlc/RailMuz0.png
diff --git a/models/extra/dlc1/RailMuz1.png b/models/extra/dlc/RailMuz1.png
similarity index 100%
rename from models/extra/dlc1/RailMuz1.png
rename to models/extra/dlc/RailMuz1.png
diff --git a/models/extra/dlc1/RailMuz2.png b/models/extra/dlc/RailMuz2.png
similarity index 100%
rename from models/extra/dlc1/RailMuz2.png
rename to models/extra/dlc/RailMuz2.png
diff --git a/models/extra/dlc1/RailMuz3.png b/models/extra/dlc/RailMuz3.png
similarity index 100%
rename from models/extra/dlc1/RailMuz3.png
rename to models/extra/dlc/RailMuz3.png
diff --git a/models/extra/dlc1/RayTracer.png b/models/extra/dlc/RayTracer.png
similarity index 100%
rename from models/extra/dlc1/RayTracer.png
rename to models/extra/dlc/RayTracer.png
diff --git a/models/extra/dlc1/RayTrail.png b/models/extra/dlc/RayTrail.png
similarity index 100%
rename from models/extra/dlc1/RayTrail.png
rename to models/extra/dlc/RayTrail.png
diff --git a/models/extra/dlc1/SheenMuz0.png b/models/extra/dlc/SheenMuz0.png
similarity index 100%
rename from models/extra/dlc1/SheenMuz0.png
rename to models/extra/dlc/SheenMuz0.png
diff --git a/models/extra/dlc1/SheenMuz1.png b/models/extra/dlc/SheenMuz1.png
similarity index 100%
rename from models/extra/dlc1/SheenMuz1.png
rename to models/extra/dlc/SheenMuz1.png
diff --git a/models/extra/dlc1/SheenMuz2.png b/models/extra/dlc/SheenMuz2.png
similarity index 100%
rename from models/extra/dlc1/SheenMuz2.png
rename to models/extra/dlc/SheenMuz2.png
diff --git a/models/extra/dlc1/SheenMuz3.png b/models/extra/dlc/SheenMuz3.png
similarity index 100%
rename from models/extra/dlc1/SheenMuz3.png
rename to models/extra/dlc/SheenMuz3.png
diff --git a/models/extra/dlc1/SheenMuz4.png b/models/extra/dlc/SheenMuz4.png
similarity index 100%
rename from models/extra/dlc1/SheenMuz4.png
rename to models/extra/dlc/SheenMuz4.png
diff --git a/models/extra/dlc1/SheenMuz5.png b/models/extra/dlc/SheenMuz5.png
similarity index 100%
rename from models/extra/dlc1/SheenMuz5.png
rename to models/extra/dlc/SheenMuz5.png
diff --git a/models/extra/dlc1/SheenMuz6.png b/models/extra/dlc/SheenMuz6.png
similarity index 100%
rename from models/extra/dlc1/SheenMuz6.png
rename to models/extra/dlc/SheenMuz6.png
diff --git a/models/extra/dlc1/SheenMuz7.png b/models/extra/dlc/SheenMuz7.png
similarity index 100%
rename from models/extra/dlc1/SheenMuz7.png
rename to models/extra/dlc/SheenMuz7.png
diff --git a/models/extra/dlc1/SheenTracer.png b/models/extra/dlc/SheenTracer.png
similarity index 100%
rename from models/extra/dlc1/SheenTracer.png
rename to models/extra/dlc/SheenTracer.png
diff --git a/models/extra/dlc1/SheenTracer_Blue.png b/models/extra/dlc/SheenTracer_Blue.png
similarity index 100%
rename from models/extra/dlc1/SheenTracer_Blue.png
rename to models/extra/dlc/SheenTracer_Blue.png
diff --git a/models/extra/dlc1/SheenTracer_Cyan.png b/models/extra/dlc/SheenTracer_Cyan.png
similarity index 100%
rename from models/extra/dlc1/SheenTracer_Cyan.png
rename to models/extra/dlc/SheenTracer_Cyan.png
diff --git a/models/extra/dlc1/SheenTracer_Green.png b/models/extra/dlc/SheenTracer_Green.png
similarity index 100%
rename from models/extra/dlc1/SheenTracer_Green.png
rename to models/extra/dlc/SheenTracer_Green.png
diff --git a/models/extra/dlc1/SheenTracer_Magenta.png b/models/extra/dlc/SheenTracer_Magenta.png
similarity index 100%
rename from models/extra/dlc1/SheenTracer_Magenta.png
rename to models/extra/dlc/SheenTracer_Magenta.png
diff --git a/models/extra/dlc1/SheenTracer_Red.png b/models/extra/dlc/SheenTracer_Red.png
similarity index 100%
rename from models/extra/dlc1/SheenTracer_Red.png
rename to models/extra/dlc/SheenTracer_Red.png
diff --git a/models/extra/dlc1/SheenTracer_TransBlue.png b/models/extra/dlc/SheenTracer_TransBlue.png
similarity index 100%
rename from models/extra/dlc1/SheenTracer_TransBlue.png
rename to models/extra/dlc/SheenTracer_TransBlue.png
diff --git a/models/extra/dlc1/SheenTracer_TransPink.png b/models/extra/dlc/SheenTracer_TransPink.png
similarity index 100%
rename from models/extra/dlc1/SheenTracer_TransPink.png
rename to models/extra/dlc/SheenTracer_TransPink.png
diff --git a/models/extra/dlc1/SheenTracer_White.png b/models/extra/dlc/SheenTracer_White.png
similarity index 100%
rename from models/extra/dlc1/SheenTracer_White.png
rename to models/extra/dlc/SheenTracer_White.png
diff --git a/models/extra/dlc1/SheenTracer_Yellow.png b/models/extra/dlc/SheenTracer_Yellow.png
similarity index 100%
rename from models/extra/dlc1/SheenTracer_Yellow.png
rename to models/extra/dlc/SheenTracer_Yellow.png
diff --git a/models/extra/dlc2/UltimaMuz0.png b/models/extra/dlc/UltimaMuz0.png
similarity index 100%
rename from models/extra/dlc2/UltimaMuz0.png
rename to models/extra/dlc/UltimaMuz0.png
diff --git a/models/extra/dlc2/UltimaMuz1.png b/models/extra/dlc/UltimaMuz1.png
similarity index 100%
rename from models/extra/dlc2/UltimaMuz1.png
rename to models/extra/dlc/UltimaMuz1.png
diff --git a/models/extra/dlc2/UltimaMuz2.png b/models/extra/dlc/UltimaMuz2.png
similarity index 100%
rename from models/extra/dlc2/UltimaMuz2.png
rename to models/extra/dlc/UltimaMuz2.png
diff --git a/models/extra/dlc2/UltimaMuz3.png b/models/extra/dlc/UltimaMuz3.png
similarity index 100%
rename from models/extra/dlc2/UltimaMuz3.png
rename to models/extra/dlc/UltimaMuz3.png
diff --git a/models/extra/dlc2/UltimaTrail.png b/models/extra/dlc/UltimaTrail.png
similarity index 100%
rename from models/extra/dlc2/UltimaTrail.png
rename to models/extra/dlc/UltimaTrail.png
diff --git a/models/modelnotes.txt b/models/modelnotes.txt
index 84119f98c..dc7bde861 100644
--- a/models/modelnotes.txt
+++ b/models/modelnotes.txt
@@ -1,4 +1,4 @@
-# DLC Weaponset 1
+# DLC Weaponset
Weapon models:
- Itamex Hammer
@@ -6,10 +6,10 @@ Weapon models:
- Puntzer Beta
- Puntzer Gamma
- Quadravol
- - Blackfire Igniter
- - EMP Rail Carbine
+ - Sparkster Rifle
+ - Mortal Rifle
- Ray-Khom
- - Grand Lance
+ - Rafan-Kos
Ammo models:
- Plasma Ammo
@@ -23,36 +23,27 @@ Ammo models:
- 50 Box
- 100 Box
- Quadravol Ammo
- - Dark Canister
- - Emp Core
- - Ray-Khom Ammo
- - Single
- - Mag
- - Battery
- - Grand Lance Ammo
- - Single
- - Mag
-
-# DLC Weaponset 2
-
-Weapon models:
- - Hand of Divine
- - Sparkster Rifle
- - Mortal Rifle
- - Rafan-Kos
-
-Ammo models:
- Sparkster Ammo
+ - Kinylum Round
+ - Nokron Round
- Mortal Rifle Ammo
- Round
- Mag
- Grenade
+ - Ray-Khom Ammo
+ - Single
+ - Mag
+ - Battery
- Rafan-Kos Ammo
- Pod
- Mag
+Collectible models:
+ - Saya's Mug
+
# Final Update
Character models:
- Maidbot
+ - Rika
- White Lady
diff --git a/music/TRAUMATI.XM b/music/TRAUMATI.XM
index 0b2beb975..50e610398 100644
Binary files a/music/TRAUMATI.XM and b/music/TRAUMATI.XM differ
diff --git a/palettes/MADCAT.pal b/palettes/MADCAT.pal
new file mode 100644
index 000000000..59b152556
Binary files /dev/null and b/palettes/MADCAT.pal differ
diff --git a/palettes/SWWMGZTerm.pal b/palettes/SWWMGZTerm.pal
new file mode 100644
index 000000000..0dcf2a063
Binary files /dev/null and b/palettes/SWWMGZTerm.pal differ
diff --git a/readme.txt b/readme.txt
index f474d41f1..e6b4036b4 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,6 +1,8 @@
+ CODENAME: DEMOLITIONIST
+ a.k.a.
Some Weird Weapons Mod: GZDoom Edition
----------------------------------------
-(C)2020-2021 Marisa Kirisame - UnSX Team
+(C)2020-2022 Marisa Kirisame - UnSX Team
@@ -41,6 +43,17 @@ Index of contents:
2.3. Armors
2.4. Health
2.5. Others
+ 2.6. DLC Weapon Set 1
+ 2.6.1. Itamex Hammer
+ 2.6.2. Plasma Blaster
+ 2.6.3. Puntzer Beta
+ 2.6.4. Puntzer Gamma
+ 2.6.5. Sheen HMG
+ 2.6.6. Quadravol
+ 2.6.7. Sparkster Rifle
+ 2.6.8. Mortal Rifle
+ 2.6.9. Ray-Khom
+ 2.6.A. Rafan-Kos
3. Credits
3.1. UnSX Team Is
3.2. Special Thanks
@@ -319,6 +332,97 @@ times little pieces of treasure that you might want to collect, as they can be
very valuable.
+2.6. DLC Weapon Set
+- - - - - - - - - -
+
+Coming soon. But here's a tease.
+
+2.6.1. Itamex Hammer
+
+Slot 1. Melee weapon.
+A strong as fuck sledgehammer.
+Primary fire does side swings.
+Secondary fire does an overhead swing.
+Tertiery fire does a spin. Keep pressing it to spin more.
+
+2.6.2. Plasma Blaster
+
+Slot 2. Pistol.
+A fine plasma gun. Bit of a downgrade compared to its old SWWM counterparts,
+but don't let that deceive ya, it's still very useful.
+Primary fire does the shootin'.
+Secondary fire charges a big blast.
+Can also be dual wielded.
+
+2.6.3. Puntzer Beta
+
+Slot 3. Revolver.
+A six shooter, packing some fine... Drilling power.
+Primary fire does a shoot.
+Secondary fire is held for fast shooting mode, where spamming primary will
+shoot faster.
+
+2.6.4. Puntzer Gamma
+
+Slot 4. Submachine gun.
+It does the drilling, and it does it fast.
+Primary fire schutts, as expected.
+Secondary fire switches fire modes. You won't believe how fast this can go.
+
+2.6.5. Sheen HMG
+
+Slot 5. Heavy machine gun.
+For those who wished for dakka. Here's the dakka.
+Primary fire shoots.
+Secondary fire shoots faster.
+Tertiary fire shoots the fastest.
+Watch out for overheating.
+
+2.6.6. Quadravol
+
+Slot 6. Fireball launcher.
+A signature weapon of the UnSX series, mighty fireball shooting.
+Primary fire does a shoot.
+Secondary fire pumps for more power.
+Tertiary fire toggles scatter shot.
+And yes, it's a levergun, have fun.
+
+2.6.7. Sparkster Rifle
+
+Slot 7. Plasma artillery.
+Yet another signature weapon of the UnSX saga, big fat plasma rifle.
+Primary fire shoots blue plasma.
+Secondary fire spews red plasma.
+Both buttons at once release a deadly purple plasma.
+Has two reloads, for each ammo type.
+
+2.6.8. Mortal Rifle
+
+Slot 8. Battle rifle.
+A weird as all hell rifle that does everything.
+Primary fire does schumt.
+Secondary fire the grenade.
+Tertiary fire a switch of modes.
+Have fun.
+
+2.6.9. Ray-Khom
+
+Slot 9. GEP gun.
+The most silent way to eliminate Manderley.
+Primary fire lobs a silent plasma grenade. It goes far, and it blows up good.
+Secondary fire zaps whatever's in front of you, don't use it underwater.
+This weapon has both a primary reload and secondary reload (zoom), as it's
+powered by a removable battery.
+
+2.6.A. Rafan-Kos
+
+Slot 0. Ultimate weapon.
+Frickin' laser beams, big of them, very strong.
+Primary fire beam.
+Secondary fire more beams.
+I'm tired from writing these, good night.
+
+
3. Credits
----------
diff --git a/shaders/glsl/Fuzz.fp b/shaders/glsl/Fuzz.fp
index 35ad5e131..34bbf7828 100644
--- a/shaders/glsl/Fuzz.fp
+++ b/shaders/glsl/Fuzz.fp
@@ -36,6 +36,10 @@ float[](
3.
);
+#ifndef BASE_RES
+#define BASE_RES vec2(640.,400.)
+#endif
+
void SetupMaterial( inout Material mat )
{
vec2 coord;
diff --git a/shaders/glsl/NewLogoAnimated.fp b/shaders/glsl/NewLogoAnimated.fp
new file mode 100644
index 000000000..b5644ef29
--- /dev/null
+++ b/shaders/glsl/NewLogoAnimated.fp
@@ -0,0 +1,98 @@
+// animated DEMOLITIONIST logo
+
+#define overlay(a,b) (a<0.5)?(2.0*a*b):(1.0-(2.0*(1.0-a)*(1.0-b)))
+#define hardlight(a,b) (2*a<1.0)?clamp(2.0*a*b,0.0,1.0):clamp(1.0-2.0*(1.0-b)*(1.0-a),0.0,1.0)
+const float pi = 3.14159265358979323846;
+
+vec2 warpcoord( in vec2 uv )
+{
+ vec2 offset;
+ offset.y = sin(pi*2.*(uv.x*8.+timer*.25))*.005;
+ offset.x = cos(pi*2.*(uv.y*4.+timer*.25))*.005;
+ return uv+offset;
+}
+
+// based on gimp color to alpha, but simplified
+vec4 blacktoalpha( in vec4 src )
+{
+ vec4 dst = src;
+ float alpha = 0.;
+ float a;
+ a = clamp(dst.r,0.,1.);
+ if ( a > alpha ) alpha = a;
+ a = clamp(dst.g,0.,1.);
+ if ( a > alpha ) alpha = a;
+ a = clamp(dst.b,0.,1.);
+ if ( a > alpha ) alpha = a;
+ if ( alpha > 0. )
+ {
+ float ainv = 1./alpha;
+ dst.rgb *= ainv;
+ }
+ dst.a *= alpha;
+ return dst;
+}
+#ifdef NO_BILINEAR
+#define BilinearSample(x,y,z,w) texture(x,y)
+#else
+vec4 BilinearSample( in sampler2D tex, in vec2 pos, in vec2 size, in vec2 pxsize )
+{
+ vec2 f = fract(pos*size);
+ pos += (.5-f)*pxsize;
+ vec4 p0q0 = texture(tex,pos);
+ vec4 p1q0 = texture(tex,pos+vec2(pxsize.x,0));
+ vec4 p0q1 = texture(tex,pos+vec2(0,pxsize.y));
+ vec4 p1q1 = texture(tex,pos+vec2(pxsize.x,pxsize.y));
+ vec4 pInterp_q0 = mix(p0q0,p1q0,f.x);
+ vec4 pInterp_q1 = mix(p0q1,p1q1,f.x);
+ return mix(pInterp_q0,pInterp_q1,f.y);
+}
+#endif
+
+vec3 GradientMap( in vec3 color )
+{
+ float gray = dot(color,vec3(.333333));
+ vec2 size = vec2(512.,8.);
+ vec2 pxsize = 1./size;
+ return BilinearSample(gradtex,vec2(gray/2.+.25,0),size,pxsize).rgb;
+}
+
+void SetupMaterial( inout Material mat )
+{
+ // store these to save some time
+ vec2 size = vec2(textureSize(Layer1,0));
+ vec2 pxsize = 1./size;
+ // y'all ready for this multilayered madness?
+ vec2 uv = vTexCoord.st;
+ // base blank layer
+ vec4 base = vec4(1.);
+ // first layer, warp then multiply red
+ base.rgb *= BilinearSample(Layer1,warpcoord(uv),size,pxsize).x;
+ // first layer, multiply green
+ base.rgb *= BilinearSample(Layer1,uv,size,pxsize).y;
+ // first layer, add blue
+ base.rgb += BilinearSample(Layer1,uv,size,pxsize).zzz;
+ // multiply by red fade
+ base.rgb *= texture(fadetex,vec2(.5)).x;
+ // gradient map result
+ base.rgb = GradientMap(base.rgb);
+ // color to alpha
+ base = blacktoalpha(base);
+ // second layer, alpha blend
+ vec4 tmp = BilinearSample(Layer2,uv,size,pxsize);
+ vec4 tmp2;
+ tmp2.a = tmp.a+base.a*(1-tmp.a);
+ tmp2.rgb = (tmp.rgb*tmp.a+base.rgb*base.a*(1-tmp.a))/tmp2.a;
+ base = tmp2;
+ // third layer, hard light with two multiplied masks
+ tmp.xy = BilinearSample(Layer3,uv,size,pxsize).xy;
+ tmp.y *= BilinearSample(Layer3,clamp(uv+vec2(1.-texture(fadetex,vec2(.5)).y*2.,0.),vec2(0.),vec2(1.)),size,pxsize).z;
+ tmp2.r = hardlight(base.r,tmp.x);
+ tmp2.g = hardlight(base.g,tmp.x);
+ tmp2.b = hardlight(base.b,tmp.x);
+ base.rgb = mix(base.rgb,tmp2.rgb,tmp.y);
+ // clamp
+ base = clamp(base,vec4(0.),vec4(1.));
+ // ding, logo's done
+ mat.Base = base;
+}
diff --git a/shaders/pp/Ghostscreen.fp b/shaders/pp/Ghostscreen.fp
index 3eb6d082e..84e9a3773 100644
--- a/shaders/pp/Ghostscreen.fp
+++ b/shaders/pp/Ghostscreen.fp
@@ -7,8 +7,8 @@ void main()
float p = distance(uv,vec2(.5))/sqrt(2.);
for ( float i=0.; i<4.; i+=1. )
{
- vec2 suv = fract((.5-uv)*(1.-i*p*p)+.5);
+ vec2 suv = (.5-uv)*(1.-i*p*p)+.5;
col += texture(InputTexture,suv).rgb*pow(p,2.)*vec3(.6,.8,1.3);
}
- FragColor = vec4(col,1.0);
+ FragColor = vec4(col,1.);
}
diff --git a/sndinfo.txt b/sndinfo.txt
index 61341e81f..36040e821 100644
--- a/sndinfo.txt
+++ b/sndinfo.txt
@@ -17,6 +17,14 @@ squeak sounds/SQUEAK.ogg
recordscratch sounds/RECSCRAP.ogg
compat/warn sounds/UTWARN.ogg
hahaha/hahaha sounds/HAHAHA.ogg
+title/explo1 sounds/OUCHEX1.ogg
+title/explo2 sounds/OUCHEX2.ogg
+title/explo3 sounds/OUCHEX3.ogg
+title/explo4 sounds/OUCHEX4.ogg
+$random title/explo { title/explo1 title/explo2 title/explo3 title/explo4 }
+$limit title/explo 64
+title/thump sounds/TitleThump.ogg
+$limit title/thump 16
saya/giggle1 sounds/saya/saya_giggle1.ogg
saya/giggle2 sounds/saya/saya_giggle2.ogg
@@ -53,53 +61,6 @@ voice/default/death2 sounds/voice/default/demodeath2.ogg
voice/default/death3 sounds/voice/default/demodeath3.ogg
voice/default/death4 sounds/voice/default/demodeath4.ogg
voice/default/death5 sounds/voice/default/demodeath5.ogg
-voice/default/fightstart1 sounds/voice/default/demofightstart1.ogg
-voice/default/fightstart2 sounds/voice/default/demofightstart2.ogg
-voice/default/fightstart3 sounds/voice/default/demofightstart3.ogg
-voice/default/fightstart4 sounds/voice/default/demofightstart4.ogg
-voice/default/fightstart5 sounds/voice/default/demofightstart5.ogg
-voice/default/fightstart6 sounds/voice/default/demofightstart6.ogg
-voice/default/fightstart7 sounds/voice/default/demofightstart7.ogg
-voice/default/fightstart8 sounds/voice/default/demofightstart8.ogg
-voice/default/fightstart9 sounds/voice/default/demofightstart9.ogg
-voice/default/fightstart10 sounds/voice/default/demofightstart10.ogg
-voice/default/fightstart11 sounds/voice/default/demofightstart11.ogg
-voice/default/fightstart12 sounds/voice/default/demofightstart12.ogg
-voice/default/fightstart13 sounds/voice/default/demofightstart13.ogg
-voice/default/fightstart14 sounds/voice/default/demofightstart14.ogg
-voice/default/fightstart15 sounds/voice/default/demofightstart15.ogg
-voice/default/fightstart16 sounds/voice/default/demofightstart16.ogg
-voice/default/fightstart17 sounds/voice/default/demofightstart17.ogg
-voice/default/fightstart18 sounds/voice/default/demofightstart18.ogg
-voice/default/fightstart19 sounds/voice/default/demofightstart19.ogg
-voice/default/fightstart20 sounds/voice/default/demofightstart20.ogg
-voice/default/fightstart21 sounds/voice/default/demofightstart21.ogg
-voice/default/findsecret1 sounds/voice/default/demofindsecret1.ogg
-voice/default/findsecret2 sounds/voice/default/demofindsecret2.ogg
-voice/default/findsecret3 sounds/voice/default/demofindsecret3.ogg
-voice/default/findsecret4 sounds/voice/default/demofindsecret4.ogg
-voice/default/findsecret5 sounds/voice/default/demofindsecret5.ogg
-voice/default/findsecret6 sounds/voice/default/demofindsecret6.ogg
-voice/default/findsecret7 sounds/voice/default/demofindsecret7.ogg
-voice/default/findsecret8 sounds/voice/default/demofindsecret8.ogg
-voice/default/findsecret9 sounds/voice/default/demofindsecret9.ogg
-voice/default/findsecret10 sounds/voice/default/demofindsecret10.ogg
-voice/default/findsecret11 sounds/voice/default/demofindsecret11.ogg
-voice/default/findsecret12 sounds/voice/default/demofindsecret12.ogg
-voice/default/findsecret13 sounds/voice/default/demofindsecret13.ogg
-voice/default/getweapon1 sounds/voice/default/demogetweapon1.ogg
-voice/default/getweapon2 sounds/voice/default/demogetweapon2.ogg
-voice/default/getweapon3 sounds/voice/default/demogetweapon3.ogg
-voice/default/getweapon4 sounds/voice/default/demogetweapon4.ogg
-voice/default/getweapon5 sounds/voice/default/demogetweapon5.ogg
-voice/default/getweapon6 sounds/voice/default/demogetweapon6.ogg
-voice/default/getweapon7 sounds/voice/default/demogetweapon7.ogg
-voice/default/getweapon8 sounds/voice/default/demogetweapon8.ogg
-voice/default/getweapon9 sounds/voice/default/demogetweapon9.ogg
-voice/default/getweapon10 sounds/voice/default/demogetweapon10.ogg
-voice/default/getweapon11 sounds/voice/default/demogetweapon11.ogg
-voice/default/getweapon12 sounds/voice/default/demogetweapon12.ogg
-voice/default/getweapon13 sounds/voice/default/demogetweapon13.ogg
voice/default/grunt1 sounds/voice/default/demogrunt1.ogg
voice/default/grunt2 sounds/voice/default/demogrunt2.ogg
voice/default/grunt3 sounds/voice/default/demogrunt3.ogg
@@ -111,210 +72,17 @@ voice/default/hipain2 sounds/voice/default/demohipain2.ogg
voice/default/hipain3 sounds/voice/default/demohipain3.ogg
voice/default/hipain4 sounds/voice/default/demohipain4.ogg
voice/default/hipain5 sounds/voice/default/demohipain5.ogg
-voice/default/locked1 sounds/voice/default/demolocked1.ogg
-voice/default/locked2 sounds/voice/default/demolocked2.ogg
-voice/default/locked3 sounds/voice/default/demolocked3.ogg
-voice/default/locked4 sounds/voice/default/demolocked4.ogg
-voice/default/jammed1 sounds/voice/default/demojammed1.ogg
-voice/default/jammed2 sounds/voice/default/demojammed2.ogg
-voice/default/jammed3 sounds/voice/default/demojammed3.ogg
-voice/default/jammed4 sounds/voice/default/demojammed4.ogg
voice/default/lopain1 sounds/voice/default/demolopain1.ogg
voice/default/lopain2 sounds/voice/default/demolopain2.ogg
voice/default/lopain3 sounds/voice/default/demolopain3.ogg
voice/default/lopain4 sounds/voice/default/demolopain4.ogg
voice/default/lopain5 sounds/voice/default/demolopain5.ogg
-voice/default/mapstart1 sounds/voice/default/demomapstart1.ogg
-voice/default/mapstart2 sounds/voice/default/demomapstart2.ogg
-voice/default/mapstart3 sounds/voice/default/demomapstart3.ogg
-voice/default/mapstart4 sounds/voice/default/demomapstart4.ogg
-voice/default/mapstart5 sounds/voice/default/demomapstart5.ogg
-voice/default/mapstart6 sounds/voice/default/demomapstart6.ogg
-voice/default/mapstart7 sounds/voice/default/demomapstart7.ogg
-voice/default/mapstart8 sounds/voice/default/demomapstart8.ogg
-voice/default/mapstart9 sounds/voice/default/demomapstart9.ogg
-voice/default/mapstart10 sounds/voice/default/demomapstart10.ogg
-voice/default/mapstart11 sounds/voice/default/demomapstart11.ogg
-voice/default/mapstart12 sounds/voice/default/demomapstart12.ogg
-voice/default/mapstart13 sounds/voice/default/demomapstart13.ogg
-voice/default/mapstart14 sounds/voice/default/demomapstart14.ogg
voice/default/pain1 sounds/voice/default/demopain1.ogg
voice/default/pain2 sounds/voice/default/demopain2.ogg
voice/default/pain3 sounds/voice/default/demopain3.ogg
voice/default/pain4 sounds/voice/default/demopain4.ogg
voice/default/pain5 sounds/voice/default/demopain5.ogg
voice/default/pain6 sounds/voice/default/demopain6.ogg
-voice/default/puzzfail1 sounds/voice/default/demopuzzfail1.ogg
-voice/default/puzzfail2 sounds/voice/default/demopuzzfail2.ogg
-voice/default/puzzfail3 sounds/voice/default/demopuzzfail3.ogg
-voice/default/puzzfail4 sounds/voice/default/demopuzzfail4.ogg
-voice/default/puzzfail5 sounds/voice/default/demopuzzfail5.ogg
-voice/default/puzzfail6 sounds/voice/default/demopuzzfail6.ogg
-voice/default/puzzsucc1 sounds/voice/default/demopuzzsucc1.ogg
-voice/default/puzzsucc2 sounds/voice/default/demopuzzsucc2.ogg
-voice/default/puzzsucc3 sounds/voice/default/demopuzzsucc3.ogg
-voice/default/puzzsucc4 sounds/voice/default/demopuzzsucc4.ogg
-voice/default/puzzsucc5 sounds/voice/default/demopuzzsucc5.ogg
-voice/default/scorekill1 sounds/voice/default/demoscorekill1.ogg
-voice/default/scorekill2 sounds/voice/default/demoscorekill2.ogg
-voice/default/scorekill3 sounds/voice/default/demoscorekill3.ogg
-voice/default/scorekill4 sounds/voice/default/demoscorekill4.ogg
-voice/default/scorekill5 sounds/voice/default/demoscorekill5.ogg
-voice/default/scorekill6 sounds/voice/default/demoscorekill6.ogg
-voice/default/scorekill7 sounds/voice/default/demoscorekill7.ogg
-voice/default/scorekill8 sounds/voice/default/demoscorekill8.ogg
-voice/default/scorekill9 sounds/voice/default/demoscorekill9.ogg
-voice/default/scorekill10 sounds/voice/default/demoscorekill10.ogg
-voice/default/scorekill11 sounds/voice/default/demoscorekill11.ogg
-voice/default/scorekill12 sounds/voice/default/demoscorekill12.ogg
-voice/default/scorekill13 sounds/voice/default/demoscorekill13.ogg
-voice/default/scorekill14 sounds/voice/default/demoscorekill14.ogg
-voice/default/scorekill15 sounds/voice/default/demoscorekill15.ogg
-voice/default/scorekill16 sounds/voice/default/demoscorekill16.ogg
-voice/default/scorekill17 sounds/voice/default/demoscorekill17.ogg
-voice/default/scorekill18 sounds/voice/default/demoscorekill18.ogg
-voice/default/scorekill19 sounds/voice/default/demoscorekill19.ogg
-voice/default/scorekill20 sounds/voice/default/demoscorekill20.ogg
-voice/default/scorekill21 sounds/voice/default/demoscorekill21.ogg
-voice/default/scorekill22 sounds/voice/default/demoscorekill22.ogg
-voice/default/scorekill23 sounds/voice/default/demoscorekill23.ogg
-voice/default/scorekill24 sounds/voice/default/demoscorekill24.ogg
-voice/default/scorekill25 sounds/voice/default/demoscorekill25.ogg
-voice/default/scorekill26 sounds/voice/default/demoscorekill26.ogg
-voice/default/friendkill1 sounds/voice/default/demofriendkill1.ogg
-voice/default/friendkill2 sounds/voice/default/demofriendkill2.ogg
-voice/default/friendkill3 sounds/voice/default/demofriendkill3.ogg
-voice/default/friendkill4 sounds/voice/default/demofriendkill4.ogg
-voice/default/gethit1 sounds/voice/default/demogethit1.ogg
-voice/default/gethit2 sounds/voice/default/demogethit2.ogg
-voice/default/gethit3 sounds/voice/default/demogethit3.ogg
-voice/default/gethit4 sounds/voice/default/demogethit4.ogg
-voice/default/gethit5 sounds/voice/default/demogethit5.ogg
-voice/default/gethit6 sounds/voice/default/demogethit6.ogg
-voice/default/gethit7 sounds/voice/default/demogethit7.ogg
-voice/default/gethit8 sounds/voice/default/demogethit8.ogg
-voice/default/gethit9 sounds/voice/default/demogethit9.ogg
-voice/default/gethit10 sounds/voice/default/demogethit10.ogg
-voice/default/gethit11 sounds/voice/default/demogethit11.ogg
-voice/default/gethit12 sounds/voice/default/demogethit12.ogg
-voice/default/gethit13 sounds/voice/default/demogethit13.ogg
-voice/default/gethit14 sounds/voice/default/demogethit14.ogg
-voice/default/gethit15 sounds/voice/default/demogethit15.ogg
-voice/default/gethit16 sounds/voice/default/demogethit16.ogg
-voice/default/gethit17 sounds/voice/default/demogethit17.ogg
-voice/default/gethit18 sounds/voice/default/demogethit18.ogg
-voice/default/gethit19 sounds/voice/default/demogethit19.ogg
-voice/default/friendhit1 sounds/voice/default/demofriendhit1.ogg
-voice/default/friendhit2 sounds/voice/default/demofriendhit2.ogg
-voice/default/friendhit3 sounds/voice/default/demofriendhit3.ogg
-voice/default/friendhit4 sounds/voice/default/demofriendhit4.ogg
-voice/default/friendhit5 sounds/voice/default/demofriendhit5.ogg
-voice/default/friendhit6 sounds/voice/default/demofriendhit6.ogg
-voice/default/friendhit7 sounds/voice/default/demofriendhit7.ogg
-voice/default/greet1 sounds/voice/default/demogreet1.ogg
-voice/default/greet2 sounds/voice/default/demogreet2.ogg
-voice/default/greet3 sounds/voice/default/demogreet3.ogg
-voice/default/greet4 sounds/voice/default/demogreet4.ogg
-voice/default/greet5 sounds/voice/default/demogreet5.ogg
-voice/default/greet6 sounds/voice/default/demogreet6.ogg
-voice/default/greet7 sounds/voice/default/demogreet7.ogg
-voice/default/hitfriend1 sounds/voice/default/demohitfriend1.ogg
-voice/default/hitfriend2 sounds/voice/default/demohitfriend2.ogg
-voice/default/hitfriend3 sounds/voice/default/demohitfriend3.ogg
-voice/default/ragekit1 sounds/voice/default/demoragekit1.ogg
-voice/default/ragekit2 sounds/voice/default/demoragekit2.ogg
-voice/default/ragekit3 sounds/voice/default/demoragekit3.ogg
-voice/default/ragekit4 sounds/voice/default/demoragekit4.ogg
-voice/default/ragekit5 sounds/voice/default/demoragekit5.ogg
-voice/default/ragekit6 sounds/voice/default/demoragekit6.ogg
-voice/default/koraxgreet1 sounds/voice/default/demokoraxgreet1.ogg
-voice/default/koraxgreet2 sounds/voice/default/demokoraxgreet2.ogg
-voice/default/koraxgreet3 sounds/voice/default/demokoraxgreet3.ogg
-voice/default/koraxgreet4 sounds/voice/default/demokoraxgreet4.ogg
-voice/default/koraxgreet5 sounds/voice/default/demokoraxgreet5.ogg
-voice/default/koraxgreet6 sounds/voice/default/demokoraxgreet6.ogg
-voice/default/koraxgreet7 sounds/voice/default/demokoraxgreet7.ogg
-voice/default/koraxgreet8 sounds/voice/default/demokoraxgreet8.ogg
-voice/default/koraxgreet9 sounds/voice/default/demokoraxgreet9.ogg
-voice/default/koraxgreet10 sounds/voice/default/demokoraxgreet10.ogg
-voice/default/koraxgreet11 sounds/voice/default/demokoraxgreet11.ogg
-voice/default/koraxgreet12 sounds/voice/default/demokoraxgreet12.ogg
-voice/default/koraxgreet13 sounds/voice/default/demokoraxgreet13.ogg
-voice/default/koraxblood1 sounds/voice/default/demokoraxblood1.ogg
-voice/default/koraxblood2 sounds/voice/default/demokoraxblood2.ogg
-voice/default/koraxblood3 sounds/voice/default/demokoraxblood3.ogg
-voice/default/koraxblood4 sounds/voice/default/demokoraxblood4.ogg
-voice/default/koraxblood5 sounds/voice/default/demokoraxblood5.ogg
-voice/default/koraxblood6 sounds/voice/default/demokoraxblood6.ogg
-voice/default/koraxblood7 sounds/voice/default/demokoraxblood7.ogg
-voice/default/koraxblood8 sounds/voice/default/demokoraxblood8.ogg
-voice/default/koraxblood9 sounds/voice/default/demokoraxblood9.ogg
-voice/default/koraxblood10 sounds/voice/default/demokoraxblood10.ogg
-voice/default/koraxblood11 sounds/voice/default/demokoraxblood11.ogg
-voice/default/koraxblood12 sounds/voice/default/demokoraxblood12.ogg
-voice/default/koraxblood13 sounds/voice/default/demokoraxblood13.ogg
-voice/default/koraxgame1 sounds/voice/default/demokoraxgame1.ogg
-voice/default/koraxgame2 sounds/voice/default/demokoraxgame2.ogg
-voice/default/koraxgame3 sounds/voice/default/demokoraxgame3.ogg
-voice/default/koraxgame4 sounds/voice/default/demokoraxgame4.ogg
-voice/default/koraxgame5 sounds/voice/default/demokoraxgame5.ogg
-voice/default/koraxgame6 sounds/voice/default/demokoraxgame6.ogg
-voice/default/koraxgame7 sounds/voice/default/demokoraxgame7.ogg
-voice/default/koraxgame8 sounds/voice/default/demokoraxgame8.ogg
-voice/default/koraxgame9 sounds/voice/default/demokoraxgame9.ogg
-voice/default/koraxgame10 sounds/voice/default/demokoraxgame10.ogg
-voice/default/koraxgame11 sounds/voice/default/demokoraxgame11.ogg
-voice/default/koraxgame12 sounds/voice/default/demokoraxgame12.ogg
-voice/default/koraxgame13 sounds/voice/default/demokoraxgame13.ogg
-voice/default/koraxgame14 sounds/voice/default/demokoraxgame14.ogg
-voice/default/koraxworship1 sounds/voice/default/demokoraxworship1.ogg
-voice/default/koraxworship2 sounds/voice/default/demokoraxworship2.ogg
-voice/default/koraxworship3 sounds/voice/default/demokoraxworship3.ogg
-voice/default/koraxworship4 sounds/voice/default/demokoraxworship4.ogg
-voice/default/koraxworship5 sounds/voice/default/demokoraxworship5.ogg
-voice/default/koraxworship6 sounds/voice/default/demokoraxworship6.ogg
-voice/default/koraxworship7 sounds/voice/default/demokoraxworship7.ogg
-voice/default/koraxworship8 sounds/voice/default/demokoraxworship8.ogg
-voice/default/koraxworship9 sounds/voice/default/demokoraxworship9.ogg
-voice/default/koraxworship10 sounds/voice/default/demokoraxworship10.ogg
-voice/default/koraxworship11 sounds/voice/default/demokoraxworship11.ogg
-voice/default/koraxmasters1 sounds/voice/default/demokoraxmasters1.ogg
-voice/default/koraxmasters2 sounds/voice/default/demokoraxmasters2.ogg
-voice/default/koraxmasters3 sounds/voice/default/demokoraxmasters3.ogg
-voice/default/koraxmasters4 sounds/voice/default/demokoraxmasters4.ogg
-voice/default/koraxmasters5 sounds/voice/default/demokoraxmasters5.ogg
-voice/default/koraxmasters6 sounds/voice/default/demokoraxmasters6.ogg
-voice/default/koraxmasters7 sounds/voice/default/demokoraxmasters7.ogg
-voice/default/koraxmasters8 sounds/voice/default/demokoraxmasters8.ogg
-voice/default/koraxmasters9 sounds/voice/default/demokoraxmasters9.ogg
-voice/default/giggle1 sounds/voice/default/demogiggle1.ogg
-voice/default/giggle2 sounds/voice/default/demogiggle2.ogg
-voice/default/giggle3 sounds/voice/default/demogiggle3.ogg
-voice/default/giggle4 sounds/voice/default/demogiggle4.ogg
-voice/default/giggle5 sounds/voice/default/demogiggle5.ogg
-voice/default/giggle6 sounds/voice/default/demogiggle6.ogg
-voice/default/giggle7 sounds/voice/default/demogiggle7.ogg
-voice/default/giggle8 sounds/voice/default/demogiggle8.ogg
-voice/default/giggle9 sounds/voice/default/demogiggle9.ogg
-voice/default/giggle10 sounds/voice/default/demogiggle10.ogg
-voice/default/giggle11 sounds/voice/default/demogiggle11.ogg
-voice/default/giggle12 sounds/voice/default/demogiggle12.ogg
-voice/default/giggle13 sounds/voice/default/demogiggle13.ogg
-voice/default/giggle14 sounds/voice/default/demogiggle14.ogg
-voice/default/giggle15 sounds/voice/default/demogiggle15.ogg
-voice/default/giggle16 sounds/voice/default/demogiggle16.ogg
-voice/default/giggle17 sounds/voice/default/demogiggle17.ogg
-voice/default/giggle18 sounds/voice/default/demogiggle18.ogg
-voice/default/giggle19 sounds/voice/default/demogiggle19.ogg
-voice/default/hug1 sounds/voice/default/demohug1.ogg
-voice/default/hug2 sounds/voice/default/demohug2.ogg
-voice/default/hug3 sounds/voice/default/demohug3.ogg
-voice/default/hug4 sounds/voice/default/demohug4.ogg
-voice/default/hug5 sounds/voice/default/demohug5.ogg
-voice/default/hug6 sounds/voice/default/demohug6.ogg
-voice/default/hug7 sounds/voice/default/demohug7.ogg
-voice/default/hug8 sounds/voice/default/demohug8.ogg
-voice/default/hug9 sounds/voice/default/demohug9.ogg
$random voice/default/grunt { voice/default/grunt1 voice/default/grunt2 voice/default/grunt3 voice/default/grunt4 voice/default/grunt5 voice/default/grunt6 }
$random voice/default/lopain { voice/default/lopain1 voice/default/lopain2 voice/default/lopain3 voice/default/lopain4 voice/default/lopain5 }
@@ -322,10 +90,599 @@ $random voice/default/pain { voice/default/pain1 voice/default/pain2 voice/defau
$random voice/default/hipain { voice/default/hipain1 voice/default/hipain2 voice/default/hipain3 voice/default/hipain4 voice/default/hipain5 }
$random voice/default/death { voice/default/death1 voice/default/death2 voice/default/death3 voice/default/death4 voice/default/death5 }
-$random voice/default/giggle { voice/default/giggle1 voice/default/giggle2 voice/default/giggle3 voice/default/giggle4 voice/default/giggle5 voice/default/giggle6 voice/default/giggle7 voice/default/giggle8 voice/default/giggle9 voice/default/giggle10 voice/default/giggle11 voice/default/giggle12 voice/default/giggle13 voice/default/giggle14 voice/default/giggle15 voice/default/giggle16 voice/default/giggle17 voice/default/giggle18 voice/default/giggle19 }
-$random voice/default/hug { voice/default/hug1 voice/default/hug2 voice/default/hug3 voice/default/hug4 voice/default/hug5 voice/default/hug6 voice/default/hug7 voice/default/hug8 voice/default/hug9 }
-$random voice/default/gigglelow { voice/default/giggle1 voice/default/giggle2 voice/default/giggle5 voice/default/giggle6 voice/default/giggle8 voice/default/giggle10 voice/default/giggle15 voice/default/giggle16 voice/default/giggle18 }
-$random voice/default/gigglehigh { voice/default/giggle3 voice/default/giggle4 voice/default/giggle7 voice/default/giggle9 voice/default/giggle11 voice/default/giggle12 voice/default/giggle13 voice/default/giggle14 voice/default/giggle17 }
+voice/default/fightstart1 sounds/voice/default/va/demofightstart1.ogg
+voice/default/fightstart2 sounds/voice/default/va/demofightstart2.ogg
+voice/default/fightstart3 sounds/voice/default/va/demofightstart3.ogg
+voice/default/fightstart4 sounds/voice/default/va/demofightstart4.ogg
+voice/default/fightstart5 sounds/voice/default/va/demofightstart5.ogg
+voice/default/fightstart6 sounds/voice/default/va/demofightstart6.ogg
+voice/default/fightstart7 sounds/voice/default/va/demofightstart7.ogg
+voice/default/fightstart8 sounds/voice/default/va/demofightstart8.ogg
+voice/default/fightstart9 sounds/voice/default/va/demofightstart9.ogg
+voice/default/fightstart10 sounds/voice/default/va/demofightstart10.ogg
+voice/default/fightstart11 sounds/voice/default/va/demofightstart11.ogg
+voice/default/fightstart12 sounds/voice/default/va/demofightstart12.ogg
+voice/default/fightstart13 sounds/voice/default/va/demofightstart13.ogg
+voice/default/fightstart14 sounds/voice/default/va/demofightstart14.ogg
+voice/default/fightstart15 sounds/voice/default/va/demofightstart15.ogg
+voice/default/fightstart16 sounds/voice/default/va/demofightstart16.ogg
+voice/default/fightstart17 sounds/voice/default/va/demofightstart17.ogg
+voice/default/fightstart18 sounds/voice/default/va/demofightstart18.ogg
+voice/default/fightstart19 sounds/voice/default/va/demofightstart19.ogg
+voice/default/fightstart20 sounds/voice/default/va/demofightstart20.ogg
+voice/default/fightstart21 sounds/voice/default/va/demofightstart21.ogg
+voice/default/findsecret1 sounds/voice/default/va/demofindsecret1.ogg
+voice/default/findsecret2 sounds/voice/default/va/demofindsecret2.ogg
+voice/default/findsecret3 sounds/voice/default/va/demofindsecret3.ogg
+voice/default/findsecret4 sounds/voice/default/va/demofindsecret4.ogg
+voice/default/findsecret5 sounds/voice/default/va/demofindsecret5.ogg
+voice/default/findsecret6 sounds/voice/default/va/demofindsecret6.ogg
+voice/default/findsecret7 sounds/voice/default/va/demofindsecret7.ogg
+voice/default/findsecret8 sounds/voice/default/va/demofindsecret8.ogg
+voice/default/findsecret9 sounds/voice/default/va/demofindsecret9.ogg
+voice/default/findsecret10 sounds/voice/default/va/demofindsecret10.ogg
+voice/default/findsecret11 sounds/voice/default/va/demofindsecret11.ogg
+voice/default/findsecret12 sounds/voice/default/va/demofindsecret12.ogg
+voice/default/findsecret13 sounds/voice/default/va/demofindsecret13.ogg
+voice/default/getweapon1 sounds/voice/default/va/demogetweapon1.ogg
+voice/default/getweapon2 sounds/voice/default/va/demogetweapon2.ogg
+voice/default/getweapon3 sounds/voice/default/va/demogetweapon3.ogg
+voice/default/getweapon4 sounds/voice/default/va/demogetweapon4.ogg
+voice/default/getweapon5 sounds/voice/default/va/demogetweapon5.ogg
+voice/default/getweapon6 sounds/voice/default/va/demogetweapon6.ogg
+voice/default/getweapon7 sounds/voice/default/va/demogetweapon7.ogg
+voice/default/getweapon8 sounds/voice/default/va/demogetweapon8.ogg
+voice/default/getweapon9 sounds/voice/default/va/demogetweapon9.ogg
+voice/default/getweapon10 sounds/voice/default/va/demogetweapon10.ogg
+voice/default/getweapon11 sounds/voice/default/va/demogetweapon11.ogg
+voice/default/getweapon12 sounds/voice/default/va/demogetweapon12.ogg
+voice/default/getweapon13 sounds/voice/default/va/demogetweapon13.ogg
+voice/default/locked1 sounds/voice/default/va/demolocked1.ogg
+voice/default/locked2 sounds/voice/default/va/demolocked2.ogg
+voice/default/locked3 sounds/voice/default/va/demolocked3.ogg
+voice/default/locked4 sounds/voice/default/va/demolocked4.ogg
+voice/default/locked5 sounds/voice/default/va/demolocked5.ogg
+voice/default/locked6 sounds/voice/default/va/demolocked6.ogg
+voice/default/jammed1 sounds/voice/default/va/demojammed1.ogg
+voice/default/jammed2 sounds/voice/default/va/demojammed2.ogg
+voice/default/jammed3 sounds/voice/default/va/demojammed3.ogg
+voice/default/jammed4 sounds/voice/default/va/demojammed4.ogg
+voice/default/jammed5 sounds/voice/default/va/demojammed5.ogg
+voice/default/jammed6 sounds/voice/default/va/demojammed6.ogg
+voice/default/jammed7 sounds/voice/default/va/demojammed7.ogg
+voice/default/mapstart1 sounds/voice/default/va/demomapstart1.ogg
+voice/default/mapstart2 sounds/voice/default/va/demomapstart2.ogg
+voice/default/mapstart3 sounds/voice/default/va/demomapstart3.ogg
+voice/default/mapstart4 sounds/voice/default/va/demomapstart4.ogg
+voice/default/mapstart5 sounds/voice/default/va/demomapstart5.ogg
+voice/default/mapstart6 sounds/voice/default/va/demomapstart6.ogg
+voice/default/mapstart7 sounds/voice/default/va/demomapstart7.ogg
+voice/default/mapstart8 sounds/voice/default/va/demomapstart8.ogg
+voice/default/mapstart9 sounds/voice/default/va/demomapstart9.ogg
+voice/default/mapstart10 sounds/voice/default/va/demomapstart10.ogg
+voice/default/mapstart11 sounds/voice/default/va/demomapstart11.ogg
+voice/default/mapstart12 sounds/voice/default/va/demomapstart12.ogg
+voice/default/mapstart13 sounds/voice/default/va/demomapstart13.ogg
+voice/default/mapstart14 sounds/voice/default/va/demomapstart14.ogg
+voice/default/puzzfail1 sounds/voice/default/va/demopuzzfail1.ogg
+voice/default/puzzfail2 sounds/voice/default/va/demopuzzfail2.ogg
+voice/default/puzzfail3 sounds/voice/default/va/demopuzzfail3.ogg
+voice/default/puzzfail4 sounds/voice/default/va/demopuzzfail4.ogg
+voice/default/puzzfail5 sounds/voice/default/va/demopuzzfail5.ogg
+voice/default/puzzfail6 sounds/voice/default/va/demopuzzfail6.ogg
+voice/default/puzzsucc1 sounds/voice/default/va/demopuzzsucc1.ogg
+voice/default/puzzsucc2 sounds/voice/default/va/demopuzzsucc2.ogg
+voice/default/puzzsucc3 sounds/voice/default/va/demopuzzsucc3.ogg
+voice/default/puzzsucc4 sounds/voice/default/va/demopuzzsucc4.ogg
+voice/default/puzzsucc5 sounds/voice/default/va/demopuzzsucc5.ogg
+voice/default/puzzsucc6 sounds/voice/default/va/demopuzzsucc6.ogg
+voice/default/scorekill1 sounds/voice/default/va/demoscorekill1.ogg
+voice/default/scorekill2 sounds/voice/default/va/demoscorekill2.ogg
+voice/default/scorekill3 sounds/voice/default/va/demoscorekill3.ogg
+voice/default/scorekill4 sounds/voice/default/va/demoscorekill4.ogg
+voice/default/scorekill5 sounds/voice/default/va/demoscorekill5.ogg
+voice/default/scorekill6 sounds/voice/default/va/demoscorekill6.ogg
+voice/default/scorekill7 sounds/voice/default/va/demoscorekill7.ogg
+voice/default/scorekill8 sounds/voice/default/va/demoscorekill8.ogg
+voice/default/scorekill9 sounds/voice/default/va/demoscorekill9.ogg
+voice/default/scorekill10 sounds/voice/default/va/demoscorekill10.ogg
+voice/default/scorekill11 sounds/voice/default/va/demoscorekill11.ogg
+voice/default/scorekill12 sounds/voice/default/va/demoscorekill12.ogg
+voice/default/scorekill13 sounds/voice/default/va/demoscorekill13.ogg
+voice/default/scorekill14 sounds/voice/default/va/demoscorekill14.ogg
+voice/default/scorekill15 sounds/voice/default/va/demoscorekill15.ogg
+voice/default/scorekill16 sounds/voice/default/va/demoscorekill16.ogg
+voice/default/scorekill17 sounds/voice/default/va/demoscorekill17.ogg
+voice/default/scorekill18 sounds/voice/default/va/demoscorekill18.ogg
+voice/default/scorekill19 sounds/voice/default/va/demoscorekill19.ogg
+voice/default/scorekill20 sounds/voice/default/va/demoscorekill20.ogg
+voice/default/scorekill21 sounds/voice/default/va/demoscorekill21.ogg
+voice/default/scorekill22 sounds/voice/default/va/demoscorekill22.ogg
+voice/default/scorekill23 sounds/voice/default/va/demoscorekill23.ogg
+voice/default/scorekill24 sounds/voice/default/va/demoscorekill24.ogg
+voice/default/scorekill25 sounds/voice/default/va/demoscorekill25.ogg
+voice/default/friendkill1 sounds/voice/default/va/demofriendkill1.ogg
+voice/default/friendkill2 sounds/voice/default/va/demofriendkill2.ogg
+voice/default/friendkill3 sounds/voice/default/va/demofriendkill3.ogg
+voice/default/friendkill4 sounds/voice/default/va/demofriendkill4.ogg
+voice/default/gethit1 sounds/voice/default/va/demogethit1.ogg
+voice/default/gethit2 sounds/voice/default/va/demogethit2.ogg
+voice/default/gethit3 sounds/voice/default/va/demogethit3.ogg
+voice/default/gethit4 sounds/voice/default/va/demogethit4.ogg
+voice/default/gethit5 sounds/voice/default/va/demogethit5.ogg
+voice/default/gethit6 sounds/voice/default/va/demogethit6.ogg
+voice/default/gethit7 sounds/voice/default/va/demogethit7.ogg
+voice/default/gethit8 sounds/voice/default/va/demogethit8.ogg
+voice/default/gethit9 sounds/voice/default/va/demogethit9.ogg
+voice/default/gethit10 sounds/voice/default/va/demogethit10.ogg
+voice/default/gethit11 sounds/voice/default/va/demogethit11.ogg
+voice/default/gethit12 sounds/voice/default/va/demogethit12.ogg
+voice/default/gethit13 sounds/voice/default/va/demogethit13.ogg
+voice/default/gethit14 sounds/voice/default/va/demogethit14.ogg
+voice/default/gethit15 sounds/voice/default/va/demogethit15.ogg
+voice/default/gethit16 sounds/voice/default/va/demogethit16.ogg
+voice/default/gethit17 sounds/voice/default/va/demogethit17.ogg
+voice/default/gethit18 sounds/voice/default/va/demogethit18.ogg
+voice/default/gethit19 sounds/voice/default/va/demogethit19.ogg
+voice/default/friendhit1 sounds/voice/default/va/demofriendhit1.ogg
+voice/default/friendhit2 sounds/voice/default/va/demofriendhit2.ogg
+voice/default/friendhit3 sounds/voice/default/va/demofriendhit3.ogg
+voice/default/friendhit4 sounds/voice/default/va/demofriendhit4.ogg
+voice/default/friendhit5 sounds/voice/default/va/demofriendhit5.ogg
+voice/default/friendhit6 sounds/voice/default/va/demofriendhit6.ogg
+voice/default/friendhit7 sounds/voice/default/va/demofriendhit7.ogg
+voice/default/greet1 sounds/voice/default/va/demogreet1.ogg
+voice/default/greet2 sounds/voice/default/va/demogreet2.ogg
+voice/default/greet3 sounds/voice/default/va/demogreet3.ogg
+voice/default/greet4 sounds/voice/default/va/demogreet4.ogg
+voice/default/greet5 sounds/voice/default/va/demogreet5.ogg
+voice/default/greet6 sounds/voice/default/va/demogreet6.ogg
+voice/default/greet7 sounds/voice/default/va/demogreet7.ogg
+voice/default/hitfriend1 sounds/voice/default/va/demohitfriend1.ogg
+voice/default/hitfriend2 sounds/voice/default/va/demohitfriend2.ogg
+voice/default/hitfriend3 sounds/voice/default/va/demohitfriend3.ogg
+voice/default/ragekit1 sounds/voice/default/va/demoragekit1.ogg
+voice/default/ragekit2 sounds/voice/default/va/demoragekit2.ogg
+voice/default/ragekit3 sounds/voice/default/va/demoragekit3.ogg
+voice/default/ragekit4 sounds/voice/default/va/demoragekit4.ogg
+voice/default/ragekit5 sounds/voice/default/va/demoragekit5.ogg
+voice/default/ragekit6 sounds/voice/default/va/demoragekit6.ogg
+voice/default/ragekit7 sounds/voice/default/va/demoragekit7.ogg
+voice/default/ragekit8 sounds/voice/default/va/demoragekit8.ogg
+voice/default/ragekit9 sounds/voice/default/va/demoragekit9.ogg
+voice/default/ragekit10 sounds/voice/default/va/demoragekit10.ogg
+voice/default/ragekit11 sounds/voice/default/va/demoragekit11.ogg
+voice/default/ragekit12 sounds/voice/default/va/demoragekit12.ogg
+voice/default/ragekit13 sounds/voice/default/va/demoragekit13.ogg
+voice/default/ragekit14 sounds/voice/default/va/demoragekit14.ogg
+voice/default/ragekit15 sounds/voice/default/va/demoragekit15.ogg
+voice/default/ragekit16 sounds/voice/default/va/demoragekit16.ogg
+voice/default/ragekit17 sounds/voice/default/va/demoragekit17.ogg
+voice/default/koraxgreet1 sounds/voice/default/va/demokoraxgreet1.ogg
+voice/default/koraxgreet2 sounds/voice/default/va/demokoraxgreet2.ogg
+voice/default/koraxgreet3 sounds/voice/default/va/demokoraxgreet3.ogg
+voice/default/koraxgreet4 sounds/voice/default/va/demokoraxgreet4.ogg
+voice/default/koraxgreet5 sounds/voice/default/va/demokoraxgreet5.ogg
+voice/default/koraxgreet6 sounds/voice/default/va/demokoraxgreet6.ogg
+voice/default/koraxgreet7 sounds/voice/default/va/demokoraxgreet7.ogg
+voice/default/koraxgreet8 sounds/voice/default/va/demokoraxgreet8.ogg
+voice/default/koraxgreet9 sounds/voice/default/va/demokoraxgreet9.ogg
+voice/default/koraxgreet10 sounds/voice/default/va/demokoraxgreet10.ogg
+voice/default/koraxgreet11 sounds/voice/default/va/demokoraxgreet11.ogg
+voice/default/koraxgreet12 sounds/voice/default/va/demokoraxgreet12.ogg
+voice/default/koraxgreet13 sounds/voice/default/va/demokoraxgreet13.ogg
+voice/default/koraxblood1 sounds/voice/default/va/demokoraxblood1.ogg
+voice/default/koraxblood2 sounds/voice/default/va/demokoraxblood2.ogg
+voice/default/koraxblood3 sounds/voice/default/va/demokoraxblood3.ogg
+voice/default/koraxblood4 sounds/voice/default/va/demokoraxblood4.ogg
+voice/default/koraxblood5 sounds/voice/default/va/demokoraxblood5.ogg
+voice/default/koraxblood6 sounds/voice/default/va/demokoraxblood6.ogg
+voice/default/koraxblood7 sounds/voice/default/va/demokoraxblood7.ogg
+voice/default/koraxblood8 sounds/voice/default/va/demokoraxblood8.ogg
+voice/default/koraxblood9 sounds/voice/default/va/demokoraxblood9.ogg
+voice/default/koraxblood10 sounds/voice/default/va/demokoraxblood10.ogg
+voice/default/koraxblood11 sounds/voice/default/va/demokoraxblood11.ogg
+voice/default/koraxblood12 sounds/voice/default/va/demokoraxblood12.ogg
+voice/default/koraxblood13 sounds/voice/default/va/demokoraxblood13.ogg
+voice/default/koraxgame1 sounds/voice/default/va/demokoraxgame1.ogg
+voice/default/koraxgame2 sounds/voice/default/va/demokoraxgame2.ogg
+voice/default/koraxgame3 sounds/voice/default/va/demokoraxgame3.ogg
+voice/default/koraxgame4 sounds/voice/default/va/demokoraxgame4.ogg
+voice/default/koraxgame5 sounds/voice/default/va/demokoraxgame5.ogg
+voice/default/koraxgame6 sounds/voice/default/va/demokoraxgame6.ogg
+voice/default/koraxgame7 sounds/voice/default/va/demokoraxgame7.ogg
+voice/default/koraxgame8 sounds/voice/default/va/demokoraxgame8.ogg
+voice/default/koraxgame9 sounds/voice/default/va/demokoraxgame9.ogg
+voice/default/koraxgame10 sounds/voice/default/va/demokoraxgame10.ogg
+voice/default/koraxgame11 sounds/voice/default/va/demokoraxgame11.ogg
+voice/default/koraxgame12 sounds/voice/default/va/demokoraxgame12.ogg
+voice/default/koraxgame13 sounds/voice/default/va/demokoraxgame13.ogg
+voice/default/koraxgame14 sounds/voice/default/va/demokoraxgame14.ogg
+voice/default/koraxworship1 sounds/voice/default/va/demokoraxworship1.ogg
+voice/default/koraxworship2 sounds/voice/default/va/demokoraxworship2.ogg
+voice/default/koraxworship3 sounds/voice/default/va/demokoraxworship3.ogg
+voice/default/koraxworship4 sounds/voice/default/va/demokoraxworship4.ogg
+voice/default/koraxworship5 sounds/voice/default/va/demokoraxworship5.ogg
+voice/default/koraxworship6 sounds/voice/default/va/demokoraxworship6.ogg
+voice/default/koraxworship7 sounds/voice/default/va/demokoraxworship7.ogg
+voice/default/koraxworship8 sounds/voice/default/va/demokoraxworship8.ogg
+voice/default/koraxworship9 sounds/voice/default/va/demokoraxworship9.ogg
+voice/default/koraxworship10 sounds/voice/default/va/demokoraxworship10.ogg
+voice/default/koraxworship11 sounds/voice/default/va/demokoraxworship11.ogg
+voice/default/koraxmasters1 sounds/voice/default/va/demokoraxmasters1.ogg
+voice/default/koraxmasters2 sounds/voice/default/va/demokoraxmasters2.ogg
+voice/default/koraxmasters3 sounds/voice/default/va/demokoraxmasters3.ogg
+voice/default/koraxmasters4 sounds/voice/default/va/demokoraxmasters4.ogg
+voice/default/koraxmasters5 sounds/voice/default/va/demokoraxmasters5.ogg
+voice/default/koraxmasters6 sounds/voice/default/va/demokoraxmasters6.ogg
+voice/default/koraxmasters7 sounds/voice/default/va/demokoraxmasters7.ogg
+voice/default/koraxmasters8 sounds/voice/default/va/demokoraxmasters8.ogg
+voice/default/koraxmasters9 sounds/voice/default/va/demokoraxmasters9.ogg
+voice/default/getdeepimpact sounds/voice/default/va/demogetdeepimpact.ogg
+voice/default/getpusherweapon sounds/voice/default/va/demogetpusherweapon.ogg
+voice/default/getexplodiumgun1 sounds/voice/default/va/demogetexplodiumgun1.ogg
+voice/default/getexplodiumgun2 sounds/voice/default/va/demogetexplodiumgun2.ogg
+voice/default/getspreadgun sounds/voice/default/va/demogetspreadgun.ogg
+voice/default/getwallbuster sounds/voice/default/va/demogetwallbuster.ogg
+voice/default/geteviscerator sounds/voice/default/va/demogeteviscerator.ogg
+voice/default/gethellblazer sounds/voice/default/va/demogethellblazer.ogg
+voice/default/getsparkster sounds/voice/default/va/demogetsparkster.ogg
+voice/default/getsilverbullet sounds/voice/default/va/demogetsilverbullet.ogg
+voice/default/getcandygun sounds/voice/default/va/demogetcandygun.ogg
+voice/default/getynykron sounds/voice/default/va/demogetynykron.ogg
+voice/default/getitamexhammer sounds/voice/default/va/demogetitamexhammer.ogg
+voice/default/getplasmablast1 sounds/voice/default/va/demogetplasmablast1.ogg
+voice/default/getplasmablast2 sounds/voice/default/va/demogetplasmablast2.ogg
+voice/default/getpuntzerbeta sounds/voice/default/va/demogetpuntzerbeta.ogg
+voice/default/getpuntzergamma sounds/voice/default/va/demogetpuntzergamma.ogg
+voice/default/getheavymahsheengun sounds/voice/default/va/demogetheavymahsheengun.ogg
+voice/default/getquadravol sounds/voice/default/va/demogetquadravol.ogg
+voice/default/getblackfireigniter sounds/voice/default/va/demogetblackfireigniter.ogg
+voice/default/getempcarbine sounds/voice/default/va/demogetempcarbine.ogg
+voice/default/getraykhom sounds/voice/default/va/demogetraykhomdeepimpact.ogg
+voice/default/getgrandlance sounds/voice/default/va/demogetgrandlance.ogg
+voice/default/getwhiteglove sounds/voice/default/va/demogetwhiteglove.ogg
+voice/default/getnewsparkster sounds/voice/default/va/demogetnewsparkster.ogg
+voice/default/getmortalrifle sounds/voice/default/va/demogetmortalrifle.ogg
+voice/default/getrafankos sounds/voice/default/va/demogetrafankos.ogg
+voice/default/keyget1 sounds/voice/default/va/demokeyget1.ogg
+voice/default/keyget2 sounds/voice/default/va/demokeyget2.ogg
+voice/default/keyget3 sounds/voice/default/va/demokeyget3.ogg
+voice/default/keyget4 sounds/voice/default/va/demokeyget4.ogg
+voice/default/keyget5 sounds/voice/default/va/demokeyget5.ogg
+voice/default/usefail1 sounds/voice/default/va/demousefail1.ogg
+voice/default/usefail2 sounds/voice/default/va/demousefail2.ogg
+voice/default/usefail3 sounds/voice/default/va/demousefail3.ogg
+voice/default/usefail4 sounds/voice/default/va/demousefail4.ogg
+voice/default/usefail5 sounds/voice/default/va/demousefail5.ogg
+voice/default/usefail6 sounds/voice/default/va/demousefail6.ogg
+voice/default/usefail7 sounds/voice/default/va/demousefail7.ogg
+voice/default/usefail8 sounds/voice/default/va/demousefail8.ogg
+voice/default/usefail9 sounds/voice/default/va/demousefail9.ogg
+voice/default/usegrunt1 sounds/voice/default/va/demousegrunt1.ogg
+voice/default/usegrunt2 sounds/voice/default/va/demousegrunt2.ogg
+voice/default/usegrunt3 sounds/voice/default/va/demousegrunt3.ogg
+voice/default/usegrunt4 sounds/voice/default/va/demousegrunt4.ogg
+$random voice/default/usegrunt { voice/default/usegrunt1 voice/default/usegrunt2 voice/default/usegrunt3 voice/default/usegrunt4 }
+voice/default/cubeget sounds/voice/default/va/democubeget.ogg
+voice/default/akariget sounds/voice/default/va/demoakariget.ogg
+voice/default/signalsget sounds/voice/default/va/demosignalsget.ogg
+voice/default/nutatcoget sounds/voice/default/va/demonutatcoget.ogg
+voice/default/frispyget sounds/voice/default/va/demofrispyget.ogg
+voice/default/sayaget sounds/voice/default/va/demosayaget.ogg
+voice/default/mothget sounds/voice/default/va/demomothget.ogg
+voice/default/demoget sounds/voice/default/va/demodemoget.ogg
+voice/default/peachget sounds/voice/default/va/demopeachget.ogg
+voice/default/breadget sounds/voice/default/va/demobreadget.ogg
+voice/default/mangaget sounds/voice/default/va/demomangaget.ogg
+voice/default/kiringet sounds/voice/default/va/demokiringet.ogg
+voice/default/korax1 sounds/voice/default/va/demokorax1.ogg
+voice/default/korax2 sounds/voice/default/va/demokorax2.ogg
+voice/default/korax3 sounds/voice/default/va/demokorax3.ogg
+voice/default/korax4 sounds/voice/default/va/demokorax4.ogg
+voice/default/korax5 sounds/voice/default/va/demokorax5.ogg
+voice/default/korax6 sounds/voice/default/va/demokorax6.ogg
+voice/default/korax7 sounds/voice/default/va/demokorax7.ogg
+voice/default/korax8 sounds/voice/default/va/demokorax8.ogg
+voice/default/korax9 sounds/voice/default/va/demokorax9.ogg
+voice/default/romero1 sounds/voice/default/va/demoromero1.ogg
+voice/default/romero2 sounds/voice/default/va/demoromero2.ogg
+voice/default/romero3 sounds/voice/default/va/demoromero3.ogg
+voice/default/romero4 sounds/voice/default/va/demoromero4.ogg
+voice/default/romero5 sounds/voice/default/va/demoromero5.ogg
+voice/default/romero6 sounds/voice/default/va/demoromero6.ogg
+voice/default/romero7 sounds/voice/default/va/demoromero7.ogg
+voice/default/romero8 sounds/voice/default/va/demoromero8.ogg
+voice/default/archangelus1 sounds/voice/default/va/demoarchangelus1.ogg
+voice/default/archangelus2 sounds/voice/default/va/demoarchangelus2.ogg
+voice/default/archangelus3 sounds/voice/default/va/demoarchangelus3.ogg
+voice/default/archangelus4 sounds/voice/default/va/demoarchangelus4.ogg
+voice/default/archangelus5 sounds/voice/default/va/demoarchangelus5.ogg
+voice/default/archangelus6 sounds/voice/default/va/demoarchangelus6.ogg
+voice/default/archangelus7 sounds/voice/default/va/demoarchangelus7.ogg
+voice/default/archangelus8 sounds/voice/default/va/demoarchangelus8.ogg
+voice/default/dsparila1 sounds/voice/default/va/demodsparila1.ogg
+voice/default/dsparila2 sounds/voice/default/va/demodsparila2.ogg
+voice/default/dsparila3 sounds/voice/default/va/demodsparila3.ogg
+voice/default/dsparilb1 sounds/voice/default/va/demodsparilb1.ogg
+voice/default/dsparilb2 sounds/voice/default/va/demodsparilb2.ogg
+voice/default/dsparilb3 sounds/voice/default/va/demodsparilb3.ogg
+voice/default/pethdoom1 sounds/voice/default/va/demopethdoom1.ogg
+voice/default/pethdoom2 sounds/voice/default/va/demopethdoom2.ogg
+voice/default/pethdoom3 sounds/voice/default/va/demopethdoom3.ogg
+voice/default/pethdoom4 sounds/voice/default/va/demopethdoom4.ogg
+voice/default/pethdoom5 sounds/voice/default/va/demopethdoom5.ogg
+voice/default/pethdoom6 sounds/voice/default/va/demopethdoom6.ogg
+voice/default/pethdoom7 sounds/voice/default/va/demopethdoom7.ogg
+voice/default/pethdoom8 sounds/voice/default/va/demopethdoom8.ogg
+voice/default/pethdoom9 sounds/voice/default/va/demopethdoom9.ogg
+voice/default/pethdoomfinish1 sounds/voice/default/va/demopethdoomfinish1.ogg
+voice/default/pethdoomfinish2 sounds/voice/default/va/demopethdoomfinish2.ogg
+voice/default/pethdoomfinish3 sounds/voice/default/va/demopethdoomfinish3.ogg
+voice/default/pethdoomfinish4 sounds/voice/default/va/demopethdoomfinish4.ogg
+voice/default/pethdoomfinish5 sounds/voice/default/va/demopethdoomfinish5.ogg
+voice/default/pethdoomfinish6 sounds/voice/default/va/demopethdoomfinish6.ogg
+voice/default/pethdoomfinish7 sounds/voice/default/va/demopethdoomfinish7.ogg
+voice/default/pethdoomfinish8 sounds/voice/default/va/demopethdoomfinish8.ogg
+voice/default/pethdoomfinish9 sounds/voice/default/va/demopethdoomfinish9.ogg
+voice/default/petmashiro1 sounds/voice/default/va/demopetmashiro1.ogg
+voice/default/petmashiro2 sounds/voice/default/va/demopetmashiro2.ogg
+voice/default/petmashiro3 sounds/voice/default/va/demopetmashiro3.ogg
+voice/default/petmashiro4 sounds/voice/default/va/demopetmashiro4.ogg
+voice/default/petmashiro5 sounds/voice/default/va/demopetmashiro5.ogg
+voice/default/petmashiro6 sounds/voice/default/va/demopetmashiro6.ogg
+voice/default/petmashiro7 sounds/voice/default/va/demopetmashiro7.ogg
+voice/default/buttonpush1 sounds/voice/default/va/demobuttonpush1.ogg
+voice/default/buttonpush2 sounds/voice/default/va/demobuttonpush2.ogg
+voice/default/buttonpush3 sounds/voice/default/va/demobuttonpush3.ogg
+voice/default/falling sounds/voice/default/va/demofalling.ogg
+
+voice/legacy/death1 sounds/voice/legacy/demodeath1.ogg
+voice/legacy/death2 sounds/voice/legacy/demodeath2.ogg
+voice/legacy/death3 sounds/voice/legacy/demodeath3.ogg
+voice/legacy/death4 sounds/voice/legacy/demodeath4.ogg
+voice/legacy/death5 sounds/voice/legacy/demodeath5.ogg
+voice/legacy/grunt1 sounds/voice/legacy/demogrunt1.ogg
+voice/legacy/grunt2 sounds/voice/legacy/demogrunt2.ogg
+voice/legacy/grunt3 sounds/voice/legacy/demogrunt3.ogg
+voice/legacy/grunt4 sounds/voice/legacy/demogrunt4.ogg
+voice/legacy/grunt5 sounds/voice/legacy/demogrunt5.ogg
+voice/legacy/grunt6 sounds/voice/legacy/demogrunt6.ogg
+voice/legacy/hipain1 sounds/voice/legacy/demohipain1.ogg
+voice/legacy/hipain2 sounds/voice/legacy/demohipain2.ogg
+voice/legacy/hipain3 sounds/voice/legacy/demohipain3.ogg
+voice/legacy/hipain4 sounds/voice/legacy/demohipain4.ogg
+voice/legacy/hipain5 sounds/voice/legacy/demohipain5.ogg
+voice/legacy/lopain1 sounds/voice/legacy/demolopain1.ogg
+voice/legacy/lopain2 sounds/voice/legacy/demolopain2.ogg
+voice/legacy/lopain3 sounds/voice/legacy/demolopain3.ogg
+voice/legacy/lopain4 sounds/voice/legacy/demolopain4.ogg
+voice/legacy/lopain5 sounds/voice/legacy/demolopain5.ogg
+voice/legacy/pain1 sounds/voice/legacy/demopain1.ogg
+voice/legacy/pain2 sounds/voice/legacy/demopain2.ogg
+voice/legacy/pain3 sounds/voice/legacy/demopain3.ogg
+voice/legacy/pain4 sounds/voice/legacy/demopain4.ogg
+voice/legacy/pain5 sounds/voice/legacy/demopain5.ogg
+voice/legacy/pain6 sounds/voice/legacy/demopain6.ogg
+
+$random voice/legacy/grunt { voice/legacy/grunt1 voice/legacy/grunt2 voice/legacy/grunt3 voice/legacy/grunt4 voice/legacy/grunt5 voice/legacy/grunt6 }
+$random voice/legacy/lopain { voice/legacy/lopain1 voice/legacy/lopain2 voice/legacy/lopain3 voice/legacy/lopain4 voice/legacy/lopain5 }
+$random voice/legacy/pain { voice/legacy/pain1 voice/legacy/pain2 voice/legacy/pain3 voice/legacy/pain4 voice/legacy/pain5 }
+$random voice/legacy/hipain { voice/legacy/hipain1 voice/legacy/hipain2 voice/legacy/hipain3 voice/legacy/hipain4 voice/legacy/hipain5 }
+$random voice/legacy/death { voice/legacy/death1 voice/legacy/death2 voice/legacy/death3 voice/legacy/death4 voice/legacy/death5 }
+
+voice/legacy/fightstart1 sounds/voice/legacy/va/demofightstart1.ogg
+voice/legacy/fightstart2 sounds/voice/legacy/va/demofightstart2.ogg
+voice/legacy/fightstart3 sounds/voice/legacy/va/demofightstart3.ogg
+voice/legacy/fightstart4 sounds/voice/legacy/va/demofightstart4.ogg
+voice/legacy/fightstart5 sounds/voice/legacy/va/demofightstart5.ogg
+voice/legacy/fightstart6 sounds/voice/legacy/va/demofightstart6.ogg
+voice/legacy/fightstart7 sounds/voice/legacy/va/demofightstart7.ogg
+voice/legacy/fightstart8 sounds/voice/legacy/va/demofightstart8.ogg
+voice/legacy/fightstart9 sounds/voice/legacy/va/demofightstart9.ogg
+voice/legacy/fightstart10 sounds/voice/legacy/va/demofightstart10.ogg
+voice/legacy/fightstart11 sounds/voice/legacy/va/demofightstart11.ogg
+voice/legacy/fightstart12 sounds/voice/legacy/va/demofightstart12.ogg
+voice/legacy/fightstart13 sounds/voice/legacy/va/demofightstart13.ogg
+voice/legacy/fightstart14 sounds/voice/legacy/va/demofightstart14.ogg
+voice/legacy/fightstart15 sounds/voice/legacy/va/demofightstart15.ogg
+voice/legacy/fightstart16 sounds/voice/legacy/va/demofightstart16.ogg
+voice/legacy/fightstart17 sounds/voice/legacy/va/demofightstart17.ogg
+voice/legacy/fightstart18 sounds/voice/legacy/va/demofightstart18.ogg
+voice/legacy/fightstart19 sounds/voice/legacy/va/demofightstart19.ogg
+voice/legacy/fightstart20 sounds/voice/legacy/va/demofightstart20.ogg
+voice/legacy/fightstart21 sounds/voice/legacy/va/demofightstart21.ogg
+voice/legacy/findsecret1 sounds/voice/legacy/va/demofindsecret1.ogg
+voice/legacy/findsecret2 sounds/voice/legacy/va/demofindsecret2.ogg
+voice/legacy/findsecret3 sounds/voice/legacy/va/demofindsecret3.ogg
+voice/legacy/findsecret4 sounds/voice/legacy/va/demofindsecret4.ogg
+voice/legacy/findsecret5 sounds/voice/legacy/va/demofindsecret5.ogg
+voice/legacy/findsecret6 sounds/voice/legacy/va/demofindsecret6.ogg
+voice/legacy/findsecret7 sounds/voice/legacy/va/demofindsecret7.ogg
+voice/legacy/findsecret8 sounds/voice/legacy/va/demofindsecret8.ogg
+voice/legacy/findsecret9 sounds/voice/legacy/va/demofindsecret9.ogg
+voice/legacy/findsecret10 sounds/voice/legacy/va/demofindsecret10.ogg
+voice/legacy/findsecret11 sounds/voice/legacy/va/demofindsecret11.ogg
+voice/legacy/findsecret12 sounds/voice/legacy/va/demofindsecret12.ogg
+voice/legacy/findsecret13 sounds/voice/legacy/va/demofindsecret13.ogg
+voice/legacy/getweapon1 sounds/voice/legacy/va/demogetweapon1.ogg
+voice/legacy/getweapon2 sounds/voice/legacy/va/demogetweapon2.ogg
+voice/legacy/getweapon3 sounds/voice/legacy/va/demogetweapon3.ogg
+voice/legacy/getweapon4 sounds/voice/legacy/va/demogetweapon4.ogg
+voice/legacy/getweapon5 sounds/voice/legacy/va/demogetweapon5.ogg
+voice/legacy/getweapon6 sounds/voice/legacy/va/demogetweapon6.ogg
+voice/legacy/getweapon7 sounds/voice/legacy/va/demogetweapon7.ogg
+voice/legacy/getweapon8 sounds/voice/legacy/va/demogetweapon8.ogg
+voice/legacy/getweapon9 sounds/voice/legacy/va/demogetweapon9.ogg
+voice/legacy/getweapon10 sounds/voice/legacy/va/demogetweapon10.ogg
+voice/legacy/getweapon11 sounds/voice/legacy/va/demogetweapon11.ogg
+voice/legacy/getweapon12 sounds/voice/legacy/va/demogetweapon12.ogg
+voice/legacy/getweapon13 sounds/voice/legacy/va/demogetweapon13.ogg
+voice/legacy/locked1 sounds/voice/legacy/va/demolocked1.ogg
+voice/legacy/locked2 sounds/voice/legacy/va/demolocked2.ogg
+voice/legacy/locked3 sounds/voice/legacy/va/demolocked3.ogg
+voice/legacy/locked4 sounds/voice/legacy/va/demolocked4.ogg
+voice/legacy/jammed1 sounds/voice/legacy/va/demojammed1.ogg
+voice/legacy/jammed2 sounds/voice/legacy/va/demojammed2.ogg
+voice/legacy/jammed3 sounds/voice/legacy/va/demojammed3.ogg
+voice/legacy/jammed4 sounds/voice/legacy/va/demojammed4.ogg
+voice/legacy/mapstart1 sounds/voice/legacy/va/demomapstart1.ogg
+voice/legacy/mapstart2 sounds/voice/legacy/va/demomapstart2.ogg
+voice/legacy/mapstart3 sounds/voice/legacy/va/demomapstart3.ogg
+voice/legacy/mapstart4 sounds/voice/legacy/va/demomapstart4.ogg
+voice/legacy/mapstart5 sounds/voice/legacy/va/demomapstart5.ogg
+voice/legacy/mapstart6 sounds/voice/legacy/va/demomapstart6.ogg
+voice/legacy/mapstart7 sounds/voice/legacy/va/demomapstart7.ogg
+voice/legacy/mapstart8 sounds/voice/legacy/va/demomapstart8.ogg
+voice/legacy/mapstart9 sounds/voice/legacy/va/demomapstart9.ogg
+voice/legacy/mapstart10 sounds/voice/legacy/va/demomapstart10.ogg
+voice/legacy/mapstart11 sounds/voice/legacy/va/demomapstart11.ogg
+voice/legacy/mapstart12 sounds/voice/legacy/va/demomapstart12.ogg
+voice/legacy/mapstart13 sounds/voice/legacy/va/demomapstart13.ogg
+voice/legacy/mapstart14 sounds/voice/legacy/va/demomapstart14.ogg
+voice/legacy/puzzfail1 sounds/voice/legacy/va/demopuzzfail1.ogg
+voice/legacy/puzzfail2 sounds/voice/legacy/va/demopuzzfail2.ogg
+voice/legacy/puzzfail3 sounds/voice/legacy/va/demopuzzfail3.ogg
+voice/legacy/puzzfail4 sounds/voice/legacy/va/demopuzzfail4.ogg
+voice/legacy/puzzfail5 sounds/voice/legacy/va/demopuzzfail5.ogg
+voice/legacy/puzzfail6 sounds/voice/legacy/va/demopuzzfail6.ogg
+voice/legacy/puzzsucc1 sounds/voice/legacy/va/demopuzzsucc1.ogg
+voice/legacy/puzzsucc2 sounds/voice/legacy/va/demopuzzsucc2.ogg
+voice/legacy/puzzsucc3 sounds/voice/legacy/va/demopuzzsucc3.ogg
+voice/legacy/puzzsucc4 sounds/voice/legacy/va/demopuzzsucc4.ogg
+voice/legacy/puzzsucc5 sounds/voice/legacy/va/demopuzzsucc5.ogg
+voice/legacy/scorekill1 sounds/voice/legacy/va/demoscorekill1.ogg
+voice/legacy/scorekill2 sounds/voice/legacy/va/demoscorekill2.ogg
+voice/legacy/scorekill3 sounds/voice/legacy/va/demoscorekill3.ogg
+voice/legacy/scorekill4 sounds/voice/legacy/va/demoscorekill4.ogg
+voice/legacy/scorekill5 sounds/voice/legacy/va/demoscorekill5.ogg
+voice/legacy/scorekill6 sounds/voice/legacy/va/demoscorekill6.ogg
+voice/legacy/scorekill7 sounds/voice/legacy/va/demoscorekill7.ogg
+voice/legacy/scorekill8 sounds/voice/legacy/va/demoscorekill8.ogg
+voice/legacy/scorekill9 sounds/voice/legacy/va/demoscorekill9.ogg
+voice/legacy/scorekill10 sounds/voice/legacy/va/demoscorekill10.ogg
+voice/legacy/scorekill11 sounds/voice/legacy/va/demoscorekill11.ogg
+voice/legacy/scorekill12 sounds/voice/legacy/va/demoscorekill12.ogg
+voice/legacy/scorekill13 sounds/voice/legacy/va/demoscorekill13.ogg
+voice/legacy/scorekill14 sounds/voice/legacy/va/demoscorekill14.ogg
+voice/legacy/scorekill15 sounds/voice/legacy/va/demoscorekill15.ogg
+voice/legacy/scorekill16 sounds/voice/legacy/va/demoscorekill16.ogg
+voice/legacy/scorekill17 sounds/voice/legacy/va/demoscorekill17.ogg
+voice/legacy/scorekill18 sounds/voice/legacy/va/demoscorekill18.ogg
+voice/legacy/scorekill19 sounds/voice/legacy/va/demoscorekill19.ogg
+voice/legacy/scorekill20 sounds/voice/legacy/va/demoscorekill20.ogg
+voice/legacy/scorekill21 sounds/voice/legacy/va/demoscorekill21.ogg
+voice/legacy/scorekill22 sounds/voice/legacy/va/demoscorekill22.ogg
+voice/legacy/scorekill23 sounds/voice/legacy/va/demoscorekill23.ogg
+voice/legacy/scorekill24 sounds/voice/legacy/va/demoscorekill24.ogg
+voice/legacy/scorekill25 sounds/voice/legacy/va/demoscorekill25.ogg
+voice/legacy/scorekill26 sounds/voice/legacy/va/demoscorekill26.ogg
+voice/legacy/friendkill1 sounds/voice/legacy/va/demofriendkill1.ogg
+voice/legacy/friendkill2 sounds/voice/legacy/va/demofriendkill2.ogg
+voice/legacy/friendkill3 sounds/voice/legacy/va/demofriendkill3.ogg
+voice/legacy/friendkill4 sounds/voice/legacy/va/demofriendkill4.ogg
+voice/legacy/gethit1 sounds/voice/legacy/va/demogethit1.ogg
+voice/legacy/gethit2 sounds/voice/legacy/va/demogethit2.ogg
+voice/legacy/gethit3 sounds/voice/legacy/va/demogethit3.ogg
+voice/legacy/gethit4 sounds/voice/legacy/va/demogethit4.ogg
+voice/legacy/gethit5 sounds/voice/legacy/va/demogethit5.ogg
+voice/legacy/gethit6 sounds/voice/legacy/va/demogethit6.ogg
+voice/legacy/gethit7 sounds/voice/legacy/va/demogethit7.ogg
+voice/legacy/gethit8 sounds/voice/legacy/va/demogethit8.ogg
+voice/legacy/gethit9 sounds/voice/legacy/va/demogethit9.ogg
+voice/legacy/gethit10 sounds/voice/legacy/va/demogethit10.ogg
+voice/legacy/gethit11 sounds/voice/legacy/va/demogethit11.ogg
+voice/legacy/gethit12 sounds/voice/legacy/va/demogethit12.ogg
+voice/legacy/gethit13 sounds/voice/legacy/va/demogethit13.ogg
+voice/legacy/gethit14 sounds/voice/legacy/va/demogethit14.ogg
+voice/legacy/gethit15 sounds/voice/legacy/va/demogethit15.ogg
+voice/legacy/gethit16 sounds/voice/legacy/va/demogethit16.ogg
+voice/legacy/gethit17 sounds/voice/legacy/va/demogethit17.ogg
+voice/legacy/gethit18 sounds/voice/legacy/va/demogethit18.ogg
+voice/legacy/gethit19 sounds/voice/legacy/va/demogethit19.ogg
+voice/legacy/friendhit1 sounds/voice/legacy/va/demofriendhit1.ogg
+voice/legacy/friendhit2 sounds/voice/legacy/va/demofriendhit2.ogg
+voice/legacy/friendhit3 sounds/voice/legacy/va/demofriendhit3.ogg
+voice/legacy/friendhit4 sounds/voice/legacy/va/demofriendhit4.ogg
+voice/legacy/friendhit5 sounds/voice/legacy/va/demofriendhit5.ogg
+voice/legacy/friendhit6 sounds/voice/legacy/va/demofriendhit6.ogg
+voice/legacy/friendhit7 sounds/voice/legacy/va/demofriendhit7.ogg
+voice/legacy/greet1 sounds/voice/legacy/va/demogreet1.ogg
+voice/legacy/greet2 sounds/voice/legacy/va/demogreet2.ogg
+voice/legacy/greet3 sounds/voice/legacy/va/demogreet3.ogg
+voice/legacy/greet4 sounds/voice/legacy/va/demogreet4.ogg
+voice/legacy/greet5 sounds/voice/legacy/va/demogreet5.ogg
+voice/legacy/greet6 sounds/voice/legacy/va/demogreet6.ogg
+voice/legacy/greet7 sounds/voice/legacy/va/demogreet7.ogg
+voice/legacy/hitfriend1 sounds/voice/legacy/va/demohitfriend1.ogg
+voice/legacy/hitfriend2 sounds/voice/legacy/va/demohitfriend2.ogg
+voice/legacy/hitfriend3 sounds/voice/legacy/va/demohitfriend3.ogg
+voice/legacy/ragekit1 sounds/voice/legacy/va/demoragekit1.ogg
+voice/legacy/ragekit2 sounds/voice/legacy/va/demoragekit2.ogg
+voice/legacy/ragekit3 sounds/voice/legacy/va/demoragekit3.ogg
+voice/legacy/ragekit4 sounds/voice/legacy/va/demoragekit4.ogg
+voice/legacy/ragekit5 sounds/voice/legacy/va/demoragekit5.ogg
+voice/legacy/ragekit6 sounds/voice/legacy/va/demoragekit6.ogg
+voice/legacy/koraxgreet1 sounds/voice/legacy/va/demokoraxgreet1.ogg
+voice/legacy/koraxgreet2 sounds/voice/legacy/va/demokoraxgreet2.ogg
+voice/legacy/koraxgreet3 sounds/voice/legacy/va/demokoraxgreet3.ogg
+voice/legacy/koraxgreet4 sounds/voice/legacy/va/demokoraxgreet4.ogg
+voice/legacy/koraxgreet5 sounds/voice/legacy/va/demokoraxgreet5.ogg
+voice/legacy/koraxgreet6 sounds/voice/legacy/va/demokoraxgreet6.ogg
+voice/legacy/koraxgreet7 sounds/voice/legacy/va/demokoraxgreet7.ogg
+voice/legacy/koraxgreet8 sounds/voice/legacy/va/demokoraxgreet8.ogg
+voice/legacy/koraxgreet9 sounds/voice/legacy/va/demokoraxgreet9.ogg
+voice/legacy/koraxgreet10 sounds/voice/legacy/va/demokoraxgreet10.ogg
+voice/legacy/koraxgreet11 sounds/voice/legacy/va/demokoraxgreet11.ogg
+voice/legacy/koraxgreet12 sounds/voice/legacy/va/demokoraxgreet12.ogg
+voice/legacy/koraxgreet13 sounds/voice/legacy/va/demokoraxgreet13.ogg
+voice/legacy/koraxblood1 sounds/voice/legacy/va/demokoraxblood1.ogg
+voice/legacy/koraxblood2 sounds/voice/legacy/va/demokoraxblood2.ogg
+voice/legacy/koraxblood3 sounds/voice/legacy/va/demokoraxblood3.ogg
+voice/legacy/koraxblood4 sounds/voice/legacy/va/demokoraxblood4.ogg
+voice/legacy/koraxblood5 sounds/voice/legacy/va/demokoraxblood5.ogg
+voice/legacy/koraxblood6 sounds/voice/legacy/va/demokoraxblood6.ogg
+voice/legacy/koraxblood7 sounds/voice/legacy/va/demokoraxblood7.ogg
+voice/legacy/koraxblood8 sounds/voice/legacy/va/demokoraxblood8.ogg
+voice/legacy/koraxblood9 sounds/voice/legacy/va/demokoraxblood9.ogg
+voice/legacy/koraxblood10 sounds/voice/legacy/va/demokoraxblood10.ogg
+voice/legacy/koraxblood11 sounds/voice/legacy/va/demokoraxblood11.ogg
+voice/legacy/koraxblood12 sounds/voice/legacy/va/demokoraxblood12.ogg
+voice/legacy/koraxblood13 sounds/voice/legacy/va/demokoraxblood13.ogg
+voice/legacy/koraxgame1 sounds/voice/legacy/va/demokoraxgame1.ogg
+voice/legacy/koraxgame2 sounds/voice/legacy/va/demokoraxgame2.ogg
+voice/legacy/koraxgame3 sounds/voice/legacy/va/demokoraxgame3.ogg
+voice/legacy/koraxgame4 sounds/voice/legacy/va/demokoraxgame4.ogg
+voice/legacy/koraxgame5 sounds/voice/legacy/va/demokoraxgame5.ogg
+voice/legacy/koraxgame6 sounds/voice/legacy/va/demokoraxgame6.ogg
+voice/legacy/koraxgame7 sounds/voice/legacy/va/demokoraxgame7.ogg
+voice/legacy/koraxgame8 sounds/voice/legacy/va/demokoraxgame8.ogg
+voice/legacy/koraxgame9 sounds/voice/legacy/va/demokoraxgame9.ogg
+voice/legacy/koraxgame10 sounds/voice/legacy/va/demokoraxgame10.ogg
+voice/legacy/koraxgame11 sounds/voice/legacy/va/demokoraxgame11.ogg
+voice/legacy/koraxgame12 sounds/voice/legacy/va/demokoraxgame12.ogg
+voice/legacy/koraxgame13 sounds/voice/legacy/va/demokoraxgame13.ogg
+voice/legacy/koraxgame14 sounds/voice/legacy/va/demokoraxgame14.ogg
+voice/legacy/koraxworship1 sounds/voice/legacy/va/demokoraxworship1.ogg
+voice/legacy/koraxworship2 sounds/voice/legacy/va/demokoraxworship2.ogg
+voice/legacy/koraxworship3 sounds/voice/legacy/va/demokoraxworship3.ogg
+voice/legacy/koraxworship4 sounds/voice/legacy/va/demokoraxworship4.ogg
+voice/legacy/koraxworship5 sounds/voice/legacy/va/demokoraxworship5.ogg
+voice/legacy/koraxworship6 sounds/voice/legacy/va/demokoraxworship6.ogg
+voice/legacy/koraxworship7 sounds/voice/legacy/va/demokoraxworship7.ogg
+voice/legacy/koraxworship8 sounds/voice/legacy/va/demokoraxworship8.ogg
+voice/legacy/koraxworship9 sounds/voice/legacy/va/demokoraxworship9.ogg
+voice/legacy/koraxworship10 sounds/voice/legacy/va/demokoraxworship10.ogg
+voice/legacy/koraxworship11 sounds/voice/legacy/va/demokoraxworship11.ogg
+voice/legacy/koraxmasters1 sounds/voice/legacy/va/demokoraxmasters1.ogg
+voice/legacy/koraxmasters2 sounds/voice/legacy/va/demokoraxmasters2.ogg
+voice/legacy/koraxmasters3 sounds/voice/legacy/va/demokoraxmasters3.ogg
+voice/legacy/koraxmasters4 sounds/voice/legacy/va/demokoraxmasters4.ogg
+voice/legacy/koraxmasters5 sounds/voice/legacy/va/demokoraxmasters5.ogg
+voice/legacy/koraxmasters6 sounds/voice/legacy/va/demokoraxmasters6.ogg
+voice/legacy/koraxmasters7 sounds/voice/legacy/va/demokoraxmasters7.ogg
+voice/legacy/koraxmasters8 sounds/voice/legacy/va/demokoraxmasters8.ogg
+voice/legacy/koraxmasters9 sounds/voice/legacy/va/demokoraxmasters9.ogg
demolitionist/walk1 sounds/demolitionist/demowalk1.ogg
demolitionist/walk2 sounds/demolitionist/demowalk2.ogg
@@ -448,10 +805,14 @@ $playersound demolitionist neutral *gasp DSEMPTY
$playersound demolitionist neutral *taunt DSEMPTY
$playersound demolitionist neutral *evillaugh DSEMPTY
+voodoodoll/hit sounds/general/BodyHit.ogg
+voodoodoll/fall sounds/general/BodyThud.ogg
+
deepimpact/fire sounds/deepimpact/impfire.ogg
deepimpact/charge sounds/deepimpact/impaltcharge.ogg
deepimpact/altfire sounds/deepimpact/impaltfire.ogg
deepimpact/dryfire sounds/deepimpact/impdryfire.ogg
+deepimpact/dryaltfire sounds/deepimpact/impdryaltfire.ogg
deepimpact/select sounds/deepimpact/impsel.ogg
deepimpact/checkout sounds/deepimpact/impidle.ogg
deepimpact/deselect sounds/deepimpact/impdown.ogg
diff --git a/sounds/OUCHEX1.ogg b/sounds/OUCHEX1.ogg
new file mode 100644
index 000000000..240df30d5
Binary files /dev/null and b/sounds/OUCHEX1.ogg differ
diff --git a/sounds/OUCHEX2.ogg b/sounds/OUCHEX2.ogg
new file mode 100644
index 000000000..db8aaaf05
Binary files /dev/null and b/sounds/OUCHEX2.ogg differ
diff --git a/sounds/OUCHEX3.ogg b/sounds/OUCHEX3.ogg
new file mode 100644
index 000000000..8013036c3
Binary files /dev/null and b/sounds/OUCHEX3.ogg differ
diff --git a/sounds/OUCHEX4.ogg b/sounds/OUCHEX4.ogg
new file mode 100644
index 000000000..122a1ed40
Binary files /dev/null and b/sounds/OUCHEX4.ogg differ
diff --git a/sounds/TitleThump.ogg b/sounds/TitleThump.ogg
new file mode 100644
index 000000000..b722111a0
Binary files /dev/null and b/sounds/TitleThump.ogg differ
diff --git a/sounds/deepimpact/impdryaltfire.ogg b/sounds/deepimpact/impdryaltfire.ogg
new file mode 100644
index 000000000..cd6475366
Binary files /dev/null and b/sounds/deepimpact/impdryaltfire.ogg differ
diff --git a/sounds/general/BodyHit.ogg b/sounds/general/BodyHit.ogg
new file mode 100644
index 000000000..b7b559ce7
Binary files /dev/null and b/sounds/general/BodyHit.ogg differ
diff --git a/sounds/general/BodyThud.ogg b/sounds/general/BodyThud.ogg
new file mode 100644
index 000000000..75fee6d7a
Binary files /dev/null and b/sounds/general/BodyThud.ogg differ
diff --git a/sounds/voice/default/demogiggle1.ogg b/sounds/voice/default/demogiggle1.ogg
deleted file mode 100644
index dc18fc329..000000000
Binary files a/sounds/voice/default/demogiggle1.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle10.ogg b/sounds/voice/default/demogiggle10.ogg
deleted file mode 100644
index d6560c4f5..000000000
Binary files a/sounds/voice/default/demogiggle10.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle11.ogg b/sounds/voice/default/demogiggle11.ogg
deleted file mode 100644
index 0e4666732..000000000
Binary files a/sounds/voice/default/demogiggle11.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle12.ogg b/sounds/voice/default/demogiggle12.ogg
deleted file mode 100644
index b09fdc526..000000000
Binary files a/sounds/voice/default/demogiggle12.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle13.ogg b/sounds/voice/default/demogiggle13.ogg
deleted file mode 100644
index 96762fa10..000000000
Binary files a/sounds/voice/default/demogiggle13.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle14.ogg b/sounds/voice/default/demogiggle14.ogg
deleted file mode 100644
index 4460f0136..000000000
Binary files a/sounds/voice/default/demogiggle14.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle15.ogg b/sounds/voice/default/demogiggle15.ogg
deleted file mode 100644
index 38f2e7174..000000000
Binary files a/sounds/voice/default/demogiggle15.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle16.ogg b/sounds/voice/default/demogiggle16.ogg
deleted file mode 100644
index 511862fd9..000000000
Binary files a/sounds/voice/default/demogiggle16.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle17.ogg b/sounds/voice/default/demogiggle17.ogg
deleted file mode 100644
index ff15f1ad6..000000000
Binary files a/sounds/voice/default/demogiggle17.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle18.ogg b/sounds/voice/default/demogiggle18.ogg
deleted file mode 100644
index 4b06f1ade..000000000
Binary files a/sounds/voice/default/demogiggle18.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle19.ogg b/sounds/voice/default/demogiggle19.ogg
deleted file mode 100644
index fb8185b72..000000000
Binary files a/sounds/voice/default/demogiggle19.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle2.ogg b/sounds/voice/default/demogiggle2.ogg
deleted file mode 100644
index 0ae0b4d9e..000000000
Binary files a/sounds/voice/default/demogiggle2.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle3.ogg b/sounds/voice/default/demogiggle3.ogg
deleted file mode 100644
index a756f85e2..000000000
Binary files a/sounds/voice/default/demogiggle3.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle4.ogg b/sounds/voice/default/demogiggle4.ogg
deleted file mode 100644
index b0e89985d..000000000
Binary files a/sounds/voice/default/demogiggle4.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle5.ogg b/sounds/voice/default/demogiggle5.ogg
deleted file mode 100644
index b8c8b55b5..000000000
Binary files a/sounds/voice/default/demogiggle5.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle6.ogg b/sounds/voice/default/demogiggle6.ogg
deleted file mode 100644
index 1c0e45454..000000000
Binary files a/sounds/voice/default/demogiggle6.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle7.ogg b/sounds/voice/default/demogiggle7.ogg
deleted file mode 100644
index 02dccb542..000000000
Binary files a/sounds/voice/default/demogiggle7.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle8.ogg b/sounds/voice/default/demogiggle8.ogg
deleted file mode 100644
index d01a5e04b..000000000
Binary files a/sounds/voice/default/demogiggle8.ogg and /dev/null differ
diff --git a/sounds/voice/default/demogiggle9.ogg b/sounds/voice/default/demogiggle9.ogg
deleted file mode 100644
index 0e2f5236d..000000000
Binary files a/sounds/voice/default/demogiggle9.ogg and /dev/null differ
diff --git a/sounds/voice/default/demohug1.ogg b/sounds/voice/default/demohug1.ogg
deleted file mode 100644
index f1b467dc0..000000000
Binary files a/sounds/voice/default/demohug1.ogg and /dev/null differ
diff --git a/sounds/voice/default/demohug2.ogg b/sounds/voice/default/demohug2.ogg
deleted file mode 100644
index 72885652b..000000000
Binary files a/sounds/voice/default/demohug2.ogg and /dev/null differ
diff --git a/sounds/voice/default/demohug3.ogg b/sounds/voice/default/demohug3.ogg
deleted file mode 100644
index b9e445733..000000000
Binary files a/sounds/voice/default/demohug3.ogg and /dev/null differ
diff --git a/sounds/voice/default/demohug4.ogg b/sounds/voice/default/demohug4.ogg
deleted file mode 100644
index 229bd65fe..000000000
Binary files a/sounds/voice/default/demohug4.ogg and /dev/null differ
diff --git a/sounds/voice/default/demohug5.ogg b/sounds/voice/default/demohug5.ogg
deleted file mode 100644
index b5e991bb1..000000000
Binary files a/sounds/voice/default/demohug5.ogg and /dev/null differ
diff --git a/sounds/voice/default/demohug6.ogg b/sounds/voice/default/demohug6.ogg
deleted file mode 100644
index 4b76b4868..000000000
Binary files a/sounds/voice/default/demohug6.ogg and /dev/null differ
diff --git a/sounds/voice/default/demohug7.ogg b/sounds/voice/default/demohug7.ogg
deleted file mode 100644
index a65460b1b..000000000
Binary files a/sounds/voice/default/demohug7.ogg and /dev/null differ
diff --git a/sounds/voice/default/demohug8.ogg b/sounds/voice/default/demohug8.ogg
deleted file mode 100644
index 7dd7abc3d..000000000
Binary files a/sounds/voice/default/demohug8.ogg and /dev/null differ
diff --git a/sounds/voice/default/demohug9.ogg b/sounds/voice/default/demohug9.ogg
deleted file mode 100644
index bc4ff4b8e..000000000
Binary files a/sounds/voice/default/demohug9.ogg and /dev/null differ
diff --git a/sounds/voice/default/va/demoakariget.ogg b/sounds/voice/default/va/demoakariget.ogg
new file mode 100644
index 000000000..5fa4daec0
Binary files /dev/null and b/sounds/voice/default/va/demoakariget.ogg differ
diff --git a/sounds/voice/default/va/demoarchangelus1.ogg b/sounds/voice/default/va/demoarchangelus1.ogg
new file mode 100644
index 000000000..bc6f86c1f
Binary files /dev/null and b/sounds/voice/default/va/demoarchangelus1.ogg differ
diff --git a/sounds/voice/default/va/demoarchangelus2.ogg b/sounds/voice/default/va/demoarchangelus2.ogg
new file mode 100644
index 000000000..bc8b2dcef
Binary files /dev/null and b/sounds/voice/default/va/demoarchangelus2.ogg differ
diff --git a/sounds/voice/default/va/demoarchangelus3.ogg b/sounds/voice/default/va/demoarchangelus3.ogg
new file mode 100644
index 000000000..3a3fb8592
Binary files /dev/null and b/sounds/voice/default/va/demoarchangelus3.ogg differ
diff --git a/sounds/voice/default/va/demoarchangelus4.ogg b/sounds/voice/default/va/demoarchangelus4.ogg
new file mode 100644
index 000000000..0376b1870
Binary files /dev/null and b/sounds/voice/default/va/demoarchangelus4.ogg differ
diff --git a/sounds/voice/default/va/demoarchangelus5.ogg b/sounds/voice/default/va/demoarchangelus5.ogg
new file mode 100644
index 000000000..935ca4c81
Binary files /dev/null and b/sounds/voice/default/va/demoarchangelus5.ogg differ
diff --git a/sounds/voice/default/va/demoarchangelus6.ogg b/sounds/voice/default/va/demoarchangelus6.ogg
new file mode 100644
index 000000000..dd1466251
Binary files /dev/null and b/sounds/voice/default/va/demoarchangelus6.ogg differ
diff --git a/sounds/voice/default/va/demoarchangelus7.ogg b/sounds/voice/default/va/demoarchangelus7.ogg
new file mode 100644
index 000000000..6a4c41283
Binary files /dev/null and b/sounds/voice/default/va/demoarchangelus7.ogg differ
diff --git a/sounds/voice/default/va/demoarchangelus8.ogg b/sounds/voice/default/va/demoarchangelus8.ogg
new file mode 100644
index 000000000..7c1f7b468
Binary files /dev/null and b/sounds/voice/default/va/demoarchangelus8.ogg differ
diff --git a/sounds/voice/default/va/demobreadget.ogg b/sounds/voice/default/va/demobreadget.ogg
new file mode 100644
index 000000000..77615a7f6
Binary files /dev/null and b/sounds/voice/default/va/demobreadget.ogg differ
diff --git a/sounds/voice/default/va/demobuttonpush1.ogg b/sounds/voice/default/va/demobuttonpush1.ogg
new file mode 100644
index 000000000..fa5db7c8c
Binary files /dev/null and b/sounds/voice/default/va/demobuttonpush1.ogg differ
diff --git a/sounds/voice/default/va/demobuttonpush2.ogg b/sounds/voice/default/va/demobuttonpush2.ogg
new file mode 100644
index 000000000..73609e199
Binary files /dev/null and b/sounds/voice/default/va/demobuttonpush2.ogg differ
diff --git a/sounds/voice/default/va/demobuttonpush3.ogg b/sounds/voice/default/va/demobuttonpush3.ogg
new file mode 100644
index 000000000..fa218b2a7
Binary files /dev/null and b/sounds/voice/default/va/demobuttonpush3.ogg differ
diff --git a/sounds/voice/default/va/democubeget.ogg b/sounds/voice/default/va/democubeget.ogg
new file mode 100644
index 000000000..2cfc67f17
Binary files /dev/null and b/sounds/voice/default/va/democubeget.ogg differ
diff --git a/sounds/voice/default/va/demodemoget.ogg b/sounds/voice/default/va/demodemoget.ogg
new file mode 100644
index 000000000..6c1c7614a
Binary files /dev/null and b/sounds/voice/default/va/demodemoget.ogg differ
diff --git a/sounds/voice/default/va/demodsparila1.ogg b/sounds/voice/default/va/demodsparila1.ogg
new file mode 100644
index 000000000..409ff571c
Binary files /dev/null and b/sounds/voice/default/va/demodsparila1.ogg differ
diff --git a/sounds/voice/default/va/demodsparila2.ogg b/sounds/voice/default/va/demodsparila2.ogg
new file mode 100644
index 000000000..bf412ca8f
Binary files /dev/null and b/sounds/voice/default/va/demodsparila2.ogg differ
diff --git a/sounds/voice/default/va/demodsparila3.ogg b/sounds/voice/default/va/demodsparila3.ogg
new file mode 100644
index 000000000..3d717404a
Binary files /dev/null and b/sounds/voice/default/va/demodsparila3.ogg differ
diff --git a/sounds/voice/default/va/demodsparilb1.ogg b/sounds/voice/default/va/demodsparilb1.ogg
new file mode 100644
index 000000000..7869b0539
Binary files /dev/null and b/sounds/voice/default/va/demodsparilb1.ogg differ
diff --git a/sounds/voice/default/va/demodsparilb2.ogg b/sounds/voice/default/va/demodsparilb2.ogg
new file mode 100644
index 000000000..b4a7f6f7b
Binary files /dev/null and b/sounds/voice/default/va/demodsparilb2.ogg differ
diff --git a/sounds/voice/default/va/demodsparilb3.ogg b/sounds/voice/default/va/demodsparilb3.ogg
new file mode 100644
index 000000000..379d3024a
Binary files /dev/null and b/sounds/voice/default/va/demodsparilb3.ogg differ
diff --git a/sounds/voice/default/va/demofalling.ogg b/sounds/voice/default/va/demofalling.ogg
new file mode 100644
index 000000000..3c93ff343
Binary files /dev/null and b/sounds/voice/default/va/demofalling.ogg differ
diff --git a/sounds/voice/default/va/demofightstart1.ogg b/sounds/voice/default/va/demofightstart1.ogg
new file mode 100644
index 000000000..f3443f74b
Binary files /dev/null and b/sounds/voice/default/va/demofightstart1.ogg differ
diff --git a/sounds/voice/default/va/demofightstart10.ogg b/sounds/voice/default/va/demofightstart10.ogg
new file mode 100644
index 000000000..2f16727b1
Binary files /dev/null and b/sounds/voice/default/va/demofightstart10.ogg differ
diff --git a/sounds/voice/default/va/demofightstart11.ogg b/sounds/voice/default/va/demofightstart11.ogg
new file mode 100644
index 000000000..b6d486bba
Binary files /dev/null and b/sounds/voice/default/va/demofightstart11.ogg differ
diff --git a/sounds/voice/default/va/demofightstart12.ogg b/sounds/voice/default/va/demofightstart12.ogg
new file mode 100644
index 000000000..905855111
Binary files /dev/null and b/sounds/voice/default/va/demofightstart12.ogg differ
diff --git a/sounds/voice/default/va/demofightstart13.ogg b/sounds/voice/default/va/demofightstart13.ogg
new file mode 100644
index 000000000..83f492860
Binary files /dev/null and b/sounds/voice/default/va/demofightstart13.ogg differ
diff --git a/sounds/voice/default/va/demofightstart14.ogg b/sounds/voice/default/va/demofightstart14.ogg
new file mode 100644
index 000000000..7166d242d
Binary files /dev/null and b/sounds/voice/default/va/demofightstart14.ogg differ
diff --git a/sounds/voice/default/va/demofightstart15.ogg b/sounds/voice/default/va/demofightstart15.ogg
new file mode 100644
index 000000000..3552d5fa7
Binary files /dev/null and b/sounds/voice/default/va/demofightstart15.ogg differ
diff --git a/sounds/voice/default/va/demofightstart16.ogg b/sounds/voice/default/va/demofightstart16.ogg
new file mode 100644
index 000000000..ce37f609c
Binary files /dev/null and b/sounds/voice/default/va/demofightstart16.ogg differ
diff --git a/sounds/voice/default/va/demofightstart17.ogg b/sounds/voice/default/va/demofightstart17.ogg
new file mode 100644
index 000000000..578d2ba78
Binary files /dev/null and b/sounds/voice/default/va/demofightstart17.ogg differ
diff --git a/sounds/voice/default/va/demofightstart18.ogg b/sounds/voice/default/va/demofightstart18.ogg
new file mode 100644
index 000000000..a6455fa91
Binary files /dev/null and b/sounds/voice/default/va/demofightstart18.ogg differ
diff --git a/sounds/voice/default/va/demofightstart19.ogg b/sounds/voice/default/va/demofightstart19.ogg
new file mode 100644
index 000000000..5f6968799
Binary files /dev/null and b/sounds/voice/default/va/demofightstart19.ogg differ
diff --git a/sounds/voice/default/va/demofightstart2.ogg b/sounds/voice/default/va/demofightstart2.ogg
new file mode 100644
index 000000000..2816b279b
Binary files /dev/null and b/sounds/voice/default/va/demofightstart2.ogg differ
diff --git a/sounds/voice/default/va/demofightstart20.ogg b/sounds/voice/default/va/demofightstart20.ogg
new file mode 100644
index 000000000..6deac22d8
Binary files /dev/null and b/sounds/voice/default/va/demofightstart20.ogg differ
diff --git a/sounds/voice/default/va/demofightstart21.ogg b/sounds/voice/default/va/demofightstart21.ogg
new file mode 100644
index 000000000..1db45265e
Binary files /dev/null and b/sounds/voice/default/va/demofightstart21.ogg differ
diff --git a/sounds/voice/default/va/demofightstart3.ogg b/sounds/voice/default/va/demofightstart3.ogg
new file mode 100644
index 000000000..fab53cbf7
Binary files /dev/null and b/sounds/voice/default/va/demofightstart3.ogg differ
diff --git a/sounds/voice/default/va/demofightstart4.ogg b/sounds/voice/default/va/demofightstart4.ogg
new file mode 100644
index 000000000..0b6c85214
Binary files /dev/null and b/sounds/voice/default/va/demofightstart4.ogg differ
diff --git a/sounds/voice/default/va/demofightstart5.ogg b/sounds/voice/default/va/demofightstart5.ogg
new file mode 100644
index 000000000..52f820aab
Binary files /dev/null and b/sounds/voice/default/va/demofightstart5.ogg differ
diff --git a/sounds/voice/default/va/demofightstart6.ogg b/sounds/voice/default/va/demofightstart6.ogg
new file mode 100644
index 000000000..2e6411e4d
Binary files /dev/null and b/sounds/voice/default/va/demofightstart6.ogg differ
diff --git a/sounds/voice/default/va/demofightstart7.ogg b/sounds/voice/default/va/demofightstart7.ogg
new file mode 100644
index 000000000..8c4d3367b
Binary files /dev/null and b/sounds/voice/default/va/demofightstart7.ogg differ
diff --git a/sounds/voice/default/va/demofightstart8.ogg b/sounds/voice/default/va/demofightstart8.ogg
new file mode 100644
index 000000000..067b6f75e
Binary files /dev/null and b/sounds/voice/default/va/demofightstart8.ogg differ
diff --git a/sounds/voice/default/va/demofightstart9.ogg b/sounds/voice/default/va/demofightstart9.ogg
new file mode 100644
index 000000000..67b6ac654
Binary files /dev/null and b/sounds/voice/default/va/demofightstart9.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret1.ogg b/sounds/voice/default/va/demofindsecret1.ogg
new file mode 100644
index 000000000..7ed06cedc
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret1.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret10.ogg b/sounds/voice/default/va/demofindsecret10.ogg
new file mode 100644
index 000000000..500fef747
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret10.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret11.ogg b/sounds/voice/default/va/demofindsecret11.ogg
new file mode 100644
index 000000000..92c661967
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret11.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret12.ogg b/sounds/voice/default/va/demofindsecret12.ogg
new file mode 100644
index 000000000..e24b735c5
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret12.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret13.ogg b/sounds/voice/default/va/demofindsecret13.ogg
new file mode 100644
index 000000000..f5ddb4205
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret13.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret2.ogg b/sounds/voice/default/va/demofindsecret2.ogg
new file mode 100644
index 000000000..aa94e0968
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret2.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret3.ogg b/sounds/voice/default/va/demofindsecret3.ogg
new file mode 100644
index 000000000..85127307e
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret3.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret4.ogg b/sounds/voice/default/va/demofindsecret4.ogg
new file mode 100644
index 000000000..4eeb11709
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret4.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret5.ogg b/sounds/voice/default/va/demofindsecret5.ogg
new file mode 100644
index 000000000..fd6e18131
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret5.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret6.ogg b/sounds/voice/default/va/demofindsecret6.ogg
new file mode 100644
index 000000000..137cd4505
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret6.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret7.ogg b/sounds/voice/default/va/demofindsecret7.ogg
new file mode 100644
index 000000000..fe4905141
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret7.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret8.ogg b/sounds/voice/default/va/demofindsecret8.ogg
new file mode 100644
index 000000000..03449cff3
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret8.ogg differ
diff --git a/sounds/voice/default/va/demofindsecret9.ogg b/sounds/voice/default/va/demofindsecret9.ogg
new file mode 100644
index 000000000..7ef0ccdc7
Binary files /dev/null and b/sounds/voice/default/va/demofindsecret9.ogg differ
diff --git a/sounds/voice/default/va/demofriendhit1.ogg b/sounds/voice/default/va/demofriendhit1.ogg
new file mode 100644
index 000000000..24716f182
Binary files /dev/null and b/sounds/voice/default/va/demofriendhit1.ogg differ
diff --git a/sounds/voice/default/va/demofriendhit2.ogg b/sounds/voice/default/va/demofriendhit2.ogg
new file mode 100644
index 000000000..2c744a896
Binary files /dev/null and b/sounds/voice/default/va/demofriendhit2.ogg differ
diff --git a/sounds/voice/default/va/demofriendhit3.ogg b/sounds/voice/default/va/demofriendhit3.ogg
new file mode 100644
index 000000000..f0081e5c2
Binary files /dev/null and b/sounds/voice/default/va/demofriendhit3.ogg differ
diff --git a/sounds/voice/default/va/demofriendhit4.ogg b/sounds/voice/default/va/demofriendhit4.ogg
new file mode 100644
index 000000000..c211138c0
Binary files /dev/null and b/sounds/voice/default/va/demofriendhit4.ogg differ
diff --git a/sounds/voice/default/va/demofriendhit5.ogg b/sounds/voice/default/va/demofriendhit5.ogg
new file mode 100644
index 000000000..8cc6eb690
Binary files /dev/null and b/sounds/voice/default/va/demofriendhit5.ogg differ
diff --git a/sounds/voice/default/va/demofriendhit6.ogg b/sounds/voice/default/va/demofriendhit6.ogg
new file mode 100644
index 000000000..724b01ccf
Binary files /dev/null and b/sounds/voice/default/va/demofriendhit6.ogg differ
diff --git a/sounds/voice/default/va/demofriendhit7.ogg b/sounds/voice/default/va/demofriendhit7.ogg
new file mode 100644
index 000000000..d4c5b5c05
Binary files /dev/null and b/sounds/voice/default/va/demofriendhit7.ogg differ
diff --git a/sounds/voice/default/va/demofriendkill1.ogg b/sounds/voice/default/va/demofriendkill1.ogg
new file mode 100644
index 000000000..58fe6111b
Binary files /dev/null and b/sounds/voice/default/va/demofriendkill1.ogg differ
diff --git a/sounds/voice/default/va/demofriendkill2.ogg b/sounds/voice/default/va/demofriendkill2.ogg
new file mode 100644
index 000000000..0fbdd3e1f
Binary files /dev/null and b/sounds/voice/default/va/demofriendkill2.ogg differ
diff --git a/sounds/voice/default/va/demofriendkill3.ogg b/sounds/voice/default/va/demofriendkill3.ogg
new file mode 100644
index 000000000..5f6497e54
Binary files /dev/null and b/sounds/voice/default/va/demofriendkill3.ogg differ
diff --git a/sounds/voice/default/va/demofriendkill4.ogg b/sounds/voice/default/va/demofriendkill4.ogg
new file mode 100644
index 000000000..e6d302445
Binary files /dev/null and b/sounds/voice/default/va/demofriendkill4.ogg differ
diff --git a/sounds/voice/default/va/demofrispyget.ogg b/sounds/voice/default/va/demofrispyget.ogg
new file mode 100644
index 000000000..a344d808d
Binary files /dev/null and b/sounds/voice/default/va/demofrispyget.ogg differ
diff --git a/sounds/voice/default/va/demogetcandygun.ogg b/sounds/voice/default/va/demogetcandygun.ogg
new file mode 100644
index 000000000..489eca047
Binary files /dev/null and b/sounds/voice/default/va/demogetcandygun.ogg differ
diff --git a/sounds/voice/default/va/demogetdeepimpact.ogg b/sounds/voice/default/va/demogetdeepimpact.ogg
new file mode 100644
index 000000000..64db45676
Binary files /dev/null and b/sounds/voice/default/va/demogetdeepimpact.ogg differ
diff --git a/sounds/voice/default/va/demogeteviscerator.ogg b/sounds/voice/default/va/demogeteviscerator.ogg
new file mode 100644
index 000000000..5fc4e76fb
Binary files /dev/null and b/sounds/voice/default/va/demogeteviscerator.ogg differ
diff --git a/sounds/voice/default/va/demogetexplodiumgun1.ogg b/sounds/voice/default/va/demogetexplodiumgun1.ogg
new file mode 100644
index 000000000..9cd5afb2a
Binary files /dev/null and b/sounds/voice/default/va/demogetexplodiumgun1.ogg differ
diff --git a/sounds/voice/default/va/demogetexplodiumgun2.ogg b/sounds/voice/default/va/demogetexplodiumgun2.ogg
new file mode 100644
index 000000000..52d61ee46
Binary files /dev/null and b/sounds/voice/default/va/demogetexplodiumgun2.ogg differ
diff --git a/sounds/voice/default/va/demogetheavymahsheengun.ogg b/sounds/voice/default/va/demogetheavymahsheengun.ogg
new file mode 100644
index 000000000..14aa34d0a
Binary files /dev/null and b/sounds/voice/default/va/demogetheavymahsheengun.ogg differ
diff --git a/sounds/voice/default/va/demogethellblazer.ogg b/sounds/voice/default/va/demogethellblazer.ogg
new file mode 100644
index 000000000..0a991fe80
Binary files /dev/null and b/sounds/voice/default/va/demogethellblazer.ogg differ
diff --git a/sounds/voice/default/va/demogethit1.ogg b/sounds/voice/default/va/demogethit1.ogg
new file mode 100644
index 000000000..f4199563e
Binary files /dev/null and b/sounds/voice/default/va/demogethit1.ogg differ
diff --git a/sounds/voice/default/va/demogethit10.ogg b/sounds/voice/default/va/demogethit10.ogg
new file mode 100644
index 000000000..0ed07a01b
Binary files /dev/null and b/sounds/voice/default/va/demogethit10.ogg differ
diff --git a/sounds/voice/default/va/demogethit11.ogg b/sounds/voice/default/va/demogethit11.ogg
new file mode 100644
index 000000000..8dcbe1323
Binary files /dev/null and b/sounds/voice/default/va/demogethit11.ogg differ
diff --git a/sounds/voice/default/va/demogethit12.ogg b/sounds/voice/default/va/demogethit12.ogg
new file mode 100644
index 000000000..b242a002e
Binary files /dev/null and b/sounds/voice/default/va/demogethit12.ogg differ
diff --git a/sounds/voice/default/va/demogethit13.ogg b/sounds/voice/default/va/demogethit13.ogg
new file mode 100644
index 000000000..37047e6ca
Binary files /dev/null and b/sounds/voice/default/va/demogethit13.ogg differ
diff --git a/sounds/voice/default/va/demogethit14.ogg b/sounds/voice/default/va/demogethit14.ogg
new file mode 100644
index 000000000..fca4219e1
Binary files /dev/null and b/sounds/voice/default/va/demogethit14.ogg differ
diff --git a/sounds/voice/default/va/demogethit15.ogg b/sounds/voice/default/va/demogethit15.ogg
new file mode 100644
index 000000000..6c6e7abde
Binary files /dev/null and b/sounds/voice/default/va/demogethit15.ogg differ
diff --git a/sounds/voice/default/va/demogethit16.ogg b/sounds/voice/default/va/demogethit16.ogg
new file mode 100644
index 000000000..baacb51aa
Binary files /dev/null and b/sounds/voice/default/va/demogethit16.ogg differ
diff --git a/sounds/voice/default/va/demogethit17.ogg b/sounds/voice/default/va/demogethit17.ogg
new file mode 100644
index 000000000..2abb2175b
Binary files /dev/null and b/sounds/voice/default/va/demogethit17.ogg differ
diff --git a/sounds/voice/default/va/demogethit18.ogg b/sounds/voice/default/va/demogethit18.ogg
new file mode 100644
index 000000000..eaee2630c
Binary files /dev/null and b/sounds/voice/default/va/demogethit18.ogg differ
diff --git a/sounds/voice/default/va/demogethit19.ogg b/sounds/voice/default/va/demogethit19.ogg
new file mode 100644
index 000000000..88c668f3e
Binary files /dev/null and b/sounds/voice/default/va/demogethit19.ogg differ
diff --git a/sounds/voice/default/va/demogethit2.ogg b/sounds/voice/default/va/demogethit2.ogg
new file mode 100644
index 000000000..17b0f9968
Binary files /dev/null and b/sounds/voice/default/va/demogethit2.ogg differ
diff --git a/sounds/voice/default/va/demogethit3.ogg b/sounds/voice/default/va/demogethit3.ogg
new file mode 100644
index 000000000..c868a7dd8
Binary files /dev/null and b/sounds/voice/default/va/demogethit3.ogg differ
diff --git a/sounds/voice/default/va/demogethit4.ogg b/sounds/voice/default/va/demogethit4.ogg
new file mode 100644
index 000000000..b7f9a5165
Binary files /dev/null and b/sounds/voice/default/va/demogethit4.ogg differ
diff --git a/sounds/voice/default/va/demogethit5.ogg b/sounds/voice/default/va/demogethit5.ogg
new file mode 100644
index 000000000..81ae5b76c
Binary files /dev/null and b/sounds/voice/default/va/demogethit5.ogg differ
diff --git a/sounds/voice/default/va/demogethit6.ogg b/sounds/voice/default/va/demogethit6.ogg
new file mode 100644
index 000000000..a87cd0617
Binary files /dev/null and b/sounds/voice/default/va/demogethit6.ogg differ
diff --git a/sounds/voice/default/va/demogethit7.ogg b/sounds/voice/default/va/demogethit7.ogg
new file mode 100644
index 000000000..85c771f49
Binary files /dev/null and b/sounds/voice/default/va/demogethit7.ogg differ
diff --git a/sounds/voice/default/va/demogethit8.ogg b/sounds/voice/default/va/demogethit8.ogg
new file mode 100644
index 000000000..4d493a3e0
Binary files /dev/null and b/sounds/voice/default/va/demogethit8.ogg differ
diff --git a/sounds/voice/default/va/demogethit9.ogg b/sounds/voice/default/va/demogethit9.ogg
new file mode 100644
index 000000000..e589a761a
Binary files /dev/null and b/sounds/voice/default/va/demogethit9.ogg differ
diff --git a/sounds/voice/default/va/demogetitamexhammer.ogg b/sounds/voice/default/va/demogetitamexhammer.ogg
new file mode 100644
index 000000000..e8b1badb4
Binary files /dev/null and b/sounds/voice/default/va/demogetitamexhammer.ogg differ
diff --git a/sounds/voice/default/va/demogetmortalrifle.ogg b/sounds/voice/default/va/demogetmortalrifle.ogg
new file mode 100644
index 000000000..8c268dcbb
Binary files /dev/null and b/sounds/voice/default/va/demogetmortalrifle.ogg differ
diff --git a/sounds/voice/default/va/demogetnewsparkster.ogg b/sounds/voice/default/va/demogetnewsparkster.ogg
new file mode 100644
index 000000000..540e118e0
Binary files /dev/null and b/sounds/voice/default/va/demogetnewsparkster.ogg differ
diff --git a/sounds/voice/default/va/demogetplasmablast1.ogg b/sounds/voice/default/va/demogetplasmablast1.ogg
new file mode 100644
index 000000000..aacfa70b4
Binary files /dev/null and b/sounds/voice/default/va/demogetplasmablast1.ogg differ
diff --git a/sounds/voice/default/va/demogetplasmablast2.ogg b/sounds/voice/default/va/demogetplasmablast2.ogg
new file mode 100644
index 000000000..98ce4f761
Binary files /dev/null and b/sounds/voice/default/va/demogetplasmablast2.ogg differ
diff --git a/sounds/voice/default/va/demogetpuntzerbeta.ogg b/sounds/voice/default/va/demogetpuntzerbeta.ogg
new file mode 100644
index 000000000..454816b9e
Binary files /dev/null and b/sounds/voice/default/va/demogetpuntzerbeta.ogg differ
diff --git a/sounds/voice/default/va/demogetpuntzergamma.ogg b/sounds/voice/default/va/demogetpuntzergamma.ogg
new file mode 100644
index 000000000..d531da25d
Binary files /dev/null and b/sounds/voice/default/va/demogetpuntzergamma.ogg differ
diff --git a/sounds/voice/default/va/demogetpusherweapon.ogg b/sounds/voice/default/va/demogetpusherweapon.ogg
new file mode 100644
index 000000000..e6271ec91
Binary files /dev/null and b/sounds/voice/default/va/demogetpusherweapon.ogg differ
diff --git a/sounds/voice/default/va/demogetquadravol.ogg b/sounds/voice/default/va/demogetquadravol.ogg
new file mode 100644
index 000000000..b1b4cf757
Binary files /dev/null and b/sounds/voice/default/va/demogetquadravol.ogg differ
diff --git a/sounds/voice/default/va/demogetrafankos.ogg b/sounds/voice/default/va/demogetrafankos.ogg
new file mode 100644
index 000000000..027698803
Binary files /dev/null and b/sounds/voice/default/va/demogetrafankos.ogg differ
diff --git a/sounds/voice/default/va/demogetraykhom.ogg b/sounds/voice/default/va/demogetraykhom.ogg
new file mode 100644
index 000000000..7e0b08637
Binary files /dev/null and b/sounds/voice/default/va/demogetraykhom.ogg differ
diff --git a/sounds/voice/default/va/demogetsilverbullet.ogg b/sounds/voice/default/va/demogetsilverbullet.ogg
new file mode 100644
index 000000000..3c9cef587
Binary files /dev/null and b/sounds/voice/default/va/demogetsilverbullet.ogg differ
diff --git a/sounds/voice/default/va/demogetsparkster.ogg b/sounds/voice/default/va/demogetsparkster.ogg
new file mode 100644
index 000000000..035f4f37d
Binary files /dev/null and b/sounds/voice/default/va/demogetsparkster.ogg differ
diff --git a/sounds/voice/default/va/demogetspreadgun.ogg b/sounds/voice/default/va/demogetspreadgun.ogg
new file mode 100644
index 000000000..38480963e
Binary files /dev/null and b/sounds/voice/default/va/demogetspreadgun.ogg differ
diff --git a/sounds/voice/default/va/demogetwallbuster.ogg b/sounds/voice/default/va/demogetwallbuster.ogg
new file mode 100644
index 000000000..577de6e4f
Binary files /dev/null and b/sounds/voice/default/va/demogetwallbuster.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon1.ogg b/sounds/voice/default/va/demogetweapon1.ogg
new file mode 100644
index 000000000..3b6102e3f
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon1.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon10.ogg b/sounds/voice/default/va/demogetweapon10.ogg
new file mode 100644
index 000000000..780ec25c3
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon10.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon11.ogg b/sounds/voice/default/va/demogetweapon11.ogg
new file mode 100644
index 000000000..425bce967
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon11.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon12.ogg b/sounds/voice/default/va/demogetweapon12.ogg
new file mode 100644
index 000000000..7c68dea6f
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon12.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon13.ogg b/sounds/voice/default/va/demogetweapon13.ogg
new file mode 100644
index 000000000..595df0ff3
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon13.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon2.ogg b/sounds/voice/default/va/demogetweapon2.ogg
new file mode 100644
index 000000000..8ff774c4f
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon2.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon3.ogg b/sounds/voice/default/va/demogetweapon3.ogg
new file mode 100644
index 000000000..250c89f9c
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon3.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon4.ogg b/sounds/voice/default/va/demogetweapon4.ogg
new file mode 100644
index 000000000..26ec8960f
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon4.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon5.ogg b/sounds/voice/default/va/demogetweapon5.ogg
new file mode 100644
index 000000000..b159620b6
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon5.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon6.ogg b/sounds/voice/default/va/demogetweapon6.ogg
new file mode 100644
index 000000000..5f745584d
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon6.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon7.ogg b/sounds/voice/default/va/demogetweapon7.ogg
new file mode 100644
index 000000000..38db13bb2
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon7.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon8.ogg b/sounds/voice/default/va/demogetweapon8.ogg
new file mode 100644
index 000000000..e30c6a8b7
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon8.ogg differ
diff --git a/sounds/voice/default/va/demogetweapon9.ogg b/sounds/voice/default/va/demogetweapon9.ogg
new file mode 100644
index 000000000..2831aff58
Binary files /dev/null and b/sounds/voice/default/va/demogetweapon9.ogg differ
diff --git a/sounds/voice/default/va/demogetynykron.ogg b/sounds/voice/default/va/demogetynykron.ogg
new file mode 100644
index 000000000..0c0650342
Binary files /dev/null and b/sounds/voice/default/va/demogetynykron.ogg differ
diff --git a/sounds/voice/default/va/demogreet1.ogg b/sounds/voice/default/va/demogreet1.ogg
new file mode 100644
index 000000000..ac39ed350
Binary files /dev/null and b/sounds/voice/default/va/demogreet1.ogg differ
diff --git a/sounds/voice/default/va/demogreet2.ogg b/sounds/voice/default/va/demogreet2.ogg
new file mode 100644
index 000000000..8c3714f7f
Binary files /dev/null and b/sounds/voice/default/va/demogreet2.ogg differ
diff --git a/sounds/voice/default/va/demogreet3.ogg b/sounds/voice/default/va/demogreet3.ogg
new file mode 100644
index 000000000..2a8ed48d2
Binary files /dev/null and b/sounds/voice/default/va/demogreet3.ogg differ
diff --git a/sounds/voice/default/va/demogreet4.ogg b/sounds/voice/default/va/demogreet4.ogg
new file mode 100644
index 000000000..ca74fa480
Binary files /dev/null and b/sounds/voice/default/va/demogreet4.ogg differ
diff --git a/sounds/voice/default/va/demogreet5.ogg b/sounds/voice/default/va/demogreet5.ogg
new file mode 100644
index 000000000..53159c921
Binary files /dev/null and b/sounds/voice/default/va/demogreet5.ogg differ
diff --git a/sounds/voice/default/va/demogreet6.ogg b/sounds/voice/default/va/demogreet6.ogg
new file mode 100644
index 000000000..7ab9c0c30
Binary files /dev/null and b/sounds/voice/default/va/demogreet6.ogg differ
diff --git a/sounds/voice/default/va/demogreet7.ogg b/sounds/voice/default/va/demogreet7.ogg
new file mode 100644
index 000000000..04a49ee3a
Binary files /dev/null and b/sounds/voice/default/va/demogreet7.ogg differ
diff --git a/sounds/voice/default/va/demohitfriend1.ogg b/sounds/voice/default/va/demohitfriend1.ogg
new file mode 100644
index 000000000..9db2e6cf8
Binary files /dev/null and b/sounds/voice/default/va/demohitfriend1.ogg differ
diff --git a/sounds/voice/default/va/demohitfriend2.ogg b/sounds/voice/default/va/demohitfriend2.ogg
new file mode 100644
index 000000000..4bc881b8e
Binary files /dev/null and b/sounds/voice/default/va/demohitfriend2.ogg differ
diff --git a/sounds/voice/default/va/demohitfriend3.ogg b/sounds/voice/default/va/demohitfriend3.ogg
new file mode 100644
index 000000000..8142d9d93
Binary files /dev/null and b/sounds/voice/default/va/demohitfriend3.ogg differ
diff --git a/sounds/voice/default/va/demojammed1.ogg b/sounds/voice/default/va/demojammed1.ogg
new file mode 100644
index 000000000..51cb8fd87
Binary files /dev/null and b/sounds/voice/default/va/demojammed1.ogg differ
diff --git a/sounds/voice/default/va/demojammed2.ogg b/sounds/voice/default/va/demojammed2.ogg
new file mode 100644
index 000000000..f049e3b87
Binary files /dev/null and b/sounds/voice/default/va/demojammed2.ogg differ
diff --git a/sounds/voice/default/va/demojammed3.ogg b/sounds/voice/default/va/demojammed3.ogg
new file mode 100644
index 000000000..eea3a4c94
Binary files /dev/null and b/sounds/voice/default/va/demojammed3.ogg differ
diff --git a/sounds/voice/default/va/demojammed4.ogg b/sounds/voice/default/va/demojammed4.ogg
new file mode 100644
index 000000000..b89961f1a
Binary files /dev/null and b/sounds/voice/default/va/demojammed4.ogg differ
diff --git a/sounds/voice/default/va/demojammed5.ogg b/sounds/voice/default/va/demojammed5.ogg
new file mode 100644
index 000000000..013757b00
Binary files /dev/null and b/sounds/voice/default/va/demojammed5.ogg differ
diff --git a/sounds/voice/default/va/demojammed6.ogg b/sounds/voice/default/va/demojammed6.ogg
new file mode 100644
index 000000000..26070e09d
Binary files /dev/null and b/sounds/voice/default/va/demojammed6.ogg differ
diff --git a/sounds/voice/default/va/demojammed7.ogg b/sounds/voice/default/va/demojammed7.ogg
new file mode 100644
index 000000000..d8fff9771
Binary files /dev/null and b/sounds/voice/default/va/demojammed7.ogg differ
diff --git a/sounds/voice/default/va/demokeyget1.ogg b/sounds/voice/default/va/demokeyget1.ogg
new file mode 100644
index 000000000..5d26f36e6
Binary files /dev/null and b/sounds/voice/default/va/demokeyget1.ogg differ
diff --git a/sounds/voice/default/va/demokeyget2.ogg b/sounds/voice/default/va/demokeyget2.ogg
new file mode 100644
index 000000000..becb570fb
Binary files /dev/null and b/sounds/voice/default/va/demokeyget2.ogg differ
diff --git a/sounds/voice/default/va/demokeyget3.ogg b/sounds/voice/default/va/demokeyget3.ogg
new file mode 100644
index 000000000..87e0452bf
Binary files /dev/null and b/sounds/voice/default/va/demokeyget3.ogg differ
diff --git a/sounds/voice/default/va/demokeyget4.ogg b/sounds/voice/default/va/demokeyget4.ogg
new file mode 100644
index 000000000..462e67f2f
Binary files /dev/null and b/sounds/voice/default/va/demokeyget4.ogg differ
diff --git a/sounds/voice/default/va/demokeyget5.ogg b/sounds/voice/default/va/demokeyget5.ogg
new file mode 100644
index 000000000..13443a0d8
Binary files /dev/null and b/sounds/voice/default/va/demokeyget5.ogg differ
diff --git a/sounds/voice/default/va/demokiringet.ogg b/sounds/voice/default/va/demokiringet.ogg
new file mode 100644
index 000000000..4b6bf7f8f
Binary files /dev/null and b/sounds/voice/default/va/demokiringet.ogg differ
diff --git a/sounds/voice/default/va/demokorax1.ogg b/sounds/voice/default/va/demokorax1.ogg
new file mode 100644
index 000000000..51ed95beb
Binary files /dev/null and b/sounds/voice/default/va/demokorax1.ogg differ
diff --git a/sounds/voice/default/va/demokorax2.ogg b/sounds/voice/default/va/demokorax2.ogg
new file mode 100644
index 000000000..8ef96cc5a
Binary files /dev/null and b/sounds/voice/default/va/demokorax2.ogg differ
diff --git a/sounds/voice/default/va/demokorax3.ogg b/sounds/voice/default/va/demokorax3.ogg
new file mode 100644
index 000000000..3915118cc
Binary files /dev/null and b/sounds/voice/default/va/demokorax3.ogg differ
diff --git a/sounds/voice/default/va/demokorax4.ogg b/sounds/voice/default/va/demokorax4.ogg
new file mode 100644
index 000000000..0bc72f6ef
Binary files /dev/null and b/sounds/voice/default/va/demokorax4.ogg differ
diff --git a/sounds/voice/default/va/demokorax5.ogg b/sounds/voice/default/va/demokorax5.ogg
new file mode 100644
index 000000000..3e14667de
Binary files /dev/null and b/sounds/voice/default/va/demokorax5.ogg differ
diff --git a/sounds/voice/default/va/demokorax6.ogg b/sounds/voice/default/va/demokorax6.ogg
new file mode 100644
index 000000000..442d0a137
Binary files /dev/null and b/sounds/voice/default/va/demokorax6.ogg differ
diff --git a/sounds/voice/default/va/demokorax7.ogg b/sounds/voice/default/va/demokorax7.ogg
new file mode 100644
index 000000000..c9ae7470a
Binary files /dev/null and b/sounds/voice/default/va/demokorax7.ogg differ
diff --git a/sounds/voice/default/va/demokorax8.ogg b/sounds/voice/default/va/demokorax8.ogg
new file mode 100644
index 000000000..845c13d82
Binary files /dev/null and b/sounds/voice/default/va/demokorax8.ogg differ
diff --git a/sounds/voice/default/va/demokorax9.ogg b/sounds/voice/default/va/demokorax9.ogg
new file mode 100644
index 000000000..a711a97fb
Binary files /dev/null and b/sounds/voice/default/va/demokorax9.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood1.ogg b/sounds/voice/default/va/demokoraxblood1.ogg
new file mode 100644
index 000000000..0dc25c80d
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood1.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood10.ogg b/sounds/voice/default/va/demokoraxblood10.ogg
new file mode 100644
index 000000000..1b41cea88
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood10.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood11.ogg b/sounds/voice/default/va/demokoraxblood11.ogg
new file mode 100644
index 000000000..816ac9b21
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood11.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood12.ogg b/sounds/voice/default/va/demokoraxblood12.ogg
new file mode 100644
index 000000000..31e8df7be
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood12.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood13.ogg b/sounds/voice/default/va/demokoraxblood13.ogg
new file mode 100644
index 000000000..40ae3d4af
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood13.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood2.ogg b/sounds/voice/default/va/demokoraxblood2.ogg
new file mode 100644
index 000000000..c36886055
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood2.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood3.ogg b/sounds/voice/default/va/demokoraxblood3.ogg
new file mode 100644
index 000000000..225989dd7
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood3.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood4.ogg b/sounds/voice/default/va/demokoraxblood4.ogg
new file mode 100644
index 000000000..27d3dd417
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood4.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood5.ogg b/sounds/voice/default/va/demokoraxblood5.ogg
new file mode 100644
index 000000000..385d04b17
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood5.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood6.ogg b/sounds/voice/default/va/demokoraxblood6.ogg
new file mode 100644
index 000000000..e8075c2bf
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood6.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood7.ogg b/sounds/voice/default/va/demokoraxblood7.ogg
new file mode 100644
index 000000000..9e354328c
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood7.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood8.ogg b/sounds/voice/default/va/demokoraxblood8.ogg
new file mode 100644
index 000000000..70aba75b0
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood8.ogg differ
diff --git a/sounds/voice/default/va/demokoraxblood9.ogg b/sounds/voice/default/va/demokoraxblood9.ogg
new file mode 100644
index 000000000..c39808fb7
Binary files /dev/null and b/sounds/voice/default/va/demokoraxblood9.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame1.ogg b/sounds/voice/default/va/demokoraxgame1.ogg
new file mode 100644
index 000000000..44b4ffdc3
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame1.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame10.ogg b/sounds/voice/default/va/demokoraxgame10.ogg
new file mode 100644
index 000000000..9243a2ae6
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame10.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame11.ogg b/sounds/voice/default/va/demokoraxgame11.ogg
new file mode 100644
index 000000000..bf9fa9ba0
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame11.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame12.ogg b/sounds/voice/default/va/demokoraxgame12.ogg
new file mode 100644
index 000000000..037a38172
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame12.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame13.ogg b/sounds/voice/default/va/demokoraxgame13.ogg
new file mode 100644
index 000000000..4c0b52fb9
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame13.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame14.ogg b/sounds/voice/default/va/demokoraxgame14.ogg
new file mode 100644
index 000000000..9e3986b81
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame14.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame2.ogg b/sounds/voice/default/va/demokoraxgame2.ogg
new file mode 100644
index 000000000..a13096423
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame2.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame3.ogg b/sounds/voice/default/va/demokoraxgame3.ogg
new file mode 100644
index 000000000..e25489a79
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame3.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame4.ogg b/sounds/voice/default/va/demokoraxgame4.ogg
new file mode 100644
index 000000000..b750527f0
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame4.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame5.ogg b/sounds/voice/default/va/demokoraxgame5.ogg
new file mode 100644
index 000000000..e2a21fae8
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame5.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame6.ogg b/sounds/voice/default/va/demokoraxgame6.ogg
new file mode 100644
index 000000000..22a0c7911
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame6.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame7.ogg b/sounds/voice/default/va/demokoraxgame7.ogg
new file mode 100644
index 000000000..a30800e68
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame7.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame8.ogg b/sounds/voice/default/va/demokoraxgame8.ogg
new file mode 100644
index 000000000..2d139519c
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame8.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgame9.ogg b/sounds/voice/default/va/demokoraxgame9.ogg
new file mode 100644
index 000000000..17cfc0871
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgame9.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet1.ogg b/sounds/voice/default/va/demokoraxgreet1.ogg
new file mode 100644
index 000000000..2b7668203
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet1.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet10.ogg b/sounds/voice/default/va/demokoraxgreet10.ogg
new file mode 100644
index 000000000..4f8a26636
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet10.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet11.ogg b/sounds/voice/default/va/demokoraxgreet11.ogg
new file mode 100644
index 000000000..7114b1957
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet11.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet12.ogg b/sounds/voice/default/va/demokoraxgreet12.ogg
new file mode 100644
index 000000000..9fbf045f1
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet12.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet13.ogg b/sounds/voice/default/va/demokoraxgreet13.ogg
new file mode 100644
index 000000000..b0cea6957
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet13.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet2.ogg b/sounds/voice/default/va/demokoraxgreet2.ogg
new file mode 100644
index 000000000..068d7bcb7
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet2.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet3.ogg b/sounds/voice/default/va/demokoraxgreet3.ogg
new file mode 100644
index 000000000..391633a23
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet3.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet4.ogg b/sounds/voice/default/va/demokoraxgreet4.ogg
new file mode 100644
index 000000000..7faa75e3e
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet4.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet5.ogg b/sounds/voice/default/va/demokoraxgreet5.ogg
new file mode 100644
index 000000000..953397cc7
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet5.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet6.ogg b/sounds/voice/default/va/demokoraxgreet6.ogg
new file mode 100644
index 000000000..80779bffd
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet6.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet7.ogg b/sounds/voice/default/va/demokoraxgreet7.ogg
new file mode 100644
index 000000000..fdb4b239a
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet7.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet8.ogg b/sounds/voice/default/va/demokoraxgreet8.ogg
new file mode 100644
index 000000000..c2931f6ad
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet8.ogg differ
diff --git a/sounds/voice/default/va/demokoraxgreet9.ogg b/sounds/voice/default/va/demokoraxgreet9.ogg
new file mode 100644
index 000000000..99eaa48e6
Binary files /dev/null and b/sounds/voice/default/va/demokoraxgreet9.ogg differ
diff --git a/sounds/voice/default/va/demokoraxmasters1.ogg b/sounds/voice/default/va/demokoraxmasters1.ogg
new file mode 100644
index 000000000..8ffacb186
Binary files /dev/null and b/sounds/voice/default/va/demokoraxmasters1.ogg differ
diff --git a/sounds/voice/default/va/demokoraxmasters2.ogg b/sounds/voice/default/va/demokoraxmasters2.ogg
new file mode 100644
index 000000000..94864283c
Binary files /dev/null and b/sounds/voice/default/va/demokoraxmasters2.ogg differ
diff --git a/sounds/voice/default/va/demokoraxmasters3.ogg b/sounds/voice/default/va/demokoraxmasters3.ogg
new file mode 100644
index 000000000..ac4b10c88
Binary files /dev/null and b/sounds/voice/default/va/demokoraxmasters3.ogg differ
diff --git a/sounds/voice/default/va/demokoraxmasters4.ogg b/sounds/voice/default/va/demokoraxmasters4.ogg
new file mode 100644
index 000000000..afc962d27
Binary files /dev/null and b/sounds/voice/default/va/demokoraxmasters4.ogg differ
diff --git a/sounds/voice/default/va/demokoraxmasters5.ogg b/sounds/voice/default/va/demokoraxmasters5.ogg
new file mode 100644
index 000000000..1ab449b35
Binary files /dev/null and b/sounds/voice/default/va/demokoraxmasters5.ogg differ
diff --git a/sounds/voice/default/va/demokoraxmasters6.ogg b/sounds/voice/default/va/demokoraxmasters6.ogg
new file mode 100644
index 000000000..804e4a91c
Binary files /dev/null and b/sounds/voice/default/va/demokoraxmasters6.ogg differ
diff --git a/sounds/voice/default/va/demokoraxmasters7.ogg b/sounds/voice/default/va/demokoraxmasters7.ogg
new file mode 100644
index 000000000..96309be58
Binary files /dev/null and b/sounds/voice/default/va/demokoraxmasters7.ogg differ
diff --git a/sounds/voice/default/va/demokoraxmasters8.ogg b/sounds/voice/default/va/demokoraxmasters8.ogg
new file mode 100644
index 000000000..c72d0563b
Binary files /dev/null and b/sounds/voice/default/va/demokoraxmasters8.ogg differ
diff --git a/sounds/voice/default/va/demokoraxmasters9.ogg b/sounds/voice/default/va/demokoraxmasters9.ogg
new file mode 100644
index 000000000..a765d063a
Binary files /dev/null and b/sounds/voice/default/va/demokoraxmasters9.ogg differ
diff --git a/sounds/voice/default/va/demokoraxworship1.ogg b/sounds/voice/default/va/demokoraxworship1.ogg
new file mode 100644
index 000000000..5d24de64a
Binary files /dev/null and b/sounds/voice/default/va/demokoraxworship1.ogg differ
diff --git a/sounds/voice/default/va/demokoraxworship10.ogg b/sounds/voice/default/va/demokoraxworship10.ogg
new file mode 100644
index 000000000..f9d8fac06
Binary files /dev/null and b/sounds/voice/default/va/demokoraxworship10.ogg differ
diff --git a/sounds/voice/default/va/demokoraxworship11.ogg b/sounds/voice/default/va/demokoraxworship11.ogg
new file mode 100644
index 000000000..a51582377
Binary files /dev/null and b/sounds/voice/default/va/demokoraxworship11.ogg differ
diff --git a/sounds/voice/default/va/demokoraxworship2.ogg b/sounds/voice/default/va/demokoraxworship2.ogg
new file mode 100644
index 000000000..cc0f6d937
Binary files /dev/null and b/sounds/voice/default/va/demokoraxworship2.ogg differ
diff --git a/sounds/voice/default/va/demokoraxworship3.ogg b/sounds/voice/default/va/demokoraxworship3.ogg
new file mode 100644
index 000000000..36e5c499e
Binary files /dev/null and b/sounds/voice/default/va/demokoraxworship3.ogg differ
diff --git a/sounds/voice/default/va/demokoraxworship4.ogg b/sounds/voice/default/va/demokoraxworship4.ogg
new file mode 100644
index 000000000..45611cee0
Binary files /dev/null and b/sounds/voice/default/va/demokoraxworship4.ogg differ
diff --git a/sounds/voice/default/va/demokoraxworship5.ogg b/sounds/voice/default/va/demokoraxworship5.ogg
new file mode 100644
index 000000000..c73e0a0b2
Binary files /dev/null and b/sounds/voice/default/va/demokoraxworship5.ogg differ
diff --git a/sounds/voice/default/va/demokoraxworship6.ogg b/sounds/voice/default/va/demokoraxworship6.ogg
new file mode 100644
index 000000000..bbe25dbe3
Binary files /dev/null and b/sounds/voice/default/va/demokoraxworship6.ogg differ
diff --git a/sounds/voice/default/va/demokoraxworship7.ogg b/sounds/voice/default/va/demokoraxworship7.ogg
new file mode 100644
index 000000000..6264cf8d9
Binary files /dev/null and b/sounds/voice/default/va/demokoraxworship7.ogg differ
diff --git a/sounds/voice/default/va/demokoraxworship8.ogg b/sounds/voice/default/va/demokoraxworship8.ogg
new file mode 100644
index 000000000..6de4efb73
Binary files /dev/null and b/sounds/voice/default/va/demokoraxworship8.ogg differ
diff --git a/sounds/voice/default/va/demokoraxworship9.ogg b/sounds/voice/default/va/demokoraxworship9.ogg
new file mode 100644
index 000000000..564be958c
Binary files /dev/null and b/sounds/voice/default/va/demokoraxworship9.ogg differ
diff --git a/sounds/voice/default/va/demolocked1.ogg b/sounds/voice/default/va/demolocked1.ogg
new file mode 100644
index 000000000..5132e8549
Binary files /dev/null and b/sounds/voice/default/va/demolocked1.ogg differ
diff --git a/sounds/voice/default/va/demolocked2.ogg b/sounds/voice/default/va/demolocked2.ogg
new file mode 100644
index 000000000..28a0dee0c
Binary files /dev/null and b/sounds/voice/default/va/demolocked2.ogg differ
diff --git a/sounds/voice/default/va/demolocked3.ogg b/sounds/voice/default/va/demolocked3.ogg
new file mode 100644
index 000000000..329c7a735
Binary files /dev/null and b/sounds/voice/default/va/demolocked3.ogg differ
diff --git a/sounds/voice/default/va/demolocked4.ogg b/sounds/voice/default/va/demolocked4.ogg
new file mode 100644
index 000000000..cca215dcc
Binary files /dev/null and b/sounds/voice/default/va/demolocked4.ogg differ
diff --git a/sounds/voice/default/va/demolocked5.ogg b/sounds/voice/default/va/demolocked5.ogg
new file mode 100644
index 000000000..bab6e159e
Binary files /dev/null and b/sounds/voice/default/va/demolocked5.ogg differ
diff --git a/sounds/voice/default/va/demolocked6.ogg b/sounds/voice/default/va/demolocked6.ogg
new file mode 100644
index 000000000..f2cae5034
Binary files /dev/null and b/sounds/voice/default/va/demolocked6.ogg differ
diff --git a/sounds/voice/default/va/demomangaget.ogg b/sounds/voice/default/va/demomangaget.ogg
new file mode 100644
index 000000000..165969d02
Binary files /dev/null and b/sounds/voice/default/va/demomangaget.ogg differ
diff --git a/sounds/voice/default/va/demomapstart1.ogg b/sounds/voice/default/va/demomapstart1.ogg
new file mode 100644
index 000000000..a23b2b9b2
Binary files /dev/null and b/sounds/voice/default/va/demomapstart1.ogg differ
diff --git a/sounds/voice/default/va/demomapstart10.ogg b/sounds/voice/default/va/demomapstart10.ogg
new file mode 100644
index 000000000..ecc502c4b
Binary files /dev/null and b/sounds/voice/default/va/demomapstart10.ogg differ
diff --git a/sounds/voice/default/va/demomapstart11.ogg b/sounds/voice/default/va/demomapstart11.ogg
new file mode 100644
index 000000000..2999f43e4
Binary files /dev/null and b/sounds/voice/default/va/demomapstart11.ogg differ
diff --git a/sounds/voice/default/va/demomapstart12.ogg b/sounds/voice/default/va/demomapstart12.ogg
new file mode 100644
index 000000000..100119ec4
Binary files /dev/null and b/sounds/voice/default/va/demomapstart12.ogg differ
diff --git a/sounds/voice/default/va/demomapstart13.ogg b/sounds/voice/default/va/demomapstart13.ogg
new file mode 100644
index 000000000..3de5e1ca0
Binary files /dev/null and b/sounds/voice/default/va/demomapstart13.ogg differ
diff --git a/sounds/voice/default/va/demomapstart14.ogg b/sounds/voice/default/va/demomapstart14.ogg
new file mode 100644
index 000000000..6bffd26cd
Binary files /dev/null and b/sounds/voice/default/va/demomapstart14.ogg differ
diff --git a/sounds/voice/default/va/demomapstart2.ogg b/sounds/voice/default/va/demomapstart2.ogg
new file mode 100644
index 000000000..866016673
Binary files /dev/null and b/sounds/voice/default/va/demomapstart2.ogg differ
diff --git a/sounds/voice/default/va/demomapstart3.ogg b/sounds/voice/default/va/demomapstart3.ogg
new file mode 100644
index 000000000..ae04a6223
Binary files /dev/null and b/sounds/voice/default/va/demomapstart3.ogg differ
diff --git a/sounds/voice/default/va/demomapstart4.ogg b/sounds/voice/default/va/demomapstart4.ogg
new file mode 100644
index 000000000..5c0354f41
Binary files /dev/null and b/sounds/voice/default/va/demomapstart4.ogg differ
diff --git a/sounds/voice/default/va/demomapstart5.ogg b/sounds/voice/default/va/demomapstart5.ogg
new file mode 100644
index 000000000..63a6204ff
Binary files /dev/null and b/sounds/voice/default/va/demomapstart5.ogg differ
diff --git a/sounds/voice/default/va/demomapstart6.ogg b/sounds/voice/default/va/demomapstart6.ogg
new file mode 100644
index 000000000..57dd367b9
Binary files /dev/null and b/sounds/voice/default/va/demomapstart6.ogg differ
diff --git a/sounds/voice/default/va/demomapstart7.ogg b/sounds/voice/default/va/demomapstart7.ogg
new file mode 100644
index 000000000..b41fbb87f
Binary files /dev/null and b/sounds/voice/default/va/demomapstart7.ogg differ
diff --git a/sounds/voice/default/va/demomapstart8.ogg b/sounds/voice/default/va/demomapstart8.ogg
new file mode 100644
index 000000000..8acc25d05
Binary files /dev/null and b/sounds/voice/default/va/demomapstart8.ogg differ
diff --git a/sounds/voice/default/va/demomapstart9.ogg b/sounds/voice/default/va/demomapstart9.ogg
new file mode 100644
index 000000000..060478e17
Binary files /dev/null and b/sounds/voice/default/va/demomapstart9.ogg differ
diff --git a/sounds/voice/default/va/demomothget.ogg b/sounds/voice/default/va/demomothget.ogg
new file mode 100644
index 000000000..d72ed9dbd
Binary files /dev/null and b/sounds/voice/default/va/demomothget.ogg differ
diff --git a/sounds/voice/default/va/demonutatcoget.ogg b/sounds/voice/default/va/demonutatcoget.ogg
new file mode 100644
index 000000000..500341cb9
Binary files /dev/null and b/sounds/voice/default/va/demonutatcoget.ogg differ
diff --git a/sounds/voice/default/va/demopeachget.ogg b/sounds/voice/default/va/demopeachget.ogg
new file mode 100644
index 000000000..b4b4c3cff
Binary files /dev/null and b/sounds/voice/default/va/demopeachget.ogg differ
diff --git a/sounds/voice/default/va/demopethdoom1.ogg b/sounds/voice/default/va/demopethdoom1.ogg
new file mode 100644
index 000000000..e6048cdcf
Binary files /dev/null and b/sounds/voice/default/va/demopethdoom1.ogg differ
diff --git a/sounds/voice/default/va/demopethdoom2.ogg b/sounds/voice/default/va/demopethdoom2.ogg
new file mode 100644
index 000000000..5cedf0a6d
Binary files /dev/null and b/sounds/voice/default/va/demopethdoom2.ogg differ
diff --git a/sounds/voice/default/va/demopethdoom3.ogg b/sounds/voice/default/va/demopethdoom3.ogg
new file mode 100644
index 000000000..9c987b41a
Binary files /dev/null and b/sounds/voice/default/va/demopethdoom3.ogg differ
diff --git a/sounds/voice/default/va/demopethdoom4.ogg b/sounds/voice/default/va/demopethdoom4.ogg
new file mode 100644
index 000000000..6d1bb9497
Binary files /dev/null and b/sounds/voice/default/va/demopethdoom4.ogg differ
diff --git a/sounds/voice/default/va/demopethdoom5.ogg b/sounds/voice/default/va/demopethdoom5.ogg
new file mode 100644
index 000000000..b4d21c20a
Binary files /dev/null and b/sounds/voice/default/va/demopethdoom5.ogg differ
diff --git a/sounds/voice/default/va/demopethdoom6.ogg b/sounds/voice/default/va/demopethdoom6.ogg
new file mode 100644
index 000000000..1e8156510
Binary files /dev/null and b/sounds/voice/default/va/demopethdoom6.ogg differ
diff --git a/sounds/voice/default/va/demopethdoom7.ogg b/sounds/voice/default/va/demopethdoom7.ogg
new file mode 100644
index 000000000..dc1ecb31c
Binary files /dev/null and b/sounds/voice/default/va/demopethdoom7.ogg differ
diff --git a/sounds/voice/default/va/demopethdoom8.ogg b/sounds/voice/default/va/demopethdoom8.ogg
new file mode 100644
index 000000000..1093a5695
Binary files /dev/null and b/sounds/voice/default/va/demopethdoom8.ogg differ
diff --git a/sounds/voice/default/va/demopethdoom9.ogg b/sounds/voice/default/va/demopethdoom9.ogg
new file mode 100644
index 000000000..9eafca619
Binary files /dev/null and b/sounds/voice/default/va/demopethdoom9.ogg differ
diff --git a/sounds/voice/default/va/demopethdoomfinish1.ogg b/sounds/voice/default/va/demopethdoomfinish1.ogg
new file mode 100644
index 000000000..d8b24e7ff
Binary files /dev/null and b/sounds/voice/default/va/demopethdoomfinish1.ogg differ
diff --git a/sounds/voice/default/va/demopethdoomfinish2.ogg b/sounds/voice/default/va/demopethdoomfinish2.ogg
new file mode 100644
index 000000000..f7745a35b
Binary files /dev/null and b/sounds/voice/default/va/demopethdoomfinish2.ogg differ
diff --git a/sounds/voice/default/va/demopethdoomfinish3.ogg b/sounds/voice/default/va/demopethdoomfinish3.ogg
new file mode 100644
index 000000000..ebc1a79c5
Binary files /dev/null and b/sounds/voice/default/va/demopethdoomfinish3.ogg differ
diff --git a/sounds/voice/default/va/demopethdoomfinish4.ogg b/sounds/voice/default/va/demopethdoomfinish4.ogg
new file mode 100644
index 000000000..71b023b20
Binary files /dev/null and b/sounds/voice/default/va/demopethdoomfinish4.ogg differ
diff --git a/sounds/voice/default/va/demopethdoomfinish5.ogg b/sounds/voice/default/va/demopethdoomfinish5.ogg
new file mode 100644
index 000000000..1fc98f38d
Binary files /dev/null and b/sounds/voice/default/va/demopethdoomfinish5.ogg differ
diff --git a/sounds/voice/default/va/demopethdoomfinish6.ogg b/sounds/voice/default/va/demopethdoomfinish6.ogg
new file mode 100644
index 000000000..8813a7706
Binary files /dev/null and b/sounds/voice/default/va/demopethdoomfinish6.ogg differ
diff --git a/sounds/voice/default/va/demopethdoomfinish7.ogg b/sounds/voice/default/va/demopethdoomfinish7.ogg
new file mode 100644
index 000000000..b1b0147c8
Binary files /dev/null and b/sounds/voice/default/va/demopethdoomfinish7.ogg differ
diff --git a/sounds/voice/default/va/demopethdoomfinish8.ogg b/sounds/voice/default/va/demopethdoomfinish8.ogg
new file mode 100644
index 000000000..3577dc35a
Binary files /dev/null and b/sounds/voice/default/va/demopethdoomfinish8.ogg differ
diff --git a/sounds/voice/default/va/demopethdoomfinish9.ogg b/sounds/voice/default/va/demopethdoomfinish9.ogg
new file mode 100644
index 000000000..f2667249f
Binary files /dev/null and b/sounds/voice/default/va/demopethdoomfinish9.ogg differ
diff --git a/sounds/voice/default/va/demopetmashiro1.ogg b/sounds/voice/default/va/demopetmashiro1.ogg
new file mode 100644
index 000000000..68bf8ee99
Binary files /dev/null and b/sounds/voice/default/va/demopetmashiro1.ogg differ
diff --git a/sounds/voice/default/va/demopetmashiro2.ogg b/sounds/voice/default/va/demopetmashiro2.ogg
new file mode 100644
index 000000000..c6be5034f
Binary files /dev/null and b/sounds/voice/default/va/demopetmashiro2.ogg differ
diff --git a/sounds/voice/default/va/demopetmashiro3.ogg b/sounds/voice/default/va/demopetmashiro3.ogg
new file mode 100644
index 000000000..8efb08403
Binary files /dev/null and b/sounds/voice/default/va/demopetmashiro3.ogg differ
diff --git a/sounds/voice/default/va/demopetmashiro4.ogg b/sounds/voice/default/va/demopetmashiro4.ogg
new file mode 100644
index 000000000..f3413aa02
Binary files /dev/null and b/sounds/voice/default/va/demopetmashiro4.ogg differ
diff --git a/sounds/voice/default/va/demopetmashiro5.ogg b/sounds/voice/default/va/demopetmashiro5.ogg
new file mode 100644
index 000000000..90db918ff
Binary files /dev/null and b/sounds/voice/default/va/demopetmashiro5.ogg differ
diff --git a/sounds/voice/default/va/demopetmashiro6.ogg b/sounds/voice/default/va/demopetmashiro6.ogg
new file mode 100644
index 000000000..211a31a50
Binary files /dev/null and b/sounds/voice/default/va/demopetmashiro6.ogg differ
diff --git a/sounds/voice/default/va/demopetmashiro7.ogg b/sounds/voice/default/va/demopetmashiro7.ogg
new file mode 100644
index 000000000..c4828acbb
Binary files /dev/null and b/sounds/voice/default/va/demopetmashiro7.ogg differ
diff --git a/sounds/voice/default/va/demopuzzfail1.ogg b/sounds/voice/default/va/demopuzzfail1.ogg
new file mode 100644
index 000000000..1562e984e
Binary files /dev/null and b/sounds/voice/default/va/demopuzzfail1.ogg differ
diff --git a/sounds/voice/default/va/demopuzzfail2.ogg b/sounds/voice/default/va/demopuzzfail2.ogg
new file mode 100644
index 000000000..242f274d4
Binary files /dev/null and b/sounds/voice/default/va/demopuzzfail2.ogg differ
diff --git a/sounds/voice/default/va/demopuzzfail3.ogg b/sounds/voice/default/va/demopuzzfail3.ogg
new file mode 100644
index 000000000..ce63ee75d
Binary files /dev/null and b/sounds/voice/default/va/demopuzzfail3.ogg differ
diff --git a/sounds/voice/default/va/demopuzzfail4.ogg b/sounds/voice/default/va/demopuzzfail4.ogg
new file mode 100644
index 000000000..e160c00d7
Binary files /dev/null and b/sounds/voice/default/va/demopuzzfail4.ogg differ
diff --git a/sounds/voice/default/va/demopuzzfail5.ogg b/sounds/voice/default/va/demopuzzfail5.ogg
new file mode 100644
index 000000000..b29d30047
Binary files /dev/null and b/sounds/voice/default/va/demopuzzfail5.ogg differ
diff --git a/sounds/voice/default/va/demopuzzfail6.ogg b/sounds/voice/default/va/demopuzzfail6.ogg
new file mode 100644
index 000000000..4a1d56875
Binary files /dev/null and b/sounds/voice/default/va/demopuzzfail6.ogg differ
diff --git a/sounds/voice/default/va/demopuzzsucc1.ogg b/sounds/voice/default/va/demopuzzsucc1.ogg
new file mode 100644
index 000000000..bd6122aff
Binary files /dev/null and b/sounds/voice/default/va/demopuzzsucc1.ogg differ
diff --git a/sounds/voice/default/va/demopuzzsucc2.ogg b/sounds/voice/default/va/demopuzzsucc2.ogg
new file mode 100644
index 000000000..dfbc9a230
Binary files /dev/null and b/sounds/voice/default/va/demopuzzsucc2.ogg differ
diff --git a/sounds/voice/default/va/demopuzzsucc3.ogg b/sounds/voice/default/va/demopuzzsucc3.ogg
new file mode 100644
index 000000000..0dcba4764
Binary files /dev/null and b/sounds/voice/default/va/demopuzzsucc3.ogg differ
diff --git a/sounds/voice/default/va/demopuzzsucc4.ogg b/sounds/voice/default/va/demopuzzsucc4.ogg
new file mode 100644
index 000000000..acbe34d07
Binary files /dev/null and b/sounds/voice/default/va/demopuzzsucc4.ogg differ
diff --git a/sounds/voice/default/va/demopuzzsucc5.ogg b/sounds/voice/default/va/demopuzzsucc5.ogg
new file mode 100644
index 000000000..3fb66a275
Binary files /dev/null and b/sounds/voice/default/va/demopuzzsucc5.ogg differ
diff --git a/sounds/voice/default/va/demopuzzsucc6.ogg b/sounds/voice/default/va/demopuzzsucc6.ogg
new file mode 100644
index 000000000..3f8c9d713
Binary files /dev/null and b/sounds/voice/default/va/demopuzzsucc6.ogg differ
diff --git a/sounds/voice/default/va/demoragekit1.ogg b/sounds/voice/default/va/demoragekit1.ogg
new file mode 100644
index 000000000..c8f36ba38
Binary files /dev/null and b/sounds/voice/default/va/demoragekit1.ogg differ
diff --git a/sounds/voice/default/va/demoragekit10.ogg b/sounds/voice/default/va/demoragekit10.ogg
new file mode 100644
index 000000000..d3090f6e1
Binary files /dev/null and b/sounds/voice/default/va/demoragekit10.ogg differ
diff --git a/sounds/voice/default/va/demoragekit11.ogg b/sounds/voice/default/va/demoragekit11.ogg
new file mode 100644
index 000000000..4854fa8f1
Binary files /dev/null and b/sounds/voice/default/va/demoragekit11.ogg differ
diff --git a/sounds/voice/default/va/demoragekit12.ogg b/sounds/voice/default/va/demoragekit12.ogg
new file mode 100644
index 000000000..c69096fd3
Binary files /dev/null and b/sounds/voice/default/va/demoragekit12.ogg differ
diff --git a/sounds/voice/default/va/demoragekit13.ogg b/sounds/voice/default/va/demoragekit13.ogg
new file mode 100644
index 000000000..cbd1e96f7
Binary files /dev/null and b/sounds/voice/default/va/demoragekit13.ogg differ
diff --git a/sounds/voice/default/va/demoragekit14.ogg b/sounds/voice/default/va/demoragekit14.ogg
new file mode 100644
index 000000000..69b3d25c7
Binary files /dev/null and b/sounds/voice/default/va/demoragekit14.ogg differ
diff --git a/sounds/voice/default/va/demoragekit15.ogg b/sounds/voice/default/va/demoragekit15.ogg
new file mode 100644
index 000000000..e4fef64a4
Binary files /dev/null and b/sounds/voice/default/va/demoragekit15.ogg differ
diff --git a/sounds/voice/default/va/demoragekit16.ogg b/sounds/voice/default/va/demoragekit16.ogg
new file mode 100644
index 000000000..a97516769
Binary files /dev/null and b/sounds/voice/default/va/demoragekit16.ogg differ
diff --git a/sounds/voice/default/va/demoragekit17.ogg b/sounds/voice/default/va/demoragekit17.ogg
new file mode 100644
index 000000000..7137867ff
Binary files /dev/null and b/sounds/voice/default/va/demoragekit17.ogg differ
diff --git a/sounds/voice/default/va/demoragekit2.ogg b/sounds/voice/default/va/demoragekit2.ogg
new file mode 100644
index 000000000..31b20e86a
Binary files /dev/null and b/sounds/voice/default/va/demoragekit2.ogg differ
diff --git a/sounds/voice/default/va/demoragekit3.ogg b/sounds/voice/default/va/demoragekit3.ogg
new file mode 100644
index 000000000..74cf36551
Binary files /dev/null and b/sounds/voice/default/va/demoragekit3.ogg differ
diff --git a/sounds/voice/default/va/demoragekit4.ogg b/sounds/voice/default/va/demoragekit4.ogg
new file mode 100644
index 000000000..eca21c7a8
Binary files /dev/null and b/sounds/voice/default/va/demoragekit4.ogg differ
diff --git a/sounds/voice/default/va/demoragekit5.ogg b/sounds/voice/default/va/demoragekit5.ogg
new file mode 100644
index 000000000..2f2024c7b
Binary files /dev/null and b/sounds/voice/default/va/demoragekit5.ogg differ
diff --git a/sounds/voice/default/va/demoragekit6.ogg b/sounds/voice/default/va/demoragekit6.ogg
new file mode 100644
index 000000000..8358e295c
Binary files /dev/null and b/sounds/voice/default/va/demoragekit6.ogg differ
diff --git a/sounds/voice/default/va/demoragekit7.ogg b/sounds/voice/default/va/demoragekit7.ogg
new file mode 100644
index 000000000..f67f7a19d
Binary files /dev/null and b/sounds/voice/default/va/demoragekit7.ogg differ
diff --git a/sounds/voice/default/va/demoragekit8.ogg b/sounds/voice/default/va/demoragekit8.ogg
new file mode 100644
index 000000000..7590428dc
Binary files /dev/null and b/sounds/voice/default/va/demoragekit8.ogg differ
diff --git a/sounds/voice/default/va/demoragekit9.ogg b/sounds/voice/default/va/demoragekit9.ogg
new file mode 100644
index 000000000..dface75f2
Binary files /dev/null and b/sounds/voice/default/va/demoragekit9.ogg differ
diff --git a/sounds/voice/default/va/demoromero1.ogg b/sounds/voice/default/va/demoromero1.ogg
new file mode 100644
index 000000000..708423c9d
Binary files /dev/null and b/sounds/voice/default/va/demoromero1.ogg differ
diff --git a/sounds/voice/default/va/demoromero2.ogg b/sounds/voice/default/va/demoromero2.ogg
new file mode 100644
index 000000000..40617e20e
Binary files /dev/null and b/sounds/voice/default/va/demoromero2.ogg differ
diff --git a/sounds/voice/default/va/demoromero3.ogg b/sounds/voice/default/va/demoromero3.ogg
new file mode 100644
index 000000000..c3dbfa5d6
Binary files /dev/null and b/sounds/voice/default/va/demoromero3.ogg differ
diff --git a/sounds/voice/default/va/demoromero4.ogg b/sounds/voice/default/va/demoromero4.ogg
new file mode 100644
index 000000000..1520466be
Binary files /dev/null and b/sounds/voice/default/va/demoromero4.ogg differ
diff --git a/sounds/voice/default/va/demoromero5.ogg b/sounds/voice/default/va/demoromero5.ogg
new file mode 100644
index 000000000..6e1efdf0f
Binary files /dev/null and b/sounds/voice/default/va/demoromero5.ogg differ
diff --git a/sounds/voice/default/va/demoromero6.ogg b/sounds/voice/default/va/demoromero6.ogg
new file mode 100644
index 000000000..be1eb0e83
Binary files /dev/null and b/sounds/voice/default/va/demoromero6.ogg differ
diff --git a/sounds/voice/default/va/demoromero7.ogg b/sounds/voice/default/va/demoromero7.ogg
new file mode 100644
index 000000000..02ed17348
Binary files /dev/null and b/sounds/voice/default/va/demoromero7.ogg differ
diff --git a/sounds/voice/default/va/demoromero8.ogg b/sounds/voice/default/va/demoromero8.ogg
new file mode 100644
index 000000000..4f4c3303e
Binary files /dev/null and b/sounds/voice/default/va/demoromero8.ogg differ
diff --git a/sounds/voice/default/va/demosayaget.ogg b/sounds/voice/default/va/demosayaget.ogg
new file mode 100644
index 000000000..3a662b551
Binary files /dev/null and b/sounds/voice/default/va/demosayaget.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill1.ogg b/sounds/voice/default/va/demoscorekill1.ogg
new file mode 100644
index 000000000..d83b0cf47
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill1.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill10.ogg b/sounds/voice/default/va/demoscorekill10.ogg
new file mode 100644
index 000000000..7058518c4
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill10.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill11.ogg b/sounds/voice/default/va/demoscorekill11.ogg
new file mode 100644
index 000000000..d07de10d1
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill11.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill12.ogg b/sounds/voice/default/va/demoscorekill12.ogg
new file mode 100644
index 000000000..b1beebc22
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill12.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill13.ogg b/sounds/voice/default/va/demoscorekill13.ogg
new file mode 100644
index 000000000..8b528088e
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill13.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill14.ogg b/sounds/voice/default/va/demoscorekill14.ogg
new file mode 100644
index 000000000..2df724280
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill14.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill15.ogg b/sounds/voice/default/va/demoscorekill15.ogg
new file mode 100644
index 000000000..bcbf75761
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill15.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill16.ogg b/sounds/voice/default/va/demoscorekill16.ogg
new file mode 100644
index 000000000..90edebf42
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill16.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill17.ogg b/sounds/voice/default/va/demoscorekill17.ogg
new file mode 100644
index 000000000..efd53bc57
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill17.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill18.ogg b/sounds/voice/default/va/demoscorekill18.ogg
new file mode 100644
index 000000000..b5cfed579
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill18.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill19.ogg b/sounds/voice/default/va/demoscorekill19.ogg
new file mode 100644
index 000000000..ed0f477bf
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill19.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill2.ogg b/sounds/voice/default/va/demoscorekill2.ogg
new file mode 100644
index 000000000..987de343f
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill2.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill20.ogg b/sounds/voice/default/va/demoscorekill20.ogg
new file mode 100644
index 000000000..c32521595
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill20.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill21.ogg b/sounds/voice/default/va/demoscorekill21.ogg
new file mode 100644
index 000000000..ad27605b9
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill21.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill22.ogg b/sounds/voice/default/va/demoscorekill22.ogg
new file mode 100644
index 000000000..970951e13
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill22.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill23.ogg b/sounds/voice/default/va/demoscorekill23.ogg
new file mode 100644
index 000000000..5bedaa985
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill23.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill24.ogg b/sounds/voice/default/va/demoscorekill24.ogg
new file mode 100644
index 000000000..4ec1f1ad1
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill24.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill25.ogg b/sounds/voice/default/va/demoscorekill25.ogg
new file mode 100644
index 000000000..e492aae3b
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill25.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill3.ogg b/sounds/voice/default/va/demoscorekill3.ogg
new file mode 100644
index 000000000..63a1f3226
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill3.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill4.ogg b/sounds/voice/default/va/demoscorekill4.ogg
new file mode 100644
index 000000000..23a23e068
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill4.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill5.ogg b/sounds/voice/default/va/demoscorekill5.ogg
new file mode 100644
index 000000000..0592d5e44
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill5.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill6.ogg b/sounds/voice/default/va/demoscorekill6.ogg
new file mode 100644
index 000000000..ff334a244
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill6.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill7.ogg b/sounds/voice/default/va/demoscorekill7.ogg
new file mode 100644
index 000000000..7e2f7d5fd
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill7.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill8.ogg b/sounds/voice/default/va/demoscorekill8.ogg
new file mode 100644
index 000000000..011ffd7cd
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill8.ogg differ
diff --git a/sounds/voice/default/va/demoscorekill9.ogg b/sounds/voice/default/va/demoscorekill9.ogg
new file mode 100644
index 000000000..93fe75b95
Binary files /dev/null and b/sounds/voice/default/va/demoscorekill9.ogg differ
diff --git a/sounds/voice/default/va/demosignalsget.ogg b/sounds/voice/default/va/demosignalsget.ogg
new file mode 100644
index 000000000..cf7ee33d5
Binary files /dev/null and b/sounds/voice/default/va/demosignalsget.ogg differ
diff --git a/sounds/voice/default/va/demousefail1.ogg b/sounds/voice/default/va/demousefail1.ogg
new file mode 100644
index 000000000..690d1a643
Binary files /dev/null and b/sounds/voice/default/va/demousefail1.ogg differ
diff --git a/sounds/voice/default/va/demousefail2.ogg b/sounds/voice/default/va/demousefail2.ogg
new file mode 100644
index 000000000..cab7f2b40
Binary files /dev/null and b/sounds/voice/default/va/demousefail2.ogg differ
diff --git a/sounds/voice/default/va/demousefail3.ogg b/sounds/voice/default/va/demousefail3.ogg
new file mode 100644
index 000000000..2c28a69bb
Binary files /dev/null and b/sounds/voice/default/va/demousefail3.ogg differ
diff --git a/sounds/voice/default/va/demousefail4.ogg b/sounds/voice/default/va/demousefail4.ogg
new file mode 100644
index 000000000..70a089e84
Binary files /dev/null and b/sounds/voice/default/va/demousefail4.ogg differ
diff --git a/sounds/voice/default/va/demousefail5.ogg b/sounds/voice/default/va/demousefail5.ogg
new file mode 100644
index 000000000..9b804de4f
Binary files /dev/null and b/sounds/voice/default/va/demousefail5.ogg differ
diff --git a/sounds/voice/default/va/demousefail6.ogg b/sounds/voice/default/va/demousefail6.ogg
new file mode 100644
index 000000000..76369287b
Binary files /dev/null and b/sounds/voice/default/va/demousefail6.ogg differ
diff --git a/sounds/voice/default/va/demousefail7.ogg b/sounds/voice/default/va/demousefail7.ogg
new file mode 100644
index 000000000..f82124e3f
Binary files /dev/null and b/sounds/voice/default/va/demousefail7.ogg differ
diff --git a/sounds/voice/default/va/demousefail8.ogg b/sounds/voice/default/va/demousefail8.ogg
new file mode 100644
index 000000000..99ac62160
Binary files /dev/null and b/sounds/voice/default/va/demousefail8.ogg differ
diff --git a/sounds/voice/default/va/demousefail9.ogg b/sounds/voice/default/va/demousefail9.ogg
new file mode 100644
index 000000000..032dd485c
Binary files /dev/null and b/sounds/voice/default/va/demousefail9.ogg differ
diff --git a/sounds/voice/default/va/demousegrunt1.ogg b/sounds/voice/default/va/demousegrunt1.ogg
new file mode 100644
index 000000000..5ed34dc8f
Binary files /dev/null and b/sounds/voice/default/va/demousegrunt1.ogg differ
diff --git a/sounds/voice/default/va/demousegrunt2.ogg b/sounds/voice/default/va/demousegrunt2.ogg
new file mode 100644
index 000000000..4c48d55ff
Binary files /dev/null and b/sounds/voice/default/va/demousegrunt2.ogg differ
diff --git a/sounds/voice/default/va/demousegrunt3.ogg b/sounds/voice/default/va/demousegrunt3.ogg
new file mode 100644
index 000000000..60b841211
Binary files /dev/null and b/sounds/voice/default/va/demousegrunt3.ogg differ
diff --git a/sounds/voice/default/va/demousegrunt4.ogg b/sounds/voice/default/va/demousegrunt4.ogg
new file mode 100644
index 000000000..f28a7b555
Binary files /dev/null and b/sounds/voice/default/va/demousegrunt4.ogg differ
diff --git a/sounds/voice/legacy/demodeath1.ogg b/sounds/voice/legacy/demodeath1.ogg
new file mode 100644
index 000000000..bc213cd59
Binary files /dev/null and b/sounds/voice/legacy/demodeath1.ogg differ
diff --git a/sounds/voice/legacy/demodeath2.ogg b/sounds/voice/legacy/demodeath2.ogg
new file mode 100644
index 000000000..b212e9a79
Binary files /dev/null and b/sounds/voice/legacy/demodeath2.ogg differ
diff --git a/sounds/voice/legacy/demodeath3.ogg b/sounds/voice/legacy/demodeath3.ogg
new file mode 100644
index 000000000..0e852002f
Binary files /dev/null and b/sounds/voice/legacy/demodeath3.ogg differ
diff --git a/sounds/voice/legacy/demodeath4.ogg b/sounds/voice/legacy/demodeath4.ogg
new file mode 100644
index 000000000..1c1a4f872
Binary files /dev/null and b/sounds/voice/legacy/demodeath4.ogg differ
diff --git a/sounds/voice/legacy/demodeath5.ogg b/sounds/voice/legacy/demodeath5.ogg
new file mode 100644
index 000000000..1e1a25b45
Binary files /dev/null and b/sounds/voice/legacy/demodeath5.ogg differ
diff --git a/sounds/voice/legacy/demogrunt1.ogg b/sounds/voice/legacy/demogrunt1.ogg
new file mode 100644
index 000000000..bd3d818df
Binary files /dev/null and b/sounds/voice/legacy/demogrunt1.ogg differ
diff --git a/sounds/voice/legacy/demogrunt2.ogg b/sounds/voice/legacy/demogrunt2.ogg
new file mode 100644
index 000000000..2c9412e36
Binary files /dev/null and b/sounds/voice/legacy/demogrunt2.ogg differ
diff --git a/sounds/voice/legacy/demogrunt3.ogg b/sounds/voice/legacy/demogrunt3.ogg
new file mode 100644
index 000000000..5e80c06af
Binary files /dev/null and b/sounds/voice/legacy/demogrunt3.ogg differ
diff --git a/sounds/voice/legacy/demogrunt4.ogg b/sounds/voice/legacy/demogrunt4.ogg
new file mode 100644
index 000000000..03de92028
Binary files /dev/null and b/sounds/voice/legacy/demogrunt4.ogg differ
diff --git a/sounds/voice/legacy/demogrunt5.ogg b/sounds/voice/legacy/demogrunt5.ogg
new file mode 100644
index 000000000..a6d53a1e9
Binary files /dev/null and b/sounds/voice/legacy/demogrunt5.ogg differ
diff --git a/sounds/voice/legacy/demogrunt6.ogg b/sounds/voice/legacy/demogrunt6.ogg
new file mode 100644
index 000000000..06503e5d2
Binary files /dev/null and b/sounds/voice/legacy/demogrunt6.ogg differ
diff --git a/sounds/voice/legacy/demohipain1.ogg b/sounds/voice/legacy/demohipain1.ogg
new file mode 100644
index 000000000..8488011d7
Binary files /dev/null and b/sounds/voice/legacy/demohipain1.ogg differ
diff --git a/sounds/voice/legacy/demohipain2.ogg b/sounds/voice/legacy/demohipain2.ogg
new file mode 100644
index 000000000..1acdeef91
Binary files /dev/null and b/sounds/voice/legacy/demohipain2.ogg differ
diff --git a/sounds/voice/legacy/demohipain3.ogg b/sounds/voice/legacy/demohipain3.ogg
new file mode 100644
index 000000000..986ded96d
Binary files /dev/null and b/sounds/voice/legacy/demohipain3.ogg differ
diff --git a/sounds/voice/legacy/demohipain4.ogg b/sounds/voice/legacy/demohipain4.ogg
new file mode 100644
index 000000000..f0f86f45e
Binary files /dev/null and b/sounds/voice/legacy/demohipain4.ogg differ
diff --git a/sounds/voice/legacy/demohipain5.ogg b/sounds/voice/legacy/demohipain5.ogg
new file mode 100644
index 000000000..89d165c08
Binary files /dev/null and b/sounds/voice/legacy/demohipain5.ogg differ
diff --git a/sounds/voice/legacy/demolopain1.ogg b/sounds/voice/legacy/demolopain1.ogg
new file mode 100644
index 000000000..2387fef3e
Binary files /dev/null and b/sounds/voice/legacy/demolopain1.ogg differ
diff --git a/sounds/voice/legacy/demolopain2.ogg b/sounds/voice/legacy/demolopain2.ogg
new file mode 100644
index 000000000..5c4cd0473
Binary files /dev/null and b/sounds/voice/legacy/demolopain2.ogg differ
diff --git a/sounds/voice/legacy/demolopain3.ogg b/sounds/voice/legacy/demolopain3.ogg
new file mode 100644
index 000000000..060ed5466
Binary files /dev/null and b/sounds/voice/legacy/demolopain3.ogg differ
diff --git a/sounds/voice/legacy/demolopain4.ogg b/sounds/voice/legacy/demolopain4.ogg
new file mode 100644
index 000000000..fdeb76303
Binary files /dev/null and b/sounds/voice/legacy/demolopain4.ogg differ
diff --git a/sounds/voice/legacy/demolopain5.ogg b/sounds/voice/legacy/demolopain5.ogg
new file mode 100644
index 000000000..46e7b5c00
Binary files /dev/null and b/sounds/voice/legacy/demolopain5.ogg differ
diff --git a/sounds/voice/legacy/demopain1.ogg b/sounds/voice/legacy/demopain1.ogg
new file mode 100644
index 000000000..e7cc6f7da
Binary files /dev/null and b/sounds/voice/legacy/demopain1.ogg differ
diff --git a/sounds/voice/legacy/demopain2.ogg b/sounds/voice/legacy/demopain2.ogg
new file mode 100644
index 000000000..d5fcfa9b6
Binary files /dev/null and b/sounds/voice/legacy/demopain2.ogg differ
diff --git a/sounds/voice/legacy/demopain3.ogg b/sounds/voice/legacy/demopain3.ogg
new file mode 100644
index 000000000..6dfc9a717
Binary files /dev/null and b/sounds/voice/legacy/demopain3.ogg differ
diff --git a/sounds/voice/legacy/demopain4.ogg b/sounds/voice/legacy/demopain4.ogg
new file mode 100644
index 000000000..cb243b07a
Binary files /dev/null and b/sounds/voice/legacy/demopain4.ogg differ
diff --git a/sounds/voice/legacy/demopain5.ogg b/sounds/voice/legacy/demopain5.ogg
new file mode 100644
index 000000000..2173828ae
Binary files /dev/null and b/sounds/voice/legacy/demopain5.ogg differ
diff --git a/sounds/voice/legacy/demopain6.ogg b/sounds/voice/legacy/demopain6.ogg
new file mode 100644
index 000000000..554703a52
Binary files /dev/null and b/sounds/voice/legacy/demopain6.ogg differ
diff --git a/sounds/voice/default/demofightstart1.ogg b/sounds/voice/legacy/va/demofightstart1.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart1.ogg
rename to sounds/voice/legacy/va/demofightstart1.ogg
diff --git a/sounds/voice/default/demofightstart10.ogg b/sounds/voice/legacy/va/demofightstart10.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart10.ogg
rename to sounds/voice/legacy/va/demofightstart10.ogg
diff --git a/sounds/voice/default/demofightstart11.ogg b/sounds/voice/legacy/va/demofightstart11.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart11.ogg
rename to sounds/voice/legacy/va/demofightstart11.ogg
diff --git a/sounds/voice/default/demofightstart12.ogg b/sounds/voice/legacy/va/demofightstart12.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart12.ogg
rename to sounds/voice/legacy/va/demofightstart12.ogg
diff --git a/sounds/voice/default/demofightstart13.ogg b/sounds/voice/legacy/va/demofightstart13.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart13.ogg
rename to sounds/voice/legacy/va/demofightstart13.ogg
diff --git a/sounds/voice/default/demofightstart14.ogg b/sounds/voice/legacy/va/demofightstart14.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart14.ogg
rename to sounds/voice/legacy/va/demofightstart14.ogg
diff --git a/sounds/voice/default/demofightstart15.ogg b/sounds/voice/legacy/va/demofightstart15.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart15.ogg
rename to sounds/voice/legacy/va/demofightstart15.ogg
diff --git a/sounds/voice/default/demofightstart16.ogg b/sounds/voice/legacy/va/demofightstart16.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart16.ogg
rename to sounds/voice/legacy/va/demofightstart16.ogg
diff --git a/sounds/voice/default/demofightstart17.ogg b/sounds/voice/legacy/va/demofightstart17.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart17.ogg
rename to sounds/voice/legacy/va/demofightstart17.ogg
diff --git a/sounds/voice/default/demofightstart18.ogg b/sounds/voice/legacy/va/demofightstart18.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart18.ogg
rename to sounds/voice/legacy/va/demofightstart18.ogg
diff --git a/sounds/voice/default/demofightstart19.ogg b/sounds/voice/legacy/va/demofightstart19.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart19.ogg
rename to sounds/voice/legacy/va/demofightstart19.ogg
diff --git a/sounds/voice/default/demofightstart2.ogg b/sounds/voice/legacy/va/demofightstart2.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart2.ogg
rename to sounds/voice/legacy/va/demofightstart2.ogg
diff --git a/sounds/voice/default/demofightstart20.ogg b/sounds/voice/legacy/va/demofightstart20.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart20.ogg
rename to sounds/voice/legacy/va/demofightstart20.ogg
diff --git a/sounds/voice/default/demofightstart21.ogg b/sounds/voice/legacy/va/demofightstart21.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart21.ogg
rename to sounds/voice/legacy/va/demofightstart21.ogg
diff --git a/sounds/voice/default/demofightstart3.ogg b/sounds/voice/legacy/va/demofightstart3.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart3.ogg
rename to sounds/voice/legacy/va/demofightstart3.ogg
diff --git a/sounds/voice/default/demofightstart4.ogg b/sounds/voice/legacy/va/demofightstart4.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart4.ogg
rename to sounds/voice/legacy/va/demofightstart4.ogg
diff --git a/sounds/voice/default/demofightstart5.ogg b/sounds/voice/legacy/va/demofightstart5.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart5.ogg
rename to sounds/voice/legacy/va/demofightstart5.ogg
diff --git a/sounds/voice/default/demofightstart6.ogg b/sounds/voice/legacy/va/demofightstart6.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart6.ogg
rename to sounds/voice/legacy/va/demofightstart6.ogg
diff --git a/sounds/voice/default/demofightstart7.ogg b/sounds/voice/legacy/va/demofightstart7.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart7.ogg
rename to sounds/voice/legacy/va/demofightstart7.ogg
diff --git a/sounds/voice/default/demofightstart8.ogg b/sounds/voice/legacy/va/demofightstart8.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart8.ogg
rename to sounds/voice/legacy/va/demofightstart8.ogg
diff --git a/sounds/voice/default/demofightstart9.ogg b/sounds/voice/legacy/va/demofightstart9.ogg
similarity index 100%
rename from sounds/voice/default/demofightstart9.ogg
rename to sounds/voice/legacy/va/demofightstart9.ogg
diff --git a/sounds/voice/default/demofindsecret1.ogg b/sounds/voice/legacy/va/demofindsecret1.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret1.ogg
rename to sounds/voice/legacy/va/demofindsecret1.ogg
diff --git a/sounds/voice/default/demofindsecret10.ogg b/sounds/voice/legacy/va/demofindsecret10.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret10.ogg
rename to sounds/voice/legacy/va/demofindsecret10.ogg
diff --git a/sounds/voice/default/demofindsecret11.ogg b/sounds/voice/legacy/va/demofindsecret11.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret11.ogg
rename to sounds/voice/legacy/va/demofindsecret11.ogg
diff --git a/sounds/voice/default/demofindsecret12.ogg b/sounds/voice/legacy/va/demofindsecret12.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret12.ogg
rename to sounds/voice/legacy/va/demofindsecret12.ogg
diff --git a/sounds/voice/default/demofindsecret13.ogg b/sounds/voice/legacy/va/demofindsecret13.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret13.ogg
rename to sounds/voice/legacy/va/demofindsecret13.ogg
diff --git a/sounds/voice/default/demofindsecret2.ogg b/sounds/voice/legacy/va/demofindsecret2.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret2.ogg
rename to sounds/voice/legacy/va/demofindsecret2.ogg
diff --git a/sounds/voice/default/demofindsecret3.ogg b/sounds/voice/legacy/va/demofindsecret3.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret3.ogg
rename to sounds/voice/legacy/va/demofindsecret3.ogg
diff --git a/sounds/voice/default/demofindsecret4.ogg b/sounds/voice/legacy/va/demofindsecret4.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret4.ogg
rename to sounds/voice/legacy/va/demofindsecret4.ogg
diff --git a/sounds/voice/default/demofindsecret5.ogg b/sounds/voice/legacy/va/demofindsecret5.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret5.ogg
rename to sounds/voice/legacy/va/demofindsecret5.ogg
diff --git a/sounds/voice/default/demofindsecret6.ogg b/sounds/voice/legacy/va/demofindsecret6.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret6.ogg
rename to sounds/voice/legacy/va/demofindsecret6.ogg
diff --git a/sounds/voice/default/demofindsecret7.ogg b/sounds/voice/legacy/va/demofindsecret7.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret7.ogg
rename to sounds/voice/legacy/va/demofindsecret7.ogg
diff --git a/sounds/voice/default/demofindsecret8.ogg b/sounds/voice/legacy/va/demofindsecret8.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret8.ogg
rename to sounds/voice/legacy/va/demofindsecret8.ogg
diff --git a/sounds/voice/default/demofindsecret9.ogg b/sounds/voice/legacy/va/demofindsecret9.ogg
similarity index 100%
rename from sounds/voice/default/demofindsecret9.ogg
rename to sounds/voice/legacy/va/demofindsecret9.ogg
diff --git a/sounds/voice/default/demofriendhit1.ogg b/sounds/voice/legacy/va/demofriendhit1.ogg
similarity index 100%
rename from sounds/voice/default/demofriendhit1.ogg
rename to sounds/voice/legacy/va/demofriendhit1.ogg
diff --git a/sounds/voice/default/demofriendhit2.ogg b/sounds/voice/legacy/va/demofriendhit2.ogg
similarity index 100%
rename from sounds/voice/default/demofriendhit2.ogg
rename to sounds/voice/legacy/va/demofriendhit2.ogg
diff --git a/sounds/voice/default/demofriendhit3.ogg b/sounds/voice/legacy/va/demofriendhit3.ogg
similarity index 100%
rename from sounds/voice/default/demofriendhit3.ogg
rename to sounds/voice/legacy/va/demofriendhit3.ogg
diff --git a/sounds/voice/default/demofriendhit4.ogg b/sounds/voice/legacy/va/demofriendhit4.ogg
similarity index 100%
rename from sounds/voice/default/demofriendhit4.ogg
rename to sounds/voice/legacy/va/demofriendhit4.ogg
diff --git a/sounds/voice/default/demofriendhit5.ogg b/sounds/voice/legacy/va/demofriendhit5.ogg
similarity index 100%
rename from sounds/voice/default/demofriendhit5.ogg
rename to sounds/voice/legacy/va/demofriendhit5.ogg
diff --git a/sounds/voice/default/demofriendhit6.ogg b/sounds/voice/legacy/va/demofriendhit6.ogg
similarity index 100%
rename from sounds/voice/default/demofriendhit6.ogg
rename to sounds/voice/legacy/va/demofriendhit6.ogg
diff --git a/sounds/voice/default/demofriendhit7.ogg b/sounds/voice/legacy/va/demofriendhit7.ogg
similarity index 100%
rename from sounds/voice/default/demofriendhit7.ogg
rename to sounds/voice/legacy/va/demofriendhit7.ogg
diff --git a/sounds/voice/default/demofriendkill1.ogg b/sounds/voice/legacy/va/demofriendkill1.ogg
similarity index 100%
rename from sounds/voice/default/demofriendkill1.ogg
rename to sounds/voice/legacy/va/demofriendkill1.ogg
diff --git a/sounds/voice/default/demofriendkill2.ogg b/sounds/voice/legacy/va/demofriendkill2.ogg
similarity index 100%
rename from sounds/voice/default/demofriendkill2.ogg
rename to sounds/voice/legacy/va/demofriendkill2.ogg
diff --git a/sounds/voice/default/demofriendkill3.ogg b/sounds/voice/legacy/va/demofriendkill3.ogg
similarity index 100%
rename from sounds/voice/default/demofriendkill3.ogg
rename to sounds/voice/legacy/va/demofriendkill3.ogg
diff --git a/sounds/voice/default/demofriendkill4.ogg b/sounds/voice/legacy/va/demofriendkill4.ogg
similarity index 100%
rename from sounds/voice/default/demofriendkill4.ogg
rename to sounds/voice/legacy/va/demofriendkill4.ogg
diff --git a/sounds/voice/default/demogethit1.ogg b/sounds/voice/legacy/va/demogethit1.ogg
similarity index 100%
rename from sounds/voice/default/demogethit1.ogg
rename to sounds/voice/legacy/va/demogethit1.ogg
diff --git a/sounds/voice/default/demogethit10.ogg b/sounds/voice/legacy/va/demogethit10.ogg
similarity index 100%
rename from sounds/voice/default/demogethit10.ogg
rename to sounds/voice/legacy/va/demogethit10.ogg
diff --git a/sounds/voice/default/demogethit11.ogg b/sounds/voice/legacy/va/demogethit11.ogg
similarity index 100%
rename from sounds/voice/default/demogethit11.ogg
rename to sounds/voice/legacy/va/demogethit11.ogg
diff --git a/sounds/voice/default/demogethit12.ogg b/sounds/voice/legacy/va/demogethit12.ogg
similarity index 100%
rename from sounds/voice/default/demogethit12.ogg
rename to sounds/voice/legacy/va/demogethit12.ogg
diff --git a/sounds/voice/default/demogethit13.ogg b/sounds/voice/legacy/va/demogethit13.ogg
similarity index 100%
rename from sounds/voice/default/demogethit13.ogg
rename to sounds/voice/legacy/va/demogethit13.ogg
diff --git a/sounds/voice/default/demogethit14.ogg b/sounds/voice/legacy/va/demogethit14.ogg
similarity index 100%
rename from sounds/voice/default/demogethit14.ogg
rename to sounds/voice/legacy/va/demogethit14.ogg
diff --git a/sounds/voice/default/demogethit15.ogg b/sounds/voice/legacy/va/demogethit15.ogg
similarity index 100%
rename from sounds/voice/default/demogethit15.ogg
rename to sounds/voice/legacy/va/demogethit15.ogg
diff --git a/sounds/voice/default/demogethit16.ogg b/sounds/voice/legacy/va/demogethit16.ogg
similarity index 100%
rename from sounds/voice/default/demogethit16.ogg
rename to sounds/voice/legacy/va/demogethit16.ogg
diff --git a/sounds/voice/default/demogethit17.ogg b/sounds/voice/legacy/va/demogethit17.ogg
similarity index 100%
rename from sounds/voice/default/demogethit17.ogg
rename to sounds/voice/legacy/va/demogethit17.ogg
diff --git a/sounds/voice/default/demogethit18.ogg b/sounds/voice/legacy/va/demogethit18.ogg
similarity index 100%
rename from sounds/voice/default/demogethit18.ogg
rename to sounds/voice/legacy/va/demogethit18.ogg
diff --git a/sounds/voice/default/demogethit19.ogg b/sounds/voice/legacy/va/demogethit19.ogg
similarity index 100%
rename from sounds/voice/default/demogethit19.ogg
rename to sounds/voice/legacy/va/demogethit19.ogg
diff --git a/sounds/voice/default/demogethit2.ogg b/sounds/voice/legacy/va/demogethit2.ogg
similarity index 100%
rename from sounds/voice/default/demogethit2.ogg
rename to sounds/voice/legacy/va/demogethit2.ogg
diff --git a/sounds/voice/default/demogethit3.ogg b/sounds/voice/legacy/va/demogethit3.ogg
similarity index 100%
rename from sounds/voice/default/demogethit3.ogg
rename to sounds/voice/legacy/va/demogethit3.ogg
diff --git a/sounds/voice/default/demogethit4.ogg b/sounds/voice/legacy/va/demogethit4.ogg
similarity index 100%
rename from sounds/voice/default/demogethit4.ogg
rename to sounds/voice/legacy/va/demogethit4.ogg
diff --git a/sounds/voice/default/demogethit5.ogg b/sounds/voice/legacy/va/demogethit5.ogg
similarity index 100%
rename from sounds/voice/default/demogethit5.ogg
rename to sounds/voice/legacy/va/demogethit5.ogg
diff --git a/sounds/voice/default/demogethit6.ogg b/sounds/voice/legacy/va/demogethit6.ogg
similarity index 100%
rename from sounds/voice/default/demogethit6.ogg
rename to sounds/voice/legacy/va/demogethit6.ogg
diff --git a/sounds/voice/default/demogethit7.ogg b/sounds/voice/legacy/va/demogethit7.ogg
similarity index 100%
rename from sounds/voice/default/demogethit7.ogg
rename to sounds/voice/legacy/va/demogethit7.ogg
diff --git a/sounds/voice/default/demogethit8.ogg b/sounds/voice/legacy/va/demogethit8.ogg
similarity index 100%
rename from sounds/voice/default/demogethit8.ogg
rename to sounds/voice/legacy/va/demogethit8.ogg
diff --git a/sounds/voice/default/demogethit9.ogg b/sounds/voice/legacy/va/demogethit9.ogg
similarity index 100%
rename from sounds/voice/default/demogethit9.ogg
rename to sounds/voice/legacy/va/demogethit9.ogg
diff --git a/sounds/voice/default/demogetweapon1.ogg b/sounds/voice/legacy/va/demogetweapon1.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon1.ogg
rename to sounds/voice/legacy/va/demogetweapon1.ogg
diff --git a/sounds/voice/default/demogetweapon10.ogg b/sounds/voice/legacy/va/demogetweapon10.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon10.ogg
rename to sounds/voice/legacy/va/demogetweapon10.ogg
diff --git a/sounds/voice/default/demogetweapon11.ogg b/sounds/voice/legacy/va/demogetweapon11.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon11.ogg
rename to sounds/voice/legacy/va/demogetweapon11.ogg
diff --git a/sounds/voice/default/demogetweapon12.ogg b/sounds/voice/legacy/va/demogetweapon12.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon12.ogg
rename to sounds/voice/legacy/va/demogetweapon12.ogg
diff --git a/sounds/voice/default/demogetweapon13.ogg b/sounds/voice/legacy/va/demogetweapon13.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon13.ogg
rename to sounds/voice/legacy/va/demogetweapon13.ogg
diff --git a/sounds/voice/default/demogetweapon2.ogg b/sounds/voice/legacy/va/demogetweapon2.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon2.ogg
rename to sounds/voice/legacy/va/demogetweapon2.ogg
diff --git a/sounds/voice/default/demogetweapon3.ogg b/sounds/voice/legacy/va/demogetweapon3.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon3.ogg
rename to sounds/voice/legacy/va/demogetweapon3.ogg
diff --git a/sounds/voice/default/demogetweapon4.ogg b/sounds/voice/legacy/va/demogetweapon4.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon4.ogg
rename to sounds/voice/legacy/va/demogetweapon4.ogg
diff --git a/sounds/voice/default/demogetweapon5.ogg b/sounds/voice/legacy/va/demogetweapon5.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon5.ogg
rename to sounds/voice/legacy/va/demogetweapon5.ogg
diff --git a/sounds/voice/default/demogetweapon6.ogg b/sounds/voice/legacy/va/demogetweapon6.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon6.ogg
rename to sounds/voice/legacy/va/demogetweapon6.ogg
diff --git a/sounds/voice/default/demogetweapon7.ogg b/sounds/voice/legacy/va/demogetweapon7.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon7.ogg
rename to sounds/voice/legacy/va/demogetweapon7.ogg
diff --git a/sounds/voice/default/demogetweapon8.ogg b/sounds/voice/legacy/va/demogetweapon8.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon8.ogg
rename to sounds/voice/legacy/va/demogetweapon8.ogg
diff --git a/sounds/voice/default/demogetweapon9.ogg b/sounds/voice/legacy/va/demogetweapon9.ogg
similarity index 100%
rename from sounds/voice/default/demogetweapon9.ogg
rename to sounds/voice/legacy/va/demogetweapon9.ogg
diff --git a/sounds/voice/default/demogreet1.ogg b/sounds/voice/legacy/va/demogreet1.ogg
similarity index 100%
rename from sounds/voice/default/demogreet1.ogg
rename to sounds/voice/legacy/va/demogreet1.ogg
diff --git a/sounds/voice/default/demogreet2.ogg b/sounds/voice/legacy/va/demogreet2.ogg
similarity index 100%
rename from sounds/voice/default/demogreet2.ogg
rename to sounds/voice/legacy/va/demogreet2.ogg
diff --git a/sounds/voice/default/demogreet3.ogg b/sounds/voice/legacy/va/demogreet3.ogg
similarity index 100%
rename from sounds/voice/default/demogreet3.ogg
rename to sounds/voice/legacy/va/demogreet3.ogg
diff --git a/sounds/voice/default/demogreet4.ogg b/sounds/voice/legacy/va/demogreet4.ogg
similarity index 100%
rename from sounds/voice/default/demogreet4.ogg
rename to sounds/voice/legacy/va/demogreet4.ogg
diff --git a/sounds/voice/default/demogreet5.ogg b/sounds/voice/legacy/va/demogreet5.ogg
similarity index 100%
rename from sounds/voice/default/demogreet5.ogg
rename to sounds/voice/legacy/va/demogreet5.ogg
diff --git a/sounds/voice/default/demogreet6.ogg b/sounds/voice/legacy/va/demogreet6.ogg
similarity index 100%
rename from sounds/voice/default/demogreet6.ogg
rename to sounds/voice/legacy/va/demogreet6.ogg
diff --git a/sounds/voice/default/demogreet7.ogg b/sounds/voice/legacy/va/demogreet7.ogg
similarity index 100%
rename from sounds/voice/default/demogreet7.ogg
rename to sounds/voice/legacy/va/demogreet7.ogg
diff --git a/sounds/voice/default/demohitfriend1.ogg b/sounds/voice/legacy/va/demohitfriend1.ogg
similarity index 100%
rename from sounds/voice/default/demohitfriend1.ogg
rename to sounds/voice/legacy/va/demohitfriend1.ogg
diff --git a/sounds/voice/default/demohitfriend2.ogg b/sounds/voice/legacy/va/demohitfriend2.ogg
similarity index 100%
rename from sounds/voice/default/demohitfriend2.ogg
rename to sounds/voice/legacy/va/demohitfriend2.ogg
diff --git a/sounds/voice/default/demohitfriend3.ogg b/sounds/voice/legacy/va/demohitfriend3.ogg
similarity index 100%
rename from sounds/voice/default/demohitfriend3.ogg
rename to sounds/voice/legacy/va/demohitfriend3.ogg
diff --git a/sounds/voice/default/demojammed1.ogg b/sounds/voice/legacy/va/demojammed1.ogg
similarity index 100%
rename from sounds/voice/default/demojammed1.ogg
rename to sounds/voice/legacy/va/demojammed1.ogg
diff --git a/sounds/voice/default/demojammed2.ogg b/sounds/voice/legacy/va/demojammed2.ogg
similarity index 100%
rename from sounds/voice/default/demojammed2.ogg
rename to sounds/voice/legacy/va/demojammed2.ogg
diff --git a/sounds/voice/default/demojammed3.ogg b/sounds/voice/legacy/va/demojammed3.ogg
similarity index 100%
rename from sounds/voice/default/demojammed3.ogg
rename to sounds/voice/legacy/va/demojammed3.ogg
diff --git a/sounds/voice/default/demojammed4.ogg b/sounds/voice/legacy/va/demojammed4.ogg
similarity index 100%
rename from sounds/voice/default/demojammed4.ogg
rename to sounds/voice/legacy/va/demojammed4.ogg
diff --git a/sounds/voice/default/demokoraxblood1.ogg b/sounds/voice/legacy/va/demokoraxblood1.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood1.ogg
rename to sounds/voice/legacy/va/demokoraxblood1.ogg
diff --git a/sounds/voice/default/demokoraxblood10.ogg b/sounds/voice/legacy/va/demokoraxblood10.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood10.ogg
rename to sounds/voice/legacy/va/demokoraxblood10.ogg
diff --git a/sounds/voice/default/demokoraxblood11.ogg b/sounds/voice/legacy/va/demokoraxblood11.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood11.ogg
rename to sounds/voice/legacy/va/demokoraxblood11.ogg
diff --git a/sounds/voice/default/demokoraxblood12.ogg b/sounds/voice/legacy/va/demokoraxblood12.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood12.ogg
rename to sounds/voice/legacy/va/demokoraxblood12.ogg
diff --git a/sounds/voice/default/demokoraxblood13.ogg b/sounds/voice/legacy/va/demokoraxblood13.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood13.ogg
rename to sounds/voice/legacy/va/demokoraxblood13.ogg
diff --git a/sounds/voice/default/demokoraxblood2.ogg b/sounds/voice/legacy/va/demokoraxblood2.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood2.ogg
rename to sounds/voice/legacy/va/demokoraxblood2.ogg
diff --git a/sounds/voice/default/demokoraxblood3.ogg b/sounds/voice/legacy/va/demokoraxblood3.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood3.ogg
rename to sounds/voice/legacy/va/demokoraxblood3.ogg
diff --git a/sounds/voice/default/demokoraxblood4.ogg b/sounds/voice/legacy/va/demokoraxblood4.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood4.ogg
rename to sounds/voice/legacy/va/demokoraxblood4.ogg
diff --git a/sounds/voice/default/demokoraxblood5.ogg b/sounds/voice/legacy/va/demokoraxblood5.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood5.ogg
rename to sounds/voice/legacy/va/demokoraxblood5.ogg
diff --git a/sounds/voice/default/demokoraxblood6.ogg b/sounds/voice/legacy/va/demokoraxblood6.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood6.ogg
rename to sounds/voice/legacy/va/demokoraxblood6.ogg
diff --git a/sounds/voice/default/demokoraxblood7.ogg b/sounds/voice/legacy/va/demokoraxblood7.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood7.ogg
rename to sounds/voice/legacy/va/demokoraxblood7.ogg
diff --git a/sounds/voice/default/demokoraxblood8.ogg b/sounds/voice/legacy/va/demokoraxblood8.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood8.ogg
rename to sounds/voice/legacy/va/demokoraxblood8.ogg
diff --git a/sounds/voice/default/demokoraxblood9.ogg b/sounds/voice/legacy/va/demokoraxblood9.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxblood9.ogg
rename to sounds/voice/legacy/va/demokoraxblood9.ogg
diff --git a/sounds/voice/default/demokoraxgame1.ogg b/sounds/voice/legacy/va/demokoraxgame1.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame1.ogg
rename to sounds/voice/legacy/va/demokoraxgame1.ogg
diff --git a/sounds/voice/default/demokoraxgame10.ogg b/sounds/voice/legacy/va/demokoraxgame10.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame10.ogg
rename to sounds/voice/legacy/va/demokoraxgame10.ogg
diff --git a/sounds/voice/default/demokoraxgame11.ogg b/sounds/voice/legacy/va/demokoraxgame11.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame11.ogg
rename to sounds/voice/legacy/va/demokoraxgame11.ogg
diff --git a/sounds/voice/default/demokoraxgame12.ogg b/sounds/voice/legacy/va/demokoraxgame12.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame12.ogg
rename to sounds/voice/legacy/va/demokoraxgame12.ogg
diff --git a/sounds/voice/default/demokoraxgame13.ogg b/sounds/voice/legacy/va/demokoraxgame13.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame13.ogg
rename to sounds/voice/legacy/va/demokoraxgame13.ogg
diff --git a/sounds/voice/default/demokoraxgame14.ogg b/sounds/voice/legacy/va/demokoraxgame14.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame14.ogg
rename to sounds/voice/legacy/va/demokoraxgame14.ogg
diff --git a/sounds/voice/default/demokoraxgame2.ogg b/sounds/voice/legacy/va/demokoraxgame2.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame2.ogg
rename to sounds/voice/legacy/va/demokoraxgame2.ogg
diff --git a/sounds/voice/default/demokoraxgame3.ogg b/sounds/voice/legacy/va/demokoraxgame3.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame3.ogg
rename to sounds/voice/legacy/va/demokoraxgame3.ogg
diff --git a/sounds/voice/default/demokoraxgame4.ogg b/sounds/voice/legacy/va/demokoraxgame4.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame4.ogg
rename to sounds/voice/legacy/va/demokoraxgame4.ogg
diff --git a/sounds/voice/default/demokoraxgame5.ogg b/sounds/voice/legacy/va/demokoraxgame5.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame5.ogg
rename to sounds/voice/legacy/va/demokoraxgame5.ogg
diff --git a/sounds/voice/default/demokoraxgame6.ogg b/sounds/voice/legacy/va/demokoraxgame6.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame6.ogg
rename to sounds/voice/legacy/va/demokoraxgame6.ogg
diff --git a/sounds/voice/default/demokoraxgame7.ogg b/sounds/voice/legacy/va/demokoraxgame7.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame7.ogg
rename to sounds/voice/legacy/va/demokoraxgame7.ogg
diff --git a/sounds/voice/default/demokoraxgame8.ogg b/sounds/voice/legacy/va/demokoraxgame8.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame8.ogg
rename to sounds/voice/legacy/va/demokoraxgame8.ogg
diff --git a/sounds/voice/default/demokoraxgame9.ogg b/sounds/voice/legacy/va/demokoraxgame9.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgame9.ogg
rename to sounds/voice/legacy/va/demokoraxgame9.ogg
diff --git a/sounds/voice/default/demokoraxgreet1.ogg b/sounds/voice/legacy/va/demokoraxgreet1.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet1.ogg
rename to sounds/voice/legacy/va/demokoraxgreet1.ogg
diff --git a/sounds/voice/default/demokoraxgreet10.ogg b/sounds/voice/legacy/va/demokoraxgreet10.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet10.ogg
rename to sounds/voice/legacy/va/demokoraxgreet10.ogg
diff --git a/sounds/voice/default/demokoraxgreet11.ogg b/sounds/voice/legacy/va/demokoraxgreet11.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet11.ogg
rename to sounds/voice/legacy/va/demokoraxgreet11.ogg
diff --git a/sounds/voice/default/demokoraxgreet12.ogg b/sounds/voice/legacy/va/demokoraxgreet12.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet12.ogg
rename to sounds/voice/legacy/va/demokoraxgreet12.ogg
diff --git a/sounds/voice/default/demokoraxgreet13.ogg b/sounds/voice/legacy/va/demokoraxgreet13.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet13.ogg
rename to sounds/voice/legacy/va/demokoraxgreet13.ogg
diff --git a/sounds/voice/default/demokoraxgreet2.ogg b/sounds/voice/legacy/va/demokoraxgreet2.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet2.ogg
rename to sounds/voice/legacy/va/demokoraxgreet2.ogg
diff --git a/sounds/voice/default/demokoraxgreet3.ogg b/sounds/voice/legacy/va/demokoraxgreet3.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet3.ogg
rename to sounds/voice/legacy/va/demokoraxgreet3.ogg
diff --git a/sounds/voice/default/demokoraxgreet4.ogg b/sounds/voice/legacy/va/demokoraxgreet4.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet4.ogg
rename to sounds/voice/legacy/va/demokoraxgreet4.ogg
diff --git a/sounds/voice/default/demokoraxgreet5.ogg b/sounds/voice/legacy/va/demokoraxgreet5.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet5.ogg
rename to sounds/voice/legacy/va/demokoraxgreet5.ogg
diff --git a/sounds/voice/default/demokoraxgreet6.ogg b/sounds/voice/legacy/va/demokoraxgreet6.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet6.ogg
rename to sounds/voice/legacy/va/demokoraxgreet6.ogg
diff --git a/sounds/voice/default/demokoraxgreet7.ogg b/sounds/voice/legacy/va/demokoraxgreet7.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet7.ogg
rename to sounds/voice/legacy/va/demokoraxgreet7.ogg
diff --git a/sounds/voice/default/demokoraxgreet8.ogg b/sounds/voice/legacy/va/demokoraxgreet8.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet8.ogg
rename to sounds/voice/legacy/va/demokoraxgreet8.ogg
diff --git a/sounds/voice/default/demokoraxgreet9.ogg b/sounds/voice/legacy/va/demokoraxgreet9.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxgreet9.ogg
rename to sounds/voice/legacy/va/demokoraxgreet9.ogg
diff --git a/sounds/voice/default/demokoraxmasters1.ogg b/sounds/voice/legacy/va/demokoraxmasters1.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxmasters1.ogg
rename to sounds/voice/legacy/va/demokoraxmasters1.ogg
diff --git a/sounds/voice/default/demokoraxmasters2.ogg b/sounds/voice/legacy/va/demokoraxmasters2.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxmasters2.ogg
rename to sounds/voice/legacy/va/demokoraxmasters2.ogg
diff --git a/sounds/voice/default/demokoraxmasters3.ogg b/sounds/voice/legacy/va/demokoraxmasters3.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxmasters3.ogg
rename to sounds/voice/legacy/va/demokoraxmasters3.ogg
diff --git a/sounds/voice/default/demokoraxmasters4.ogg b/sounds/voice/legacy/va/demokoraxmasters4.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxmasters4.ogg
rename to sounds/voice/legacy/va/demokoraxmasters4.ogg
diff --git a/sounds/voice/default/demokoraxmasters5.ogg b/sounds/voice/legacy/va/demokoraxmasters5.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxmasters5.ogg
rename to sounds/voice/legacy/va/demokoraxmasters5.ogg
diff --git a/sounds/voice/default/demokoraxmasters6.ogg b/sounds/voice/legacy/va/demokoraxmasters6.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxmasters6.ogg
rename to sounds/voice/legacy/va/demokoraxmasters6.ogg
diff --git a/sounds/voice/default/demokoraxmasters7.ogg b/sounds/voice/legacy/va/demokoraxmasters7.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxmasters7.ogg
rename to sounds/voice/legacy/va/demokoraxmasters7.ogg
diff --git a/sounds/voice/default/demokoraxmasters8.ogg b/sounds/voice/legacy/va/demokoraxmasters8.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxmasters8.ogg
rename to sounds/voice/legacy/va/demokoraxmasters8.ogg
diff --git a/sounds/voice/default/demokoraxmasters9.ogg b/sounds/voice/legacy/va/demokoraxmasters9.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxmasters9.ogg
rename to sounds/voice/legacy/va/demokoraxmasters9.ogg
diff --git a/sounds/voice/default/demokoraxworship1.ogg b/sounds/voice/legacy/va/demokoraxworship1.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxworship1.ogg
rename to sounds/voice/legacy/va/demokoraxworship1.ogg
diff --git a/sounds/voice/default/demokoraxworship10.ogg b/sounds/voice/legacy/va/demokoraxworship10.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxworship10.ogg
rename to sounds/voice/legacy/va/demokoraxworship10.ogg
diff --git a/sounds/voice/default/demokoraxworship11.ogg b/sounds/voice/legacy/va/demokoraxworship11.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxworship11.ogg
rename to sounds/voice/legacy/va/demokoraxworship11.ogg
diff --git a/sounds/voice/default/demokoraxworship2.ogg b/sounds/voice/legacy/va/demokoraxworship2.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxworship2.ogg
rename to sounds/voice/legacy/va/demokoraxworship2.ogg
diff --git a/sounds/voice/default/demokoraxworship3.ogg b/sounds/voice/legacy/va/demokoraxworship3.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxworship3.ogg
rename to sounds/voice/legacy/va/demokoraxworship3.ogg
diff --git a/sounds/voice/default/demokoraxworship4.ogg b/sounds/voice/legacy/va/demokoraxworship4.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxworship4.ogg
rename to sounds/voice/legacy/va/demokoraxworship4.ogg
diff --git a/sounds/voice/default/demokoraxworship5.ogg b/sounds/voice/legacy/va/demokoraxworship5.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxworship5.ogg
rename to sounds/voice/legacy/va/demokoraxworship5.ogg
diff --git a/sounds/voice/default/demokoraxworship6.ogg b/sounds/voice/legacy/va/demokoraxworship6.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxworship6.ogg
rename to sounds/voice/legacy/va/demokoraxworship6.ogg
diff --git a/sounds/voice/default/demokoraxworship7.ogg b/sounds/voice/legacy/va/demokoraxworship7.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxworship7.ogg
rename to sounds/voice/legacy/va/demokoraxworship7.ogg
diff --git a/sounds/voice/default/demokoraxworship8.ogg b/sounds/voice/legacy/va/demokoraxworship8.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxworship8.ogg
rename to sounds/voice/legacy/va/demokoraxworship8.ogg
diff --git a/sounds/voice/default/demokoraxworship9.ogg b/sounds/voice/legacy/va/demokoraxworship9.ogg
similarity index 100%
rename from sounds/voice/default/demokoraxworship9.ogg
rename to sounds/voice/legacy/va/demokoraxworship9.ogg
diff --git a/sounds/voice/default/demolocked1.ogg b/sounds/voice/legacy/va/demolocked1.ogg
similarity index 100%
rename from sounds/voice/default/demolocked1.ogg
rename to sounds/voice/legacy/va/demolocked1.ogg
diff --git a/sounds/voice/default/demolocked2.ogg b/sounds/voice/legacy/va/demolocked2.ogg
similarity index 100%
rename from sounds/voice/default/demolocked2.ogg
rename to sounds/voice/legacy/va/demolocked2.ogg
diff --git a/sounds/voice/default/demolocked3.ogg b/sounds/voice/legacy/va/demolocked3.ogg
similarity index 100%
rename from sounds/voice/default/demolocked3.ogg
rename to sounds/voice/legacy/va/demolocked3.ogg
diff --git a/sounds/voice/default/demolocked4.ogg b/sounds/voice/legacy/va/demolocked4.ogg
similarity index 100%
rename from sounds/voice/default/demolocked4.ogg
rename to sounds/voice/legacy/va/demolocked4.ogg
diff --git a/sounds/voice/default/demomapstart1.ogg b/sounds/voice/legacy/va/demomapstart1.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart1.ogg
rename to sounds/voice/legacy/va/demomapstart1.ogg
diff --git a/sounds/voice/default/demomapstart10.ogg b/sounds/voice/legacy/va/demomapstart10.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart10.ogg
rename to sounds/voice/legacy/va/demomapstart10.ogg
diff --git a/sounds/voice/default/demomapstart11.ogg b/sounds/voice/legacy/va/demomapstart11.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart11.ogg
rename to sounds/voice/legacy/va/demomapstart11.ogg
diff --git a/sounds/voice/default/demomapstart12.ogg b/sounds/voice/legacy/va/demomapstart12.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart12.ogg
rename to sounds/voice/legacy/va/demomapstart12.ogg
diff --git a/sounds/voice/default/demomapstart13.ogg b/sounds/voice/legacy/va/demomapstart13.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart13.ogg
rename to sounds/voice/legacy/va/demomapstart13.ogg
diff --git a/sounds/voice/default/demomapstart14.ogg b/sounds/voice/legacy/va/demomapstart14.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart14.ogg
rename to sounds/voice/legacy/va/demomapstart14.ogg
diff --git a/sounds/voice/default/demomapstart2.ogg b/sounds/voice/legacy/va/demomapstart2.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart2.ogg
rename to sounds/voice/legacy/va/demomapstart2.ogg
diff --git a/sounds/voice/default/demomapstart3.ogg b/sounds/voice/legacy/va/demomapstart3.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart3.ogg
rename to sounds/voice/legacy/va/demomapstart3.ogg
diff --git a/sounds/voice/default/demomapstart4.ogg b/sounds/voice/legacy/va/demomapstart4.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart4.ogg
rename to sounds/voice/legacy/va/demomapstart4.ogg
diff --git a/sounds/voice/default/demomapstart5.ogg b/sounds/voice/legacy/va/demomapstart5.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart5.ogg
rename to sounds/voice/legacy/va/demomapstart5.ogg
diff --git a/sounds/voice/default/demomapstart6.ogg b/sounds/voice/legacy/va/demomapstart6.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart6.ogg
rename to sounds/voice/legacy/va/demomapstart6.ogg
diff --git a/sounds/voice/default/demomapstart7.ogg b/sounds/voice/legacy/va/demomapstart7.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart7.ogg
rename to sounds/voice/legacy/va/demomapstart7.ogg
diff --git a/sounds/voice/default/demomapstart8.ogg b/sounds/voice/legacy/va/demomapstart8.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart8.ogg
rename to sounds/voice/legacy/va/demomapstart8.ogg
diff --git a/sounds/voice/default/demomapstart9.ogg b/sounds/voice/legacy/va/demomapstart9.ogg
similarity index 100%
rename from sounds/voice/default/demomapstart9.ogg
rename to sounds/voice/legacy/va/demomapstart9.ogg
diff --git a/sounds/voice/default/demopuzzfail1.ogg b/sounds/voice/legacy/va/demopuzzfail1.ogg
similarity index 100%
rename from sounds/voice/default/demopuzzfail1.ogg
rename to sounds/voice/legacy/va/demopuzzfail1.ogg
diff --git a/sounds/voice/default/demopuzzfail2.ogg b/sounds/voice/legacy/va/demopuzzfail2.ogg
similarity index 100%
rename from sounds/voice/default/demopuzzfail2.ogg
rename to sounds/voice/legacy/va/demopuzzfail2.ogg
diff --git a/sounds/voice/default/demopuzzfail3.ogg b/sounds/voice/legacy/va/demopuzzfail3.ogg
similarity index 100%
rename from sounds/voice/default/demopuzzfail3.ogg
rename to sounds/voice/legacy/va/demopuzzfail3.ogg
diff --git a/sounds/voice/default/demopuzzfail4.ogg b/sounds/voice/legacy/va/demopuzzfail4.ogg
similarity index 100%
rename from sounds/voice/default/demopuzzfail4.ogg
rename to sounds/voice/legacy/va/demopuzzfail4.ogg
diff --git a/sounds/voice/default/demopuzzfail5.ogg b/sounds/voice/legacy/va/demopuzzfail5.ogg
similarity index 100%
rename from sounds/voice/default/demopuzzfail5.ogg
rename to sounds/voice/legacy/va/demopuzzfail5.ogg
diff --git a/sounds/voice/default/demopuzzfail6.ogg b/sounds/voice/legacy/va/demopuzzfail6.ogg
similarity index 100%
rename from sounds/voice/default/demopuzzfail6.ogg
rename to sounds/voice/legacy/va/demopuzzfail6.ogg
diff --git a/sounds/voice/default/demopuzzsucc1.ogg b/sounds/voice/legacy/va/demopuzzsucc1.ogg
similarity index 100%
rename from sounds/voice/default/demopuzzsucc1.ogg
rename to sounds/voice/legacy/va/demopuzzsucc1.ogg
diff --git a/sounds/voice/default/demopuzzsucc2.ogg b/sounds/voice/legacy/va/demopuzzsucc2.ogg
similarity index 100%
rename from sounds/voice/default/demopuzzsucc2.ogg
rename to sounds/voice/legacy/va/demopuzzsucc2.ogg
diff --git a/sounds/voice/default/demopuzzsucc3.ogg b/sounds/voice/legacy/va/demopuzzsucc3.ogg
similarity index 100%
rename from sounds/voice/default/demopuzzsucc3.ogg
rename to sounds/voice/legacy/va/demopuzzsucc3.ogg
diff --git a/sounds/voice/default/demopuzzsucc4.ogg b/sounds/voice/legacy/va/demopuzzsucc4.ogg
similarity index 100%
rename from sounds/voice/default/demopuzzsucc4.ogg
rename to sounds/voice/legacy/va/demopuzzsucc4.ogg
diff --git a/sounds/voice/default/demopuzzsucc5.ogg b/sounds/voice/legacy/va/demopuzzsucc5.ogg
similarity index 100%
rename from sounds/voice/default/demopuzzsucc5.ogg
rename to sounds/voice/legacy/va/demopuzzsucc5.ogg
diff --git a/sounds/voice/default/demoragekit1.ogg b/sounds/voice/legacy/va/demoragekit1.ogg
similarity index 100%
rename from sounds/voice/default/demoragekit1.ogg
rename to sounds/voice/legacy/va/demoragekit1.ogg
diff --git a/sounds/voice/default/demoragekit2.ogg b/sounds/voice/legacy/va/demoragekit2.ogg
similarity index 100%
rename from sounds/voice/default/demoragekit2.ogg
rename to sounds/voice/legacy/va/demoragekit2.ogg
diff --git a/sounds/voice/default/demoragekit3.ogg b/sounds/voice/legacy/va/demoragekit3.ogg
similarity index 100%
rename from sounds/voice/default/demoragekit3.ogg
rename to sounds/voice/legacy/va/demoragekit3.ogg
diff --git a/sounds/voice/default/demoragekit4.ogg b/sounds/voice/legacy/va/demoragekit4.ogg
similarity index 100%
rename from sounds/voice/default/demoragekit4.ogg
rename to sounds/voice/legacy/va/demoragekit4.ogg
diff --git a/sounds/voice/default/demoragekit5.ogg b/sounds/voice/legacy/va/demoragekit5.ogg
similarity index 100%
rename from sounds/voice/default/demoragekit5.ogg
rename to sounds/voice/legacy/va/demoragekit5.ogg
diff --git a/sounds/voice/default/demoragekit6.ogg b/sounds/voice/legacy/va/demoragekit6.ogg
similarity index 100%
rename from sounds/voice/default/demoragekit6.ogg
rename to sounds/voice/legacy/va/demoragekit6.ogg
diff --git a/sounds/voice/default/demoscorekill1.ogg b/sounds/voice/legacy/va/demoscorekill1.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill1.ogg
rename to sounds/voice/legacy/va/demoscorekill1.ogg
diff --git a/sounds/voice/default/demoscorekill10.ogg b/sounds/voice/legacy/va/demoscorekill10.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill10.ogg
rename to sounds/voice/legacy/va/demoscorekill10.ogg
diff --git a/sounds/voice/default/demoscorekill11.ogg b/sounds/voice/legacy/va/demoscorekill11.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill11.ogg
rename to sounds/voice/legacy/va/demoscorekill11.ogg
diff --git a/sounds/voice/default/demoscorekill12.ogg b/sounds/voice/legacy/va/demoscorekill12.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill12.ogg
rename to sounds/voice/legacy/va/demoscorekill12.ogg
diff --git a/sounds/voice/default/demoscorekill13.ogg b/sounds/voice/legacy/va/demoscorekill13.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill13.ogg
rename to sounds/voice/legacy/va/demoscorekill13.ogg
diff --git a/sounds/voice/default/demoscorekill14.ogg b/sounds/voice/legacy/va/demoscorekill14.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill14.ogg
rename to sounds/voice/legacy/va/demoscorekill14.ogg
diff --git a/sounds/voice/default/demoscorekill15.ogg b/sounds/voice/legacy/va/demoscorekill15.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill15.ogg
rename to sounds/voice/legacy/va/demoscorekill15.ogg
diff --git a/sounds/voice/default/demoscorekill16.ogg b/sounds/voice/legacy/va/demoscorekill16.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill16.ogg
rename to sounds/voice/legacy/va/demoscorekill16.ogg
diff --git a/sounds/voice/default/demoscorekill17.ogg b/sounds/voice/legacy/va/demoscorekill17.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill17.ogg
rename to sounds/voice/legacy/va/demoscorekill17.ogg
diff --git a/sounds/voice/default/demoscorekill18.ogg b/sounds/voice/legacy/va/demoscorekill18.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill18.ogg
rename to sounds/voice/legacy/va/demoscorekill18.ogg
diff --git a/sounds/voice/default/demoscorekill19.ogg b/sounds/voice/legacy/va/demoscorekill19.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill19.ogg
rename to sounds/voice/legacy/va/demoscorekill19.ogg
diff --git a/sounds/voice/default/demoscorekill2.ogg b/sounds/voice/legacy/va/demoscorekill2.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill2.ogg
rename to sounds/voice/legacy/va/demoscorekill2.ogg
diff --git a/sounds/voice/default/demoscorekill20.ogg b/sounds/voice/legacy/va/demoscorekill20.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill20.ogg
rename to sounds/voice/legacy/va/demoscorekill20.ogg
diff --git a/sounds/voice/default/demoscorekill21.ogg b/sounds/voice/legacy/va/demoscorekill21.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill21.ogg
rename to sounds/voice/legacy/va/demoscorekill21.ogg
diff --git a/sounds/voice/default/demoscorekill22.ogg b/sounds/voice/legacy/va/demoscorekill22.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill22.ogg
rename to sounds/voice/legacy/va/demoscorekill22.ogg
diff --git a/sounds/voice/default/demoscorekill23.ogg b/sounds/voice/legacy/va/demoscorekill23.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill23.ogg
rename to sounds/voice/legacy/va/demoscorekill23.ogg
diff --git a/sounds/voice/default/demoscorekill24.ogg b/sounds/voice/legacy/va/demoscorekill24.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill24.ogg
rename to sounds/voice/legacy/va/demoscorekill24.ogg
diff --git a/sounds/voice/default/demoscorekill25.ogg b/sounds/voice/legacy/va/demoscorekill25.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill25.ogg
rename to sounds/voice/legacy/va/demoscorekill25.ogg
diff --git a/sounds/voice/default/demoscorekill26.ogg b/sounds/voice/legacy/va/demoscorekill26.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill26.ogg
rename to sounds/voice/legacy/va/demoscorekill26.ogg
diff --git a/sounds/voice/default/demoscorekill3.ogg b/sounds/voice/legacy/va/demoscorekill3.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill3.ogg
rename to sounds/voice/legacy/va/demoscorekill3.ogg
diff --git a/sounds/voice/default/demoscorekill4.ogg b/sounds/voice/legacy/va/demoscorekill4.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill4.ogg
rename to sounds/voice/legacy/va/demoscorekill4.ogg
diff --git a/sounds/voice/default/demoscorekill5.ogg b/sounds/voice/legacy/va/demoscorekill5.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill5.ogg
rename to sounds/voice/legacy/va/demoscorekill5.ogg
diff --git a/sounds/voice/default/demoscorekill6.ogg b/sounds/voice/legacy/va/demoscorekill6.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill6.ogg
rename to sounds/voice/legacy/va/demoscorekill6.ogg
diff --git a/sounds/voice/default/demoscorekill7.ogg b/sounds/voice/legacy/va/demoscorekill7.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill7.ogg
rename to sounds/voice/legacy/va/demoscorekill7.ogg
diff --git a/sounds/voice/default/demoscorekill8.ogg b/sounds/voice/legacy/va/demoscorekill8.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill8.ogg
rename to sounds/voice/legacy/va/demoscorekill8.ogg
diff --git a/sounds/voice/default/demoscorekill9.ogg b/sounds/voice/legacy/va/demoscorekill9.ogg
similarity index 100%
rename from sounds/voice/default/demoscorekill9.ogg
rename to sounds/voice/legacy/va/demoscorekill9.ogg
diff --git a/sprites/EIXTC0.png b/sprites/EIXTC0.png
new file mode 100644
index 000000000..cdfb2043a
Binary files /dev/null and b/sprites/EIXTC0.png differ
diff --git a/sprites/EIXTD0.png b/sprites/EIXTD0.png
new file mode 100644
index 000000000..3fdbdf109
Binary files /dev/null and b/sprites/EIXTD0.png differ
diff --git a/sprites/LGFDA0.png b/sprites/LGFDA0.png
new file mode 100644
index 000000000..a6f29931f
Binary files /dev/null and b/sprites/LGFDA0.png differ
diff --git a/sprites/SGIBA0.png b/sprites/MEATA0.png
similarity index 100%
rename from sprites/SGIBA0.png
rename to sprites/MEATA0.png
diff --git a/sprites/SGIBB0.png b/sprites/MEATB0.png
similarity index 100%
rename from sprites/SGIBB0.png
rename to sprites/MEATB0.png
diff --git a/sprites/SGIBC0.png b/sprites/MEATC0.png
similarity index 100%
rename from sprites/SGIBC0.png
rename to sprites/MEATC0.png
diff --git a/sprites/SGIBD0.png b/sprites/MEATD0.png
similarity index 100%
rename from sprites/SGIBD0.png
rename to sprites/MEATD0.png
diff --git a/sprites/SGIBE0.png b/sprites/MEATE0.png
similarity index 100%
rename from sprites/SGIBE0.png
rename to sprites/MEATE0.png
diff --git a/sprites/SGIBF0.png b/sprites/MEATF0.png
similarity index 100%
rename from sprites/SGIBF0.png
rename to sprites/MEATF0.png
diff --git a/sprites/SSPKA0.png b/sprites/SPKPA0.png
similarity index 100%
rename from sprites/SSPKA0.png
rename to sprites/SPKPA0.png
diff --git a/sprites/dlc1/BFXXA0.png b/sprites/dlc/BFXXA0.png
similarity index 100%
rename from sprites/dlc1/BFXXA0.png
rename to sprites/dlc/BFXXA0.png
diff --git a/sprites/dlc1/BFXXB0.png b/sprites/dlc/BFXXB0.png
similarity index 100%
rename from sprites/dlc1/BFXXB0.png
rename to sprites/dlc/BFXXB0.png
diff --git a/sprites/dlc1/BFXXC0.png b/sprites/dlc/BFXXC0.png
similarity index 100%
rename from sprites/dlc1/BFXXC0.png
rename to sprites/dlc/BFXXC0.png
diff --git a/sprites/dlc1/BFXXD0.png b/sprites/dlc/BFXXD0.png
similarity index 100%
rename from sprites/dlc1/BFXXD0.png
rename to sprites/dlc/BFXXD0.png
diff --git a/sprites/dlc1/BFXXE0.png b/sprites/dlc/BFXXE0.png
similarity index 100%
rename from sprites/dlc1/BFXXE0.png
rename to sprites/dlc/BFXXE0.png
diff --git a/sprites/dlc1/BFXXF0.png b/sprites/dlc/BFXXF0.png
similarity index 100%
rename from sprites/dlc1/BFXXF0.png
rename to sprites/dlc/BFXXF0.png
diff --git a/sprites/dlc1/BFXXG0.png b/sprites/dlc/BFXXG0.png
similarity index 100%
rename from sprites/dlc1/BFXXG0.png
rename to sprites/dlc/BFXXG0.png
diff --git a/sprites/dlc1/BFXXH0.png b/sprites/dlc/BFXXH0.png
similarity index 100%
rename from sprites/dlc1/BFXXH0.png
rename to sprites/dlc/BFXXH0.png
diff --git a/sprites/dlc1/BFXXI0.png b/sprites/dlc/BFXXI0.png
similarity index 100%
rename from sprites/dlc1/BFXXI0.png
rename to sprites/dlc/BFXXI0.png
diff --git a/sprites/dlc1/BFXXJ0.png b/sprites/dlc/BFXXJ0.png
similarity index 100%
rename from sprites/dlc1/BFXXJ0.png
rename to sprites/dlc/BFXXJ0.png
diff --git a/sprites/dlc1/BFXXK0.png b/sprites/dlc/BFXXK0.png
similarity index 100%
rename from sprites/dlc1/BFXXK0.png
rename to sprites/dlc/BFXXK0.png
diff --git a/sprites/dlc1/BFXXL0.png b/sprites/dlc/BFXXL0.png
similarity index 100%
rename from sprites/dlc1/BFXXL0.png
rename to sprites/dlc/BFXXL0.png
diff --git a/sprites/dlc1/BFXXM0.png b/sprites/dlc/BFXXM0.png
similarity index 100%
rename from sprites/dlc1/BFXXM0.png
rename to sprites/dlc/BFXXM0.png
diff --git a/sprites/dlc1/BFXXN0.png b/sprites/dlc/BFXXN0.png
similarity index 100%
rename from sprites/dlc1/BFXXN0.png
rename to sprites/dlc/BFXXN0.png
diff --git a/sprites/dlc1/BFXXO0.png b/sprites/dlc/BFXXO0.png
similarity index 100%
rename from sprites/dlc1/BFXXO0.png
rename to sprites/dlc/BFXXO0.png
diff --git a/sprites/dlc1/BFXXP0.png b/sprites/dlc/BFXXP0.png
similarity index 100%
rename from sprites/dlc1/BFXXP0.png
rename to sprites/dlc/BFXXP0.png
diff --git a/sprites/dlc1/BFXXQ0.png b/sprites/dlc/BFXXQ0.png
similarity index 100%
rename from sprites/dlc1/BFXXQ0.png
rename to sprites/dlc/BFXXQ0.png
diff --git a/sprites/dlc1/BFXXR0.png b/sprites/dlc/BFXXR0.png
similarity index 100%
rename from sprites/dlc1/BFXXR0.png
rename to sprites/dlc/BFXXR0.png
diff --git a/sprites/dlc1/BFXXS0.png b/sprites/dlc/BFXXS0.png
similarity index 100%
rename from sprites/dlc1/BFXXS0.png
rename to sprites/dlc/BFXXS0.png
diff --git a/sprites/dlc1/BFXXT0.png b/sprites/dlc/BFXXT0.png
similarity index 100%
rename from sprites/dlc1/BFXXT0.png
rename to sprites/dlc/BFXXT0.png
diff --git a/sprites/dlc2/NSFLA0.png b/sprites/dlc/NSFLA0.png
similarity index 100%
rename from sprites/dlc2/NSFLA0.png
rename to sprites/dlc/NSFLA0.png
diff --git a/sprites/dlc2/NSFLB0.png b/sprites/dlc/NSFLB0.png
similarity index 100%
rename from sprites/dlc2/NSFLB0.png
rename to sprites/dlc/NSFLB0.png
diff --git a/sprites/dlc2/NSFLC0.png b/sprites/dlc/NSFLC0.png
similarity index 100%
rename from sprites/dlc2/NSFLC0.png
rename to sprites/dlc/NSFLC0.png
diff --git a/sprites/dlc1/PBBLA0.png b/sprites/dlc/PBBLA0.png
similarity index 100%
rename from sprites/dlc1/PBBLA0.png
rename to sprites/dlc/PBBLA0.png
diff --git a/sprites/dlc1/PBBLB0.png b/sprites/dlc/PBBLB0.png
similarity index 100%
rename from sprites/dlc1/PBBLB0.png
rename to sprites/dlc/PBBLB0.png
diff --git a/sprites/dlc1/PBBLC0.png b/sprites/dlc/PBBLC0.png
similarity index 100%
rename from sprites/dlc1/PBBLC0.png
rename to sprites/dlc/PBBLC0.png
diff --git a/sprites/dlc1/PBBLD0.png b/sprites/dlc/PBBLD0.png
similarity index 100%
rename from sprites/dlc1/PBBLD0.png
rename to sprites/dlc/PBBLD0.png
diff --git a/sprites/dlc1/PBBLE0.png b/sprites/dlc/PBBLE0.png
similarity index 100%
rename from sprites/dlc1/PBBLE0.png
rename to sprites/dlc/PBBLE0.png
diff --git a/sprites/dlc1/PBBLF0.png b/sprites/dlc/PBBLF0.png
similarity index 100%
rename from sprites/dlc1/PBBLF0.png
rename to sprites/dlc/PBBLF0.png
diff --git a/sprites/dlc1/PBBLG0.png b/sprites/dlc/PBBLG0.png
similarity index 100%
rename from sprites/dlc1/PBBLG0.png
rename to sprites/dlc/PBBLG0.png
diff --git a/sprites/dlc1/PBBLH0.png b/sprites/dlc/PBBLH0.png
similarity index 100%
rename from sprites/dlc1/PBBLH0.png
rename to sprites/dlc/PBBLH0.png
diff --git a/sprites/dlc1/PBBLI0.png b/sprites/dlc/PBBLI0.png
similarity index 100%
rename from sprites/dlc1/PBBLI0.png
rename to sprites/dlc/PBBLI0.png
diff --git a/sprites/dlc1/PBBLJ0.png b/sprites/dlc/PBBLJ0.png
similarity index 100%
rename from sprites/dlc1/PBBLJ0.png
rename to sprites/dlc/PBBLJ0.png
diff --git a/sprites/dlc1/PBMBA0.png b/sprites/dlc/PBMBA0.png
similarity index 100%
rename from sprites/dlc1/PBMBA0.png
rename to sprites/dlc/PBMBA0.png
diff --git a/sprites/dlc1/PBMBB0.png b/sprites/dlc/PBMBB0.png
similarity index 100%
rename from sprites/dlc1/PBMBB0.png
rename to sprites/dlc/PBMBB0.png
diff --git a/sprites/dlc1/PBMBC0.png b/sprites/dlc/PBMBC0.png
similarity index 100%
rename from sprites/dlc1/PBMBC0.png
rename to sprites/dlc/PBMBC0.png
diff --git a/sprites/dlc1/PBMBD0.png b/sprites/dlc/PBMBD0.png
similarity index 100%
rename from sprites/dlc1/PBMBD0.png
rename to sprites/dlc/PBMBD0.png
diff --git a/sprites/dlc1/PBMBE0.png b/sprites/dlc/PBMBE0.png
similarity index 100%
rename from sprites/dlc1/PBMBE0.png
rename to sprites/dlc/PBMBE0.png
diff --git a/sprites/dlc1/PBMBF0.png b/sprites/dlc/PBMBF0.png
similarity index 100%
rename from sprites/dlc1/PBMBF0.png
rename to sprites/dlc/PBMBF0.png
diff --git a/sprites/dlc1/PBMBG0.png b/sprites/dlc/PBMBG0.png
similarity index 100%
rename from sprites/dlc1/PBMBG0.png
rename to sprites/dlc/PBMBG0.png
diff --git a/sprites/dlc1/PBMBH0.png b/sprites/dlc/PBMBH0.png
similarity index 100%
rename from sprites/dlc1/PBMBH0.png
rename to sprites/dlc/PBMBH0.png
diff --git a/sprites/dlc1/PBMBI0.png b/sprites/dlc/PBMBI0.png
similarity index 100%
rename from sprites/dlc1/PBMBI0.png
rename to sprites/dlc/PBMBI0.png
diff --git a/sprites/dlc1/PBMBJ0.png b/sprites/dlc/PBMBJ0.png
similarity index 100%
rename from sprites/dlc1/PBMBJ0.png
rename to sprites/dlc/PBMBJ0.png
diff --git a/sprites/dlc1/PBMBK0.png b/sprites/dlc/PBMBK0.png
similarity index 100%
rename from sprites/dlc1/PBMBK0.png
rename to sprites/dlc/PBMBK0.png
diff --git a/sprites/dlc1/PBMBL0.png b/sprites/dlc/PBMBL0.png
similarity index 100%
rename from sprites/dlc1/PBMBL0.png
rename to sprites/dlc/PBMBL0.png
diff --git a/sprites/dlc1/QEMBA0.png b/sprites/dlc/QEMBA0.png
similarity index 100%
rename from sprites/dlc1/QEMBA0.png
rename to sprites/dlc/QEMBA0.png
diff --git a/sprites/dlc1/QEMBB0.png b/sprites/dlc/QEMBB0.png
similarity index 100%
rename from sprites/dlc1/QEMBB0.png
rename to sprites/dlc/QEMBB0.png
diff --git a/sprites/dlc1/QEMBC0.png b/sprites/dlc/QEMBC0.png
similarity index 100%
rename from sprites/dlc1/QEMBC0.png
rename to sprites/dlc/QEMBC0.png
diff --git a/sprites/dlc1/QEMBD0.png b/sprites/dlc/QEMBD0.png
similarity index 100%
rename from sprites/dlc1/QEMBD0.png
rename to sprites/dlc/QEMBD0.png
diff --git a/sprites/dlc1/QEMBE0.png b/sprites/dlc/QEMBE0.png
similarity index 100%
rename from sprites/dlc1/QEMBE0.png
rename to sprites/dlc/QEMBE0.png
diff --git a/sprites/dlc1/QFBLA0.png b/sprites/dlc/QFBLA0.png
similarity index 100%
rename from sprites/dlc1/QFBLA0.png
rename to sprites/dlc/QFBLA0.png
diff --git a/sprites/dlc1/QFBLB0.png b/sprites/dlc/QFBLB0.png
similarity index 100%
rename from sprites/dlc1/QFBLB0.png
rename to sprites/dlc/QFBLB0.png
diff --git a/sprites/dlc1/QFBLC0.png b/sprites/dlc/QFBLC0.png
similarity index 100%
rename from sprites/dlc1/QFBLC0.png
rename to sprites/dlc/QFBLC0.png
diff --git a/sprites/dlc1/QFBLD0.png b/sprites/dlc/QFBLD0.png
similarity index 100%
rename from sprites/dlc1/QFBLD0.png
rename to sprites/dlc/QFBLD0.png
diff --git a/sprites/dlc1/QFBLE0.png b/sprites/dlc/QFBLE0.png
similarity index 100%
rename from sprites/dlc1/QFBLE0.png
rename to sprites/dlc/QFBLE0.png
diff --git a/sprites/dlc1/QFBLF0.png b/sprites/dlc/QFBLF0.png
similarity index 100%
rename from sprites/dlc1/QFBLF0.png
rename to sprites/dlc/QFBLF0.png
diff --git a/sprites/dlc1/QFBLG0.png b/sprites/dlc/QFBLG0.png
similarity index 100%
rename from sprites/dlc1/QFBLG0.png
rename to sprites/dlc/QFBLG0.png
diff --git a/sprites/dlc1/QFBLH0.png b/sprites/dlc/QFBLH0.png
similarity index 100%
rename from sprites/dlc1/QFBLH0.png
rename to sprites/dlc/QFBLH0.png
diff --git a/sprites/dlc1/QFBLI0.png b/sprites/dlc/QFBLI0.png
similarity index 100%
rename from sprites/dlc1/QFBLI0.png
rename to sprites/dlc/QFBLI0.png
diff --git a/sprites/dlc1/QFBLJ0.png b/sprites/dlc/QFBLJ0.png
similarity index 100%
rename from sprites/dlc1/QFBLJ0.png
rename to sprites/dlc/QFBLJ0.png
diff --git a/sprites/dlc1/QFLRA0.png b/sprites/dlc/QFLRA0.png
similarity index 100%
rename from sprites/dlc1/QFLRA0.png
rename to sprites/dlc/QFLRA0.png
diff --git a/sprites/dlc1/RAYTA0.png b/sprites/dlc/RAYTA0.png
similarity index 100%
rename from sprites/dlc1/RAYTA0.png
rename to sprites/dlc/RAYTA0.png
diff --git a/sprites/dlc1/RAYTB0.png b/sprites/dlc/RAYTB0.png
similarity index 100%
rename from sprites/dlc1/RAYTB0.png
rename to sprites/dlc/RAYTB0.png
diff --git a/sprites/dlc1/RAYTC0.png b/sprites/dlc/RAYTC0.png
similarity index 100%
rename from sprites/dlc1/RAYTC0.png
rename to sprites/dlc/RAYTC0.png
diff --git a/sprites/dlc1/RAYTD0.png b/sprites/dlc/RAYTD0.png
similarity index 100%
rename from sprites/dlc1/RAYTD0.png
rename to sprites/dlc/RAYTD0.png
diff --git a/sprites/dlc1/RAYTE0.png b/sprites/dlc/RAYTE0.png
similarity index 100%
rename from sprites/dlc1/RAYTE0.png
rename to sprites/dlc/RAYTE0.png
diff --git a/sprites/dlc1/RAYTF0.png b/sprites/dlc/RAYTF0.png
similarity index 100%
rename from sprites/dlc1/RAYTF0.png
rename to sprites/dlc/RAYTF0.png
diff --git a/sprites/dlc1/RAYTG0.png b/sprites/dlc/RAYTG0.png
similarity index 100%
rename from sprites/dlc1/RAYTG0.png
rename to sprites/dlc/RAYTG0.png
diff --git a/sprites/dlc1/RAYTH0.png b/sprites/dlc/RAYTH0.png
similarity index 100%
rename from sprites/dlc1/RAYTH0.png
rename to sprites/dlc/RAYTH0.png
diff --git a/sprites/dlc1/RAYTI0.png b/sprites/dlc/RAYTI0.png
similarity index 100%
rename from sprites/dlc1/RAYTI0.png
rename to sprites/dlc/RAYTI0.png
diff --git a/sprites/dlc1/RAYTJ0.png b/sprites/dlc/RAYTJ0.png
similarity index 100%
rename from sprites/dlc1/RAYTJ0.png
rename to sprites/dlc/RAYTJ0.png
diff --git a/sprites/dlc1/RAYTK0.png b/sprites/dlc/RAYTK0.png
similarity index 100%
rename from sprites/dlc1/RAYTK0.png
rename to sprites/dlc/RAYTK0.png
diff --git a/sprites/dlc2/RFXPA0.png b/sprites/dlc/RFXPA0.png
similarity index 100%
rename from sprites/dlc2/RFXPA0.png
rename to sprites/dlc/RFXPA0.png
diff --git a/sprites/dlc2/RFXPB0.png b/sprites/dlc/RFXPB0.png
similarity index 100%
rename from sprites/dlc2/RFXPB0.png
rename to sprites/dlc/RFXPB0.png
diff --git a/sprites/dlc2/RFXPC0.png b/sprites/dlc/RFXPC0.png
similarity index 100%
rename from sprites/dlc2/RFXPC0.png
rename to sprites/dlc/RFXPC0.png
diff --git a/sprites/dlc2/RFXPD0.png b/sprites/dlc/RFXPD0.png
similarity index 100%
rename from sprites/dlc2/RFXPD0.png
rename to sprites/dlc/RFXPD0.png
diff --git a/sprites/dlc2/RFXPE0.png b/sprites/dlc/RFXPE0.png
similarity index 100%
rename from sprites/dlc2/RFXPE0.png
rename to sprites/dlc/RFXPE0.png
diff --git a/sprites/dlc2/RFXPF0.png b/sprites/dlc/RFXPF0.png
similarity index 100%
rename from sprites/dlc2/RFXPF0.png
rename to sprites/dlc/RFXPF0.png
diff --git a/sprites/dlc2/RFXPG0.png b/sprites/dlc/RFXPG0.png
similarity index 100%
rename from sprites/dlc2/RFXPG0.png
rename to sprites/dlc/RFXPG0.png
diff --git a/sprites/dlc2/RFXPH0.png b/sprites/dlc/RFXPH0.png
similarity index 100%
rename from sprites/dlc2/RFXPH0.png
rename to sprites/dlc/RFXPH0.png
diff --git a/sprites/dlc2/RFXPI0.png b/sprites/dlc/RFXPI0.png
similarity index 100%
rename from sprites/dlc2/RFXPI0.png
rename to sprites/dlc/RFXPI0.png
diff --git a/sprites/dlc2/RFXPJ0.png b/sprites/dlc/RFXPJ0.png
similarity index 100%
rename from sprites/dlc2/RFXPJ0.png
rename to sprites/dlc/RFXPJ0.png
diff --git a/sprites/dlc2/RFXPK0.png b/sprites/dlc/RFXPK0.png
similarity index 100%
rename from sprites/dlc2/RFXPK0.png
rename to sprites/dlc/RFXPK0.png
diff --git a/sprites/dlc2/RFXPL0.png b/sprites/dlc/RFXPL0.png
similarity index 100%
rename from sprites/dlc2/RFXPL0.png
rename to sprites/dlc/RFXPL0.png
diff --git a/sprites/dlc2/RFXPM0.png b/sprites/dlc/RFXPM0.png
similarity index 100%
rename from sprites/dlc2/RFXPM0.png
rename to sprites/dlc/RFXPM0.png
diff --git a/sprites/dlc2/RFXPN0.png b/sprites/dlc/RFXPN0.png
similarity index 100%
rename from sprites/dlc2/RFXPN0.png
rename to sprites/dlc/RFXPN0.png
diff --git a/sprites/dlc2/RFXPO0.png b/sprites/dlc/RFXPO0.png
similarity index 100%
rename from sprites/dlc2/RFXPO0.png
rename to sprites/dlc/RFXPO0.png
diff --git a/sprites/dlc2/RFXPP0.png b/sprites/dlc/RFXPP0.png
similarity index 100%
rename from sprites/dlc2/RFXPP0.png
rename to sprites/dlc/RFXPP0.png
diff --git a/sprites/dlc2/RFXPQ0.png b/sprites/dlc/RFXPQ0.png
similarity index 100%
rename from sprites/dlc2/RFXPQ0.png
rename to sprites/dlc/RFXPQ0.png
diff --git a/sprites/dlc2/RFXPR0.png b/sprites/dlc/RFXPR0.png
similarity index 100%
rename from sprites/dlc2/RFXPR0.png
rename to sprites/dlc/RFXPR0.png
diff --git a/sprites/dlc2/RFXPS0.png b/sprites/dlc/RFXPS0.png
similarity index 100%
rename from sprites/dlc2/RFXPS0.png
rename to sprites/dlc/RFXPS0.png
diff --git a/sprites/dlc2/RFXPT0.png b/sprites/dlc/RFXPT0.png
similarity index 100%
rename from sprites/dlc2/RFXPT0.png
rename to sprites/dlc/RFXPT0.png
diff --git a/sprites/dlc2/RFXPU0.png b/sprites/dlc/RFXPU0.png
similarity index 100%
rename from sprites/dlc2/RFXPU0.png
rename to sprites/dlc/RFXPU0.png
diff --git a/sprites/dlc2/RFXPV0.png b/sprites/dlc/RFXPV0.png
similarity index 100%
rename from sprites/dlc2/RFXPV0.png
rename to sprites/dlc/RFXPV0.png
diff --git a/sprites/dlc2/RFXPW0.png b/sprites/dlc/RFXPW0.png
similarity index 100%
rename from sprites/dlc2/RFXPW0.png
rename to sprites/dlc/RFXPW0.png
diff --git a/sprites/dlc2/RFXPX0.png b/sprites/dlc/RFXPX0.png
similarity index 100%
rename from sprites/dlc2/RFXPX0.png
rename to sprites/dlc/RFXPX0.png
diff --git a/sprites/dlc2/RFXPY0.png b/sprites/dlc/RFXPY0.png
similarity index 100%
rename from sprites/dlc2/RFXPY0.png
rename to sprites/dlc/RFXPY0.png
diff --git a/sprites/dlc2/RFXPZ0.png b/sprites/dlc/RFXPZ0.png
similarity index 100%
rename from sprites/dlc2/RFXPZ0.png
rename to sprites/dlc/RFXPZ0.png
diff --git a/sprites/dlc2/RFXP[0.png b/sprites/dlc/RFXP[0.png
similarity index 100%
rename from sprites/dlc2/RFXP[0.png
rename to sprites/dlc/RFXP[0.png
diff --git a/sprites/dlc2/RFXP^0.png b/sprites/dlc/RFXP^0.png
similarity index 100%
rename from sprites/dlc2/RFXP^0.png
rename to sprites/dlc/RFXP^0.png
diff --git a/sprites/dlc1/XEX5A0.png b/sprites/dlc/XEX5A0.png
similarity index 100%
rename from sprites/dlc1/XEX5A0.png
rename to sprites/dlc/XEX5A0.png
diff --git a/sprites/dlc1/XEX5B0.png b/sprites/dlc/XEX5B0.png
similarity index 100%
rename from sprites/dlc1/XEX5B0.png
rename to sprites/dlc/XEX5B0.png
diff --git a/sprites/dlc1/XEX5C0.png b/sprites/dlc/XEX5C0.png
similarity index 100%
rename from sprites/dlc1/XEX5C0.png
rename to sprites/dlc/XEX5C0.png
diff --git a/sprites/dlc1/XEX5D0.png b/sprites/dlc/XEX5D0.png
similarity index 100%
rename from sprites/dlc1/XEX5D0.png
rename to sprites/dlc/XEX5D0.png
diff --git a/sprites/dlc1/XEX5E0.png b/sprites/dlc/XEX5E0.png
similarity index 100%
rename from sprites/dlc1/XEX5E0.png
rename to sprites/dlc/XEX5E0.png
diff --git a/sprites/dlc1/XEX5F0.png b/sprites/dlc/XEX5F0.png
similarity index 100%
rename from sprites/dlc1/XEX5F0.png
rename to sprites/dlc/XEX5F0.png
diff --git a/sprites/dlc1/XEX5G0.png b/sprites/dlc/XEX5G0.png
similarity index 100%
rename from sprites/dlc1/XEX5G0.png
rename to sprites/dlc/XEX5G0.png
diff --git a/sprites/dlc1/XEX5H0.png b/sprites/dlc/XEX5H0.png
similarity index 100%
rename from sprites/dlc1/XEX5H0.png
rename to sprites/dlc/XEX5H0.png
diff --git a/sprites/dlc1/XEX5I0.png b/sprites/dlc/XEX5I0.png
similarity index 100%
rename from sprites/dlc1/XEX5I0.png
rename to sprites/dlc/XEX5I0.png
diff --git a/sprites/dlc1/XEX5J0.png b/sprites/dlc/XEX5J0.png
similarity index 100%
rename from sprites/dlc1/XEX5J0.png
rename to sprites/dlc/XEX5J0.png
diff --git a/sprites/dlc1/XEX5K0.png b/sprites/dlc/XEX5K0.png
similarity index 100%
rename from sprites/dlc1/XEX5K0.png
rename to sprites/dlc/XEX5K0.png
diff --git a/sprites/dlc1/XEX5L0.png b/sprites/dlc/XEX5L0.png
similarity index 100%
rename from sprites/dlc1/XEX5L0.png
rename to sprites/dlc/XEX5L0.png
diff --git a/sprites/dlc1/XEX5M0.png b/sprites/dlc/XEX5M0.png
similarity index 100%
rename from sprites/dlc1/XEX5M0.png
rename to sprites/dlc/XEX5M0.png
diff --git a/sprites/dlc1/XEX5N0.png b/sprites/dlc/XEX5N0.png
similarity index 100%
rename from sprites/dlc1/XEX5N0.png
rename to sprites/dlc/XEX5N0.png
diff --git a/sprites/dlc1/XEX5O0.png b/sprites/dlc/XEX5O0.png
similarity index 100%
rename from sprites/dlc1/XEX5O0.png
rename to sprites/dlc/XEX5O0.png
diff --git a/sprites/dlc1/XEX5P0.png b/sprites/dlc/XEX5P0.png
similarity index 100%
rename from sprites/dlc1/XEX5P0.png
rename to sprites/dlc/XEX5P0.png
diff --git a/sprites/dlc1/XEX5Q0.png b/sprites/dlc/XEX5Q0.png
similarity index 100%
rename from sprites/dlc1/XEX5Q0.png
rename to sprites/dlc/XEX5Q0.png
diff --git a/sprites/dlc1/XEX5R0.png b/sprites/dlc/XEX5R0.png
similarity index 100%
rename from sprites/dlc1/XEX5R0.png
rename to sprites/dlc/XEX5R0.png
diff --git a/sprites/dlc1/XEX5S0.png b/sprites/dlc/XEX5S0.png
similarity index 100%
rename from sprites/dlc1/XEX5S0.png
rename to sprites/dlc/XEX5S0.png
diff --git a/sprites/dlc1/XEX6A0.png b/sprites/dlc/XEX6A0.png
similarity index 100%
rename from sprites/dlc1/XEX6A0.png
rename to sprites/dlc/XEX6A0.png
diff --git a/sprites/dlc1/XEX6B0.png b/sprites/dlc/XEX6B0.png
similarity index 100%
rename from sprites/dlc1/XEX6B0.png
rename to sprites/dlc/XEX6B0.png
diff --git a/sprites/dlc1/XEX6C0.png b/sprites/dlc/XEX6C0.png
similarity index 100%
rename from sprites/dlc1/XEX6C0.png
rename to sprites/dlc/XEX6C0.png
diff --git a/sprites/dlc1/XEX6D0.png b/sprites/dlc/XEX6D0.png
similarity index 100%
rename from sprites/dlc1/XEX6D0.png
rename to sprites/dlc/XEX6D0.png
diff --git a/sprites/dlc1/XEX6E0.png b/sprites/dlc/XEX6E0.png
similarity index 100%
rename from sprites/dlc1/XEX6E0.png
rename to sprites/dlc/XEX6E0.png
diff --git a/sprites/dlc1/XEX6F0.png b/sprites/dlc/XEX6F0.png
similarity index 100%
rename from sprites/dlc1/XEX6F0.png
rename to sprites/dlc/XEX6F0.png
diff --git a/sprites/dlc1/XEX6G0.png b/sprites/dlc/XEX6G0.png
similarity index 100%
rename from sprites/dlc1/XEX6G0.png
rename to sprites/dlc/XEX6G0.png
diff --git a/sprites/dlc1/XEX6H0.png b/sprites/dlc/XEX6H0.png
similarity index 100%
rename from sprites/dlc1/XEX6H0.png
rename to sprites/dlc/XEX6H0.png
diff --git a/sprites/dlc1/XEX6I0.png b/sprites/dlc/XEX6I0.png
similarity index 100%
rename from sprites/dlc1/XEX6I0.png
rename to sprites/dlc/XEX6I0.png
diff --git a/sprites/dlc1/XEX6J0.png b/sprites/dlc/XEX6J0.png
similarity index 100%
rename from sprites/dlc1/XEX6J0.png
rename to sprites/dlc/XEX6J0.png
diff --git a/sprites/dlc1/XEX6K0.png b/sprites/dlc/XEX6K0.png
similarity index 100%
rename from sprites/dlc1/XEX6K0.png
rename to sprites/dlc/XEX6K0.png
diff --git a/sprites/dlc1/XEX6L0.png b/sprites/dlc/XEX6L0.png
similarity index 100%
rename from sprites/dlc1/XEX6L0.png
rename to sprites/dlc/XEX6L0.png
diff --git a/sprites/dlc1/XEX6M0.png b/sprites/dlc/XEX6M0.png
similarity index 100%
rename from sprites/dlc1/XEX6M0.png
rename to sprites/dlc/XEX6M0.png
diff --git a/sprites/dlc1/XEX6N0.png b/sprites/dlc/XEX6N0.png
similarity index 100%
rename from sprites/dlc1/XEX6N0.png
rename to sprites/dlc/XEX6N0.png
diff --git a/sprites/dlc1/XEX6O0.png b/sprites/dlc/XEX6O0.png
similarity index 100%
rename from sprites/dlc1/XEX6O0.png
rename to sprites/dlc/XEX6O0.png
diff --git a/sprites/dlc1/XEX6P0.png b/sprites/dlc/XEX6P0.png
similarity index 100%
rename from sprites/dlc1/XEX6P0.png
rename to sprites/dlc/XEX6P0.png
diff --git a/sprites/dlc1/XEX6Q0.png b/sprites/dlc/XEX6Q0.png
similarity index 100%
rename from sprites/dlc1/XEX6Q0.png
rename to sprites/dlc/XEX6Q0.png
diff --git a/sprites/dlc1/XEX6R0.png b/sprites/dlc/XEX6R0.png
similarity index 100%
rename from sprites/dlc1/XEX6R0.png
rename to sprites/dlc/XEX6R0.png
diff --git a/sprites/dlc1/XEX6S0.png b/sprites/dlc/XEX6S0.png
similarity index 100%
rename from sprites/dlc1/XEX6S0.png
rename to sprites/dlc/XEX6S0.png
diff --git a/sprites/dlc1/XRG6A0.png b/sprites/dlc/XRG6A0.png
similarity index 100%
rename from sprites/dlc1/XRG6A0.png
rename to sprites/dlc/XRG6A0.png
diff --git a/sprites/dlc1/XRG6B0.png b/sprites/dlc/XRG6B0.png
similarity index 100%
rename from sprites/dlc1/XRG6B0.png
rename to sprites/dlc/XRG6B0.png
diff --git a/sprites/dlc1/XRG6C0.png b/sprites/dlc/XRG6C0.png
similarity index 100%
rename from sprites/dlc1/XRG6C0.png
rename to sprites/dlc/XRG6C0.png
diff --git a/sprites/dlc1/XRG6D0.png b/sprites/dlc/XRG6D0.png
similarity index 100%
rename from sprites/dlc1/XRG6D0.png
rename to sprites/dlc/XRG6D0.png
diff --git a/sprites/dlc1/XRG6E0.png b/sprites/dlc/XRG6E0.png
similarity index 100%
rename from sprites/dlc1/XRG6E0.png
rename to sprites/dlc/XRG6E0.png
diff --git a/sprites/dlc1/XRG6F0.png b/sprites/dlc/XRG6F0.png
similarity index 100%
rename from sprites/dlc1/XRG6F0.png
rename to sprites/dlc/XRG6F0.png
diff --git a/sprites/dlc1/XRG6G0.png b/sprites/dlc/XRG6G0.png
similarity index 100%
rename from sprites/dlc1/XRG6G0.png
rename to sprites/dlc/XRG6G0.png
diff --git a/sprites/dlc1/XRG6H0.png b/sprites/dlc/XRG6H0.png
similarity index 100%
rename from sprites/dlc1/XRG6H0.png
rename to sprites/dlc/XRG6H0.png
diff --git a/sprites/dlc1/XRG6I0.png b/sprites/dlc/XRG6I0.png
similarity index 100%
rename from sprites/dlc1/XRG6I0.png
rename to sprites/dlc/XRG6I0.png
diff --git a/sprites/dlc1/XRG6J0.png b/sprites/dlc/XRG6J0.png
similarity index 100%
rename from sprites/dlc1/XRG6J0.png
rename to sprites/dlc/XRG6J0.png
diff --git a/sprites/dlc1/XRG6K0.png b/sprites/dlc/XRG6K0.png
similarity index 100%
rename from sprites/dlc1/XRG6K0.png
rename to sprites/dlc/XRG6K0.png
diff --git a/sprites/dlc1/XRG6L0.png b/sprites/dlc/XRG6L0.png
similarity index 100%
rename from sprites/dlc1/XRG6L0.png
rename to sprites/dlc/XRG6L0.png
diff --git a/sprites/dlc1/XRG6M0.png b/sprites/dlc/XRG6M0.png
similarity index 100%
rename from sprites/dlc1/XRG6M0.png
rename to sprites/dlc/XRG6M0.png
diff --git a/sprites/dlc1/XRG6N0.png b/sprites/dlc/XRG6N0.png
similarity index 100%
rename from sprites/dlc1/XRG6N0.png
rename to sprites/dlc/XRG6N0.png
diff --git a/sprites/dlc1/XRG6O0.png b/sprites/dlc/XRG6O0.png
similarity index 100%
rename from sprites/dlc1/XRG6O0.png
rename to sprites/dlc/XRG6O0.png
diff --git a/sprites/dlc1/XRG6P0.png b/sprites/dlc/XRG6P0.png
similarity index 100%
rename from sprites/dlc1/XRG6P0.png
rename to sprites/dlc/XRG6P0.png
diff --git a/sprites/dlc1/XRG6Q0.png b/sprites/dlc/XRG6Q0.png
similarity index 100%
rename from sprites/dlc1/XRG6Q0.png
rename to sprites/dlc/XRG6Q0.png
diff --git a/sprites/dlc1/XRG6R0.png b/sprites/dlc/XRG6R0.png
similarity index 100%
rename from sprites/dlc1/XRG6R0.png
rename to sprites/dlc/XRG6R0.png
diff --git a/sprites/dlc1/XRG6S0.png b/sprites/dlc/XRG6S0.png
similarity index 100%
rename from sprites/dlc1/XRG6S0.png
rename to sprites/dlc/XRG6S0.png
diff --git a/sprites/dlc1/XRG6T0.png b/sprites/dlc/XRG6T0.png
similarity index 100%
rename from sprites/dlc1/XRG6T0.png
rename to sprites/dlc/XRG6T0.png
diff --git a/sprites/dlc1/XRG6U0.png b/sprites/dlc/XRG6U0.png
similarity index 100%
rename from sprites/dlc1/XRG6U0.png
rename to sprites/dlc/XRG6U0.png
diff --git a/sprites/dlc1/XRG6V0.png b/sprites/dlc/XRG6V0.png
similarity index 100%
rename from sprites/dlc1/XRG6V0.png
rename to sprites/dlc/XRG6V0.png
diff --git a/sprites/dlc1/XRG6W0.png b/sprites/dlc/XRG6W0.png
similarity index 100%
rename from sprites/dlc1/XRG6W0.png
rename to sprites/dlc/XRG6W0.png
diff --git a/sprites/dlc1/XRG6X0.png b/sprites/dlc/XRG6X0.png
similarity index 100%
rename from sprites/dlc1/XRG6X0.png
rename to sprites/dlc/XRG6X0.png
diff --git a/sprites/dlc1/XRG7A0.png b/sprites/dlc/XRG7A0.png
similarity index 100%
rename from sprites/dlc1/XRG7A0.png
rename to sprites/dlc/XRG7A0.png
diff --git a/sprites/dlc1/XRG7B0.png b/sprites/dlc/XRG7B0.png
similarity index 100%
rename from sprites/dlc1/XRG7B0.png
rename to sprites/dlc/XRG7B0.png
diff --git a/sprites/dlc1/XRG7C0.png b/sprites/dlc/XRG7C0.png
similarity index 100%
rename from sprites/dlc1/XRG7C0.png
rename to sprites/dlc/XRG7C0.png
diff --git a/sprites/dlc1/XRG7D0.png b/sprites/dlc/XRG7D0.png
similarity index 100%
rename from sprites/dlc1/XRG7D0.png
rename to sprites/dlc/XRG7D0.png
diff --git a/sprites/dlc1/XRG7E0.png b/sprites/dlc/XRG7E0.png
similarity index 100%
rename from sprites/dlc1/XRG7E0.png
rename to sprites/dlc/XRG7E0.png
diff --git a/sprites/dlc1/XRG7F0.png b/sprites/dlc/XRG7F0.png
similarity index 100%
rename from sprites/dlc1/XRG7F0.png
rename to sprites/dlc/XRG7F0.png
diff --git a/sprites/dlc1/XRG7G0.png b/sprites/dlc/XRG7G0.png
similarity index 100%
rename from sprites/dlc1/XRG7G0.png
rename to sprites/dlc/XRG7G0.png
diff --git a/sprites/dlc1/XRG7H0.png b/sprites/dlc/XRG7H0.png
similarity index 100%
rename from sprites/dlc1/XRG7H0.png
rename to sprites/dlc/XRG7H0.png
diff --git a/sprites/dlc1/XRG7I0.png b/sprites/dlc/XRG7I0.png
similarity index 100%
rename from sprites/dlc1/XRG7I0.png
rename to sprites/dlc/XRG7I0.png
diff --git a/sprites/dlc1/XRG7J0.png b/sprites/dlc/XRG7J0.png
similarity index 100%
rename from sprites/dlc1/XRG7J0.png
rename to sprites/dlc/XRG7J0.png
diff --git a/sprites/dlc1/XRG7K0.png b/sprites/dlc/XRG7K0.png
similarity index 100%
rename from sprites/dlc1/XRG7K0.png
rename to sprites/dlc/XRG7K0.png
diff --git a/sprites/dlc1/XRG7L0.png b/sprites/dlc/XRG7L0.png
similarity index 100%
rename from sprites/dlc1/XRG7L0.png
rename to sprites/dlc/XRG7L0.png
diff --git a/sprites/dlc1/XRG7M0.png b/sprites/dlc/XRG7M0.png
similarity index 100%
rename from sprites/dlc1/XRG7M0.png
rename to sprites/dlc/XRG7M0.png
diff --git a/sprites/dlc1/XRG7N0.png b/sprites/dlc/XRG7N0.png
similarity index 100%
rename from sprites/dlc1/XRG7N0.png
rename to sprites/dlc/XRG7N0.png
diff --git a/sprites/dlc1/XRG7O0.png b/sprites/dlc/XRG7O0.png
similarity index 100%
rename from sprites/dlc1/XRG7O0.png
rename to sprites/dlc/XRG7O0.png
diff --git a/sprites/dlc1/XRG7P0.png b/sprites/dlc/XRG7P0.png
similarity index 100%
rename from sprites/dlc1/XRG7P0.png
rename to sprites/dlc/XRG7P0.png
diff --git a/sprites/dlc1/XRG7Q0.png b/sprites/dlc/XRG7Q0.png
similarity index 100%
rename from sprites/dlc1/XRG7Q0.png
rename to sprites/dlc/XRG7Q0.png
diff --git a/sprites/dlc1/XRG7R0.png b/sprites/dlc/XRG7R0.png
similarity index 100%
rename from sprites/dlc1/XRG7R0.png
rename to sprites/dlc/XRG7R0.png
diff --git a/sprites/dlc1/XRG7S0.png b/sprites/dlc/XRG7S0.png
similarity index 100%
rename from sprites/dlc1/XRG7S0.png
rename to sprites/dlc/XRG7S0.png
diff --git a/sprites/dlc1/XRG7T0.png b/sprites/dlc/XRG7T0.png
similarity index 100%
rename from sprites/dlc1/XRG7T0.png
rename to sprites/dlc/XRG7T0.png
diff --git a/sprites/dlc1/XRG7U0.png b/sprites/dlc/XRG7U0.png
similarity index 100%
rename from sprites/dlc1/XRG7U0.png
rename to sprites/dlc/XRG7U0.png
diff --git a/sprites/dlc1/XRG7V0.png b/sprites/dlc/XRG7V0.png
similarity index 100%
rename from sprites/dlc1/XRG7V0.png
rename to sprites/dlc/XRG7V0.png
diff --git a/sprites/dlc1/XRG7W0.png b/sprites/dlc/XRG7W0.png
similarity index 100%
rename from sprites/dlc1/XRG7W0.png
rename to sprites/dlc/XRG7W0.png
diff --git a/sprites/dlc1/XRG7X0.png b/sprites/dlc/XRG7X0.png
similarity index 100%
rename from sprites/dlc1/XRG7X0.png
rename to sprites/dlc/XRG7X0.png
diff --git a/sprites/dlc1/BFRGA0.png b/sprites/dlc1/BFRGA0.png
deleted file mode 100644
index abf639ed9..000000000
Binary files a/sprites/dlc1/BFRGA0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGB0.png b/sprites/dlc1/BFRGB0.png
deleted file mode 100644
index c90483827..000000000
Binary files a/sprites/dlc1/BFRGB0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGC0.png b/sprites/dlc1/BFRGC0.png
deleted file mode 100644
index af9249b5b..000000000
Binary files a/sprites/dlc1/BFRGC0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGD0.png b/sprites/dlc1/BFRGD0.png
deleted file mode 100644
index 64160f88a..000000000
Binary files a/sprites/dlc1/BFRGD0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGE0.png b/sprites/dlc1/BFRGE0.png
deleted file mode 100644
index 4c84df6ef..000000000
Binary files a/sprites/dlc1/BFRGE0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGF0.png b/sprites/dlc1/BFRGF0.png
deleted file mode 100644
index 684253c5d..000000000
Binary files a/sprites/dlc1/BFRGF0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGG0.png b/sprites/dlc1/BFRGG0.png
deleted file mode 100644
index f867ebc9c..000000000
Binary files a/sprites/dlc1/BFRGG0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGH0.png b/sprites/dlc1/BFRGH0.png
deleted file mode 100644
index 7633df691..000000000
Binary files a/sprites/dlc1/BFRGH0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGI0.png b/sprites/dlc1/BFRGI0.png
deleted file mode 100644
index e07408f0c..000000000
Binary files a/sprites/dlc1/BFRGI0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGJ0.png b/sprites/dlc1/BFRGJ0.png
deleted file mode 100644
index 420221716..000000000
Binary files a/sprites/dlc1/BFRGJ0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGK0.png b/sprites/dlc1/BFRGK0.png
deleted file mode 100644
index ad28212b0..000000000
Binary files a/sprites/dlc1/BFRGK0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGL0.png b/sprites/dlc1/BFRGL0.png
deleted file mode 100644
index ac5ef5d3f..000000000
Binary files a/sprites/dlc1/BFRGL0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGM0.png b/sprites/dlc1/BFRGM0.png
deleted file mode 100644
index 495cc8e37..000000000
Binary files a/sprites/dlc1/BFRGM0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGN0.png b/sprites/dlc1/BFRGN0.png
deleted file mode 100644
index 10224ade1..000000000
Binary files a/sprites/dlc1/BFRGN0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGO0.png b/sprites/dlc1/BFRGO0.png
deleted file mode 100644
index 96c27f7e2..000000000
Binary files a/sprites/dlc1/BFRGO0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGP0.png b/sprites/dlc1/BFRGP0.png
deleted file mode 100644
index 6881266a2..000000000
Binary files a/sprites/dlc1/BFRGP0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGQ0.png b/sprites/dlc1/BFRGQ0.png
deleted file mode 100644
index b6a9b9048..000000000
Binary files a/sprites/dlc1/BFRGQ0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGR0.png b/sprites/dlc1/BFRGR0.png
deleted file mode 100644
index f3034aad2..000000000
Binary files a/sprites/dlc1/BFRGR0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGS0.png b/sprites/dlc1/BFRGS0.png
deleted file mode 100644
index d25a2a670..000000000
Binary files a/sprites/dlc1/BFRGS0.png and /dev/null differ
diff --git a/sprites/dlc1/BFRGT0.png b/sprites/dlc1/BFRGT0.png
deleted file mode 100644
index facb08d93..000000000
Binary files a/sprites/dlc1/BFRGT0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMA0.png b/sprites/dlc1/BFSMA0.png
deleted file mode 100644
index 5283fd9ed..000000000
Binary files a/sprites/dlc1/BFSMA0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMB0.png b/sprites/dlc1/BFSMB0.png
deleted file mode 100644
index f6a9a51d5..000000000
Binary files a/sprites/dlc1/BFSMB0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMC0.png b/sprites/dlc1/BFSMC0.png
deleted file mode 100644
index 4d824a694..000000000
Binary files a/sprites/dlc1/BFSMC0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMD0.png b/sprites/dlc1/BFSMD0.png
deleted file mode 100644
index 837b9679e..000000000
Binary files a/sprites/dlc1/BFSMD0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSME0.png b/sprites/dlc1/BFSME0.png
deleted file mode 100644
index 2e065d1ca..000000000
Binary files a/sprites/dlc1/BFSME0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMF0.png b/sprites/dlc1/BFSMF0.png
deleted file mode 100644
index 643da6bca..000000000
Binary files a/sprites/dlc1/BFSMF0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMG0.png b/sprites/dlc1/BFSMG0.png
deleted file mode 100644
index bd81cf706..000000000
Binary files a/sprites/dlc1/BFSMG0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMH0.png b/sprites/dlc1/BFSMH0.png
deleted file mode 100644
index 0d1ed2e74..000000000
Binary files a/sprites/dlc1/BFSMH0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMI0.png b/sprites/dlc1/BFSMI0.png
deleted file mode 100644
index 6bb9c43fc..000000000
Binary files a/sprites/dlc1/BFSMI0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMJ0.png b/sprites/dlc1/BFSMJ0.png
deleted file mode 100644
index 06063af76..000000000
Binary files a/sprites/dlc1/BFSMJ0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMK0.png b/sprites/dlc1/BFSMK0.png
deleted file mode 100644
index c33a20ee2..000000000
Binary files a/sprites/dlc1/BFSMK0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSML0.png b/sprites/dlc1/BFSML0.png
deleted file mode 100644
index 33451d07c..000000000
Binary files a/sprites/dlc1/BFSML0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMM0.png b/sprites/dlc1/BFSMM0.png
deleted file mode 100644
index 13ed3d366..000000000
Binary files a/sprites/dlc1/BFSMM0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMN0.png b/sprites/dlc1/BFSMN0.png
deleted file mode 100644
index 31e81badc..000000000
Binary files a/sprites/dlc1/BFSMN0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMO0.png b/sprites/dlc1/BFSMO0.png
deleted file mode 100644
index 9a8b5d91b..000000000
Binary files a/sprites/dlc1/BFSMO0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMP0.png b/sprites/dlc1/BFSMP0.png
deleted file mode 100644
index 6be2e152c..000000000
Binary files a/sprites/dlc1/BFSMP0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMQ0.png b/sprites/dlc1/BFSMQ0.png
deleted file mode 100644
index d2fe207c3..000000000
Binary files a/sprites/dlc1/BFSMQ0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMR0.png b/sprites/dlc1/BFSMR0.png
deleted file mode 100644
index ba53fa355..000000000
Binary files a/sprites/dlc1/BFSMR0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMS0.png b/sprites/dlc1/BFSMS0.png
deleted file mode 100644
index 8e5597266..000000000
Binary files a/sprites/dlc1/BFSMS0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMT0.png b/sprites/dlc1/BFSMT0.png
deleted file mode 100644
index e4426a304..000000000
Binary files a/sprites/dlc1/BFSMT0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMU0.png b/sprites/dlc1/BFSMU0.png
deleted file mode 100644
index d2f259698..000000000
Binary files a/sprites/dlc1/BFSMU0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMV0.png b/sprites/dlc1/BFSMV0.png
deleted file mode 100644
index 9f7d106d2..000000000
Binary files a/sprites/dlc1/BFSMV0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMW0.png b/sprites/dlc1/BFSMW0.png
deleted file mode 100644
index 7baadfb71..000000000
Binary files a/sprites/dlc1/BFSMW0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMX0.png b/sprites/dlc1/BFSMX0.png
deleted file mode 100644
index def97bddd..000000000
Binary files a/sprites/dlc1/BFSMX0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMY0.png b/sprites/dlc1/BFSMY0.png
deleted file mode 100644
index 4e00dd239..000000000
Binary files a/sprites/dlc1/BFSMY0.png and /dev/null differ
diff --git a/sprites/dlc1/BFSMZ0.png b/sprites/dlc1/BFSMZ0.png
deleted file mode 100644
index 130120dfe..000000000
Binary files a/sprites/dlc1/BFSMZ0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLA0.png b/sprites/dlc1/BXPLA0.png
deleted file mode 100644
index 1c5c5c69f..000000000
Binary files a/sprites/dlc1/BXPLA0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLB0.png b/sprites/dlc1/BXPLB0.png
deleted file mode 100644
index d0bd66ae8..000000000
Binary files a/sprites/dlc1/BXPLB0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLC0.png b/sprites/dlc1/BXPLC0.png
deleted file mode 100644
index fa099a743..000000000
Binary files a/sprites/dlc1/BXPLC0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLD0.png b/sprites/dlc1/BXPLD0.png
deleted file mode 100644
index 4f5aa973b..000000000
Binary files a/sprites/dlc1/BXPLD0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLE0.png b/sprites/dlc1/BXPLE0.png
deleted file mode 100644
index c6f941378..000000000
Binary files a/sprites/dlc1/BXPLE0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLF0.png b/sprites/dlc1/BXPLF0.png
deleted file mode 100644
index 0cd553847..000000000
Binary files a/sprites/dlc1/BXPLF0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLG0.png b/sprites/dlc1/BXPLG0.png
deleted file mode 100644
index c24da1316..000000000
Binary files a/sprites/dlc1/BXPLG0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLH0.png b/sprites/dlc1/BXPLH0.png
deleted file mode 100644
index be3a08c2a..000000000
Binary files a/sprites/dlc1/BXPLH0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLI0.png b/sprites/dlc1/BXPLI0.png
deleted file mode 100644
index 28a2b4ca1..000000000
Binary files a/sprites/dlc1/BXPLI0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLJ0.png b/sprites/dlc1/BXPLJ0.png
deleted file mode 100644
index 5fdffae6b..000000000
Binary files a/sprites/dlc1/BXPLJ0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLK0.png b/sprites/dlc1/BXPLK0.png
deleted file mode 100644
index ead15921a..000000000
Binary files a/sprites/dlc1/BXPLK0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLL0.png b/sprites/dlc1/BXPLL0.png
deleted file mode 100644
index 0c3d4636f..000000000
Binary files a/sprites/dlc1/BXPLL0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLM0.png b/sprites/dlc1/BXPLM0.png
deleted file mode 100644
index 5fa8dde78..000000000
Binary files a/sprites/dlc1/BXPLM0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLN0.png b/sprites/dlc1/BXPLN0.png
deleted file mode 100644
index cca9562aa..000000000
Binary files a/sprites/dlc1/BXPLN0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLO0.png b/sprites/dlc1/BXPLO0.png
deleted file mode 100644
index 8fd14f70b..000000000
Binary files a/sprites/dlc1/BXPLO0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLP0.png b/sprites/dlc1/BXPLP0.png
deleted file mode 100644
index 5c5f44ca4..000000000
Binary files a/sprites/dlc1/BXPLP0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLQ0.png b/sprites/dlc1/BXPLQ0.png
deleted file mode 100644
index 773df61b7..000000000
Binary files a/sprites/dlc1/BXPLQ0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLR0.png b/sprites/dlc1/BXPLR0.png
deleted file mode 100644
index c9ccd9753..000000000
Binary files a/sprites/dlc1/BXPLR0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLS0.png b/sprites/dlc1/BXPLS0.png
deleted file mode 100644
index 12928f35e..000000000
Binary files a/sprites/dlc1/BXPLS0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLT0.png b/sprites/dlc1/BXPLT0.png
deleted file mode 100644
index 161e84743..000000000
Binary files a/sprites/dlc1/BXPLT0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLU0.png b/sprites/dlc1/BXPLU0.png
deleted file mode 100644
index 8e3d291cf..000000000
Binary files a/sprites/dlc1/BXPLU0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLV0.png b/sprites/dlc1/BXPLV0.png
deleted file mode 100644
index 9ee7c6adc..000000000
Binary files a/sprites/dlc1/BXPLV0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLW0.png b/sprites/dlc1/BXPLW0.png
deleted file mode 100644
index 560414766..000000000
Binary files a/sprites/dlc1/BXPLW0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLX0.png b/sprites/dlc1/BXPLX0.png
deleted file mode 100644
index b2f026e01..000000000
Binary files a/sprites/dlc1/BXPLX0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLY0.png b/sprites/dlc1/BXPLY0.png
deleted file mode 100644
index 0c82cfb81..000000000
Binary files a/sprites/dlc1/BXPLY0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPLZ0.png b/sprites/dlc1/BXPLZ0.png
deleted file mode 100644
index 7d954a889..000000000
Binary files a/sprites/dlc1/BXPLZ0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPL[0.png b/sprites/dlc1/BXPL[0.png
deleted file mode 100644
index 5b7f834c2..000000000
Binary files a/sprites/dlc1/BXPL[0.png and /dev/null differ
diff --git a/sprites/dlc1/BXPL^0.png b/sprites/dlc1/BXPL^0.png
deleted file mode 100644
index 0eb5dbb1b..000000000
Binary files a/sprites/dlc1/BXPL^0.png and /dev/null differ
diff --git a/swwmcomp.acs b/swwmcomp.acs
index 2e7e67242..98ee39a6f 100644
--- a/swwmcomp.acs
+++ b/swwmcomp.acs
@@ -97,3 +97,217 @@ SCRIPT "E1M8_KNOCKOUT" ( void )
Delay(100);
Exit_Normal(0);
}
+
+// DUMP 2 and 3 rewritten hub progress scripts
+// Because the way these use BigFont makes them unreadable otherwise
+
+SCRIPT "DUMP2_HUB" ( void )
+{
+ Delay(35);
+ ACS_Terminate(2,0);
+ int mapstodo;
+ switch( GameSkill() )
+ {
+ case 0:
+ mapstodo = 8;
+ break;
+ case 1:
+ mapstodo = 16;
+ break;
+ case 2:
+ mapstodo = 32;
+ break;
+ case 3:
+ mapstodo = 48;
+ break;
+ default:
+ mapstodo = 64;
+ break;
+ }
+ bool unlockedfinal = false;
+ while ( true )
+ {
+ int lvent = ScriptCall("BaseStatusBar","GetGlobalACSValue",59);
+ bool unlockfinal = false;
+ switch( GameSkill() )
+ {
+ case 0:
+ if ( lvent >= 8 ) unlockfinal = true;
+ break;
+ case 1:
+ if ( lvent >= 16 ) unlockfinal = true;
+ break;
+ case 2:
+ if ( lvent >= 32 ) unlockfinal = true;
+ break;
+ case 3:
+ if ( lvent >= 48 ) unlockfinal = true;
+ break;
+ default:
+ if ( lvent >= 64 ) unlockfinal = true;
+ break;
+ }
+ if ( unlockfinal && !unlockedfinal )
+ {
+ unlockedfinal = true;
+ Ceiling_LowerByValue(10,96,96);
+ }
+ SetFont("BigFont");
+ int progress = mapstodo-lvent;
+ SetHudSize(640,480,0);
+ if ( progress > 0 ) HudMessageBold(d:progress,s:" more maps to go...";HUDMSG_PLAIN,1,CR_GOLD,320.0,40.0,0);
+ else HudMessageBold(s:"The final room is open...";HUDMSG_PLAIN,1,CR_GOLD,320.0,40.0,0);
+ Delay(1);
+ }
+}
+
+SCRIPT "DUMP3_HUB" ( void )
+{
+ Delay(1);
+ ACS_Terminate(1,0);
+ int mapstodo;
+ switch( GameSkill() )
+ {
+ case 0:
+ mapstodo = 8;
+ break;
+ case 1:
+ mapstodo = 16;
+ break;
+ case 2:
+ mapstodo = 32;
+ break;
+ case 3:
+ mapstodo = 48;
+ break;
+ default:
+ mapstodo = 64;
+ break;
+ }
+ bool unlockedfinal = false;
+ while ( true )
+ {
+ int lvent = ScriptCall("BaseStatusBar","GetGlobalACSValue",59);
+ bool unlockfinal = false;
+ switch( GameSkill() )
+ {
+ case 0:
+ if ( lvent >= 8 ) unlockfinal = true;
+ break;
+ case 1:
+ if ( lvent >= 16 ) unlockfinal = true;
+ break;
+ case 2:
+ if ( lvent >= 32 ) unlockfinal = true;
+ break;
+ case 3:
+ if ( lvent >= 48 ) unlockfinal = true;
+ break;
+ default:
+ if ( lvent >= 64 ) unlockfinal = true;
+ break;
+ }
+ if ( unlockfinal && !unlockedfinal )
+ {
+ unlockedfinal = true;
+ Floor_LowerByValue(11,96,256);
+ }
+ SetFont("BigFont");
+ int progress = mapstodo-lvent;
+ SetHudSize(640,480,0);
+ if ( progress > 1 ) HudMessageBold(d:progress,s:" more maps to go...";HUDMSG_PLAIN,1,CR_GOLD,320.0,40.0,0);
+ else if ( progress > 0 ) HudMessageBold(d:progress,s:" more map to go...";HUDMSG_PLAIN,1,CR_GOLD,320.0,40.0,0);
+ else HudMessageBold(s:"The final room is open...";HUDMSG_PLAIN,1,CR_GOLD,320.0,40.0,0);
+ Delay(1);
+ }
+}
+
+// same here, just TOO BIG
+str DUMP3MapNames[74][2] =
+{
+ { "", "" }, // 0
+ { "Check-In", "undeadRyker" },
+ { "Pissboy", "Anonymous" },
+ { "Simplicity is Golden", "demo_the_man" },
+ { "Invitation to Destruction", "Gardevoir" },
+ { "SOLITARY", "CJacobs" },
+ { "Ruins & Lava", "VBob" },
+ { "Bloodsport Canyon", "Hoodoo456" },
+ { "Nuclear Control Facilities", "Titan314" },
+ { "Mountain Temple", "Project_ILE" },
+ { "Overflow", "SpudTheRubbish" }, // 10
+ { "'Venture into the Bouncy Castle", "Beed28" },
+ { "The Crater", "combatxtreme & Plutonic Overkill" },
+ { "The Fun Lab", "TerminusEst13" },
+ { "Durex Waste Disposal", "Minimum Payne" },
+ { "The Corporate Ladder", "Kinsie" },
+ { "Regressive Experience", "Dukka" },
+ { "Baby's First Map", "Bobman23" },
+ { "Research Facility", "deathgod5309" },
+ { "AMONG US", "HumansAmongUs" },
+ { "The Darkness Beyond", "KarolineDianne" }, // 20
+ { "Base Stimpack", "charcola" },
+ { "Crunk Refinery", "BobBarker" },
+ { "0-Pipe Gear", "Toooooasty" },
+ { "Escape from Argent Prison", "Lance Charleson" },
+ { "Live Fire Exorcise", "Sgt. Shivers" },
+ { "Attack First", "simpletonn" },
+ { "Hitler's Prison", "Luigi2600" },
+ { "Tomb of Hetickhamen", "Action Max" },
+ { "The Weed Number", "Abysswalker" },
+ { "This Is Serious Mum", "deathz0r" }, // 30
+ { "Not Another Tech Base", "ArchXeno" },
+ { "Hydraulic Plant", "SpiritOfDecay" },
+ { "Janus", "SoundOfDoomDoors" },
+ { "Gamma Station Entrance", "SMG_Marine" },
+ { "Realm of the Sempiternal Archvile", "Darsycho" },
+ { "Judgement Day", "Stale_meat" },
+ { "Complex Alive", "Roxas" },
+ { "DUMP TD", "Arctangent" },
+ { "Dumping Ground", "TotalInjury" },
+ { "Mercury Rain", "Jimmy" }, // 40
+ { "mapsterpiece", "idiotbitz" },
+ { "Tunnel Crates Rule!", "Stale_Meat" },
+ { "CLOVERHOUSE", "Icept" },
+ { "Generic UAC Outpost", "Anonymous" },
+ { "Felt", "FloatRand" },
+ { "Panic Room", "comet1338" },
+ { "Simple Chaos", "willykuo123" },
+ { "EVISCERATED", "NAG" },
+ { "The Mine to Hell", "InsanityBringer" },
+ { "Sandcastley Sandcastling Sandcastles", "PinchySkree" }, // 50
+ { "Dead", "Already Dead" },
+ { "Broken Shit", "ZachBrowder" },
+ { "Weapons Research Lab", "Vennobennu" },
+ { "Winter in Summer", "TehRealSalt" },
+ { "The UAC Ocean Base", "leodoom85" },
+ { "Hot Water Music", "Protester" },
+ { "Lambda Base", "floatRand" },
+ { "inferno odyssey", "Anonymous" },
+ { "Infested Installation", "Flipy" },
+ { "The Duality", "NeuralStunner" }, // 60
+ { "Municipal Well", "Flotilla" },
+ { "Dropoff", "CharlieTheGnarly" },
+ { "Dimensional Accelerator", "Untitled" },
+ { "Urban Hell", "ChrisR91" },
+ { "Electron", "floatRand" },
+ { "Caco-lover", "everennui" },
+ { "Brown Mesa", "Cheeki" },
+ { "Bloody Hell", "Wivicer" },
+ { "A Night at the Opera", "Temin_Dump" },
+ { "An Online Virtual Reality Used By Hackers", "Shadow Hog" }, // 70
+ { "BtFS", "Gageat" },
+ { "The Runaround", "LogicalFallacy" },
+ { "Attack From Within", "mumblemumble" }
+};
+
+SCRIPT "DUMP3_DISPLAY" ( int f1, int f2 )
+{
+ int fuck = (f1*10)+f2;
+ SetHudSize(640,480,0);
+ SetFont("BigFont");
+ HudMessage(s:DUMP3MapNames[fuck][0];HUDMSG_FADEINOUT,2,CR_WHITE,320.4,380.2,2.5,0.15,0.65);
+ SetHudSize(320,240,0);
+ SetFont("SmallFont");
+ HudMessage(s:DUMP3MapNames[fuck][1];HUDMSG_FADEINOUT,3,CR_GOLD,160.4,200.0,2.5,0.15,0.65);
+}
diff --git a/swwmvoicepack.txt b/swwmvoicepack.txt
index 83c9b04e7..e1d437f67 100644
--- a/swwmvoicepack.txt
+++ b/swwmvoicepack.txt
@@ -1,5 +1,5 @@
# (lines starting with this character are comments)
-# if you want to make custom voice packs for SWWM GZ, you need to provide a
+# if you want to make custom voice packs for the mod, you need to provide a
# file like this in the root of the zip/pk3/whatever, wads are not supported
# list the names of your voice types here and don't forget to define your voice
# lines using a similar format to the base game's:
@@ -13,3 +13,4 @@
# also don't forget to add a SWWM_VOICENAME_* language string for each voice
# type so they have a "human-readable" name in the options menu
default
+legacy
diff --git a/textures/chiptilb.png b/textures/chiptilb.png
new file mode 100644
index 000000000..8818fa811
Binary files /dev/null and b/textures/chiptilb.png differ
diff --git a/textures/chiptilc.png b/textures/chiptilc.png
new file mode 100644
index 000000000..36481a538
Binary files /dev/null and b/textures/chiptilc.png differ
diff --git a/textures/chiptilg.png b/textures/chiptilg.png
new file mode 100644
index 000000000..318154d31
Binary files /dev/null and b/textures/chiptilg.png differ
diff --git a/textures/chiptilm.png b/textures/chiptilm.png
new file mode 100644
index 000000000..6aa034629
Binary files /dev/null and b/textures/chiptilm.png differ
diff --git a/textures/chiptilr.png b/textures/chiptilr.png
new file mode 100644
index 000000000..c9cd12868
Binary files /dev/null and b/textures/chiptilr.png differ
diff --git a/textures/chiptilw.png b/textures/chiptilw.png
new file mode 100644
index 000000000..0be309464
Binary files /dev/null and b/textures/chiptilw.png differ
diff --git a/textures/chiptily.png b/textures/chiptily.png
new file mode 100644
index 000000000..d9e54359b
Binary files /dev/null and b/textures/chiptily.png differ
diff --git a/tools/.gitignore b/tools/.gitignore
index 1d7591001..fbc8514d7 100644
--- a/tools/.gitignore
+++ b/tools/.gitignore
@@ -1,4 +1,2 @@
-mkfontblock
-mkfontsingle
mkstartup
mklang
diff --git a/tools/build.sh b/tools/build.sh
index 8e8bcb424..fcea83ecc 100755
--- a/tools/build.sh
+++ b/tools/build.sh
@@ -1,5 +1,3 @@
#!/bin/sh
-gcc -std=c11 -march=native -Os -Wall -Wextra -Werror -pedantic $(pkg-config --libs --cflags freetype2 libpng) -o mkfontblock mkfontblock.c
-gcc -std=c11 -march=native -Os -Wall -Wextra -Werror -pedantic $(pkg-config --libs --cflags freetype2 libpng) -o mkfontsingle mkfontsingle.c
gcc -std=c11 -march=native -Os -Wall -Wextra -Werror -pedantic -o mkstartup mkstartup.c
gcc -std=c11 -march=native -Os -Wall -Wextra -Werror -pedantic -o mklang mklang.c
diff --git a/tools/mkfontblock.bugs b/tools/mkfontblock.bugs
deleted file mode 100644
index 1093d68e0..000000000
--- a/tools/mkfontblock.bugs
+++ /dev/null
@@ -1,10 +0,0 @@
-- Damn thing breaks HARD with non-bitmap fonts, something wonky af with the
- glyph offsets, will have to investigate further.
-- Obviously this doesn't work well with proportional fonts, those would need a
- different format where each glyph is a separate graphic with its own offsets
- and stuff.
-- Doesn't handle unicode blocks beyond the basic multilingual plane, might
- actually be an issue with freetype itself, or the fonts I use, though I CAN
- see that the glyphs are there if I use a character map program.
-- Vertical shift has to be specified manually for some fonts that have some
- sort of built-in offset, I have yet to figure a way to automate this.
diff --git a/tools/mkfontblock.c b/tools/mkfontblock.c
deleted file mode 100644
index 19f482eb1..000000000
--- a/tools/mkfontblock.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- mkfontblock.c : Make font pngs for gzdoom, in an ugly cheap way.
- This code is a mess but I keep it here so people know how much I had
- to suffer to get this done.
-
- Copyright (c) 2020-2021 Marisa Kirisame, UnSX Team
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-#include
-#include
-#include
-#include
-#include
-#include FT_FREETYPE_H
-
-int writepng( const char *filename, uint8_t *fdata, int w, int h, int p )
-{
- if ( !filename ) return 0;
- png_structp pngp;
- png_infop infp;
- FILE *pf;
- if ( !(pf = fopen(filename,"wb")) ) return 0;
- pngp = png_create_write_struct(PNG_LIBPNG_VER_STRING,0,0,0);
- if ( !pngp )
- {
- fclose(pf);
- return 0;
- }
- infp = png_create_info_struct(pngp);
- if ( !infp )
- {
- fclose(pf);
- png_destroy_write_struct(&pngp,0);
- return 0;
- }
- if ( setjmp(png_jmpbuf(pngp)) )
- {
- png_destroy_write_struct(&pngp,&infp);
- fclose(pf);
- return 0;
- }
- png_init_io(pngp,pf);
- png_set_IHDR(pngp,infp,w,h,8,PNG_COLOR_TYPE_GA,
- PNG_INTERLACE_NONE,PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT);
- png_write_info(pngp,infp);
- for ( int i=0; i= iw) || (y < 0) || (y >= ih) ) return;
- uint32_t tpos = (x+y*iw)*2;
- // add alpha
- int alph = idata[tpos+1];
- alph += a;
- if ( alph > 255 ) alph = 255;
- idata[tpos+1] = alph;
- // blend color
- int col = idata[tpos]*(a-255);
- col += v*a;
- col /= 255;
- idata[tpos] = col;
-}
-
-uint8_t lerpg( float a )
-{
- return (uint8_t)(a*191+64);
-}
-
-int draw_glyph( FT_Bitmap *bmp, uint8_t v, uint32_t px, uint32_t py, uint8_t ox, uint8_t oy )
-{
- int drawn = 0;
- unsigned i, j;
- for ( j=0; jrows; j++ )
- {
- uint8_t rv = v;
- // apply gradient, if any
- if ( v == 255 )
- {
- float a = (j+oy-upshift)/(float)h;
- if ( (gradient&3) == 1 ) rv = lerpg(1.-a);
- else if ( (gradient&3) == 2 ) rv = lerpg(a);
- }
- for ( i=0; iwidth; i++ )
- {
- if ( bmp->pixel_mode == FT_PIXEL_MODE_GRAY )
- {
- uint8_t a = bmp->buffer[i+j*bmp->pitch];
- if ( !drawn ) drawn = (a > 0);
- putpixel(rv,a,px+ox+i,py+oy+j);
- }
- else if ( bmp->pixel_mode == FT_PIXEL_MODE_MONO )
- {
- // thanks to https://stackoverflow.com/a/14905971
- unsigned p = bmp->pitch;
- uint8_t *row = &bmp->buffer[p*j];
- uint8_t a = ((row[i>>3])&(128>>(i&7)))?255:0;
- if ( !drawn ) drawn = (a > 0);
- putpixel(rv,a,px+ox+i,py+oy+j);
- }
- }
- }
- return drawn;
-}
-
-int main( int argc, char **argv )
-{
- if ( argc < 4 )
- {
- fprintf(stderr,"usage: mkfontblock "
- " [gradient type] [upshift]\n");
- return 1;
- }
- if ( FT_Init_FreeType(&ftlib) )
- return 2;
- uint32_t block = 0;
- sscanf(argv[2],"%d",&pxsiz);
- sscanf(argv[3],"%dx%d",&w,&h);
- sscanf(argv[4],"%x",&block);
- if ( argc > 5 ) sscanf(argv[5],"%d",&gradient);
- if ( argc > 6 ) sscanf(argv[6],"%d",&upshift);
- if ( FT_New_Face(ftlib,argv[1],0,&fnt) )
- return 4;
- if ( FT_Set_Pixel_Sizes(fnt,0,pxsiz) )
- return 8;
- FT_Select_Charmap(fnt,FT_ENCODING_UNICODE);
- iw = w*32;
- ih = h*8;
- idata = calloc(iw*ih,2);
- int x = 0, y = 0;
- int lastvalid = 0;
- int validrow = 0;
- for ( int i=0; i<256; i++ )
- {
- FT_UInt glyph = FT_Get_Char_Index(fnt,block+i);
- if ( !FT_Load_Glyph(fnt,glyph,FT_LOAD_DEFAULT) && glyph )
- {
- FT_Render_Glyph(fnt->glyph,FT_RENDER_MODE_NORMAL);
- int xx = x*w;
- int yy = y*h-upshift;
- int valid;
- if ( gradient&4 )
- {
- // draw outline first
- draw_glyph(&fnt->glyph->bitmap,0,xx,yy,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx+1,yy,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx+2,yy,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx,yy+1,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx+2,yy+1,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx,yy+2,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx+1,yy+2,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx+2,yy+2,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- valid = draw_glyph(&fnt->glyph->bitmap,255,xx+1,yy+1,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- }
- else
- {
- // draw drop shadow first
- draw_glyph(&fnt->glyph->bitmap,0,xx+1,yy+1,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- valid = draw_glyph(&fnt->glyph->bitmap,255,xx,yy,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- }
- if ( !validrow ) validrow = valid;
- }
- x++;
- if ( x >= 32 )
- {
- if ( validrow ) lastvalid = y+1;
- validrow = 0;
- x = 0;
- y++;
- }
- }
- // trim excess height
- ih = h*lastvalid;
- if ( ih > 0 )
- {
- char fname[256];
- snprintf(fname,256,"%04X.png",block);
- writepng(fname,idata,iw,ih,iw*2);
- }
- free(idata);
- FT_Done_Face(fnt);
- FT_Done_FreeType(ftlib);
- return 0;
-}
diff --git a/tools/mkfontsingle.c b/tools/mkfontsingle.c
deleted file mode 100644
index 868543d2c..000000000
--- a/tools/mkfontsingle.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- mkfontsingle.c : Make font pngs for gzdoom, in an ugly cheap way.
- This code is a mess but I keep it here so people know how much I had
- to suffer to get this done.
-
- Copyright (c) 2020-2021 Marisa Kirisame, UnSX Team
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-#include
-#include
-#include
-#include
-#include
-#include FT_FREETYPE_H
-
-int writepng( const char *filename, uint8_t *fdata, int w, int h, int p )
-{
- if ( !filename ) return 0;
- png_structp pngp;
- png_infop infp;
- FILE *pf;
- if ( !(pf = fopen(filename,"wb")) ) return 0;
- pngp = png_create_write_struct(PNG_LIBPNG_VER_STRING,0,0,0);
- if ( !pngp )
- {
- fclose(pf);
- return 0;
- }
- infp = png_create_info_struct(pngp);
- if ( !infp )
- {
- fclose(pf);
- png_destroy_write_struct(&pngp,0);
- return 0;
- }
- if ( setjmp(png_jmpbuf(pngp)) )
- {
- png_destroy_write_struct(&pngp,&infp);
- fclose(pf);
- return 0;
- }
- png_init_io(pngp,pf);
- png_set_IHDR(pngp,infp,w,h,8,PNG_COLOR_TYPE_GA,
- PNG_INTERLACE_NONE,PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT);
- png_write_info(pngp,infp);
- for ( int i=0; i= iw) || (y < 0) || (y >= ih) ) return;
- uint32_t tpos = (x+y*iw)*2;
- // add alpha
- int alph = idata[tpos+1];
- alph += a;
- if ( alph > 255 ) alph = 255;
- idata[tpos+1] = alph;
- // blend color
- int col = idata[tpos]*(a-255);
- col += v*a;
- col /= 255;
- idata[tpos] = col;
-}
-
-uint8_t lerpg( float a )
-{
- return (uint8_t)(a*191+64);
-}
-
-int draw_glyph( FT_Bitmap *bmp, uint8_t v, uint32_t px, uint32_t py, uint8_t ox, uint8_t oy )
-{
- int drawn = 0;
- unsigned i, j;
- for ( j=0; jrows; j++ )
- {
- uint8_t rv = v;
- // apply gradient, if any
- if ( v == 255 )
- {
- float a = (j+oy-upshift)/(float)h;
- if ( (gradient&3) == 1 ) rv = lerpg(1.-a);
- else if ( (gradient&3) == 2 ) rv = lerpg(a);
- }
- for ( i=0; iwidth; i++ )
- {
- if ( bmp->pixel_mode == FT_PIXEL_MODE_GRAY )
- {
- uint8_t a = bmp->buffer[i+j*bmp->pitch];
- if ( !drawn ) drawn = (a > 0);
- putpixel(rv,a,px+ox+i,py+oy+j);
- }
- else if ( bmp->pixel_mode == FT_PIXEL_MODE_MONO )
- {
- // thanks to https://stackoverflow.com/a/14905971
- unsigned p = bmp->pitch;
- uint8_t *row = &bmp->buffer[p*j];
- uint8_t a = ((row[i>>3])&(128>>(i&7)))?255:0;
- if ( !drawn ) drawn = (a > 0);
- putpixel(rv,a,px+ox+i,py+oy+j);
- }
- }
- }
- return drawn;
-}
-
-int main( int argc, char **argv )
-{
- if ( argc < 4 )
- {
- fprintf(stderr,"usage: mkfontsingle "
- " [gradient type] [upshift]\n");
- return 1;
- }
- if ( FT_Init_FreeType(&ftlib) )
- return 2;
- uint32_t range[2] = {0x0000,0x00FF};
- sscanf(argv[2],"%d",&pxsiz);
- sscanf(argv[3],"%dx%d",&w,&h);
- sscanf(argv[4],"%x-%x",&range[0],&range[1]);
- if ( argc > 5 ) sscanf(argv[5],"%d",&gradient);
- if ( argc > 6 ) sscanf(argv[6],"%d",&upshift);
- if ( FT_New_Face(ftlib,argv[1],0,&fnt) )
- return 4;
- if ( FT_Set_Pixel_Sizes(fnt,0,pxsiz) )
- return 8;
- FT_Select_Charmap(fnt,FT_ENCODING_UNICODE);
- iw = w;
- ih = h;
- idata = calloc(iw*ih,2);
- for ( uint32_t i=range[0]; i<=range[1]; i++ )
- {
- FT_UInt glyph = FT_Get_Char_Index(fnt,i);
- if ( !FT_Load_Glyph(fnt,glyph,FT_LOAD_DEFAULT) && glyph )
- {
- FT_Render_Glyph(fnt->glyph,FT_RENDER_MODE_NORMAL);
- int xx = 0;
- int yy = -upshift;
- int valid;
- if ( gradient&4 )
- {
- // draw outline first
- draw_glyph(&fnt->glyph->bitmap,0,xx,yy,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx+1,yy,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx+2,yy,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx,yy+1,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx+2,yy+1,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx,yy+2,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx+1,yy+2,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- draw_glyph(&fnt->glyph->bitmap,0,xx+2,yy+2,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- valid = draw_glyph(&fnt->glyph->bitmap,255,xx+1,yy+1,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- }
- else
- {
- // draw drop shadow first
- draw_glyph(&fnt->glyph->bitmap,0,xx+1,yy+1,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- valid = draw_glyph(&fnt->glyph->bitmap,255,xx,yy,fnt->glyph->bitmap_left,pxsiz-fnt->glyph->bitmap_top);
- }
- if ( valid )
- {
- char fname[256];
- snprintf(fname,256,"%04X.png",i);
- writepng(fname,idata,iw,ih,iw*2);
- }
- memset(idata,0,iw*ih*2);
- }
- }
- free(idata);
- FT_Done_Face(fnt);
- FT_Done_FreeType(ftlib);
- return 0;
-}
diff --git a/tools/mklang.c b/tools/mklang.c
index 59b11054e..078951883 100644
--- a/tools/mklang.c
+++ b/tools/mklang.c
@@ -3,7 +3,7 @@
This code is a mess and it's full of hacks, but that's to be expected
when it's all really just for personal use.
- Copyright (c) 2020-2021 Marisa Kirisame, UnSX Team
+ Copyright (c) 2020-2022 Marisa Kirisame, UnSX Team
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
diff --git a/tools/mkpk3.sh b/tools/mkpk3.sh
index bdabc7ec4..16ba41247 100755
--- a/tools/mkpk3.sh
+++ b/tools/mkpk3.sh
@@ -1,5 +1,5 @@
#!/bin/sh
-WORKDIR=$(readlink -f $0 | sed 's/\(swwmgz_m\)\(.*\)/\1/')
+WORKDIR=$(dirname $(dirname $(readlink -f $0)))
pushd "$WORKDIR"
7z a -tzip -mx=9 -x@tools/excl.lst -up0q0r2x2y2z1w2 ../swwmgz${1}_m.pk3 .
popd
diff --git a/tools/mkpk7.sh b/tools/mkpk7.sh
index 013a29a83..80afcca4f 100755
--- a/tools/mkpk7.sh
+++ b/tools/mkpk7.sh
@@ -1,5 +1,5 @@
#!/bin/sh
-WORKDIR=$(readlink -f $0 | sed 's/\(swwmgz_m\)\(.*\)/\1/')
+WORKDIR=$(dirname $(dirname $(readlink -f $0)))
pushd "$WORKDIR"
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off -x@tools/excl.lst -up0q0r2x2y2z1w2 ../swwmgz${1}_m.pk7 .
popd
diff --git a/tools/oldblockfonts.tar.xz b/tools/oldblockfonts.tar.xz
deleted file mode 100644
index 1ba989bc7..000000000
Binary files a/tools/oldblockfonts.tar.xz and /dev/null differ
diff --git a/zmapinfo.txt b/zmapinfo.txt
index 1443edbaa..f15674efd 100644
--- a/zmapinfo.txt
+++ b/zmapinfo.txt
@@ -34,7 +34,6 @@ GameInfo
MessageBoxClass = "SWWMMessageBox"
HelpMenuClass = "SWWMHelpMenu"
MenuDelegateClass = "SWWMMenuDelegate"
- PauseSign = "graphics/swwmpause.png"
BorderFlat = "graphics/bord_flat.png"
Border = 2, 0, "graphics/bord_tr.png", "graphics/bord_t.png", "graphics/bord_tl.png", "graphics/bord_r.png", "graphics/bord_l.png", "graphics/bord_br.png", "graphics/bord_b.png", "graphics/bord_bl.png"
ForceTextInMenus = true
@@ -59,13 +58,13 @@ GameInfo
"Hellblazer",
"Quadravol",
"Sparkster",
- "BlackfireIgniter",
+ "ModernSparkster",
"SilverBullet",
- "EMPCarbine",
+ "MisterRifle",
"CandyGun",
"RayKhom",
"Ynykron",
- "GrandLance",
+ "RafanKos",
// gestures and items with gesture states
"SWWMGesture",
"SWWMRedCardGesture",
@@ -77,6 +76,7 @@ GameInfo
"SWWMRedSkullGesture",
"SWWMBlueSkullGesture",
"SWWMYellowSkullGesture",
+ "SWWMPurpleSkullGesture",
"SWWMGreenKeyGesture",
"SWWMBlueKeyGesture",
"SWWMYellowKeyGesture",
@@ -88,41 +88,72 @@ GameInfo
"FrispyCornGesture",
"SayaBeanGesture",
"MothPlushyGesture",
- "AA12ModelGesture",
- "CactusHegeGesture",
- "TastyHoagieGesture",
- "IbukiMilkGesture",
- "BRCAlbumGesture",
"DemoPlushGesture",
- "ManarokouGesture",
- "LithiumNovelGesture",
"KirinCummiesGesture",
"MilkBreadsGesture",
"KirinMangaGesture",
- "KirinPlushGesture",
- "PsykkonovexxGesture"
- // really damn big textures
+ "KirinPlushGesture"
+ // preload intro and menu textures
PrecacheTextures = "graphics/SWWMGZLogo.png",
"graphics/SWWMGZLogo_Layer1.png",
"graphics/SWWMGZLogo_Layer2.png",
"graphics/SWWMGZLogo_Layer3.png",
"graphics/SWWMGZLogo_Layer4.png",
"graphics/SWWMGZLogo_Layer5.png",
- "graphics/SWWMGZLogo_Layer6.png"
+ "graphics/SWWMGZLogo_Layer6.png",
+ "graphics/M_SWWM.png",
+ "graphics/M_SWWM_Layer1.png",
+ "graphics/M_SWWM_Layer2.png",
+ "graphics/M_SWWM_Layer3.png",
+ "graphics/M_SWWM_Layer4.png",
+ "graphics/M_SWWM_Layer5.png",
+ "graphics/M_SWWM_Layer6.png",
+ "graphics/M_DEMOCHAN.png",
+ "graphics/NewLogo.png",
+ "graphics/NewLogo_Grad.png",
+ "graphics/NewLogo_Layer1.png",
+ "graphics/NewLogo_Layer2.png",
+ "graphics/NewLogo_Layer3.png",
+ "graphics/NewLogo_Letter0.png",
+ "graphics/NewLogo_Letter1.png",
+ "graphics/NewLogo_Letter2.png",
+ "graphics/NewLogo_Letter3.png",
+ "graphics/NewLogo_Letter4.png",
+ "graphics/NewLogo_Letter5.png",
+ "graphics/NewLogo_Letter6.png",
+ "graphics/NewLogo_Letter7.png",
+ "graphics/NewLogo_Letter8.png",
+ "graphics/NewLogo_Letter9.png",
+ "graphics/NewLogo_Letter10.png",
+ "graphics/NewLogo_Letter11.png",
+ "graphics/NewLogo_Letter12.png",
+ "graphics/NewLogo_Letter13.png",
+ "graphics/M_DEMOLITIONIST.png",
+ "graphics/M_DEMOCHAN_BIOSPARK.png",
+ "graphics/M_DEMOCHAN_CANDYGUN.png",
+ "graphics/M_DEMOCHAN_DEEPIMPACT.png",
+ "graphics/M_DEMOCHAN_EVISCERATOR.png",
+ "graphics/M_DEMOCHAN_EXPLOGUN.png",
+ "graphics/M_DEMOCHAN_HELLBLAZER.png",
+ "graphics/M_DEMOCHAN_PUSHER.png",
+ "graphics/M_DEMOCHAN_SILVERBULLET.png",
+ "graphics/M_DEMOCHAN_SPREADGUN.png",
+ "graphics/M_DEMOCHAN_WALLBUSTER.png",
+ "graphics/M_DEMOCHAN_YNYKRON.png",
+ "graphics/M_DEMOCHAN_DAB.png",
+ "graphics/M_DEMOCHAN_DOUBLEV.png",
+ "graphics/M_DEMOCHAN_HEALTH.png",
+ "graphics/M_DEMOCHAN_LOVE.png",
+ "graphics/M_DEMOCHAN_RAGEKIT.png",
+ "graphics/M_DEMOCHAN_SANDWICH.png",
+ "graphics/M_DEMOCHAN_SHELLS.png",
+ "graphics/M_DEMOCHAN_SKULL.png",
+ "graphics/M_DEMOCHAN_THONK.png",
+ "graphics/M_DEMOCHAN_THUMBUP.png"
}
ClearSkills
-Skill chill
-{
- AutoUseHealth
- DamageFactor = 0.5
- EasyBossBrain
- SlowMonsters
- SpawnFilter = baby
- ACSReturn = 0
- Name = "$SWWM_SKCHILL"
-}
Skill easy
{
DamageFactor = 0.75
@@ -174,7 +205,7 @@ Skill lunatic
MustConfirm = "$SWWM_SKLUNATICCONFIRM"
}
-Map TITLEMAP "SWWM GZ Title Map"
+Map TITLEMAP "Title Map"
{
Music = ""
EventHandlers = "SWWMTitleStuff"
diff --git a/zscript.txt b/zscript.txt
index 5590fdefd..60baef3fb 100644
--- a/zscript.txt
+++ b/zscript.txt
@@ -1,8 +1,8 @@
version "4.7.1"
/*
- SWWM GZ Main Codebase
- (C)2020-2021 Marisa Kirisame, UnSX Team
+ DEMOLITIONIST Main Codebase
+ (C)2020-2022 Marisa Kirisame, UnSX Team
This copyright and the attached LICENSE.code file apply to all files
included from here, with the exception of any third party libraries
*/
@@ -20,7 +20,6 @@ version "4.7.1"
#include "zscript/swwm_handler.zsc"
#include "zscript/swwm_statichandler.zsc"
#include "zscript/swwm_thinkers.zsc"
-#include "zscript/swwm_thinkers_hud.zsc"
#include "zscript/swwm_thinkers_player.zsc"
#include "zscript/swwm_player.zsc"
#include "zscript/swwm_player_fx.zsc"
@@ -60,8 +59,22 @@ version "4.7.1"
// hud
#include "zscript/hud/swwm_hud.zsc"
#include "zscript/hud/swwm_hudextra.zsc"
+#include "zscript/hud/swwm_hudobjects.zsc"
// kbase
#include "zscript/kbase/swwm_kbase.zsc"
+#include "zscript/kbase/swwm_kbase_priv.zsc"
+#include "zscript/kbase/swwm_kbase_tab.zsc"
+#include "zscript/kbase/swwm_kbase_list.zsc"
+#include "zscript/kbase/swwm_kbase_textbox.zsc"
+#include "zscript/kbase/swwm_kbasetab_mission.zsc"
+#include "zscript/kbase/swwm_kbasetab_stats.zsc"
+#include "zscript/kbase/swwm_kbasetab_inventory.zsc"
+#include "zscript/kbase/swwm_kbasetab_keychain.zsc"
+#include "zscript/kbase/swwm_kbasetab_library.zsc"
+#include "zscript/kbase/swwm_kbasetab_store.zsc"
+#include "zscript/kbase/swwm_kbasetab_chat.zsc"
+#include "zscript/kbase/swwm_kbasetab_help.zsc"
+#include "zscript/kbase/swwm_kbasetab_secret.zsc"
// items
#include "zscript/items/swwm_baseitem.zsc"
#include "zscript/items/swwm_basehealth.zsc"
@@ -122,28 +135,15 @@ version "4.7.1"
#include "zscript/dlc1/swwm_heavymahsheengun_fx.zsc"
#include "zscript/dlc1/swwm_notashotgun.zsc"
#include "zscript/dlc1/swwm_notashotgun_fx.zsc"
-#include "zscript/dlc1/swwm_blackfire.zsc"
-#include "zscript/dlc1/swwm_blackfire_fx.zsc"
-#include "zscript/dlc1/swwm_veryveryfrightening.zsc"
-#include "zscript/dlc1/swwm_veryveryfrightening_fx.zsc"
+#include "zscript/dlc1/swwm_blueballs.zsc"
+#include "zscript/dlc1/swwm_blueballs_fx.zsc"
+#include "zscript/dlc1/swwm_mister.zsc"
+#include "zscript/dlc1/swwm_mister_fx.zsc"
#include "zscript/dlc1/swwm_thiccbolts.zsc"
#include "zscript/dlc1/swwm_thiccbolts_fx.zsc"
-#include "zscript/dlc1/swwm_hugeassrailgun.zsc"
-#include "zscript/dlc1/swwm_hugeassrailgun_fx.zsc"
-// DLC2 - Weapon Set 2
-#include "zscript/dlc2/swwm_ammoitems_dlc2.zsc"
-#include "zscript/dlc2/swwm_fisto.zsc"
-#include "zscript/dlc2/swwm_fisto_fx.zsc"
-#include "zscript/dlc2/swwm_blueballs.zsc"
-#include "zscript/dlc2/swwm_blueballs_fx.zsc"
-#include "zscript/dlc2/swwm_mister.zsc"
-#include "zscript/dlc2/swwm_mister_fx.zsc"
-#include "zscript/dlc2/swwm_ultimate.zsc"
-#include "zscript/dlc2/swwm_ultimate_fx.zsc"
-// DLC3 - Game Set
-#include "zscript/dlc3/swwm_tetris.zsc"
-#include "zscript/dlc3/swwm_pong.zsc"
-#include "zscript/dlc3/swwm_snake.zsc"
-#include "zscript/dlc3/swwm_demoland.zsc"
-#include "zscript/dlc3/swwm_demoshmup.zsc"
-#include "zscript/dlc3/swwm_demoquest.zsc"
+#include "zscript/dlc1/swwm_ultimate.zsc"
+#include "zscript/dlc1/swwm_ultimate_fx.zsc"
+// DLC2 - Game Set
+#include "zscript/dlc2/swwm_demoland.zsc"
+#include "zscript/dlc2/swwm_demoshmup.zsc"
+#include "zscript/dlc2/swwm_demoquest.zsc"
diff --git a/zscript/compat/swwm_compat.zsc b/zscript/compat/swwm_compat.zsc
index 306a7a92f..6c59109a3 100644
--- a/zscript/compat/swwm_compat.zsc
+++ b/zscript/compat/swwm_compat.zsc
@@ -197,6 +197,17 @@ Class SWWMLevelCompatibility : LevelPostProcessor
// unfortunately the line special wrangling has to be done one tic after map load
// because fuck absolutely everything about how ACS works
break;
+ // DUMP 3 HUBMAP
+ case '7E77AA43AF7ACDBC52171E9EE2BF98D0':
+ // swap all the calls to script 12 with calls to 'DUMP3_DISPLAY'
+ // to fix the bigfont being too large
+ for ( int i=0; i 5) && !swwm_nomapmsg && !swwm_oldcheat )
+ let s = SWWMStats.Find(players[consoleplayer]);
+ if ( (i > 5) && !swwm_nomapmsg && (!s || !s.oldcheat) )
{
let m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_ZNVSNAME"),StringTable.Localize("$SWWM_ZNVNAME"),"Znv");
m.seqname = "ZNVTXT";
@@ -447,9 +447,8 @@ extend Class SWWMHandler
m.enddelay = 90;
m.pausedelay = 40;
StatusBar.AttachMessage(m,-1232);
- CVar.FindCVar('swwm_oldcheat').SetBool(true);
+ SendNetworkEvent("swwmsetoldcheat",consoleplayer);
}
- SWWMUtility.MarkAchievement('swwm_achievement_cheat',players[consoleplayer]);
if ( SWWMUtility.CheatsDisabled(consoleplayer) )
{
kfail = true;
@@ -519,19 +518,18 @@ extend Class SWWMHandler
double shine = clamp((klinger-(gametic+e.fractic+40))/20.,0.,1.);
int col = (kcode>4)?0:(kfail)?2:1;
int tlen = chstr.CodePointCount();
- if ( !kfnt ) kfnt = Font.GetFont('TewiShadedOutline');
- int width = (kfnt.StringWidth(chstr)+2*(tlen-1))*2;
+ int width = (bigfont.StringWidth(chstr)+6*(tlen-1));
int xx = int((ss.x-width)/2.);
- int yy = int((ss.y-kfnt.GetHeight())/2.);
+ int yy = int((ss.y-bigfont.GetHeight())/2.);
rss = (kcode>4)?gametic:klinger;
for ( int i=0, pos=0; i lastcombat+100)) && !Random[DemoLines](0,(e.DamageSource.bBOSS||e.DamageSource.FindInventory("BossMarker"))?2:4) && !SWWMHDoomHandler.IsCuteGirl(e.DamageSource) ) // [HDoom] don't shout at the girls
+ else if ( (!lastcombat || (gametic > lastcombat+180)) && !Random[DemoLines](0,(e.DamageSource.bBOSS||e.DamageSource.FindInventory("BossMarker"))?1:4) && !SWWMHDoomHandler.IsCuteGirl(e.DamageSource) ) // [HDoom] don't shout at the girls
lastcombat = AddOneliner("gethit",1,15);
}
highesttic = gametic;
@@ -180,7 +180,7 @@ extend Class SWWMHandler
{
if ( e.Thing.IsFriend(src) )
lastcombat = AddOneliner("friendkill",1,5);
- else if ( (!lastcombat || (gametic > lastcombat+100)) && !Random[DemoLines](0,(e.Thing.bBOSS||e.Thing.FindInventory("BossMarker"))?2:5) && !SWWMHDoomHandler.IsCuteGirl(e.Thing) ) // [HDoom] don't shout at the girls
+ else if ( (!lastcombat || (gametic > lastcombat+120)) && !Random[DemoLines](0,(e.Thing.bBOSS||e.Thing.FindInventory("BossMarker"))?1:4) && !SWWMHDoomHandler.IsCuteGirl(e.Thing) ) // [HDoom] don't shout at the girls
lastcombat = AddOneliner("scorekill",1,15);
}
}
@@ -189,34 +189,34 @@ extend Class SWWMHandler
if ( e.Thing.IsHostile(src) && (e.Thing.bISMONSTER || e.Thing.player) )
{
if ( (e.Thing.bBOSS||e.Thing.FindInventory("BossMarker")) && ((e.DamageType == 'Dash') || (e.DamageType == 'Buttslam')) )
- SWWMUtility.AchievementProgressInc('swwm_progress_bossdash',1,src.player);
- if ( e.DamageType == 'Push' )
- SWWMUtility.AchievementProgressInc('swwm_progress_sneeze',1,src.player);
+ SWWMUtility.AchievementProgressInc("bossdash",1,src.player);
+ if ( (e.Inflictor is 'DeepImpact') && (e.DamageType == 'Push') )
+ SWWMUtility.AchievementProgressInc("sneeze",1,src.player);
else if ( e.DamageType == 'Buttslam' )
- SWWMUtility.AchievementProgressInc('swwm_progress_butts',1,src.player);
+ SWWMUtility.AchievementProgressInc("butts",1,src.player);
else if ( e.DamageType == 'Jump' )
- SWWMUtility.AchievementProgressInc('swwm_progress_stomp',1,src.player);
+ SWWMUtility.AchievementProgressInc("stomp",1,src.player);
else if ( e.DamageType == 'GroundPound' )
- SWWMUtility.AchievementProgressInc('swwm_progress_thicc',1,src.player);
+ SWWMUtility.AchievementProgressInc("thicc",1,src.player);
else if ( (e.DamageType == 'Love') && !(e.Thing is 'WolfensteinSS') && (e.Thing.Species != 'WolfensteinSS') )
- SWWMUtility.AchievementProgressInc('swwm_progress_love',1,src.player);
+ SWWMUtility.AchievementProgressInc("love",1,src.player);
Inventory buff = e.Inflictor?e.Inflictor.FindInventory('ParriedBuff'):null;
if ( buff )
{
- SWWMUtility.AchievementProgressInc('swwm_progress_reflect',1,src.player);
+ SWWMUtility.AchievementProgressInc("reflect",1,src.player);
if ( (e.Thing is 'Cyberdemon') && (e.Inflictor is 'Rocket') && (buff.tracer == e.Thing) )
- SWWMUtility.MarkAchievement('swwm_achievement_cybully',src.player);
+ SWWMUtility.MarkAchievement("cybully",src.player);
}
if ( (e.Inflictor is 'PusherWeapon') || (e.Inflictor is 'PusherProjectile') )
- SWWMUtility.AchievementProgressInc('swwm_progress_tender',1,src.player);
+ SWWMUtility.AchievementProgressInc("tender",1,src.player);
Inventory tk;
if ( (tk = e.Thing.FindInventory("DeepImpactOnlyToken")) && (tk.special1 == 1) )
- SWWMUtility.MarkAchievement('swwm_achievement_shame',src.player);
- SWWMUtility.AchievementProgressInc('swwm_progress_mega',1,src.player);
+ SWWMUtility.MarkAchievement("shame",src.player);
+ SWWMUtility.AchievementProgressInc("mega",1,src.player);
if ( src.player.Health == 1 )
{
onehpspree[pnum]++;
- SWWMUtility.AchievementProgress('swwm_progress_onehp',onehpspree[pnum],src.player);
+ SWWMUtility.AchievementProgress("onehp",onehpspree[pnum],src.player);
}
// tasty treats
if ( swwm_demoslayer )
@@ -277,79 +277,39 @@ extend Class SWWMHandler
if ( e.DamageType == 'Push' )
{
score += 500;
- if ( scr )
- {
- scr.xscore[ofs] = 0;
- scr.xstr[ofs] = StringTable.Localize("$SWWM_SHAMEFUL");
- scr.xcnt = ++ofs;
- }
+ if ( scr ) scr.AppendXString(StringTable.Localize("$SWWM_SHAMEFUL"));
}
else if ( e.DamageType == 'Buttslam' )
{
score += 300;
- if ( scr )
- {
- scr.xscore[ofs] = 0;
- scr.xstr[ofs] = StringTable.Localize("$SWWM_BUTTSLAM");
- scr.xcnt = ++ofs;
- }
+ if ( scr ) scr.AppendXString(StringTable.Localize("$SWWM_BUTTSLAM"));
}
else if ( e.DamageType == 'Love' )
{
score += 600;
- if ( scr )
- {
- scr.xscore[ofs] = 0;
- scr.xtcolor[ofs] = Font.FindFontColor('BlushPink');
- scr.xstr[ofs] = StringTable.Localize(((e.Thing is 'WolfensteinSS')||(e.Thing.Species=='WolfensteinSS'))?"$SWWM_LOVED_ALT":"$SWWM_LOVED");
- scr.xcnt = ++ofs;
- }
+ if ( scr ) scr.AppendXString(StringTable.Localize(((e.Thing is 'WolfensteinSS')||(e.Thing.Species=='WolfensteinSS'))?"$SWWM_LOVED_ALT":"$SWWM_LOVED"),0,Font.FindFontColor('BlushPink'));
}
else if ( e.Inflictor is 'FroggyChair' )
{
score += 1440;
- if ( scr )
- {
- scr.xscore[ofs] = 0;
- scr.xtcolor[ofs] = Font.CR_GREEN;
- scr.xstr[ofs] = StringTable.Localize("$SWWM_FROGGED");
- scr.xcnt = ++ofs;
- }
+ if ( scr ) scr.AppendXString(StringTable.Localize("$SWWM_FROGGED"),0,Font.CR_GREEN);
}
Inventory pb;
if ( e.Inflictor && (pb = e.Inflictor.FindInventory('ParriedBuff')) )
{
score += 200;
if ( pb.special1&1 ) score += 200;
- if ( scr )
- {
- scr.xscore[ofs] = 0;
- if ( pb.special1&1 ) scr.xstr[ofs] = StringTable.Localize("$SWWM_PPARRY");
- else scr.xstr[ofs] = StringTable.Localize("$SWWM_PARRY");
- scr.xcnt = ++ofs;
- }
+ if ( scr ) scr.AppendXString(StringTable.Localize((pb.special1&1)?"$SWWM_PPARRY":"$SWWM_PARRY"));
}
if ( (e.Damage >= e.Thing.GetSpawnHealth()*2) || (((e.Thing.Health <= e.Thing.GetGibHealth()) || (src.bEXTREMEDEATH) || (e.Inflictor && e.Inflictor.bEXTREMEDEATH) || (e.DamageType == 'Extreme')) && !src.bNOEXTREMEDEATH && (!e.Inflictor || !e.Inflictor.bNOEXTREMEDEATH)) )
{
score *= 2;
- if ( scr )
- {
- scr.xscore[ofs] = 0;
- scr.xstr[ofs] = StringTable.Localize("$SWWM_OVERKILL");
- scr.xcnt = ++ofs;
- }
- SWWMUtility.AchievementProgressInc('swwm_progress_gib',1,src.player);
+ if ( scr ) scr.AppendXString(StringTable.Localize("$SWWM_OVERKILL"));
+ SWWMUtility.AchievementProgressInc("gib",1,src.player);
}
score = int(score*(1.+.5*min(multilevel[pnum],16)));
if ( (multilevel[pnum] > 0) && scr )
- {
- if ( scr )
- {
- scr.xscore[ofs] = (multilevel[pnum]>=16)?int.max:(multilevel[pnum]+1);
- scr.xstr[ofs] = StringTable.Localize("$SWWM_MULTIKILL");
- scr.xcnt = ++ofs;
- }
- }
+ scr.AppendXString(StringTable.Localize("$SWWM_MULTIKILL"),(multilevel[pnum]>=16)?int.max:(multilevel[pnum]+1));
spreecount[pnum]++;
if ( s && (spreecount[pnum] > s.skill) && !tookdamage[pnum] )
s.skill = spreecount[pnum];
@@ -360,21 +320,12 @@ extend Class SWWMHandler
if ( spreecount[pnum] > 10 ) spreebonus = int(10*((spreecount[pnum]/10.)**.25));
score += 100+spreebonus;
if ( (spreecount[pnum] > 0) && scr )
- {
- scr.xscore[ofs] = spreecount[pnum];
- scr.xstr[ofs] = StringTable.Localize("$SWWM_SPREEKILL");
- scr.xcnt = ++ofs;
- }
+ scr.AppendXString(StringTable.Localize("$SWWM_SPREEKILL"),spreecount[pnum]);
}
if ( e.Thing.bBOSS || e.Thing.FindInventory("BossMarker") )
{
score += 2000;
- if ( scr )
- {
- scr.xscore[ofs] = 0;
- scr.xstr[ofs] = StringTable.Localize("$SWWM_BOSSKILL");
- scr.xcnt = ++ofs;
- }
+ if ( scr ) scr.AppendXString(StringTable.Localize("$SWWM_BOSSKILL"));
}
SWWMCredits.Give(src.player,score);
if ( scr ) scr.score = score; // update final score
@@ -384,33 +335,32 @@ extend Class SWWMHandler
SWWMCredits.Give(src.player,1000);
Console.Printf(StringTable.Localize("$SWWM_LASTMONSTER"),src.player.GetUserName(),1000);
SWWMScoreObj.Spawn(1000,src.Vec3Offset(0,0,src.Height/2));
- SWWMUtility.AchievementProgressInc('swwm_progress_allkills',1,src.player);
+ SWWMUtility.AchievementProgressInc("allkills",1,src.player);
}
}
override void WorldThingDamaged( WorldEvent e )
{
- if ( profiling ) curms = MSTime();
+ if ( profiling ) ProfileTick();
if ( e.Damage > 0 ) DoDamageHandling(e);
if ( e.DamageSource && (e.DamageSource != e.Thing) ) DoCombatHit(e);
if ( (e.Thing.Health > 0) || e.Thing.bKilled || e.Thing.bCorpse )
{
- if ( profiling ) worldthingdamaged_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_WORLDTHINGDAMAGED);
return;
}
DoGibThing(e);
- // romero hax
- if ( (e.Thing is 'BossBrain') && (e.DamageType == 'Telefrag') )
- e.DamageSource.DamageMobj(null,null,Actor.TELEFRAG_DAMAGE,'EndLevel');
- // voodoo doll telefragging barrel hax (eviternity death exits)
- if ( (e.Thing is 'ExplosiveBarrel') && (e.DamageType == 'Telefrag') && e.DamageSource.player && (e.DamageSource.player.mo != e.DamageSource) )
+ // death exit hax
+ // could be telefragging Romero, or a voodoo doll telefragging a barrel (death exits in Eviternity)
+ if ( (e.DamageType == 'Telefrag') && e.DamageSource && e.DamageSource.player
+ && ((e.Thing is 'BossBrain') || ((e.Thing is 'ExplosiveBarrel') && (e.DamageSource.player.mo != e.DamageSource))) )
e.DamageSource.DamageMobj(null,null,Actor.TELEFRAG_DAMAGE,'EndLevel');
if ( !e.Thing.player && !e.Thing.bIsMonster && !e.Thing.bCountKill && !(e.Thing is 'ScriptedMarine') )
{
- if ( profiling ) worldthingdamaged_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_WORLDTHINGDAMAGED);
return;
}
DoKillScoring(e);
- if ( profiling ) worldthingdamaged_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_WORLDTHINGDAMAGED);
}
}
diff --git a/zscript/handler/swwm_handler_debugrender.zsc b/zscript/handler/swwm_handler_debugrender.zsc
index 8a4f4a4c2..dea8db9d5 100644
--- a/zscript/handler/swwm_handler_debugrender.zsc
+++ b/zscript/handler/swwm_handler_debugrender.zsc
@@ -3,7 +3,6 @@
extend Class SWWMHandler
{
ui SWWMProjectionData projdata;
- transient ui Font dbgfont;
private ui void DrawWorldLine( RenderEvent e, Vector3 apos, Vector3 bpos, Color col )
{
@@ -97,8 +96,7 @@ extend Class SWWMHandler
Vector2 vpos = SWWMUtility.NDCToViewport(projdata,ndc);
String tag = a.player?a.player.GetUserName():a.GetTag();
if ( tag == a.GetClassName() ) SWWMUtility.BeautifyClassName(tag);
- if ( !dbgfont ) dbgfont = Font.GetFont('TewiShadedOutline');
- Screen.DrawText(dbgfont,Font.CR_RED,vpos.x-dbgfont.StringWidth(tag)/2,vpos.y-NewSmallFont.GetHeight()/2,tag);
+ Screen.DrawText(NewSmallFont,Font.CR_RED,vpos.x-NewSmallFont.StringWidth(tag)/2,vpos.y-NewSmallFont.GetHeight()/2,tag);
}
private ui void DrawDebug( RenderEvent e )
diff --git a/zscript/handler/swwm_handler_oneliners.zsc b/zscript/handler/swwm_handler_oneliners.zsc
index c68d0d980..76e50f36c 100644
--- a/zscript/handler/swwm_handler_oneliners.zsc
+++ b/zscript/handler/swwm_handler_oneliners.zsc
@@ -8,7 +8,7 @@ Class LastLine
extend Class SWWMHandler
{
- transient String oneliner, onelinersnd;
+ transient String oneliner, onelinersnd, onelinertype;
transient int onelinertic, onelinerspan, onelinerlevel;
transient Array lastlines;
@@ -22,12 +22,29 @@ extend Class SWWMHandler
String voicetype = CVar.FindCVar('swwm_voicetype').GetString();
// suppress non-rage comments when ragekit is active, only screaming allowed
if ( players[consoleplayer].mo.FindInventory("RagekitPower") && (type != "ragekit") ) return 0;
- int whichline;
+ // check first if it's a multiple option line type
String testme = String.Format("SWWM_SUBS_%s_N%s",voicetype.MakeUpper(),type.MakeUpper());
String locme = StringTable.Localize(testme,false);
- int countem;
- if ( testme == locme ) countem = 0;
- else countem = locme.ToInt();
+ if ( testme == locme )
+ {
+ // it might be a single option line type
+ testme = String.Format("SWWM_SUBS_%s_%s",voicetype.MakeUpper(),type.MakeUpper());
+ locme = StringTable.Localize(testme,false);
+ if ( testme == locme ) return 0; // nope, the voicepack doesn't have it
+ hnd.oneliner = String.Format("$SWWM_SUBS_%s_%s",voicetype.MakeUpper(),type.MakeUpper());
+ hnd.onelinersnd = String.Format("voice/%s/%s",voicetype,type);
+ hnd.onelinertic = gametic+delay;
+ hnd.onelinertype = type;
+ hnd.onelinerspan = int(S_GetLength(hnd.onelinersnd)*GameTicRate);
+ if ( hnd.onelinerspan == 0 )
+ {
+ if ( developer >= 2 ) Console.Printf("No sound for voice line '%s'",type);
+ hnd.onelinerspan = 35;
+ }
+ hnd.onelinerlevel = level;
+ return hnd.onelinertic+hnd.onelinerspan;
+ }
+ int countem = locme.ToInt();
if ( countem == 0 ) return 0; // voicepack doesn't have this
// check last line so we don't repeat
int last = 0, ent;
@@ -38,6 +55,7 @@ extend Class SWWMHandler
ent = i;
break;
}
+ int whichline;
if ( countem == 1 ) whichline = 1;
else if ( last > 0 )
{
@@ -57,17 +75,38 @@ extend Class SWWMHandler
hnd.onelinersnd = String.Format("voice/%s/%s%d",voicetype,type,whichline);
hnd.onelinertic = gametic+delay;
hnd.onelinerspan = int(S_GetLength(hnd.onelinersnd)*GameTicRate);
+ hnd.onelinertype = type;
+ if ( hnd.onelinerspan == 0 )
+ {
+ if ( developer >= 2 ) Console.Printf("No sound for voice line '%s%d'",type,whichline);
+ hnd.onelinerspan = 35;
+ }
hnd.onelinerlevel = level;
return hnd.onelinertic+hnd.onelinerspan;
}
+ static void CancelOneliner( String type )
+ {
+ let hnd = SWWMHandler(EventHandler.Find("SWWMHandler"));
+ if ( !hnd ) return;
+ if ( (hnd.onelinertype != type) || (hnd.onelinertic < gametic) ) return;
+ hnd.onelinertic = 0;
+ hnd.onelinerspan = 0;
+ }
+
private void OnelinerTick()
{
if ( !onelinertic || (onelinertic >= gametic) ) return;
if ( players[consoleplayer].health > 0 )
{
if ( onelinerlevel > swwm_mutevoice )
+ {
+ int loudlv = swwm_voiceamp;
players[consoleplayer].mo.A_StartSound(onelinersnd,CHAN_DEMOVOICE,CHANF_DEFAULT,1.,ATTN_NONE);
+ if ( loudlv > 1 ) players[consoleplayer].mo.A_StartSound(onelinersnd,CHAN_DEMOVOICEAUX,CHANF_DEFAULT,1.,ATTN_NONE);
+ if ( loudlv > 2 ) players[consoleplayer].mo.A_StartSound(onelinersnd,CHAN_DEMOVOICEAUX2,CHANF_DEFAULT,1.,ATTN_NONE);
+ if ( loudlv > 3 ) players[consoleplayer].mo.A_StartSound(onelinersnd,CHAN_DEMOVOICEAUX3,CHANF_DEFAULT,1.,ATTN_NONE);
+ }
SendNetworkEvent("swwmremoteliner."..onelinersnd,consoleplayer,onelinerlevel);
}
onelinertic = 0;
diff --git a/zscript/handler/swwm_handler_process.zsc b/zscript/handler/swwm_handler_process.zsc
index d856fa84e..57f34d3a6 100644
--- a/zscript/handler/swwm_handler_process.zsc
+++ b/zscript/handler/swwm_handler_process.zsc
@@ -27,7 +27,7 @@ extend Class SWWMHandler
{
if ( (gamestate != GS_LEVEL) || (players[consoleplayer].Health <= 0) || !(players[consoleplayer].mo is 'Demolitionist') )
return;
- double maxval = players[consoleplayer].mo.FindInventory("Omnisight")?2.:1.;
+ double maxval = level.allmap?2.:1.;
double val = swwm_mm_zoom;
if ( val >= 1. ) val = min(maxval,val+.5);
else val = min(1.,val+.25);
@@ -153,7 +153,13 @@ extend Class SWWMHandler
if ( swwm_notrack )
{
int n = trackers_cnt;
- while ( trackers ) trackers.Destroy(); // wow that's simple, all in one line
+ while ( trackers )
+ {
+ let next = trackers.next;
+ trackers.Destroy(); // wow that's simple, all in one line
+ trackers = next;
+ }
+ trackers_cnt = 0;
Console.Printf("%d trackers removed.",n);
}
else
@@ -213,7 +219,7 @@ extend Class SWWMHandler
return;
}
// dump the values of all mod RNGs (might help someday to track down what desyncs)
- String msg = String.Format("\cxSWWM GZ RNG dump for player %d (\c-%s\cx):\c-",consoleplayer,players[consoleplayer].GetUserName());
+ String msg = String.Format("\cxRNG dump for player %d (\c-%s\cx):\c-",consoleplayer,players[consoleplayer].GetUserName());
msg.AppendFormat("\n\n\cfPlay RNG (will cause desyncs if mismatched):\c-\n");
msg.AppendFormat("\nBlood: %08x",Random2[Blood]());
msg.AppendFormat("\nBoolet: %08x",Random2[Boolet]());
@@ -273,6 +279,36 @@ extend Class SWWMHandler
Console.Printf(msg);
return;
}
+ else if ( e.Name ~== "swwmdebugdlglines" )
+ {
+ if ( multiplayer && (e.player != Net_Arbitrator) )
+ {
+ if ( e.player == consoleplayer )
+ Console.Printf("Only the net arbitrator can call this event.");
+ return;
+ }
+ // checks that ALL dialogue text fits in 3 lines
+ String alldlg_pack = "SWWM_SAYAPHOBOS1:SWWM_SAYAPHOBOS2:SWWM_SAYAPHOBOS3:SWWM_SAYAPHOBOS4:SWWM_SAYADEIMOS1:SWWM_SAYADEIMOS2:SWWM_SAYADEIMOS3:SWWM_SAYADEIMOS4:SWWM_SAYADIS1:SWWM_SAYADIS2:SWWM_SAYADIS3:SWWM_SAYADIS4:SWWM_SAYATHY1:SWWM_SAYATHY2:SWWM_SAYATHY3:SWWM_SAYATHY4:SWWM_CYTHOSIGIL1:SWWM_CYTHOSIGIL2:SWWM_CYTHOSIGIL3:SWWM_CYTHOSIGIL4:SWWM_SAYADIMPLE1:SWWM_SAYADIMPLE2:SWWM_SAYADIMPLE3:SWWM_SAYADIMPLE4:SWWM_SAYADIMPLE5:SWWM_SAYACIRCLE1:SWWM_SAYACIRCLE2:SWWM_SAYACIRCLE3:SWWM_SAYACIRCLE4:SWWM_SAYACIRCLE5:SWWM_SAYAGOTCHA1:SWWM_SAYAGOTCHA2:SWWM_SAYAGOTCHA3:SWWM_SAYAGOTCHA4:SWWM_SAYAGOTCHA5:SWWM_SAYAGOTCHAEND1:SWWM_SAYAGOTCHAEND2:SWWM_SAYAGOTCHAEND3:SWWM_SAYAGOTCHAEND4:SWWM_SAYAGOTCHAEND5:SWWM_SAYAIOS1:SWWM_SAYAIOS2:SWWM_SAYAIOS3:SWWM_SAYAIOS4:SWWM_SAYAIOS5:SWWM_SAYARAMPANCY1:SWWM_SAYARAMPANCY2:SWWM_SAYARAMPANCY3:SWWM_SAYARAMPANCY4:SWWM_CYTHONERVE1:SWWM_CYTHONERVE2:SWWM_CYTHONERVE3:SWWM_CYTHONERVE4:SWWM_CYTHONERVE5:SWWM_SAYAEVIA1:SWWM_SAYAEVIA2:SWWM_SAYAEVIA3:SWWM_SAYAEVIA4:SWWM_SAYAEVIB1:SWWM_SAYAEVIB2:SWWM_SAYAMAW1:SWWM_SAYAMAW2:SWWM_SAYAMAW3:SWWM_SAYAMAW4:SWWM_SAYAMAW5:SWWM_SAYAMASTERS1:SWWM_SAYAMASTERS2:SWWM_SAYAMASTERS3:SWWM_SAYAMASTERS4:SWWM_SAYAMASTERS5:SWWM_SAYADSPARIL1:SWWM_SAYADSPARIL2:SWWM_SAYADSPARIL3:SWWM_SAYADSPARIL4:SWWM_SAYADSPARIL5:SWWM_SAYAHEADS1:SWWM_SAYAHEADS2:SWWM_SAYAHEADS3:SWWM_SAYAHEADS4:SWWM_SAYAHEADS5:SWWM_SAYAHEADS6:SWWM_SAYABULLS1:SWWM_SAYABULLS2:SWWM_SAYABULLS3:SWWM_SAYABULLS4:SWWM_SAYABULLS5:SWWM_SAYAGREETA1:SWWM_SAYAGREETA2:SWWM_SAYAGREETA3:SWWM_SAYAGREETB1:SWWM_SAYAGREETC1:SWWM_SAYAGREETD1:SWWM_SAYAGREETE1:SWWM_SAYAGREETF1:SWWM_SAYABLOODA1:SWWM_SAYABLOODA2:SWWM_SAYABLOODB1:SWWM_SAYABLOODC1:SWWM_SAYABLOODD1:SWWM_SAYAHYPO1:SWWM_SAYAHYPO2:SWWM_SAYAHYPO3:SWWM_SAYAHYPO4:SWWM_KIRINWORSHIPA1:SWWM_KIRINWORSHIPB1:SWWM_KIRINWORSHIPC1:SWWM_KIRINWORSHIPD1:SWWM_KIRINWORSHIPD2:SWWM_SAYAGAMEA1:SWWM_SAYAGAMEA2:SWWM_SAYAGAMEB1:SWWM_SAYAGAMEC1:SWWM_SAYAMASTERSA1:SWWM_SAYAMASTERSA2:SWWM_SAYAMASTERSB1:SWWM_SAYAMASTERSC1:SWWM_SAYAMASTERSD1:SWWM_SAYAMASTERSE1:SWWM_SAYAMASTERSF1:SWWM_SAYAFIGHTER1:SWWM_SAYAFIGHTER2:SWWM_SAYACLERICA1:SWWM_SAYACLERICA2:SWWM_SAYACLERICB1:SWWM_SAYACLERICC1:SWWM_SAYACLERICC2:SWWM_SAYAMAGE1:SWWM_SAYAMAGE2:SWWM_SAYAMAGE3:SWWM_SAYAMAGE4:SWWM_SAYAKORAXA1:SWWM_SAYAKORAXB1:SWWM_SAYAKORAXC1:SWWM_SAYAKORAXD1:SWWM_SAYAKORAXE1:SWWM_SAYABLIGHTA1:SWWM_SAYABLIGHTB1:SWWM_SAYABLIGHTC1:SWWM_SAYABLIGHTC2:SWWM_SAYACONSTABLEA1:SWWM_SAYACONSTABLEA2:SWWM_SAYACONSTABLEB1:SWWM_SAYACONSTABLEC1:SWWM_SAYACONSTABLED1:SWWM_SAYANAVEA1:SWWM_SAYANAVEA2:SWWM_SAYANAVEB1:SWWM_SAYANAVEC1:SWWM_SAYANAVED1:SWWM_SAYANAVEE1:SWWM_SAYANAVEF1:SWWM_SAYADEATHKINGS1:SWWM_KIRINPUZZLEA1:SWWM_KIRINPUZZLEA2:SWWM_KIRINPUZZLEB1:SWWM_KIRINPUZZLEC1:SWWM_KIRINPUZZLEC2:SWWM_KIRINPUZZLED1:SWWM_KIRINPUZZLED2:SWWM_KIRINPUZZLEE1:SWWM_KIRINPUZZLEE2:SWWM_KIRINPUZZLEF1:SWWM_KIRINPUZZLEF2:SWWM_KIRINPUZZLEF3:SWWM_KIRINPUZZLEG1:SWWM_KIRINPUZZLEH1:SWWM_KIRINPUZZLEI1:SWWM_KIRINPUZZLEI2:SWWM_KIRINPUZZLEJ1:SWWM_KIRINPUZZLEJ2:SWWM_KIRINPUZZLEK1:SWWM_KIRINPUZZLEL1:SWWM_KIRINPUZZLEM1:SWWM_KIRINPUZZLEN1:SWWM_KIRINPUZZLEO1:SWWM_KIRINPUZZLEP1:SWWM_KIRINPUZZLEQ1:SWWM_KIRINPUZZLER1:SWWM_KIRINPUZZLER2:SWWM_KIRINPUZZLER3:SWWM_KIRINPUZZLES1:SWWM_KIRINPUZZLET1:SWWM_KIRINPUZZLEU1:SWWM_ZNVTXT1:SWWM_ZNVTXT2:SWWM_ZNVTXT3:SWWM_ZNVTXT4:SWWM_ZNVTXT5";
+ Array alldlg;
+ alldlg_pack.Split(alldlg,":");
+ for ( int i=0; i 3 ) Console.Printf("\cg%s exceeds line limit (%d > 3)\c-",alldlg[i],l.Count());
+ else
+ {
+ if ( !e.Args[0] )
+ {
+ l.Destroy();
+ continue;
+ }
+ Console.Printf("\cd%s is within line limit (%d <= 3)\c-",alldlg[i],l.Count());
+ }
+ for ( int j=0; j %s",l.StringAt(j));
+ l.Destroy();
+ }
+ return;
+ }
else if ( e.Name ~== "swwmprofilehandler" )
{
if ( multiplayer && (e.player != Net_Arbitrator) )
@@ -283,15 +319,13 @@ extend Class SWWMHandler
}
bprofiletics = profiletics = (e.Args[0]<=0)?10:e.Args[0];
profiling = true;
- worldtick_ms = 0;
- worldthingspawned_ms = 0;
- worldthingdestroyed_ms = 0;
- worldthingdied_ms = 0;
- worldthingdamaged_ms = 0;
- worldthingrevived_ms = 0;
- checkreplacement_ms = 0;
- checkreplacee_ms = 0;
- Console.Printf("Gathering data for %d tic(s)...",bprofiletics);
+ for ( int i=0; i<8; i++ )
+ {
+ prof_ms[i] = 0;
+ prof_avg[i] = 0;
+ prof_calls[i] = 0;
+ }
+ Console.Printf("Gathering data for %d tic%s...",bprofiletics,(bprofiletics>1)?"s":"");
return;
}
if ( e.IsManual ) return;
@@ -306,20 +340,26 @@ extend Class SWWMHandler
// drop the swapweapon if we own it first
if ( swwm_swapweapons && (item is 'SWWMWeapon') && (sw = SWWMWeapon(def).HasSwapWeapon(players[e.Args[0]].mo)) )
{
+ // special case, otherwise candy gun won't drop itself
+ if ( sw is 'CandyGun' ) CandyGun(sw).swapdrop = true;
bool swapto = (sw == players[e.Args[0]].ReadyWeapon) || (sw.SisterWeapon && (sw.Sisterweapon == players[e.Args[0]].ReadyWeapon));
int ngun = sw.Amount;
- double ang = -15*(ngun-1);
- for ( int i=0; i item = e.Name.Mid(10);
- if ( !item ) return;
- let def = GetDefaultByType(item);
- int amt = def.Amount;
- // if it's an ammo, check the largest unit givable
- if ( item is 'Ammo' )
- {
- for ( int i=0; i)(AllActorClasses[i]);
- if ( !a || (a.GetParentClass() != item) || (GetDefaultByType(a).Amount < amt) ) continue;
- amt = GetDefaultByType(a).Amount;
- }
- }
- if ( item is 'MagAmmo' )
- {
- for ( int i=0; i)(AllActorClasses[i]);
- if ( !a || (a.GetParentClass() != item) || (GetDefaultByType(a).Amount < amt) ) continue;
- amt = GetDefaultByType(a).Amount;
- }
- }
- Inventory ritm = players[e.Args[1]].mo.FindInventory(item);
- if ( ritm )
- {
- int maxgive = ritm.MaxAmount-ritm.Amount;
- if ( amt > maxgive ) amt = maxgive;
- }
- else if ( amt > def.MaxAmount ) amt = def.MaxAmount;
- bool rslt = false;
- Class giveitem = item;
- if ( item is 'HammerspaceEmbiggener' ) giveitem = 'TradedHammerspaceEmbiggener';
- if ( (amt > 0) && players[e.Args[1]].mo.GiveInventory(giveitem,amt,true) )
- {
- // if player currently has the dual wield weapon selected, switch over
- if ( item is 'SWWMWeapon' )
- {
- let c = Weapon(players[e.Args[0]].mo.FindInventory(item));
- if ( c.SisterWeapon && (players[e.Args[0]].ReadyWeapon == c.SisterWeapon) )
- {
- players[e.Args[0]].ReadyWeapon = c;
- players[e.Args[0]].SetPSprite(PSP_WEAPON,c.FindState("Ready"));
- players[e.Args[0]].SetPSprite(PSP_WEAPON+1,null); // delete left weapon psprite
- }
- }
- // if we're trading an embiggener, we need to readjust ammo
- if ( item is 'HammerspaceEmbiggener' )
- {
- let ritm = players[e.Args[0]].mo.FindInventory(item);
- for ( Inventory i=players[e.Args[0]].mo.Inv; i; i=i.Inv )
- {
- if ( !(i is 'Ammo') ) continue;
- if ( Ammo(i).BackpackMaxAmount > 0 )
- {
- double factor = (Ammo(i).BackpackMaxAmount-i.default.MaxAmount)/double(ritm.MaxAmount);
- i.MaxAmount = int(i.default.MaxAmount+(ritm.Amount-amt)*factor);
- }
- // drop excess ammo
- int excess = i.Amount-i.MaxAmount;
- if ( excess > 0 ) i.CreateTossable(excess);
- }
- }
- if ( item is 'CandyGun' )
- {
- // see if we can take a fully loaded spare from us instead
- int n = players[e.Args[0]].mo.CountInv('CandyGunSpares');
- int na = players[e.Args[0]].mo.CountInv('CandyGunAmmo');
- if ( (n >= amt) && (na >= amt) )
- {
- players[e.Args[0]].mo.TakeInventory('CandyGunSpares',amt);
- players[e.Args[0]].mo.TakeInventory('CandyGunAmmo',amt);
- }
- else players[e.Args[0]].mo.TakeInventory('CandyGun',amt);
- }
- else players[e.Args[0]].mo.TakeInventory(item,amt);
- // add to history
- SWWMTradeHistory.RegisterSend(players[e.Args[0]],players[e.Args[1]],item,amt);
- SWWMTradeHistory.RegisterReceive(players[e.Args[1]],players[e.Args[0]],item,amt);
- // add messages
- if ( e.Args[0] == consoleplayer ) Console.Printf(StringTable.Localize("$SWWM_MSGSENT"),amt,def.GetTag(),players[e.Args[1]].GetUserName());
- if ( e.Args[1] == consoleplayer ) Console.Printf(StringTable.Localize("$SWWM_MSGRECV"),players[e.Args[0]].GetUserName(),amt,def.GetTag());
- rslt = true;
- }
- if ( e.Args[0] == consoleplayer )
- {
- let t = new("MenuTransaction");
- t.uid = e.Args[2];
- t.type = MenuTransaction.TT_ITEMSEND;
- t.result = rslt;
- t.used = item;
- t.usedup = (players[e.Args[1]].mo.CountInv(item)<=0);
- checklist.Push(t);
- }
- }
else if ( e.Name.Left(17) ~== "swwmmarkloreread." )
{
let l = SWWMLoreLibrary.Find(players[e.Args[0]]);
@@ -513,7 +456,7 @@ extend Class SWWMHandler
{
t.result = (players[e.Args[0]].PendingWeapon==Weapon(i));
// dual wield gun support
- if ( (i is 'ExplodiumGun') && (players[e.Args[0]].PendingWeapon==Weapon(i).SisterWeapon) )
+ if ( (i is 'SWWMWeapon') && (players[e.Args[0]].PendingWeapon==Weapon(i).SisterWeapon) )
t.result = true;
}
else t.result = rslt;
@@ -593,14 +536,12 @@ extend Class SWWMHandler
else if ( e.Name.Left(16) ~== "swwmremoteliner." )
{
if ( consoleplayer == e.Args[0] ) return;
- if ( !swwm_othervoice ) return;
if ( swwm_mutevoice >= e.Args[1] ) return;
players[e.Args[0]].mo.A_StartSound(e.Name.Mid(16),CHAN_DEMOVOICE,attenuation:.5);
}
else if ( e.Name.Left(19) ~== "swwmremotelinertxt." )
{
if ( consoleplayer == e.Args[0] ) return;
- if ( !swwm_othervoice ) return;
if ( swwm_mutevoice >= e.Args[1] ) return;
double dist = players[consoleplayer].Camera.Distance3D(players[e.Args[0]].mo);
if ( dist < 2000 )
@@ -654,6 +595,11 @@ extend Class SWWMHandler
s.realpuzzlecnt = e.Args[2];
}
}
+ else if ( e.Name ~== "swwmsetoldcheat" )
+ {
+ let s = SWWMStats.Find(players[e.Args[0]]);
+ if ( s ) s.oldcheat = true;
+ }
// cheats go here
else CheatEvent(e);
}
@@ -683,5 +629,4 @@ extend Class SWWMHandler
}
return false;
}
-
}
diff --git a/zscript/handler/swwm_handler_replacements.zsc b/zscript/handler/swwm_handler_replacements.zsc
index 09ecb89db..a35e88814 100644
--- a/zscript/handler/swwm_handler_replacements.zsc
+++ b/zscript/handler/swwm_handler_replacements.zsc
@@ -3,6 +3,7 @@
extend Class SWWMHandler
{
bool nugflip; // h/a nugget flip-flop spawn counter
+ bool equinoxhack; // hackaround for UseInventory
private Class GetDRLAReplacee( Class a )
{
@@ -269,18 +270,18 @@ extend Class SWWMHandler
override void CheckReplacee( ReplacedEvent e )
{
- if ( profiling ) curms = MSTime();
+ if ( profiling ) ProfileTick();
if ( e.Replacement is 'DSparilHax' )
e.Replacee = 'Sorcerer2';
// drla stuff, needed so boss deaths work
if ( !hasdrlamonsters )
{
- if ( profiling ) checkreplacee_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_CHECKREPLACEE);
return;
}
let rep = GetDRLAReplacee(e.Replacement);
if ( rep ) e.Replacee = rep;
- if ( profiling ) checkreplacee_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_CHECKREPLACEE);
}
private Class GetDRLAReplacement( Class a )
@@ -548,11 +549,11 @@ extend Class SWWMHandler
override void CheckReplacement( ReplaceEvent e )
{
- if ( profiling ) curms = MSTime();
+ if ( profiling ) ProfileTick();
// respect final replacements
if ( e.IsFinal )
{
- if ( profiling ) checkreplacement_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_CHECKREPLACEMENT);
return;
}
// DRLA Monsters stuff
@@ -563,7 +564,7 @@ extend Class SWWMHandler
{
e.Replacement = rep;
e.IsFinal = true;
- if ( profiling ) checkreplacement_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_CHECKREPLACEMENT);
return;
}
}
@@ -575,7 +576,7 @@ extend Class SWWMHandler
{
if ( SWWMUtility.CheckDehackery(e.Replacee) )
{
- if ( profiling ) checkreplacement_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_CHECKREPLACEMENT);
return;
}
e.Replacement = 'SWWMHangingKeen';
@@ -584,16 +585,16 @@ extend Class SWWMHandler
{
if ( SWWMUtility.CheckDehackery(e.Replacee) )
{
- if ( profiling ) checkreplacement_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_CHECKREPLACEMENT);
return;
}
e.Replacement = 'SWWMBossBrain';
}
else if ( (e.Replacee is 'RedCard') && !(e.Replacee is 'ChexRedCard') )
{
- if ( level.GetChecksum() ~== "3805A661D5C4523AFF7BF86991071043" )
+ if ( !equinoxhack && (level.GetChecksum() ~== "3805A661D5C4523AFF7BF86991071043") )
{
- if ( profiling ) checkreplacement_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_CHECKREPLACEMENT);
return; // don't replace red key in Equinox MAP13
}
e.Replacement = 'SWWMRedCard';
@@ -705,12 +706,12 @@ extend Class SWWMHandler
else if ( e.Replacee is 'ArtiTeleport' ) e.Replacement = 'SafetyTether';
else
{
- if ( profiling ) checkreplacement_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_CHECKREPLACEMENT);
return;
}
// this last part is kind of ugly, but it works
// guarantees that OUR replacements are all final
e.IsFinal = true;
- if ( profiling ) checkreplacement_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_CHECKREPLACEMENT);
}
}
diff --git a/zscript/handler/swwm_handler_vanillaboss.zsc b/zscript/handler/swwm_handler_vanillaboss.zsc
index 9f3037f37..596b2ac56 100644
--- a/zscript/handler/swwm_handler_vanillaboss.zsc
+++ b/zscript/handler/swwm_handler_vanillaboss.zsc
@@ -410,6 +410,28 @@ extend Class SWWMHandler
if ( (!bossactors[i].target || !bossactors[i].CheckSight(bossactors[i].target,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY))
&& (!bossviewactor || (bossviewactor && !bossviewactor.target)) ) continue;
initialized = true;
+ // oneliners
+ if ( bossmap == MAP_DMAP30 )
+ {
+ highesttic = gametic;
+ lastcombat = AddOneliner("romero",1,200);
+ }
+ else if ( bossmap == MAP_HE3M8 )
+ {
+ highesttic = gametic;
+ if ( bosstag = "$BT_DSPARIL2" ) lastcombat = AddOneliner("dsparilb",1,100);
+ else lastcombat = AddOneliner("dsparila",1,80);
+ }
+ else if ( bossmap == MAP_HMAP40 )
+ {
+ highesttic = gametic;
+ lastcombat = AddOneliner("korax",1,40);
+ }
+ else if ( (bossmap == MAP_EVMAP30) && bossviewactor )
+ {
+ highesttic = gametic;
+ lastcombat = AddOneliner("archangelus",1,300);
+ }
break;
}
}
@@ -477,15 +499,13 @@ extend Class SWWMHandler
Screen.DrawTexture(bbar_d,false,vpos.x,vpos.y,DTA_VirtualWidthF,bar.ss.x,DTA_VirtualHeightF,bar.ss.y,DTA_KeepRatio,true,DTA_Alpha,bossalpha,DTA_WindowRight,dw);
Screen.DrawTexture(bbar_r,false,vpos.x,vpos.y,DTA_VirtualWidthF,bar.ss.x,DTA_VirtualHeightF,bar.ss.y,DTA_KeepRatio,true,DTA_Alpha,bossalpha,DTA_WindowRight,rw);
}
- Font barfnt = bar.LangFont(bar.mTewiFont);
- Font dmgfnt = bar.mTewiFont.mFont;
if ( (cummdamage > 0) && (gametic < lastcummtic+150) )
{
double calph = clamp(((lastcummtic+150)-gametic)/50.,0.,1.);
string dnum = String.Format("%d",cummdamage);
- Screen.DrawText(dmgfnt,Font.CR_RED,vpos.x+300-dmgfnt.StringWidth(dnum),vpos.y-(dmgfnt.GetHeight()+2),dnum,DTA_VirtualWidthF,bar.ss.x,DTA_VirtualHeightF,bar.ss.y,DTA_KeepRatio,true,DTA_Alpha,bossalpha*calph);
+ Screen.DrawText(smallfont,Font.CR_RED,vpos.x+300-smallfont.StringWidth(dnum),vpos.y-(smallfont.GetHeight()+2),dnum,DTA_VirtualWidthF,bar.ss.x,DTA_VirtualHeightF,bar.ss.y,DTA_KeepRatio,true,DTA_Alpha,bossalpha*calph);
}
- Screen.DrawText(barfnt,Font.CR_WHITE,vpos.x,vpos.y-(barfnt.GetHeight()+2),StringTable.Localize(swwm_funtags?(bosstag.."_FUN"):bosstag),DTA_VirtualWidthF,bar.ss.x,DTA_VirtualHeightF,bar.ss.y,DTA_KeepRatio,true,DTA_Alpha,bossalpha);
+ Screen.DrawText(smallfont,Font.CR_WHITE,vpos.x,vpos.y-(smallfont.GetHeight()+2),StringTable.Localize(swwm_funtags?(bosstag.."_FUN"):bosstag),DTA_VirtualWidthF,bar.ss.x,DTA_VirtualHeightF,bar.ss.y,DTA_KeepRatio,true,DTA_Alpha,bossalpha);
}
// can't use this until I actually figure out how to make those walls damageable
diff --git a/zscript/handler/swwm_handler_worldload.zsc b/zscript/handler/swwm_handler_worldload.zsc
index 2b28564c0..6eca72a1c 100644
--- a/zscript/handler/swwm_handler_worldload.zsc
+++ b/zscript/handler/swwm_handler_worldload.zsc
@@ -95,7 +95,7 @@ extend Class SWWMHandler
else if ( level.levelnum == 32 ) s.nazicleanup |= 2;
}
if ( s.nazicleanup == 3 )
- SWWMUtility.MarkAchievement('swwm_achievement_trash',s.myplayer);
+ SWWMUtility.MarkAchievement("trash",s.myplayer);
}
// reset score on dead players (death exit™)
for ( int i=0; i 0) && !(level.clusterflags&LevelLocals.CLUSTER_HUB) )
{
@@ -131,31 +134,31 @@ extend Class SWWMHandler
}
if ( collected ) break;
}
- if ( !collected ) SWWMUtility.MarkAchievement('swwm_achievement_cliffyb',players[consoleplayer]);
+ if ( !collected ) SWWMUtility.MarkAchievement("cliffyb",players[consoleplayer]);
}
// these can't be done on hexen
if ( gameinfo.GameType&GAME_Hexen ) return;
// beat the par time?
if ( level.partime && (Thinker.Tics2Seconds(level.maptime) <= level.partime) )
- SWWMUtility.AchievementProgressInc('swwm_progress_par',1,players[consoleplayer]);
+ SWWMUtility.AchievementProgressInc("par",1,players[consoleplayer]);
// blaze it?
if ( Thinker.Tics2Seconds(level.maptime) == 260 )
- SWWMUtility.MarkAchievement('swwm_achievement_blaze',players[consoleplayer]);
+ SWWMUtility.MarkAchievement("blaze",players[consoleplayer]);
// one standing?
if ( (level.total_monsters-level.killed_monsters) == 1 )
- SWWMUtility.MarkAchievement('swwm_achievement_onestanding',players[consoleplayer]);
+ SWWMUtility.MarkAchievement("onestanding",players[consoleplayer]);
// nice?
if ( players[consoleplayer].Health == 69 )
- SWWMUtility.MarkAchievement('swwm_achievement_nice',players[consoleplayer]);
+ SWWMUtility.MarkAchievement("nice",players[consoleplayer]);
// peaceful/untouchable?
if ( !dealtdamage[consoleplayer] )
- SWWMUtility.MarkAchievement('swwm_achievement_peace',players[consoleplayer]);
+ SWWMUtility.MarkAchievement("peace",players[consoleplayer]);
if ( !reallytookdamage[consoleplayer] )
- SWWMUtility.MarkAchievement('swwm_achievement_untouchable',players[consoleplayer]);
+ SWWMUtility.MarkAchievement("untouchable",players[consoleplayer]);
// in a hurry?
if ( ((level.total_monsters > 0) || (level.total_items > 0) || (level.total_secrets > 0))
&& (level.killed_monsters == 0) && (level.found_items == 0) && (level.found_secrets == 0) )
- SWWMUtility.MarkAchievement('swwm_achievement_hurry',players[consoleplayer]);
+ SWWMUtility.MarkAchievement("hurry",players[consoleplayer]);
}
private void SetupLockdefsCache( SWWMCachedLockInfo cli )
@@ -237,6 +240,11 @@ extend Class SWWMHandler
if ( (level.GetChecksum() ~== "F286BABF0D152259CD6B996E8920CA70")
|| (level.GetChecksum() ~== "A52BD2038CF814101AAB7D9C78F9ACE2") )
level.ExecuteSpecial(ACS_Execute,null,null,false,-Int('DVACATION_UNFUCK'));
+ // DUMP 2 and 3 hackaround for the "X maps to go" text being actually readable
+ else if ( level.GetChecksum() ~== "BC2878CDB82712598A2196807D099C40" )
+ level.ExecuteSpecial(ACS_Execute,null,null,false,-Int('DUMP2_HUB'));
+ else if ( level.GetChecksum() ~== "7E77AA43AF7ACDBC52171E9EE2BF98D0" )
+ level.ExecuteSpecial(ACS_Execute,null,null,false,-Int('DUMP3_HUB'));
// rampancy boss brain fix (repeatedly triggering "map clear")
let ti = ThinkerIterator.Create("Actor");
Actor a, brain;
@@ -297,8 +305,10 @@ extend Class SWWMHandler
let a = SWWMTeleportLine(Actor.Spawn("SWWMTeleportLine"));
a.tline = l;
}
- if ( !SWWMUtility.IsExitLine(l) )
- continue;
+ bool isexit;
+ int exittype;
+ [isexit, exittype] = SWWMUtility.IsExitLine(l);
+ if ( !isexit ) continue;
if ( skipme.Find(l) < skipme.Size() ) continue;
skipme.Push(l);
// look for connected lines
@@ -362,7 +372,7 @@ extend Class SWWMHandler
for ( int i=0; i= 1000) || e.Thing.FindInventory("BossMarker")) && (alreadygold.Find(e.Thing) == alreadygold.Size()) )
{
// make sure we can't farm drops from revivable enemies
@@ -142,7 +142,7 @@ extend Class SWWMHandler
bool gotgibbed = (!e.Thing.bDONTGIB && ((e.Inflictor && e.Inflictor.bEXTREMEDEATH) || (e.DamageSource && e.DamageSource.bEXTREMEDEATH) || (e.DamageType == 'Extreme') || (e.Thing.Health < gibhealth)) && (!e.Inflictor || !e.Inflictor.bNOEXTREMEDEATH) && (!e.DamageSource || !e.DamageSource.bNOEXTREMEDEATH));
if ( !gotgibbed )
{
- if ( profiling ) worldthingdied_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_WORLDTHINGDIED);
return;
}
if ( (e.Thing.GetClass() == "Demon") || (e.Thing.GetClass() == "Spectre") )
@@ -161,7 +161,7 @@ extend Class SWWMHandler
ExtraGibDeaths.GibThis(e.Thing,"ArachXDeath");
else if ( e.Thing.GetClass() == "Fatso" )
ExtraGibDeaths.GibThis(e.Thing,"FatsoXDeath");
- if ( profiling ) worldthingdied_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_WORLDTHINGDIED);
}
private void DoKeyTagFix( Actor a )
@@ -228,13 +228,13 @@ extend Class SWWMHandler
override void WorldThingDestroyed( WorldEvent e )
{
- if ( profiling ) curms = MSTime();
+ if ( profiling ) ProfileTick();
// for gibber throttling
if ( e.Thing is 'mkBloodDrop' ) blods_realcnt--;
else if ( e.Thing is 'mkFlyingGib' ) meats_realcnt--;
if ( !e.Thing.default.bSHOOTABLE && !e.Thing.default.bMISSILE && !(e.Thing is 'Inventory') && !SWWMUtility.IsBeamProj(e.Thing) )
{
- if ( profiling ) worldthingdestroyed_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_WORLDTHINGDESTROYED);
return;
}
// remove from suckables
@@ -245,18 +245,18 @@ extend Class SWWMHandler
pos = beams.Find(e.Thing);
if ( pos < beams.Size() )
beams.Delete(pos);
- if ( profiling ) worldthingdestroyed_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_WORLDTHINGDESTROYED);
}
override void WorldThingSpawned( WorldEvent e )
{
- if ( profiling ) curms = MSTime();
+ if ( profiling ) ProfileTick();
// for gibber throttling
if ( e.Thing is 'mkBloodDrop' ) blods_realcnt++;
else if ( e.Thing is 'mkFlyingGib' ) meats_realcnt++;
if ( !e.Thing || SuppressMultiItem(e) )
{
- if ( profiling ) worldthingspawned_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_WORLDTHINGSPAWNED);
return;
}
IWantDieSpawn(e);
@@ -275,7 +275,7 @@ extend Class SWWMHandler
p.SetStateLabel("Pickup");
}
}
- if ( swwm_doomfall && e.Thing.bISMONSTER )
+ if ( swwm_doomfall && e.Thing.bISMONSTER && !e.Thing.bBOSS )
e.Thing.bFALLDAMAGE = true;
if ( e.Thing is 'Key' )
{
@@ -441,6 +441,6 @@ extend Class SWWMHandler
trk.maxhealth = trk.lasthealth = e.Thing.Health;
trk.intp.Reset(trk.lasthealth);
}
- if ( profiling ) worldthingspawned_ms += MSTime()-curms;
+ if ( profiling ) ProfileTock(PT_WORLDTHINGSPAWNED);
}
}
diff --git a/zscript/handler/swwm_handler_worldtick.zsc b/zscript/handler/swwm_handler_worldtick.zsc
index 6b36fea80..54785f37c 100644
--- a/zscript/handler/swwm_handler_worldtick.zsc
+++ b/zscript/handler/swwm_handler_worldtick.zsc
@@ -57,7 +57,7 @@ extend Class SWWMHandler
allitems = true;
Console.Printf(StringTable.Localize("$SWWM_LASTITEM"),players[i].GetUserName(),500);
score += 490;
- SWWMUtility.AchievementProgressInc('swwm_progress_allitems',1,players[i]);
+ SWWMUtility.AchievementProgressInc("allitems",1,players[i]);
}
SWWMCredits.Give(players[i],score);
SWWMScoreObj.Spawn(score,players[i].mo.Vec3Offset(0,0,players[i].mo.Height/2));
@@ -97,7 +97,8 @@ extend Class SWWMHandler
// add new entries
if ( !cti ) cti = ThinkerIterator.Create("Actor");
else cti.Reinit();
- Actor a;
+ Actor a, keyactor = null;
+ bool bossfound = false;
while ( a = Actor(cti.Next()) )
{
if ( !a.player && !a.bISMONSTER ) continue;
@@ -125,10 +126,12 @@ extend Class SWWMHandler
combatactors.Push(a);
combattics.Push(gametic);
enteredcombat = true;
+ if ( a.bBOSS || a.FindInventory("BossMarker") )
+ bossfound = true;
}
}
// be smart, demo-chan, don't shout if you're invisible, or you'll make it worse
- if ( enteredcombat && (!highesttic || (gametic > highesttic+700)) && !players[consoleplayer].mo.FindInventory("GhostPower") )
+ if ( enteredcombat && ((bossfound && (!lastcombat || (gametic > lastcombat+240))) || (!bossfound && (!highesttic || (gametic > highesttic+700)))) && !players[consoleplayer].mo.FindInventory("GhostPower") )
lastcombat = AddOneliner("fightstart",1,10);
}
@@ -217,7 +220,78 @@ extend Class SWWMHandler
if ( s.deaths > 0 )
return;
}
- SWWMUtility.MarkAchievement('swwm_achievement_wantdie',players[consoleplayer]);
+ SWWMUtility.MarkAchievement("wantdie",players[consoleplayer]);
+ }
+
+ private void UpdateHUDObjects()
+ {
+ // score objects
+ SWWMScoreObj so = scorenums;
+ SWWMScoreObj soprev = null, sonext;
+ while ( so )
+ {
+ sonext = so.next;
+ if ( so.Tick() )
+ {
+ if ( soprev ) soprev.next = sonext;
+ else scorenums = sonext;
+ so.Destroy();
+ scorenums_cnt--;
+ }
+ else soprev = so;
+ so = sonext;
+ }
+ so = damnums;
+ soprev = null;
+ while ( so )
+ {
+ sonext = so.next;
+ if ( so.Tick() )
+ {
+ if ( soprev ) soprev.next = sonext;
+ else damnums = sonext;
+ so.Destroy();
+ scorenums_cnt--;
+ }
+ else soprev = so;
+ so = sonext;
+ }
+ // interest markers
+ SWWMInterest ip = intpoints;
+ SWWMInterest ipprev = null, ipnext;
+ while ( ip )
+ {
+ ipnext = ip.next;
+ if ( ip.Tick() )
+ {
+ if ( ipprev ) ipprev.next = ipnext;
+ else intpoints = ipnext;
+ ip.Destroy();
+ intpoints_cnt--;
+ }
+ else ipprev = ip;
+ ip = ipnext;
+ }
+ // combat trackers
+ SWWMCombatTracker trk = trackers;
+ SWWMCombatTracker trkprev = null, trknext;
+ int dbar = swwm_damagetarget;
+ int mxdist = swwm_maxtargetdist;
+ while ( trk )
+ {
+ trknext = trk.next;
+ trk.dbar = dbar;
+ trk.mxdist = mxdist;
+ if ( trk.Tick() )
+ {
+ if ( trkprev ) trkprev.next = trknext;
+ else trackers = trknext;
+ trk.Destroy();
+ trackers_cnt--;
+ }
+ else trkprev = trk;
+ trk = trknext;
+ }
}
// "simple" tracking (used by the minimap)
@@ -235,7 +309,6 @@ extend Class SWWMHandler
return;
}
// update trackers for anything around the player
- bool thesight = players[consoleplayer].mo.FindInventory("Omnisight");
double viewdist = SWWMStatusBar.MAPVIEWDIST*swwm_mm_zoom;
BlockThingsIterator bt = BlockThingsIterator.Create(players[consoleplayer].Camera,viewdist);
while ( bt.Next() )
@@ -251,7 +324,7 @@ extend Class SWWMHandler
continue;
if ( !a.player && !a.bSOLID && !a.bSHOOTABLE && !a.bISMONSTER && !a.bFRIENDLY && !(a is 'Inventory') && !(a is 'Chancebox') )
continue;
- if ( !thesight && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !(a.IsFriend(players[consoleplayer].mo) && !(a.player && (a.player.mo != a))) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
+ if ( !level.allmap && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !(a.IsFriend(players[consoleplayer].mo) && !(a.player && (a.player.mo != a))) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
if ( a.bKILLED || (a.Health <= 0) || a.bUnmorphed )
continue;
@@ -269,7 +342,7 @@ extend Class SWWMHandler
Vector2 rv = a.pos.xy-players[consoleplayer].Camera.pos.xy;
if ( max(abs(rv.x)-a.radius,abs(rv.y)-a.radius) > viewdist )
continue;
- if ( !thesight && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
+ if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
SWWMSimpleTracker.Track(a);
}
@@ -281,7 +354,7 @@ extend Class SWWMHandler
double rad = a.speed*cos(a.pitch);
if ( max(abs(rv.x)-rad,abs(rv.y)-rad) > viewdist )
continue;
- if ( !thesight && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
+ if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
SWWMSimpleTracker.Track(a);
}
@@ -309,7 +382,7 @@ extend Class SWWMHandler
continue;
if ( !a.player && !a.bSOLID && !a.bSHOOTABLE && !a.bISMONSTER && !a.bFRIENDLY && !(a is 'Inventory') && !(a is 'Chancebox') )
continue;
- if ( !thesight && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !a.IsFriend(players[consoleplayer].mo) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
+ if ( !level.allmap && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !a.IsFriend(players[consoleplayer].mo) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
if ( a.bKILLED || (a.Health <= 0) || a.bUnmorphed )
continue;
@@ -327,7 +400,7 @@ extend Class SWWMHandler
Vector2 rv = a.pos.xy-relpos;
if ( max(abs(rv.x)-a.radius,abs(rv.y)-a.radius) > viewdist )
continue;
- if ( !thesight && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
+ if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
SWWMSimpleTracker.Track(a);
}
@@ -339,16 +412,17 @@ extend Class SWWMHandler
double rad = a.speed*cos(a.pitch);
if ( max(abs(rv.x)-rad,abs(rv.y)-rad) > viewdist )
continue;
- if ( !thesight && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
+ if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
SWWMSimpleTracker.Track(a);
}
}
}
SWWMSimpleTracker trk = strackers;
+ SWWMSimpleTracker prev = null, next;
while ( trk )
{
- SWWMSimpleTracker next = trk.next;
+ next = trk.next;
// minimize lifespan of destroyed targets
if ( !trk.target ) trk.lastupdate = min(trk.lastupdate,level.maptime);
else if ( !trk.expired )
@@ -364,12 +438,12 @@ extend Class SWWMHandler
// prune expired trackers
if ( trk.lastupdate+140 < level.maptime )
{
- if ( !trk.prev ) strackers = trk.next;
- else trk.prev.next = trk.next;
- if ( trk.next ) trk.next.prev = trk.prev;
+ if ( !prev ) strackers = trk.next;
+ else prev.next = trk.next;
trk.Destroy();
strackers_cnt--;
}
+ else prev = trk;
trk = next;
}
}
diff --git a/zscript/handler/swwm_statichandler_achievements.zsc b/zscript/handler/swwm_statichandler_achievements.zsc
index f0fc8d018..1d62a9ba5 100644
--- a/zscript/handler/swwm_statichandler_achievements.zsc
+++ b/zscript/handler/swwm_statichandler_achievements.zsc
@@ -1,32 +1,63 @@
// achievement tracking
+Class SWWMAchievementInfo
+{
+ int baseindex; // sorting order in the list
+ String basename; // base name for identifying achievement
+ TextureID icon; // our icon
+ int maxval; // maximum value (0: no progress)
+ bool hasformat; // achievement description text must be formatted to add maxval
+ bool bitfield; // progress is tracked as a bitfield
+ int state, val; // set by other scripts, used to avoid excessive dictionary lookups
+}
+
extend Class SWWMStaticHandler
{
ui int lastachievementnotify; // prevent overlap
- Array achievements;
+ Dictionary achievementstate, achievementprogress;
+ Array achievementinfo; // specific info on achievements
- private ui bool CheckAchievement( SWWMAchievement a )
+ private ui bool CheckAchievement( SWWMAchievementInfo a )
{
- int val = a.state.GetInt();
+ int val = achievementstate.At(a.basename).ToInt();
// manually check progress
- if ( a.progress )
+ if ( a.maxval )
{
- int prog = a.progress.GetInt();
- // special cases
- if ( val && (prog < a.maxval) )
+ int prog = achievementprogress.At(a.basename).ToInt();
+ // special case for bitfields
+ if ( a.bitfield )
{
- a.state.SetInt(0);
- val = 0;
+ int pb = 0;
+ for ( int i=0; i= a.maxval) )
+ {
+ achievementstate.Insert(a.basename,"1");
+ val = 1;
+ }
}
- else if ( !val && (prog >= a.maxval) )
+ else
{
- a.state.SetInt(1);
- val = 1;
+ if ( val && (prog < a.maxval) )
+ {
+ achievementstate.Insert(a.basename,"0");
+ val = 0;
+ }
+ else if ( !val && (prog >= a.maxval) )
+ {
+ achievementstate.Insert(a.basename,"1");
+ val = 1;
+ }
}
}
if ( (val == 1) && (gametic > lastachievementnotify) )
{
- a.state.SetInt(2);
+ achievementstate.Insert(a.basename,"2");
EventHandler.SendNetworkEvent("swwmachievement."..a.basename,consoleplayer);
let notif = new("SWWMAchievementNotification").Init(a.basename,a.icon,a.hasformat?a.maxval:0);
StatusBar.AttachMessage(notif,-3478);
@@ -39,38 +70,296 @@ extend Class SWWMStaticHandler
{
// don't check constantly, and don't check during level transitions
if ( unloading || (maptime < 105) || (maptime%35) ) return;
- // first load
- if ( achievements.Size() <= 0 ) SWWMUtility.LoadAchievements(achievements);
bool alldone = true;
int ev = -1;
- for ( int i=0; i lastachievementnotify) )
{
- achievements[ev].state.SetInt(2);
- EventHandler.SendNetworkEvent("swwmachievement."..achievements[ev].basename,consoleplayer);
- let notif = new("SWWMAchievementNotification").Init(achievements[ev].basename,achievements[ev].icon);
+ achievementstate.Insert("everything","2");
+ EventHandler.SendNetworkEvent("swwmachievement."..achievementinfo[ev].basename,consoleplayer);
+ let notif = new("SWWMAchievementNotification").Init(achievementinfo[ev].basename,achievementinfo[ev].icon);
StatusBar.AttachMessage(notif,-3478);
lastachievementnotify = gametic+200;
}
}
+
+ // parses achievements.lst file(s)
+ private void ParseAchievementList( out Array achievements )
+ {
+ achievements.Clear();
+ let lmp = Wads.FindLump("achievements.lst");
+ if ( lmp == -1 ) ThrowAbortException("'achievements.lst' not found");
+ String dat;
+ Array list, ln;
+ int bidx = 0;
+ while ( lmp != -1 )
+ {
+ dat = Wads.ReadLump(lmp);
+ // fucking Windows
+ dat.Replace("\r","");
+ list.Clear();
+ dat.Split(list,"\n");
+ for ( int i=0; i)(AllActorClasses[i]);
+ if ( !c || (c == 'SWWMCollectible') ) continue;
+ let def = GetDefaultByType(c);
+ // check that we can collect it in this IWAD
+ if ( !def.ValidGame() ) continue;
+ nc++;
+ }
+ ac.maxval = nc;
+ }
+ // bitfield
+ else if ( ac.maxval < -1 )
+ {
+ ac.bitfield = true;
+ ac.maxval = abs(ac.maxval);
+ }
+ ac.hasformat = (ln[2]~=="yes");
+ achievements.Push(ac);
+ bidx++;
+ }
+ lmp = Wads.FindLump("achievements.lst",lmp+1);
+ }
+ }
+
+ // load all achievement state and progress
+ private void LoadAchievements()
+ {
+ String statestr = swwm_achievementstate;
+ String progstr = swwm_achievementprogress;
+ // invalid length?
+ if ( (statestr.length()%2) || (progstr.length()%2) )
+ {
+ CreateAchievements();
+ return;
+ }
+ // decode
+ static const int cypher[] = {0xAD,0xEA,0xDB,0xED};
+ String nstr = "";
+ for ( int i=0; i keys;
+ keys.Clear();
+ statestr.Split(keys,",");
+ for ( int i=0; i= 2 ) Console.Printf("Deleting bogus achievement state %s = %s",key,di.Value());
+ achievementstate.Remove(key);
+ }
+ }
+ di = DictionaryIterator.Create(achievementprogress);
+ while ( di.Next() )
+ {
+ String key = di.Key();
+ bool deleteme = true;
+ for ( int i=0; i= 2 ) Console.Printf("Deleting bogus achievement progress %s = %s",key,di.Value());
+ achievementprogress.Remove(key);
+ }
+ }
+ for ( int i=0; i= 2 ) Console.Printf("Adding missing achievement state %s",achievementinfo[i].basename);
+ achievementstate.Insert(achievementinfo[i].basename,"0");
+ }
+ if ( achievementinfo[i].maxval && (achievementprogress.At(achievementinfo[i].basename) == "") )
+ {
+ if ( developer >= 2 ) Console.Printf("Adding missing achievement progress %s",achievementinfo[i].basename);
+ achievementprogress.Insert(achievementinfo[i].basename,"0");
+ }
+ }
+ }
+
+ // save all achievement state and progress
+ private void SaveAchievements()
+ {
+ String statestr = achievementstate.ToString();
+ String progstr = achievementprogress.ToString();
+ // trim unneeded json stuff
+ statestr.Replace("{","");
+ statestr.Replace("}","");
+ statestr.Replace("\"","");
+ progstr.Replace("{","");
+ progstr.Replace("}","");
+ progstr.Replace("\"","");
+ // cheap encode
+ static const int cypher[] = {0xAD,0xEA,0xDB,0xED};
+ String nstr = "";
+ for ( int i=0; i>4)+0x41;
+ nstr.AppendFormat("%c%c",b,c);
+ }
+ statestr = nstr;
+ nstr = "";
+ for ( int i=0; i>4)+0x41;
+ nstr.AppendFormat("%c%c",b,c);
+ }
+ progstr = nstr;
+ let cv = CVar.FindCVar('swwm_achievementstate');
+ cv.SetString(statestr);
+ cv = CVar.FindCVar('swwm_achievementprogress');
+ cv.SetString(progstr);
+ }
+
+ // blank achievement creation, used if loading fails
+ private void CreateAchievements()
+ {
+ achievementstate = Dictionary.Create();
+ achievementprogress = Dictionary.Create();
+ ParseAchievementList(achievementinfo);
+ for ( int i=0; i 1 ) nstr.AppendFormat(" (x%d)",rep);
+ l = SmallFont.BreakLines(nstr,(type==PRINT_LOW)?sz:361);
+ if ( type != PRINT_LOW ) ls = SmallFont.BreakLines(nstr,211);
+ }
}
Class SWWMStatusBar : BaseStatusBar
{
TextureID StatusTex, WeaponTex, ScoreTex[3], InventoryTex, ChatTex[6],
HealthTex[6], FuelTex[2], DashTex, EnemyBTex, EnemyHTex[6],
- GenericAmmoTex[3], MiniBox, AutoPage, PauseTex, bgtex;
- HUDFont mTewiFont, mMiniwiFont, mMPlusFont, mk6x8Font;
+ GenericAmmoTex[3], MiniBox, AutoPage, bgtex;
Array MainQueue, PickupQueue;
@@ -25,18 +45,26 @@ Class SWWMStatusBar : BaseStatusBar
SWWMHandler hnd;
// shared stuff
- Vector2 ss, hs;
- Vector2 ssb, hsb;
- Vector2 ssn, hsn;
- Vector2 sss, hss;
- Vector2 ssi, hsi;
- Vector2 ssd, hsd;
+ double hs;
+ double hsb;
+ double hsn;
+ double hss;
+ double hsi;
+ double hsd;
+ Vector2 ss;
+ Vector2 ssb;
+ Vector2 ssn;
+ Vector2 sss;
+ Vector2 ssi;
+ Vector2 ssd;
int margin;
double FracTic;
double FrameTime;
int PrevFrame;
int chatopen;
bool camhidden;
+ int pausetime;
+ Vector2 pausepos, pausedir;
// shared from renderunderlay, needed for proper interpolation of some things
Vector3 viewpos, viewrot;
@@ -53,12 +81,15 @@ Class SWWMStatusBar : BaseStatusBar
String midstr;
int midtic, midtype;
+ transient BrokenLines midl;
+ int midsz;
bool koraxhack, mainframehack, bosshack;
int puzzlecnt, realpuzzlecnt;
SWWMWeaponTooltip ctip;
+ transient ThinkerIterator mi; // for map markers
double minimapzoom, oldminimapzoom;
// minimap constants
const CLIPDIST = 800; // clip distance for minimap view, with rotation accounted
@@ -77,19 +108,6 @@ Class SWWMStatusBar : BaseStatusBar
Array teamactive;
Array teamscore;
- // if playing in Japanese, returns an alternate font of the same height
- // Tewi -> MPlus
- // Miniwi -> k6x8
- Font LangFont( HUDFont req )
- {
- if ( language ~== "jp" )
- {
- if ( req == mMiniwiFont ) return mk6x8Font.mFont;
- return mMPlusFont.mFont;
- }
- return req.mFont;
- }
-
override void FlushNotify()
{
// flush interpolators (useful since this virtual gets called
@@ -154,6 +172,59 @@ Class SWWMStatusBar : BaseStatusBar
AttachMessage(m,-1232);
return true;
}
+ else if ( msg.Left(25) ~== "swwmsilverbulleteasteregg" )
+ {
+ m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ let num = msg.Mid(25).ToInt();
+ switch ( num )
+ {
+ case 1:
+ default:
+ m.seqname = "SAYAWASTEA";
+ m.seqcnt = 1;
+ m.delay = 5;
+ m.startdelay = 10;
+ m.enddelay = 25;
+ break;
+ case 2:
+ m.seqname = "SAYAWASTEB";
+ m.seqcnt = 1;
+ m.delay = 10;
+ m.startdelay = 20;
+ m.enddelay = 30;
+ break;
+ case 3:
+ m.seqname = "SAYAWASTEC";
+ m.seqcnt = 1;
+ m.delay = 30;
+ m.startdelay = 15;
+ m.enddelay = 25;
+ break;
+ case 4:
+ m.seqname = "SAYAWASTED";
+ m.seqcnt = 2;
+ m.delay = 40;
+ m.startdelay = 10;
+ m.enddelay = 20;
+ break;
+ case 5:
+ m.seqname = "SAYAWASTEE";
+ m.seqcnt = 1;
+ m.delay = 20;
+ m.startdelay = 10;
+ m.enddelay = 30;
+ break;
+ case 6:
+ m.seqname = "SAYAWASTEF";
+ m.seqcnt = 1;
+ m.delay = 50;
+ m.startdelay = 20;
+ m.enddelay = 30;
+ break;
+ }
+ AttachMessage(m,-1232);
+ return true;
+ }
// check for Korax lines, add them to chat (and reply to some of them)
bool koraxline = false;
if ( msg == StringTable.Localize("$TXT_ACS_MAP02_9_GREET") )
@@ -162,75 +233,81 @@ Class SWWMStatusBar : BaseStatusBar
{
EventHandler.SendNetworkEvent("swwmkoraxline",0,consoleplayer);
koraxline = true;
- m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m.seqname = "SAYAGREETA";
- m.seqcnt = 3;
- m.delay = 150;
- AttachMessage(m,-1232);
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
- m2.seqname = "SAYAGREETB";
- m2.seqcnt = 1;
- m2.delay = 20;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m2.seqname = "SAYAGREETC";
- m2.seqcnt = 1;
- m2.delay = 20;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
- m2.seqname = "SAYAGREETD";
- m2.seqcnt = 1;
- m2.delay = 30;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m2.seqname = "SAYAGREETE";
- m2.seqcnt = 1;
- m2.delay = 20;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
- m2.seqname = "SAYAGREETF";
- m2.seqcnt = 1;
- m2.delay = 30;
- m.nextmsg = m2;
- m.nextdirect = true;
+ if ( !swwm_nomapmsg )
+ {
+ m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m.seqname = "SAYAGREETA";
+ m.seqcnt = 3;
+ m.delay = 150;
+ AttachMessage(m,-1232);
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
+ m2.seqname = "SAYAGREETB";
+ m2.seqcnt = 1;
+ m2.delay = 20;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m2.seqname = "SAYAGREETC";
+ m2.seqcnt = 1;
+ m2.delay = 20;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
+ m2.seqname = "SAYAGREETD";
+ m2.seqcnt = 1;
+ m2.delay = 30;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m2.seqname = "SAYAGREETE";
+ m2.seqcnt = 1;
+ m2.delay = 20;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
+ m2.seqname = "SAYAGREETF";
+ m2.seqcnt = 1;
+ m2.delay = 30;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ }
}
else if ( msg == StringTable.Localize("$TXT_ACS_MAP13_11_MYSER") )
{
EventHandler.SendNetworkEvent("swwmkoraxline",1,consoleplayer);
koraxline = true;
- m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m.seqname = "SAYABLOODA";
- m.seqcnt = 2;
- m.delay = 220;
- AttachMessage(m,-1232);
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_IBUKISNAME"),StringTable.Localize("$SWWM_IBUKINAME"),"Ibuki");
- m2.seqname = "SAYABLOODB";
- m2.seqcnt = 1;
- m2.delay = 20;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m2.seqname = "SAYABLOODC";
- m2.seqcnt = 1;
- m2.delay = 30;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_IBUKISNAME"),StringTable.Localize("$SWWM_IBUKINAME"),"Ibuki");
- m2.seqname = "SAYABLOODD";
- m2.seqcnt = 1;
- m2.delay = 20;
- m.nextmsg = m2;
- m.nextdirect = true;
+ if ( !swwm_nomapmsg )
+ {
+ m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m.seqname = "SAYABLOODA";
+ m.seqcnt = 2;
+ m.delay = 220;
+ AttachMessage(m,-1232);
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_IBUKISNAME"),StringTable.Localize("$SWWM_IBUKINAME"),"Ibuki");
+ m2.seqname = "SAYABLOODB";
+ m2.seqcnt = 1;
+ m2.delay = 20;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m2.seqname = "SAYABLOODC";
+ m2.seqcnt = 1;
+ m2.delay = 30;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_IBUKISNAME"),StringTable.Localize("$SWWM_IBUKINAME"),"Ibuki");
+ m2.seqname = "SAYABLOODD";
+ m2.seqcnt = 1;
+ m2.delay = 20;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ }
}
else if ( msg == StringTable.Localize("$TXT_ACS_MAP22_27_YOUHA") )
koraxline = true;
@@ -238,24 +315,27 @@ Class SWWMStatusBar : BaseStatusBar
{
EventHandler.SendNetworkEvent("swwmkoraxline",2,consoleplayer);
koraxline = true;
- m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m.seqname = "SAYAGAMEA";
- m.seqcnt = 2;
- m.delay = 200;
- AttachMessage(m,-1232);
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_IBUKISNAME"),StringTable.Localize("$SWWM_IBUKINAME"),"Ibuki");
- m2.seqname = "SAYAGAMEB";
- m2.seqcnt = 1;
- m2.delay = 30;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m2.seqname = "SAYAGAMEC";
- m2.seqcnt = 1;
- m2.delay = 20;
- m.nextmsg = m2;
- m.nextdirect = true;
+ if ( !swwm_nomapmsg )
+ {
+ m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m.seqname = "SAYAGAMEA";
+ m.seqcnt = 2;
+ m.delay = 200;
+ AttachMessage(m,-1232);
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_IBUKISNAME"),StringTable.Localize("$SWWM_IBUKINAME"),"Ibuki");
+ m2.seqname = "SAYAGAMEB";
+ m2.seqcnt = 1;
+ m2.delay = 30;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m2.seqname = "SAYAGAMEC";
+ m2.seqcnt = 1;
+ m2.delay = 20;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ }
}
else if ( msg == StringTable.Localize("$TXT_ACS_MAP27_8_WORSH") )
koraxline = true;
@@ -263,33 +343,36 @@ Class SWWMStatusBar : BaseStatusBar
{
EventHandler.SendNetworkEvent("swwmkoraxline",3,consoleplayer);
koraxline = true;
- m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
- m.seqname = "KIRINWORSHIPA";
- m.seqcnt = 1;
- m.delay = 150;
- AttachMessage(m,-1232);
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m2.seqname = "KIRINWORSHIPB";
- m2.seqcnt = 1;
- m2.delay = 40;
- m2.enddelay = 10;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
- m2.seqname = "KIRINWORSHIPC";
- m2.seqcnt = 1;
- m2.delay = 10;
- m2.enddelay = 20;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m2.seqname = "KIRINWORSHIPD";
- m2.seqcnt = 2;
- m2.delay = 10;
- m.nextmsg = m2;
- m.nextdirect = true;
+ if ( !swwm_nomapmsg )
+ {
+ m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
+ m.seqname = "KIRINWORSHIPA";
+ m.seqcnt = 1;
+ m.delay = 150;
+ AttachMessage(m,-1232);
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m2.seqname = "KIRINWORSHIPB";
+ m2.seqcnt = 1;
+ m2.delay = 40;
+ m2.enddelay = 10;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
+ m2.seqname = "KIRINWORSHIPC";
+ m2.seqcnt = 1;
+ m2.delay = 10;
+ m2.enddelay = 20;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m2.seqname = "KIRINWORSHIPD";
+ m2.seqcnt = 2;
+ m2.delay = 10;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ }
}
else if ( msg == StringTable.Localize("$TXT_ACS_MAP35_12_AREYO") )
koraxline = true;
@@ -297,46 +380,49 @@ Class SWWMStatusBar : BaseStatusBar
{
EventHandler.SendNetworkEvent("swwmkoraxline",4,consoleplayer);
koraxline = true;
- m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m.seqname = "SAYAMASTERSA";
- m.seqcnt = 2;
- m.delay = 150;
- m.enddelay = 60;
- AttachMessage(m,-1232);
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_IBUKISNAME"),StringTable.Localize("$SWWM_IBUKINAME"),"Ibuki");
- m2.seqname = "SAYAMASTERSB";
- m2.seqcnt = 1;
- m2.delay = 20;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m2.seqname = "SAYAMASTERSC";
- m2.seqcnt = 1;
- m2.delay = 20;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_IBUKISNAME"),StringTable.Localize("$SWWM_IBUKINAME"),"Ibuki");
- m2.seqname = "SAYAMASTERSD";
- m2.seqcnt = 1;
- m2.delay = 20;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
- m2.seqname = "SAYAMASTERSE";
- m2.seqcnt = 1;
- m2.delay = 40;
- m.nextmsg = m2;
- m.nextdirect = true;
- m = m2;
- m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
- m2.seqname = "SAYAMASTERSF";
- m2.seqcnt = 1;
- m2.delay = 20;
- m.nextmsg = m2;
- m.nextdirect = true;
+ if ( !swwm_nomapmsg )
+ {
+ m = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m.seqname = "SAYAMASTERSA";
+ m.seqcnt = 2;
+ m.delay = 150;
+ m.enddelay = 60;
+ AttachMessage(m,-1232);
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_IBUKISNAME"),StringTable.Localize("$SWWM_IBUKINAME"),"Ibuki");
+ m2.seqname = "SAYAMASTERSB";
+ m2.seqcnt = 1;
+ m2.delay = 20;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m2.seqname = "SAYAMASTERSC";
+ m2.seqcnt = 1;
+ m2.delay = 20;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_IBUKISNAME"),StringTable.Localize("$SWWM_IBUKINAME"),"Ibuki");
+ m2.seqname = "SAYAMASTERSD";
+ m2.seqcnt = 1;
+ m2.delay = 20;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_KIRINSNAME"),StringTable.Localize("$SWWM_KIRINNAME"),"Kirin");
+ m2.seqname = "SAYAMASTERSE";
+ m2.seqcnt = 1;
+ m2.delay = 40;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ m = m2;
+ m2 = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_SAYASNAME"),StringTable.Localize("$SWWM_SAYANAME"),"Saya");
+ m2.seqname = "SAYAMASTERSF";
+ m2.seqcnt = 1;
+ m2.delay = 20;
+ m.nextmsg = m2;
+ m.nextdirect = true;
+ }
}
if ( koraxline )
{
@@ -412,7 +498,7 @@ Class SWWMStatusBar : BaseStatusBar
{
EventHandler.SendNetworkEvent("swwmstorepuzzlecnt",consoleplayer,puzzlecnt,realpuzzlecnt);
int tpuz = SWWMUtility.IsDeathkings()?15:19;
- if ( realpuzzlecnt >= tpuz ) SWWMUtility.MarkAchievement('swwm_achievement_puzzle',players[consoleplayer]);
+ if ( realpuzzlecnt >= tpuz ) SWWMUtility.MarkAchievement("puzzle",players[consoleplayer]);
if ( !swwm_nomapmsg )
{
switch ( puzzlecnt )
@@ -614,11 +700,6 @@ Class SWWMStatusBar : BaseStatusBar
override bool ProcessNotify( EPrintLevel printlevel, String outline )
{
- // this ignoring stuff has to be a thing until we can set printlevels directly
- if ( outline.Left(21) == "SWWMHandler profiling" )
- return true;
- if ( outline.left(18) == "\cxSWWM GZ RNG dump" )
- return true;
if ( koraxhack )
{
// treat as chat message
@@ -636,17 +717,17 @@ Class SWWMStatusBar : BaseStatusBar
// no need to attach name, these are done specifically for this
printlevel = PRINT_CHAT;
}
+ // append chat messages to full history
+ if ( (printlevel == PRINT_CHAT) || (printlevel == PRINT_TEAMCHAT) )
+ EventHandler.SendNetworkEvent("swwmstoremessage."..outline.Left(outline.Length()-1),level.totaltime,printlevel,consoleplayer);
+ // ignore during intermission
+ if ( gamestate != GS_LEVEL ) return false;
+ if ( (printlevel < PRINT_LOW) || (printlevel > PRINT_TEAMCHAT) ) return true; // we couldn't care less about these
let m = new("MsgLine");
m.str = outline.Left(outline.Length()-1); // strip newline
m.type = printlevel;
m.tic = level.totaltime;
m.rep = 1;
- // append chat messages to full history
- if ( (printlevel == PRINT_CHAT) || (printlevel == PRINT_TEAMCHAT) )
- EventHandler.SendNetworkEvent("swwmstoremessage."..m.str,m.tic,m.type,consoleplayer);
- // ignore during intermission
- if ( gamestate != GS_LEVEL ) return false;
- if ( (printlevel < PRINT_LOW) || (printlevel > PRINT_TEAMCHAT) ) return true; // we couldn't care less about these
if ( printlevel == PRINT_LOW )
{
// check if repeated
@@ -658,6 +739,7 @@ Class SWWMStatusBar : BaseStatusBar
PickupQueue.Delete(i);
break;
}
+ m.UpdateText(int(ss.x*.75));
PickupQueue.Push(m);
}
else
@@ -671,6 +753,7 @@ Class SWWMStatusBar : BaseStatusBar
MainQueue.Delete(i);
break;
}
+ m.UpdateText();
MainQueue.Push(m);
}
return true;
@@ -862,6 +945,7 @@ Class SWWMStatusBar : BaseStatusBar
override void Tick()
{
Super.Tick();
+ pausetime = gametic;
SWWMUtility.PrepareProjData(projdata,ViewPos,ViewRot.x,ViewRot.y,ViewRot.z,players[consoleplayer].fov);
int maxtargetnum = max(0,swwm_maxtargets);
int maxscorenum = max(0,swwm_maxscorenums);
@@ -896,8 +980,7 @@ Class SWWMStatusBar : BaseStatusBar
// let weapons update their own interpolators
if ( CPlayer.ReadyWeapon is 'SWWMWeapon' )
SWWMWeapon(CPlayer.ReadyWeapon).HudTick();
- bool thesight = CPlayer.mo.FindInventory("Omnisight");
- double desiredzoom = clamp(swwm_mm_zoom,.5,thesight?2.:1.);
+ double desiredzoom = clamp(swwm_mm_zoom,.5,level.allmap?2.:1.);
if ( (minimapzoom != swwm_mm_zoom) || (oldminimapzoom != swwm_mm_zoom) )
{
oldminimapzoom = minimapzoom;
@@ -909,7 +992,7 @@ Class SWWMStatusBar : BaseStatusBar
let cam = players[consoleplayer].camera;
Vector3 viewvec = (cos(viewrot.x)*cos(viewrot.y),sin(viewrot.x)*cos(viewrot.y),sin(-viewrot.y));
int sz;
- if ( thesight && swwm_pois )
+ if ( level.allmap && swwm_pois )
{
// update omnisight stuff
if ( intpoints.Size() != hnd.intpoints_cnt )
@@ -946,7 +1029,7 @@ Class SWWMStatusBar : BaseStatusBar
if ( trk.mytarget == CPlayer.mo ) continue;
if ( trk.mytarget is 'PlayerGone' ) continue; // ignore "gone" players
int mtime = 35;
- if ( thesight && (trk.lasthealth > 0) ) mtime += 105;
+ if ( level.allmap && (trk.lasthealth > 0) ) mtime += 105;
if ( level.maptime > trk.updated+mtime ) continue;
// ignore trackers clearly outside of player view
Vector3 tdir = level.Vec3Diff(viewpos,trk.pos);
@@ -1022,7 +1105,7 @@ Class SWWMStatusBar : BaseStatusBar
i = 0;
for ( SWWMItemSense s=demo.itemsense; s; s=s.next )
{
- if ( !thesight && (level.maptime > s.updated+35) ) continue;
+ if ( !level.allmap && (level.maptime > s.updated+35) ) continue;
// ignore points clearly outside of player view
Vector3 tdir = level.Vec3Diff(viewpos,s.pos);
if ( viewvec dot tdir < 0 ) continue;
@@ -1119,16 +1202,6 @@ Class SWWMStatusBar : BaseStatusBar
override void Init()
{
Super.Init();
- // scaling is set to 640 pixels wide minimum
- // and height set so it fits up to ultrawide (2.370:1 ~ 2.4:1)
- // ultrawide is honestly an abomination,
- // and these numbers should be proof enough of it
- // none of the commercially available "21:9" screens even have
- // that actual ratio in the first place, what the fuck man
- // they dangle anywhere between 12:4, 43:18 and 64:27
- // fuck ultrawide, seriously
- // get a 16:10 screen instead, it's the best aspect ratio
- SetSize(0,640,266);
StatusTex = TexMan.CheckForTexture("graphics/HUD/StatusBox.png",TexMan.Type_Any);
DashTex = TexMan.CheckForTexture("graphics/HUD/DashBar.png",TexMan.Type_Any);
FuelTex[0] = TexMan.CheckForTexture("graphics/HUD/FuelBar.png",TexMan.Type_Any);
@@ -1162,13 +1235,8 @@ Class SWWMStatusBar : BaseStatusBar
GenericAmmoTex[2] = TexMan.CheckForTexture("graphics/HUD/GenericAmmoBoxR.png",TexMan.Type_Any);
MiniBox = TexMan.CheckForTexture("graphics/HUD/MinimapBox.png",TexMan.Type_Any);
AutoPage = TexMan.CheckForTexture("AUTOPAGE",TexMan.Type_Autopage);
- PauseTex = TexMan.CheckForTexture("graphics/swwmpause.png",TexMan.Type_Any);
bgtex = TexMan.CheckForTexture("graphics/tempbg.png",TexMan.Type_Any);
minimapzoom = oldminimapzoom = 1.;
- mTewiFont = HUDFont.Create("TewiShaded");
- mMiniwiFont = HUDFont.Create("MiniwiShaded");
- mMPlusFont = HUDFont.Create("MPlusShaded");
- mk6x8Font = HUDFont.Create("k6x8Shaded");
HealthInter = DynamicValueInterpolator.Create(100,.1,1,100);
ScoreInter = DynamicValueInterpolator.Create(0,.1,1,999999999);
ScoreInter2 = DynamicValueInterpolator.Create(0,.1,1,999999999);
@@ -1192,10 +1260,9 @@ Class SWWMStatusBar : BaseStatusBar
SWWMUtility.PrepareProjData(projdata,ViewPos,ViewRot.x,ViewRot.y,ViewRot.z,players[consoleplayer].fov);
int cliptop = projdata.viewy, clipbottom = projdata.viewy+projdata.viewh,
clipleft = projdata.viewx, clipright = projdata.viewx+projdata.vieww;
- bool thesight = !!CPlayer.mo.FindInventory("Omnisight");
// points of interest
String tag;
- if ( thesight )
+ if ( level.allmap )
{
for ( int i=0; i= 1. ) continue;
Vector2 vpos = SWWMUtility.NDCToViewport(projdata,ndc);
- Font fnt = LangFont(mMiniwiFont);
- int mtime = thesight?70:35;
+ int mtime = level.allmap?70:35;
double alph = clamp(((s.updated+mtime)-(level.maptime+fractic))/35.,0.,1.);
- alph *= clamp(1.5-1.5*(tdir.length()/(thesight?1200.:800.)),0.,1.);
+ alph *= clamp(1.5-1.5*(tdir.length()/(level.allmap?1200.:800.)),0.,1.);
tag = s.tag;
- Screen.DrawText(fnt,s.vipitem?Font.CR_PURPLE:s.scoreitem?Font.CR_GOLD:Font.CR_GREEN,(vpos.x-hsd.x*fnt.StringWidth(tag)/2.)/hsd.x,(vpos.y-hsd.y*fnt.GetHeight()/2.)/hsd.y,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawText(smallfont2,s.vipitem?Font.CR_PURPLE:s.scoreitem?Font.CR_GOLD:Font.CR_GREEN,(vpos.x-hsd*smallfont2.StringWidth(tag)/2.)/hsd,(vpos.y-hsd*smallfont2.GetHeight()/2.)/hsd,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
tag = String.Format("\cu(%s\cu)\c-",FormatDist(tdir.length()));
- Screen.DrawText(fnt,Font.CR_WHITE,(vpos.x-hsd.x*fnt.StringWidth(tag)/2.)/hsd.x,(vpos.y+hsd.y*fnt.GetHeight()/2.)/hsd.y,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawText(smallfont2,Font.CR_WHITE,(vpos.x-hsd*smallfont2.StringWidth(tag)/2.)/hsd,(vpos.y+hsd*smallfont2.GetHeight()/2.)/hsd,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
if ( s.item is 'SWWMRespawnTimer' )
{
tag = String.Format(StringTable.Localize("$SWWM_TRESPAWN"),s.item.special2/GameTicRate);
- Screen.DrawText(fnt,Font.CR_WHITE,(vpos.x-hsd.x*fnt.StringWidth(tag)/2.)/hsd.x,(vpos.y+hsd.y*fnt.GetHeight()*2)/hsd.y,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawText(smallfont2,Font.CR_WHITE,(vpos.x-hsd*smallfont2.StringWidth(tag)/2.)/hsd,(vpos.y+hsd*smallfont2.GetHeight()*2)/hsd,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
}
}
}
@@ -1286,18 +1351,22 @@ Class SWWMStatusBar : BaseStatusBar
if ( StringTable.Localize("$SWWM_LEGPREFIX") == "R" ) tag = tag..StringTable.Localize("$SWWM_LEG");
else tag = StringTable.Localize("$SWWM_LEG")..tag;
}
- if ( targ.bBOSS ) tag = "\cx★\c- "..tag.." \cx★\c-";
+ if ( targ.bBOSS )
+ {
+ if ( swwm_bigtags ) tag = "\cx★\c- "..tag.." \cx★\c-";
+ else tag = "\cx*\c- "..tag.." \cx*\c-"; // miniwi has no stars
+ }
if ( targ.bFRIENDLY ) tag = "\cg♥\c- "..tag.." \cg♥\c-";
}
int mtime = 35;
- if ( thesight && (targ.lasthealth > 0) ) mtime += 105;
+ if ( level.allmap && (targ.lasthealth > 0) ) mtime += 105;
double alph = clamp(((targ.updated+mtime)-(level.maptime+fractic))/35.,0.,1.);
Vector2 barsiz = TexMan.GetScaledSize(EnemyBTex);
- barsiz.x *= hsb.x;
- barsiz.y *= hsb.y;
+ barsiz.x *= hsb;
+ barsiz.y *= hsb;
Vector2 barpos = vpos-(barsiz/2.);
barpos.y -= 16.;
- Font fnt = LangFont(swwm_bigtags?mTewiFont:mMiniwiFont);
+ Font fnt = swwm_bigtags?smallfont:smallfont2;
int col = Font.CR_WHITE;
if ( teamplay )
{
@@ -1306,37 +1375,37 @@ Class SWWMStatusBar : BaseStatusBar
if ( col == -1 ) col = Font.CR_WHITE;
}
if ( swwm_targettags || targ.myplayer && (tag != "") )
- Screen.DrawText(fnt,col,(barpos.x+barsiz.x/2.-(fnt.StringWidth(tag)*hsb.x)/2.)/hsb.x,(barpos.y-fnt.GetHeight()*hsb.y)/hsb.y,tag,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
- Screen.DrawTexture(EnemyBTex,false,barpos.x/hsb.x,barpos.y/hsb.y,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawText(fnt,col,(barpos.x+barsiz.x/2.-(fnt.StringWidth(tag)*hsb)/2.)/hsb,(barpos.y-fnt.GetHeight()*hsb)/hsb,tag,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawTexture(EnemyBTex,false,barpos.x/hsb,barpos.y/hsb,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
double ht = clamp(targ.intp.GetValue(),0,targ.maxhealth*100);
double hw = (min(ht,targ.maxhealth)*50.)/targ.maxhealth;
if ( targ.mytarget && (targ.mytarget.bInvulnerable || (targ.myplayer && (targ.myplayer.cheats&(CF_GODMODE|CF_GODMODE2))) || targ.mytarget.FindInventory("InvinciballPower")) )
{
- Screen.DrawTexture(EnemyHTex[4],false,(barpos.x+2*hsb.x)/hsb.x,(barpos.y+2*hsb.y)/hsb.y,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_WindowRightF,hw,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawTexture(EnemyHTex[4],false,(barpos.x+2*hsb)/hsb,(barpos.y+2*hsb)/hsb,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_WindowRightF,hw,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
}
else
{
- Screen.DrawTexture(EnemyHTex[0],false,(barpos.x+2*hsb.x)/hsb.x,(barpos.y+2*hsb.y)/hsb.y,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_WindowRightF,hw,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawTexture(EnemyHTex[0],false,(barpos.x+2*hsb)/hsb,(barpos.y+2*hsb)/hsb,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_WindowRightF,hw,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
if ( ht > targ.maxhealth )
{
hw = (min(ht-targ.maxhealth,targ.maxhealth)*50.)/targ.maxhealth;
- Screen.DrawTexture(EnemyHTex[1],false,(barpos.x+2*hsb.x)/hsb.x,(barpos.y+2*hsb.y)/hsb.y,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_WindowRightF,hw,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawTexture(EnemyHTex[1],false,(barpos.x+2*hsb)/hsb,(barpos.y+2*hsb)/hsb,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_WindowRightF,hw,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
}
if ( ht > targ.maxhealth*2 )
{
hw = (min(ht-targ.maxhealth*2,targ.maxhealth*3)*50.)/(targ.maxhealth*3);
- Screen.DrawTexture(EnemyHTex[2],false,(barpos.x+2*hsb.x)/hsb.x,(barpos.y+2*hsb.y)/hsb.y,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_WindowRightF,hw,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawTexture(EnemyHTex[2],false,(barpos.x+2*hsb)/hsb,(barpos.y+2*hsb)/hsb,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_WindowRightF,hw,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
}
if ( ht > targ.maxhealth*5 )
{
hw = (min(ht-targ.maxhealth*5,targ.maxhealth*5)*50.)/(targ.maxhealth*5);
- Screen.DrawTexture(EnemyHTex[3],false,(barpos.x+2*hsb.x)/hsb.x,(barpos.y+2*hsb.y)/hsb.y,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_WindowRightF,hw,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawTexture(EnemyHTex[3],false,(barpos.x+2*hsb)/hsb,(barpos.y+2*hsb)/hsb,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_WindowRightF,hw,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
}
}
if ( targ.mytarget && targ.mytarget.FindInventory("DivineSpriteEffect") )
{
double falph = clamp((ht-targ.maxhealth*10)/(targ.maxhealth*60.),0.,1.);
- Screen.DrawTexture(EnemyHTex[5],false,(barpos.x+2*hsb.x)/hsb.x,(barpos.y+2*hsb.y)/hsb.y,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph*falph,DTA_LegacyRenderStyle,STYLE_Add,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawTexture(EnemyHTex[5],false,(barpos.x+2*hsb)/hsb,(barpos.y+2*hsb)/hsb,DTA_VirtualWidthF,ssb.x,DTA_VirtualHeightF,ssb.y,DTA_KeepRatio,true,DTA_Alpha,alph*falph,DTA_LegacyRenderStyle,STYLE_Add,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
}
}
// floating kill scores and others
@@ -1376,21 +1445,19 @@ Class SWWMStatusBar : BaseStatusBar
fo.y = snum.initialspan-(snum.lifespan-fractic);
isscore = true;
}
- Font fnt = mMiniwiFont.mFont;
- Vector2 hs0 = isscore?hss:hsn;
+ double hs0 = isscore?hss:hsn;
Vector2 ss0 = isscore?sss:ssn;
- Screen.DrawText(fnt,snum.tcolor,(vpos.x-hs0.x*(fo.x+fnt.StringWidth(tag)/2.))/hs0.x,(vpos.y-hs0.y*(fo.y+(fnt.GetHeight()/2.)))/hs0.y,tag,DTA_VirtualWidthF,ss0.x,DTA_VirtualHeightF,ss0.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawText(smallfont2,snum.tcolor,(vpos.x-hs0*(fo.x+smallfont2.StringWidth(tag)/2.))/hs0,(vpos.y-hs0*(fo.y+(smallfont2.GetHeight()/2.)))/hs0,tag,DTA_VirtualWidthF,ss0.x,DTA_VirtualHeightF,ss0.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
// extra strings (if available)
if ( !swwm_scorebonus ) continue;
- fo.y += fnt.GetHeight();
- fnt = LangFont(mMiniwiFont);
- for ( int i=0; i 0 ) tag.AppendFormat(" x%d",snum.xscore[i]);
- Screen.DrawText(fnt,snum.xtcolor[i],(vpos.x-hss.x*(fo.x+fnt.StringWidth(tag)/2.))/hss.x,(vpos.y-hss.y*(fo.y+(fnt.GetHeight()/2.)))/hss.y,tag,DTA_VirtualWidthF,sss.x,DTA_VirtualHeightF,sss.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
- fo.y += fnt.GetHeight();
+ Screen.DrawText(smallfont2,snum.xtcolor[i],(vpos.x-hss*(fo.x+smallfont2.StringWidth(tag)/2.))/hss,(vpos.y-hss*(fo.y+(smallfont2.GetHeight()/2.)))/hss,tag,DTA_VirtualWidthF,sss.x,DTA_VirtualHeightF,sss.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ fo.y += smallfont2.GetHeight();
}
}
}
@@ -1398,8 +1465,7 @@ Class SWWMStatusBar : BaseStatusBar
override void DrawMyPos()
{
String str = String.Format("(%d,%d,%d)",CPlayer.mo.pos.X,CPlayer.mo.pos.Y,CPlayer.mo.pos.Z);
- let fnt = LangFont(mMiniwiFont);
- Screen.DrawText(fnt,Font.CR_GREEN,(ss.x-fnt.StringWidth(str))/2,4,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ Screen.DrawText(smallfont2,Font.CR_GREEN,(ss.x-smallfont2.StringWidth(str))/2,4,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
override void DrawAutomapHUD( double ticFrac )
@@ -1711,13 +1777,13 @@ Class SWWMStatusBar : BaseStatusBar
[visible, rv1, rv2] = SWWMUtility.LiangBarsky((-1,-1)*zoomclip,(1,1)*zoomclip,rv1,rv2);
if ( !visible ) continue;
// scale to minimap frame
- rv1 *= (HALFMAPSIZE/zoomclip)*hs.x;
- rv2 *= (HALFMAPSIZE/zoomclip)*hs.x;
+ rv1 *= (HALFMAPSIZE/zoomclip)*hs;
+ rv2 *= (HALFMAPSIZE/zoomclip)*hs;
// offset to minimap center
rv1 += basepos;
rv2 += basepos;
// draw the line
- Screen.DrawThickLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),max(1.,hs.x*.25),mm_gridcolor);
+ Screen.DrawThickLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),max(1.,hs*.25),mm_gridcolor);
}
for ( int i=0; i zoomview )
+ Vector2 mid = (rv1+rv2)/2.;
+ Vector2 siz = (abs(rv1.x-rv2.x),abs(rv1.y-rv2.y))/2.;
+ if ( (((siz.x+zoomview)-abs(mid.x)) <= 0) || (((siz.y+zoomview)-abs(mid.y)) <= 0) )
continue;
// flip Y
rv1.y *= -1;
@@ -1827,8 +1895,8 @@ Class SWWMStatusBar : BaseStatusBar
[visible, rv1, rv2] = SWWMUtility.LiangBarsky((-1,-1)*zoomclip,(1,1)*zoomclip,rv1,rv2);
if ( !visible ) continue;
// scale to minimap frame
- rv1 *= (HALFMAPSIZE/zoomclip)*hs.x;
- rv2 *= (HALFMAPSIZE/zoomclip)*hs.x;
+ rv1 *= (HALFMAPSIZE/zoomclip)*hs;
+ rv2 *= (HALFMAPSIZE/zoomclip)*hs;
// offset to minimap center
rv1 += basepos;
rv2 += basepos;
@@ -1886,14 +1954,106 @@ Class SWWMStatusBar : BaseStatusBar
if ( isportal )
{
col = Color((col.r+mm_portalcolor.r*7)/8,(col.g+mm_portalcolor.g*7)/8,(col.b+mm_portalcolor.b*7)/8);
- Screen.DrawThickLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),max(1.,hs.x*.25),col);
+ Screen.DrawThickLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),max(1.,hs*.25),col);
}
- else Screen.DrawThickLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),max(1.,hs.x*.5),col);
+ else Screen.DrawThickLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),max(1.,hs*.5),col);
+ }
+ }
+ private void DrawMapMarkers( Vector2 basepos )
+ {
+ double zoomlevel = oldminimapzoom*(1.-FracTic)+minimapzoom*FracTic;
+ double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel;
+ Vector2 cpos = players[consoleplayer].Camera.prev.xy*(1.-FracTic)+players[consoleplayer].Camera.pos.xy*FracTic;
+ Sector csec = players[consoleplayer].Camera.CurSector;
+ if ( !mi ) mi = ThinkerIterator.Create("MapMarker",Thinker.STAT_MAPMARKER);
+ else mi.Reinit();
+ MapMarker m;
+ while ( m = MapMarker(mi.Next()) )
+ {
+ if ( m.bDORMANT ) continue;
+ if ( m.args[1] && !(m.CurSector.moreflags&Sector.SECMF_DRAWN) ) continue;
+ TextureID tx;
+ if ( m.picnum.IsValid() ) tx = m.picnum;
+ else tx = m.CurState.GetSpriteTexture(1);
+ Vector2 sz = TexMan.GetScaledSize(tx);
+ Vector2 scl;
+ // seems to match automap scaling somewhat
+ if ( m.Args[2] ) scl = (m.Scale/zoomlevel)*.15;
+ else scl = m.Scale*.5;
+ sz.x *= scl.x;
+ sz.y *= scl.y;
+ double radius = max(sz.x,sz.y); // naive, I know
+ if ( m.args[0] )
+ {
+ // oh bother, this will be dicks
+ let ai = level.CreateActorIterator(m.args[0]);
+ Actor a;
+ while ( a = ai.Next() )
+ {
+ Vector2 rv = a.pos.xy-cpos;
+ bool isportal = false;
+ if ( swwm_mm_portaloverlay )
+ {
+ Sector sec = level.PointInSector(a.pos.xy);
+ if ( sec.portalgroup != csec.portalgroup )
+ {
+ isportal = true;
+ // portal displacement
+ rv -= SWWMUtility.PortalDisplacement(csec,sec);
+ }
+ }
+ if ( (((radius+zoomview)-abs(rv.x)) <= 0) || (((radius+zoomview)-abs(rv.y)) <= 0) )
+ continue;
+ // flip Y
+ rv.y *= -1;
+ // rotate by view
+ rv = Actor.RotateVector(rv,ViewRot.x-90);
+ // scale to minimap frame
+ rv *= (HALFMAPSIZE/zoomclip)*hs;
+ // offset to minimap center
+ rv += basepos;
+ // draw
+ int clipleft = int((basepos.x-HALFMAPSIZE)*hs);
+ int cliptop = int((basepos.y-HALFMAPSIZE)*hs);
+ int clipright = int(clipleft+HALFMAPSIZE*2*hs);
+ int clipbottom = int(cliptop+HALFMAPSIZE*2*hs);
+ Screen.DrawTexture(tx,false,rv.x,rv.y,DTA_ColorOverlay,isportal?Color(128,mm_portalcolor.r,mm_portalcolor.g,mm_portalcolor.b):Color(0,0,0,0),DTA_ScaleX,hs*scl.x,DTA_ScaleY,hs*scl.y,DTA_LegacyRenderStyle,m.GetRenderStyle(),DTA_Alpha,m.Alpha,DTA_FillColor,m.FillColor,DTA_TranslationIndex,m.Translation,DTA_ClipLeft,clipleft,DTA_ClipTop,cliptop,DTA_ClipRight,clipright,DTA_ClipBottom,clipbottom);
+ }
+ ai.Destroy();
+ continue;
+ }
+ Vector2 rv = m.pos.xy-cpos;
+ bool isportal = false;
+ if ( swwm_mm_portaloverlay )
+ {
+ Sector sec = level.PointInSector(m.pos.xy);
+ if ( sec.portalgroup != csec.portalgroup )
+ {
+ isportal = true;
+ // portal displacement
+ rv -= SWWMUtility.PortalDisplacement(csec,sec);
+ }
+ }
+ if ( (((radius+zoomview)-abs(rv.x)) <= 0) || (((radius+zoomview)-abs(rv.y)) <= 0) )
+ continue;
+ // flip Y
+ rv.y *= -1;
+ // rotate by view
+ rv = Actor.RotateVector(rv,ViewRot.x-90);
+ // scale to minimap frame
+ rv *= (HALFMAPSIZE/zoomclip)*hs;
+ // offset to minimap center
+ rv += basepos;
+ // draw
+ int clipleft = int(basepos.x-HALFMAPSIZE*hs);
+ int cliptop = int(basepos.y-HALFMAPSIZE*hs);
+ int clipright = int(clipleft+HALFMAPSIZE*2*hs);
+ int clipbottom = int(cliptop+HALFMAPSIZE*2*hs);
+ Screen.DrawTexture(tx,false,rv.x,rv.y,DTA_ColorOverlay,isportal?Color(128,mm_portalcolor.r,mm_portalcolor.g,mm_portalcolor.b):Color(0,0,0,0),DTA_ScaleX,hs*scl.x,DTA_ScaleY,hs*scl.y,DTA_LegacyRenderStyle,m.GetRenderStyle(),DTA_Alpha,m.Alpha,DTA_FillColor,m.FillColor,DTA_TranslationIndex,m.Translation,DTA_ClipLeft,clipleft,DTA_ClipTop,cliptop,DTA_ClipRight,clipright,DTA_ClipBottom,clipbottom);
}
}
private void DrawMapThings( Vector2 basepos )
{
- bool thesight = !!CPlayer.mo.FindInventory("Omnisight");
double zoomlevel = oldminimapzoom*(1.-FracTic)+minimapzoom*FracTic;
double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel;
Vector2 cpos = players[consoleplayer].Camera.prev.xy*(1.-FracTic)+players[consoleplayer].Camera.pos.xy*FracTic;
@@ -1901,6 +2061,7 @@ Class SWWMStatusBar : BaseStatusBar
for ( SWWMSimpleTracker t=hnd.strackers; t; t=t.next )
{
if ( !swwm_mm_missiles && t.ismissile ) continue;
+ if ( level.allmap && (t.target is 'Key') ) continue; // don't draw keys over the actual markers they have
Color col = mm_thingcolor;
bool isitem = false;
bool plainactor = false;
@@ -1938,7 +2099,7 @@ Class SWWMStatusBar : BaseStatusBar
plainactor = true;
}
int mtime = 35;
- if ( thesight && !t.expired && t.target ) mtime += 105;
+ if ( level.allmap && !t.expired && t.target ) mtime += 105;
Vector2 rv = pos-cpos;
bool isportal = false;
if ( swwm_mm_portaloverlay )
@@ -1953,7 +2114,7 @@ Class SWWMStatusBar : BaseStatusBar
col = Color((col.r+mm_portalcolor.r*7)/8,(col.g+mm_portalcolor.g*7)/8,(col.b+mm_portalcolor.b*7)/8);
}
}
- if ( min(abs(rv.x)-radius,abs(rv.y)-radius) > zoomview )
+ if ( (((radius+zoomview)-abs(rv.x)) <= 0) || (((radius+zoomview)-abs(rv.y)) <= 0) )
continue;
Vector2 tv[4];
int nidx;
@@ -2002,14 +2163,14 @@ Class SWWMStatusBar : BaseStatusBar
if ( visible )
{
// scale to minimap frame
- x0 *= (HALFMAPSIZE/zoomclip)*hs.x;
- x1 *= (HALFMAPSIZE/zoomclip)*hs.x;
+ x0 *= (HALFMAPSIZE/zoomclip)*hs;
+ x1 *= (HALFMAPSIZE/zoomclip)*hs;
// offset to minimap center
x0 += basepos;
x1 += basepos;
// draw the line
- if ( isportal ) Screen.DrawThickLine(int(x0.x),int(x0.y),int(x1.x),int(x1.y),max(1.,hs.x*.25),col,int(t.smoothalpha*255));
- else Screen.DrawThickLine(int(x0.x),int(x0.y),int(x1.x),int(x1.y),max(1.,hs.x*.5),col,int(t.smoothalpha*255));
+ if ( isportal ) Screen.DrawThickLine(int(x0.x),int(x0.y),int(x1.x),int(x1.y),max(1.,hs*.25),col,int(t.smoothalpha*255));
+ else Screen.DrawThickLine(int(x0.x),int(x0.y),int(x1.x),int(x1.y),max(1.,hs*.5),col,int(t.smoothalpha*255));
drawn = true;
}
}
@@ -2047,7 +2208,7 @@ Class SWWMStatusBar : BaseStatusBar
xx -= 6;
}
Screen.DrawTexture(ScoreTex[2],false,ss.x-(margin+xx),margin,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,ss.x-(margin+4+6*digits),margin+1,sstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ Screen.DrawText(smallfont,Font.CR_FIRE,ss.x-(margin+4+6*digits),margin+2,sstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
int yy = margin+19;
// obviously, don't draw the minimap if the automap is open
if ( !automapactive && swwm_mm_enable )
@@ -2056,20 +2217,21 @@ Class SWWMStatusBar : BaseStatusBar
xx = int(ss.x-(margin+(HALFMAPSIZE+2)*2));
Screen.DrawTexture(MiniBox,false,xx,yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
Vector2 basemappos = (xx+HALFMAPSIZE+2,yy+HALFMAPSIZE+2);
- Screen.Dim(mm_backcolor,1.,int((basemappos.x-HALFMAPSIZE)*hs.x),int((basemappos.y-HALFMAPSIZE)*hs.x),int(HALFMAPSIZE*2*hs.x),int(HALFMAPSIZE*2*hs.x));
- if ( mm_drawautopage ) Screen.DrawTexture(AutoPage,false,xx+2,yy+2,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ClipRight,int((xx+2+HALFMAPSIZE*2)*hs.x),DTA_ClipBottom,int((yy+2+HALFMAPSIZE*2)*hs.x));
+ Screen.Dim(mm_backcolor,1.,int((basemappos.x-HALFMAPSIZE)*hs),int((basemappos.y-HALFMAPSIZE)*hs),int(HALFMAPSIZE*2*hs),int(HALFMAPSIZE*2*hs));
+ if ( mm_drawautopage ) Screen.DrawTexture(AutoPage,false,xx+2,yy+2,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ClipRight,int((xx+2+HALFMAPSIZE*2)*hs),DTA_ClipBottom,int((yy+2+HALFMAPSIZE*2)*hs));
// draw dat stuff
- if ( swwm_mm_grid ) DrawMapGrid(basemappos*hs.x);
- DrawMapLines(basemappos*hs.x);
- DrawMapThings(basemappos*hs.x);
+ if ( swwm_mm_grid ) DrawMapGrid(basemappos*hs);
+ DrawMapLines(basemappos*hs);
+ DrawMapThings(basemappos*hs);
+ DrawMapMarkers(basemappos*hs);
// finally, draw the player arrow
Vector2 tv[3];
tv[0] = (0,-4);
tv[1] = (-3,2);
tv[2] = (3,2);
if ( !swwm_mm_rotate ) for ( int i=0; i<3; i++ ) tv[i] = Actor.RotateVector(tv[i],90-ViewRot.x);
- for ( int i=0; i<3; i++ ) tv[i] = (tv[i]+basemappos)*hs.x;
- for ( int i=0; i<3; i++ ) Screen.DrawThickLine(int(tv[i].x),int(tv[i].y),int(tv[(i+1)%3].x),int(tv[(i+1)%3].y),max(1.,hs.x*.5),mm_yourcolor);
+ for ( int i=0; i<3; i++ ) tv[i] = (tv[i]+basemappos)*hs;
+ for ( int i=0; i<3; i++ ) Screen.DrawThickLine(int(tv[i].x),int(tv[i].y),int(tv[(i+1)%3].x),int(tv[(i+1)%3].y),max(1.,hs*.5),mm_yourcolor);
yy += ((HALFMAPSIZE+2)*2)+3;
}
// draw stats and timer when automap is open
@@ -2078,7 +2240,6 @@ Class SWWMStatusBar : BaseStatusBar
{
xx = int(ss.x-(margin+2));
String str;
- Font fnt;
if ( automapactive || (fstats > 1) )
{
int label = am_showmaplabel;
@@ -2087,44 +2248,42 @@ Class SWWMStatusBar : BaseStatusBar
if ( iof != -1 ) ln.Truncate(iof);
if ( !label || ((level.clusterflags&level.CLUSTER_HUB) && (label == 2)) ) str = ln;
else str = String.Format("%s - %s",level.mapname.MakeUpper(),ln);
- fnt = LangFont(mTewiFont);
- Screen.DrawText(fnt,Font.CR_FIRE,xx-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += fnt.GetHeight();
+ Screen.DrawText(smallfont,Font.CR_FIRE,xx-smallfont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ yy += smallfont.GetHeight();
}
- fnt = LangFont(mMiniwiFont);
if ( (level.total_monsters > 0) && am_showmonsters && !deathmatch )
{
str = String.Format("\cxK \c-%d\cu/\c-%d",level.killed_monsters,level.total_monsters);
- Screen.DrawText(fnt,(level.killed_monsters>=level.total_monsters)?Font.CR_GOLD:Font.CR_WHITE,xx-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += fnt.GetHeight();
+ Screen.DrawText(smallfont2,(level.killed_monsters>=level.total_monsters)?Font.CR_GOLD:Font.CR_WHITE,xx-smallfont2.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ yy += smallfont2.GetHeight();
}
if ( (level.total_items > 0) && am_showitems && !deathmatch )
{
str = String.Format("\cxI \c-%d\cu/\c-%d",level.found_items,level.total_items);
- Screen.DrawText(fnt,(level.found_items>=level.total_items)?Font.CR_GOLD:Font.CR_WHITE,xx-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += fnt.GetHeight();
+ Screen.DrawText(smallfont2,(level.found_items>=level.total_items)?Font.CR_GOLD:Font.CR_WHITE,xx-smallfont2.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ yy += smallfont2.GetHeight();
}
if ( (level.total_secrets > 0) && am_showsecrets && !deathmatch )
{
str = String.Format("\cxS \c-%d\cu/\c-%d",level.found_secrets,level.total_secrets);
- Screen.DrawText(fnt,(level.found_secrets>=level.total_secrets)?Font.CR_GOLD:Font.CR_WHITE,xx-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += fnt.GetHeight();
+ Screen.DrawText(smallfont2,(level.found_secrets>=level.total_secrets)?Font.CR_GOLD:Font.CR_WHITE,xx-smallfont2.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ yy += smallfont2.GetHeight();
}
int sec;
if ( am_showtime )
{
sec = Thinker.Tics2Seconds(level.maptime);
str = String.Format("\cxT \c-%02d\cu:\c-%02d\cu:\c-%02d",sec/3600,(sec%3600)/60,sec%60);
- Screen.DrawText(fnt,((level.sucktime>0)&&(sec>=(level.sucktime*3600)))?Font.CR_RED:(sec<=level.partime)?Font.CR_GOLD:Font.CR_WHITE,xx-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += fnt.GetHeight();
+ Screen.DrawText(smallfont2,((level.sucktime>0)&&(sec>=(level.sucktime*3600)))?Font.CR_RED:(sec<=level.partime)?Font.CR_GOLD:Font.CR_WHITE,xx-smallfont2.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ yy += smallfont2.GetHeight();
}
// don't show total time if it's equal to map time
if ( am_showtotaltime && (level.totaltime != level.maptime) )
{
sec = Thinker.Tics2Seconds(level.totaltime);
str = String.Format("\cxTT \c-%02d\cu:\c-%02d\cu:\c-%02d",sec/3600,(sec%3600)/60,sec%60);
- Screen.DrawText(fnt,Font.CR_WHITE,xx-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += fnt.GetHeight();
+ Screen.DrawText(smallfont2,Font.CR_WHITE,xx-smallfont2.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ yy += smallfont2.GetHeight();
}
yy += 3;
}
@@ -2134,7 +2293,6 @@ Class SWWMStatusBar : BaseStatusBar
if ( playercount <= 1 ) return;
xx = int(ss.x-(margin+2));
String str;
- Font fnt = LangFont(mTewiFont);
if ( teamplay )
{
// draw team scores
@@ -2142,8 +2300,8 @@ Class SWWMStatusBar : BaseStatusBar
{
if ( !teamactive[i] ) continue;
str = String.Format("\cx%s \c-%d",Teams[i].mName,teamscore[i]);
- Screen.DrawText(fnt,Font.CR_WHITE,xx-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += fnt.GetHeight();
+ Screen.DrawText(smallfont,Font.CR_WHITE,xx-smallfont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ yy += smallfont.GetHeight();
}
}
else
@@ -2151,19 +2309,19 @@ Class SWWMStatusBar : BaseStatusBar
// draw rank and spread like in UT
if ( tiedscore ) str = String.Format("\cx%s \cg%d\cr/\cg%d\c-",StringTable.Localize("$SWWM_DMRANK"),rank,playercount);
else str = String.Format("\cx%s \cj%d\cu/\cj%d\c-",StringTable.Localize("$SWWM_DMRANK"),rank,playercount);
- Screen.DrawText(fnt,Font.CR_WHITE,xx-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += fnt.GetHeight();
+ Screen.DrawText(smallfont,Font.CR_WHITE,xx-smallfont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ yy += smallfont.GetHeight();
if ( lead > 0 ) str = String.Format("\cx%s \cj+%d\c-",StringTable.Localize("$SWWM_DMSPREAD"),lead);
else str = String.Format("\cx%s \cj%d\c-",StringTable.Localize("$SWWM_DMSPREAD"),lead);
- Screen.DrawText(fnt,Font.CR_WHITE,xx-fnt.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += fnt.GetHeight()+3;
+ Screen.DrawText(smallfont,Font.CR_WHITE,xx-smallfont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ yy += smallfont.GetHeight()+3;
// draw top 3 players
for ( int i=0; i pc = klist[i].Species;
- if ( !pc ) continue;
- for ( int j=0; j= j ) i--;
- }
- }
int maxcolc = (gameinfo.gametype&GAME_DOOMCHEX)?6:4;
for ( int i=0; i 99999) && !forceamt ) nstr = "99999";
else nstr = String.Format("%d",i.Amount);
- int len = mTewiFont.mFont.StringWidth(nstr);
- Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,(xx+30)-len,(yy+30)-11,nstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alpha);
+ int len = smallfont.StringWidth(nstr);
+ Screen.DrawText(smallfont,Font.CR_FIRE,(xx+30)-len,(yy+30)-10,nstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alpha);
}
return true;
}
@@ -2351,7 +2494,7 @@ Class SWWMStatusBar : BaseStatusBar
Screen.DrawTexture(GenericAmmoTex[1],false,xx,yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
Screen.DrawTexture(GenericAmmoTex[0],false,xx-3,yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,xx,yy,astr2,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ Screen.DrawText(smallfont,Font.CR_FIRE,xx,yy+1,astr2,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += 14;
}
xx = ss.x-(margin+13);
@@ -2364,11 +2507,11 @@ Class SWWMStatusBar : BaseStatusBar
Screen.DrawTexture(GenericAmmoTex[1],false,xx,yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
Screen.DrawTexture(GenericAmmoTex[0],false,xx-3,yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawText(mTewiFont.mFont,Font.CR_FIRE,xx,yy,astr1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ Screen.DrawText(smallfont,Font.CR_FIRE,xx,yy+1,astr1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
}
Screen.DrawTexture(WeaponTex,false,ss.x-(margin+60),ss.y-(margin+28),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- double xx = ss.x-(margin+57), yy = ss.y-(margin+28);
+ double xx = ss.x-(margin+57), yy = ss.y-(margin+27);
for ( int i=1; i<=10; i++ )
{
int ncolor = Font.CR_WHITE;
@@ -2402,7 +2545,7 @@ Class SWWMStatusBar : BaseStatusBar
}
if ( !hasammo ) ncolor = Font.CR_RED;
}
- Screen.DrawText(mTewiFont.mFont,ncolor,xx,yy,String.Format("%d",(i%10)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ Screen.DrawText(smallfont,ncolor,xx,yy,String.Format("%d",(i%10)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += 12;
if ( i == 5 )
{
@@ -2464,17 +2607,16 @@ Class SWWMStatusBar : BaseStatusBar
tst = "AAA";
SWWMUtility.ObscureText(tst,(gametic-trl)/3);
trl--;
- Screen.DrawText(mTewiFont.mFont,Font.CR_WHITE,margin+108,ss.y-(margin+15),tst,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,falph*alph,DTA_LegacyRenderStyle,STYLE_Add);
+ Screen.DrawText(smallfont,Font.CR_WHITE,margin+108,ss.y-(margin+14),tst,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,falph*alph,DTA_LegacyRenderStyle,STYLE_Add);
}
- Screen.DrawText(mTewiFont.mFont,hcolor,margin+108,ss.y-(margin+15),String.Format("%3d",clamp(ht,0,999)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,1.-falph);
+ Screen.DrawText(smallfont,hcolor,margin+108,ss.y-(margin+14),String.Format("%3d",clamp(ht,0,999)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,1.-falph);
}
- else Screen.DrawText(mTewiFont.mFont,hcolor,margin+108,ss.y-(margin+15),String.Format("%3d",clamp(ht,0,999)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ else Screen.DrawText(smallfont,hcolor,margin+108,ss.y-(margin+14),String.Format("%3d",clamp(ht,0,999)),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
private void DrawPickups()
{
- Font fnt = LangFont(mTewiFont);
- int h = fnt.GetHeight();
+ int h = smallfont.GetHeight();
// draw nametags below them
double yy;
double nalph = 0.;
@@ -2485,10 +2627,10 @@ Class SWWMStatusBar : BaseStatusBar
yy = ss.y-(margin+50);
// shift up if boss healthbar is present
if ( hnd && (hnd.bossalpha > 0.) ) yy -= int(25*clamp(hnd.bossalpha*2.,0.,1.));
- int len = fnt.StringWidth(ntagstr);
+ int len = smallfont.StringWidth(ntagstr);
double xx = (ss.x-len)/2.;
- Screen.Dim("Black",.8*nalph,int((xx-6)*hs.x),int(yy*hs.y),int((len+12)*hs.x),int((h+4)*hs.y));
- Screen.DrawText(fnt,ntagcol,int(xx),yy+2,ntagstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,nalph);
+ Screen.Dim("Black",.8*nalph,int((xx-6)*hs),int(yy*hs),int((len+12)*hs),int((h+4)*hs));
+ Screen.DrawText(smallfont,ntagcol,int(xx),yy+2,ntagstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,nalph);
}
if ( PickupQueue.Size() <= 0 ) return;
// reverse order since they're drawn bottom to top
@@ -2497,37 +2639,34 @@ Class SWWMStatusBar : BaseStatusBar
// shift up if boss healthbar is present
if ( hnd && (hnd.bossalpha > 0.) ) yy -= int(25*clamp(hnd.bossalpha*2.,0.,1.));
// shift up again if nametag is present
- if ( nalph > 0. ) yy -= int((fnt.GetHeight()+6)*clamp(nalph*2.,0.,1.));
+ if ( nalph > 0. ) yy -= int((smallfont.GetHeight()+6)*clamp(nalph*2.,0.,1.));
for ( int i=PickupQueue.Size()-1; i>=mend; i-- )
{
- String cstr = PickupQueue[i].str;
- if ( PickupQueue[i].rep > 1 ) cstr.AppendFormat(" (x%d)",PickupQueue[i].rep);
- double curtime = (PickupQueue[i].tic+35*swwm_pickduration)-(level.totaltime+fractic);
+ PickupQueue[i].UpdateText(int(ss.x*.75));
+ double curtime = (PickupQueue[i].tic+GameTicRate*swwm_pickduration)-(level.totaltime+fractic);
double alph = clamp(curtime/20.,0.,1.);
- BrokenLines l = fnt.BreakLines(cstr,int(ss.x*.75));
+ let l = PickupQueue[i].l;
int maxlen = 0;
for ( int j=0; j maxlen ) maxlen = len;
}
double xx = (ss.x-maxlen)/2.;
- Screen.Dim("Black",.8*alph,int((xx-6)*hs.x),int((yy-h*(l.Count()-1))*hs.y),int((maxlen+12)*hs.x),int((h*l.Count()+4)*hs.y));
+ Screen.Dim("Black",.8*alph,int((xx-6)*hs),int((yy-h*(l.Count()-1))*hs),int((maxlen+12)*hs),int((h*l.Count()+4)*hs));
for ( int j=l.Count()-1; j>=0; j-- )
{
- int len = fnt.StringWidth(l.StringAt(j));
+ int len = smallfont.StringWidth(l.StringAt(j));
xx = int((ss.x-len)/2.);
- Screen.DrawText(fnt,msg0color,xx,yy+2,l.StringAt(j),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
+ Screen.DrawText(smallfont,msg0color,xx,yy+2,l.StringAt(j),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
yy -= h;
}
- l.Destroy();
yy -= 6;
}
}
private void DrawMessages( double boxalph = 1. )
{
- Font fnt = LangFont(mTewiFont);
double xx, yy;
if ( midstr != "" )
{
@@ -2536,22 +2675,25 @@ Class SWWMStatusBar : BaseStatusBar
int col = (midtype&2)?msgmidcolor2:msgmidcolor;
double curtime = (midtic+int(GameTicRate*con_midtime))-(level.totaltime+fractic);
double alph = clamp(curtime/20.,0.,1.);
- BrokenLines l = fnt.BreakLines(midstr,int(ss.x*ssp));
- int h = fnt.GetHeight();
+ if ( !midl || (midsz != int(ss.x*ssp)) )
+ {
+ if ( midl ) midl.Destroy();
+ midl = SmallFont.BreakLines(midstr,int(ss.x*ssp));
+ }
+ int h = smallfont.GetHeight();
int maxlen = 0;
- for ( int i=0; i=gametic)?swwm_maxshownbig:swwm_maxshown));
@@ -2559,27 +2701,25 @@ Class SWWMStatusBar : BaseStatusBar
yy = margin;
bool smol = (ss.x<640);
Screen.DrawTexture(ChatTex[smol?3:0],false,xx,yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,boxalph);
- yy++;
+ yy += 2;
for ( int i=mstart; i 1 ) cstr.AppendFormat(" (x%d)",MainQueue[i].rep);
+ MainQueue[i].UpdateText();
+ let l = smol?MainQueue[i].ls:MainQueue[i].l;
double curtime = MainQueue[i].tic-(level.totaltime+fractic);
if ( MainQueue[i].type < PRINT_CHAT ) curtime += GameTicRate*swwm_msgduration;
else curtime += GameTicRate*swwm_chatduration;
double alph = clamp(curtime/20.,0.,1.);
- BrokenLines l = fnt.BreakLines(cstr,smol?211:361);
for ( int j=0; j ss.x-4 )
{
// draw trailing dots
- Screen.DrawText(fnt,Font.CR_WHITE,xx,yy,"...",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ Screen.DrawText(smallfont,Font.CR_WHITE,xx,yy,"...",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
// shift back
xx -= w-(ss.x-4);
// draw trimmed
- Screen.DrawText(fnt,Font.CR_WHITE,xx,yy,fullstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ClipLeft,int(26*hs.x));
+ Screen.DrawText(smallfont,Font.CR_WHITE,xx,yy,fullstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ClipLeft,int(26*hs));
}
- else Screen.DrawText(fnt,Font.CR_WHITE,xx,yy,fullstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ else Screen.DrawText(smallfont,Font.CR_WHITE,xx,yy,fullstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
return true;
}
@@ -2622,17 +2761,43 @@ Class SWWMStatusBar : BaseStatusBar
Screen.DrawTexture(bgtex,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true,DTA_ColorOverlay,Color(192,0,0,0),DTA_Alpha,.5);
}
else Screen.Dim("Black",.5,0,0,Screen.GetWidth(),Screen.GetHeight());
- Screen.DrawTexture(PauseTex,false,Screen.GetWidth()/2,Screen.GetHeight()/2,DTA_CleanNoMove,true,DTA_CenterOffset,true);
+ String str = StringTable.Localize("$SWWM_PAUSE");
+ if ( gametic < pausetime+1000 )
+ {
+ pausepos.x = Screen.GetWidth()/2;
+ pausepos.y = Screen.GetHeight()/2;
+ pausedir = (1,1);
+ }
+ else
+ {
+ pausepos.x += pausedir.x*CleanXFac;
+ pausepos.y += pausedir.y*CleanYFac;
+ if ( pausepos.x >= Screen.GetWidth()-((bigfont.StringWidth(str)+8)*CleanXFac/2) )
+ pausedir.x = -1;
+ if ( pausepos.x < ((bigfont.StringWidth(str)+8)*CleanXFac/2) )
+ pausedir.x = 1;
+ if ( pausepos.y >= Screen.GetHeight()-((bigfont.GetHeight()+8)*CleanYFac/2) )
+ pausedir.y = -1;
+ if ( pausepos.y < ((bigfont.GetHeight()+8)*CleanYFac/2) )
+ pausedir.y = 1;
+ }
+ double xx = pausepos.x-bigfont.StringWidth(str)*CleanXFac/2;
+ double yy = pausepos.y-bigfont.GetHeight()*CleanYFac/2;
+ int tlen = str.CodePointCount();
+ for ( int i=0, pos=0; i level.maptime) )
{
Screen.Dim("Red",clamp((demo.revivefail-(level.maptime+fractic))/60.,0.,.2),0,0,Screen.GetWidth(),Screen.GetHeight());
str = StringTable.Localize("$SWWM_REFAIL");
- fnt = LangFont(mTewiFont);
- len = fnt.StringWidth(str);
+ len = smallfont.StringWidth(str);
xx = int((ss.x-len)/2.);
yy = ss.y-48;
if ( ((demo.revivefail-level.maptime)%16) < 8 )
- Screen.DrawText(fnt,Font.CR_RED,xx,yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ Screen.DrawText(smallfont,Font.CR_RED,xx,yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
alph = clamp((deadtimer-60)/60.,0.,1.);
String nam = CPlayer.GetUserName();
if ( nam == "Player" ) str = StringTable.Localize("$SWWM_URDED_GEN");
else str = String.Format(StringTable.Localize("$SWWM_URDED"),nam);
- fnt = LangFont(mTewiFont);
- len = fnt.StringWidth(str);
+ len = smallfont.StringWidth(str);
xx = int((ss.x-len)/2.);
- yy = (ss.y-fnt.GetHeight()*4)/2.;
+ yy = (ss.y-smallfont.GetHeight()*4)/2.;
// shift down if scoreboard is shown
if ( (deathmatch && sb_deathmatch_enable && (!teamplay || sb_teamdeathmatch_enable)) || (multiplayer && sb_cooperative_enable) )
- yy += ss.y/3.+fnt.GetHeight();
- Screen.DrawText(fnt,Font.CR_RED,xx,yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
+ yy += ss.y/3.+smallfont.GetHeight();
+ Screen.DrawText(smallfont,Font.CR_RED,xx,yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
if ( multiplayer || level.AllowRespawn || sv_singleplayerrespawn || G_SkillPropertyInt(SKILLP_PlayerRespawn) )
{
if ( sv_norespawn ) return (1.-dimalph);
alph = clamp((deadtimer-90)/60.,0.,1.);
str = String.Format(StringTable.Localize("$SWWM_URDEDMP"));
- fnt = LangFont(mTewiFont);
- len = fnt.StringWidth(str);
+ len = smallfont.StringWidth(str);
xx = int((ss.x-len)/2.);
yy = ss.y/2.;
// shift down if scoreboard is shown
if ( (deathmatch && sb_deathmatch_enable && (!teamplay || sb_teamdeathmatch_enable)) || (multiplayer && sb_cooperative_enable) )
yy += ss.y/3.;
- Screen.DrawText(fnt,Font.CR_WHITE,xx,yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
+ Screen.DrawText(smallfont,Font.CR_WHITE,xx,yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
return (1.-dimalph);
}
alph = clamp((deadtimer-140)/60.,0.,1.);
str = String.Format(StringTable.Localize("$SWWM_URDED2"));
- fnt = LangFont(mTewiFont);
- len = fnt.StringWidth(str);
+ len = smallfont.StringWidth(str);
xx = int((ss.x-len)/2.);
yy = ss.y/2.;
- Screen.DrawText(fnt,Font.CR_WHITE,xx,yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
+ Screen.DrawText(smallfont,Font.CR_WHITE,xx,yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
if ( goner || !swwm_revive )
return (1.-dimalph);
alph = clamp((deadtimer-160)/60.,0.,1.);
str = String.Format(StringTable.Localize("$SWWM_URDED3"));
- fnt = LangFont(mTewiFont);
- len = fnt.StringWidth(str);
+ len = smallfont.StringWidth(str);
xx = int((ss.x-len)/2.);
- yy = (ss.y+fnt.GetHeight()*2)/2.;
- Screen.DrawText(fnt,Font.CR_WHITE,xx,yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
+ yy = (ss.y+smallfont.GetHeight()*2)/2.;
+ Screen.DrawText(smallfont,Font.CR_WHITE,xx,yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
return (1.-dimalph);
}
return 1.;
@@ -2731,31 +2890,20 @@ Class SWWMStatusBar : BaseStatusBar
camhidden = true;
else camhidden = false;
BeginHUD();
- if ( swwm_hudscale <= 0 ) hs = GetHUDScale();
- else hs.x = swwm_hudscale;
- hs.y = hs.x;
- ss = (Screen.GetWidth()/hs.x,Screen.GetHeight()/hs.y);
+ if ( swwm_hudscale ) hs = CleanXFac_1;
+ else hs = max(floor(Screen.GetWidth()/640.),1.);
+ ss = (Screen.GetWidth()/hs,Screen.GetHeight()/hs);
margin = clamp(swwm_hudmargin,0,40);
- if ( swwm_barscale <= 0 ) hsb = GetHUDScale();
- else hsb.x = swwm_barscale;
- hsb.y = hsb.x;
- ssb = (Screen.GetWidth()/hsb.x,Screen.GetHeight()/hsb.y);
- if ( swwm_numscale <= 0 ) hsn = GetHUDScale();
- else hsn.x = swwm_numscale;
- hsn.y = hsn.x;
- ssn = (Screen.GetWidth()/hsn.x,Screen.GetHeight()/hsn.y);
- if ( swwm_scrscale <= 0 ) hss = GetHUDScale();
- else hss.x = swwm_scrscale;
- hss.y = hss.x;
- sss = (Screen.GetWidth()/hss.x,Screen.GetHeight()/hss.y);
- if ( swwm_poiscale <= 0 ) hsi = GetHUDScale();
- else hsi.x = swwm_poiscale;
- hsi.y = hsi.x;
- ssi = (Screen.GetWidth()/hsi.x,Screen.GetHeight()/hsi.y);
- if ( swwm_detscale <= 0 ) hsd = GetHUDScale();
- else hsd.x = swwm_detscale;
- hsd.y = hsd.x;
- ssd = (Screen.GetWidth()/hsd.x,Screen.GetHeight()/hsd.y);
+ hsb = max(hs+swwm_barscalerel,1.);
+ hsn = max(hs+swwm_numscalerel,1.);
+ hss = max(hs+swwm_scrscalerel,1.);
+ hsi = max(hs+swwm_poiscalerel,1.);
+ hsd = max(hs+swwm_detscalerel,1.);
+ ssb = (Screen.GetWidth()/hsb,Screen.GetHeight()/hsb);
+ ssn = (Screen.GetWidth()/hsn,Screen.GetHeight()/hsn);
+ sss = (Screen.GetWidth()/hss,Screen.GetHeight()/hss);
+ ssi = (Screen.GetWidth()/hsi,Screen.GetHeight()/hsi);
+ ssd = (Screen.GetWidth()/hsd,Screen.GetHeight()/hsd);
FracTic = TicFrac;
if ( camhidden )
{
diff --git a/zscript/hud/swwm_hudextra.zsc b/zscript/hud/swwm_hudextra.zsc
index 48059c812..fc0686391 100644
--- a/zscript/hud/swwm_hudextra.zsc
+++ b/zscript/hud/swwm_hudextra.zsc
@@ -5,9 +5,9 @@ Class PayRespects : HUDMessageBase
{
Vector2 basepos;
int lifespan, initialspan, starttic;
- transient Font TewiFont;
double scale;
- Vector2 hs, ss;
+ double hs;
+ Vector2 ss;
int seed, seed2;
static PayRespects PressF()
@@ -31,16 +31,14 @@ Class PayRespects : HUDMessageBase
override void ScreenSizeChanged()
{
- hs = StatusBar.GetHUDScale()*scale;
- hs.y = hs.x;
- ss = (Screen.GetWidth()/hs.x,Screen.GetHeight()/hs.y);
+ hs = CleanXFac*scale;
+ ss = (Screen.GetWidth(),Screen.GetHeight())/hs;
}
override void Draw( int bottom, int visibility )
{
Vector2 realpos = (basepos.x*ss.x,basepos.y*ss.y);
- if ( !TewiFont ) TewiFont = Font.GetFont('TewiShaded');
- Vector2 fo = (TewiFont.StringWidth("F")/2.,-TewiFont.GetHeight());
+ Vector2 fo = (smallfont.StringWidth("F")/2.,-smallfont.GetHeight());
// F rise up
int initspd = (128-seed);
if ( (initspd >= 0) && (initspd < 32) ) initspd = 32;
@@ -50,7 +48,7 @@ Class PayRespects : HUDMessageBase
fo.x += (.15*initspd)*((initialspan-(lifespan-fractic))**.6);
fo.y += ((initialspan-(lifespan-fractic))**1.6)-boostup*sin((90./initialspan)*(level.maptime+fractic-starttic));
double alph = clamp((lifespan+fractic)/double(initialspan),0.,1.);
- Screen.DrawText(TewiFont,Font.CR_GREEN,realpos.x-fo.x,realpos.y-fo.y,"F",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
+ Screen.DrawText(smallfont,Font.CR_GREEN,realpos.x-fo.x,realpos.y-fo.y,"F",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
}
}
@@ -58,13 +56,14 @@ Class PayRespects : HUDMessageBase
Class SWWMOneLiner : HUDMessageBase
{
String whichline;
+ transient BrokenLines l;
int lifespan, curtime;
- transient Font TewiFont, MPlusFont;
static SWWMOneLiner Make( String whichline, int lifespan )
{
let l = new("SWWMOneLiner");
- l.whichline = whichline;
+ if ( StringTable.Localize(whichline) == "" ) l.whichline = "";
+ else l.whichline = StringTable.Localize("$SWWM_LQUOTE")..StringTable.Localize(whichline)..StringTable.Localize("$SWWM_RQUOTE");
l.curtime = l.lifespan = lifespan;
return l;
}
@@ -76,44 +75,41 @@ Class SWWMOneLiner : HUDMessageBase
return (curtime<-20);
}
+ override void ScreenSizeChanged()
+ {
+ if ( l ) l.Destroy();
+ }
+
override void Draw( int bottom, int visibility )
{
- if ( !TewiFont ) TewiFont = Font.GetFont('TewiShaded');
- if ( !MPlusFont ) MPlusFont = Font.GetFont('MPlusShaded');
int margin = swwm_hudmargin;
- Vector2 hs;
- if ( swwm_hudscale <= 0 ) hs = StatusBar.GetHUDScale();
- else hs.x = swwm_hudscale;
- hs.y = hs.x;
- Vector2 ss = (Screen.GetWidth()/hs.x,Screen.GetHeight()/hs.y);
- String loc = StringTable.Localize(whichline);
- if ( loc.Length() <= 0 ) return; // don't draw empty strings
- String locs = StringTable.Localize("$SWWM_LQUOTE")..loc..StringTable.Localize("$SWWM_RQUOTE");
- Font fnt = TewiFont;
- if ( language ~== "jp" ) fnt = MPlusFont;
+ double hs;
+ if ( swwm_hudscale ) hs = CleanXFac_1;
+ else hs = max(floor(Screen.GetWidth()/640.),1.);
+ Vector2 ss = (Screen.GetWidth()/hs,Screen.GetHeight()/hs);
+ if ( whichline == "" ) return; // don't draw empty strings
// split so it can fit
- BrokenLines l = fnt.BreakLines(locs,int(ss.x*.5));
+ if ( !l ) l = smallfont.BreakLines(whichline,int(ss.x*.5));
int maxlen = 0;
for ( int i=0; i maxlen ) maxlen = len;
}
- int h = fnt.GetHeight();
+ int h = smallfont.GetHeight();
int fh = h*l.Count();
double fractic = SWWMStatusBar(statusbar)?SWWMStatusBar(statusbar).fractic:0;
double fcurtime = curtime-fractic;
double alph = clamp((fcurtime/20.)+1.,0.,1.);
alph *= clamp((lifespan-fcurtime)/10.,0.,1.);
- Screen.Dim("Black",alph*.8,int((Screen.GetWidth()-(maxlen+12)*hs.x)/2.),int(bottom-(margin+2+fh)*hs.y),int((maxlen+12)*hs.x),int((fh+4)*hs.y));
+ Screen.Dim("Black",alph*.8,int((Screen.GetWidth()-(maxlen+12)*hs)/2.),int(bottom-(margin+2+fh)*hs),int((maxlen+12)*hs),int((fh+4)*hs));
int yy = margin+fh;
for ( int i=0; i weapon )
{
let def = GetDefaultByType(weapon);
- icon = def.Icon;
wpn = def.GetTag();
txt = StringTable.Localize(def.tooltip);
- holdtics = 120;
+ holdtics = 150;
fadeintics = 5;
fadeouttics = 15;
tics = -10;
@@ -288,50 +265,34 @@ Class SWWMWeaponTooltip : HUDMessageBase
override void Draw( int bottom, int visibility )
{
if ( tics <= 0 ) return;
- if ( !tewifont ) tewifont = Font.GetFont('TewiShaded');
- if ( !mplusfont ) mplusfont = Font.GetFont('MPlusShaded');
- if ( !miniwifont ) miniwifont = Font.GetFont('MiniwiShaded');
- if ( !k6x8font ) k6x8font = Font.GetFont('k6x8Shaded');
- let fnt = tewifont;
- let fnt2 = miniwifont;
- if ( language ~== "jp" )
- {
- fnt = mplusfont;
- fnt2 = k6x8font;
- }
- Vector2 hs;
- if ( swwm_hudscale <= 0 ) hs = StatusBar.GetHUDScale();
- else hs.x = swwm_hudscale;
- hs.y = hs.x;
- Vector2 ss = (Screen.GetWidth()/hs.x,Screen.GetHeight()/hs.y);
+ double hs;
+ if ( swwm_hudscale ) hs = CleanXFac_1;
+ else hs = max(floor(Screen.GetWidth()/640.),1.);
+ Vector2 ss = (Screen.GetWidth()/hs,Screen.GetHeight()/hs);
double fractic = SWWMStatusBar(statusbar)?SWWMStatusBar(statusbar).fractic:0;
double ftics = tics+fractic;
double alpha = (ftics w ) w = lw;
}
- int cw = int(ceil((max(max(w1,w2),w)+8)/6.))*6;
- Screen.Dim("Black",.5*alpha,int((pos.x-(cw+4)/2)*hs.x),int((pos.y-(h+6))*hs.y),int((cw+4)*hs.x),int((8+h+4+fnt.GetHeight()+8+fnt2.GetHeight()*l.Count())*hs.y));
- Screen.DrawTexture(icon,false,pos.x,pos.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alpha,DTA_CenterBottomOffset,true);
- pos.y += 4;
- Screen.DrawText(fnt,Font.CR_FIRE,pos.x-w1/2,pos.y,wpn,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alpha);
+ int cw = int(ceil((max(w1,w)+8)/6.))*6;
+ int h = smallfont.GetHeight()+8+smallfont2.GetHeight()*l.Count();
+ Vector2 pos = (int(ss.x/2),ss.y-(swwm_hudmargin+80+h));
+ Screen.Dim("Black",.5*alpha,int((pos.x-(cw+4)/2)*hs),int((pos.y-2)*hs),int((cw+4)*hs),int((h+4)*hs));
+ Screen.DrawText(smallfont,Font.CR_FIRE,pos.x-w1/2,pos.y,wpn,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alpha);
for ( int i=0; i seqcnt) ) return;
EventHandler.SendNetworkEvent("swwmstoremessage."..chrname..": "..txt,level.totaltime,PRINT_CHAT,consoleplayer);
@@ -403,16 +362,14 @@ Class SWWMDirectMessage : HUDMessageBase
private void DrawText()
{
- if ( !fnt ) fnt = Font.GetFont('TewiShaded');
- if ( !jpfnt ) jpfnt = Font.GetFont('MPlusShaded');
if ( !l ) SetText();
int cur = charcnt;
- Vector2 pos = origin+(47,2);
+ Vector2 pos = origin+(47,3);
for ( int i=0; i 15 )
{
- delay = 30;
+ delay = startdelay;
seqnum++;
}
return false;
@@ -571,10 +528,10 @@ Class SWWMDirectMessage : HUDMessageBase
double fractic = SWWMStatusBar(statusbar)?SWWMStatusBar(statusbar).fractic:0;
if ( seqnum == 0 ) alph = (fadein+fractic)/15.;
else if ( seqnum == (seqcnt+1) ) alph = 1.-(fadeout+fractic)/30.;
- if ( swwm_hudscale <= 0 ) hs = StatusBar.GetHUDScale();
- else hs.x = swwm_hudscale;
- hs.y = hs.x;
- ss = (Screen.GetWidth()/hs.x,Screen.GetHeight()/hs.y);
+ double hs;
+ if ( swwm_hudscale ) hs = CleanXFac_1;
+ else hs = max(floor(Screen.GetWidth()/640.),1.);
+ ss = (Screen.GetWidth()/hs,Screen.GetHeight()/hs);
origin = (int(ss.x-270)/2,swwm_hudmargin+70);
Screen.DrawTexture(MessageBox,false,origin.x,origin.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,alph);
if ( (seqnum < 1) || (seqnum > seqcnt) ) return;
@@ -601,7 +558,8 @@ Class SWWMDialogueTrigger : Actor
{
"swwmultdoom2map20dlg"
};
- Console.MidPrint(null,dlglist[args[0]]);
+ if ( !swwm_nomapmsg )
+ Console.MidPrint(null,dlglist[args[0]]);
Destroy();
}
override void Tick() {}
diff --git a/zscript/swwm_thinkers_hud.zsc b/zscript/hud/swwm_hudobjects.zsc
similarity index 77%
rename from zscript/swwm_thinkers_hud.zsc
rename to zscript/hud/swwm_hudobjects.zsc
index ba21a87a8..0c1310db5 100644
--- a/zscript/swwm_thinkers_hud.zsc
+++ b/zscript/hud/swwm_hudobjects.zsc
@@ -1,32 +1,5 @@
-// thinkers related to the hud
-
-// "Full History" contains all messages since session start, nothing is flushed
-// this can be accessed from a section of the knowledge base
-Class SWWMFullHistory : Thinker
-{
- Array msg;
-
- static clearscope SWWMFullHistory Get()
- {
- let fh = SWWMFullHistory(ThinkerIterator.Create("SWWMFullHistory",STAT_STATIC).Next());
- return fh;
- }
-
- static void PushMessage( String str, int tic, int type )
- {
- let fh = SWWMFullHistory(ThinkerIterator.Create("SWWMFullHistory",STAT_STATIC).Next());
- if ( !fh )
- {
- fh = new("SWWMFullHistory");
- fh.ChangeStatNum(STAT_STATIC);
- }
- MsgLine m = new("MsgLine");
- m.str = str;
- m.tic = tic;
- m.type = type;
- fh.msg.Push(m);
- }
-}
+// hud-related storage objects
+// (used to be thinkers, but this might be lighter on performance)
Enum EScoreObjType
{
@@ -37,18 +10,17 @@ Enum EScoreObjType
};
// floating scores
-Class SWWMScoreObj : Thinker
+Class SWWMScoreObj play
{
- int xcnt;
- int xtcolor[6];
- int xscore[6];
- String xstr[6];
+ Array xtcolor;
+ Array xscore;
+ Array xstr;
int tcolor;
int score;
Vector3 pos;
int lifespan, initialspan;
int starttic, seed, seed2;
- SWWMScoreObj prev, next;
+ SWWMScoreObj next;
bool damnum;
Actor acc;
@@ -60,7 +32,6 @@ Class SWWMScoreObj : Thinker
let hnd = SWWMHandler(EventHandler.Find("SWWMHandler"));
if ( !hnd ) return null;
let o = new("SWWMScoreObj");
- o.ChangeStatNum(STAT_USER);
o.score = score;
o.pos = pos;
o.lifespan = o.initialspan = 60;
@@ -84,58 +55,33 @@ Class SWWMScoreObj : Thinker
o.seed = Random[ScoreBits]();
o.seed2 = Random[ScoreBits]();
o.damnum = (type > ST_Score);
- o.xcnt = 0;
- for ( int i=0; i<6; i++ ) o.xtcolor[i] = swwm_numcolor_bonus;
o.acc = acc;
if ( o.damnum )
{
o.next = hnd.damnums;
- if ( hnd.damnums ) hnd.damnums.prev = o;
hnd.damnums = o;
hnd.damnums_cnt++;
}
else
{
o.next = hnd.scorenums;
- if ( hnd.scorenums ) hnd.scorenums.prev = o;
hnd.scorenums = o;
hnd.scorenums_cnt++;
}
return o;
}
- override void OnDestroy()
+ void AppendXString( String xstr, int xscore = 0, int xtcolor = int.min )
{
- let hnd = SWWMHandler(EventHandler.Find("SWWMHandler"));
- if ( hnd )
- {
- if ( damnum )
- {
- hnd.damnums_cnt--;
- if ( !prev ) hnd.damnums = next;
- }
- else
- {
- hnd.scorenums_cnt--;
- if ( !prev ) hnd.scorenums = next;
- }
- if ( !prev )
- {
- if ( next ) next.prev = null;
- }
- else
- {
- prev.next = next;
- if ( next ) next.prev = prev;
- }
- }
- Super.OnDestroy();
+ self.xscore.Push(xscore);
+ self.xstr.Push(xstr);
+ self.xtcolor.Push((xtcolor==int.min)?swwm_numcolor_bonus:xtcolor);
}
- override void Tick()
+ bool Tick()
{
lifespan--;
- if ( lifespan <= 0 ) Destroy();
+ return (lifespan <= 0);
}
}
@@ -156,28 +102,27 @@ Class SWWMInterestMarker : MapMarker
States
{
Spawn:
- EIXT AB -1;
+ EIXT ABCD -1;
Stop;
}
}
-Class SWWMInterest : Thinker
+Class SWWMInterest play
{
- int type;
+ int type, exittype;
Key trackedkey;
Line trackedline;
Actor marker;
Vector3 pos;
- SWWMInterest prev, next;
+ SWWMInterest next;
String keytag;
- static SWWMInterest Spawn( Vector3 pos = (0,0,0), Key thekey = null, Line theline = null )
+ static SWWMInterest Spawn( Vector3 pos = (0,0,0), Key thekey = null, Line theline = null, int theexit = 0 )
{
let hnd = SWWMHandler(EventHandler.Find("SWWMHandler"));
if ( !hnd ) return null;
if ( (!thekey && !theline) || (thekey && theline) ) return null;
let i = new("SWWMInterest");
- i.ChangeStatNum(STAT_USER);
i.trackedkey = thekey;
i.trackedline = theline;
if ( thekey )
@@ -193,13 +138,16 @@ Class SWWMInterest : Thinker
}
else i.marker.picnum = thekey.SpawnState.GetSpriteTexture(0);
i.marker.target = thekey;
+ i.marker.scale = thekey.scale;
+ i.marker.bDORMANT = !level.allmap;
}
else if ( theline )
{
i.type = INT_Exit;
+ i.exittype = theexit;
i.marker = Actor.Spawn("SWWMInterestMarker",pos);
- if ( theline.special == Exit_Secret )
- i.marker.SetState(i.marker.SpawnState+1);
+ i.marker.SetState(i.marker.SpawnState+theexit);
+ i.marker.bDORMANT = !level.allmap;
}
else
{
@@ -208,56 +156,36 @@ Class SWWMInterest : Thinker
}
i.pos = thekey?thekey.Vec3Offset(0,0,thekey.height/2):pos;
i.next = hnd.intpoints;
- if ( hnd.intpoints ) hnd.intpoints.prev = i;
hnd.intpoints = i;
hnd.intpoints_cnt++;
return i;
}
- override void OnDestroy()
- {
- let hnd = SWWMHandler(EventHandler.Find("SWWMHandler"));
- if ( hnd )
- {
- hnd.intpoints_cnt--;
- if ( !prev )
- {
- hnd.intpoints = next;
- if ( next ) next.prev = null;
- }
- else
- {
- prev.next = next;
- if ( next ) next.prev = prev;
- }
- }
- Super.OnDestroy();
- }
-
- override void Tick()
+ bool Tick()
{
// update
if ( (type == INT_Key) && (!trackedkey || trackedkey.Owner) )
{
marker.Destroy();
- Destroy();
+ return true;
}
- else if ( trackedkey )
+ if ( trackedkey )
{
pos = trackedkey.Vec3Offset(0,0,trackedkey.height/2);
marker.SetOrigin(pos,true);
}
+ return false;
}
}
-Class SWWMItemSense : Thinker
+Class SWWMItemSense play
{
Actor item;
String tag;
int updated;
bool scoreitem, vipitem;
Demolitionist parent;
- SWWMItemSense prev, next;
+ SWWMItemSense next;
Vector3 pos;
static SWWMItemSense Spawn( Demolitionist parent, Actor item )
@@ -272,7 +200,6 @@ Class SWWMItemSense : Thinker
return s;
}
let i = new("SWWMItemSense");
- i.ChangeStatNum(STAT_USER);
i.item = item;
if ( item is 'SWWMRespawnTimer' )
{
@@ -289,7 +216,6 @@ Class SWWMItemSense : Thinker
i.UpdateTag();
i.pos = item.Vec3Offset(0,0,item.height);
i.next = parent.itemsense;
- if ( parent.itemsense ) parent.itemsense.prev = i;
parent.itemsense = i;
parent.itemsense_cnt++;
return i;
@@ -306,39 +232,16 @@ Class SWWMItemSense : Thinker
else tag = i.GetTag();
}
- override void OnDestroy()
+ bool Tick()
{
- if ( parent )
- {
- parent.itemsense_cnt--;
- if ( !prev )
- {
- parent.itemsense = next;
- if ( next ) next.prev = null;
- }
- else
- {
- prev.next = next;
- if ( next ) next.prev = prev;
- }
- }
- Super.OnDestroy();
- }
-
- override void Tick()
- {
- if ( !parent )
- {
- Destroy();
- return;
- }
// expire
- if ( level.maptime > updated+70 ) Destroy();
+ if ( !parent || (level.maptime > updated+70) ) return true;
+ return false;
}
}
// enemy combat tracker
-Class SWWMCombatTracker : Thinker
+Class SWWMCombatTracker play
{
Actor mytarget;
String mytag;
@@ -346,7 +249,7 @@ Class SWWMCombatTracker : Thinker
DynamicValueInterpolator intp;
Vector3 pos, prevpos, oldpos, oldprev;
PlayerInfo myplayer;
- SWWMCombatTracker prev, next;
+ SWWMCombatTracker next;
bool legged, mutated;
int tcnt;
double height;
@@ -366,7 +269,7 @@ Class SWWMCombatTracker : Thinker
realtag = mytarget.GetClassName();
SWWMUtility.BeautifyClassName(realtag);
}
- mytag = mytarget.player?(mytarget.player.mo!=mytarget)?String.Format(StringTable.Localize("$FN_VOODOO"),mytarget.player.GetUserName()):mytarget.player.GetUserName():realtag;
+ mytag = mytarget.player?(mytarget.player.mo!=mytarget)?String.Format(StringTable.Localize("$FN_VOODOO"),mytarget.player.GetUserName()):mytarget.player.GetUserName():((mytarget is 'PlayerPawn')&&(!mytarget.player))?StringTable.Localize("$FN_VOODOO_NP"):realtag;
}
else mytag = "";
}
@@ -385,7 +288,6 @@ Class SWWMCombatTracker : Thinker
return t;
}
t = new("SWWMCombatTracker");
- t.ChangeStatNum(STAT_USER);
t.mytarget = target;
t.UpdateTag();
if ( target.player )
@@ -405,51 +307,13 @@ Class SWWMCombatTracker : Thinker
t.next = hnd.trackers;
t.bBOSS = target.bBOSS;
t.bFRIENDLY = target.IsFriend(players[consoleplayer].mo);
- if ( hnd.trackers )
- {
- hnd.trackers.prev = t;
- // propagate cvar values
- t.mxdist = hnd.trackers.mxdist;
- t.dbar = hnd.trackers.dbar;
- }
hnd.trackers = t;
hnd.trackers_cnt++;
return t;
}
- override void OnDestroy()
+ bool Tick()
{
- let hnd = SWWMHandler(EventHandler.Find("SWWMHandler"));
- if ( hnd )
- {
- hnd.trackers_cnt--;
- if ( !prev )
- {
- hnd.trackers = next;
- if ( next ) next.prev = null;
- }
- else
- {
- prev.next = next;
- if ( next ) next.prev = prev;
- }
- }
- Super.OnDestroy();
- }
-
- override void Tick()
- {
- // only the first tracker accesses the CVars, saves on perf
- if ( !prev )
- {
- dbar = swwm_damagetarget;
- mxdist = swwm_maxtargetdist;
- }
- if ( next )
- {
- next.dbar = dbar;
- next.mxdist = mxdist;
- }
// is target gone or dead?
if ( !mytarget || (mytarget.Health <= 0) )
{
@@ -458,12 +322,12 @@ Class SWWMCombatTracker : Thinker
lasthealth = 0;
prevpos = pos; // prevent stuttering
intp.Update(lasthealth);
- if ( level.maptime > updated+35 ) Destroy();
- return;
+ if ( level.maptime > updated+35 ) return true;
+ return false;
}
// don't update dormant targets
if ( mytarget.bDORMANT )
- return;
+ return false;
// only update height/position while alive
bool heightchanged = false;
if ( height != mytarget.height ) heightchanged = true;
@@ -501,8 +365,7 @@ Class SWWMCombatTracker : Thinker
t.bUpdateMorph = true;
t.unmorphedtag = t.mytag;
t.mytag = String.Format("%s (%s)",mytag,t.unmorphedtag);
- Destroy();
- return;
+ return true;
}
}
}
@@ -530,7 +393,7 @@ Class SWWMCombatTracker : Thinker
mutated = true;
Console.Printf(StringTable.Localize("$SWWM_LTFORM"),mytag);
}
- }
+ }// voodoo dolls don't show as friendly
bFRIENDLY = mytarget.IsFriend(players[consoleplayer].mo);
if ( mytarget.Health < lasthealth ) firsthit = true;
lasthealth = mytarget.Health;
@@ -539,9 +402,9 @@ Class SWWMCombatTracker : Thinker
if ( dbar && !mytarget.player )
{
if ( (dbar == 2) && (lasthealth >= maxhealth) )
- return;
+ return false;
else if ( (dbar == 1) && !firsthit )
- return;
+ return false;
}
if ( (mytarget.bISMONSTER || mytarget.player) && !mytarget.bINVISIBLE && !mytarget.bCORPSE )
{
@@ -564,11 +427,12 @@ Class SWWMCombatTracker : Thinker
// special stuff, only if visible
if ( ((mxdist <= 0) || (mytarget.Vec3To(players[consoleplayer].Camera).length() < (mxdist/4))) && players[consoleplayer].Camera.CheckSight(mytarget,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) updated = level.maptime;
}
+ return false;
}
}
// ultralight trackers for certain things
-Class SWWMSimpleTracker : Thinker
+Class SWWMSimpleTracker play
{
Actor target;
double radius;
@@ -588,7 +452,7 @@ Class SWWMSimpleTracker : Thinker
bool isbeam;
int lastupdate;
ui double smoothalpha; // smoothened alpha, for ui
- SWWMSimpleTracker prev, next;
+ SWWMSimpleTracker next;
void Update()
{
@@ -664,11 +528,9 @@ Class SWWMSimpleTracker : Thinker
return t;
}
t = new("SWWMSimpleTracker");
- t.ChangeStatNum(STAT_INFO);
t.target = target;
t.Update();
t.next = hnd.strackers;
- if ( hnd.strackers ) hnd.strackers.prev = t;
hnd.strackers = t;
hnd.strackers_cnt++;
return t;
diff --git a/zscript/items/swwm_ammospawn.zsc b/zscript/items/swwm_ammospawn.zsc
index 47c3a756e..b17023be9 100644
--- a/zscript/items/swwm_ammospawn.zsc
+++ b/zscript/items/swwm_ammospawn.zsc
@@ -162,7 +162,6 @@ Class SWWMRocketAmmoSmall : SWWMAmmoSpawner
static Class PickAmmo( bool notondemand = false )
{
- /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('ModernSparkster')) ) return Random[Replacements](0,2)?'SparksterBAmmo':'SparksterRAmmo';*/
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('Quadravol')) ) return 'QuadravolAmmo';*/
return Random[Replacements](0,2)?'HellblazerMissiles':'HellblazerCrackshots';
}
@@ -173,11 +172,6 @@ Class SWWMRocketAmmoBig : SWWMAmmoSpawner
static Class PickAmmo( bool notondemand = false )
{
- /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('ModernSparkster')) )
- {
- if ( Random[Replacements](0,1) ) return Random[Replacements](0,2)?'SparksterBAmmo2':'SparksterBAmmo3';
- return Random[Replacements](0,2)?'SparksterRAmmo2':'SparksterRAmmo3';
- }*/
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('Quadravol')) )
return Random[Replacements](0,4)?'QuadravolAmmo2':'QuadravolAmmo3';*/
switch ( Random[Replacements](0,11) )
@@ -212,14 +206,13 @@ Class SWWMCellAmmoSmall : SWWMAmmoSpawner
{
if ( !Random[Replacements](0,3) )
{
- /*if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('MisterRifle')) ) return 'MisterGAmmo';*/
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('RayKhom')) ) return 'RayBolt2';*/
if ( notondemand || SWWMUtility.ItemExists('CandyGun') ) return 'CandyGunBullets';
}
- /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('EMPCarbine')) ) return 'EMPCore';*/
+ /*if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('MisterRifle')) ) return 'MisterGAmmo';*/
if ( notondemand || SWWMUtility.ItemExists('SilverBullet') ) return Random[Replacements](0,2)?'SilverBullets':'SilverBullets2';
}
- /*if ( !Random[Replacements](0,4) && (notondemand || SWWMUtility.ItemExists('BlackfireIgniter')) ) return 'DarkCanister';*/
+ /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('ModernSparkster')) ) return Random[Replacements](0,2)?'SparksterBAmmo':'SparksterRAmmo';*/
return 'SparkUnit';
}
}
@@ -231,8 +224,6 @@ Class SWWMCellAmmoBig : SWWMAmmoSpawner
{
if ( !Random[Replacements](0,3) )
{
- //if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('GrandLance')) && SWWMUtility.CheckNeedsItem('GrandAmmo',true) && !SWWMUtility.ItemExists('GrandAmmo',worldonly:true) && !SWWMUtility.ItemExists('GrandLance',worldonly:true) )
- // return 'GrandAmmo';
//if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('RafanKos')) && SWWMUtility.CheckNeedsItem('UltimateAmmo',true) && !SWWMUtility.ItemExists('UltimateAmmo',worldonly:true) && !SWWMUtility.ItemExists('RafanKos',worldonly:true) )
// return 'UltimateAmmo';
if ( (notondemand || SWWMUtility.ItemExists('Ynykron')) && SWWMUtility.CheckNeedsItem('YnykronAmmo',true) && !SWWMUtility.ItemExists('YnykronAmmo',worldonly:true) && !SWWMUtility.ItemExists('Ynykron',worldonly:true) )
@@ -240,7 +231,6 @@ Class SWWMCellAmmoBig : SWWMAmmoSpawner
}
/*if ( Random[Replacements](0,1) )
{
- if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('EMPCarbine')) ) return Random[Replacements](0,3)?'EMPCore2':'EMPCore';
if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('MisterRifle')) ) return Random[Replacements](0,2)?'MisterRound5':'MisterAmmo';
if ( notondemand || SWWMUtility.ItemExists('RayKhom') ) return Random[Replacements](0,2)?'RayBolt5':'RayAmmo';
}*/
@@ -250,7 +240,11 @@ Class SWWMCellAmmoBig : SWWMAmmoSpawner
return Random[Replacements](0,2)?'SilverBulletAmmo':'SilverBulletAmmo2';
}
if ( notondemand || SWWMUtility.ItemExists('CandyGun') ) return Random[Replacements](0,3)?'CandyGunBullets3':'CandyGunAmmo';
- /*if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('BlackfireIgniter')) ) return 'DarkCanister';*/
+ /*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('ModernSparkster')) )
+ {
+ if ( Random[Replacements](0,1) ) return Random[Replacements](0,2)?'SparksterBAmmo2':'SparksterBAmmo3';
+ return Random[Replacements](0,2)?'SparksterRAmmo2':'SparksterRAmmo3';
+ }*/
return Random[Replacements](0,3)?'SparkUnit':'SparkUnit2';
}
}
diff --git a/zscript/items/swwm_armor.zsc b/zscript/items/swwm_armor.zsc
index 0bffc56ba..38da632f8 100644
--- a/zscript/items/swwm_armor.zsc
+++ b/zscript/items/swwm_armor.zsc
@@ -7,7 +7,7 @@ Class ArmorNugget : SWWMArmor
Inventory.Amount 1;
Inventory.MaxAmount 200;
Inventory.InterHubAmount 200;
- SWWMArmor.ArmorPriority 1;
+ SWWMArmor.ArmorPriority 3;
SWWMArmor.GiverArmor "ArmorNuggetItem";
}
@@ -29,7 +29,7 @@ Class ArmorNuggetItem : SWWMSpareArmor
override void DoPickupSpecial( Actor toucher )
{
Super.DoPickupSpecial(toucher);
- SWWMUtility.AchievementProgressInc('swwm_progress_candy',1,toucher.player);
+ SWWMUtility.AchievementProgressInc("candy",1,toucher.player);
}
Default
@@ -73,7 +73,7 @@ Class BlastSuit : SWWMArmor
Inventory.MaxAmount 150;
Inventory.InterHubAmount 150;
Inventory.RestrictedTo "Demolitionist";
- SWWMArmor.ArmorPriority 2;
+ SWWMArmor.ArmorPriority 4;
SWWMArmor.DrainMessage "$D_BLASTSUIT";
SWWMArmor.GiverArmor "BlastSuitItem";
}
@@ -126,7 +126,7 @@ Class WarArmor : SWWMArmor
Inventory.MaxAmount 250;
Inventory.InterHubAmount 250;
Inventory.RestrictedTo "Demolitionist";
- SWWMArmor.ArmorPriority 6;
+ SWWMArmor.ArmorPriority 5;
SWWMArmor.DrainMessage "$D_WARARMOR";
SWWMArmor.GiverArmor "WarArmorItem";
}
diff --git a/zscript/items/swwm_basearmor.zsc b/zscript/items/swwm_basearmor.zsc
index e1d843187..2150c5d46 100644
--- a/zscript/items/swwm_basearmor.zsc
+++ b/zscript/items/swwm_basearmor.zsc
@@ -4,11 +4,17 @@ Class SWWMArmor : Armor abstract
int priority;
String drainmsg;
Class parent;
+ private int SArmorFlags;
Property ArmorPriority : priority;
Property DrainMessage : drainmsg;
Property GiverArmor : parent;
+ FlagDef NoHitFlash : SArmorFlags, 0; // doesn't flash when taking damage
+ FlagDef NoHitSound : SArmorFlags, 1; // doesn't play a sound when taking damage
+ FlagDef NoDrain : SArmorFlags, 2; // amount is not drained, will always reduce as long as amount is non-zero
+ // useful for powerup-given armors
+
Default
{
+INVENTORY.AUTOACTIVATE;
@@ -39,22 +45,6 @@ Class SWWMArmor : Armor abstract
}
}
if ( !found )
- {
- // is first item plating or a collar?
- if ( (other.Inv is 'AlmasteelPlating') || (other.Inv is 'SayaCollar') )
- {
- // we're good
- return;
- }
- // find first item with plating or collar after it
- for ( Inventory i=other.Inv; i; i=i.Inv )
- {
- if ( (i == self) || (!(i.Inv is 'AlmasteelPlating' ) && !(i.Inv is 'SayaCollar')) ) continue;
- found = i;
- break;
- }
- }
- if ( !found )
{
// check if first item in inventory is health or a sandwich
if ( (other.Inv is 'SWWMHealth') || (other.Inv is 'GrilledCheeseSandwich') )
@@ -70,15 +60,6 @@ Class SWWMArmor : Armor abstract
break;
}
}
- if ( !found )
- {
- // find last of either invinciball/ragekit/barrier power
- for ( Inventory i=other.Inv; i; i=i.Inv )
- {
- if ( !(i is 'InvinciballPower') && !(i is 'RagekitPower') && !(i is 'BarrierPower') ) continue;
- found = i;
- }
- }
if ( !found ) return;
// place ourselves right after it
Inventory saved = found.Inv;
@@ -96,12 +77,12 @@ Class SWWMArmor : Armor abstract
int saved;
if ( (amount <= 0) || DamageTypeDefinition.IgnoreArmor(damageType) || (damage <= 0) )
return;
- SWWMHandler.DoFlash(Owner,Color(int(clamp(damage*.15,1,16)),255,224,192),3);
- Owner.A_StartSound("armor/hit",CHAN_DAMAGE,CHANF_OVERLAP,clamp(damage*.03,0.,1.),2.5);
+ if ( !bNOHITFLASH ) SWWMHandler.DoFlash(Owner,Color(int(clamp(damage*.15,1,16)),255,224,192),3);
+ if ( !bNOHITSOUND ) Owner.A_StartSound("armor/hit",CHAN_DAMAGE,CHANF_OVERLAP,clamp(damage*.03,0.,1.),2.5);
saved = HandleDamage(damage,damageType,flags);
int healed = max(0,saved-damage);
saved = min(saved,damage);
- if ( amount <= saved ) saved = amount;
+ if ( !bNODRAIN && (amount <= saved) ) saved = amount;
newdamage -= saved;
if ( healed > 0 ) Owner.GiveBody(healed);
if ( (swwm_strictuntouchable == 1) && (saved > 0) && Owner.player )
@@ -109,12 +90,9 @@ Class SWWMArmor : Armor abstract
let hnd = SWWMHandler(EventHandler.Find("SWWMHandler"));
if ( hnd ) hnd.tookdamage[Owner.PlayerNumber()] = true;
}
- amount -= saved;
+ if ( !bNODRAIN ) amount -= saved;
damage = newdamage;
- bool shouldautouse = false;
- if ( swwm_enforceautousearmor == 1 ) shouldautouse = true;
- else if ( swwm_enforceautousearmor == -1 ) shouldautouse = false;
- else shouldautouse = CVar.GetCVar('swwm_autousearmor',Owner.player).GetBool();
+ bool shouldautouse = CVar.GetCVar('swwm_autousearmor',Owner.player).GetBool();
if ( (amount <= (MaxAmount-default.Amount)) && (Owner.CountInv(parent) > 0) && shouldautouse )
{
if ( GetDefaultByType(parent).UseSound ) Owner.A_StartSound(GetDefaultByType(parent).UseSound,CHAN_ITEMEXTRA,CHANF_OVERLAP,.6);
diff --git a/zscript/items/swwm_basehealth.zsc b/zscript/items/swwm_basehealth.zsc
index 12e3d94f8..70dbd9128 100644
--- a/zscript/items/swwm_basehealth.zsc
+++ b/zscript/items/swwm_basehealth.zsc
@@ -39,7 +39,7 @@ Class SWWMHealth : Inventory abstract
// find last armor item, plating or collar
for ( Inventory i=other.Inv; i; i=i.Inv )
{
- if ( !(i is 'SWWMArmor') && !(i is 'AlmasteelPlating') && !(i is 'SayaCollar') ) continue;
+ if ( !(i is 'SWWMArmor') ) continue;
found = i;
}
}
@@ -59,15 +59,6 @@ Class SWWMHealth : Inventory abstract
break;
}
}
- if ( !found )
- {
- // find last of either invinciball/ragekit/barrier power
- for ( Inventory i=other.Inv; i; i=i.Inv )
- {
- if ( !(i is 'InvinciballPower') && !(i is 'RagekitPower') && !(i is 'BarrierPower') ) continue;
- found = i;
- }
- }
if ( !found ) return;
// place ourselves right after it
Inventory saved = found.Inv;
@@ -109,10 +100,7 @@ Class SWWMHealth : Inventory abstract
return; // this damage type is ignored by the player, so it does not affect us
if ( damageType == 'EndLevel' )
return; // don't trigger on endlevel damage
- bool shouldautouse = false;
- if ( swwm_enforceautousehealth == 1 ) shouldautouse = true;
- else if ( swwm_enforceautousehealth == -1 ) shouldautouse = false;
- else shouldautouse = CVar.GetCVar('swwm_autousehealth',Owner.player).GetBool();
+ bool shouldautouse = CVar.GetCVar('swwm_autousehealth',Owner.player).GetBool();
if ( !shouldautouse && !bBIGPOWERUP ) return; // powerup health is always auto-used
if ( (Owner.Health-damage <= (GetDefaultByType(giveme).MaxAmount-GetDefaultByType(giveme).Amount)) )
{
diff --git a/zscript/items/swwm_collectibles.zsc b/zscript/items/swwm_collectibles.zsc
index 57dc57e00..27303b7d1 100644
--- a/zscript/items/swwm_collectibles.zsc
+++ b/zscript/items/swwm_collectibles.zsc
@@ -7,9 +7,11 @@ Class SWWMCollectible : Inventory abstract
int avail;
bool propagated;
Class gesture;
+ String getline;
Property Availability : avail;
Property GestureWeapon : gesture;
+ Property GetLine : getline;
// minimum gametype requirements
enum EAvailability
@@ -86,7 +88,7 @@ Class SWWMCollectible : Inventory abstract
if ( !(i is 'SWWMCollectible') ) continue;
cnc++;
}
- SWWMUtility.AchievementProgress('swwm_progress_allcoll',cnc,other.player);
+ SWWMUtility.AchievementProgress("allcoll",cnc,other.player);
// we're only attaching to the other players
if ( propagated ) return;
// give credit
@@ -123,6 +125,7 @@ Class GenericCube : SWWMCollectible
Tag "$T_PERFECTLYGENERIC";
Inventory.PickupMessage "$T_PERFECTLYGENERIC";
SWWMCollectible.GestureWeapon "GenericCubeGesture";
+ SWWMCollectible.GetLine "cubeget";
Stamina 1000;
}
}
@@ -133,6 +136,7 @@ Class AkariProject : SWWMCollectible
Tag "$T_AKARIPROJECT";
Inventory.PickupMessage "$T_AKARIPROJECT";
SWWMCollectible.GestureWeapon "AkariProjectGesture";
+ SWWMCollectible.GetLine "akariget";
Stamina 2000;
Radius 4;
Height 22;
@@ -145,6 +149,7 @@ Class LoveSignalsCD : SWWMCollectible
Tag "$T_LOVESIGNALS";
Inventory.PickupMessage "$T_LOVESIGNALS";
SWWMCollectible.GestureWeapon "LoveSignalsCDGesture";
+ SWWMCollectible.GetLine "signalsget";
Stamina 3000;
Radius 4;
Height 21;
@@ -157,6 +162,7 @@ Class NutatcoBar : SWWMCollectible
Tag "$T_NUTATCO";
Inventory.PickupMessage "$T_NUTATCO";
SWWMCollectible.GestureWeapon "NutatcoBarGesture";
+ SWWMCollectible.GetLine "nutatcoget";
Stamina 200;
Radius 3;
Height 22;
@@ -169,6 +175,7 @@ Class FrispyCorn : SWWMCollectible
Tag "$T_FRISPYCORN";
Inventory.PickupMessage "$T_FRISPYCORN";
SWWMCollectible.GestureWeapon "FrispyCornGesture";
+ SWWMCollectible.GetLine "frispyget";
Stamina 400;
Radius 5;
Height 23;
@@ -183,6 +190,7 @@ Class SayaBean : SWWMCollectible
Tag "$T_SAYABEAN";
Inventory.PickupMessage "$T_SAYABEAN";
SWWMCollectible.GestureWeapon "SayaBeanGesture";
+ SWWMCollectible.GetLine "sayaget";
Stamina 5000;
Radius 6;
Height 23;
@@ -212,6 +220,7 @@ Class MothPlushy : SWWMCollectible
Tag "$T_MOTHPLUSH";
Inventory.PickupMessage "$T_MOTHPLUSH";
SWWMCollectible.GestureWeapon "MothPlushyGesture";
+ SWWMCollectible.GetLine "mothget";
Stamina 7000;
Radius 12;
Height 32;
@@ -226,6 +235,7 @@ Class DemoPlush : SWWMCollectible
Inventory.PickupMessage "$T_DEMOPLUSH";
SWWMCollectible.Availability AVAIL_Heretic;
SWWMCollectible.GestureWeapon "DemoPlushGesture";
+ SWWMCollectible.GetLine "demoget";
Stamina 6000;
Radius 12;
Height 36;
@@ -240,6 +250,7 @@ Class KirinCummies : SWWMCollectible
Inventory.PickupMessage "$T_PEACH";
SWWMCollectible.Availability AVAIL_Hexen;
SWWMCollectible.GestureWeapon "KirinCummiesGesture";
+ SWWMCollectible.GetLine "peachget";
Stamina 300;
Radius 3;
Height 21;
@@ -253,6 +264,7 @@ Class MilkBreads : SWWMCollectible
Inventory.PickupMessage "$T_MILKBREAD";
SWWMCollectible.Availability AVAIL_Hexen;
SWWMCollectible.GestureWeapon "MilkBreadsGesture";
+ SWWMCollectible.GetLine "breadget";
Stamina 900;
Radius 4;
Height 21;
@@ -266,6 +278,7 @@ Class KirinManga : SWWMCollectible
Inventory.PickupMessage "$T_KIRINMANGA";
SWWMCollectible.Availability AVAIL_Hexen;
SWWMCollectible.GestureWeapon "KirinMangaGesture";
+ SWWMCollectible.GetLine "mangaget";
Stamina 1600;
Radius 4;
Height 22;
@@ -279,6 +292,7 @@ Class KirinPlush : SWWMCollectible
Inventory.PickupMessage "$T_KIRINPLUSH";
SWWMCollectible.Availability AVAIL_Hexen;
SWWMCollectible.GestureWeapon "KirinPlushGesture";
+ SWWMCollectible.GetLine "kiringet";
Stamina 8000;
Radius 14;
Height 37;
diff --git a/zscript/items/swwm_collectibles_gesture.zsc b/zscript/items/swwm_collectibles_gesture.zsc
index abea64311..fd2ba4165 100644
--- a/zscript/items/swwm_collectibles_gesture.zsc
+++ b/zscript/items/swwm_collectibles_gesture.zsc
@@ -106,7 +106,7 @@ Class SayaBeanGesture : SWWMItemGesture
let s = Demolitionist(self).mystats;
if ( !s ) return;
s.plushuses++;
- SWWMUtility.AchievementProgress('swwm_progress_plush',s.plushuses,player);
+ SWWMUtility.AchievementProgress("plush",s.plushuses,player);
}
override void MarkPrecacheSounds()
{
@@ -250,7 +250,7 @@ Class KirinPlushGesture : SWWMItemGesture
let s = Demolitionist(self).mystats;
if ( !s ) return;
s.plushuses++;
- SWWMUtility.AchievementProgress('swwm_progress_plush',s.plushuses,player);
+ SWWMUtility.AchievementProgress("plush",s.plushuses,player);
}
action void A_PetPlush()
{
@@ -269,44 +269,17 @@ Class KirinPlushGesture : SWWMItemGesture
s.angle = FRandom[ExploS](0,360);
s.pitch = FRandom[ExploS](-90,90);
}
- if ( GiveBody(10,100) )
+ int givehp = (Health<=25)?25:(Health<=50)?15:(Health<=100)?10:5;
+ if ( GiveBody(givehp,200) )
{
- SWWMScoreObj.Spawn(10,Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+Height/2),ST_Health);
+ SWWMScoreObj.Spawn(givehp,Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+Height/2),ST_Health);
SWWMHandler.DoFlash(self,Color(32,224,128,255),10);
}
}
- action void A_Giggle( bool high = false )
- {
- if ( swwm_mutevoice < 4 )
- A_StartSound(String.Format("voice/%s/%s",Demolitionist(self).myvoice.GetString(),high?"gigglehigh":"gigglelow"),CHAN_DEMOVOICE,CHANF_OVERLAP);
- }
action void A_KirinGiggle()
{
A_StartSound("kirin/giggle",CHAN_ITEMEXTRA,CHANF_OVERLAP);
}
- action void A_HugPlush( bool sigh = false )
- {
- if ( sigh )
- {
- if ( swwm_mutevoice < 4 )
- A_StartSound(String.Format("voice/%s/hug",Demolitionist(self).myvoice.GetString()),CHAN_DEMOVOICE,CHANF_OVERLAP);
- SWWMHandler.DoFlash(self,Color(64,255,128,128),10);
- SWWMHandler.DoFlash(self,Color(32,255,128,128),80);
- int numpt = Random[ExploS](6,9);
- for ( int i=0; i 0) && ((s.GetTexture(0) == skyflatnum) || (s.damageamount > 0)) ) continue;
- BlockThingsIterator bt = BlockThingsIterator.CreateFromPos(testpos.x,testpos.y,testpos.z,56,256,false);
+ BlockThingsIterator bt = BlockThingsIterator.CreateFromPos(testpos.x,testpos.y,testpos.z,60,256,false);
while ( bt.Next() )
{
if ( !bt.Thing ) continue;
@@ -954,7 +954,19 @@ Class Chancebox : Actor
if ( (candidates.Size() <= 0) || invoker.dud )
{
// no candidates? just burst into treats
- if ( Random[Chancebox](0,1) )
+ if ( (scale.x > .5) && (Random[Chancebox](0,int(9*scale.x*scale.x)) < 3) )
+ {
+ // spawn another smaller chancebox
+ // (chance increases for the inner box, up until a scale factor of 50% is reached)
+ let a = Spawn("Chancebox",pos+(0,0,3*scale.y));
+ a.bDROPPED = false;
+ a.bNOGRAVITY = false;
+ a.vel.z = FRandom[Chancebox](2,4);
+ a.angle = angle;
+ a.scale *= scale.x-.125;
+ if ( target && (a.scale.x <= .5) ) SWWMUtility.MarkAchievement("matryoshka",target.player);
+ }
+ else if ( Random[Chancebox](0,1) )
{
Class vipammodrop = null;
if ( SWWMUtility.ItemExists("Ynykron") && Random[Chancebox](0,1) ) vipammodrop = "YnykronAmmo";
@@ -1109,14 +1121,14 @@ Class Chancebox : Actor
}
action void A_Confetti()
{
- A_StartSound("misc/tada",CHAN_ITEM);
+ A_StartSound("misc/tada",CHAN_ITEM,pitch:1./scale.x);
double ang, pt;
int numpt = Random[ExploS](100,120);
for ( int i=0; i40,"BlowUp");
+ return A_JumpIf(special1>int(40*scale.x),"BlowUp");
}
Wait;
BlowUp:
XZW2 A 1
{
- A_SetSize(12,3);
+ A_SetSize(default.radius*scale.x,2.5*scale.y);
A_QuakeEx(2,2,2,9,0,500,"",QF_RELATIVE|QF_SCALEDOWN,falloff:200,rollIntensity:.2);
- A_StartSound("chancebox/explode",CHAN_VOICE);
+ A_StartSound("chancebox/explode",CHAN_VOICE,pitch:1./scale.x);
angle = specialf1;
pitch = roll = 0;
- let t = Spawn("ChanceboxTop",Vec3Offset(0,0,20));
+ let t = Spawn("ChanceboxTop",Vec3Offset(0,0,20*scale.y));
t.angle = angle;
- let s1 = Spawn("ChanceboxSide",level.Vec3Offset(pos,(RotateVector((12,0),angle+90),0)));
+ t.scale = scale;
+ let s1 = Spawn("ChanceboxSide",level.Vec3Offset(pos,(RotateVector((12*scale.x,0),angle+90),0)));
s1.angle = angle+90;
- let s2 = Spawn("ChanceboxSide",level.Vec3Offset(pos,(RotateVector((12,0),angle-90),0)));
+ s1.scale = scale;
+ let s2 = Spawn("ChanceboxSide",level.Vec3Offset(pos,(RotateVector((12*scale.x,0),angle-90),0)));
s2.angle = angle-90;
+ s2.scale = scale;
A_DropSomething();
}
XZW2 BCDEFGHIJKLMNO 1;
@@ -1312,6 +1330,7 @@ Class ChanceboxTop : Actor
{
Super.PostBeginPlay();
vel = (0,0,20);
+ A_SetSize(default.radius*scale.x,default.height*scale.y);
}
States
{
@@ -1347,6 +1366,7 @@ Class ChanceboxSide : Actor
{
Super.PostBeginPlay();
vel = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch))*20;
+ A_SetSize(default.radius*scale.x,default.height*scale.y);
}
States
{
diff --git a/zscript/items/swwm_health.zsc b/zscript/items/swwm_health.zsc
index 60d01dcb4..30940f31f 100644
--- a/zscript/items/swwm_health.zsc
+++ b/zscript/items/swwm_health.zsc
@@ -74,7 +74,7 @@ Class HealthNuggetItem : SWWMHealth
override void DoPickupSpecial( Actor toucher )
{
Super.DoPickupSpecial(toucher);
- SWWMUtility.AchievementProgressInc('swwm_progress_candy',1,toucher.player);
+ SWWMUtility.AchievementProgressInc("candy",1,toucher.player);
}
Default
{
@@ -179,7 +179,7 @@ Class RefresherItem : SWWMHealth
}
override void AutoUseExtra( bool recursive )
{
- SWWMUtility.AchievementProgressInc('swwm_progress_refresh',1,Owner.player);
+ SWWMUtility.AchievementProgressInc("refresh",1,Owner.player);
// regen effect doesn't stack if we autoactivated recursively
if ( recursive ) return;
let p = Powerup(Owner.FindInventory("RefresherRegen"));
diff --git a/zscript/items/swwm_keys.zsc b/zscript/items/swwm_keys.zsc
index 651a10f79..69bb086d3 100644
--- a/zscript/items/swwm_keys.zsc
+++ b/zscript/items/swwm_keys.zsc
@@ -10,49 +10,30 @@ Class SWWMKey : Key abstract
Property GestureWeapon : gesture;
- override void DoEffect()
+ override bool TryPickup( in out Actor toucher )
{
- Super.DoEffect();
- if ( Icon.IsNull() )
- {
- // fetch icon from parent (if it exists)
- Class pc = Species;
- if ( !pc ) return;
- let p = GetDefaultByType(pc);
- Icon = p.Icon;
- }
- }
-
- override void AttachToOwner( Actor other )
- {
- Super.AttachToOwner(other);
- // also attach the vanilla key that we replace, mainly for script compatibility
+ // attach the vanilla key that we replace
+ let rt = toucher;
+ if ( toucher.player ) rt = toucher.player.mo;
Class pc = Species;
- if ( pc )
+ if ( pc && !rt.FindInventory(pc) )
{
+ if ( rt.player && !deathmatch && !propagated && CVar.GetCVar('swwm_collectanimkey',rt.player).GetBool() )
+ SWWMGesture.SetSpecialGesture(rt.player.mo,gesture);
let p = Inventory(Spawn(pc));
- if ( Owner is 'Demolitionist' )
- Demolitionist(Owner).key_reentrant = true; // avoid infinite loop
- p.AttachToOwner(Owner);
- if ( Owner is 'Demolitionist' )
- Demolitionist(Owner).key_reentrant = false;
+ SWWMHandler.KeyTagFix(p);
+ p.AttachToOwner(rt);
}
- }
-
- override bool Use( bool pickup )
- {
- if ( Owner.player && !propagated && !deathmatch && (!pickup || CVar.GetCVar('swwm_collectanimkey',Owner.player).GetBool()) )
- SWWMGesture.SetSpecialGesture(Owner.player.mo,gesture);
// clean up the flag
propagated = false;
- return false;
+ GoAwayAndDie();
+ return true;
}
Default
{
+NOTDMATCH;
+FLOATBOB;
- +INVENTORY.AUTOACTIVATE;
FloatBobStrength 0.25;
}
}
diff --git a/zscript/items/swwm_powerups.zsc b/zscript/items/swwm_powerups.zsc
index 152ad99c4..f3792503a 100644
--- a/zscript/items/swwm_powerups.zsc
+++ b/zscript/items/swwm_powerups.zsc
@@ -38,7 +38,7 @@ Class GrilledCheeseSandwich : Inventory
}
void DoTheThing( bool extrasafe = false )
{
- SWWMUtility.AchievementProgressInc('swwm_progress_gcsandwich',1,Owner.player);
+ SWWMUtility.AchievementProgressInc("gcsandwich",1,Owner.player);
SWWMHandler.DoFlash(Owner,Color(64,255,255,64),10);
Owner.A_QuakeEx(9,9,9,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.);
Owner.GiveBody(1000,1000);
@@ -183,11 +183,11 @@ Class GrilledCheeseSandwich : Inventory
override void AttachToOwner( Actor other )
{
Super.AttachToOwner(other);
- // find last armor/health item or invuln/ragekit/barrier or the collar
+ // find last armor/health item
Inventory found = null;
for ( Inventory i=other.Inv; i; i=i.Inv )
{
- if ( !(i is 'SWWMHealth') && !(i is 'SWWMArmor') && !(i is 'InvinciballPower') && !(i is 'RagekitPower') && !(i is 'BarrierPower') && !(i is 'AlmasteelPlating') && !(i is 'SayaCollar') ) continue;
+ if ( !(i is 'SWWMHealth') && !(i is 'SWWMArmor') ) continue;
found = i;
}
if ( !found ) return;
@@ -204,7 +204,7 @@ Class GrilledCheeseSandwich : Inventory
override void PostTeleport( Vector3 destpos, double destangle, int flags )
{
if ( !lastdropper ) return;
- SWWMUtility.MarkAchievement('swwm_achievement_tele',lastdropper.player);
+ SWWMUtility.MarkAchievement("tele",lastdropper.player);
}
Default
@@ -504,7 +504,7 @@ Class GhostArtifact : Inventory
Demolitionist(Owner).lastbump *= 1.04;
}
else Owner.GiveInventory("GhostPower",1);
- SWWMUtility.AchievementProgressInc('swwm_progress_ghost',1,Owner.player);
+ SWWMUtility.AchievementProgressInc("ghost",1,Owner.player);
return true;
}
@@ -659,7 +659,7 @@ Class GravitySuppressor : Inventory
Demolitionist(Owner).lastbump *= 1.04;
}
else Owner.GiveInventory("GravityPower",1);
- SWWMUtility.AchievementProgressInc('swwm_progress_gravity',1,Owner.player);
+ SWWMUtility.AchievementProgressInc("gravity",1,Owner.player);
return true;
}
override void PreTravelled()
@@ -778,11 +778,35 @@ Class InvinciSnd : Actor
}
}
+Class InvinciballArmor : SWWMArmor
+{
+ Default
+ {
+ +SWWMARMOR.NOHITSOUND;
+ +SWWMARMOR.NOHITFLASH;
+ +SWWMARMOR.NODRAIN;
+ SWWMArmor.ArmorPriority 9;
+ }
+ override int HandleDamage( int damage, Name damageType, int flags )
+ {
+ if ( damageType == 'EndLevel' ) return 0;
+ if ( master ) InvinciballPower(master).DoHitFX();
+ return damage;
+ }
+ override void DoEffect()
+ {
+ Super.DoEffect();
+ if ( !Owner.FindInventory('InvinciballPower') )
+ Destroy();
+ }
+}
+
Class InvinciballPower : Powerup
{
Mixin SWWMShadedPowerup;
Actor l, snd;
+ Inventory am;
int lasteffect;
transient int lastpulse;
@@ -815,6 +839,14 @@ Class InvinciballPower : Powerup
if ( !snd ) snd = Spawn("InvinciSnd",Owner.pos);
snd.target = Owner;
snd.master = self;
+ if ( am ) return;
+ am = Owner.FindInventory("InvinciballArmor");
+ if ( !am )
+ {
+ am = Inventory(Spawn("InvinciballArmor"));
+ am.AttachToOwner(Owner);
+ }
+ am.master = self;
}
override void EndEffect()
@@ -828,47 +860,16 @@ Class InvinciballPower : Powerup
if ( (EffectTics <= 0) && Owner && Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_INVINCIBALL"));
}
- override void AttachToOwner( Actor other )
+ void DoHitFX()
{
- Super.AttachToOwner(other);
- // find first with health/armor, plating/collar, sandwich after it
- Inventory found = null;
- for ( Inventory i=other.Inv; i; i=i.Inv )
+ if ( level.maptime > lasteffect+5 )
{
- if ( !(i.Inv is 'SWWMHealth') && !(i.Inv is 'SWWMArmor') && !(i.Inv is 'GrilledCheeseSandwich') && !(i.Inv is 'AlmasteelPlating') && !(i.Inv is 'SayaCollar') ) continue;
- found = i;
- break;
- }
- if ( !found )
- {
- // we're good
- return;
- }
- // place ourselves right after it
- Inventory saved = found.Inv;
- found.Inv = self;
- other.Inv = Inv;
- Inv = saved;
- }
-
- override void AbsorbDamage( int damage, Name damageType, out int newdamage, Actor inflictor, Actor source, int flags )
- {
- if ( Owner.ApplyDamageFactor(damageType,damage) <= 0 )
- return; // this damage type is ignored, so don't flash
- if ( damageType == 'EndLevel' )
- return; // don't trigger on endlevel damage
- if ( damage > 0 )
- {
- newdamage = 0;
- if ( level.maptime > lasteffect+5 )
- {
- SWWMHandler.DoFlash(Owner,Color(64,255,64,0),15);
- Owner.A_StartSound("powerup/invinciballhit",CHAN_POWERUP,CHANF_OVERLAP);
- lasteffect = level.maptime;
- lastpulse = max(lastpulse,gametic+20);
- if ( Owner is 'Demolitionist' )
- Demolitionist(Owner).lastbump *= 1.05;
- }
+ SWWMHandler.DoFlash(Owner,Color(64,255,64,0),15);
+ Owner.A_StartSound("powerup/invinciballhit",CHAN_POWERUP,CHANF_OVERLAP);
+ lasteffect = level.maptime;
+ lastpulse = max(lastpulse,gametic+20);
+ if ( Owner is 'Demolitionist' )
+ Demolitionist(Owner).lastbump *= 1.05;
}
}
}
@@ -910,7 +911,7 @@ Class FuckingInvinciball : Inventory
Demolitionist(Owner).lastbump *= 1.1;
}
else Owner.GiveInventory("InvinciballPower",1);
- SWWMUtility.AchievementProgressInc('swwm_progress_sunny',1,Owner.player);
+ SWWMUtility.AchievementProgressInc("sunny",1,Owner.player);
return true;
}
override void PreTravelled()
@@ -1030,11 +1031,34 @@ Class RageSnd : Actor
}
}
+Class RagekitArmor : SWWMArmor
+{
+ Default
+ {
+ +SWWMARMOR.NOHITSOUND;
+ +SWWMARMOR.NOHITFLASH;
+ +SWWMARMOR.NODRAIN;
+ SWWMArmor.ArmorPriority 8;
+ }
+ override int HandleDamage( int damage, Name damageType, int flags )
+ {
+ if ( damageType != 'EndLevel' ) return 0;
+ return int(damage*.75);
+ }
+ override void DoEffect()
+ {
+ Super.DoEffect();
+ if ( !Owner.FindInventory('RagekitPower') )
+ Destroy();
+ }
+}
+
Class RagekitPower : Powerup
{
Mixin SWWMShadedPowerup;
Actor l, snd;
+ Inventory am;
int lasteffect;
transient int lastpulse, lastrage;
@@ -1088,11 +1112,18 @@ Class RagekitPower : Powerup
SWWMScoreObj.Spawn(1,Owner.Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+Owner.Height/2),ST_Health);
Owner.A_AlertMonsters(swwm_uncapalert?0:2000);
if ( (Owner.player == players[consoleplayer]) && (gametic > lastrage) && (swwm_mutevoice < 2) )
- lastrage = SWWMHandler.AddOneliner("ragekit",2,5)+40;
+ lastrage = SWWMHandler.AddOneliner("ragekit",2,5)+20;
Owner.A_QuakeEx(2,2,2,Random[Rage](1,2),0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.5);
lastpulse = max(lastpulse,gametic+10);
Demolitionist(Owner).lastbump *= .995;
}
+ if ( am ) return;
+ am = Owner.FindInventory("RagekitArmor");
+ if ( !am )
+ {
+ am = Inventory(Spawn("RagekitArmor"));
+ am.AttachToOwner(Owner);
+ }
}
override void EndEffect()
@@ -1107,29 +1138,6 @@ Class RagekitPower : Powerup
if ( (EffectTics <= 0) && Owner && Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_RAGEKIT"));
}
- override void AttachToOwner( Actor other )
- {
- Super.AttachToOwner(other);
- // find first with health/armor, plating/collar, sandwich or barrier after it
- Inventory found = null;
- for ( Inventory i=other.Inv; i; i=i.Inv )
- {
- if ( !(i.Inv is 'SWWMHealth') && !(i.Inv is 'SWWMArmor') && !(i.Inv is 'GrilledCheeseSandwich') && !(i.Inv is 'AlmasteelPlating') && !(i.Inv is 'SayaCollar') && !(i.Inv is 'BarrierPower') ) continue;
- found = i;
- break;
- }
- if ( !found )
- {
- // we're good
- return;
- }
- // place ourselves right after it
- Inventory saved = found.Inv;
- found.Inv = self;
- other.Inv = Inv;
- Inv = saved;
- }
-
void DoHitFX()
{
if ( level.maptime <= lasteffect+5 ) return;
@@ -1146,13 +1154,6 @@ Class RagekitPower : Powerup
Demolitionist(Owner).lastbump *= .9;
}
- override void AbsorbDamage( int damage, Name damageType, out int newdamage, Actor inflictor, Actor source, int flags )
- {
- if ( damageType == 'EndLevel' )
- return; // don't trigger on endlevel damage
- if ( damage > 0 ) newdamage = damage/4;
- }
-
override void ModifyDamage( int damage, Name damageType, out int newdamage, bool passive, Actor inflictor, Actor source, int flags )
{
if ( passive ) return;
@@ -1186,7 +1187,7 @@ Class Ragekit : Inventory
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
if ( Owner.GiveBody(100,100) )
SWWMScoreObj.Spawn(100,Owner.Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+Owner.Height/2),ST_Health);
- SWWMUtility.AchievementProgressInc('swwm_progress_rage',1,Owner.player);
+ SWWMUtility.AchievementProgressInc("rage",1,Owner.player);
if ( !(Owner is 'Demolitionist') )
{
SWWMHandler.DoFlash(Owner,Color(64,255,0,0),30);
@@ -1265,64 +1266,42 @@ Class Omnisight : Inventory
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
- override bool Use( bool pickup )
+ override bool TryPickup( in out Actor toucher )
{
if ( !level.allmap )
{
- if ( Owner.player == players[consoleplayer] )
+ Actor rt = toucher;
+ if ( toucher.player ) rt = toucher.player.mo;
+ if ( rt.player == players[consoleplayer] )
{
- Owner.A_StartSound("powerup/omnisight",CHAN_ITEMEXTRA,CHANF_OVERLAP);
+ rt.A_StartSound("powerup/omnisight",CHAN_ITEMEXTRA,CHANF_OVERLAP);
// automatically zoom out so the player can know how far this goes
CVar.FindCVar('swwm_mm_zoom').SetFloat(2.);
}
- if ( Owner is 'Demolitionist' )
- Demolitionist(Owner).lastbump *= 1.1;
+ if ( rt is 'Demolitionist' )
+ Demolitionist(rt).lastbump *= 1.1;
level.allmap = true;
- }
- // activate all interest markers
- let ti = ThinkerIterator.Create("SWWMInterestMarker",STAT_MAPMARKER);
- Actor a;
- while ( a = Actor(ti.Next()) ) a.bDORMANT = false;
- // spread to all players
- for ( int i=0; i 1.) )
- CVar.FindCVar('swwm_mm_zoom').SetFloat(1.);
- Super.DetachFromOwner();
- }
- override bool HandlePickup( Inventory item )
- {
- if ( item.GetClass() == GetClass() )
- {
- item.bPickupGood = true;
- return true;
- }
- return false;
- }
- override bool ShouldSpawn()
- {
- if ( deathmatch ) return false;
- return Super.ShouldSpawn();
+ GoAwayAndDie();
+ return true;
}
Default
{
@@ -1334,17 +1313,13 @@ Class Omnisight : Inventory
Inventory.Icon "graphics/HUD/Icons/I_Omnisight.png";
Inventory.PickupSound "misc/p_pkup";
Inventory.PickupMessage "$I_OMNISIGHT";
- Inventory.MaxAmount 1;
- Inventory.InterHubAmount 0;
Inventory.RestrictedTo "Demolitionist";
Inventory.PickupFlash "SWWMPurplePickupFlash";
+INVENTORY.ALWAYSPICKUP;
- +INVENTORY.AUTOACTIVATE;
+COUNTITEM;
+INVENTORY.BIGPOWERUP;
- +INVENTORY.UNDROPPABLE;
- +INVENTORY.UNTOSSABLE;
+FLOATBOB;
+ +NOTDMATCH;
FloatBobStrength 0.25;
Radius 6;
Height 26;
@@ -1721,7 +1696,7 @@ Class CompanionLamp : Actor
m.lamp = self;
m.trail = m.pos;
moff.Push(m);
- SWWMUtility.AchievementProgressInc('swwm_progress_moth',1,parent.player);
+ SWWMUtility.AchievementProgressInc("moth",1,parent.player);
}
override void PostBeginPlay()
{
@@ -2101,11 +2076,35 @@ Class BarrierSnd : Actor
}
}
+Class BarrierArmor : SWWMArmor
+{
+ Default
+ {
+ +SWWMARMOR.NOHITSOUND;
+ +SWWMARMOR.NOHITFLASH;
+ +SWWMARMOR.NODRAIN;
+ SWWMArmor.ArmorPriority 10;
+ }
+ override int HandleDamage( int damage, Name damageType, int flags )
+ {
+ if ( (damageType == 'Fire') || (damageType == 'Ice') || (damageType == 'Slime') || (damageType == 'Electric') || (damageType == 'Plasma') || (damageType == 'Radiation') || (damageType == 'Wind') || (damageType == 'Water') || (damageType == 'Corroded') || (damageType == 'Lava') )
+ return damage;
+ return 0;
+ }
+ override void DoEffect()
+ {
+ Super.DoEffect();
+ if ( !Owner.FindInventory('BarrierPower') )
+ Destroy();
+ }
+}
+
Class BarrierPower : PowerIronFeet
{
Mixin SWWMShadedPowerup;
Actor snd, l;
+ Inventory am;
Default
{
@@ -2116,36 +2115,6 @@ Class BarrierPower : PowerIronFeet
+INVENTORY.ADDITIVETIME;
}
- override void AttachToOwner( Actor other )
- {
- Super.AttachToOwner(other);
- // find first item with armor/health, plating/collar, sandwich, invincibility after it
- Inventory found = null;
- for ( Inventory i=other.Inv; i; i=i.Inv )
- {
- if ( !(i.Inv is 'SWWMHealth') && !(i.Inv is 'SWWMArmor') && !(i.Inv is 'GrilledCheeseSandwich') && !(i.Inv is 'AlmasteelPlating') && !(i.Inv is 'SayaCollar') && !(i.Inv is 'InvinciballPower') ) continue;
- found = i;
- break;
- }
- if ( !found )
- {
- // we're good
- return;
- }
- // place ourselves right after it
- Inventory saved = found.Inv;
- found.Inv = self;
- other.Inv = Inv;
- Inv = saved;
- }
-
- override void AbsorbDamage( int damage, Name damageType, out int newdamage )
- {
- // negate elemental damage
- if ( (damageType == 'Fire') || (damageType == 'Ice') || (damageType == 'Slime') || (damageType == 'Electric') || (damageType == 'Plasma') || (damageType == 'Radiation') || (damageType == 'Wind') || (damageType == 'Water') || (damageType == 'Corroded') || (damageType == 'Lava') )
- newdamage = 0;
- }
-
override void InitEffect()
{
Super.InitEffect();
@@ -2174,6 +2143,15 @@ Class BarrierPower : PowerIronFeet
if ( !snd ) snd = Spawn("BarrierSnd",Owner.pos);
snd.target = Owner;
snd.master = self;
+ if ( !am )
+ {
+ am = Owner.FindInventory("BarrierArmor");
+ if ( !am )
+ {
+ am = Inventory(Spawn("BarrierArmor"));
+ am.AttachToOwner(Owner);
+ }
+ }
// break ourselves if we're in an endlevel sector
bool endlv = false;
for ( int i=0; i tabs;
- int curtab, oldtab;
- // for scrolling
- bool sub;
- int sel0, sel1, sel2;
- int ofs0, ofs1, ofs2; // usually equal to above, except when using mouse input
- int drag; // when dragging with the mouse, which scroller to affect (1 = ofs0 and so on)
- // mission
- String missionstr;
- Array missionbacklog;
- // stats
- SWWMStats stats;
- Array statlist;
- Array sorted_mstats; // sorted by killcount
- Array filtered_lstats; // filtered if necessary + entry for current map
- LevelStat curlstat;
- Array achievements; // array created once, then sorted as needed
- // inventory lists
- Array invlist;
- // lore stuff
- SWWMLoreLibrary lorelib;
- Array lorelist;
- int oldloresiz;
- // store stuff
- Array > storelist;
- Array storeunits;
- // trading
- SWWMTradeHistory tradelib;
- Array playerlist;
- // chat history instance
- SWWMFullHistory fullhistory;
- // chat history total line count (includes breaks)
- int chatlines;
+ TextureID FancyBg, FrameTex, VSepTex, HSepTex;
+ // for resolution scaling and such
+ double hs;
+ Vector2 ss, ws, origin;
// temporary bottom messages, such as "not enough money"
String tmsg;
int tmsgtic;
+ // money owned, for store
+ int muns1, muns2;
+ // other text
+ String clockstr, munstr;
// menu keybind
int ikey[2];
String mkey[2];
@@ -84,6 +52,7 @@ Class DemolitionistMenu : GenericMenu
Array checklist;
int lasttuid;
SWWMHandler hnd;
+ SWWMStaticHandler shnd;
// seeeeecret
int kcode;
// crimey clock stuff
@@ -94,347 +63,157 @@ Class DemolitionistMenu : GenericMenu
bool isrclick;
// somehow Drawer can be called while closing prematurely, which is big bollocks
bool isclosing;
- // to save on calls
- bool nrftl, eviternity, hexdd;
-
- // returns MPlus if we're playing in Japanese, otherwise returns the requested font
- Font LangFont( Font req )
- {
- if ( language ~== "jp" ) return (req==MiniwiFont)?k6x8Font:MPlusFont;
- return req;
- }
+ // the tabs
+ Array tabs;
+ int curtab;
+ int oldtab; // used for returning from help tab
int GenTUID()
{
return lasttuid++;
}
+ // tab functions
+ int FindTabType( Class t, bool nothidden = false )
+ {
+ for ( int i=0; i=0; i-- )
+ {
+ if ( tabs[i].bHidden ) continue;
+ return i;
+ }
+ return -1;
+ }
+ int GetNextTab()
+ {
+ int lst = GetLastTab();
+ if ( lst == -1 ) return -1;
+ if ( curtab >= lst ) return GetFirstTab();
+ for ( int i=curtab+1; i=0; i-- )
+ {
+ if ( tabs[i].bHidden ) continue;
+ return i;
+ }
+ return -1;
+ }
+
+ private void DoClose( bool PlaySound = false )
+ {
+ isclosing = true;
+ if ( PlaySound ) MenuSound("menu/democlose");
+ EventHandler.SendNetworkEvent("swwmclearalltransactions",consoleplayer);
+ for ( int i=0; i deftabs[] =
{
- int clus = level.cluster;
- if ( clus == 11 ) nrftl = true;
- eviternity = SWWMUtility.IsEviternity();
- if ( eviternity )
- {
- // we have to do some heavy lifting here because episodes don't match clusters
- if ( level.levelnum <= 5 ) clus = 1;
- else if ( level.levelnum <= 10 ) clus = 2;
- else if ( level.levelnum <= 15 ) clus = 3;
- else if ( level.levelnum <= 20 ) clus = 4;
- else if ( level.levelnum <= 25 ) clus = 5;
- else if ( level.levelnum <= 30 ) clus = 6;
- else if ( level.levelnum <= 31 ) clus = 7;
- else if ( level.levelnum <= 32 ) clus = 8;
- missionstr = String.Format("$SWWM_MISSION_EVITERNITY%d",clus);
- }
- // naive method to guess if this is sigil
- else if ( (clus == 5) && (level.mapname.Left(2) == "E5") )
- missionstr = String.Format("$SWWM_MISSION_SIGIL");
- else missionstr = String.Format("$SWWM_MISSION_DOOM%d",clus);
- int csiz = stats.clustervisit.Size();
- if ( (csiz > 0) && stats.secretdone[csiz-1] )
- {
- String tmpstr = missionstr.."_SECRET";
- if ( !(StringTable.Localize(tmpstr) ~== tmpstr.Mid(1)) )
- missionstr = tmpstr;
- }
- // if we came from the doom 1 episodes, use the alt mission string for Doom 2
- bool fromdoomone = false;
- for ( int i=0; i= 5) && (stats.clustervisit[i] != 25) ) continue;
- fromdoomone = true;
- break;
- }
- if ( !eviternity && (clus == 5) && fromdoomone )
- missionstr = "$SWWM_MISSION_DOOM5_FROMDOOM1";
- if ( StringTable.Localize(missionstr) ~== missionstr.Mid(1) )
- missionstr = "$SWWM_MISSION_NONE";
- bool firstskip = false;
- for ( int i=csiz-1; i>=0; i-- )
- {
- if ( (stats.clustervisit[i] == clus) && !firstskip )
- continue;
- firstskip = true;
- String xstr = String.Format(eviternity?"$SWWM_MISSION_EVITERNITY%d":"$SWWM_MISSION_DOOM%d",stats.clustervisit[i]);
- if ( !eviternity && (stats.clustervisit[i] == 5) && fromdoomone )
- xstr = "$SWWM_MISSION_DOOM5_FROMDOOM1";
- if ( stats.secretdone[i] )
- {
- String tmpstr = xstr.."_SECRET";
- if ( !(StringTable.Localize(tmpstr) ~== tmpstr.Mid(1)) )
- xstr = tmpstr;
- }
- if ( StringTable.Localize(missionstr) ~== missionstr.Mid(1) )
- continue;
- missionbacklog.Push(xstr);
- }
- }
- else if ( (gameinfo.gametype&GAME_Heretic) && SWWMUtility.IsKnownMap() )
+ 'DemolitionistMissionTab',
+ 'DemolitionistStatsTab',
+ 'DemolitionistInventoryTab',
+ 'DemolitionistKeychainTab',
+ 'DemolitionistLibraryTab',
+ 'DemolitionistStoreTab',
+ 'DemolitionistChatTab',
+ 'DemolitionistHelpTab',
+ 'DemolitionistSecretTab'
+ };
+ for ( int i=0; i=0; i-- )
- {
- if ( (stats.clustervisit[i] == level.cluster) && !firstskip )
- continue;
- firstskip = true;
- String xstr = String.Format("$SWWM_MISSION_HERETIC%d",stats.clustervisit[i]);
- if ( StringTable.Localize(missionstr) ~== missionstr.Mid(1) )
- continue;
- missionbacklog.Push(xstr);
- }
+ let ct = (Class)(AllClasses[i]);
+ if ( !ct || (ct.GetParentClass() != 'DemolitionistMenuTabCustom') ) continue;
+ tabs.Push(DemolitionistMenuTab(new(ct)).Init(self));
}
- else if ( (gameinfo.gametype&GAME_Hexen) && SWWMUtility.IsKnownMap() )
+ for ( int i=deftabs.Size()-2; i=0; i-- )
- {
- if ( (stats.clustervisit[i] == level.cluster) && !firstskip )
- continue;
- firstskip = true;
- String xstr = String.Format("$SWWM_MISSION_%s%d",gstr,stats.clustervisit[i]);
- if ( StringTable.Localize(missionstr) ~== missionstr.Mid(1) )
- continue;
- missionbacklog.Push(xstr);
- }
+ Class saved = shnd.menustate.At("LastTab");
+ if ( saved ) curtab = FindTabType(saved,true);
}
- else missionstr = "$SWWM_MISSION_NONE";
- if ( gameinfo.gametype&GAME_Heretic )
+ else
{
- // April 10th 2171, 17:34 JST
- // Epoch: 6351554040
- c_year = 2171;
- c_month = 3;
- c_day = 9;
- c_hour = 17;
- c_minute = 34;
- c_tz = "JST";
+ shnd.menustate = Dictionary.Create();
+ curtab = -1;
}
- else if ( gameinfo.gametype&GAME_Hexen )
- {
- // May 25th 2171, 16:41 JST
- // Epoch: 6355438860
- c_year = 2171;
- c_month = 4;
- c_day = 24;
- c_hour = 16;
- c_minute = 41;
- c_tz = "JST";
- if ( hexdd )
- {
- // deathkings happen the day after
- c_day = 25;
- c_hour = 10;
- c_minute = 28;
- }
- }
- else if ( eviternity )
- {
- // June 10th 2150, 20:09 +09
- // (June 10th 2150, 20:09 JST)
- // Epoch: 5694145740
- c_year = 2150;
- c_month = 5;
- c_day = 9;
- c_hour = 20;
- c_minute = 9;
- c_tz = "+09";
- }
- else // Doom
- {
- // June 6th 2148, 18:37 EDT
- // (June 7th 2148, 07:37 JST)
- // Epoch: 5630769420
- c_year = 2148;
- c_month = 5;
- c_day = 5;
- c_hour = 18;
- c_minute = 37;
- c_tz = "EDT";
- if ( nrftl )
- {
- // NRFTL just happens the next day after
- c_day = 6;
- c_hour = 15;
- c_minute = 48;
- }
- }
- if ( (missionstr != "$SWWM_MISSION_NONE") || (missionbacklog.Size() > 0) )
- tabs.Push(TAB_MISSION);
- tabs.Push(TAB_STATS);
- tabs.Push(TAB_INVENTORY);
- if ( !deathmatch )
- {
- tabs.Push(TAB_KEYS);
- tabs.Push(TAB_LIBRARY);
- }
- if ( !deathmatch && (G_SkillPropertyInt(SKILLP_ACSReturn) < 4) ) tabs.Push(TAB_STORE);
- for ( int i=0; i 0 )
- {
- leap_year = (!(y%4) && ((y%100) || !(y%400)));
- if ( addtime >= 86400 )
- {
- addtime -= 86400;
- d++;
- int md = days_in_month[m];
- if ( leap_year && (m == 1) ) md++;
- if ( d >= md )
- {
- d = 0;
- m++;
- if ( m > 11 )
- {
- m = 0;
- y++;
- }
- }
- }
- else if ( addtime >= 3600 )
- {
- addtime -= 3600;
- h++;
- if ( h > 23 )
- {
- h = 0;
- d++;
- int md = days_in_month[m];
- if ( leap_year && (m == 1) ) md++;
- if ( d >= md )
- {
- d = 0;
- m++;
- if ( m > 11 )
- {
- m = 0;
- y++;
- }
- }
- }
- }
- else if ( addtime >= 60 )
- {
- addtime -= 60;
- mn++;
- if ( mn > 59 )
- {
- mn = 0;
- h++;
- if ( h > 23 )
- {
- h = 0;
- d++;
- int md = days_in_month[m];
- if ( leap_year && (m == 1) ) md++;
- if ( d >= md )
- {
- d = 0;
- m++;
- if ( m > 11 )
- {
- m = 0;
- y++;
- }
- }
- }
- }
- }
- else
- {
- // we finished counting
- addtime = 0;
- }
- }
- return String.Format("%04d-%02d-%02d %02d:%02d %s",y,m+1,d+1,h,mn,c_tz);
+ if ( curtab == -1 ) curtab = GetFirstTab();
+ tabs[curtab].OnSelect();
}
override bool MenuEvent( int mkey, bool fromcontroller )
{
- Font fnt = LangFont(TewiFont);
switch ( kcode )
{
case 0:
@@ -460,1868 +239,74 @@ Class DemolitionistMenu : GenericMenu
case 10:
if ( mkey == MKEY_ENTER )
{
- MenuSound("misc/secret");
- if ( tabs[curtab] >= TAB_SECRET ) tabs.Delete(curtab);
- tabs.Push(TAB_SECRET);
- curtab = tabs.Size()-1;
- sel0 = sel1 = sel2 = 0;
- ofs0 = ofs1 = ofs2 = 0;
- sub = false;
+ int secret = FindTabType('DemolitionistSecretTab');
+ if ( curtab != secret )
+ {
+ MenuSound("misc/secret");
+ tabs[curtab].OnDeselect();
+ curtab = secret;
+ tabs[curtab].OnSelect();
+ }
+
}
default:
kcode = 0;
break;
}
- int maxtab = multiplayer?TAB_CHAT:TAB_STORE;
switch ( mkey )
{
case MKEY_BACK:
- MenuSound("menu/democlose");
- EventHandler.SendNetworkEvent("swwmclearalltransactions",consoleplayer);
- Close();
- return true;
- case MKEY_PAGEUP:
- MenuSound("menu/demotab");
- if ( tabs[curtab] >= TAB_SECRET ) tabs.Delete(curtab); // hide this tab
- if ( curtab <= 0 ) curtab = (tabs.Size()-1);
- else curtab--;
- CVar.FindCVar('swwm_lasttab').SetInt(tabs[curtab]);
- sel0 = sel1 = sel2 = 0;
- ofs0 = ofs1 = ofs2 = 0;
- sub = false;
- invlist.Clear();
- lorelist.Clear();
- storelist.Clear();
- storeunits.Clear();
- playerlist.Clear();
+ DoClose(true);
return true;
case MKEY_PAGEDOWN:
- MenuSound("menu/demotab");
- if ( tabs[curtab] >= TAB_SECRET ) tabs.Delete(curtab); // hide this tab
- if ( curtab < (tabs.Size()-1) ) curtab++;
- else curtab = 0;
- CVar.FindCVar('swwm_lasttab').SetInt(tabs[curtab]);
- sel0 = sel1 = sel2 = 0;
- ofs0 = ofs1 = ofs2 = 0;
- sub = false;
- invlist.Clear();
- lorelist.Clear();
- storelist.Clear();
- storeunits.Clear();
- playerlist.Clear();
+ int next = GetNextTab();
+ if ( next != curtab )
+ {
+ MenuSound("menu/demotab");
+ tabs[curtab].OnDeselect();
+ curtab = next;
+ tabs[curtab].OnSelect();
+ }
+ return true;
+ case MKEY_PAGEUP:
+ int prev = GetPrevTab();
+ if ( prev != curtab )
+ {
+ MenuSound("menu/demotab");
+ tabs[curtab].OnDeselect();
+ curtab = prev;
+ tabs[curtab].OnSelect();
+ }
return true;
case MKEY_DOWN:
- if ( tabs[curtab] == TAB_HELP )
- {
- String kstr;
- if ( self.mkey[1] != "" ) kstr = self.mkey[0].."/"..self.mkey[1];
- else kstr = self.mkey[0];
- String str = String.Format(StringTable.Localize("$SWWM_HELPTXT"),kstr);
- BrokenLines l = fnt.BreakLines(str,629);
- if ( l.Count() > 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,620);
- }
- if ( (l.Count() > 28) && (sel0 < l.Count()-28) )
- {
- MenuSound("menu/demoscroll");
- sel0++;
- }
- l.Destroy();
- }
- else if ( tabs[curtab] == TAB_MISSION )
- {
- String str;
- if ( sel1 == 0 ) str = StringTable.Localize(missionstr);
- else str = StringTable.Localize(missionbacklog[sel1-1]);
- BrokenLines l = fnt.BreakLines(str,629);
- if ( l.Count() > 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,620);
- }
- if ( (l.Count() > 28) && (sel0 < l.Count()-28) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = ++sel0;
- }
- l.Destroy();
- }
- else if ( (tabs[curtab] == TAB_CHAT) && (StatusBar is 'SWWMStatusBar') && (sel0 > 0) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = --sel0;
- }
- else if ( (tabs[curtab] == TAB_LIBRARY) && (lorelist.Size() > 1) )
- {
- if ( sub )
- {
- String str = StringTable.Localize(lorelist[sel0].text);
- int ofs = (language~=="jp")?212:132;
- if ( lorelist.Size() > 26 ) ofs += 8;
- BrokenLines l = fnt.BreakLines(str,635-ofs);
- if ( l.Count() > 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,626-ofs);
- }
- if ( (l.Count() > 28) && (sel2 < l.Count()-28) )
- {
- MenuSound("menu/demoscroll");
- ofs2 = ++sel2;
- }
- l.Destroy();
- }
- else
- {
- MenuSound("menu/demoscroll");
- if ( sel0 >= lorelist.Size()-1 ) ofs0 = sel0 = 0;
- else
- {
- sel0++;
- // update ofs so selection stays on-screen
- int ofs = max(ofs0-26,0);
- if ( sel0 < ofs ) ofs0 = sel0+26;
- else if ( sel0 > ofs+26 ) ofs0 = sel0;
- }
- }
- }
- else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS)) && (invlist.Size() > 1) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = ++sel0;
- if ( sel0 >= invlist.Size() ) ofs0 = sel0 = 0;
- }
- else if ( ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1)) && (invlist.Size() > 1) )
- {
- MenuSound("menu/demoscroll");
- ofs1 = ++sel1;
- if ( sel1 >= invlist.Size() ) ofs1 = sel1 = 0;
- }
- else if ( (tabs[curtab] == TAB_STORE) && (storelist.Size() > 1) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = ++sel0;
- if ( sel0 >= storelist.Size() ) ofs0 = sel0 = 0;
- }
- else if ( tabs[curtab] == TAB_TRADING )
- {
- if ( !sub && (playerlist.Size() > 1) )
- {
- // scroll through player list
- MenuSound("menu/demoscroll");
- ofs0 = ++sel0;
- if ( sel0 >= playerlist.Size() ) ofs0 = sel0 = 0;
- }
- else if ( sub && (sel0 == -1) && (sel1 < tradelib.ent.Size()-28) )
- {
- // scroll through trading history
- MenuSound("menu/demoscroll");
- ofs1 = ++sel1;
- }
- }
- else if ( tabs[curtab] == TAB_STATS )
- {
- int cnt = 0, num = 22;
- if ( sel1 == STAT_MAIN )
- cnt = statlist.Size();
- else if ( sel1 == STAT_KILLS )
- cnt = sorted_mstats.Size();
- else if ( sel1 == STAT_LEVEL )
- cnt = filtered_lstats.Size();
- else if ( sel1 == STAT_ACHIEVEMENT )
- {
- cnt = achievements.Size();
- num = 7;
- }
- if ( (cnt > num) && (sel0 < cnt-num) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = ++sel0;
- }
- }
+ tabs[curtab].MenuInput(MK_DOWN);
return true;
case MKEY_UP:
- if ( (tabs[curtab] == TAB_HELP) && (sel0 > 0) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = --sel0;
- }
- else if ( (tabs[curtab] == TAB_MISSION) && (sel0 > 0) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = --sel0;
- }
- else if ( (tabs[curtab] == TAB_CHAT) && FullHistory && (sel0 < FullHistory.msg.Size()-1) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = ++sel0;
- }
- else if ( (tabs[curtab] == TAB_LIBRARY) && (lorelist.Size() > 1) )
- {
- if ( sub )
- {
- if ( sel2 > 0 )
- {
- MenuSound("menu/demoscroll");
- ofs2 = --sel2;
- }
- }
- else
- {
- MenuSound("menu/demoscroll");
- if ( sel0 <= 0 ) ofs0 = sel0 = lorelist.Size()-1;
- else
- {
- sel0--;
- // update ofs so selection stays on-screen
- int ofs = max(ofs0-26,0);
- if ( sel0 < ofs ) ofs0 = sel0+26;
- else if ( sel0 > ofs+26 ) ofs0 = sel0;
- }
- }
- }
- else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS)) && (invlist.Size() > 1) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = --sel0;
- if ( sel0 < 0 ) ofs0 = sel0 = invlist.Size()-1;
- }
- else if ( ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1)) && (invlist.Size() > 1) )
- {
- MenuSound("menu/demoscroll");
- ofs1 = --sel1;
- if ( sel1 < 0 ) ofs1 = sel1 = invlist.Size()-1;
- }
- else if ( (tabs[curtab] == TAB_STORE) && (storelist.Size() > 1) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = --sel0;
- if ( sel0 < 0 ) ofs0 = sel0 = storelist.Size()-1;
- }
- else if ( tabs[curtab] == TAB_TRADING )
- {
- if ( !sub && (playerlist.Size() > 1) )
- {
- // scroll through player list
- MenuSound("menu/demoscroll");
- ofs0 = --sel0;
- if ( sel0 < 0 ) ofs0 = sel0 = playerlist.Size()-1;
- }
- else if ( sub && (sel0 == -1) && (sel1 > 0) )
- {
- // scroll through trading history
- MenuSound("menu/demoscroll");
- ofs1 = --sel1;
- }
- }
- else if ( (tabs[curtab] == TAB_STATS) && (sel0 > 0) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = --sel0;
- }
- return true;
- case MKEY_RIGHT:
- if ( (tabs[curtab] == TAB_MISSION) && (missionbacklog.Size() > 0) )
- {
- if ( sel1 < missionbacklog.Size() )
- {
- sel0 = 0;
- sel1++;
- MenuSound("menu/demoscroll");
- }
- }
- else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS)) && (invlist.Size() > 21) )
- {
- int oldsel = sel0;
- ofs0 = sel0 += 22;
- if ( sel0 >= invlist.Size() ) ofs0 = sel0 = invlist.Size()-1;
- if ( sel0 != oldsel ) MenuSound("menu/demoscroll");
- }
- else if ( ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1)) && (invlist.Size() > 21) )
- {
- int oldsel = sel1;
- ofs1 = sel1 += 22;
- if ( sel1 >= invlist.Size() ) ofs1 = sel1 = invlist.Size()-1;
- if ( sel1 != oldsel ) MenuSound("menu/demoscroll");
- }
- else if ( (tabs[curtab] == TAB_STORE) && (storelist.Size() > 21) )
- {
- int oldsel = sel0;
- ofs0 = sel0 += 22;
- if ( sel0 >= storelist.Size() ) ofs0 = sel0 = storelist.Size()-1;
- if ( sel0 != oldsel ) MenuSound("menu/demoscroll");
- }
- else if ( tabs[curtab] == TAB_LIBRARY )
- {
- MenuSound("menu/demoscroll");
- ofs0 = sel0 = 0;
- sub = false;
- ofs1 = ++sel1;
- if ( sel1 > LORE_LORE ) ofs1 = sel1 = LORE_ITEM;
- CVar.FindCVar('swwm_lastloretab').SetInt(sel1);
- }
- else if ( (tabs[curtab] == TAB_TRADING) && !sub && (playerlist.Size() > 21) ) // lol is this ever going to happen
- {
- int oldsel = sel0;
- ofs0 = sel0 += 22;
- if ( sel0 >= playerlist.Size() ) ofs0 = sel0 = playerlist.Size()-1;
- if ( sel0 != oldsel ) MenuSound("menu/demoscroll");
- }
- else if ( tabs[curtab] == TAB_STATS )
- {
- MenuSound("menu/demoscroll");
- ofs0 = sel0 = 0;
- ofs1 = ++sel1;
- if ( ofs1 > STAT_ACHIEVEMENT ) ofs1 = sel1 = STAT_MAIN;
- CVar.FindCVar('swwm_laststattab').SetInt(sel1);
- }
+ tabs[curtab].MenuInput(MK_UP);
return true;
case MKEY_LEFT:
- if ( (tabs[curtab] == TAB_MISSION) && (missionbacklog.Size() > 0) )
- {
- if ( sel1 > 0 )
- {
- sel0 = 0;
- sel1--;
- MenuSound("menu/demoscroll");
- }
- }
- else if ( ((tabs[curtab] == TAB_INVENTORY) || (tabs[curtab] == TAB_KEYS)) && (invlist.Size() > 21) && (sel0-22 >= 0) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = sel0 -= 22;
- }
- else if ( ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1)) && (invlist.Size() > 21) && (sel1-22 >= 0) )
- {
- MenuSound("menu/demoscroll");
- ofs1 = sel1 -= 22;
- }
- else if ( (tabs[curtab] == TAB_STORE) && (storelist.Size() > 21) && (sel0-22 >= 0) )
- {
- MenuSound("menu/demoscroll");
- ofs0 = sel0 -= 22;
- }
- else if ( tabs[curtab] == TAB_LIBRARY )
- {
- MenuSound("menu/demoscroll");
- ofs0 = sel0 = 0;
- sub = false;
- ofs1 = --sel1;
- if ( sel1 < LORE_ITEM ) ofs1 = sel1 = LORE_LORE;
- CVar.FindCVar('swwm_lastloretab').SetInt(sel1);
- }
- else if ( (tabs[curtab] == TAB_TRADING) && !sub && (playerlist.Size() > 21) && (sel0-22 >= 0) ) // lol is this ever going to happen
- {
- ofs0 = sel0 -= 22;
- MenuSound("menu/demoscroll");
- }
- else if ( tabs[curtab] == TAB_STATS )
- {
- MenuSound("menu/demoscroll");
- ofs0 = sel0 = 0;
- ofs1 = --sel1;
- if ( ofs1 < STAT_MAIN ) ofs1 = sel1 = STAT_ACHIEVEMENT;
- CVar.FindCVar('swwm_laststattab').SetInt(sel1);
- }
+ tabs[curtab].MenuInput(MK_LEFT);
+ return true;
+ case MKEY_RIGHT:
+ tabs[curtab].MenuInput(MK_RIGHT);
return true;
case MKEY_ENTER:
- if ( (tabs[curtab] == TAB_INVENTORY) && (invlist.Size() > 0) && (sel0 < invlist.Size()) )
- {
- // can't use this
- if ( (invlist[sel0] is 'Ammo') || (invlist[sel0] is 'MagAmmo') || (invlist[sel0] is 'SWWMCollectible')
- || (invlist[sel0] is 'HammerspaceEmbiggener') )
- return true;
- let t = new("MenuTransaction");
- t.uid = GenTUID();
- t.type = MenuTransaction.TT_ITEMUSE;
- t.result = false;
- // don't check weapons, always assume check succeeded
- if ( invlist[sel0] is 'Weapon' ) t.result = true;
- checklist.Push(t);
- EventHandler.SendNetworkEvent(String.Format("swwmuseitem.%s",invlist[sel0].GetClassName()),consoleplayer,t.uid);
- }
- else if ( (tabs[curtab] == TAB_KEYS) && (invlist.Size() > 0) && (sel0 < invlist.Size()) )
- {
- // can't use this
- if ( !(invlist[sel0] is 'SWWMKey') && !(invlist[sel0] is 'SWWMCollectible') )
- return true;
- let t = new("MenuTransaction");
- t.uid = GenTUID();
- t.type = MenuTransaction.TT_ITEMUSE;
- t.result = true; // always true
- checklist.Push(t);
- EventHandler.SendNetworkEvent(String.Format("swwmuseitem.%s",invlist[sel0].GetClassName()),consoleplayer,t.uid);
- }
- else if ( (tabs[curtab] == TAB_STORE) && (storelist.Size() > 0) && (sel0 < storelist.Size()) )
- {
- let itm = GetDefaultByType(storelist[sel0]);
- let amt = storeunits[sel0];
- int price = int(abs(itm.Stamina)*(1.+.75*(amt-1)));
- let cur = players[consoleplayer].mo.FindInventory(storelist[sel0]);
- if ( sub )
- {
- if ( !cur ) return true;
- if ( storelist[sel0] is 'Weapon' )
- {
- let w = Weapon(itm);
- // subtract price of given ammo, as we're only selling the weapon itself
- if ( w.AmmoType1 && (w.AmmoGive1 > 0) )
- {
- let am1 = GetDefaultByType(w.AmmoType1);
- if ( am1.Stamina > 0 ) price -= int(am1.Stamina*(1.+.75*(w.AmmoGive1-1)));
- }
- // candygun is a special case for secondary ammo
- if ( w.AmmoType2 && (w.AmmoGive2 > 0) && (storelist[sel0] is 'CandyGun') )
- {
- let am2 = GetDefaultByType(w.AmmoType2);
- if ( am2.Stamina > 0 ) price -= int(am2.Stamina*(1.+.75*(w.AmmoGive2-1)));
- }
- }
- // sell at half price
- if ( sub ) price /= 2;
- EventHandler.SendNetworkEvent(String.Format("swwmstoretake.%s",storelist[sel0].GetClassName()),consoleplayer,price,amt);
- MenuSound("menu/buyinv");
- return true;
- }
- if ( !SWWMCredits.CanTake(players[consoleplayer],price) )
- {
- MenuSound("menu/noinvuse");
- tmsg = StringTable.Localize("$SWWM_STOREMUNS");
- tmsgtic = gametic+70;
- return true;
- }
- int camt, max;
- if ( cur )
- {
- camt = cur.Amount;
- max = cur.MaxAmount;
- }
- else
- {
- camt = 0;
- max = itm.MaxAmount;
- }
- if ( camt >= max )
- {
- MenuSound("menu/noinvuse");
- tmsg = StringTable.Localize("$SWWM_STOREFULL");
- tmsgtic = gametic+70;
- return true;
- }
- EventHandler.SendNetworkEvent(String.Format("swwmstoregive.%s",storelist[sel0].GetClassName()),consoleplayer,price,amt);
- MenuSound("menu/buyinv");
- }
- else if ( tabs[curtab] == TAB_LIBRARY )
- {
- if ( sub )
- {
- MenuSound("menu/democlose");
- sub = false;
- }
- else if ( (lorelist.Size() > 0) && (sel0 < lorelist.Size()) )
- {
- // mark as read
- if ( !lorelist[sel0].read )
- EventHandler.SendNetworkEvent(String.Format("swwmmarkloreread.%s",lorelist[sel0].tag),consoleplayer);
- MenuSound("menu/demosel");
- sub = true;
- ofs2 = sel2 = 0;
- }
- }
- else if ( tabs[curtab] == TAB_TRADING )
- {
- if ( !sub && (playerlist.Size() > 0) )
- {
- // pick a player
- MenuSound("menu/demosel");
- sub = true;
- ofs1 = sel1 = 0;
- }
- else if ( sub && (sel0 != -1) && (invlist.Size() > 0) )
- {
- // cannot trade these
- if ( ((invlist[sel1].bUNDROPPABLE || invlist[sel1].bUNTOSSABLE) && !(invlist[sel1] is 'HammerspaceEmbiggener'))
- || ((invlist[sel1] is 'CandyGunSpares') && !players[playerlist[sel0]].mo.FindInventory('CandyGun')) )
- {
- MenuSound("menu/noinvuse");
- tmsg = StringTable.Localize("$SWWM_TRADEFAIL");
- tmsgtic = gametic+70;
- return true;
- }
- // trade item
- let t = new("MenuTransaction");
- t.uid = GenTUID();
- t.type = MenuTransaction.TT_ITEMSEND;
- t.result = false;
- checklist.Push(t);
- EventHandler.SendNetworkEvent(String.Format("swwmtrade.%s",invlist[sel1].GetClassName()),consoleplayer,playerlist[sel0],t.uid);
- }
- }
+ tabs[curtab].MenuInput(MK_ENTER);
return true;
case MKEY_CLEAR:
- if ( (tabs[curtab] == TAB_INVENTORY) && (invlist.Size() > 0) )
- {
- let t = new("MenuTransaction");
- t.uid = GenTUID();
- t.type = MenuTransaction.TT_ITEMDROP;
- t.result = false;
- checklist.Push(t);
- EventHandler.SendNetworkEvent(String.Format("swwmdropitem.%s",invlist[sel0].GetClassName()),consoleplayer,t.uid);
- }
- else if ( (tabs[curtab] == TAB_LIBRARY) && sub )
- {
- MenuSound("menu/democlose");
- sub = false;
- }
- else if ( tabs[curtab] == TAB_STORE )
- {
- sub = !sub;
- MenuSound(sub?"menu/demosel":"menu/democlose");
- }
- else if ( tabs[curtab] == TAB_TRADING )
- {
- if ( !sub )
- {
- // open trading history
- MenuSound("menu/demosel");
- sub = true;
- ofs0 = sel0 = -1;
- ofs1 = sel1 = 0;
- }
- else if ( sub )
- {
- // go back
- MenuSound("menu/democlose");
- sub = false;
- ofs0 = sel0 = 0;
- }
- }
+ tabs[curtab].MenuInput(MK_BACK);
return true;
}
return Super.MenuEvent(mkey,fromcontroller);
}
- private int rnd( double num )
- {
- return int(num+((num<0)?-.5:.5));
- }
-
- override bool MouseEvent( int type, int mx, int my )
- {
- bool res = Super.MouseEvent(type,mx,my);
- Font fnt = LangFont(TewiFont);
- String str;
- double hs = max(min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/400.)),1.);
- Vector2 ss = (Screen.GetWidth(),Screen.GetHeight())/hs;
- Vector2 origin = (ss.x-640,ss.y-400)/2.;
- Vector2 mpos = (mx/hs,my/hs)-origin;
- int xx, yy, len;
- if ( type == MOUSE_Click )
- {
- if ( (mpos.x < 0) || (mpos.x >= 641) || (mpos.y < 0) || (mpos.y >= 386) ) return res; // outside clickable area, ignore
- else if ( mpos.y < 14 )
- {
- if ( isrclick ) return res;
- // check which tab we're clicking
- static const string tabnames[] =
- {
- "$SWWM_MISSTAB", "$SWWM_STATTAB", "$SWWM_INVTAB", "$SWWM_KEYTAB",
- "$SWWM_KBASETAB", "$SWWM_STORETAB", "$SWWM_TRADETAB", "$SWWM_CHATTAB",
- "$SWWM_SECRETTAB", "$SWWM_HELPTAB"
- };
- xx = 0;
- for ( int i=0; i= xx) && (mpos.x < xx+len) )
- {
- if ( curtab == i ) break;
- MenuSound("menu/demotab");
- if ( tabs[curtab] >= TAB_SECRET )
- {
- tabs.Delete(curtab);
- if ( curtab < i ) i--; // account for shortening
- }
- curtab = i;
- CVar.FindCVar('swwm_lasttab').SetInt(tabs[curtab]);
- sel0 = sel1 = sel2 = 0;
- ofs0 = ofs1 = ofs2 = 0;
- sub = false;
- invlist.Clear();
- lorelist.Clear();
- storelist.Clear();
- storeunits.Clear();
- playerlist.Clear();
- break;
- }
- xx += len;
- }
- }
- else if ( tabs[curtab] == TAB_MISSION )
- {
- // are we clicking where the scrollbar should be?
- if ( mpos.x < 632 )
- {
- int csiz = missionbacklog.Size();
- if ( csiz <= 0 ) return res;
- if ( isrclick && (sel1 < csiz) )
- {
- sel0 = 0;
- sel1++;
- MenuSound("menu/demoscroll");
- }
- else if ( !isrclick && (sel1 > 0) )
- {
- sel0 = 0;
- sel1--;
- MenuSound("menu/demoscroll");
- }
- return res;
- }
- if ( !isrclick )
- {
- String str;
- if ( sel1 == 0 ) str = StringTable.Localize(missionstr);
- else str = StringTable.Localize(missionbacklog[sel1-1]);
- BrokenLines l = fnt.BreakLines(str,629);
- if ( l.Count() > 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,620);
- }
- else
- {
- l.Destroy();
- return res; // no scrollbar
- }
- // calculate offset
- int szr = l.Count()-28;
- l.Destroy();
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel0 ) MenuSound("menu/demoscroll");
- ofs0 = sel0 = step;
- drag = 1;
- }
- }
- else if ( tabs[curtab] == TAB_INVENTORY )
- {
- // check what item we clicked
- if ( mpos.y < 377 )
- {
- if ( invlist.Size() <= 0 ) return res; // clicked nothing
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) )
- str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
- else str = invlist[i].GetTag();
- len = fnt.StringWidth(str);
- if ( len > longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- int ofs = int(max(0,(ofs0/22)-(maxcol-1))*22);
- xx = 9;
- yy = 23;
- int cols = 1;
- for ( int i=ofs; i= xx) && (mpos.x < xx+longest) && (mpos.y >= yy) && (mpos.y < yy+14) )
- {
- if ( sel0 != i ) MenuSound("menu/demoscroll");
- sel0 = i;
- ofs0 = (sel0/22)*22;
- // drop on right click in inventory tab
- if ( (tabs[curtab] == TAB_INVENTORY) && isrclick ) MenuEvent(MKEY_CLEAR,false);
- else if ( !isrclick ) MenuEvent(MKEY_ENTER,false);
- return res;
- }
- yy += 16;
- if ( yy >= 370 )
- {
- xx += longest+24;
- yy = 23;
- cols++;
- if ( cols > maxcol ) break;
- }
- }
- return res;
- }
- if ( !isrclick )
- {
- // check that scrollbar is present
- if ( invlist.Size() <= 0 ) return res; // definitely no scrollbar
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) )
- str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
- else str = invlist[i].GetTag();
- len = fnt.StringWidth(str);
- if ( len > longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- if ( maxcol >= totalcol ) return res; // no scrollbar
- // calculate offset
- int szr = totalcol-maxcol;
- int step = clamp(rnd((mpos.x-5.)/(630./szr)),0,szr);
- if ( step > 0 ) step += (maxcol-1);
- if ( step != (ofs0/22) ) MenuSound("menu/demoscroll");
- ofs0 = step*22;
- drag = 1;
- }
- }
- else if ( (tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1) )
- {
- // check what item we clicked
- if ( mpos.y < 377 )
- {
- if ( invlist.Size() <= 0 ) return res; // clicked nothing
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) )
- str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
- else str = invlist[i].GetTag();
- len = fnt.StringWidth(str);
- if ( len > longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- int ofs = int(max(0,(ofs1/22)-(maxcol-1))*22);
- xx = 9;
- yy = 23;
- int cols = 1;
- for ( int i=ofs; i= xx) && (mpos.x < xx+longest) && (mpos.y >= yy) && (mpos.y < yy+14) )
- {
- if ( sel1 != i ) MenuSound("menu/demoscroll");
- sel1 = i;
- ofs1 = (sel1/22)*22;
- // drop on right click in inventory tab
- if ( (tabs[curtab] == TAB_INVENTORY) && isrclick ) MenuEvent(MKEY_CLEAR,false);
- else if ( !isrclick ) MenuEvent(MKEY_ENTER,false);
- return res;
- }
- yy += 16;
- if ( yy >= 370 )
- {
- xx += longest+24;
- yy = 23;
- cols++;
- if ( cols > maxcol ) break;
- }
- }
- return res;
- }
- if ( !isrclick )
- {
- // check that scrollbar is present
- if ( invlist.Size() <= 0 ) return res; // definitely no scrollbar
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) )
- str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
- else str = invlist[i].GetTag();
- len = fnt.StringWidth(str);
- if ( len > longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- if ( maxcol >= totalcol ) return res; // no scrollbar
- // calculate offset
- int szr = totalcol-maxcol;
- int step = clamp(rnd((mpos.x-5.)/(630./szr)),0,szr);
- if ( step > 0 ) step += (maxcol-1);
- if ( step != (ofs0/22) ) MenuSound("menu/demoscroll");
- ofs0 = step*22;
- drag = 1;
- }
- }
- else if ( (tabs[curtab] == TAB_KEYS) && !isrclick )
- {
- // check what item we clicked
- if ( mpos.y < 377 )
- {
- if ( invlist.Size() <= 0 ) return res; // clicked nothing
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- int ofs = int(max(0,(ofs0/22)-(maxcol-1))*22);
- xx = 9;
- yy = 23;
- int cols = 1;
- for ( int i=ofs; i= xx) && (mpos.x < xx+longest) && (mpos.y >= yy) && (mpos.y < yy+14) )
- {
- if ( sel0 != i ) MenuSound("menu/demoscroll");
- sel0 = i;
- ofs0 = (sel0/22)*22;
- // try to use it if it has any special behaviour
- MenuEvent(MKEY_ENTER,false);
- return res;
- }
- yy += 16;
- if ( yy >= 370 )
- {
- xx += longest+24;
- yy = 23;
- cols++;
- if ( cols > maxcol ) break;
- }
- }
- return res;
- }
- // check that scrollbar is present
- if ( invlist.Size() <= 0 ) return res; // definitely no scrollbar
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- if ( maxcol >= totalcol ) return res; // no scrollbar
- // calculate offset
- int szr = totalcol-maxcol;
- int step = clamp(rnd((mpos.x-5.)/(630./szr)),0,szr);
- if ( step > 0 ) step += (maxcol-1);
- if ( step != (ofs0/22) ) MenuSound("menu/demoscroll");
- ofs0 = step*22;
- drag = 1;
- }
- else if ( tabs[curtab] == TAB_STORE )
- {
- if ( isrclick )
- {
- MenuEvent(MKEY_CLEAR,false);
- return res;
- }
- // check what item we clicked
- if ( mpos.y < 377 )
- {
- if ( storelist.Size() <= 0 ) return res; // clicked nothing
- xx = 9;
- yy = 23;
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,SWWMUtility.GetAmmoTagClass(storelist[i]));
- else str = def.GetTag();
- }
- else if ( (storeunits[i] > 1) || (storelist[i] is 'Ammo') ) str = String.Format("%dx %s",storeunits[i],SWWMUtility.GetAmmoTagClass(storelist[i]));
- else str = def.GetTag();
- len = fnt.StringWidth(str);
- if ( len > longest ) longest = len;
- }
- maxcol = 622/(longest+96);
- totalcol = int(ceil(storelist.Size()/22.));
- // gotta check both the tag and the price for clicking
- int ofs = int(max(0,(ofs0/22)-(maxcol-1))*22);
- int cols = 1;
- for ( int i=ofs; i= xx) && (mpos.x < xx+longest+80) && (mpos.y >= yy) && (mpos.y < yy+14) )
- {
- if ( sel0 != i ) MenuSound("menu/demoscroll");
- sel0 = i;
- ofs0 = (sel0/22)*22;
- MenuEvent(MKEY_ENTER,false);
- return res;
- }
- yy += 16;
- if ( yy >= 370 )
- {
- xx += longest+96;
- yy = 23;
- cols++;
- if ( cols > maxcol ) break;
- }
- }
- return res;
- }
- // check that scrollbar is present
- if ( storelist.Size() <= 0 ) return res; // definitely no scrollbar
- xx = 9;
- yy = 23;
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,SWWMUtility.GetAmmoTagClass(storelist[i]));
- else str = def.GetTag();
- }
- else if ( storeunits[i] > 1 ) str = String.Format("%dx %s",storeunits[i],def.GetTag());
- else str = def.GetTag();
- len = fnt.StringWidth(str);
- if ( len > longest ) longest = len;
- }
- maxcol = 622/(longest+96);
- totalcol = int(ceil(storelist.Size()/22.));
- if ( maxcol >= totalcol ) return res; // no scrollbar
- // calculate offset
- int szr = totalcol-maxcol;
- int step = clamp(rnd((mpos.x-5.)/(630./szr)),0,szr);
- if ( step > 0 ) step += (maxcol-1);
- if ( step != (ofs0/22) ) MenuSound("menu/demoscroll");
- ofs0 = step*22;
- drag = 1;
- }
- else if ( (tabs[curtab] == TAB_LIBRARY) && !isrclick )
- {
- double midp = (language~=="jp")?206:126;
- if ( mpos.x < midp )
- {
- if ( mpos.y < 28 )
- {
- // switch category
- if ( mpos.x < midp/2. ) MenuEvent(MKEY_LEFT,false);
- else MenuEvent(MKEY_RIGHT,false);
- }
- else
- {
- // check what item we clicked
- int xx = 3;
- int yy = 32;
- int ofs = max(0,ofs0-26);
- for ( int i=ofs; i 370 ) break;
- // check boundary
- if ( (mpos.y >= yy) && (mpos.y < yy+14) )
- {
- if ( sel0 != i ) MenuSound("menu/demoscroll");
- if ( (sel0 != i) || !sub )
- {
- sel0 = i;
- sub = false;
- MenuEvent(MKEY_Enter,false);
- }
- return res;
- }
- yy += 13;
- }
- }
- }
- else if ( mpos.x < midp+8 )
- {
- // check that scrollbar is present
- if ( lorelist.Size() <= 27 ) return res; // no scrollbar
- // calculate offset
- int szr = lorelist.Size()-27;
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step ) step += 26;
- if ( step != ofs0 ) MenuSound("menu/demoscroll");
- ofs0 = step;
- drag = 1;
- }
- else if ( sub && (mpos.x >= 632) )
- {
- // check that scrollbar is present
- str = StringTable.Localize(lorelist[sel0].text);
- int ofs = (language~=="jp")?212:132;
- if ( lorelist.Size() > 26 ) ofs += 8;
- BrokenLines l = fnt.BreakLines(str,635-ofs);
- if ( l.Count() > 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,626-ofs);
- }
- else
- {
- l.Destroy();
- return res; // no scrollbar
- }
- // calculate offset
- int szr = l.Count()-28;
- l.Destroy();
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel2 ) MenuSound("menu/demoscroll");
- ofs2 = sel2 = step;
- drag = 3;
- }
- }
- else if ( tabs[curtab] == TAB_TRADING )
- {
- if ( isrclick )
- {
- MenuEvent(MKEY_CLEAR,false);
- return res;
- }
- if ( !sub )
- {
- // check what item we clicked
- if ( mpos.y < 377 )
- {
- if ( playerlist.Size() <= 0 ) return res; // clicked nothing
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(playerlist.Size()/22.));
- int ofs = int(max(0,(ofs0/22)-(maxcol-1))*22);
- xx = 9;
- yy = 23;
- int cols = 1;
- for ( int i=ofs; i= xx) && (mpos.x < xx+len+1) && (mpos.y >= yy) && (mpos.y < yy+14) )
- {
- if ( sel0 != i ) MenuSound("menu/demoscroll");
- ofs0 = sel0 = i;
- MenuEvent(MKEY_Enter,false);
- return res;
- }
- yy += 16;
- if ( yy >= 370 )
- {
- xx += longest+24;
- yy = 23;
- cols++;
- if ( cols > maxcol ) break;
- }
- }
- return res;
- }
- // check that scrollbar is present (will it ever be???)
- if ( playerlist.Size() <= 0 ) return res; // definitely no scrollbar
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(playerlist.Size()/22.));
- if ( maxcol >= totalcol ) return res; // no scrollbar
- // calculate offset
- int szr = totalcol-maxcol;
- int step = clamp(rnd((mpos.x-5.)/(630./szr)),0,szr);
- if ( step > 0 ) step += (maxcol-1);
- if ( step != (ofs0/22) ) MenuSound("menu/demoscroll");
- ofs0 = step*22;
- drag = 1;
- }
- else if ( sel0 == -1 )
- {
- // are we clicking where the scrollbar should be?
- if ( mpos.x < 632 ) return res;
- if ( tradelib.ent.Size() <= 28 ) return res; // no scrollbar
- // calculate offset
- int szr = tradelib.ent.Size()-28;
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel0 ) MenuSound("menu/demoscroll");
- ofs0 = sel0 = step;
- drag = 1;
- }
- }
- else if ( (tabs[curtab] == TAB_CHAT) && !isrclick )
- {
- // are we clicking where the scrollbar should be?
- if ( mpos.x < 632 ) return res;
- let bar = SWWMStatusBar(StatusBar);
- if ( !FullHistory || (FullHistory.msg.Size() <= 1) ) return res; // no scrollbar
- // calculate offset
- int szr = FullHistory.msg.Size()-1;
- int step = szr-clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel0 ) MenuSound("menu/demoscroll");
- ofs0 = sel0 = step;
- drag = 1;
- }
- else if ( (tabs[curtab] == TAB_HELP) && !isrclick )
- {
- // are we clicking where the scrollbar should be?
- String kstr;
- if ( mkey[1] != "" ) kstr = mkey[0].."/"..mkey[1];
- else kstr = mkey[0];
- str = String.Format(StringTable.Localize("$SWWM_HELPTXT"),kstr);
- BrokenLines l = fnt.BreakLines(str,629);
- if ( l.Count() > 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,620);
- }
- else
- {
- l.Destroy();
- return res; // no scrollbar
- }
- // calculate offset
- int szr = l.Count()-28;
- l.Destroy();
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel0 ) MenuSound("menu/demoscroll");
- ofs0 = sel0 = step;
- drag = 1;
- }
- else if ( (tabs[curtab] == TAB_STATS) && !isrclick )
- {
- double midp = (language~=="jp")?206:126;
- if ( mpos.x < midp )
- {
- // check what item we clicked
- int xx = 9;
- int yy = 23;
- for ( int i=0; i<=STAT_ACHIEVEMENT; i++ )
- {
- // check boundary
- if ( (mpos.y >= yy) && (mpos.y < yy+14) )
- {
- if ( sel1 != i )
- {
- MenuSound("menu/demoscroll");
- ofs0 = sel0 = 0;
- sel1 = i;
- CVar.FindCVar('swwm_laststattab').SetInt(sel1);
- }
- return res;
- }
- yy += 16;
- }
- return res;
- }
- // are we clicking where the scrollbar should be?
- if ( mpos.x < 632 ) return res;
- int cnt = 0, num = 22;
- if ( sel1 == STAT_MAIN ) cnt = statlist.Size();
- else if ( sel1 == STAT_KILLS ) cnt = stats.mstats.Size();
- else if ( sel1 == STAT_LEVEL ) cnt = filtered_lstats.Size();
- else if ( sel1 == STAT_ACHIEVEMENT )
- {
- cnt = achievements.Size();
- num = 7;
- }
- if ( cnt <= num ) return res; // no scrollbar
- // calculate offset
- int szr = cnt-num;
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel0 ) MenuSound("menu/demoscroll");
- ofs0 = sel0 = step;
- drag = 1;
- }
- }
- else if ( (type == MOUSE_Move) && drag ) // scroll dragging
- {
- if ( tabs[curtab] == TAB_MISSION )
- {
- String str;
- if ( sel1 == 0 ) str = StringTable.Localize(missionstr);
- else str = StringTable.Localize(missionbacklog[sel1-1]);
- BrokenLines l = fnt.BreakLines(str,629);
- if ( l.Count() > 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,620);
- }
- else
- {
- l.Destroy();
- return res; // no scrollbar
- }
- // calculate offset
- int szr = l.Count()-28;
- l.Destroy();
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel0 ) MenuSound("menu/demoscroll");
- ofs0 = sel0 = step;
- }
- else if ( (tabs[curtab] == TAB_INVENTORY) || ((tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1)) )
- {
- // check that scrollbar is present
- if ( invlist.Size() <= 0 ) return res; // definitely no scrollbar
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) ) str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
- else str = invlist[i].GetTag();
- len = fnt.StringWidth(str);
- if ( len > longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- if ( maxcol >= totalcol ) return res; // no scrollbar
- // calculate offset
- int szr = totalcol-maxcol;
- int step = clamp(rnd((mpos.x-5.)/(630./szr)),0,szr);
- if ( step > 0 ) step += (maxcol-1);
- if ( step != (ofs0/22) ) MenuSound("menu/demoscroll");
- ofs0 = step*22;
- }
- else if ( tabs[curtab] == TAB_KEYS )
- {
- // check that scrollbar is present
- if ( invlist.Size() <= 0 ) return res; // definitely no scrollbar
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- if ( maxcol >= totalcol ) return res; // no scrollbar
- // calculate offset
- int szr = totalcol-maxcol;
- int step = clamp(rnd((mpos.x-5.)/(630./szr)),0,szr);
- if ( step > 0 ) step += (maxcol-1);
- if ( step != (ofs0/22) ) MenuSound("menu/demoscroll");
- ofs0 = step*22;
- }
- else if ( tabs[curtab] == TAB_STORE )
- {
- // check that scrollbar is present
- if ( storelist.Size() <= 0 ) return res; // definitely no scrollbar
- xx = 9;
- yy = 23;
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,SWWMUtility.GetAmmoTagClass(storelist[i]));
- else str = def.GetTag();
- }
- else if ( (storeunits[i] > 1) || (storelist[i] is 'Ammo') ) str = String.Format("%dx %s",storeunits[i],SWWMUtility.GetAmmoTagClass(storelist[i]));
- else str = def.GetTag();
- len = fnt.StringWidth(str);
- if ( len > longest ) longest = len;
- }
- maxcol = 622/(longest+96);
- totalcol = int(ceil(storelist.Size()/22.));
- if ( maxcol >= totalcol ) return res; // no scrollbar
- // calculate offset
- int szr = totalcol-maxcol;
- int step = clamp(rnd((mpos.x-5.)/(630./szr)),0,szr);
- if ( step > 0 ) step += (maxcol-1);
- if ( step != (ofs0/22) ) MenuSound("menu/demoscroll");
- ofs0 = step*22;
- }
- else if ( tabs[curtab] == TAB_LIBRARY )
- {
- if ( drag == 1 )
- {
- // check that scrollbar is present
- if ( lorelist.Size() <= 27 ) return res; // no scrollbar
- // calculate offset
- int szr = lorelist.Size()-27;
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step ) step += 26;
- if ( step != ofs0 ) MenuSound("menu/demoscroll");
- ofs0 = step;
- }
- else if ( drag == 3 )
- {
- // check that scrollbar is present
- str = StringTable.Localize(lorelist[sel0].text);
- int ofs = (language~=="jp")?212:132;
- if ( lorelist.Size() > 26 ) ofs += 8;
- BrokenLines l = fnt.BreakLines(str,635-ofs);
- if ( l.Count() > 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,626-ofs);
- }
- else
- {
- l.Destroy();
- return res; // no scrollbar
- }
- // calculate offset
- int szr = l.Count()-28;
- l.Destroy();
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel2 ) MenuSound("menu/demoscroll");
- ofs2 = sel2 = step;
- }
- }
- else if ( tabs[curtab] == TAB_TRADING )
- {
- if ( !sub )
- {
- // check that scrollbar is present (will it ever be???)
- if ( playerlist.Size() <= 0 ) return res; // definitely no scrollbar
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- if ( maxcol >= totalcol ) return res; // no scrollbar
- // calculate offset
- int szr = totalcol-maxcol;
- int step = clamp(rnd((mpos.x-5.)/(630./szr)),0,szr);
- if ( step > 0 ) step += (maxcol-1);
- if ( step != (ofs0/22) ) MenuSound("menu/demoscroll");
- ofs0 = step*22;
- }
- else if ( sel0 == -1 )
- {
- if ( tradelib.ent.Size() <= 28 ) return res; // no scrollbar
- // calculate offset
- int szr = tradelib.ent.Size()-28;
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel0 ) MenuSound("menu/demoscroll");
- ofs0 = sel0 = step;
- }
- }
- else if ( tabs[curtab] == TAB_CHAT )
- {
- let bar = SWWMStatusBar(StatusBar);
- if ( !FullHistory || (FullHistory.msg.Size() <= 1) ) return res; // no scrollbar
- // calculate offset
- int szr = FullHistory.msg.Size()-1;
- int step = szr-clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel0 ) MenuSound("menu/demoscroll");
- ofs0 = sel0 = step;
- }
- else if ( tabs[curtab] == TAB_HELP )
- {
- int k1, k2;
- [k1, k2] = bindings.GetKeysForCommand("openmenu SWWMKnowledgeBaseMenu");
- String kstr = bindings.NameKeys(k1,k2);
- str = String.Format(StringTable.Localize("$SWWM_HELPTXT"),kstr);
- BrokenLines l = fnt.BreakLines(str,629);
- if ( l.Count() > 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,620);
- }
- else
- {
- l.Destroy();
- return res; // no scrollbar
- }
- // calculate offset
- int szr = l.Count()-28;
- l.Destroy();
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel0 ) MenuSound("menu/demoscroll");
- ofs0 = sel0 = step;
- }
- else if ( tabs[curtab] == TAB_STATS )
- {
- int cnt = 0, num = 22;
- if ( sel1 == STAT_MAIN ) cnt = statlist.Size();
- else if ( sel1 == STAT_KILLS ) cnt = stats.mstats.Size();
- else if ( sel1 == STAT_LEVEL ) cnt = filtered_lstats.Size();
- else if ( sel1 == STAT_ACHIEVEMENT )
- {
- cnt = achievements.Size();
- num = 7;
- }
- if ( cnt <= num ) return res; // no scrollbar
- // calculate offset
- int szr = cnt-num;
- int step = clamp(rnd((mpos.y-24.)/(353./szr)),0,szr);
- if ( step != sel0 ) MenuSound("menu/demoscroll");
- ofs0 = sel0 = step;
- }
- }
- else if ( type == MOUSE_Release ) drag = 0; // stop dragging any active scrolls
- return res;
- }
-
- private bool CmpInventory( Inventory a, Inventory b )
- {
- int ta = 0, tb = 0;
- if ( a is 'Weapon' ) ta = 2;
- 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 '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;
- else if ( b is 'PuzzleItem' ) tb = 1;
- if ( ta == tb )
- {
- if ( a is 'Weapon' )
- {
- bool dummy;
- int slota, slotb;
- [dummy, slota] = players[consoleplayer].weapons.LocateWeapon(Weapon(a).GetClass());
- if ( slota == 0 ) slota = 10;
- [dummy, slotb] = players[consoleplayer].weapons.LocateWeapon(Weapon(b).GetClass());
- if ( slotb == 0 ) slotb = 10;
- if ( slota == slotb )
- return (Weapon(a).SlotPriority <= Weapon(b).SlotPriority);
- return slota > slotb;
- }
- else if ( a is 'Ammo' )
- {
- Class usesa, usesb;
- for ( int i=0; i)(AllActorClasses[i]);
- if ( !w ) continue;
- let def = GetDefaultByType(w);
- if ( w is 'SWWMWeapon' )
- {
- if ( SWWMWeapon(def).UsesAmmo(Ammo(a).GetClass()) )
- usesa = w;
- if ( SWWMWeapon(def).UsesAmmo(Ammo(b).GetClass()) )
- usesb = w;
- }
- else
- {
- if ( (def.AmmoType1 == Ammo(a).GetClass()) || (def.AmmoType2 == Ammo(a).GetClass()) )
- usesa = w;
- if ( (def.AmmoType1 == Ammo(b).GetClass()) || (def.AmmoType2 == Ammo(b).GetClass()) )
- usesb = w;
- }
- if ( usesa && usesb )
- break;
- }
- if ( usesa && usesb )
- {
- bool dummy;
- int slota, slotb;
- [dummy, slota] = players[consoleplayer].weapons.LocateWeapon(usesa);
- if ( slota == 0 ) slota = 10;
- [dummy, slotb] = players[consoleplayer].weapons.LocateWeapon(usesb);
- if ( slotb == 0 ) slotb = 10;
- if ( slota == slotb )
- {
- // sort by unit value
- int vala = abs(a.default.Stamina);
- int valb = abs(b.default.Stamina);
- if ( vala == valb )
- {
- // sort alphabetically
- return a.GetTag() > b.GetTag();
- }
- return vala > valb;
- }
- return slota > slotb;
- }
- }
- else if ( a is 'MagAmmo' )
- {
- // oh boy this one gets complicated
- Class pamoa, pamob;
- pamoa = MagAmmo(a).ParentAmmo;
- pamob = MagAmmo(b).ParentAmmo;
- Class usesa, usesb;
- for ( int i=0; i)(AllActorClasses[i]);
- if ( !w ) continue;
- let def = GetDefaultByType(w);
- if ( w is 'SWWMWeapon' )
- {
- if ( SWWMWeapon(def).UsesAmmo(pamoa) )
- usesa = w;
- if ( SWWMWeapon(def).UsesAmmo(pamob) )
- usesb = w;
- }
- else
- {
- if ( (def.AmmoType1 == pamoa) || (def.AmmoType2 == pamoa) )
- usesa = w;
- if ( (def.AmmoType1 == pamob) || (def.AmmoType2 == pamob) )
- usesb = w;
- }
- if ( usesa && usesb )
- break;
- }
- if ( usesa && usesb )
- {
- bool dummy;
- int slota, slotb;
- [dummy, slota] = players[consoleplayer].weapons.LocateWeapon(usesa);
- if ( slota == 0 ) slota = 10;
- [dummy, slotb] = players[consoleplayer].weapons.LocateWeapon(usesb);
- if ( slotb == 0 ) slotb = 10;
- if ( slota == slotb )
- {
- // sort by unit value
- int vala = GetDefaultByType(pamoa).Stamina;
- int valb = GetDefaultByType(pamob).Stamina;
- if ( vala == valb )
- {
- // sort alphabetically
- return a.GetTag() > b.GetTag();
- }
- return vala > valb;
- }
- return slota > slotb;
- }
- }
- else
- {
- // sort by unit value
- int vala = abs(a.default.Stamina);
- int valb = abs(b.default.Stamina);
- if ( vala == valb )
- {
- // sort alphabetically
- return a.GetTag() > b.GetTag();
- }
- return vala > valb;
- }
- }
- return ta > tb;
- }
-
- private bool CmpInventoryClass( Class a, Class b )
- {
- int ta = 0, tb = 0;
- let da = GetDefaultByType(a);
- let db = GetDefaultByType(b);
- if ( a is 'Weapon' ) ta = 4;
- else if ( a is 'HammerspaceEmbiggener' ) ta = 3;
- else if ( a is 'Ammo' ) ta = 2;
- else if ( a is 'MagAmmo' ) ta = 1;
- else if ( (a is 'PowerupGiver') || (a is 'AmmoFabricator') || da.bBIGPOWERUP ) ta = 5;
- else if ( (a is 'Health') || (a is 'HealthPickup') || (a is 'SWWMHealth') ) ta = 7;
- else if ( (a is 'Armor') || (a is 'SWWMSpareArmor') ) ta = 6;
- if ( b is 'Weapon' ) tb = 4;
- else if ( b is 'HammerspaceEmbiggener' ) tb = 3;
- else if ( b is 'Ammo' ) tb = 2;
- else if ( b is 'MagAmmo' ) ta = 1;
- else if ( (b is 'PowerupGiver') || (b is 'AmmoFabricator') || db.bBIGPOWERUP ) tb = 5;
- else if ( (b is 'Health') || (b is 'HealthPickup') || (b is 'SWWMHealth') ) tb = 7;
- else if ( (b is 'Armor') || (b is 'SWWMSpareArmor') ) tb = 6;
- if ( ta == tb )
- {
- // sort by unit price
- if ( abs(da.Stamina) == abs(db.Stamina) )
- {
- // sort alphabetically
- return da.GetTag() > db.GetTag();
- }
- return abs(da.Stamina) > abs(db.Stamina);
- }
- return ta < tb;
- }
-
- private int partition_inventory( Array a, int l, int h )
- {
- Inventory pv = a[h];
- int i = (l-1);
- for ( int j=l; j<=(h-1); j++ )
- {
- if ( CmpInventory(pv,a[j]) )
- {
- i++;
- Inventory tmp = a[j];
- a[j] = a[i];
- a[i] = tmp;
- }
- }
- Inventory tmp = a[h];
- a[h] = a[i+1];
- a[i+1] = tmp;
- return i+1;
- }
- private void qsort_inventory( Array a, int l, int h )
- {
- if ( l >= h ) return;
- int p = partition_inventory(a,l,h);
- qsort_inventory(a,l,p-1);
- qsort_inventory(a,p+1,h);
- }
-
- private int partition_store( Array > a, Array b, int l, int h )
- {
- Class pv = a[h];
- int i = (l-1);
- for ( int j=l; j<=(h-1); j++ )
- {
- if ( CmpInventoryClass(pv,a[j]) )
- {
- i++;
- Class tmp = a[j];
- a[j] = a[i];
- a[i] = tmp;
- int tmpi = b[j];
- b[j] = b[i];
- b[i] = tmpi;
- }
- }
- Class tmp = a[h];
- a[h] = a[i+1];
- a[i+1] = tmp;
- int tmpi = b[h];
- b[h] = b[i+1];
- b[i+1] = tmpi;
- return i+1;
- }
- private void qsort_store( Array > a, Array b, int l, int h )
- {
- if ( l >= h ) return;
- int p = partition_store(a,b,l,h);
- qsort_store(a,b,l,p-1);
- qsort_store(a,b,p+1,h);
- }
-
- private bool CmpMonsterKill( MonsterKill a, MonsterKill b )
- {
- if ( a.kills == b.kills )
- {
- // sort by name instead
- String taga, tagb;
- taga = GetDefaultByType(a.m).GetTag();
- tagb = GetDefaultByType(b.m).GetTag();
- // beautify if there's no tag
- if ( taga == FallbackTag )
- {
- taga = a.m.GetClassName();
- SWWMUtility.BeautifyClassName(taga);
- }
- if ( tagb == FallbackTag )
- {
- tagb = a.m.GetClassName();
- SWWMUtility.BeautifyClassName(tagb);
- }
- return taga > tagb;
- }
- return a.kills < b.kills;
- }
-
- private int partition_mstats( Array a, int l, int h )
- {
- MonsterKill pv = a[h];
- int i = (l-1);
- for ( int j=l; j<=(h-1); j++ )
- {
- if ( CmpMonsterKill(pv,a[j]) )
- {
- i++;
- MonsterKill tmp = a[j];
- a[j] = a[i];
- a[i] = tmp;
- }
- }
- MonsterKill tmp = a[h];
- a[h] = a[i+1];
- a[i+1] = tmp;
- return i+1;
- }
- private void qsort_mstats( Array a, int l, int h )
- {
- if ( l >= h ) return;
- int p = partition_mstats(a,l,h);
- qsort_mstats(a,l,p-1);
- qsort_mstats(a,p+1,h);
- }
-
- private int partition_lore( Array a, int l, int h )
- {
- SWWMLore pv = a[h];
- int i = (l-1);
- for ( int j=l; j<=(h-1); j++ )
- {
- if ( StringTable.Localize(pv.tag) > StringTable.Localize(a[j].tag) )
- {
- i++;
- SWWMLore tmp = a[j];
- a[j] = a[i];
- a[i] = tmp;
- }
- }
- SWWMLore tmp = a[h];
- a[h] = a[i+1];
- a[i+1] = tmp;
- return i+1;
- }
- private void qsort_lore( Array a, int l, int h )
- {
- if ( l >= h ) return;
- int p = partition_lore(a,l,h);
- qsort_lore(a,l,p-1);
- qsort_lore(a,p+1,h);
- }
-
- private bool CmpCollectible( Inventory a, Inventory b )
- {
- if ( a.Stamina == b.Stamina )
- {
- // alphabetic
- return a.GetTag() > b.GetTag();
- }
- // descending value
- return a.default.Stamina < b.default.Stamina;
- }
-
- private int partition_collectible( Array a, int l, int h )
- {
- Inventory pv = a[h];
- int i = (l-1);
- for ( int j=l; j<=(h-1); j++ )
- {
- if ( CmpCollectible(pv,a[j]) )
- {
- i++;
- Inventory tmp = a[j];
- a[j] = a[i];
- a[i] = tmp;
- }
- }
- Inventory tmp = a[h];
- a[h] = a[i+1];
- a[i+1] = tmp;
- return i+1;
- }
- private void qsort_collectible( Array a, int l, int h )
- {
- if ( l >= h ) return;
- int p = partition_collectible(a,l,h);
- qsort_collectible(a,l,p-1);
- qsort_collectible(a,p+1,h);
- }
-
- private bool CmpAchievement( SWWMAchievement a, SWWMAchievement b )
- {
- bool adone = !!(a.state.GetInt()), bdone = !!(b.state.GetInt());
- double afactor = adone?1.:0., bfactor = bdone?1.:0.;
- if ( a.progress )
- {
- int cur = clamp(a.progress.GetInt(),0,a.maxval);
- afactor = cur/double(a.maxval);
- }
- if ( b.progress )
- {
- int cur = clamp(b.progress.GetInt(),0,b.maxval);
- bfactor = cur/double(b.maxval);
- }
- // sort by base index
- if ( adone && bdone ) return a.baseindex > b.baseindex;
- if ( !adone && !bdone )
- {
- // progress sort?
- if ( afactor != bfactor )
- return afactor < bfactor;
- // sort by base index
- return a.baseindex > b.baseindex;
- }
- // state sort
- return bdone;
- }
-
- private int partition_achievements( Array a, int l, int h )
- {
- SWWMAchievement pv = a[h];
- int i = (l-1);
- for ( int j=l; j<=(h-1); j++ )
- {
- if ( CmpAchievement(pv,a[j]) )
- {
- i++;
- SWWMAchievement tmp = a[j];
- a[j] = a[i];
- a[i] = tmp;
- }
- }
- SWWMAchievement tmp = a[h];
- a[h] = a[i+1];
- a[i+1] = tmp;
- return i+1;
- }
- private void qsort_achievements( Array a, int l, int h )
- {
- if ( l >= h ) return;
- int p = partition_achievements(a,l,h);
- qsort_achievements(a,l,p-1);
- qsort_achievements(a,p+1,h);
- }
-
override void Ticker()
{
Super.Ticker();
if ( (gamestate != GS_LEVEL) || (players[consoleplayer].Health <= 0) || isclosing )
{
// ded (or force close)
- EventHandler.SendNetworkEvent("swwmclearalltransactions",consoleplayer);
- Close();
+ DoClose();
return;
}
if ( swwm_menupause ) menuactive = Menu.On;
@@ -2332,503 +317,65 @@ Class DemolitionistMenu : GenericMenu
let bar = SWWMStatusBar(StatusBar);
if ( bar ) bar.TickInterpolators();
}
- if ( tabs[curtab] == TAB_INVENTORY )
+ CheckTransactions();
+ // update time string
+ clockstr = CrimeTime();
+ // update money
+ [muns1, muns2] = SWWMCredits.Get(players[consoleplayer]);
+ munstr = "\cg¥\c-";
+ if ( muns2 > 0 ) munstr.AppendFormat("%d",muns2);
+ munstr.AppendFormat("%09d",muns1);
+ if ( (tabs.Size() <= 0) || (curtab == -1) || !tabs[curtab] ) return;
+ tabs[curtab].Ticker();
+ }
+
+ override bool MouseEvent( int type, int mx, int my )
+ {
+ bool res = Super.MouseEvent(type,mx,my);
+ Vector2 mpos = (mx/hs,my/hs)-origin;
+ if ( type == MOUSE_Click )
{
- invlist.Clear();
- // alphabetically sorted inventory
- for ( Inventory inv=players[consoleplayer].mo.Inv; inv; inv=inv.Inv )
+ // outside clickable area
+ if ( (mpos.x < 0) || (mpos.x > ws.x) || (mpos.y < 0) || (mpos.y > ws.y-14) ) return res;
+ else if ( mpos.y < 14 )
{
- if ( (inv.Amount <= 0) || !inv.SpawnState.ValidateSpriteFrame() || (inv is 'Key') || (inv is 'BasicArmor') || (inv is 'HexenArmor') || (inv is 'Powerup') || (inv is 'SWWMArmor') || (!(inv is 'Ammo') && !(inv is 'Weapon') && !inv.bINVBAR) && !(inv is 'HammerspaceEmbiggener') && !(inv is 'SWWMCollectible') && !(inv is 'MagAmmo') || (inv is 'SWWMCollectible') ) continue;
- // no hidden weapons
- if ( (inv is 'SWWMWeapon') && SWWMWeapon(inv).bHIDEINMENU ) continue;
- String tag = inv.GetTag();
- bool greater = false;
- for ( int i=0; i tag2 ) continue;
- greater = true;
- invlist.Insert(i,inv);
- break;
- }
- if ( greater ) continue;
- invlist.Push(inv);
- }
- // re-sort by category
- qsort_inventory(invlist,0,invlist.Size()-1);
- // crop selection
- if ( sel0 >= invlist.Size() ) sel0 = max(0,invlist.Size()-1);
- }
- else if ( (tabs[curtab] == TAB_STATS) && (sel1 == STAT_KILLS) )
- {
- sorted_mstats.Copy(stats.mstats);
- qsort_mstats(sorted_mstats,0,sorted_mstats.Size()-1);
- }
- else if ( tabs[curtab] == TAB_KEYS )
- {
- invlist.Clear();
- if ( !deathmatch )
- {
- // keys sorted by their index
- int n = Key.GetKeyTypeCount();
- for ( int i=0; i pc = invlist[i].Species;
- if ( !pc ) continue;
- for ( int j=0; j= xx) && (mpos.x < xx+len) )
{
- if ( invlist[j].GetClass() != pc ) continue;
- invlist.Delete(j);
- j--;
- if ( i >= j ) i--;
- }
- }
- }
- // collectibles, sorted by name
- Array cols;
- for ( Inventory inv=players[consoleplayer].mo.Inv; inv; inv=inv.Inv )
- {
- if ( inv is 'SWWMCollectible' )
- cols.Push(inv);
- }
- qsort_collectible(cols,0,cols.Size()-1);
- invlist.Append(cols);
- // crop selection
- if ( sel0 >= invlist.Size() ) sel0 = max(0,invlist.Size()-1);
- }
- else if ( tabs[curtab] == TAB_STORE )
- {
- Class lastsel = null;
- if ( storelist.Size() > 0 ) lastsel = storelist[sel0];
- storelist.Clear();
- storeunits.Clear();
- // price-sorted buyables/sellables
- for ( int i=0; i)(AllActorClasses[i]);
- if ( !type ) continue;
- // no collectibles
- if ( type is 'SWWMCollectible' ) continue;
- // no barriers outside doom
- if ( !(gameinfo.gametype&GAME_DOOM) && (type is 'EBarrier') ) continue;
- // no gravity/tether outside raven
- if ( !(gameinfo.gametype&GAME_RAVEN) && ((type is 'GravitySuppressor') || (type is 'SafetyTether')) ) continue;
- // can't sell candygun spares
- if ( sub && (type is 'CandyGunSpares') ) continue;
- let cur = players[consoleplayer].mo.FindInventory(type);
- // skip items we don't own or are depleted if selling
- if ( sub && (!cur || (cur.Amount <= 0)) ) continue;
- else if ( !sub )
- {
- // skip maxed items if buying
- if ( cur && (cur.Amount >= cur.MaxAmount) ) continue;
- // ignore ammo for weapons not owned if buying
- bool notownedammo = false;
- if ( type is 'Ammo' )
- {
- notownedammo = true;
- let amo = (Class)(type);
- for ( Inventory inv=players[consoleplayer].mo.Inv; inv; inv=inv.inv )
- {
- if ( !(inv is 'Weapon') ) continue;
- if ( (Weapon(inv).AmmoType1 == amo) || (Weapon(inv).AmmoType2 == amo) )
- {
- notownedammo = false;
- break;
- }
- if ( (inv is 'SWWMWeapon') && SWWMWeapon(inv).UsesAmmo(amo) )
- {
- notownedammo = false;
- break;
- }
- }
- }
- if ( notownedammo ) continue;
- }
- let inv = GetDefaultByType(type);
- // skip unimplemented weapons
- if ( type is 'Weapon' )
- {
- let ready = inv.FindState("Ready");
- if ( !ready || !ready.ValidateSpriteFrame() ) continue;
- }
- // ignore child ammos
- if ( (type is 'Ammo') && (type.GetParentClass() != 'SWWMAmmo') ) continue;
- if ( inv.Stamina == 0 ) continue;
- // items with negative stamina can only be sold
- if ( (inv.Stamina < 0) && !sub ) continue;
- int amt = inv.Amount;
- int price = int(abs(inv.Stamina)*(1.+.75*(amt-1)));
- if ( type is 'Ammo' )
- {
- int maxamt;
- if ( sub ) maxamt = cur.Amount; // we can sell ALL our ammo
- else maxamt = cur?(cur.MaxAmount-cur.Amount):inv.MaxAmount;
- // get the largest affordable child pickup amount (that we need, or we can sell)
- for ( int j=0; j)(AllActorClasses[j]);
- if ( !type2 || (type2.GetParentClass() != type) ) continue;
- let inv2 = GetDefaultByType(type2);
- int cprice = int(abs(inv.Stamina)*(1.+.75*(inv2.Amount-1)));
- if ( (inv2.Amount > amt) && (inv2.Amount <= maxamt) && (sub || SWWMCredits.CanTake(players[consoleplayer],cprice)) )
- {
- price = cprice;
- amt = inv2.Amount;
- }
- }
- }
- // nuggets can be bought/sold in bulk
- else if ( type is 'HealthNuggetItem' )
- {
- let inv2 = GetDefaultByType(SWWMHealth(inv).giveme);
- int maxamt;
- if ( sub ) maxamt = cur.Amount;
- else
- {
- maxamt = (inv2.MaxAmount-players[consoleplayer].Health);
- maxamt += cur?(cur.MaxAmount-cur.Amount):inv.MaxAmount;
- }
- for ( int j=5; j<=20; j+=5 )
- {
- int cprice = int(inv.Stamina*(1.+.75*(j-1)));
- if ( (j <= maxamt) && (sub || SWWMCredits.CanTake(players[consoleplayer],cprice)) )
- {
- price = cprice;
- amt = j;
- }
- }
- }
- else if ( type is 'ArmorNuggetItem' )
- {
- let inv2 = GetDefaultByType(SWWMSpareArmor(inv).giveme);
- let cur2 = players[consoleplayer].mo.FindInventory(SWWMSpareArmor(inv).giveme);
- int maxamt;
- if ( sub ) maxamt = cur.Amount;
- else
- {
- maxamt = cur2?(cur2.MaxAmount-cur2.Amount):inv2.MaxAmount;
- maxamt += cur?(cur.MaxAmount-cur.Amount):inv.MaxAmount;
- }
- for ( int j=5; j<=20; j+=5 )
- {
- int cprice = int(inv.Stamina*(1.+.75*(j-1)));
- if ( (j <= maxamt) && (sub || SWWMCredits.CanTake(players[consoleplayer],cprice)) )
- {
- price = cprice;
- amt = j;
- }
- }
- }
- // sort by unit price
- bool greater = false;
- for ( int j=0; j abs(inv2.Stamina) ) continue;
- greater = true;
- storelist.Insert(j,type);
- storeunits.Insert(j,amt);
- break;
- }
- if ( greater ) continue;
- storelist.Push(type);
- storeunits.Push(amt);
- }
- // re-sort by category
- qsort_store(storelist,storeunits,0,storelist.Size()-1);
- // shift back if the last selected item was removed
- if ( lastsel && (storelist.Find(lastsel)) >= storelist.Size() )
- sel0 = max(0,sel0-1);
- // crop selection
- if ( sel0 >= storelist.Size() ) sel0 = max(0,storelist.Size()-1);
- }
- else if ( tabs[curtab] == TAB_LIBRARY )
- {
- // remember last position/size
- SWWMLore oldone = null;
- int oldsiz = lorelist.Size();
- if ( lorelist.Size() > 0 ) oldone = lorelist[sel0];
- // lore lore lore
- lorelist.Clear();
- for ( int i=0; i 0) && (idx < lorelist.Size()) )
- sel0 = idx;
- // update ofs so selection stays on-screen
- int ofs = max(ofs0-26,0);
- if ( sel0 < ofs ) ofs0 = sel0+26;
- else if ( sel0 > ofs+26 ) ofs0 = sel0;
- }
- // add "new entries" message
- if ( lorelib.ent.Size() != oldloresiz )
- {
- tmsg = StringTable.Localize("$SWWM_NEWLORE");
- tmsgtic = gametic+70;
- }
- oldloresiz = lorelib.ent.Size();
- }
- else if ( tabs[curtab] == TAB_TRADING )
- {
- // build player list
- int oldnplayers = playerlist.Size();
- playerlist.Clear();
- for ( int i=0; i tag2 ) continue;
- greater = true;
- invlist.Insert(i,inv);
+ if ( curtab == i ) break;
+ MenuSound("menu/demotab");
+ tabs[curtab].OnDeselect();
+ curtab = i;
+ tabs[curtab].OnSelect();
break;
}
- if ( greater ) continue;
- invlist.Push(inv);
+ xx += len;
}
- // re-sort by category
- qsort_inventory(invlist,0,invlist.Size()-1);
- // crop selection
- if ( sel1 >= invlist.Size() ) sel1 = max(0,invlist.Size()-1);
+ return res;
}
+ else if ( (tabs.Size() <= 0) || (curtab == -1) || !tabs[curtab] ) return res;
+ tabs[curtab].MouseInput(mpos,isrclick?MB_RIGHT:MB_LEFT);
}
- else if ( (tabs[curtab] == TAB_STATS) && (sel1 == STAT_MAIN) )
+ else if ( type == MOUSE_Move )
{
- statlist.Clear();
- // wish I could use macros for this
- int thour = ((level.totaltime-stats.lastspawn)/(3600*GameTicRate));
- int tmin = ((level.totaltime-stats.lastspawn)/(60*GameTicRate))%60;
- int tsec = ((level.totaltime-stats.lastspawn)/GameTicRate)%60;
- String str = String.Format("\cx%s\c-%02d\cu:\c-%02d\cu:\c-%02d",StringTable.Localize("$SWWM_STATUPTIME"),thour,tmin,tsec);
- statlist.Push(str);
- if ( stats.grounddist > 32000. ) str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATONFOOT"),stats.grounddist/32000.,StringTable.Localize("$SWWM_UNIT_KILOMETER"));
- else str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATONFOOT"),stats.grounddist/32.,StringTable.Localize("$SWWM_UNIT_METER"));
- statlist.Push(str);
- if ( stats.airdist > 32000. ) str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATFLIGHT"),stats.airdist/32000.,StringTable.Localize("$SWWM_UNIT_KILOMETER"));
- else str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATFLIGHT"),stats.airdist/32.,StringTable.Localize("$SWWM_UNIT_METER"));
- statlist.Push(str);
- if ( stats.swimdist > 32000. ) str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATSWIM"),stats.swimdist/32000.,StringTable.Localize("$SWWM_UNIT_KILOMETER"));
- else str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATSWIM"),stats.swimdist/32.,StringTable.Localize("$SWWM_UNIT_METER"));
- statlist.Push(str);
- if ( stats.teledist > 32000. ) str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATTELE"),stats.teledist/32000.,StringTable.Localize("$SWWM_UNIT_KILOMETER"));
- else str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATTELE"),stats.teledist/32.,StringTable.Localize("$SWWM_UNIT_METER"));
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATBOOST"),stats.boostcount);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATDASH"),stats.dashcount);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATSTOMP"),stats.stompcount);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATFUEL"),stats.fuelusage,StringTable.Localize("$SWWM_UNIT_LITER"));
- statlist.Push(str);
- str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATSPEED"),(stats.topspeed*3600.*GameTicRate)/32000.,StringTable.Localize("$SWWM_UNIT_KPH"));
- statlist.Push(str);
- thour = (stats.airtime/(3600*GameTicRate));
- tmin = (stats.airtime/(60*GameTicRate))%60;
- tsec = (stats.airtime/GameTicRate)%60;
- str = String.Format("\cx%s\c-%02d\cu:\c-%02d\cu:\c-%02d",StringTable.Localize("$SWWM_STATAIRTIME"),thour,tmin,tsec);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATPARRY"),stats.parries);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATPPARRY"),stats.pparries);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATWPONCH"),stats.wponch);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATBUSTS"),stats.busts);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATBUTTS"),stats.buttslams);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATPATS"),stats.pats);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATKISS"),stats.smooch);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATFRIENDS"),stats.befriend);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATITEMS"),stats.items);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATSECRETS"),stats.secrets);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATKILLS"),stats.kills);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATDEATHS"),stats.deaths);
- statlist.Push(str);
- if ( stats.hdamagedealt > 0 ) str = str = String.Format("\cx%s\c-%d%09d",StringTable.Localize("$SWWM_STATDDEALT"),stats.hdamagedealt,stats.damagedealt);
- else str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATDDEALT"),stats.damagedealt);
- statlist.Push(str);
- if ( stats.hdamagetaken > 0 ) str = String.Format("\cx%s\c-%d%09d",StringTable.Localize("$SWWM_STATDTAKEN"),stats.hdamagetaken,stats.damagetaken);
- else str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATDTAKEN"),stats.damagetaken);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATTDEALT"),stats.topdealt);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATTTAKEN"),stats.toptaken);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATMKILL"),stats.mkill);
- statlist.Push(str);
- str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATSKILL"),stats.skill);
- statlist.Push(str);
- str = String.Format("\cx%s\c-",StringTable.Localize("$SWWM_STATFAVWEAP"));
- if ( stats.favweapon == -1 ) str = str.."N/A";
- else if ( stats.wstats[stats.favweapon].w == 'SWWMWeapon' ) str = str..StringTable.Localize("$SWWM_YOURSELF");
- else if ( stats.wstats[stats.favweapon].w == 'SWWMGesture' ) str = str..StringTable.Localize("$SWWM_DOKIDOKI");
- else if ( stats.wstats[stats.favweapon].w == 'SWWMItemGesture' ) str = str..StringTable.Localize("$T_FROGGY");
- else if ( stats.wstats[stats.favweapon].w == 'Weapon' ) str = str..StringTable.Localize("$SWWM_GRAVKILL");
- else if ( stats.wstats[stats.favweapon].w == 'DoomWeapon' ) str = str..StringTable.Localize("$SWWM_PARRYKILL");
- else
- {
- let def = GetDefaultByType(stats.wstats[stats.favweapon].w);
- str = str..def.GetTag();
- }
- statlist.Push(str);
- if ( stats.hhiscore > 0 ) str = String.Format("\cx%s\cu¥\c-%d%09d",StringTable.Localize("$SWWM_STATHISCORE"),stats.hhiscore,stats.hiscore);
- else str = String.Format("\cx%s\cu¥\c-%09d",StringTable.Localize("$SWWM_STATHISCORE"),stats.hiscore);
- statlist.Push(str);
+ if ( (tabs.Size() <= 0) || (curtab == -1) || !tabs[curtab] ) return res;
+ tabs[curtab].MouseInput(mpos,MB_DRAG);
}
- else if ( (tabs[curtab] == TAB_STATS) && (sel1 == STAT_LEVEL) )
+ else if ( type == MOUSE_Release )
{
- filtered_lstats.Clear();
- bool shouldfilter = swwm_uniqstats;
- for ( int i=0; iplay transaction checks
- for ( int i=0; i)(hnd.checklist[j].used);
- if ( w )
- {
- // play if actually switching
- if ( hnd.checklist[j].result )
- {
- String snd = GetDefaultByType(w).UpSound;
- MenuSound(snd);
- }
- }
- else if ( (hnd.checklist[j].used is 'SWWMCollectible') || (hnd.checklist[j].used is 'SWWMKey') )
- MenuSound("demolitionist/handsup");
- else
- {
- String snd = GetDefaultByType(hnd.checklist[j].used).UseSound;
- MenuSound(snd);
- }
- }
- }
- else
- {
- tmsg = StringTable.Localize("$SWWM_INVFAIL");
- tmsgtic = gametic+70;
- MenuSound("menu/noinvuse");
- }
- }
- else if ( checklist[i].type == MenuTransaction.TT_ITEMDROP )
- {
- // check if drop succeeded
- if ( !hnd.checklist[j].result )
- {
- tmsg = StringTable.Localize("$SWWM_INVNDROP");
- tmsgtic = gametic+70;
- MenuSound("menu/noinvuse");
- }
- }
- else if ( checklist[i].type == MenuTransaction.TT_ITEMSEND )
- {
- // check if trade succeeded
- if ( !hnd.checklist[j].result )
- {
- tmsg = StringTable.Localize("$SWWM_TRADEFULL");
- tmsgtic = gametic+70;
- MenuSound("menu/noinvuse");
- }
- else MenuSound("menu/demosel");
- }
- EventHandler.SendNetworkEvent("swwmcleartransaction",checklist[i].uid,consoleplayer);
- deleteme = true;
- break;
- }
- if ( !deleteme ) continue;
- checklist.Delete(i);
- i--;
+ if ( (tabs.Size() <= 0) || (curtab == -1) || !tabs[curtab] ) return res;
+ tabs[curtab].MouseInput(mpos,MB_RELEASE);
}
+ return res;
}
override bool OnUiEvent( UIEvent ev )
@@ -2838,29 +385,22 @@ Class DemolitionistMenu : GenericMenu
case UIEvent.Type_KeyDown:
if ( ev.keychar == UiEvent.Key_F1 )
{
- if ( tabs[curtab] == TAB_HELP )
+ int help = FindTabType('DemolitionistHelpTab');
+ if ( curtab == help )
{
- tabs.Delete(curtab);
+ tabs[curtab].OnDeselect();
curtab = oldtab;
+ tabs[curtab].OnSelect();
}
else
{
- if ( tabs[curtab] >= TAB_SECRET )
- {
- tabs.Delete(curtab);
- curtab--;
- }
- oldtab = curtab;
- tabs.Push(TAB_HELP);
- curtab = tabs.Size()-1;
+ int secret = FindTabType('DemolitionistSecretTab');
+ if ( curtab == secret ) oldtab = GetLastTab();
+ else oldtab = curtab;
+ tabs[curtab].OnDeselect();
+ curtab = help;
+ tabs[curtab].OnSelect();
}
- sel0 = sel1 = sel2 = 0;
- ofs0 = ofs1 = ofs2 = 0;
- sub = false;
- invlist.Clear();
- lorelist.Clear();
- storelist.Clear();
- storeunits.Clear();
MenuSound("menu/demotab");
return true;
}
@@ -2881,65 +421,32 @@ Class DemolitionistMenu : GenericMenu
}
if( (ikey[0] && (ev.keystring == mkey[0])) || (ikey[1] && (ev.keystring == mkey[1])) )
{
- MenuSound("menu/democlose");
- EventHandler.SendNetworkEvent("swwmclearalltransactions",consoleplayer);
- Close();
+ DoClose(true);
return true;
}
break;
case UIEvent.Type_WheelDown:
- if ( (tabs[curtab] == TAB_LIBRARY) && sub && (lorelist.Size() > 1) )
- {
- // special handling, need to check which side is being scrolled
- double hs = max(min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/400.)),1.);
- Vector2 ss = (Screen.GetWidth(),Screen.GetHeight())/hs;
- Vector2 origin = (ss.x-640,ss.y-400)/2.;
- Vector2 mpos = (curmouse/hs)-origin;
- double midp = (language~=="jp")?206:126;
- if ( ((lorelist.Size() > 27) && (mpos.x < midp+8)) || (mpos.x < midp) )
- {
- MenuSound("menu/democlose");
- sub = false;
- }
- }
- return MenuEvent(MKEY_DOWN,false);
- break;
+ tabs[curtab].MouseInput((curmouse/hs)-origin,MB_WHEELDOWN);
+ return true;
case UIEvent.Type_WheelUp:
- if ( (tabs[curtab] == TAB_LIBRARY) && sub && (lorelist.Size() > 1) )
- {
- // special handling, need to check which side is being scrolled
- double hs = max(min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/400.)),1.);
- Vector2 ss = (Screen.GetWidth(),Screen.GetHeight())/hs;
- Vector2 origin = (ss.x-640,ss.y-400)/2.;
- Vector2 mpos = (curmouse/hs)-origin;
- double midp = (language~=="jp")?206:126;
- if ( ((lorelist.Size() > 27) && (mpos.x < midp+8)) || (mpos.x < midp) )
- {
- MenuSound("menu/democlose");
- sub = false;
- }
- }
- return MenuEvent(MKEY_UP,false);
- break;
+ tabs[curtab].MouseInput((curmouse/hs)-origin,MB_WHEELUP);
+ return true;
case UIEvent.Type_LButtonDown:
+ {
isrclick = false;
- // copy over what base menus do for L click
- // but ignore back button, since we don't use it
- bool lres = MouseEvent(MOUSE_Click,ev.MouseX,ev.MouseY);
- if ( lres ) SetCapture(true);
- return lres;
- break;
+ bool res = MouseEvent(MOUSE_Click,ev.MouseX,ev.MouseY);
+ if ( res ) SetCapture(true);
+ return res;
+ }
case UIEvent.Type_RButtonDown:
+ {
isrclick = true;
- // same as L click
- bool rres = MouseEvent(MOUSE_Click,ev.MouseX,ev.MouseY);
- if ( rres ) SetCapture(true);
- return rres;
- break;
+ bool res = MouseEvent(MOUSE_Click,ev.MouseX,ev.MouseY);
+ if ( res ) SetCapture(true);
+ return res;
+ }
case UIEvent.Type_LButtonUp:
case UIEvent.Type_RButtonUp:
- // copy over what base menus do for release
- // but ignore back button, since we don't use it
if ( mMouseCapture )
{
SetCapture(false);
@@ -2947,7 +454,6 @@ Class DemolitionistMenu : GenericMenu
}
break;
case UIEvent.Type_MouseMove:
- // store coords beforehand
curmouse = (ev.MouseX,ev.MouseY);
if ( mMouseCapture || (m_use_mouse == 1) )
return MouseEvent(MOUSE_Move,ev.MouseX,ev.MouseY);
@@ -2956,869 +462,84 @@ Class DemolitionistMenu : GenericMenu
return false;
}
+ // fundamental drawing functions (good god these are hacky)
+ void DrawFrame( double x, double y, double w, double h, bool shadow = true )
+ {
+ x += origin.x;
+ y += origin.y;
+ Screen.DrawTexture(FrameTex,false,x,y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,0.,DTA_SrcY,0.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,1);
+ Screen.DrawTexture(FrameTex,false,x+1,y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,1.,DTA_SrcY,0.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,int(w-2),DTA_DestHeight,1);
+ Screen.DrawTexture(FrameTex,false,x,y+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,0.,DTA_SrcY,1.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,int(h-2));
+ Screen.DrawTexture(FrameTex,false,(x+w)-1,y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,0.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,1);
+ Screen.DrawTexture(FrameTex,false,x,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,0.,DTA_SrcY,2.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,1);
+ if ( shadow )
+ {
+ Screen.DrawTexture(FrameTex,false,(x+w)-1,y+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,1.,DTA_SrcWidth,2.,DTA_SrcHeight,1.,DTA_DestWidth,2,DTA_DestHeight,int(h-2));
+ Screen.DrawTexture(FrameTex,false,x+1,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,1.,DTA_SrcY,2.,DTA_SrcWidth,1.,DTA_SrcHeight,2.,DTA_DestWidth,int(w-2),DTA_DestHeight,2);
+ Screen.DrawTexture(FrameTex,false,(x+w)-1,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,2.,DTA_SrcWidth,2.,DTA_SrcHeight,2.,DTA_DestWidth,2,DTA_DestHeight,2);
+ }
+ else
+ {
+ Screen.DrawTexture(FrameTex,false,(x+w)-1,y+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,1.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,int(h-2));
+ Screen.DrawTexture(FrameTex,false,x+1,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,1.,DTA_SrcY,2.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,int(w-2),DTA_DestHeight,1);
+ Screen.DrawTexture(FrameTex,false,(x+w)-1,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcY,2.,DTA_SrcWidth,1.,DTA_SrcHeight,1.,DTA_DestWidth,1,DTA_DestHeight,1);
+ }
+ }
+
+ // these ones thankfully only need three drawtexture calls each
+ void DrawVSeparator( double x, double y, double h )
+ {
+ x += origin.x;
+ y += origin.y;
+ Screen.DrawTexture(VSepTex,false,x-1,y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcY,0.,DTA_SrcHeight,1.,DTA_DestHeight,1);
+ Screen.DrawTexture(VSepTex,false,x-1,y+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcY,1.,DTA_SrcHeight,1.,DTA_DestHeight,int(h-2));
+ Screen.DrawTexture(VSepTex,false,x-1,(y+h)-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcY,2.,DTA_SrcHeight,1.,DTA_DestHeight,1);
+ }
+ void DrawHSeparator( double x, double y, double w )
+ {
+ x += origin.x;
+ y += origin.y;
+ Screen.DrawTexture(HSepTex,false,x,y-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,0.,DTA_SrcWidth,1.,DTA_DestWidth,1);
+ Screen.DrawTexture(HSepTex,false,x+1,y-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,1.,DTA_SrcWidth,1.,DTA_DestWidth,int(w-2));
+ Screen.DrawTexture(HSepTex,false,(x+w)-1,y-1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_SrcX,2.,DTA_SrcWidth,1.,DTA_DestWidth,1);
+ }
+
override void Drawer()
{
if ( isclosing ) return;
- Font fnt = LangFont(TewiFont);
+ // draw the background and main frame
+ if ( swwm_fuzz ) Screen.DrawTexture(FancyBg,false,origin.x,origin.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,.5,DTA_ClipBottom,int((origin.y+ws.y)*hs));
+ Screen.Dim("Black",.8,int(origin.x*hs),int(origin.y*hs),int(ws.x*hs),int(ws.y*hs));
+ DrawFrame(0,0,ws.x,ws.y,true);
+ // draw top and bottom separators
+ DrawHSeparator(0,14,ws.x);
+ DrawHSeparator(0,ws.y-14,ws.x);
+ double xx = 5, yy = 1;
String str;
- double hs;
- if ( (Screen.GetWidth() < 640) || (Screen.GetHeight() < 400) ) hs = max(min(floor(Screen.GetWidth()/320.),floor(Screen.GetHeight()/200.)),1.)/2.;
- else hs = max(min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/400.)),1.);
- Vector2 ss = (Screen.GetWidth(),Screen.GetHeight())/hs;
- Vector2 origin = (ss.x-640,ss.y-400)/2.;
- if ( swwm_fuzz )
- Screen.DrawTexture(FancyBg,false,origin.x,origin.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,.5);
- Screen.DrawTexture(MainWindow,false,origin.x,origin.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- // draw tabs
- double xx = 3, yy = 0;
- static const string tabnames[] =
- {
- "$SWWM_MISSTAB", "$SWWM_STATTAB", "$SWWM_INVTAB", "$SWWM_KEYTAB",
- "$SWWM_KBASETAB", "$SWWM_STORETAB", "$SWWM_TRADETAB", "$SWWM_CHATTAB",
- "$SWWM_SECRETTAB", "$SWWM_HELPTAB"
- };
- static const string ltabnames[] =
- {
- "$SWWM_LORETAB0", "$SWWM_LORETAB1", "$SWWM_LORETAB2"
- };
- static const string stabnames[] =
- {
- "$SWWM_STATTAB0", "$SWWM_STATTAB1", "$SWWM_STATTAB2", "$SWWM_STATTAB3"
- };
+ // draw tab listing
for ( int i=0; i 0 ) str.AppendFormat("%d",muns2);
- str.AppendFormat("%09d",muns1);
- xx = 637-TewiFont.StringWidth(str);
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- // draw bottom messages
- yy = 386;
+ // draw money
+ xx = 637-smallfont.StringWidth(munstr);
+ Screen.DrawText(smallfont,Font.CR_FIRE,origin.x+xx,origin.y+yy,munstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ yy = ws.y-13;
+ // draw clock / messages
if ( gametic < tmsgtic ) str = tmsg;
- else str = CrimeTime();
+ else str = clockstr;
xx = 4;
- Screen.DrawText(fnt,Font.CR_WHITE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ Screen.DrawText(smallfont,Font.CR_WHITE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ // draw os version
str = "DemolitionOS v1.0";
- xx = 637-fnt.StringWidth(str);
- Screen.DrawText(fnt,Font.CR_WHITE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- // draw contents
- if ( tabs[curtab] == TAB_MISSION )
- {
- String str;
- if ( sel1 == 0 ) str = StringTable.Localize(missionstr);
- else str = StringTable.Localize(missionbacklog[sel1-1]);
- BrokenLines l = fnt.BreakLines(str,629);
- if ( l.Count() > 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,620);
- }
- xx = 6;
- yy = 17;
- int ofs = clamp(sel0,0,max(0,l.Count()-28));
- for ( int i=ofs; i= 370 ) break;
- Screen.DrawText(fnt,Font.CR_WHITE,origin.x+xx,origin.y+yy,l.StringAt(i),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,sel1?Color(96,0,0,0):Color(0,0,0,0));
- yy += 13;
- }
- int csiz = missionbacklog.Size();
- // scrollbar
- if ( l.Count() > 28 )
- {
- Screen.DrawTexture(WindowSeparator,false,origin.x+631,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx = 634;
- int szr = l.Count()-28;
- yy = floor(ofs*(353./szr))+17;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,"▮",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- // page count
- if ( csiz > 0 )
- {
- str = String.Format("%d \cf/\c- %d",sel1+1,csiz+1);
- Screen.DrawText(MiniwiFont,Font.CR_FIRE,(origin.x+629)-MiniwiFont.StringWidth(str),origin.y+375,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- else if ( csiz > 0 )
- {
- str = String.Format("%d \cf/\c- %d",sel1+1,csiz+1);
- Screen.DrawText(MiniwiFont,Font.CR_FIRE,(origin.x+637)-MiniwiFont.StringWidth(str),origin.y+375,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- l.Destroy();
- }
- else if ( tabs[curtab] == TAB_STATS )
- {
- // categories
- xx = 9;
- yy = 23;
- int twidth = (language~=="jp")?194:114;
- for ( int i=0; i<=STAT_ACHIEVEMENT; i++ )
- {
- str = StringTable.Localize(stabnames[i]);
- Screen.DrawText(fnt,(i==sel1)?Font.CR_FIRE:Font.CR_WHITE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += 16;
- }
- xx += twidth+2;
- Screen.DrawTexture(WindowSeparator,false,origin.x+xx,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- // stat contents
- if ( sel1 == STAT_MAIN )
- {
- xx += 9;
- yy = 23;
- int cnt = statlist.Size();
- if ( cnt <= 0 )
- {
- str = StringTable.Localize("$SWWM_NOSTAT");
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+xx+int((634-xx)-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- return;
- }
- int ofs = clamp(sel0,0,max(0,cnt-22));
- for ( int i=ofs; i= 370 ) break;
- str = statlist[i];
- Screen.DrawText(fnt,Font.CR_WHITE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += 16;
- }
- // scrollbar
- if ( cnt > 22 )
- {
- Screen.DrawTexture(WindowSeparator,false,origin.x+631,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx = 634;
- int szr = cnt-22;
- yy = floor(ofs*(353./szr))+17;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,"▮",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- else if ( sel1 == STAT_KILLS )
- {
- xx += 9;
- yy = 23;
- int cnt = sorted_mstats.Size();
- if ( cnt <= 0 )
- {
- str = StringTable.Localize("$SWWM_NOSTAT");
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+xx+int((634-xx)-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- return;
- }
- int ofs = clamp(sel0,0,max(0,cnt-22));
- for ( int i=ofs; i= 370 ) break;
- str = GetDefaultByType(sorted_mstats[i].m).GetTag(FallbackTag);
- // beautify if there's no tag
- if ( str == FallbackTag )
- {
- str = sorted_mstats[i].m.GetClassName();
- SWWMUtility.BeautifyClassName(str);
- }
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- str = String.Format("%d",sorted_mstats[i].kills);
- int len = fnt.StringWidth(str);
- Screen.DrawText(fnt,Font.CR_WHITE,origin.x+((cnt>22)?623:631)-len,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += 16;
- }
- // scrollbar
- if ( cnt > 22 )
- {
- Screen.DrawTexture(WindowSeparator,false,origin.x+631,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx = 634;
- int szr = cnt-22;
- yy = floor(ofs*(353./szr))+17;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,"▮",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- else if ( sel1 == STAT_LEVEL )
- {
- xx += 9;
- yy = 23;
- int cnt = filtered_lstats.Size();
- if ( cnt <= 0 )
- {
- str = StringTable.Localize("$SWWM_NOSTAT");
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+xx+int((634-xx)-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- return;
- }
- int ofs = clamp(sel0,0,max(0,cnt-22));
- let fnt2 = LangFont(MiniwiFont);
- // calc lengths
- int len[4], maxlen[4];
- for ( int i=0; i<4; i++ ) maxlen[i] = 0;
- for ( int i=0; i maxlen[0] ) maxlen[0] = len[0];
- str = String.Format("S %d/%d",filtered_lstats[i].scount,filtered_lstats[i].stotal);
- len[1] = fnt2.StringWidth(str);
- if ( len[1] > maxlen[1] ) maxlen[1] = len[1];
- str = String.Format("I %d/%d",filtered_lstats[i].icount,filtered_lstats[i].itotal);
- len[2] = fnt2.StringWidth(str);
- if ( len[2] > maxlen[2] ) maxlen[2] = len[2];
- str = String.Format("K %d/%d",filtered_lstats[i].kcount,filtered_lstats[i].ktotal);
- len[3] = fnt2.StringWidth(str);
- if ( len[3] > maxlen[3] ) maxlen[3] = len[3];
- }
- for ( int i=ofs; i= 370 ) break;
- str = filtered_lstats[i].hub?filtered_lstats[i].levelname:String.Format("%s - %s",filtered_lstats[i].mapname.MakeUpper(),filtered_lstats[i].levelname);
- if ( filtered_lstats[i] == curlstat ) str = "\cd▸\c- "..str;
- bool smallname = fnt.StringWidth(str)>(620-(xx+maxlen[3]+maxlen[2]+maxlen[1]+maxlen[0]+24));
- if ( smallname ) yy += 2;
- Screen.DrawText(smallname?fnt2:fnt,Font.CR_FIRE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- if ( !smallname ) yy += 2;
- int ox = ((cnt>22)?623:631);
- int sec = Thinker.Tics2Seconds(filtered_lstats[i].time);
- str = String.Format("%02d\cu:\c-%02d\cu:\c-%02d",sec/3600,(sec%3600)/60,sec%60);
- Screen.DrawText(fnt2,((filtered_lstats[i].suck>0)&&(sec>=(filtered_lstats[i].suck*3600)))?Font.CR_RED:(sec<=filtered_lstats[i].par)?Font.CR_GOLD:Font.CR_WHITE,origin.x+ox-fnt2.StringWidth(str),origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawText(fnt2,Font.CR_FIRE,origin.x+ox-maxlen[0],origin.y+yy,"T",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- ox -= maxlen[0]+8;
- str = String.Format("%d\cu/\c-%d",filtered_lstats[i].scount,filtered_lstats[i].stotal);
- Screen.DrawText(fnt2,(filtered_lstats[i].scount>=filtered_lstats[i].stotal)?Font.CR_GOLD:Font.CR_WHITE,origin.x+ox-fnt2.StringWidth(str),origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawText(fnt2,Font.CR_FIRE,origin.x+ox-maxlen[1],origin.y+yy,"S",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- ox -= maxlen[1]+8;
- str = String.Format("%d\cu/\c-%d",filtered_lstats[i].icount,filtered_lstats[i].itotal);
- Screen.DrawText(fnt2,(filtered_lstats[i].icount>=filtered_lstats[i].itotal)?Font.CR_GOLD:Font.CR_WHITE,origin.x+ox-fnt2.StringWidth(str),origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawText(fnt2,Font.CR_FIRE,origin.x+ox-maxlen[2],origin.y+yy,"I",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- ox -= maxlen[2]+8;
- str = String.Format("%d\cu/\c-%d",filtered_lstats[i].kcount,filtered_lstats[i].ktotal);
- Screen.DrawText(fnt2,(filtered_lstats[i].kcount>=filtered_lstats[i].ktotal)?Font.CR_GOLD:Font.CR_WHITE,origin.x+ox-fnt2.StringWidth(str),origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawText(fnt2,Font.CR_FIRE,origin.x+ox-maxlen[3],origin.y+yy,"K",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += 14;
- }
- // scrollbar
- if ( cnt > 22 )
- {
- Screen.DrawTexture(WindowSeparator,false,origin.x+631,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx = 634;
- int szr = cnt-22;
- yy = floor(ofs*(353./szr))+17;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,"▮",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- else if ( sel1 == STAT_ACHIEVEMENT )
- {
- xx += 12;
- yy = 26;
- int cnt = achievements.Size();
- int ofs = clamp(sel0,0,max(0,cnt-7));
- let fnt2 = LangFont(MiniwiFont);
- int barsz = (language~=="jp")?400:480;
- int txtsz = (language~=="jp")?360:440;
- bool obscure = (swwm_filterachievements==1);
- for ( int i=ofs; i= 360 ) break;
- let a = achievements[i];
- bool completed = !!a.state.GetInt();
- bool hasprogress = (a.progress && a.progress.GetInt());
- Screen.DrawTexture(AchievementUnknown,false,origin.x+xx+1,origin.y+yy+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_FillColor,(!completed&&!hasprogress&&obscure)?Color(8,8,8):Color(16,16,16));
- Screen.DrawTexture((!completed&&!hasprogress&&obscure)?AchievementUnknown:a.icon,false,origin.x+xx,origin.y+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Desaturate,(!completed)*255,DTA_ColorOverlay,completed?Color(0,0,0,0):(hasprogress||!obscure)?Color(96,0,0,0):Color(192,0,0,0));
- // progress bar
- if ( a.progress && (!obscure || hasprogress) )
- {
- int val = a.progress.GetInt();
- val = clamp(val,0,a.maxval);
- if ( completed ) str = SWWMUtility.BlockBar(a.maxval,a.maxval,barsz,Font.CR_DARKGREEN,Font.CR_BLACK);
- else str = SWWMUtility.BlockBar(val,a.maxval,barsz,Font.CR_DARKGRAY,Font.CR_BLACK);
- Screen.DrawText(TewiFont,Font.CR_UNTRANSLATED,origin.x+xx,origin.y+yy+34,str,DTA_Spacing,-5,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- if ( completed ) str = String.Format("%s / %s",SWWMUtility.ThousandsNum(a.maxval),SWWMUtility.ThousandsNum(a.maxval));
- else str = String.Format("%s / %s",SWWMUtility.ThousandsNum(val),SWWMUtility.ThousandsNum(a.maxval));
- int ox = (barsz-MiniwiFont.StringWidth(str))/2;
- Screen.DrawText(MiniwiFont,completed?Font.CR_GREEN:Font.CR_WHITE,origin.x+xx+ox,origin.y+yy+37,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- else
- {
- str = SWWMUtility.BlockBar(completed,1,barsz,Font.CR_DARKGREEN,Font.CR_BLACK);
- Screen.DrawText(TewiFont,Font.CR_UNTRANSLATED,origin.x+xx,origin.y+yy+34,str,DTA_Spacing,-5,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- // the text itself
- str = a.hasformat?String.Format(StringTable.Localize("$SWWM_ACHIEVEMENT_"..a.basename.."_TXT"),a.maxval):StringTable.Localize("$SWWM_ACHIEVEMENT_"..a.basename.."_TXT");
- if ( !completed && !hasprogress && obscure ) SWWMUtility.ObscureText(str,(gametic/3)+i*2);
- BrokenLines l = fnt2.BreakLines(str,txtsz);
- str = StringTable.Localize("$SWWM_ACHIEVEMENT_"..a.basename.."_TAG");
- if ( !completed && !hasprogress && obscure ) SWWMUtility.ObscureText(str,(gametic/3)+i*2+1);
- int oy = (32-(14+(9*l.Count())))/2;
- Screen.DrawText(fnt,completed?Font.CR_GREEN:Font.CR_DARKGRAY,origin.x+xx+36,origin.y+yy+oy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- for ( int j=0; j 7 )
- {
- Screen.DrawTexture(WindowSeparator,false,origin.x+631,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx = 634;
- int szr = cnt-7;
- yy = floor(ofs*(353./szr))+17;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,"▮",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- }
- else if ( tabs[curtab] == TAB_INVENTORY )
- {
- if ( invlist.Size() <= 0 )
- {
- str = StringTable.Localize("$SWWM_NOINV");
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+(640-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- return;
- }
- xx = 9;
- yy = 23;
- int longest, len;
- int maxcol, totalcol, cols = 1;
- // first pass, calculate longest item name
- for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) )
- str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
- else str = invlist[i].GetTag();
- len = fnt.StringWidth(str);
- if ( len > longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- int ofs = int(max(0,(ofs0/22)-(maxcol-1))*22);
- for ( int i=ofs; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) )
- str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
- else str = invlist[i].GetTag();
- int clscol = Font.CR_WHITE;
- if ( invlist[i] is 'Weapon' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPGold'):Font.CR_GOLD;
- else if ( invlist[i] is 'MagAmmo' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPTan'):Font.CR_TAN;
- else if ( (invlist[i] is 'BackpackItem') || (invlist[i] is 'HammerspaceEmbiggener') ) clscol = Font.CR_DARKBROWN;
- else if ( invlist[i] is 'Ammo' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPBrown'):Font.CR_BROWN;
- else if ( (invlist[i] is 'PowerupGiver') || (invlist[i] is 'AmmoFabricator') || invlist[i].bBIGPOWERUP ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPPurple'):Font.CR_PURPLE;
- else if ( (invlist[i] is 'Health') || (invlist[i] is 'HealthPickup') || (invlist[i] is 'SWWMHealth') ) clscol = Font.CR_RED;
- else if ( (invlist[i] is 'Armor') || (invlist[i] is 'SWWMSpareArmor') ) clscol = Font.CR_GREEN;
- else if ( invlist[i] is 'PuzzleItem' ) clscol = Font.CR_LIGHTBLUE;
- Screen.DrawText(fnt,clscol,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i!=sel0)?Color(96,0,0,0):Color(0,0,0,0));
- yy += 16;
- if ( yy >= 370 )
- {
- xx += longest+24;
- yy = 23;
- cols++;
- if ( cols > maxcol ) break;
- }
- }
- if ( maxcol < totalcol )
- {
- // draw scrollbar
- int szr = totalcol-maxcol;
- xx = floor((ofs/22.)*(630./szr))+2.;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+373,"▬",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawTexture(WindowSeparatorH,false,origin.x,origin.y+377,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- else if ( (tabs[curtab] == TAB_TRADING) && sub && (sel0 != -1) )
- {
- if ( invlist.Size() <= 0 )
- {
- str = StringTable.Localize("$SWWM_NOINV");
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+(640-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- return;
- }
- xx = 9;
- yy = 23;
- int longest, len;
- int maxcol, totalcol, cols = 1;
- // first pass, calculate longest item name
- for ( int i=0; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) )
- str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
- else str = invlist[i].GetTag();
- len = fnt.StringWidth(str);
- if ( len > longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- int ofs = int(max(0,(ofs0/22)-(maxcol-1))*22);
- for ( int i=ofs; i 1) || (!(invlist[i] is 'PuzzleItem') && !(invlist[i] is 'Weapon') && (invlist[i].MaxAmount > 1)) )
- str = String.Format("%dx %s",invlist[i].Amount,invlist[i].GetTag());
- else str = invlist[i].GetTag();
- int clscol = Font.CR_WHITE;
- if ( invlist[i] is 'Weapon' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPGold'):Font.CR_GOLD;
- else if ( invlist[i] is 'MagAmmo' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPTan'):Font.CR_TAN;
- else if ( (invlist[i] is 'BackpackItem') || (invlist[i] is 'HammerspaceEmbiggener') ) clscol = Font.CR_DARKBROWN;
- else if ( invlist[i] is 'Ammo' ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPBrown'):Font.CR_BROWN;
- else if ( (invlist[i] is 'PowerupGiver') || (invlist[i] is 'AmmoFabricator') || invlist[i].bBIGPOWERUP ) clscol = SWWMUtility.IsVIPItem(invlist[i])?Font.FindFontColor('VIPPurple'):Font.CR_PURPLE;
- else if ( (invlist[i] is 'Health') || (invlist[i] is 'HealthPickup') || (invlist[i] is 'SWWMHealth') ) clscol = Font.CR_RED;
- else if ( (invlist[i] is 'Armor') || (invlist[i] is 'SWWMSpareArmor') ) clscol = Font.CR_GREEN;
- else if ( invlist[i] is 'PuzzleItem' ) clscol = Font.CR_LIGHTBLUE;
- Screen.DrawText(fnt,clscol,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i!=sel1)?Color(96,0,0,0):Color(0,0,0,0));
- yy += 16;
- if ( yy >= 370 )
- {
- xx += longest+24;
- yy = 23;
- cols++;
- if ( cols > maxcol ) break;
- }
- }
- if ( maxcol < totalcol )
- {
- // draw scrollbar
- int szr = totalcol-maxcol;
- xx = floor((ofs/22.)*(630./szr))+2.;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+373,"▬",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawTexture(WindowSeparatorH,false,origin.x,origin.y+377,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- else if ( tabs[curtab] == TAB_KEYS )
- {
- if ( invlist.Size() <= 0 )
- {
- str = StringTable.Localize("$SWWM_NOKEYS");
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+(640-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- return;
- }
- xx = 9;
- yy = 23;
- int longest = 0, len;
- int maxcol, totalcol, cols = 1;
- for ( int i=0; i longest ) longest = len;
- }
- maxcol = 622/(longest+24);
- totalcol = int(ceil(invlist.Size()/22.));
- int ofs = int(max(0,(ofs0/22)-(maxcol-1))*22);
- for ( int i=0; i= 370 )
- {
- xx += longest+24;
- yy = 23;
- cols++;
- if ( cols > maxcol ) break;
- }
- }
- if ( maxcol < totalcol )
- {
- // draw scrollbar
- int szr = totalcol-maxcol;
- xx = floor((ofs/22.)*(630./szr))+2.;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+373,"▬",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawTexture(WindowSeparatorH,false,origin.x,origin.y+377,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- else if ( tabs[curtab] == TAB_LIBRARY )
- {
- xx = 3;
- yy = 14;
- // draw the category
- int twidth = (language~=="jp")?200:120;
- str = StringTable.Localize(ltabnames[sel1]);
- Screen.DrawText(TewiFont,Font.CR_WHITE,origin.x+xx,origin.y+yy,"<",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawText(TewiFont,Font.CR_WHITE,origin.x+xx+twidth-6,origin.y+yy,">",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+xx+(twidth-fnt.StringWidth(str))/2,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- // draw "unread" indicators on sides
- int ltab = sel1-1;
- if ( ltab < 0 ) ltab = 2;
- int rtab = sel1+1;
- if ( rtab > 2 ) rtab = 0;
- bool lunread = false, runread = false;
- for ( int i=0; i 370 ) break;
- str = StringTable.Localize(lorelist[i].tag);
- int len = fnt.StringWidth(str);
- Screen.DrawText(fnt,(i==sel0)?Font.CR_FIRE:Font.CR_WHITE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- if ( !lorelist[i].read )
- Screen.DrawText(TewiFont,Font.CR_GOLD,origin.x+xx+len,origin.y+yy," ‼",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += 13;
- }
- xx += twidth+2;
- Screen.DrawTexture(WindowSeparator,false,origin.x+xx,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx += 3;
- // scrollbar
- if ( lorelist.Size() > 27 )
- {
- int szr = lorelist.Size()-27;
- yy = floor((ofs)*(353./szr))+17;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,"▮",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx += 5;
- Screen.DrawTexture(WindowSeparator,false,origin.x+xx,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx += 3;
- }
- xx += 4;
- // draw the entry text (if open)
- if ( !sub )
- {
- str = StringTable.Localize("$SWWM_LOREUNSEL");
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+xx+int((634-xx)-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- return;
- }
- str = StringTable.Localize(lorelist[sel0].text);
- BrokenLines l = fnt.BreakLines(str,int(635-xx));
- if ( l.Count() > 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,int(626-xx));
- }
- yy = 17;
- ofs = clamp(sel2,0,max(0,l.Count()-28));
- for ( int i=ofs; i 370 ) break;
- Screen.DrawText(fnt,Font.CR_WHITE,origin.x+xx,origin.y+yy,l.StringAt(i),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += 13;
- }
- // scrollbar
- if ( l.Count() > 28 )
- {
- Screen.DrawTexture(WindowSeparator,false,origin.x+631,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx = 634;
- int szr = l.Count()-28;
- yy = floor(ofs*(353./szr))+17;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,"▮",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- l.Destroy();
- }
- else if ( tabs[curtab] == TAB_STORE )
- {
- if ( storelist.Size() <= 0 )
- {
- str = StringTable.Localize(sub?"$SWWM_NOSTORESELL":"$SWWM_NOSTORE");
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+(640-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- return;
- }
- // draw all the stuff in the store
- xx = 9;
- yy = 23;
- int longest = 0, len;
- int maxcol, totalcol;
- for ( int i=0; i 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,def.GetTag());
- else str = def.GetTag();
- }
- else if ( (storeunits[i] > 1) || (storelist[i] is 'Ammo') ) str = String.Format("%dx %s",storeunits[i],def.GetTag());
- else str = def.GetTag();
- len = fnt.StringWidth(str);
- if ( len > longest ) longest = len;
- }
- maxcol = 622/(longest+96);
- totalcol = int(ceil(storelist.Size()/22.));
- int ofs = int(max(0,(ofs0/22)-(maxcol-1))*22);
- int cols = 1;
- for ( int i=ofs; i 1) || (storelist[i] is 'Ammo') ) str = String.Format("(%d/%d) %s",storeunits[i],amt,SWWMUtility.GetAmmoTagClass(storelist[i]));
- else str = def.GetTag();
- }
- else if ( (storeunits[i] > 1) || (storelist[i] is 'Ammo') ) str = String.Format("%dx %s",storeunits[i],SWWMUtility.GetAmmoTagClass(storelist[i]));
- else str = def.GetTag();
- int clscol = Font.CR_WHITE;
- if ( storelist[i] is 'Weapon' ) clscol = SWWMUtility.IsVIPItemClass(storelist[i])?Font.FindFontColor('VIPGold'):Font.CR_GOLD;
- else if ( storelist[i] is 'MagAmmo' ) clscol = SWWMUtility.IsVIPItemClass(storelist[i])?Font.FindFontColor('VIPTan'):Font.CR_TAN;
- else if ( (storelist[i] is 'BackpackItem') || (storelist[i] is 'HammerspaceEmbiggener') ) clscol = Font.CR_DARKBROWN;
- else if ( storelist[i] is 'Ammo' ) clscol = SWWMUtility.IsVIPItemClass(storelist[i])?Font.FindFontColor('VIPBrown'):Font.CR_BROWN;
- else if ( (storelist[i] is 'PowerupGiver') || (storelist[i] is 'AmmoFabricator') || def.bBIGPOWERUP ) clscol = SWWMUtility.IsVIPItemClass(storelist[i])?Font.FindFontColor('VIPPurple'):Font.CR_PURPLE;
- else if ( (storelist[i] is 'Health') || (storelist[i] is 'HealthPickup') || (storelist[i] is 'SWWMHealth') ) clscol = Font.CR_RED;
- else if ( (storelist[i] is 'Armor') || (storelist[i] is 'SWWMSpareArmor') ) clscol = Font.CR_GREEN;
- Screen.DrawText(fnt,clscol,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i!=sel0)?Color(96,0,0,0):Color(0,0,0,0));
- yy += 16;
- if ( yy >= 370 )
- {
- xx += longest+96;
- yy = 23;
- cols++;
- if ( cols > maxcol ) break;
- }
- }
- xx = 9;
- yy = 23;
- cols = 1;
- for ( int i=ofs; i 0) )
- {
- let am1 = GetDefaultByType(w.AmmoType1);
- if ( am1.Stamina > 0 ) price -= int(am1.Stamina*(1.+.75*(w.AmmoGive1-1)));
- }
- // candygun is a special case for secondary ammo
- if ( w.AmmoType2 && (w.AmmoGive2 > 0) && (storelist[i] is 'CandyGun') )
- {
- let am2 = GetDefaultByType(w.AmmoType2);
- if ( am2.Stamina > 0 ) price -= int(am2.Stamina*(1.+.75*(w.AmmoGive2-1)));
- }
- }
- // sell at half price
- if ( sub ) price /= 2;
- str = String.Format("¥%d",price);
- len = TewiFont.StringWidth(str);
- int clscol = Font.CR_FIRE;
- if ( sub ) clscol = Font.CR_GREEN;
- else if ( (price > muns1) && (muns2 <= 0) ) clscol = Font.CR_BLACK;
- Screen.DrawText(TewiFont,clscol,origin.x+xx+longest+80-len,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i!=sel0)?Color(96,0,0,0):Color(0,0,0,0));
- yy += 16;
- if ( yy >= 370 )
- {
- xx += longest+96;
- yy = 23;
- cols++;
- if ( cols > maxcol ) break;
- }
- }
- if ( maxcol < totalcol )
- {
- // draw scrollbar
- int szr = totalcol-maxcol;
- xx = floor((ofs/22.)*(630./szr))+2.;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+373,"▬",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawTexture(WindowSeparatorH,false,origin.x,origin.y+377,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- else if ( tabs[curtab] == TAB_TRADING )
- {
- if ( !sub )
- {
- if ( playerlist.Size() <= 0 )
- {
- str = StringTable.Localize("$SWWM_NOTRADE");
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+(640-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- return;
- }
- xx = 9;
- yy = 23;
- int longest = 0, len;
- int ofs = int(floor(max(0,sel0-44)/22.)*22);
- int cols = 1;
- for ( int i=ofs; i longest ) longest = len;
- Screen.DrawText(fnt,Font.CR_WHITE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i!=sel0)?Color(96,0,0,0):Color(0,0,0,0));
- yy += 16;
- if ( yy >= 370 )
- {
- xx += longest+24;
- yy = 23;
- longest = 0;
- cols++;
- if ( cols > 3 ) break;
- }
- }
- if ( playerlist.Size() > 65 )
- {
- // draw scrollbar
- int szr = (playerlist.Size()/22)-2;
- xx = floor((ofs/22)*(630./szr))+2;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+373,"▬",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- Screen.DrawTexture(WindowSeparatorH,false,origin.x,origin.y+377,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- else if ( sub )
- {
- if ( sel0 == -1 )
- {
- if ( tradelib.ent.Size() <= 0 )
- {
- str = StringTable.Localize("$SWWM_NOTRADEHIST");
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+(640-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- return;
- }
- xx = 6;
- yy = 17;
- int ofs = clamp(sel1,0,max(0,tradelib.ent.Size()-28));
- for ( int i=ofs; i= 370 ) break;
- let ent = tradelib.ent[tradelib.ent.Size()-(i+1)];
- int thour = (ent.timestamp/(3600*GameTicRate));
- int tmin = (ent.timestamp/(60*GameTicRate))%60;
- int tsec = (ent.timestamp/GameTicRate)%60;
- str = String.Format("\cu[\cc%02d\cu:\cc%02d\cu:\cc%02d\cu]\c- ",thour,tmin,tsec);
- str.AppendFormat("\cd%s %s\cd: \cj%dx \cf%s\c-",ent.type?StringTable.Localize("$SWWM_TRADEFROM"):StringTable.Localize("$SWWM_TRADETO"),ent.other,ent.amt,GetDefaultByType(ent.what).GetTag());
- Screen.DrawText(fnt,Font.CR_WHITE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += 13;
- }
- // scrollbar
- if ( tradelib.ent.Size() > 28 )
- {
- Screen.DrawTexture(WindowSeparator,false,origin.x+631,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx = 634;
- int szr = tradelib.ent.Size()-28;
- yy = floor(ofs*(353./szr))+17;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,"▮",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- }
- }
- else if ( tabs[curtab] == TAB_CHAT )
- {
- let bar = SWWMStatusBar(StatusBar);
- if ( !FullHistory || (FullHistory.msg.Size() <= 0) )
- {
- str = StringTable.Localize("$SWWM_NOCHAT");
- Screen.DrawText(fnt,Font.CR_FIRE,origin.x+(640-fnt.StringWidth(str))/2,origin.y+(400-fnt.GetHeight())/2,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- return;
- }
- int margin = TewiFont.StringWidth("[00:00:00] ");
- int ofs = FullHistory.msg.Size()-(1+sel0);
- xx = 3;
- yy = 379;
- for ( int i=ofs; i>=0; i-- )
- {
- int col = (FullHistory.msg[i].type==PRINT_TEAMCHAT)?msg4color:msg3color;
- int thour = (FullHistory.msg[i].tic/(3600*GameTicRate));
- int tmin = (FullHistory.msg[i].tic/(60*GameTicRate))%60;
- int tsec = (FullHistory.msg[i].tic/GameTicRate)%60;
- str = String.Format("\cu[\c-%02d\cu:\c-%02d\cu:\c-%02d\cu]\c- ",thour,tmin,tsec);
- BrokenLines l = fnt.BreakLines(FullHistory.msg[i].str,626-margin);
- double by = yy-13*l.Count();
- if ( by < 17 )
- {
- l.Destroy();
- break;
- }
- Screen.DrawText(TewiFont,Font.CR_WHITE,origin.x+xx,origin.y+by,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- for ( int j=0; j 1 )
- {
- Screen.DrawTexture(WindowSeparator,false,origin.x+631,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx = 634;
- int szr = FullHistory.msg.Size()-1;
- yy = floor((szr-sel0)*(353./szr))+17;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,"▮",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- }
- else if ( tabs[curtab] == TAB_SECRET )
- {
- if ( gameinfo.gametype&GAME_Hexen )
- {
- Screen.DrawTexture(Drawing[2],false,origin.x+20,origin.y+40,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- str = StringTable.Localize("$SWWM_KIRINPOEM");
- BrokenLines l = fnt.BreakLines(str,300);
- int mxlen = 0;
- for ( int i=0; i mxlen ) mxlen = l.StringWidth(i);
- xx = (i 28 )
- {
- l.Destroy();
- l = fnt.BreakLines(str,620);
- }
- xx = 6;
- yy = 17;
- int ofs = clamp(sel0,0,max(0,l.Count()-28));
- for ( int i=ofs; i= 370 ) break;
- Screen.DrawText(fnt,Font.CR_WHITE,origin.x+xx,origin.y+yy,l.StringAt(i),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- yy += 13;
- }
- // scrollbar
- if ( l.Count() > 28 )
- {
- Screen.DrawTexture(WindowSeparator,false,origin.x+631,origin.y+14,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- xx = 634;
- int szr = l.Count()-28;
- yy = floor(ofs*(353./szr))+17;
- Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+xx,origin.y+yy,"▮",DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
- }
- l.Destroy();
- }
+ xx = 637-smallfont.StringWidth(str);
+ Screen.DrawText(smallfont,Font.CR_WHITE,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
+ // draw tab contents
+ if ( (tabs.Size() <= 0) || (curtab == -1) || !tabs[curtab] ) return;
+ tabs[curtab].Drawer();
}
}
diff --git a/zscript/kbase/swwm_kbase_list.zsc b/zscript/kbase/swwm_kbase_list.zsc
new file mode 100644
index 000000000..2b2c1f172
--- /dev/null
+++ b/zscript/kbase/swwm_kbase_list.zsc
@@ -0,0 +1,107 @@
+// Classes for item list elements
+
+// basic list
+Class DemolitionistMenuList ui
+{
+ Array items;
+ int selected;
+ DemolitionistMenu master;
+
+ override void OnDestroy()
+ {
+ for ( int i=0; i mw ) mw = cw;
+ }
+ return mw;
+ }
+ // tick all items
+ void Ticker()
+ {
+ for ( int i=0; i clipbottom ) continue;
+ if ( rpos.x+rsiz.x < clipleft ) continue;
+ if ( rpos.x > clipright ) continue;
+ items[i].Drawer(pos,(i==selected),cliptop,clipbottom,clipleft,clipright);
+ }
+ // scrollbar drawing is handled by the tab, as the list itself is entirely unaware of its frame dimensions
+ }
+}
+
+// basic list item
+Class DemolitionistMenuListItem ui
+{
+ DemolitionistMenu master;
+ String label;
+ int xpos, ypos;
+
+ DemolitionistMenuListItem Init( DemolitionistMenu master, String txt )
+ {
+ self.master = master;
+ label = (txt.Left(1)~=="$")?StringTable.Localize(txt):txt;
+ xpos = ypos = 0;
+ return self;
+ }
+
+ virtual int GetWidth()
+ {
+ return smallfont.StringWidth(label);
+ }
+
+ virtual int GetHeight()
+ {
+ return smallfont.GetHeight();
+ }
+
+ virtual Vector2 GetDrawBounds()
+ {
+ return (GetWidth(),GetHeight());
+ }
+
+ // checks if the mouse position is within bounds of the item
+ // (relative to item itself, not offset coords)
+ virtual bool CheckBounds( double x, double y )
+ {
+ if ( x < xpos ) return false;
+ if ( y < ypos ) return false;
+ if ( x > xpos+GetWidth() ) return false;
+ if ( y > ypos+GetHeight() ) return false;
+ return true;
+ }
+
+ virtual void Ticker()
+ {
+ // nothing in the base class
+ }
+
+ virtual void Drawer( Vector2 pos, bool selected, int cliptop, int clipbottom, int clipleft, int clipright )
+ {
+ Screen.DrawText(smallfont,selected?Font.CR_FIRE:Font.CR_WHITE,master.origin.x+pos.x,master.origin.y+pos.y,label,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ }
+}
diff --git a/zscript/kbase/swwm_kbase_priv.zsc b/zscript/kbase/swwm_kbase_priv.zsc
new file mode 100644
index 000000000..188567c0d
--- /dev/null
+++ b/zscript/kbase/swwm_kbase_priv.zsc
@@ -0,0 +1,232 @@
+// kbase private functions
+
+extend Class DemolitionistMenu
+{
+ // initialize the crime clock
+ private void SetClock()
+ {
+ // use mission log clock if available
+ let mlog = SWWMMissionLog.Get();
+ if ( mlog && mlog.clockset )
+ {
+ c_year = mlog.year;
+ c_month = mlog.month;
+ c_day = mlog.day;
+ c_hour = mlog.hour;
+ c_minute = mlog.minute;
+ c_tz = mlog.tz;
+ }
+ else if ( gameinfo.gametype&GAME_Heretic )
+ {
+ // April 10th 2171, 17:34 JST
+ // Epoch: 6351554040
+ c_year = 2171;
+ c_month = 3;
+ c_day = 9;
+ c_hour = 17;
+ c_minute = 34;
+ c_tz = "JST";
+ }
+ else if ( gameinfo.gametype&GAME_Hexen )
+ {
+ // May 25th 2171, 16:41 JST
+ // Epoch: 6355438860
+ c_year = 2171;
+ c_month = 4;
+ c_day = 24;
+ c_hour = 16;
+ c_minute = 41;
+ c_tz = "JST";
+ if ( SWWMUtility.IsDeathkings() )
+ {
+ // deathkings happen the day after
+ c_day = 25;
+ c_hour = 10;
+ c_minute = 28;
+ }
+ }
+ else if ( SWWMUtility.IsEviternity() )
+ {
+ // June 10th 2150, 20:09 +09
+ // (June 10th 2150, 20:09 JST)
+ // Epoch: 5694145740
+ c_year = 2150;
+ c_month = 5;
+ c_day = 9;
+ c_hour = 20;
+ c_minute = 9;
+ c_tz = "+09";
+ }
+ else // Doom
+ {
+ // June 6th 2148, 18:37 EDT
+ // (June 7th 2148, 07:37 JST)
+ // Epoch: 5630769420
+ c_year = 2148;
+ c_month = 5;
+ c_day = 5;
+ c_hour = 18;
+ c_minute = 37;
+ c_tz = "EDT";
+ if ( SWWMUtility.IsKnownMap() && (level.cluster == 11) )
+ {
+ // NRFTL just happens the next day after
+ c_day = 6;
+ c_hour = 15;
+ c_minute = 48;
+ }
+ }
+ clockstr = CrimeTime();
+ }
+
+ // please don't look at this
+ private String CrimeTime()
+ {
+ // we have to do things this way because dates in this mod go beyond 32-bit unix time
+ static const int days_in_month[] = {31,28,31,30,31,30,31,31,30,31,30,31};
+ bool leap_year;
+ int y = c_year, m = c_month, d = c_day, h = c_hour, mn = c_minute;
+ int addtime = level.totaltime/GameTicRate;
+ while ( addtime > 0 )
+ {
+ leap_year = (!(y%4) && ((y%100) || !(y%400)));
+ if ( addtime >= 86400 )
+ {
+ addtime -= 86400;
+ d++;
+ int md = days_in_month[m];
+ if ( leap_year && (m == 1) ) md++;
+ if ( d >= md )
+ {
+ d = 0;
+ m++;
+ if ( m > 11 )
+ {
+ m = 0;
+ y++;
+ }
+ }
+ }
+ else if ( addtime >= 3600 )
+ {
+ addtime -= 3600;
+ h++;
+ if ( h > 23 )
+ {
+ h = 0;
+ d++;
+ int md = days_in_month[m];
+ if ( leap_year && (m == 1) ) md++;
+ if ( d >= md )
+ {
+ d = 0;
+ m++;
+ if ( m > 11 )
+ {
+ m = 0;
+ y++;
+ }
+ }
+ }
+ }
+ else if ( addtime >= 60 )
+ {
+ addtime -= 60;
+ mn++;
+ if ( mn > 59 )
+ {
+ mn = 0;
+ h++;
+ if ( h > 23 )
+ {
+ h = 0;
+ d++;
+ int md = days_in_month[m];
+ if ( leap_year && (m == 1) ) md++;
+ if ( d >= md )
+ {
+ d = 0;
+ m++;
+ if ( m > 11 )
+ {
+ m = 0;
+ y++;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ // we finished counting
+ addtime = 0;
+ }
+ }
+ return String.Format("%04d-%02d-%02d %02d:%02d %s",y,m+1,d+1,h,mn,c_tz);
+ }
+
+ // ui->play transaction checks
+ private void CheckTransactions()
+ {
+ for ( int i=0; i)(hnd.checklist[j].used);
+ if ( w )
+ {
+ // play if actually switching
+ if ( hnd.checklist[j].result )
+ {
+ String snd = GetDefaultByType(w).UpSound;
+ MenuSound(snd);
+ }
+ }
+ else if ( (hnd.checklist[j].used is 'SWWMCollectible') || (hnd.checklist[j].used is 'SWWMKey') )
+ MenuSound("demolitionist/handsup");
+ else
+ {
+ String snd = GetDefaultByType(hnd.checklist[j].used).UseSound;
+ MenuSound(snd);
+ }
+ }
+ }
+ else
+ {
+ tmsg = StringTable.Localize("$SWWM_INVFAIL");
+ tmsgtic = gametic+70;
+ MenuSound("menu/noinvuse");
+ }
+ }
+ else if ( checklist[i].type == MenuTransaction.TT_ITEMDROP )
+ {
+ // check if drop succeeded
+ if ( !hnd.checklist[j].result )
+ {
+ tmsg = StringTable.Localize("$SWWM_INVNDROP");
+ tmsgtic = gametic+70;
+ MenuSound("menu/noinvuse");
+ }
+ }
+ EventHandler.SendNetworkEvent("swwmcleartransaction",checklist[i].uid,consoleplayer);
+ deleteme = true;
+ break;
+ }
+ if ( !deleteme ) continue;
+ checklist.Delete(i);
+ i--;
+ }
+ }
+}
diff --git a/zscript/kbase/swwm_kbase_tab.zsc b/zscript/kbase/swwm_kbase_tab.zsc
new file mode 100644
index 000000000..3a86fb91a
--- /dev/null
+++ b/zscript/kbase/swwm_kbase_tab.zsc
@@ -0,0 +1,57 @@
+// Classes for menu tabs
+
+Class DemolitionistMenuTab ui abstract
+{
+ DemolitionistMenu master;
+ String title;
+ bool bHidden; // tab does not display and can't be selected
+
+ // tab initialization
+ virtual DemolitionistMenuTab Init( DemolitionistMenu master )
+ {
+ self.master = master;
+ return self;
+ }
+
+ // called for menu input (direction keys, enter, back)
+ virtual void MenuInput( int key )
+ {
+ }
+
+ // called for mouse input (left/right click, mouse wheel up/down, mouse drag/release)
+ virtual void MouseInput( Vector2 pos, int btn )
+ {
+ }
+
+ // called after this tab is selected
+ virtual void OnSelect()
+ {
+ }
+
+ // called before another tab is selected
+ virtual void OnDeselect()
+ {
+ }
+
+ // called every tic while selected
+ virtual void Ticker()
+ {
+ }
+
+ // called every frame while selected
+ virtual void Drawer()
+ {
+ // placeholder (so don't call super)
+ String str = StringTable.Localize("$SWWM_COMINGSOON");
+ double xx = int(master.ws.x-smallfont.StringWidth(str))/2;
+ double yy = int(master.ws.y-smallfont.GetHeight())/2;
+ Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ }
+}
+
+// for add-ons
+Class DemolitionistMenuTabCustom : DemolitionistMenuTab abstract
+{
+ // wow it's literally nothing
+ // just subclass from this in your add-ons
+}
diff --git a/zscript/kbase/swwm_kbase_textbox.zsc b/zscript/kbase/swwm_kbase_textbox.zsc
new file mode 100644
index 000000000..d831367f2
--- /dev/null
+++ b/zscript/kbase/swwm_kbase_textbox.zsc
@@ -0,0 +1,123 @@
+// Class for text box element
+Class DemolitionistMenuTextBox ui
+{
+ DemolitionistMenu master;
+ String txt;
+ BrokenLines l;
+ TextureID img;
+ int ofs;
+ int x, w;
+ bool scrollbar;
+ double smofs;
+ int maxofs;
+
+ // textbox initialization
+ DemolitionistMenuTextBox Init( DemolitionistMenu master, String txt, int x = 0, int w = 0 )
+ {
+ self.master = master;
+ self.x = x;
+ if ( w == 0 ) self.w = 640-x;
+ else self.w = w;
+ if ( txt.Left(1) == "$" ) self.txt = StringTable.Localize(txt);
+ else self.txt = txt;
+ ofs = 0;
+ // break lines
+ l = smallfont.BreakLines(self.txt,self.w-12);
+ int h = l.Count()*13;
+ if ( h > (master.ws.y-34) )
+ {
+ l.Destroy();
+ l = smallfont.BreakLines(self.txt,self.w-20);
+ scrollbar = true;
+ maxofs = int((l.Count()*13)-(master.ws.y-34));
+ }
+ return self;
+ }
+ // allow changing contents without re-creating the class
+ void Reinit( String txt, int x = 0, int w = 0 )
+ {
+ String oldtxt = self.txt;
+ self.txt = txt;
+ self.x = x;
+ int oldw = self.w;
+ if ( w == 0 ) self.w = 640-x;
+ else self.w = w;
+ // break lines again (if changed)
+ if ( (self.w == oldw) && (self.txt == oldtxt) ) return;
+ if ( l ) l.Destroy();
+ l = smallfont.BreakLines(self.txt,self.w-12);
+ int h = l.Count()*13;
+ scrollbar = false;
+ maxofs = 0;
+ if ( h > (master.ws.y-34) )
+ {
+ l.Destroy();
+ l = smallfont.BreakLines(self.txt,self.w-20);
+ scrollbar = true;
+ maxofs = int((l.Count()*13)-(master.ws.y-34));
+ }
+ // restrict scroll (if changed)
+ if ( ofs > maxofs ) smofs = ofs = maxofs;
+ // reset scroll if text is different
+ if ( self.txt != oldtxt ) smofs = ofs = 0;
+ }
+ override void OnDestroy()
+ {
+ if ( l ) l.Destroy();
+ }
+
+ // called when sending a scroll input
+ // returns true if the position actually changed
+ // speed: how many pixels to move (either back or forward)
+ bool Scroll( int speed )
+ {
+ int oldofs = ofs;
+ ofs = clamp(ofs+speed,0,maxofs);
+ return (ofs != oldofs);
+ }
+
+ // called when clicking on our scrollbar
+ // returns true if the position actually changed
+ // y: relative click position
+ bool SetOffset( double y )
+ {
+ int oldofs = ofs;
+ ofs = clamp(int(round((y-20.5)/((master.ws.y-41.)/maxofs))),0,maxofs);
+ return (ofs != oldofs);
+ }
+
+ void Ticker()
+ {
+ // update smooth scroll
+ smofs = (smofs*.6)+(ofs*.4);
+ if ( abs(smofs-ofs) < (1./master.hs) ) smofs = ofs;
+ }
+
+ void Drawer( bool dark = false )
+ {
+ double xx = x+6;
+ double yy = 17-smofs;
+ int miny = int((master.origin.y+17)*master.hs);
+ int maxy = int((master.origin.y+(master.ws.y-17))*master.hs);
+ // draw image if defined and visible
+ if ( img.IsValid() )
+ {
+ Vector2 imgsz = TexMan.GetScaledSize(img);
+ if ( (yy+imgsz.y >= 17) && (yy < master.ws.y) )
+ Screen.DrawTexture(img,false,master.origin.x+xx,master.origin.y+yy,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,miny,DTA_ClipBottom,maxy);
+ }
+ for ( int i=0; i= master.ws.y-19 ) continue;
+ Screen.DrawText(smallfont,Font.CR_WHITE,master.origin.x+xx,master.origin.y+yy,l.StringAt(i),DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,dark?Color(96,0,0,0):Color(0,0,0,0),DTA_ClipTop,miny,DTA_ClipBottom,maxy);
+ }
+ if ( !scrollbar ) return;
+ xx = x+(w-8);
+ master.DrawVSeparator(xx,14,master.ws.y-28);
+ xx += 2;
+ yy = floor(smofs*((master.ws.y-39)/maxofs))+14;
+ Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,"▮",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ }
+}
diff --git a/zscript/kbase/swwm_kbasetab_chat.zsc b/zscript/kbase/swwm_kbasetab_chat.zsc
new file mode 100644
index 000000000..a34b7a4bf
--- /dev/null
+++ b/zscript/kbase/swwm_kbasetab_chat.zsc
@@ -0,0 +1,223 @@
+// all them messages
+
+Class DemolitionistChatTab : DemolitionistMenuTab
+{
+ DemolitionistMenuList msglist;
+ int ofs, maxofs;
+ double smofs;
+ bool drag;
+ SWWMFullHistory hist;
+
+ override DemolitionistMenuTab Init( DemolitionistMenu master )
+ {
+ title = StringTable.Localize("$SWWM_CHATTAB");
+ hist = SWWMFullHistory.Get();
+ return Super.Init(master);
+ }
+
+ override void OnDestroy()
+ {
+ Super.OnDestroy();
+ if ( msglist ) msglist.Destroy();
+ }
+
+ override void OnSelect()
+ {
+ smofs = ofs;
+ }
+ override void OnDeselect()
+ {
+ smofs = ofs;
+ }
+
+ override void Ticker()
+ {
+ if ( !hist ) return;
+ int ypos = 0;
+ bool recenter = true;
+ if ( !msglist )
+ {
+ msglist = new("DemolitionistMenuList");
+ msglist.master = master;
+ msglist.selected = -1;
+ msglist.items.Resize(hist.msg.Size());
+ for ( int i=0; i (master.ws.x-8) )
+ {
+ SetOffset(pos.y);
+ master.MenuSound("menu/demoscroll");
+ drag = true;
+ }
+ break;
+ case MB_WHEELUP:
+ if ( Scroll(-8) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MB_WHEELDOWN:
+ if ( Scroll(8) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MB_DRAG:
+ if ( drag ) SetOffset(pos.y);
+ break;
+ case MB_RELEASE:
+ drag = false;
+ break;
+ }
+ }
+ override void Drawer()
+ {
+ if ( !hist || (msglist.items.Size() <= 0) )
+ {
+ String str = StringTable.Localize("$SWWM_NOCHAT");
+ double xx = int(master.ws.x-smallfont.StringWidth(str))/2;
+ double yy = int(master.ws.y-smallfont.GetHeight())/2;
+ Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ return;
+ }
+ double xx = 3;
+ double yy = 23;
+ int cliptop = int((master.origin.y+23)*master.hs);
+ int clipbottom = int((master.origin.y+master.ws.y-23)*master.hs);
+ int clipleft = int((master.origin.x+3)*master.hs);
+ int clipright = int((master.origin.x+master.ws.x-9)*master.hs);
+ msglist.Drawer((xx,yy-smofs),cliptop,clipbottom,clipleft,clipright);
+ if ( maxofs <= 0 ) return;
+ xx = master.ws.x-8;
+ master.DrawVSeparator(xx,14,master.ws.y-28);
+ xx += 2;
+ yy = floor(smofs*((master.ws.y-39)/maxofs))+14;
+ Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,"▮",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ }
+}
+
+// chat message item
+Class DemolitionistMenuChatItem : DemolitionistMenuListItem
+{
+ BrokenLines l;
+ int margin;
+ String tstamp;
+
+ DemolitionistMenuChatItem Init( DemolitionistMenu master, MsgLine m )
+ {
+ Super.Init(master,"");
+ if ( m.type == -1 )
+ {
+ // map change marker
+ label = String.Format("\cx[\c-%s\cx]\c-",m.str);
+ return self;
+ }
+ // actually use crimetime for the timestamps, for immersion
+ int rtime = (m.tic/GameTicRate)+(master.c_minute*60)+(master.c_hour*3600);
+ int thour = (rtime/3600)%24;
+ int tmin = (rtime/60)%60;
+ int tsec = rtime%60;
+ tstamp = String.Format("\cm[\c-%02d\cm:\c-%02d\cm:\c-%02d\cm]\c- ",thour,tmin,tsec);
+ margin = smallfont.StringWidth(tstamp);
+ l = smallfont.BreakLines(m.str,int(master.ws.x-14)-margin);
+ return self;
+ }
+
+ override void OnDestroy()
+ {
+ Super.OnDestroy();
+ if ( l ) l.Destroy();
+ }
+
+ override int GetWidth()
+ {
+ return int(master.ws.x-14);
+ }
+
+ override int GetHeight()
+ {
+ if ( l ) return l.Count()*14;
+ return 14;
+ }
+
+ override void Drawer( Vector2 pos, bool selected, int cliptop, int clipbottom, int clipleft, int clipright )
+ {
+ if ( !l )
+ {
+ // we'll assume this is a level change label
+ double xx = int((master.ws.x-14)-smallfont.StringWidth(label))/2;
+ Screen.DrawText(smallfont,Font.CR_GOLD,master.origin.x+pos.x+xx,master.origin.y+pos.y,label,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ return;
+ }
+ Screen.DrawText(smallfont,Font.CR_DARKGRAY,master.origin.x+pos.x,master.origin.y+pos.y,tstamp,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ for ( int i=0; i (mtext.x+(mtext.w-8))) )
+ {
+ mtext.SetOffset(pos.y);
+ master.MenuSound("menu/demoscroll");
+ drag = true;
+ break;
+ }
+ break;
+ case MB_WHEELUP:
+ if ( mtext.Scroll(-8) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MB_WHEELDOWN:
+ if ( mtext.Scroll(8) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MB_DRAG:
+ if ( drag ) mtext.SetOffset(pos.y);
+ break;
+ case MB_RELEASE:
+ drag = false;
+ break;
+ }
+ }
+ // stop smooth scrolling for current textbox
+ override void OnSelect()
+ {
+ bHidden = false;
+ mtext.smofs = mtext.ofs;
+ }
+ override void OnDeselect()
+ {
+ bHidden = true;
+ mtext.smofs = mtext.ofs;
+ }
+ // very simple
+ override void Ticker()
+ {
+ mtext.Ticker();
+ }
+ override void Drawer()
+ {
+ mtext.Drawer();
+ }
+}
diff --git a/zscript/kbase/swwm_kbasetab_inventory.zsc b/zscript/kbase/swwm_kbasetab_inventory.zsc
new file mode 100644
index 000000000..b91a91f31
--- /dev/null
+++ b/zscript/kbase/swwm_kbasetab_inventory.zsc
@@ -0,0 +1,550 @@
+// inventory listing tab
+
+Class DemolitionistInventoryTab : DemolitionistMenuTab
+{
+ DemolitionistMenuList invlist;
+ int ofs, maxofs;
+ double smofs;
+ bool drag;
+
+ private bool CmpInventory( Inventory a, Inventory b )
+ {
+ int ta = 0, tb = 0;
+ if ( a is 'Weapon' ) ta = 2;
+ 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 '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;
+ else if ( b is 'PuzzleItem' ) tb = 1;
+ if ( ta == tb )
+ {
+ if ( a is 'Weapon' )
+ {
+ bool dummy;
+ int slota, slotb;
+ [dummy, slota] = players[consoleplayer].weapons.LocateWeapon(Weapon(a).GetClass());
+ if ( slota == 0 ) slota = 10;
+ [dummy, slotb] = players[consoleplayer].weapons.LocateWeapon(Weapon(b).GetClass());
+ if ( slotb == 0 ) slotb = 10;
+ if ( slota == slotb )
+ return (Weapon(a).SlotPriority <= Weapon(b).SlotPriority);
+ return slota > slotb;
+ }
+ else if ( a is 'Ammo' )
+ {
+ Class usesa, usesb;
+ for ( int i=0; i)(AllActorClasses[i]);
+ if ( !w ) continue;
+ let def = GetDefaultByType(w);
+ if ( w is 'SWWMWeapon' )
+ {
+ if ( SWWMWeapon(def).UsesAmmo(Ammo(a).GetClass()) )
+ usesa = w;
+ if ( SWWMWeapon(def).UsesAmmo(Ammo(b).GetClass()) )
+ usesb = w;
+ }
+ else
+ {
+ if ( (def.AmmoType1 == Ammo(a).GetClass()) || (def.AmmoType2 == Ammo(a).GetClass()) )
+ usesa = w;
+ if ( (def.AmmoType1 == Ammo(b).GetClass()) || (def.AmmoType2 == Ammo(b).GetClass()) )
+ usesb = w;
+ }
+ if ( usesa && usesb )
+ break;
+ }
+ if ( usesa && usesb )
+ {
+ bool dummy;
+ int slota, slotb;
+ [dummy, slota] = players[consoleplayer].weapons.LocateWeapon(usesa);
+ if ( slota == 0 ) slota = 10;
+ [dummy, slotb] = players[consoleplayer].weapons.LocateWeapon(usesb);
+ if ( slotb == 0 ) slotb = 10;
+ if ( slota == slotb )
+ {
+ // sort by unit value
+ int vala = abs(a.default.Stamina);
+ int valb = abs(b.default.Stamina);
+ if ( vala == valb )
+ {
+ // sort alphabetically
+ return a.GetTag() > b.GetTag();
+ }
+ return vala > valb;
+ }
+ return slota > slotb;
+ }
+ }
+ else if ( a is 'MagAmmo' )
+ {
+ // oh boy this one gets complicated
+ Class pamoa, pamob;
+ pamoa = MagAmmo(a).ParentAmmo;
+ pamob = MagAmmo(b).ParentAmmo;
+ Class usesa, usesb;
+ for ( int i=0; i)(AllActorClasses[i]);
+ if ( !w ) continue;
+ let def = GetDefaultByType(w);
+ if ( w is 'SWWMWeapon' )
+ {
+ if ( SWWMWeapon(def).UsesAmmo(pamoa) )
+ usesa = w;
+ if ( SWWMWeapon(def).UsesAmmo(pamob) )
+ usesb = w;
+ }
+ else
+ {
+ if ( (def.AmmoType1 == pamoa) || (def.AmmoType2 == pamoa) )
+ usesa = w;
+ if ( (def.AmmoType1 == pamob) || (def.AmmoType2 == pamob) )
+ usesb = w;
+ }
+ if ( usesa && usesb )
+ break;
+ }
+ if ( usesa && usesb )
+ {
+ bool dummy;
+ int slota, slotb;
+ [dummy, slota] = players[consoleplayer].weapons.LocateWeapon(usesa);
+ if ( slota == 0 ) slota = 10;
+ [dummy, slotb] = players[consoleplayer].weapons.LocateWeapon(usesb);
+ if ( slotb == 0 ) slotb = 10;
+ if ( slota == slotb )
+ {
+ // sort by unit value
+ int vala = GetDefaultByType(pamoa).Stamina;
+ int valb = GetDefaultByType(pamob).Stamina;
+ if ( vala == valb )
+ {
+ // sort alphabetically
+ return a.GetTag() > b.GetTag();
+ }
+ return vala > valb;
+ }
+ return slota > slotb;
+ }
+ }
+ else
+ {
+ // sort by unit value
+ int vala = abs(a.default.Stamina);
+ int valb = abs(b.default.Stamina);
+ if ( vala == valb )
+ {
+ // sort alphabetically
+ return a.GetTag() > b.GetTag();
+ }
+ return vala > valb;
+ }
+ }
+ return ta > tb;
+ }
+ private int partition_inventory( Array a, int l, int h )
+ {
+ DemolitionistMenuListItem pv = a[h];
+ int i = (l-1);
+ for ( int j=l; j<=(h-1); j++ )
+ {
+ if ( CmpInventory(DemolitionistMenuInvItem(pv).inv,DemolitionistMenuInvItem(a[j]).inv) )
+ {
+ i++;
+ DemolitionistMenuListItem tmp = a[j];
+ a[j] = a[i];
+ a[i] = tmp;
+ }
+ }
+ DemolitionistMenuListItem tmp = a[h];
+ a[h] = a[i+1];
+ a[i+1] = tmp;
+ return i+1;
+ }
+ private void qsort_inventory( Array a, int l, int h )
+ {
+ if ( l >= h ) return;
+ int p = partition_inventory(a,l,h);
+ qsort_inventory(a,l,p-1);
+ qsort_inventory(a,p+1,h);
+ }
+
+ override DemolitionistMenuTab Init( DemolitionistMenu master )
+ {
+ title = StringTable.Localize("$SWWM_INVTAB");
+ return Super.Init(master);
+ }
+
+ override void OnDestroy()
+ {
+ Super.OnDestroy();
+ if ( invlist ) invlist.Destroy();
+ }
+
+ override void OnSelect()
+ {
+ smofs = ofs;
+ }
+ override void OnDeselect()
+ {
+ smofs = ofs;
+ }
+
+ private bool FilterInventory( Inventory inv )
+ {
+ if ( !inv || (inv.Owner != players[consoleplayer].mo) ) return true;
+ if ( (inv.Amount <= 0) || !inv.SpawnState.ValidateSpriteFrame() || (inv is 'Key') || (inv is 'BasicArmor') || (inv is 'HexenArmor') || (inv is 'Powerup') || (inv is 'SWWMArmor') || (!(inv is 'Ammo') && !(inv is 'Weapon') && !inv.bINVBAR) && !(inv is 'HammerspaceEmbiggener') && !(inv is 'SWWMCollectible') && !(inv is 'MagAmmo') || (inv is 'SWWMCollectible') ) return true;
+ // no hidden weapons
+ if ( (inv is 'SWWMWeapon') && SWWMWeapon(inv).bHIDEINMENU ) return true;
+ return false;
+ }
+
+ override void Ticker()
+ {
+ bool mustsort = false;
+ bool skipsel = false;
+ if ( !invlist )
+ {
+ mustsort = true;
+ skipsel = true;
+ // initialize
+ invlist = new("DemolitionistMenuList");
+ invlist.master = master;
+ invlist.selected = 0;
+ for ( Inventory i=players[consoleplayer].mo.inv; i; i=i.inv )
+ {
+ if ( FilterInventory(i) ) continue;
+ // make sure we sort alphabetically on first insert
+ String tag = i.GetTag();
+ bool greater = false;
+ for ( int j=0; j tag2 ) continue;
+ greater = true;
+ invlist.items.Insert(j,new("DemolitionistMenuInvItem").Init(master,i));
+ break;
+ }
+ if ( greater ) continue;
+ invlist.items.Push(new("DemolitionistMenuInvItem").Init(master,i));
+ }
+ }
+ else
+ {
+ // check if current entries must be deleted
+ for ( int i=0; i i ) invlist.selected = max(0,invlist.selected-1);
+ i--;
+ }
+ // check if new entries must be added
+ for ( Inventory i=players[consoleplayer].mo.inv; i; i=i.inv )
+ {
+ if ( FilterInventory(i) ) continue;
+ // skip if it's already there
+ bool skipme = false;
+ for ( int j=0; j tag2 ) continue;
+ greater = true;
+ invlist.items.Insert(j,new("DemolitionistMenuInvItem").Init(master,i));
+ mustsort = true;
+ break;
+ }
+ if ( greater ) continue;
+ invlist.items.Push(new("DemolitionistMenuInvItem").Init(master,i));
+ mustsort = true;
+ }
+ }
+ // don't do anything if empty
+ if ( invlist.items.Size() <= 0 ) return;
+ // sort inventory
+ if ( mustsort )
+ {
+ DemolitionistMenuListItem csel = invlist.items[invlist.selected];
+ qsort_inventory(invlist.items,0,invlist.items.Size()-1);
+ let idx = invlist.items.Find(csel);
+ if ( !skipsel && (idx != invlist.items.Size()) && (idx != invlist.selected) )
+ invlist.selected = idx;
+ }
+ // rearrange all item positions
+ maxofs = 0;
+ int maxw = invlist.GetWidth();
+ int xx = 0;
+ int yy = 0;
+ for ( int i=0; i= (master.ws.y-48) )
+ {
+ xx += maxw;
+ yy = 0;
+ }
+ }
+ maxofs = max(0,maxofs-int(master.ws.x-18));
+ if ( ofs > maxofs ) smofs = ofs = maxofs;
+ // update smooth scroll
+ smofs = (smofs*.6)+(ofs*.4);
+ if ( abs(smofs-ofs) < (1./master.hs) ) smofs = ofs;
+ // tick the list
+ invlist.Ticker();
+ }
+
+ // called when sending a scroll input
+ // returns true if the position actually changed
+ // speed: how many pixels to move (either back or forward)
+ bool Scroll( int speed )
+ {
+ if ( maxofs <= 0 ) return false;
+ int oldofs = ofs;
+ ofs = clamp(ofs+speed,0,maxofs);
+ return (ofs != oldofs);
+ }
+ // called when clicking on our scrollbar
+ // returns true if the position actually changed
+ // x: relative click position
+ bool SetOffset( double x )
+ {
+ if ( maxofs <= 0 ) return false;
+ int oldofs = ofs;
+ ofs = clamp(int(round((x-5.)/((master.ws.x-10.)/maxofs))),0,maxofs);
+ return (ofs != oldofs);
+ }
+ // called when keyboard scrolling
+ void KBScroll()
+ {
+ if ( maxofs <= 0 ) return;
+ int minx = (invlist.items[invlist.selected].xpos+invlist.items[invlist.selected].GetWidth())-int(master.ws.x-18);
+ int maxx = invlist.items[invlist.selected].xpos;
+ if ( ofs < minx ) ofs = clamp(minx,0,maxofs);
+ else if ( ofs > maxx ) ofs = clamp(maxx,0,maxofs);
+ }
+
+ override void MenuInput( int key )
+ {
+ if ( !invlist || (invlist.items.Size() <= 0) ) return;
+ switch ( key )
+ {
+ case MK_LEFT:
+ int prev = max(0,invlist.selected-22);
+ if ( prev == invlist.selected ) break;
+ invlist.selected = prev;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ break;
+ case MK_RIGHT:
+ int next = min(invlist.items.Size()-1,invlist.selected+22);
+ if ( next == invlist.selected ) break;
+ invlist.selected = next;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ break;
+ case MK_DOWN:
+ if ( invlist.selected < invlist.items.Size()-1 )
+ {
+ invlist.selected++;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ }
+ break;
+ case MK_UP:
+ if ( invlist.selected > 0 )
+ {
+ invlist.selected--;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ }
+ break;
+ case MK_ENTER:
+ if ( invlist.selected >= invlist.items.Size() ) break;
+ DemolitionistMenuInvItem(invlist.items[invlist.selected]).UseItem();
+ break;
+ case MK_BACK:
+ if ( invlist.selected >= invlist.items.Size() ) break;
+ DemolitionistMenuInvItem(invlist.items[invlist.selected]).DropItem();
+ break;
+ }
+ }
+ override void MouseInput( Vector2 pos, int btn )
+ {
+ if ( !invlist || (invlist.items.Size() <= 0) ) return;
+ switch ( btn )
+ {
+ case MB_LEFT:
+ // see if we're clicking the scrollbar (if it exists)
+ if ( pos.y > (master.ws.y-21) )
+ {
+ SetOffset(pos.x);
+ master.MenuSound("menu/demoscroll");
+ drag = true;
+ break;
+ }
+ // find which element we clicked
+ for ( int i=0; i 1) || (!(inv is 'PuzzleItem') && !(inv is 'Weapon') && (inv.MaxAmount > 1)) )
+ label = String.Format("%dx %s",inv.Amount,inv.GetTag());
+ else label = inv.GetTag();
+ if ( inv is 'SWWMCollectible' )
+ label.AppendFormat(" \cj(\cg¥\cf%d\cj)\c-",inv.default.Stamina);
+ }
+
+ override void Ticker()
+ {
+ UpdateLabel();
+ }
+
+ override void Drawer( Vector2 pos, bool selected, int cliptop, int clipbottom, int clipleft, int clipright )
+ {
+ // the simplest drawer
+ Screen.DrawText(smallfont,col,master.origin.x+pos.x,master.origin.y+pos.y,label,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright,DTA_ColorOverlay,selected?Color(0,0,0,0):Color(96,0,0,0));
+ }
+
+ void UseItem()
+ {
+ if ( !inv || (inv is 'Ammo') || (inv is 'MagAmmo') || (inv is 'HammerspaceEmbiggener') ) return;
+ let t = new("MenuTransaction");
+ t.uid = master.GenTUID();
+ t.type = MenuTransaction.TT_ITEMUSE;
+ t.result = false;
+ // don't check weapons, keys or collectibles, always assume check succeeded
+ if ( (inv is 'Weapon') || (inv is 'Key') || (inv is 'SWWMCollectible') ) t.result = true;
+ master.checklist.Push(t);
+ EventHandler.SendNetworkEvent(String.Format("swwmuseitem.%s",inv.GetClassName()),consoleplayer,t.uid);
+ }
+
+ void DropItem()
+ {
+ if ( !inv || (inv is 'Key') || (inv is 'SWWMCollectible') ) return;
+ let t = new("MenuTransaction");
+ t.uid = master.GenTUID();
+ t.type = MenuTransaction.TT_ITEMDROP;
+ t.result = false;
+ master.checklist.Push(t);
+ EventHandler.SendNetworkEvent(String.Format("swwmdropitem.%s",inv.GetClassName()),consoleplayer,t.uid);
+ }
+}
diff --git a/zscript/kbase/swwm_kbasetab_keychain.zsc b/zscript/kbase/swwm_kbasetab_keychain.zsc
new file mode 100644
index 000000000..5c851a1c2
--- /dev/null
+++ b/zscript/kbase/swwm_kbasetab_keychain.zsc
@@ -0,0 +1,319 @@
+// the keychain
+
+Class DemolitionistKeychainTab : DemolitionistMenuTab
+{
+ DemolitionistMenuList invlist;
+ int ofs, maxofs;
+ double smofs;
+ bool drag;
+
+ private bool CmpCollectible( Inventory a, Inventory b )
+ {
+ int ta = 0, tb = 0;
+ if ( a is 'Key' ) ta = 1;
+ if ( b is 'Key' ) tb = 1;
+ if ( ta == tb )
+ {
+ if ( a is 'Key' )
+ {
+ // sort by "index"
+ int n = Key.GetKeyTypeCount();
+ int ida = -1, idb = -1;
+ for ( int i=0; i idb;
+ }
+ // collectible
+ if ( a.Stamina == b.Stamina )
+ {
+ // alphabetic
+ return a.GetTag() > b.GetTag();
+ }
+ // descending value
+ return a.default.Stamina < b.default.Stamina;
+ }
+ return ta > tb;
+ }
+ private int partition_collectible( Array a, int l, int h )
+ {
+ DemolitionistMenuListItem pv = a[h];
+ int i = (l-1);
+ for ( int j=l; j<=(h-1); j++ )
+ {
+ if ( CmpCollectible(DemolitionistMenuInvItem(pv).inv,DemolitionistMenuInvItem(a[j]).inv) )
+ {
+ i++;
+ DemolitionistMenuListItem tmp = a[j];
+ a[j] = a[i];
+ a[i] = tmp;
+ }
+ }
+ DemolitionistMenuListItem tmp = a[h];
+ a[h] = a[i+1];
+ a[i+1] = tmp;
+ return i+1;
+ }
+ private void qsort_collectible( Array a, int l, int h )
+ {
+ if ( l >= h ) return;
+ int p = partition_collectible(a,l,h);
+ qsort_collectible(a,l,p-1);
+ qsort_collectible(a,p+1,h);
+ }
+
+ override DemolitionistMenuTab Init( DemolitionistMenu master )
+ {
+ title = StringTable.Localize("$SWWM_KEYTAB");
+ bHidden = deathmatch;
+ return Super.Init(master);
+ }
+
+ override void OnDestroy()
+ {
+ Super.OnDestroy();
+ if ( invlist ) invlist.Destroy();
+ }
+
+ override void OnSelect()
+ {
+ smofs = ofs;
+ }
+ override void OnDeselect()
+ {
+ smofs = ofs;
+ }
+
+ private bool FilterInventory( Inventory inv )
+ {
+ if ( !inv || (inv.Owner != players[consoleplayer].mo) ) return true;
+ if ( !(inv is 'Key') && !(inv is 'SWWMCollectible') ) return true;
+ return false;
+ }
+
+ override void Ticker()
+ {
+ bool mustsort = false;
+ bool skipsel = false;
+ if ( !invlist )
+ {
+ mustsort = true;
+ skipsel = true;
+ // initialize
+ invlist = new("DemolitionistMenuList");
+ invlist.master = master;
+ invlist.selected = 0;
+ int j = 0;
+ for ( Inventory i=players[consoleplayer].mo.inv; i; i=i.inv )
+ {
+ if ( FilterInventory(i) ) continue;
+ invlist.items.Push(new("DemolitionistMenuInvItem").Init(master,i));
+ }
+ }
+ else
+ {
+ // check if current entries must be deleted
+ for ( int i=0; i i ) invlist.selected = max(0,invlist.selected-1);
+ i--;
+ }
+ // check if new entries must be added
+ for ( Inventory i=players[consoleplayer].mo.inv; i; i=i.inv )
+ {
+ if ( FilterInventory(i) ) continue;
+ // skip if it's already there
+ bool skipme = false;
+ for ( int j=0; j= (master.ws.y-48) )
+ {
+ xx += maxw;
+ yy = 0;
+ }
+ }
+ maxofs = max(0,maxofs-int(master.ws.x-18));
+ if ( ofs > maxofs ) smofs = ofs = maxofs;
+ // update smooth scroll
+ smofs = (smofs*.6)+(ofs*.4);
+ if ( abs(smofs-ofs) < (1./master.hs) ) smofs = ofs;
+ // tick the list
+ invlist.Ticker();
+ }
+
+ // called when sending a scroll input
+ // returns true if the position actually changed
+ // speed: how many pixels to move (either back or forward)
+ bool Scroll( int speed )
+ {
+ if ( maxofs <= 0 ) return false;
+ int oldofs = ofs;
+ ofs = clamp(ofs+speed,0,maxofs);
+ return (ofs != oldofs);
+ }
+ // called when clicking on our scrollbar
+ // returns true if the position actually changed
+ // x: relative click position
+ bool SetOffset( double x )
+ {
+ if ( maxofs <= 0 ) return false;
+ int oldofs = ofs;
+ ofs = clamp(int(round((x-5.)/((master.ws.x-10.)/maxofs))),0,maxofs);
+ return (ofs != oldofs);
+ }
+ // called when keyboard scrolling
+ void KBScroll()
+ {
+ if ( maxofs <= 0 ) return;
+ int minx = (invlist.items[invlist.selected].xpos+invlist.items[invlist.selected].GetWidth())-int(master.ws.x-18);
+ int maxx = invlist.items[invlist.selected].xpos;
+ if ( ofs < minx ) ofs = clamp(minx,0,maxofs);
+ else if ( ofs > maxx ) ofs = clamp(maxx,0,maxofs);
+ }
+
+ override void MenuInput( int key )
+ {
+ if ( !invlist || (invlist.items.Size() <= 0) ) return;
+ switch ( key )
+ {
+ case MK_LEFT:
+ int prev = max(0,invlist.selected-22);
+ if ( prev == invlist.selected ) break;
+ invlist.selected = prev;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ break;
+ case MK_RIGHT:
+ int next = min(invlist.items.Size()-1,invlist.selected+22);
+ if ( next == invlist.selected ) break;
+ invlist.selected = next;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ break;
+ case MK_DOWN:
+ if ( invlist.selected < invlist.items.Size()-1 )
+ {
+ invlist.selected++;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ }
+ break;
+ case MK_UP:
+ if ( invlist.selected > 0 )
+ {
+ invlist.selected--;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ }
+ break;
+ case MK_ENTER:
+ if ( invlist.selected >= invlist.items.Size() ) break;
+ DemolitionistMenuInvItem(invlist.items[invlist.selected]).UseItem();
+ break;
+ }
+ }
+ override void MouseInput( Vector2 pos, int btn )
+ {
+ if ( !invlist || (invlist.items.Size() <= 0) ) return;
+ switch ( btn )
+ {
+ case MB_LEFT:
+ // see if we're clicking the scrollbar (if it exists)
+ if ( pos.y > (master.ws.y-21) )
+ {
+ SetOffset(pos.x);
+ master.MenuSound("menu/demoscroll");
+ drag = true;
+ break;
+ }
+ // find which element we clicked
+ for ( int i=0; i a, int l, int h )
+ {
+ DemolitionistMenuListItem pv = a[h];
+ int i = (l-1);
+ for ( int j=l; j<=(h-1); j++ )
+ {
+ if ( StringTable.Localize(DemolitionistMenuLoreItem(pv).ent.tag) > StringTable.Localize(DemolitionistMenuLoreItem(a[j]).ent.tag) )
+ {
+ i++;
+ DemolitionistMenuListItem tmp = a[j];
+ a[j] = a[i];
+ a[i] = tmp;
+ }
+ }
+ DemolitionistMenuListItem tmp = a[h];
+ a[h] = a[i+1];
+ a[i+1] = tmp;
+ return i+1;
+ }
+ private void qsort_lore( Array a, int l, int h )
+ {
+ if ( l >= h ) return;
+ int p = partition_lore(a,l,h);
+ qsort_lore(a,l,p-1);
+ qsort_lore(a,p+1,h);
+ }
+
+ override DemolitionistMenuTab Init( DemolitionistMenu master )
+ {
+ title = StringTable.Localize("$SWWM_KBASETAB");
+ lore = SWWMLoreLibrary.Find(players[consoleplayer]);
+ section = 0;
+ lwidth = 0;
+ for ( int i=0; i<4; i++ )
+ {
+ sname[i] = StringTable.Localize("$SWWM_LORETAB"..i);
+ lwidth = max(lwidth,smallfont.StringWidth("<‼ "..sname[i].." ‼>")+6);
+ lists[i] = new("DemolitionistMenuList");
+ lists[i].master = master;
+ }
+ loresz = lore.ent.Size();
+ for ( int i=0; i loresz )
+ {
+ int olwidth = lwidth;
+ int olmaxofs = maxofs[section];
+ // append the new entries
+ for ( int i=loresz; i maxofs[i] ) smofs[i] = ofs[i] = maxofs[i];
+ for ( int j=0; j0)?8:0));
+ }
+ // update smooth scroll
+ smofs[section] = (smofs[section]*.6)+(ofs[section]*.4);
+ if ( abs(smofs[section]-ofs[section]) < (1./master.hs) ) smofs[section] = ofs[section];
+ // tick the current list
+ lists[section].Ticker();
+ // tick the text box
+ if ( ltext ) ltext.Ticker();
+ }
+ // called when sending a scroll input
+ // returns true if the position actually changed
+ // speed: how many pixels to move (either back or forward)
+ bool Scroll( int speed )
+ {
+ if ( maxofs[section] <= 0 ) return false;
+ int oldofs = ofs[section];
+ ofs[section] = clamp(ofs[section]+speed,0,maxofs[section]);
+ return (ofs[section] != oldofs);
+ }
+ // called when clicking on our scrollbar
+ // returns true if the position actually changed
+ // y: relative click position
+ bool SetOffset( double y )
+ {
+ if ( maxofs[section] <= 0 ) return false;
+ int oldofs = ofs[section];
+ ofs[section] = clamp(int(round((y-20.5)/((master.ws.y-41.)/maxofs[section]))),0,maxofs[section]);
+ return (ofs[section] != oldofs);
+ }
+ // called when keyboard scrolling
+ void KBScroll()
+ {
+ if ( maxofs[section] <= 0 ) return;
+ int miny = (lists[section].selected+1)*14-int(master.ws.y-50);
+ int maxy = lists[section].selected*14;
+ if ( ofs[section] < miny ) ofs[section] = clamp(miny,0,maxofs[section]);
+ else if ( ofs[section] > maxy ) ofs[section] = clamp(maxy,0,maxofs[section]);
+ }
+ override void MenuInput( int key )
+ {
+ switch ( key )
+ {
+ case MK_LEFT:
+ int prev = max(0,section-1);
+ while ( prev > 0 )
+ {
+ if ( lists[prev].items.Size() > 0 )
+ break;
+ prev--;
+ }
+ if ( prev == section ) break;
+ master.MenuSound("menu/demoscroll");
+ smofs[section] = ofs[section];
+ section = prev;
+ smofs[section] = ofs[section];
+ if ( clore && ltext )
+ ltext.Reinit(StringTable.Localize(clore.text),lwidth+((maxofs[section]>0)?8:0));
+ break;
+ case MK_RIGHT:
+ int next = min(3,section+1);
+ while ( next < 3 )
+ {
+ if ( lists[next].items.Size() > 0 )
+ break;
+ next++;
+ }
+ if ( next == section ) break;
+ master.MenuSound("menu/demoscroll");
+ smofs[section] = ofs[section];
+ section = next;
+ smofs[section] = ofs[section];
+ if ( clore && ltext )
+ ltext.Reinit(StringTable.Localize(clore.text),lwidth+((maxofs[section]>0)?8:0));
+ break;
+ case MK_DOWN:
+ if ( clore && ltext )
+ {
+ if ( ltext.Scroll(16) ) master.MenuSound("menu/demoscroll");
+ break;
+ }
+ if ( sel[section] < lists[section].items.Size()-1 )
+ {
+ lists[section].selected = ++sel[section];
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ }
+ break;
+ case MK_UP:
+ if ( clore && ltext )
+ {
+ if ( ltext.Scroll(-16) ) master.MenuSound("menu/demoscroll");
+ break;
+ }
+ if ( sel[section] > 0 )
+ {
+ lists[section].selected = --sel[section];
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ }
+ break;
+ case MK_ENTER:
+ if ( clore ) break;
+ if ( active ) active.bActive = false;
+ active = DemolitionistMenuLoreItem(lists[section].items[sel[section]]);
+ active.bActive = true;
+ clore = active.ent;
+ if ( !ltext ) ltext = new("DemolitionistMenuTextBox").Init(master,StringTable.Localize(clore.text),lwidth+((maxofs[section]>0)?8:0));
+ else ltext.Reinit(StringTable.Localize(clore.text),lwidth+((maxofs[section]>0)?8:0));
+ ltext.img = clore.img;
+ master.MenuSound("menu/demosel");
+ active.MarkRead();
+ break;
+ case MK_BACK:
+ if ( !clore ) break;
+ if ( active ) active.bActive = false;
+ clore = null;
+ master.MenuSound("menu/democlose");
+ break;
+ }
+ }
+ override void MouseInput( Vector2 pos, int btn )
+ {
+ // global events
+ switch ( btn )
+ {
+ case MB_DRAG:
+ if ( clore && ltext && drag[1] ) ltext.SetOffset(pos.y);
+ else if ( drag[0] ) SetOffset(pos.y);
+ break;
+ case MB_RELEASE:
+ drag[0] = drag[1] = false;
+ break;
+ }
+ // mouse on left side
+ if ( pos.x < (lwidth+((maxofs[section]>0)?8:0)) )
+ {
+ // see if we're clicking the scrollbar (if it exists)
+ if ( (btn == MB_LEFT) && (maxofs[section] > 0) && (pos.x >= lwidth) )
+ {
+ SetOffset(pos.y);
+ master.MenuSound("menu/demoscroll");
+ drag[0] = true;
+ return;
+ }
+ // mouse on the category sub-tab
+ if ( pos.y < 28 )
+ {
+ switch ( btn )
+ {
+ case MB_LEFT:
+ if ( pos.x < (lwidth/2) ) MenuInput(MK_LEFT);
+ else MenuInput(MK_RIGHT);
+ break;
+ case MB_WHEELUP:
+ MenuInput(MK_LEFT);
+ break;
+ case MB_WHEELDOWN:
+ MenuInput(MK_RIGHT);
+ break;
+ }
+ return;
+ }
+ switch ( btn )
+ {
+ case MB_LEFT:
+ // find which element we clicked
+ for ( int i=0; i 0 )
+ {
+ lists[section].selected = --sel[section];
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ }
+ break;
+ case MB_WHEELDOWN:
+ if ( sel[section] < lists[section].items.Size()-1 )
+ {
+ lists[section].selected = ++sel[section];
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ }
+ break;
+ }
+ return;
+ }
+ if ( !clore || !ltext ) return;
+ switch ( btn )
+ {
+ case MB_LEFT:
+ // see if we're clicking the scrollbar (if it exists)
+ if ( ltext.scrollbar && (pos.x > (master.ws.x-8)) )
+ {
+ ltext.SetOffset(pos.y);
+ master.MenuSound("menu/demoscroll");
+ drag[1] = true;
+ }
+ break;
+ case MB_WHEELUP:
+ if ( ltext.Scroll(-8) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MB_WHEELDOWN:
+ if ( ltext.Scroll(8) ) master.MenuSound("menu/demoscroll");
+ break;
+ }
+ }
+ override void Drawer()
+ {
+ double xx = 0;
+ double yy = 15;
+ String str = sname[section];
+ master.DrawVSeparator(lwidth,14,master.ws.y-28);
+ master.DrawHSeparator(0,28,lwidth);
+ Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+(lwidth-smallfont.StringWidth(str))/2,master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ bool hasprev = false;
+ bool hasunreadprev = false;
+ for ( int i=0; i",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ if ( hasunreadnext )
+ Screen.DrawText(smallfont,Font.CR_GOLD,master.origin.x+lwidth-15,master.origin.y+yy,"‼",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ xx = 3;
+ yy = 32;
+ int cliptop = int((master.origin.y+32)*master.hs);
+ int clipbottom = int((master.origin.y+master.ws.y-18)*master.hs);
+ int clipleft = int((master.origin.x+3)*master.hs);
+ int clipright = int((master.origin.x+lwidth-3)*master.hs);
+ lists[section].Drawer((xx,yy-smofs[section]),cliptop,clipbottom,clipleft,clipright);
+ if ( maxofs[section] > 0 )
+ {
+ xx = lwidth;
+ master.DrawVSeparator(xx+8,14,master.ws.y-28);
+ xx += 2;
+ yy = floor(smofs[section]*((master.ws.y-39)/maxofs[section]))+14;
+ Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,"▮",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ }
+ if ( clore && ltext ) ltext.Drawer();
+ else
+ {
+ str = StringTable.Localize("$SWWM_LOREUNSEL");
+ int lwx = lwidth+((maxofs[section]>0)?8:0);
+ xx = lwx+int((master.ws.x-lwx)-smallfont.StringWidth(str))/2;
+ yy = int(master.ws.y-smallfont.GetHeight())/2;
+ Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ }
+ }
+}
+
+// lore entry
+Class DemolitionistMenuLoreItem : DemolitionistMenuListItem
+{
+ SWWMLore ent;
+ bool bActive; // currently being read
+
+ DemolitionistMenuLoreItem Init( DemolitionistMenu master, SWWMLore e )
+ {
+ Super.Init(master,"");
+ ent = e;
+ label = StringTable.Localize(ent.tag);
+ return self;
+ }
+
+ override int GetWidth()
+ {
+ if ( !ent.read ) return smallfont.StringWidth("‼"..label);
+ return smallfont.StringWidth(label);
+ }
+
+ // marks this entry as read
+ void MarkRead()
+ {
+ if ( ent.read ) return;
+ EventHandler.SendNetworkEvent(String.Format("swwmmarkloreread.%s",ent.tag),consoleplayer);
+ }
+
+ override void Drawer( Vector2 pos, bool selected, int cliptop, int clipbottom, int clipleft, int clipright )
+ {
+ String str = label;
+ if ( !ent.read ) str = "\cf‼\c-"..label;
+ Screen.DrawText(smallfont,bActive?Font.CR_FIRE:Font.CR_WHITE,master.origin.x+pos.x,master.origin.y+pos.y,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright,DTA_ColorOverlay,selected?Color(0,0,0,0):Color(96,0,0,0));
+ }
+}
diff --git a/zscript/kbase/swwm_kbasetab_mission.zsc b/zscript/kbase/swwm_kbasetab_mission.zsc
new file mode 100644
index 000000000..982cf3683
--- /dev/null
+++ b/zscript/kbase/swwm_kbasetab_mission.zsc
@@ -0,0 +1,292 @@
+// mission briefing tab
+
+Class DemolitionistMissionTab : DemolitionistMenuTab
+{
+ Array mtext;
+ int sel;
+ bool drag;
+ SWWMMissionLog mlog;
+
+ override DemolitionistMenuTab Init( DemolitionistMenu master )
+ {
+ title = StringTable.Localize("$SWWM_MISSTAB");
+ bHidden = deathmatch;
+ sel = 0;
+ mlog = SWWMMissionLog.Get();
+ // simplified initialization if we have a dedicated mission log
+ // note: mission log can't exist without one entry, so no fallback checks needed
+ if ( mlog )
+ {
+ for ( int i=(mlog.entries.Size()-1); i>=0; i-- )
+ mtext.Push(new("DemolitionistMenuTextBox").Init(master,mlog.entries[i]));
+ return Super.Init(master);
+ }
+ // saves time
+ bool nrftl = false;
+ bool eviternity = false;
+ bool hexdd = false;
+ String missionstr;
+ let stats = SWWMStats.Find(players[consoleplayer]);
+ if ( (gameinfo.gametype&GAME_Doom) && SWWMUtility.IsKnownMap() )
+ {
+ int clus = level.cluster;
+ if ( clus == 11 ) nrftl = true;
+ eviternity = SWWMUtility.IsEviternity();
+ if ( eviternity )
+ {
+ // we have to do some heavy lifting here because episodes don't match clusters
+ if ( level.levelnum <= 5 ) clus = 1;
+ else if ( level.levelnum <= 10 ) clus = 2;
+ else if ( level.levelnum <= 15 ) clus = 3;
+ else if ( level.levelnum <= 20 ) clus = 4;
+ else if ( level.levelnum <= 25 ) clus = 5;
+ else if ( level.levelnum <= 30 ) clus = 6;
+ else if ( level.levelnum <= 31 ) clus = 7;
+ else if ( level.levelnum <= 32 ) clus = 8;
+ missionstr = String.Format("$SWWM_MISSION_EVITERNITY%d",clus);
+ }
+ // naive method to guess if this is sigil
+ else if ( (clus == 5) && (level.mapname.Left(2) == "E5") )
+ missionstr = String.Format("$SWWM_MISSION_SIGIL");
+ else missionstr = String.Format("$SWWM_MISSION_DOOM%d",clus);
+ int csiz = stats.clustervisit.Size();
+ if ( (csiz > 0) && stats.secretdone[csiz-1] )
+ {
+ String tmpstr = missionstr.."_SECRET";
+ if ( !(StringTable.Localize(tmpstr) ~== tmpstr.Mid(1)) )
+ missionstr = tmpstr;
+ }
+ // if we came from the doom 1 episodes, use the alt mission string for Doom 2
+ bool fromdoomone = false;
+ for ( int i=0; i= 5) && (stats.clustervisit[i] != 25) ) continue;
+ fromdoomone = true;
+ break;
+ }
+ if ( !eviternity && (clus == 5) && fromdoomone )
+ missionstr = "$SWWM_MISSION_DOOM5_FROMDOOM1";
+ if ( StringTable.Localize(missionstr) ~== missionstr.Mid(1) )
+ missionstr = "$SWWM_MISSION_NONE";
+ mtext.Push(new("DemolitionistMenuTextBox").Init(master,missionstr));
+ bool firstskip = false;
+ for ( int i=csiz-1; i>=0; i-- )
+ {
+ if ( (stats.clustervisit[i] == clus) && !firstskip )
+ continue;
+ firstskip = true;
+ String xstr = String.Format(eviternity?"$SWWM_MISSION_EVITERNITY%d":"$SWWM_MISSION_DOOM%d",stats.clustervisit[i]);
+ if ( !eviternity && (stats.clustervisit[i] == 5) && fromdoomone )
+ xstr = "$SWWM_MISSION_DOOM5_FROMDOOM1";
+ if ( stats.secretdone[i] )
+ {
+ String tmpstr = xstr.."_SECRET";
+ if ( !(StringTable.Localize(tmpstr) ~== tmpstr.Mid(1)) )
+ xstr = tmpstr;
+ }
+ if ( StringTable.Localize(xstr) ~== xstr.Mid(1) )
+ continue;
+ mtext.Push(new("DemolitionistMenuTextBox").Init(master,xstr));
+ }
+ }
+ else if ( (gameinfo.gametype&GAME_Heretic) && SWWMUtility.IsKnownMap() )
+ {
+ missionstr = String.Format("$SWWM_MISSION_HERETIC%d",level.cluster);
+ if ( StringTable.Localize(missionstr) ~== missionstr.Mid(1) )
+ missionstr = "$SWWM_MISSION_NONE";
+ mtext.Push(new("DemolitionistMenuTextBox").Init(master,missionstr));
+ int csiz = stats.clustervisit.Size();
+ bool firstskip = false;
+ for ( int i=csiz-1; i>=0; i-- )
+ {
+ if ( (stats.clustervisit[i] == level.cluster) && !firstskip )
+ continue;
+ firstskip = true;
+ String xstr = String.Format("$SWWM_MISSION_HERETIC%d",stats.clustervisit[i]);
+ if ( StringTable.Localize(xstr) ~== xstr.Mid(1) )
+ continue;
+ mtext.Push(new("DemolitionistMenuTextBox").Init(master,xstr));
+ }
+ }
+ else if ( (gameinfo.gametype&GAME_Hexen) && SWWMUtility.IsKnownMap() )
+ {
+ // detect deathkings
+ hexdd = SWWMUtility.IsDeathkings();
+ String gstr = hexdd?"HEXDD":"HEXEN";
+ missionstr = String.Format("$SWWM_MISSION_%s%d",gstr,level.cluster);
+ if ( StringTable.Localize(missionstr) ~== missionstr.Mid(1) )
+ missionstr = "$SWWM_MISSION_NONE";
+ mtext.Push(new("DemolitionistMenuTextBox").Init(master,missionstr));
+ int csiz = stats.clustervisit.Size();
+ bool firstskip = false;
+ for ( int i=csiz-1; i>=0; i-- )
+ {
+ if ( (stats.clustervisit[i] == level.cluster) && !firstskip )
+ continue;
+ firstskip = true;
+ String xstr = String.Format("$SWWM_MISSION_%s%d",gstr,stats.clustervisit[i]);
+ if ( StringTable.Localize(xstr) ~== xstr.Mid(1) )
+ continue;
+ mtext.Push(new("DemolitionistMenuTextBox").Init(master,xstr));
+ }
+ }
+ return Super.Init(master);
+ }
+ override void OnDestroy()
+ {
+ for ( int i=0; i 1 )
+ {
+ master.MenuSound("menu/demoscroll");
+ sel--;
+ if ( sel < 0 ) sel = mtext.Size()-1;
+ mtext[sel].smofs = mtext[sel].ofs = 0;
+ drag = false; // just in case
+ }
+ break;
+ case MK_RIGHT:
+ // cycle mission texts
+ if ( mtext.Size() > 1 )
+ {
+ master.MenuSound("menu/demoscroll");
+ sel++;
+ if ( sel >= mtext.Size() ) sel = 0;
+ mtext[sel].smofs = mtext[sel].ofs = 0;
+ drag = false; // just in case
+ }
+ break;
+ }
+ }
+
+ override void MouseInput( Vector2 pos, int btn )
+ {
+ if ( mtext.Size() == 0 ) return;
+ switch ( btn )
+ {
+ case MB_LEFT:
+ // see if we're clicking the scrollbar (if it exists)
+ if ( mtext[sel].scrollbar && (pos.x > (mtext[sel].x+(mtext[sel].w-8))) )
+ {
+ mtext[sel].SetOffset(pos.y);
+ master.MenuSound("menu/demoscroll");
+ drag = true;
+ break;
+ }
+ // cycle mission texts
+ if ( mtext.Size() > 1 )
+ {
+ master.MenuSound("menu/demoscroll");
+ sel--;
+ if ( sel < 0 ) sel = mtext.Size()-1;
+ mtext[sel].smofs = mtext[sel].ofs;
+ drag = false; // just in case
+ }
+ break;
+ case MB_RIGHT:
+ // cycle mission texts
+ if ( mtext.Size() > 1 )
+ {
+ master.MenuSound("menu/demoscroll");
+ sel++;
+ if ( sel >= mtext.Size() ) sel = 0;
+ mtext[sel].smofs = mtext[sel].ofs;
+ drag = false; // just in case
+ }
+ break;
+ case MB_WHEELUP:
+ if ( mtext[sel].Scroll(-8) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MB_WHEELDOWN:
+ if ( mtext[sel].Scroll(8) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MB_DRAG:
+ if ( drag ) mtext[sel].SetOffset(pos.y);
+ break;
+ case MB_RELEASE:
+ drag = false;
+ break;
+ }
+ }
+
+ // stop smooth scrolling for current textbox
+ override void OnSelect()
+ {
+ if ( mtext.Size() == 0 ) return;
+ mtext[sel].smofs = mtext[sel].ofs;
+ }
+ override void OnDeselect()
+ {
+ if ( mtext.Size() == 0 ) return;
+ mtext[sel].smofs = mtext[sel].ofs;
+ }
+
+ override void Ticker()
+ {
+ // dedicated mission log can update in real time, so append new entries to the start of the array when needed and push the selector forward
+ if ( mlog && (mlog.entries.Size() > mtext.Size()) )
+ {
+ bool newent = false;
+ if ( mtext.Size() == 0 )
+ {
+ for ( int i=(mlog.entries.Size()-1); i>=0; i-- )
+ mtext.Push(new("DemolitionistMenuTextBox").Init(master,mlog.entries[i]));
+ sel = 0;
+ newent = true;
+ }
+ else for ( int i=(mlog.entries.Size()-1); i>=mtext.Size(); i-- )
+ {
+ mtext.Insert(0,new("DemolitionistMenuTextBox").Init(master,mlog.entries[i]));
+ sel++;
+ newent = true;
+ }
+ // notification for mission log updated
+ if ( newent )
+ {
+ master.tmsg = StringTable.Localize("$SWWM_NEWMISSION");
+ master.tmsgtic = gametic+70;
+ }
+ }
+ // just tick the current textbox
+ if ( mtext.Size() == 0 ) return;
+ mtext[sel].Ticker();
+ }
+
+ override void Drawer()
+ {
+ if ( mtext.Size() > 0 ) mtext[sel].Drawer(!!sel);
+ else
+ {
+ String str = StringTable.Localize("$SWWM_MISSION_NONE");
+ double xx = int(master.ws.x-smallfont.StringWidth(str))/2;
+ double yy = int(master.ws.y-smallfont.GetHeight())/2;
+ Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ return;
+ }
+ if ( mtext.Size() <= 1 ) return;
+ double xx = master.ws.x-(mtext[sel].scrollbar?11:3);
+ double yy = master.ws.y-25;
+ String str = String.Format("%d \cf/\c- %d",sel+1,mtext.Size());
+ Screen.DrawText(smallfont2,Font.CR_FIRE,(master.origin.x+xx)-smallfont2.StringWidth(str),master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ }
+}
+
diff --git a/zscript/kbase/swwm_kbasetab_secret.zsc b/zscript/kbase/swwm_kbasetab_secret.zsc
new file mode 100644
index 000000000..a9d98970a
--- /dev/null
+++ b/zscript/kbase/swwm_kbasetab_secret.zsc
@@ -0,0 +1,149 @@
+// seeeeeeecret
+
+Class DemolitionistSecretTab : DemolitionistMenuTab
+{
+ TextureID img;
+ String sub;
+ BrokenLines l;
+ double smofs;
+ int ofs, maxofs;
+ bool drag;
+
+ override DemolitionistMenuTab Init( DemolitionistMenu master )
+ {
+ title = StringTable.Localize("$SWWM_SECRETTAB");
+ bHidden = true;
+ if ( gameinfo.gametype&GAME_Hexen )
+ {
+ img = TexMan.CheckForTexture("graphics/KBase/Drawing_Kirin.png",TexMan.Type_Any);
+ sub = StringTable.Localize("$SWWM_FROMKIRIN");
+ String str = StringTable.Localize("$SWWM_KIRINPOEM");
+ l = smallfont.BreakLines(str,600);
+ }
+ else if ( (gameinfo.gametype&GAME_Heretic) || SWWMUtility.IsEviternity() )
+ {
+ img = TexMan.CheckForTexture("graphics/KBase/Drawing_Ibuki.png",TexMan.Type_Any);
+ sub = StringTable.Localize("$SWWM_CUTIECLUB");
+ }
+ else
+ {
+ img = TexMan.CheckForTexture("graphics/KBase/Drawing_Saya.png",TexMan.Type_Any);
+ sub = StringTable.Localize("$SWWM_TODEMO");
+ }
+ maxofs = max(0,320-int(master.ws.y-40));
+ return Super.Init(master);
+ }
+
+ override void OnDestroy()
+ {
+ Super.OnDestroy();
+ if ( l ) l.Destroy();
+ }
+
+ override void OnSelect()
+ {
+ bHidden = false;
+ smofs = ofs;
+ }
+ override void OnDeselect()
+ {
+ bHidden = true;
+ smofs = ofs;
+ }
+
+ // called when sending a scroll input
+ // returns true if the position actually changed
+ // speed: how many pixels to move (either back or forward)
+ bool Scroll( int speed )
+ {
+ int oldofs = ofs;
+ ofs = clamp(ofs+speed,0,maxofs);
+ return (ofs != oldofs);
+ }
+
+ // called when clicking on our scrollbar
+ // returns true if the position actually changed
+ // y: relative click position
+ bool SetOffset( double y )
+ {
+ int oldofs = ofs;
+ ofs = clamp(int(round((y-20.5)/((master.ws.y-41.)/maxofs))),0,maxofs);
+ return (ofs != oldofs);
+ }
+
+ override void MenuInput( int key )
+ {
+ if ( maxofs <= 0 ) return;
+ switch ( key )
+ {
+ case MK_DOWN:
+ if ( Scroll(16) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MK_UP:
+ if ( Scroll(-16) ) master.MenuSound("menu/demoscroll");
+ break;
+ }
+ }
+ override void MouseInput( Vector2 pos, int btn )
+ {
+ if ( maxofs <= 0 ) return;
+ switch ( btn )
+ {
+ case MB_LEFT:
+ // see if we're clicking the scrollbar (if it exists)
+ if ( pos.x > (master.ws.x-8) )
+ {
+ SetOffset(pos.y);
+ master.MenuSound("menu/demoscroll");
+ drag = true;
+ }
+ break;
+ case MB_WHEELUP:
+ if ( Scroll(-8) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MB_WHEELDOWN:
+ if ( Scroll(8) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MB_DRAG:
+ if ( drag ) SetOffset(pos.y);
+ break;
+ case MB_RELEASE:
+ drag = false;
+ break;
+ }
+ }
+
+ override void Ticker()
+ {
+ // update smooth scroll
+ smofs = (smofs*.6)+(ofs*.4);
+ if ( abs(smofs-ofs) < (1./master.hs) ) smofs = ofs;
+ }
+
+ override void Drawer()
+ {
+ double xx = 20;
+ double yy;
+ if ( maxofs <= 0 ) yy = master.ws.y/2-160;
+ else yy = 20-smofs;
+ int miny = int((master.origin.y+20)*master.hs);
+ int maxy = int((master.origin.y+(master.ws.y-20))*master.hs);
+ Screen.DrawTexture(img,false,master.origin.x+xx,master.origin.y+yy,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,miny,DTA_ClipBottom,maxy);
+ int mxlen = 0;
+ if ( l ) for ( int i=0; i mxlen ) mxlen = l.StringWidth(i);
+ xx = (i tagb;
+ }
+ return a.kills < b.kills;
+ }
+
+ private int partition_mstats( Array a, int l, int h )
+ {
+ DemolitionistMenuListItem pv = a[h];
+ int i = (l-1);
+ for ( int j=l; j<=(h-1); j++ )
+ {
+ if ( CmpMonsterKill(DemolitionistMenuKillItem(pv).s,DemolitionistMenuKillItem(a[j]).s) )
+ {
+ i++;
+ DemolitionistMenuListItem tmp = a[j];
+ a[j] = a[i];
+ a[i] = tmp;
+ }
+ }
+ DemolitionistMenuListItem tmp = a[h];
+ a[h] = a[i+1];
+ a[i+1] = tmp;
+ return i+1;
+ }
+ private void qsort_mstats( Array a, int l, int h )
+ {
+ if ( l >= h ) return;
+ int p = partition_mstats(a,l,h);
+ qsort_mstats(a,l,p-1);
+ qsort_mstats(a,p+1,h);
+ }
+
+ private bool CmpAchievement( SWWMAchievementInfo a, SWWMAchievementInfo b )
+ {
+ bool adone = !!(a.state), bdone = !!(b.state);
+ double afactor = adone?1.:0., bfactor = bdone?1.:0.;
+ if ( a.maxval )
+ {
+ int cur = 0;
+ if ( a.bitfield )
+ {
+ for ( int i=0; i b.baseindex;
+ if ( !adone && !bdone )
+ {
+ // progress sort?
+ if ( afactor != bfactor )
+ return afactor < bfactor;
+ // sort by base index
+ return a.baseindex > b.baseindex;
+ }
+ // state sort
+ return bdone;
+ }
+
+ private int partition_achievements( Array a, int l, int h )
+ {
+ DemolitionistMenuListItem pv = a[h];
+ int i = (l-1);
+ for ( int j=l; j<=(h-1); j++ )
+ {
+ if ( CmpAchievement(DemolitionistMenuAchievementItem(pv).a,DemolitionistMenuAchievementItem(a[j]).a) )
+ {
+ i++;
+ DemolitionistMenuListItem tmp = a[j];
+ a[j] = a[i];
+ a[i] = tmp;
+ }
+ }
+ DemolitionistMenuListItem tmp = a[h];
+ a[h] = a[i+1];
+ a[i+1] = tmp;
+ return i+1;
+ }
+ private void qsort_achievements( Array a, int l, int h )
+ {
+ if ( l >= h ) return;
+ int p = partition_achievements(a,l,h);
+ qsort_achievements(a,l,p-1);
+ qsort_achievements(a,p+1,h);
+ }
+
+ override void Ticker()
+ {
+ if ( !stats ) return;
+ // update list contents
+ String str;
+ int w;
+ switch ( section )
+ {
+ case 0:
+ if ( lists[0].items.Size() == 0 ) // allocate first
+ {
+ for ( int i=0; i<31; i++ )
+ {
+ let li = new("DemolitionistMenuListItem").Init(master,"");
+ li.ypos = i*16;
+ lists[0].items.Push(li);
+ }
+ }
+ maxofs[0] = int(16*lists[0].items.Size()-(master.ws.y-46));
+ // oof
+ int thour = ((level.totaltime-stats.lastspawn)/(3600*GameTicRate));
+ int tmin = ((level.totaltime-stats.lastspawn)/(60*GameTicRate))%60;
+ int tsec = ((level.totaltime-stats.lastspawn)/GameTicRate)%60;
+ str = String.Format("\cx%s\c-%02d\cu:\c-%02d\cu:\c-%02d",StringTable.Localize("$SWWM_STATUPTIME"),thour,tmin,tsec);
+ lists[0].items[0].label = str;
+ if ( stats.grounddist > 32000. ) str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATONFOOT"),stats.grounddist/32000.,StringTable.Localize("$SWWM_UNIT_KILOMETER"));
+ else str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATONFOOT"),stats.grounddist/32.,StringTable.Localize("$SWWM_UNIT_METER"));
+ lists[0].items[1].label = str;
+ if ( stats.airdist > 32000. ) str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATFLIGHT"),stats.airdist/32000.,StringTable.Localize("$SWWM_UNIT_KILOMETER"));
+ else str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATFLIGHT"),stats.airdist/32.,StringTable.Localize("$SWWM_UNIT_METER"));
+ lists[0].items[2].label = str;
+ if ( stats.swimdist > 32000. ) str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATSWIM"),stats.swimdist/32000.,StringTable.Localize("$SWWM_UNIT_KILOMETER"));
+ else str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATSWIM"),stats.swimdist/32.,StringTable.Localize("$SWWM_UNIT_METER"));
+ lists[0].items[3].label = str;
+ if ( stats.teledist > 32000. ) str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATTELE"),stats.teledist/32000.,StringTable.Localize("$SWWM_UNIT_KILOMETER"));
+ else str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATTELE"),stats.teledist/32.,StringTable.Localize("$SWWM_UNIT_METER"));
+ lists[0].items[4].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATBOOST"),stats.boostcount);
+ lists[0].items[5].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATDASH"),stats.dashcount);
+ lists[0].items[6].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATSTOMP"),stats.stompcount);
+ lists[0].items[7].label = str;
+ str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATFUEL"),stats.fuelusage,StringTable.Localize("$SWWM_UNIT_LITER"));
+ lists[0].items[8].label = str;
+ str = String.Format("\cx%s\c-%g\cu%s\c-",StringTable.Localize("$SWWM_STATSPEED"),(stats.topspeed*3600.*GameTicRate)/32000.,StringTable.Localize("$SWWM_UNIT_KPH"));
+ lists[0].items[9].label = str;
+ thour = (stats.airtime/(3600*GameTicRate));
+ tmin = (stats.airtime/(60*GameTicRate))%60;
+ tsec = (stats.airtime/GameTicRate)%60;
+ str = String.Format("\cx%s\c-%02d\cu:\c-%02d\cu:\c-%02d",StringTable.Localize("$SWWM_STATAIRTIME"),thour,tmin,tsec);
+ lists[0].items[10].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATPARRY"),stats.parries);
+ lists[0].items[11].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATPPARRY"),stats.pparries);
+ lists[0].items[12].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATWPONCH"),stats.wponch);
+ lists[0].items[13].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATBUSTS"),stats.busts);
+ lists[0].items[14].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATBUTTS"),stats.buttslams);
+ lists[0].items[15].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATPATS"),stats.pats);
+ lists[0].items[16].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATKISS"),stats.smooch);
+ lists[0].items[17].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATFRIENDS"),stats.befriend);
+ lists[0].items[18].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATITEMS"),stats.items);
+ lists[0].items[19].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATSECRETS"),stats.secrets);
+ lists[0].items[20].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATKILLS"),stats.kills);
+ lists[0].items[21].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATDEATHS"),stats.deaths);
+ lists[0].items[22].label = str;
+ if ( stats.hdamagedealt > 0 ) str = str = String.Format("\cx%s\c-%d%09d",StringTable.Localize("$SWWM_STATDDEALT"),stats.hdamagedealt,stats.damagedealt);
+ else str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATDDEALT"),stats.damagedealt);
+ lists[0].items[23].label = str;
+ if ( stats.hdamagetaken > 0 ) str = String.Format("\cx%s\c-%d%09d",StringTable.Localize("$SWWM_STATDTAKEN"),stats.hdamagetaken,stats.damagetaken);
+ else str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATDTAKEN"),stats.damagetaken);
+ lists[0].items[24].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATTDEALT"),stats.topdealt);
+ lists[0].items[25].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATTTAKEN"),stats.toptaken);
+ lists[0].items[26].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATMKILL"),stats.mkill);
+ lists[0].items[27].label = str;
+ str = String.Format("\cx%s\c-%d",StringTable.Localize("$SWWM_STATSKILL"),stats.skill);
+ lists[0].items[28].label = str;
+ str = String.Format("\cx%s\c-",StringTable.Localize("$SWWM_STATFAVWEAP"));
+ if ( stats.favweapon == -1 ) str = str.."N/A";
+ else if ( stats.wstats[stats.favweapon].w == 'SWWMWeapon' ) str = str..StringTable.Localize("$SWWM_YOURSELF");
+ else if ( stats.wstats[stats.favweapon].w == 'SWWMGesture' ) str = str..StringTable.Localize("$SWWM_DOKIDOKI");
+ else if ( stats.wstats[stats.favweapon].w == 'SWWMItemGesture' ) str = str..StringTable.Localize("$T_FROGGY");
+ else if ( stats.wstats[stats.favweapon].w == 'Weapon' ) str = str..StringTable.Localize("$SWWM_GRAVKILL");
+ else if ( stats.wstats[stats.favweapon].w == 'DoomWeapon' ) str = str..StringTable.Localize("$SWWM_PARRYKILL");
+ else
+ {
+ let def = GetDefaultByType(stats.wstats[stats.favweapon].w);
+ str = str..def.GetTag();
+ }
+ lists[0].items[29].label = str;
+ if ( stats.hhiscore > 0 ) str = String.Format("\cx%s\cu¥\c-%d%09d",StringTable.Localize("$SWWM_STATHISCORE"),stats.hhiscore,stats.hiscore);
+ else str = String.Format("\cx%s\cu¥\c-%09d",StringTable.Localize("$SWWM_STATHISCORE"),stats.hiscore);
+ lists[0].items[30].label = str;
+ break;
+ case 1:
+ // theoretically we can assume that the monster stats list will never shrink in the middle of gameplay, only grow
+ // also the array only ever has elements pushed, never inserted in-between
+ // if this somehow breaks, I don't know what the hell can do that
+ if ( lists[1].items.Size() < stats.mstats.Size() )
+ {
+ int oldindex = lists[1].items.Size();
+ lists[1].items.Resize(stats.mstats.Size());
+ for ( int i=oldindex; i 0 ) w -= 8;
+ for ( int i=0; i 0 ) w -= 8;
+ int len[4], maxlen[4];
+ for ( int i=0; i<4; i++ ) maxlen[i] = 0;
+ for ( int i=0; i maxlen[0] ) maxlen[0] = len[0];
+ if ( l.s.stotal > 0 )
+ {
+ str = String.Format("S %d/%d",l.s.scount,l.s.stotal);
+ len[1] = smallfont2.StringWidth(str);
+ if ( len[1] > maxlen[1] ) maxlen[1] = len[1];
+ }
+ if ( l.s.itotal > 0 )
+ {
+ str = String.Format("I %d/%d",l.s.icount,l.s.itotal);
+ len[2] = smallfont2.StringWidth(str);
+ if ( len[2] > maxlen[2] ) maxlen[2] = len[2];
+ }
+ if ( l.s.ktotal > 0 )
+ {
+ str = String.Format("K %d/%d",l.s.kcount,l.s.ktotal);
+ len[3] = smallfont2.StringWidth(str);
+ if ( len[3] > maxlen[3] ) maxlen[3] = len[3];
+ }
+ }
+ // second pass to propagate the "max lengths"
+ for ( int i=0; i 0 ) w -= 8;
+ for ( int i=0; i 3 ) section = 0;
+ smofs[section] = ofs[section];
+ break;
+ case MK_DOWN:
+ if ( Scroll(16) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MK_UP:
+ if ( Scroll(-16) ) master.MenuSound("menu/demoscroll");
+ break;
+ }
+ }
+ override void MouseInput( Vector2 pos, int btn )
+ {
+ // global events
+ switch ( btn )
+ {
+ case MB_DRAG:
+ if ( drag ) SetOffset(pos.y);
+ break;
+ case MB_RELEASE:
+ drag = false;
+ break;
+ }
+ // mouse on left side
+ if ( pos.x < lwidth )
+ {
+ switch ( btn )
+ {
+ case MB_LEFT:
+ for ( int i=0; i<4; i++ )
+ {
+ if ( pos.x < 9 ) continue;
+ if ( pos.x > 9+smallfont.StringWidth(sname[i]) ) continue;
+ if ( pos.y < 23+16*i ) continue;
+ if ( pos.y > 36+16*i ) continue;
+ if ( section != i )
+ {
+ master.MenuSound("menu/demoscroll");
+ smofs[section] = ofs[section];
+ section = i;
+ smofs[section] = ofs[section];
+ }
+ break;
+ }
+ break;
+ case MB_WHEELUP:
+ MenuInput(MK_LEFT);
+ break;
+ case MB_WHEELDOWN:
+ MenuInput(MK_RIGHT);
+ break;
+ }
+ return;
+ }
+ switch ( btn )
+ {
+ case MB_LEFT:
+ // see if we're clicking the scrollbar (if it exists)
+ if ( (maxofs[section] > 0) && (pos.x > (master.ws.x-8)) )
+ {
+ SetOffset(pos.y);
+ master.MenuSound("menu/demoscroll");
+ drag = true;
+ break;
+ }
+ case MB_WHEELUP:
+ if ( Scroll(-8) ) master.MenuSound("menu/demoscroll");
+ break;
+ case MB_WHEELDOWN:
+ if ( Scroll(8) ) master.MenuSound("menu/demoscroll");
+ break;
+ }
+ }
+ override void Drawer()
+ {
+ if ( !stats ) return;
+ double xx = 9;
+ double yy = 23;
+ for ( int i=0; i<4; i++ )
+ {
+ Screen.DrawText(smallfont,(i==section)?Font.CR_FIRE:Font.CR_WHITE,master.origin.x+xx,master.origin.y+yy,sname[i],DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ yy += 16;
+ }
+ master.DrawVSeparator(lwidth,14,master.ws.y-28);
+ if ( lists[section].items.Size() == 0 )
+ {
+ String str = StringTable.Localize("$SWWM_NOSTAT");
+ xx = lwidth+int((master.ws.x-lwidth)-smallfont.StringWidth(str))/2;
+ yy = int(master.ws.y-smallfont.GetHeight())/2;
+ Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ return;
+ }
+ if ( section == 3 )
+ {
+ // achievement drawer has different margins
+ xx = lwidth+12;
+ yy = 26;
+ int cliptop = int((master.origin.y+26)*master.hs);
+ int clipbottom = int((master.origin.y+master.ws.y-26)*master.hs);
+ int clipleft = int((master.origin.x+lwidth+12)*master.hs);
+ int clipright = int((master.origin.x+master.ws.x-12)*master.hs);
+ lists[section].Drawer((xx,yy-smofs[section]),cliptop,clipbottom,clipleft,clipright);
+ }
+ else
+ {
+ xx = lwidth+9;
+ yy = 23;
+ int cliptop = int((master.origin.y+23)*master.hs);
+ int clipbottom = int((master.origin.y+master.ws.y-23)*master.hs);
+ int clipleft = int((master.origin.x+lwidth+9)*master.hs);
+ int clipright = int((master.origin.x+master.ws.x-9)*master.hs);
+ lists[section].Drawer((xx,yy-smofs[section]),cliptop,clipbottom,clipleft,clipright);
+ }
+ if ( maxofs[section] > 0 )
+ {
+ xx = master.ws.x-8;
+ master.DrawVSeparator(xx,14,master.ws.y-28);
+ xx += 2;
+ yy = floor(smofs[section]*((master.ws.y-39)/maxofs[section]))+14;
+ Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,"▮",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
+ }
+ }
+}
+
+// monster kill stat item
+Class DemolitionistMenuKillItem : DemolitionistMenuListItem
+{
+ MonsterKill s;
+ int width;
+
+ DemolitionistMenuKillItem Init( DemolitionistMenu master, MonsterKill s, int width = 0 )
+ {
+ Super.Init(master,"");
+ self.s = s;
+ self.width = width;
+ let m = GetDefaultByType(s.m);
+ self.label = m.GetTag(FallbackTag);
+ if ( self.label == FallbackTag )
+ {
+ self.label = m.GetClassName();
+ SWWMUtility.BeautifyClassName(self.label);
+ }
+ return self;
+ }
+
+ override int GetWidth()
+ {
+ return width;
+ }
+
+ override void Drawer( Vector2 pos, bool selected, int cliptop, int clipbottom, int clipleft, int clipright )
+ {
+ Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+pos.x,master.origin.y+pos.y,label,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ String str = String.Format("%d",s.kills);
+ Screen.DrawText(smallfont,Font.CR_WHITE,master.origin.x+pos.x+width-smallfont.StringWidth(str),master.origin.y+pos.y,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ }
+}
+
+// map stat item
+Class DemolitionistMenuMapStatItem : DemolitionistMenuListItem
+{
+ LevelStat s;
+ int width;
+ int maxlen[4];
+
+ DemolitionistMenuMapStatItem Init( DemolitionistMenu master, LevelStat s, int width = 0 )
+ {
+ Super.Init(master,"");
+ self.s = s;
+ self.width = width;
+ self.label = s.hub?s.levelname:String.Format("%s - %s",s.mapname.MakeUpper(),s.levelname);
+ return self;
+ }
+
+ override int GetWidth()
+ {
+ return width;
+ }
+
+ override void Drawer( Vector2 pos, bool selected, int cliptop, int clipbottom, int clipleft, int clipright )
+ {
+ String str = label;
+ if ( selected ) str = "\cd▸\c- "..str;
+ bool smallname = smallfont.StringWidth(str)>(width-(maxlen[3]+maxlen[2]+maxlen[1]+maxlen[0]+24));
+ Screen.DrawText(smallname?smallfont2:smallfont,Font.CR_FIRE,master.origin.x+pos.x,master.origin.y+pos.y+smallname*2,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ double xx = pos.x+width;
+ double yy = pos.y+2;
+ int sec = Thinker.Tics2Seconds(s.time);
+ str = String.Format("%02d\cu:\c-%02d\cu:\c-%02d",sec/3600,(sec%3600)/60,sec%60);
+ Screen.DrawText(smallfont2,((s.suck>0)&&(sec>=(s.suck*3600)))?Font.CR_RED:(sec<=s.par)?Font.CR_GOLD:Font.CR_WHITE,master.origin.x+xx-smallfont2.StringWidth(str),master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawText(smallfont2,Font.CR_FIRE,master.origin.x+xx-maxlen[0],master.origin.y+yy,"T",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ if ( maxlen[0] > 0 ) xx -= maxlen[0]+8;
+ if ( s.stotal > 0 )
+ {
+ str = String.Format("%d\cu/\c-%d",s.scount,s.stotal);
+ Screen.DrawText(smallfont2,(s.scount>=s.stotal)?Font.CR_GOLD:Font.CR_WHITE,master.origin.x+xx-smallfont2.StringWidth(str),master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawText(smallfont2,Font.CR_FIRE,master.origin.x+xx-maxlen[1],master.origin.y+yy,"S",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ }
+ if ( maxlen[1] > 0 ) xx -= maxlen[1]+8;
+ if ( s.itotal > 0 )
+ {
+ str = String.Format("%d\cu/\c-%d",s.icount,s.itotal);
+ Screen.DrawText(smallfont2,(s.icount>=s.itotal)?Font.CR_GOLD:Font.CR_WHITE,master.origin.x+xx-smallfont2.StringWidth(str),master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawText(smallfont2,Font.CR_FIRE,master.origin.x+xx-maxlen[2],master.origin.y+yy,"I",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ }
+ if ( maxlen[2] > 0 ) xx -= maxlen[2]+8;
+ if ( s.ktotal > 0 )
+ {
+ str = String.Format("%d\cu/\c-%d",s.kcount,s.ktotal);
+ Screen.DrawText(smallfont2,(s.kcount>=s.ktotal)?Font.CR_GOLD:Font.CR_WHITE,master.origin.x+xx-smallfont2.StringWidth(str),master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ Screen.DrawText(smallfont2,Font.CR_FIRE,master.origin.x+xx-maxlen[3],master.origin.y+yy,"K",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
+ }
+ }
+}
+
+// achievement item
+Class DemolitionistMenuAchievementItem : DemolitionistMenuListItem
+{
+ SWWMAchievementInfo a;
+ TextureID AchievementUnknown, BaseBox, BarTex[3];
+ bool ShouldObscure;
+ bool bHidden;
+ int width;
+ BrokenLines l;
+ String oldstr;
+
+ DemolitionistMenuAchievementItem Init( DemolitionistMenu master, SWWMAchievementInfo a, int width = 0 )
+ {
+ Super.Init(master,"");
+ self.a = a;
+ self.width = width;
+ AchievementUnknown = TexMan.CheckForTexture("graphics/Achievements/HiddenAchievement.png",TexMan.Type_Any);
+ BaseBox = TexMan.CheckForTexture("graphics/Achievements/NoAchievement.png",TexMan.Type_Any);
+ BarTex[0] = TexMan.CheckForTexture("graphics/Achievements/BarAchievementBase.png",TexMan.Type_Any);
+ BarTex[1] = TexMan.CheckForTexture("graphics/Achievements/BarAchievementProgress.png",TexMan.Type_Any);
+ BarTex[2] = TexMan.CheckForTexture("graphics/Achievements/BarAchievementDone.png",TexMan.Type_Any);
+ ShouldObscure = (swwm_filterachievements==1);
+ Update();
+ return self;
+ }
+
+ // cache state/progress to not call it every frame
+ void Update()
+ {
+ a.state = master.shnd.achievementstate.At(a.basename).ToInt();
+ if ( !a.maxval ) return;
+ a.val = master.shnd.achievementprogress.At(a.basename).ToInt();
+ if ( !a.bitfield ) return;
+ int val = 0;
+ for ( int i=0; i a, Class b )
+ {
+ int ta = 0, tb = 0;
+ let da = GetDefaultByType(a);
+ let db = GetDefaultByType(b);
+ if ( a is 'Weapon' ) ta = 4;
+ else if ( a is 'HammerspaceEmbiggener' ) ta = 3;
+ else if ( a is 'Ammo' ) ta = 2;
+ else if ( a is 'MagAmmo' ) ta = 1;
+ else if ( (a is 'PowerupGiver') || (a is 'AmmoFabricator') || da.bBIGPOWERUP ) ta = 5;
+ else if ( (a is 'Health') || (a is 'HealthPickup') || (a is 'SWWMHealth') ) ta = 7;
+ else if ( (a is 'Armor') || (a is 'SWWMSpareArmor') ) ta = 6;
+ if ( b is 'Weapon' ) tb = 4;
+ else if ( b is 'HammerspaceEmbiggener' ) tb = 3;
+ else if ( b is 'Ammo' ) tb = 2;
+ else if ( b is 'MagAmmo' ) ta = 1;
+ else if ( (b is 'PowerupGiver') || (b is 'AmmoFabricator') || db.bBIGPOWERUP ) tb = 5;
+ else if ( (b is 'Health') || (b is 'HealthPickup') || (b is 'SWWMHealth') ) tb = 7;
+ else if ( (b is 'Armor') || (b is 'SWWMSpareArmor') ) tb = 6;
+ if ( ta == tb )
+ {
+ // sort by unit price
+ if ( abs(da.Stamina) == abs(db.Stamina) )
+ {
+ // sort alphabetically
+ return da.GetTag() > db.GetTag();
+ }
+ return abs(da.Stamina) > abs(db.Stamina);
+ }
+ return ta < tb;
+ }
+
+ private int partition_store( Array a, int l, int h )
+ {
+ DemolitionistMenuListItem pv = a[h];
+ int i = (l-1);
+ for ( int j=l; j<=(h-1); j++ )
+ {
+ if ( CmpInventoryClass(DemolitionistMenuStoreItem(pv).inv,DemolitionistMenuStoreItem(a[j]).inv) )
+ {
+ i++;
+ DemolitionistMenuListItem tmp = a[j];
+ a[j] = a[i];
+ a[i] = tmp;
+ }
+ }
+ DemolitionistMenuListItem tmp = a[h];
+ a[h] = a[i+1];
+ a[i+1] = tmp;
+ return i+1;
+ }
+ private void qsort_store( Array a, int l, int h )
+ {
+ if ( l >= h ) return;
+ int p = partition_store(a,l,h);
+ qsort_store(a,l,p-1);
+ qsort_store(a,p+1,h);
+ }
+
+ override DemolitionistMenuTab Init( DemolitionistMenu master )
+ {
+ title = StringTable.Localize("$SWWM_STORETAB");
+ bHidden = (deathmatch||(G_SkillPropertyInt(SKILLP_ACSReturn)>=4));
+ return Super.Init(master);
+ }
+ override void OnDestroy()
+ {
+ Super.OnDestroy();
+ if ( invlist[0] ) invlist[0].Destroy();
+ if ( invlist[1] ) invlist[1].Destroy();
+ }
+
+ override void OnSelect()
+ {
+ smofs = ofs;
+ }
+ override void OnDeselect()
+ {
+ smofs = ofs;
+ }
+
+ private bool FilterStore( Class type, Inventory cur, readonly inv )
+ {
+ // no collectibles
+ if ( type is 'SWWMCollectible' ) return true;
+ // no barriers outside doom
+ if ( !(gameinfo.gametype&GAME_DOOM) && (type is 'EBarrier') ) return true;
+ // no gravity/tether outside raven
+ if ( !(gameinfo.gametype&GAME_RAVEN) && ((type is 'GravitySuppressor') || (type is 'SafetyTether')) ) return true;
+ // can't sell candygun spares
+ if ( bSell && (type is 'CandyGunSpares') ) return true;
+ // skip items we don't own or are depleted if selling
+ if ( bSell && (!cur || (cur.Amount <= 0)) ) return true;
+ else if ( !bSell )
+ {
+ // skip maxed items if buying
+ if ( cur && (cur.Amount >= cur.MaxAmount) ) return true;
+ // ignore ammo for weapons not owned if buying
+ bool notownedammo = false;
+ if ( type is 'Ammo' )
+ {
+ notownedammo = true;
+ let amo = (Class)(type);
+ for ( Inventory inv=players[consoleplayer].mo.Inv; inv; inv=inv.inv )
+ {
+ if ( !(inv is 'Weapon') ) continue;
+ if ( (Weapon(inv).AmmoType1 == amo) || (Weapon(inv).AmmoType2 == amo) )
+ {
+ notownedammo = false;
+ break;
+ }
+ if ( (inv is 'SWWMWeapon') && SWWMWeapon(inv).UsesAmmo(amo) )
+ {
+ notownedammo = false;
+ break;
+ }
+ }
+ }
+ if ( notownedammo ) return true;
+ }
+ // skip unimplemented weapons
+ if ( type is 'Weapon' )
+ {
+ let ready = inv.FindState("Ready");
+ if ( !ready || !ready.ValidateSpriteFrame() ) return true;
+ }
+ // ignore child ammos
+ if ( (type is 'Ammo') && (type.GetParentClass() != 'SWWMAmmo') ) return true;
+ // items must have a set price
+ if ( inv.Stamina == 0 ) return true;
+ // items with negative stamina can only be sold
+ if ( (inv.Stamina < 0) && !bSell ) return true;
+ return false;
+ }
+
+ override void Ticker()
+ {
+ bool mustsort = false;
+ bool skipsel = false;
+ // only update active list to reduce perf hit
+ if ( !invlist[bSell] )
+ {
+ mustsort = true;
+ skipsel = true;
+ // initialize
+ invlist[bSell] = new("DemolitionistMenuList");
+ invlist[bSell].master = master;
+ invlist[bSell].selected = 0;
+ }
+ // check if current entries must be deleted
+ for ( int i=0; i i ) invlist[bSell].selected = max(0,invlist[bSell].selected-1);
+ i--;
+ }
+ for ( int i=0; i)(AllActorClasses[i]);
+ if ( !type ) continue;
+ let cur = players[consoleplayer].mo.FindInventory(type);
+ let inv = GetDefaultByType(type);
+ if ( FilterStore(type,cur,inv) ) continue;
+ // skip if it's already there
+ bool skipme = false;
+ for ( int j=0; j abs(inv2.Stamina) ) continue;
+ greater = true;
+ invlist[bSell].items.Insert(j,new("DemolitionistMenuStoreItem").Init(master,type,bSell));
+ mustsort = true;
+ break;
+ }
+ if ( greater ) continue;
+ invlist[bSell].items.Push(new("DemolitionistMenuStoreItem").Init(master,type,bSell));
+ mustsort = true;
+ }
+ // don't do anything if empty
+ if ( invlist[bSell].items.Size() <= 0 ) return;
+ // sort inventory
+ if ( mustsort )
+ {
+ DemolitionistMenuListItem csel = invlist[bSell].items[invlist[bSell].selected];
+ qsort_store(invlist[bSell].items,0,invlist[bSell].items.Size()-1);
+ let idx = invlist[bSell].items.Find(csel);
+ if ( !skipsel && (idx != invlist[bSell].items.Size()) && (idx != invlist[bSell].selected) )
+ invlist[bSell].selected = idx;
+ }
+ // rearrange all item positions
+ maxofs = 0;
+ maxw = 0;
+ for ( int i=0; i maxw ) maxw = fw;
+ }
+ int xx = 0;
+ int yy = 0;
+ for ( int i=0; i= (master.ws.y-48) )
+ {
+ xx += maxw;
+ yy = 0;
+ }
+ }
+ maxofs = max(0,maxofs-int(master.ws.x-18));
+ if ( ofs > maxofs ) smofs = ofs = maxofs;
+ // update smooth scroll
+ smofs = (smofs*.6)+(ofs*.4);
+ if ( abs(smofs-ofs) < (1./master.hs) ) smofs = ofs;
+ // tick the list
+ invlist[bSell].Ticker();
+ }
+
+ // called when sending a scroll input
+ // returns true if the position actually changed
+ // speed: how many pixels to move (either back or forward)
+ bool Scroll( int speed )
+ {
+ if ( maxofs <= 0 ) return false;
+ int oldofs = ofs;
+ ofs = clamp(ofs+speed,0,maxofs);
+ return (ofs != oldofs);
+ }
+ // called when clicking on our scrollbar
+ // returns true if the position actually changed
+ // x: relative click position
+ bool SetOffset( double x )
+ {
+ if ( maxofs <= 0 ) return false;
+ int oldofs = ofs;
+ ofs = clamp(int(round((x-5.)/((master.ws.x-10.)/maxofs))),0,maxofs);
+ return (ofs != oldofs);
+ }
+ // called when keyboard scrolling
+ void KBScroll()
+ {
+ if ( maxofs <= 0 ) return;
+ int minx = (invlist[bSell].items[invlist[bSell].selected].xpos+maxw-16)-int(master.ws.x-18);
+ int maxx = invlist[bSell].items[invlist[bSell].selected].xpos;
+ if ( ofs < minx ) ofs = clamp(minx,0,maxofs);
+ else if ( ofs > maxx ) ofs = clamp(maxx,0,maxofs);
+ }
+
+ override void MenuInput( int key )
+ {
+ if ( key == MK_BACK )
+ {
+ bSell = !bSell;
+ master.MenuSound(bSell?"menu/demosel":"menu/democlose");
+ if ( invlist[bSell] && (invlist[bSell].items.Size() > 0) )
+ {
+ invlist[bSell].selected = 0;
+ KBScroll();
+ }
+ return;
+ }
+ if ( !invlist[bSell] || (invlist[bSell].items.Size() <= 0) ) return;
+ switch ( key )
+ {
+ case MK_LEFT:
+ int prev = max(0,invlist[bSell].selected-22);
+ if ( prev == invlist[bSell].selected ) break;
+ invlist[bSell].selected = prev;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ break;
+ case MK_RIGHT:
+ int next = min(invlist[bSell].items.Size()-1,invlist[bSell].selected+22);
+ if ( next == invlist[bSell].selected ) break;
+ invlist[bSell].selected = next;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ break;
+ case MK_DOWN:
+ if ( invlist[bSell].selected < invlist[bSell].items.Size()-1 )
+ {
+ invlist[bSell].selected++;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ }
+ break;
+ case MK_UP:
+ if ( invlist[bSell].selected > 0 )
+ {
+ invlist[bSell].selected--;
+ master.MenuSound("menu/demoscroll");
+ KBScroll();
+ }
+ break;
+ case MK_ENTER:
+ if ( invlist[bSell].selected >= invlist[bSell].items.Size() ) break;
+ DemolitionistMenuStoreItem(invlist[bSell].items[invlist[bSell].selected]).BuySellItem();
+ break;
+ }
+ }
+ override void MouseInput( Vector2 pos, int btn )
+ {
+ if ( btn == MB_RIGHT )
+ {
+ // just toggle buy/sell
+ MenuInput(MK_BACK);
+ return;
+ }
+ if ( !invlist[bSell] || (invlist[bSell].items.Size() <= 0) ) return;
+ switch ( btn )
+ {
+ case MB_LEFT:
+ // see if we're clicking the scrollbar (if it exists)
+ if ( pos.y > (master.ws.y-21) )
+ {
+ SetOffset(pos.x);
+ master.MenuSound("menu/demoscroll");
+ drag = true;
+ break;
+ }
+ // find which element we clicked
+ for ( int i=0; i