Compare commits

...
Author SHA1 Message Date
Vanessa ea0b88f1b2 fix maints chapel access 2026-06-24 19:59:52 -05:00
Delta-V bot 6de6421636 Automatic changelog update 2026-06-25 00:03:18 +02:00
Vanessa 3cb24c8b68 Custom Client-Side Radio Colors (#6101) 2026-06-24 22:02:58 +00:00
Delta-V bot 9fad412075 Automatic changelog update 2026-06-24 15:15:21 +02:00
Vanessa fbc3104836 Fix Infinite Cloaking (#6085)
Fix infinite cloaking because I guess power draw doesn't count as using the battery charge.
2026-06-24 15:15:01 +02:00
Delta-V bot e231d9d67c Automatic changelog update 2026-06-24 15:08:40 +02:00
Stxcking 468d929c4b Tweak: AAC Subject Button Colors Return + Words Capitalized (#5567)
* Nuked StyleNano + Added colors to sheetlet

SubjectButtonColors table to define colors (same hex as the ones in StyleNano)
SubjectColorRules to loop rules for applying colors

* Capitalize every single phrase

CONSISTENCY RAHH
2026-06-24 15:08:20 +02:00
Delta-V bot 2f1aaff32c Automatic changelog update 2026-06-24 00:35:07 +02:00
Vanessa 4f49ccde68 Sleepers no longer have an annoucement (#6066)
* Sleepers no longer have an annoucement.

* NT sleepers too.
2026-06-23 18:34:47 -04:00
Vanessaandpre-commit-ci[bot] cb3b74e49e Station-Specific Department Cleanup (#6078)
* Removed some jobs from station specific jobs because they are on all stations.

* Department Prototype Cleanup

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Actually fix brigmedic on the crew monitor

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-06-23 18:34:44 -04:00
Vanessaandpre-commit-ci[bot] 7d15a39a77 Fixed emergency access locale string (#6044)
* Fixed emergency access locale string

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-06-23 18:23:22 -04:00
Delta-V bot 3ac816fee1 Automatic changelog update 2026-06-24 00:19:37 +02:00
Delta-V bot b909d9a2e5 Automatic changelog update 2026-06-23 17:27:27 +02:00
Theo 7547752159 Broken bottle slicing (#6092)
add comps
2026-06-23 10:27:07 -05:00
Manoob 9b7819288e Added a fix that resets the cook timers on fryer power changed (#6075) 2026-06-23 09:17:06 -05:00
Delta-V bot 424a4569d8 Automatic changelog update 2026-06-23 14:50:11 +02:00
wesker 12827c0e98 TraitSystem require fix (#6097)
how did i even forget this
2026-06-23 12:49:51 +00:00
Delta-V bot d1e61ba0a2 Automatic changelog update 2026-06-23 12:40:37 +02:00
652e52dbca Nuke/CosCult Global Music and SFX (#5918)
* Extended ServerGlobalSoundSystem and exposed its lies. Now its actually global.

* Fixed Epsilon event rule namespacing and formatting.

* Cosmic Cult Music Updates

* Few more CosCult changes.

* Nuke and Alert Changes

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update Content.Server/_DV/CosmicCult/EntitySystems/CosmicChantrySystem.cs

Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

* Update Content.Server/_DV/Audio/ServerGlobalSoundSystem.cs

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-06-23 12:40:17 +02:00
Delta-V bot e7fe4865de Automatic changelog update 2026-06-22 20:06:07 +02:00
A111Vojta 84b600a39f Harmony lanyards (#6035)
* Lanyards Part1

* Lanyards Part 2

* Lanyards Part 3

* Fix

* Lanyards - Adding Comments

* replace plaintext with LocIds

* expanded the lanyard slot blacklist
2026-06-22 20:05:47 +02:00
Delta-V bot 31201c44ba Automatic changelog update 2026-06-22 18:48:51 +02:00
Theo 4f9f93eb87 Slugs structural increase TWO! (#6068)
* number up

* comment formatting
2026-06-22 11:48:31 -05:00
Delta-V bot f8a4d823b9 Automatic changelog update 2026-06-22 13:37:10 +02:00
Proxy also works :3 c61d2c6a58 guidebook shields (#6070) 2026-06-22 06:36:50 -05:00
Delta-V bot e25181e1bc Automatic changelog update 2026-06-22 13:11:55 +02:00
7c052442a8 Traits UI Modifications, Visuals, and a new Condition (#6082)
* traits ui things

* fluent

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update Resources/Locale/en-US/_DV/traits/traits-ui.ftl

Co-authored-by: Tobias Berger <toby@tobot.dev>
Signed-off-by: wesker <53323309+weskified@users.noreply.github.com>

* i hate toby

* newline

* pattern matching

* made simpler

* 2sleepy4myowngood

* kl;jasglkknf.,/.sa/.mmmmmmmmm

---------

Signed-off-by: wesker <53323309+weskified@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Tobias Berger <toby@tobot.dev>
2026-06-22 11:11:35 +00:00
Delta-V bot 19b0de35dd Automatic changelog update 2026-06-22 10:46:57 +02:00
wesker 1c66c1fe2e Fix 8 0'Clock Ghosts to be Mono (#6084)
* fix jukebox to be mono

* ACTUALLY fix this, holy shit audacity
2026-06-22 10:46:37 +02:00
Delta-V bot ef46675a2f Automatic changelog update 2026-06-22 06:23:31 +02:00
Halo3moth c0b6929c9a lower pitbull vent spawn rate (#6081) 2026-06-22 04:23:12 +00:00
Vanessa c7aa50cf85 Update C# Contribution Examples and Guidelines (#6039)
Updated C# guidelines.
2026-06-21 15:59:47 +02:00
Delta-V bot c69fb99600 Automatic changelog update 2026-06-21 15:48:33 +02:00
VelcroboyandVelcroboy 3ca37d9c2b Map Edits: The Hive (#6018)
* Map Edits: The Hive

* review changes

---------

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-06-21 15:48:12 +02:00
github-actions[bot]andDeltaV-Bot 8ba993d1a9 Update Credits (#6072)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-06-21 05:30:08 +02:00
Delta-V bot edd1500bf3 Automatic changelog update 2026-06-20 19:14:31 +02:00
einknusprigestoastandpre-commit-ci[bot] 2ec64360b7 ERT Security Loadout overhaul (#6049)
* ERT Selectors Amber Sec

* Added SRT Loadouts

* Added SRT Loadouts

* Added ERT selectors

* ERT Loadout tweaks

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Changed Omnitool to be ToolDebug + Multitool

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-06-20 19:14:11 +02:00
Delta-V bot e0540c6205 Automatic changelog update 2026-06-20 17:02:34 +02:00
7953b0469a I SCREAM, YOU SCREAM, WE ALL SCREAM FOR ICE CREAM (#5943)
* Initial commit.

* Minor tweaks to names, added caramel bottle.

* Fixing open state of caramel bottle.

* JSON cleanup.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Minor tweak to cookie dough ice cream recipe. Removed unused sprites.

* Swapping out updated sprites for rainbow sherbet, tropical sundae, neapolitan.

* Removing plushies.zip.

* Moved frozen treats to their own guidebook section under drinks to reduce clutter.

* Fixing flavor references, adding icecreamflavors.yml to contain definitions, corrected loadout ID references in loadoutgroups.

* Committing loadout changes that slipped through the cracks.

* Corrected casing in reference to RSI.

* Changed recipe for caramel to be just sugar to prevent conflict with Sigynate's recipe.

* So I'm kinda dumb and somehow it didn't occur to me that making sugar alone yield caramel would actually not only not fix the issue with Syginate but also wreck it for so many other chems, oopsie daisy, we're swapping it for Saline for a more shelf-stable salted caramel sauce.

* Tweaking ratio for Caramel, also, what are the odds that the tempermental build just works after this?

* At this point I'm just curious if a different build will fail this time.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>

* Update Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>

* Update Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>

* Update Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Clothing/Uniforms/jumpsuits.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Objects/Consumable/Drinks/frozen_treats.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>

* Update Resources/Prototypes/Guidebook/references.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>

* Review changes

* Pascal-ify-ing flavor IDs.

* Update Resources/Prototypes/_DV/Entities/Objects/Consumable/Drinks/frozen_treats.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>

---------

Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-06-20 15:02:13 +00:00
Delta-V bot a3d3d23600 Automatic changelog update 2026-06-20 16:24:55 +02:00
pathetic meowmeow 5ccfce1e7f NanoChat? Outside the same grid? Perish the thought. (#6057) 2026-06-20 09:24:35 -05:00
Delta-V bot 879cbf43f5 Automatic changelog update 2026-06-20 16:20:24 +02:00
einknusprigestoastandpre-commit-ci[bot] 9c84627db5 Added CentComm Turrets (#6069)
* Added CentComm Turrets

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-06-20 09:20:04 -05:00
349 changed files with 14422 additions and 3615 deletions
+78 -18
View File
@@ -73,28 +73,88 @@ If you are adding a lot of C# code, then take advantage of partial classes. Put
Otherwise, **add comments on or around any changed lines.**
A comment on a new imported namespace:
### Single-Line Changes
Format should look like this.
```cs
using Content.Server.Psionics.Glimmer; // DeltaV
/* Importing Namespaces - Include optional comment if its not obvious what its being used for. */
using Content.Server._DV.Psionics.Glimmer; // DeltaV
using Content.Shared.Damage.Systems; // DeltaV - Addition of HandHeldArmor
/* Changing an upstream line - Same line as the change */
if (!TryComp<EyeComponent>(ent, out var eye) || _disabled) // DeltaV - check if disabled
/* Adding - Either same line or above the line. */
EnsureComp<PotentialPsionicComponent>(entity); // Deltav - Psionics
/* "Deleting" - Don't actually delete, just comment out and say why. This only applies to upstream code. */
// args.StatusIcons.Add(_prototype.Index(component.Icon)); // DeltaV - commented out. status icon now added above
```
A pair of comments enclosing a block of added code:
> * Its pretty obvious in the example above that importing `Content.Server._DV.Psionics.Glimmer` means we'll be interacting with glimmer so putting `// DeltaV - Add Glimmer` is needlessly redundant.
> * It's not as obvious what the `Content.Shared.Damage.Systems` namespace is used for, since its so broad, so adding a comment what feature is using it helps.
> * Actual code changes should almost always include the comment after ``// DeltaV`.
### Multi-Line Changes
Depending on how much you are editing, putting a comment on EACH line may be excessive, so if you have a larger block of code you are changing, denote it like so:
```cs
private EntityUid Slice(...)
// BEGIN DeltaV - Remove innate radio and radios from pockets
for (var i = 1; i <= 4; i++) // Arachnids have 4 pockets
{
...
_transform.SetLocalRotation(sliceUid, 0);
// DeltaV - start of deep frier stuff
var slicedEv = new FoodSlicedEvent(user, uid, sliceUid);
RaiseLocalEvent(uid, ref slicedEv);
// DeltaV - end of deep frier stuff
...
if (_inventory.TryGetSlotEntity(target, $"pocket{i}", out var headset) && HasComp<HeadsetComponent>(headset))
_inventory.TryUnequip(target, $"pocket{i}", true, true);
}
RemComp<ActiveRadioComponent>(target); // If the zombie has an innate radio, get rid of it.
// END DeltaV
```
> * Denoting these with a BEGIN and END clearly shows they are block of code without having to read the entire comment. This makes it easier to tell when you're dealing with single-line comments versus a block with merging in conflicts.
> * Case and order of the first two words is less of a concern. `// DeltaV Begin` or `// Begin DeltaV` will work fine too.
> * Try to make your blocks as small as possible, but use your discretion.
> * If you deleting multiple lines, use line comments (``//``) if its a few lines but if its a larger block (like commenting out an entire function), it is preferable to use block comments (`/* */`).
#### Soft Exceptions to the Multi-Line "Rules"
Some multi-line changes can use a single-line comment in certain scenarios. But if you are UNSURE, just use `// BEGIN DeltaV` and `// END DeltaV` comments like the previous section does and it'll be fine.
I'll give some examples.
```cs
/* This change comments out 3 lines but only needs a single line comment because commenting out the if statement implies that its logic will be commented out too. */
// if (obj.WasModified<TraitPrototype>()) // DeltaV - Refreshed in TraitsTab
// {
// _profileEditor.RefreshTraits();
// }
/* Same principle here. This adds two lines but the if statement implies the next line so commenting both lines isn't really needed. */
if (_flight.IsFlying(entity.Owner)) // DeltaV - Harpy Flight
return true;
```
### New Methods or Component Variables
Sometimes, you'll need to implement a whole new method or component variable and instead of wrapping it in `// BEGIN DeltaV` and `// END DeltaV`, you can just denote that it's a DeltaV function in the summary block before the function. This denotes the WHOLE function as a DeltaV addition.
```cs
/* New Method Example */
/// <summary>
/// DeltaV - Handle revealing ninja if cloaked when attacked by a hitscan attack.
/// </summary>
private void OnNinjaAttacked(Entity<SpaceNinjaComponent> ent, ref DamageChangedEvent args)
{
...
}
/* New Component Variable Example */
/// <summary>
/// DeltaV - If disabled the action will not disable when no charges remain. Use if you want to handle no charges differently.
/// </summary>
[DataField]
public bool DisableWhenEmpty = true;
```
In short:
* Use `// BEGIN DeltaV` and `// END Delta` to denote a *block* of changes.
* Keep blocks as small as possible.
* Use `// DeltaV` on or before the line if its not a block of changes.
* Use exceptions when they make sense.
### Changing Upstream Localization Fluent .ftl files
**Move all changed locale strings to a new DeltaV file** - use a `.ftl` file in the `_DV` folder. Comment out the old strings in the upstream file, and explain that they were moved.
@@ -104,10 +164,10 @@ Example:
Commented out old string in `Resources\Locale\en-US\xenoarchaeology\artifact-analyzer.ftl`
```
# DeltaV - moved to _DV file
#analysis-console-info-effect-value = [font="Monospace" size=11][color=gray]{ $state ->
# [true] {$info}
# *[false] Unlock nodes to gain info
#}[/color][/font]
# analysis-console-info-effect-value = [font="Monospace" size=11][color=gray]{ $state ->
# [true] {$info}
# *[false] Unlock nodes to gain info
# }[/color][/font]
```
The new version of the string in `Resources\Locale\en-US\_DV\xenoarchaeology\artifact-analyzer.ftl`
+10
View File
@@ -7,6 +7,7 @@ using Content.Shared.IdentityManagement;
using Content.Shared.Input;
using Content.Shared.Interaction.Events;
using Content.Shared.Item;
using Content.Shared.Radio.Components; // DeltaV - Client-side Radio Colors
using Content.Shared.Verbs;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
@@ -158,6 +159,15 @@ namespace Content.Client.Examine
// since there's probably one open already if it's coming in from the server.
var entity = GetEntity(ev.EntityUid);
// BEGIN DeltaV - Client-Side Radio Colors
// This *seems* a bit hacky, but we basically don't want to overwrite what's been pushed on the client-side,
// because the server will send us the server-side colors (default). I've yet to find a scenario where the
// server and client don't match, so until then, this is probably fine, if a little hacky.
if (HasComp<EncryptionKeyHolderComponent>(entity) || HasComp<EncryptionKeyComponent>(entity))
return;
// END DeltaV
OpenTooltip(player.Value, entity, ev.CenterAtCursor, ev.OpenAtOldTooltip, ev.KnowTarget);
UpdateTooltipInfo(player.Value, entity, ev.Message, ev.Verbs, getVerbs: false);
}
@@ -10,6 +10,7 @@
<tabs:AudioTab Name="AudioTab" />
<tabs:AccessibilityTab Name="AccessibilityTab" />
<tabs:AdminOptionsTab Name="AdminOptionsTab" />
<dtabs:RadioTab Name="RadioTab" /> <!-- DeltaV - Client-side Radio Options -->
<dtabs:DeltaTab Name="DeltaTab" /> <!-- DeltaV -->
</TabContainer>
</DefaultWindow>
@@ -21,7 +21,8 @@ namespace Content.Client.Options.UI
Tabs.SetTabTitle(3, Loc.GetString("ui-options-tab-audio"));
Tabs.SetTabTitle(4, Loc.GetString("ui-options-tab-accessibility"));
Tabs.SetTabTitle(5, Loc.GetString("ui-options-tab-admin"));
Tabs.SetTabTitle(6, Loc.GetString("ui-options-tab-deltav")); // DeltaV specific settings
Tabs.SetTabTitle(6, Loc.GetString("ui-options-tab-radio")); // DeltaV - Radio Channel Colors
Tabs.SetTabTitle(7, Loc.GetString("ui-options-tab-deltav")); // DeltaV specific settings
UpdateTabs();
}
@@ -36,6 +37,7 @@ namespace Content.Client.Options.UI
AccessibilityTab.Control.ReloadValues();
AudioTab.Control.ReloadValues();
AdminOptionsTab.Control.ReloadValues();
RadioTab.Control.ReloadValues(); // DeltaV - Radio Channel Colors
DeltaTab.Control.ReloadValues(); // DeltaV
}
}
-111
View File
@@ -159,35 +159,6 @@ namespace Content.Client.Stylesheets
public static readonly Color ChatBackgroundColor = Color.FromHex("#25252ADD");
// DeltaV - AAC button variables
public static readonly string CommandButtonClass = "CommandButton";
public static readonly string EngineeringButtonClass = "EngineeringButton";
public static readonly string EpistemicsButtonClass = "EpistemicsButton";
public static readonly string JusticeButtonClass = "JusticeButton";
public static readonly string LogisticsButtonClass = "LogisticsButton";
public static readonly string MedicalButtonClass = "MedicalButton";
public static readonly string SecurityButtonClass = "SecurityButton";
public static readonly string ServiceButtonClass = "ServiceButton";
// DeltaV - AAC button colors
public static readonly Color CommandButtonColorDefault = Color.FromHex("#404A58");
public static readonly Color CommandColorHovered = Color.FromHex("#4F587B");
public static readonly Color EngineeringButtonColorDefault = Color.FromHex("#77684B");
public static readonly Color EngineeringColorHovered = Color.FromHex("#776D71");
public static readonly Color EpistemicsButtonColorDefault = Color.FromHex("#6F5973");
public static readonly Color EpistemicsColorHovered = Color.FromHex("#71638E");
public static readonly Color LogisticsButtonColorDefault = Color.FromHex("#61503A");
public static readonly Color LogisticsColorHovered = Color.FromHex("#675C64");
public static readonly Color JusticeButtonColorDefault = Color.FromHex("#4F3D4C");
public static readonly Color JusticeColorHovered = Color.FromHex("#5C4B5A");
public static readonly Color MedicalButtonColorDefault = Color.FromHex("#49687D");
public static readonly Color MedicalColorHovered = Color.FromHex("#556E95");
public static readonly Color SecurityButtonColorDefault = Color.FromHex("#724449");
public static readonly Color SecurityColorHovered = Color.FromHex("#745370");
public static readonly Color ServiceButtonColorDefault = Color.FromHex("#607952");
public static readonly Color ServiceColorHovered = Color.FromHex("#667A76");
// End DeltaV
public const string StyleClassCrewManifestGender = "CrewManifestGender"; //Delta-V - Manifest pronouns
// i'm not sure what the missing symbols were referencing, and this is getting obseleted anyway so:
@@ -1677,88 +1648,6 @@ namespace Content.Client.Stylesheets
BackgroundColor = FancyTreeSelectedRowColor,
}),
// DeltaV - AAC button styles
Element<ContainerButton>()
.Class(CommandButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, CommandButtonColorDefault),
Element<ContainerButton>()
.Class(CommandButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, CommandColorHovered),
Element<ContainerButton>()
.Class(EngineeringButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, EngineeringButtonColorDefault),
Element<ContainerButton>()
.Class(EngineeringButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, EngineeringColorHovered),
Element<ContainerButton>()
.Class(EpistemicsButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, EpistemicsButtonColorDefault),
Element<ContainerButton>()
.Class(EpistemicsButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, EpistemicsColorHovered),
Element<ContainerButton>()
.Class(LogisticsButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, LogisticsButtonColorDefault),
Element<ContainerButton>()
.Class(LogisticsButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, LogisticsColorHovered),
Element<ContainerButton>()
.Class(MedicalButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, MedicalButtonColorDefault),
Element<ContainerButton>()
.Class(MedicalButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, MedicalColorHovered),
Element<ContainerButton>()
.Class(SecurityButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, SecurityButtonColorDefault),
Element<ContainerButton>()
.Class(SecurityButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, SecurityColorHovered),
Element<ContainerButton>()
.Class(ServiceButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, ServiceButtonColorDefault),
Element<ContainerButton>()
.Class(ServiceButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, ServiceColorHovered),
Element<ContainerButton>()
.Class(JusticeButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, JusticeButtonColorDefault),
Element<ContainerButton>()
.Class(JusticeButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, JusticeColorHovered),
// End DeltaV
// Silicon law edit ui
Element<Label>().Class(SiliconLawContainer.StyleClassSiliconLawPositionLabel)
.Prop(Label.StylePropertyFontColor, NanoGold),
@@ -1,6 +1,7 @@
using System.Globalization;
using System.Linq;
using System.Numerics;
using System.Text.RegularExpressions; // DeltaV - Client-Side Radio Channel Colors
using Content.Client.Administration.Managers;
using Content.Client.Chat;
using Content.Client.Chat.Managers;
@@ -839,8 +840,38 @@ public sealed partial class ChatUIController : UIController
}
}
/// <summary>
/// DeltaV - Regex expression to match on the chat message text in order to replace it with another color.
/// </summary>
private static readonly Regex RadioChatColorRegex = new(@"color=#?([a-fA-F0-9]{8})", RegexOptions.Compiled);
/// <summary>
/// DeltaV - Replaces the channel color hex code in a message with the client-side hex color
/// overridden by <see cref="Content.Client._DV.Radio.RadioChannelColorSystem"/> .
/// </summary>
/// <param name="message">The message to find and replace the color hex code in.</param>
/// <param name="channelProtoId">The proto ID of the channel. Basically the replacement color.</param>
/// <returns>The message with the color hex code replaced, if it exists.</returns>
private string ReplaceRadioChannelColorFromServer(string message, string channelProtoId)
{
if (_prototypeManager.Resolve<RadioChannelPrototype>(channelProtoId, out var channel))
{
return RadioChatColorRegex.Replace(message, $"color={channel.Color.ToHex()}");
}
return message;
}
public void ProcessChatMessage(ChatMessage msg, bool speechBubble = true)
{
// BEGIN DeltaV
// Needs to happen before ANY other color or pattern matching so that we don't screw up the other colors in the message.
if (msg.Channel == ChatChannel.Radio && msg.RadioChannelProtoId is { } channel)
{
msg.WrappedMessage = ReplaceRadioChannelColorFromServer(msg.WrappedMessage, channel);
}
// END DeltaV
// color the name unless it's something like "the old man"
if ((msg.Channel == ChatChannel.Local || msg.Channel == ChatChannel.Whisper) && _chatNameColorsEnabled)
{
@@ -12,6 +12,19 @@ namespace Content.Client._DV.AACTablet.UI;
[CommonSheetlet]
public sealed class AACSheetlet<T> : Sheetlet<T> where T : PalettedStylesheet, IButtonConfig
{
private static readonly (string StyleClass, Color Normal, Color Hover)[] SubjectButtonColors =
[
// Department colors
("CommandButton", Color.FromHex("#404A58"), Color.FromHex("#4F587B")),
("EngineeringButton", Color.FromHex("#77684B"), Color.FromHex("#776D71")),
("EpistemicsButton", Color.FromHex("#6F5973"), Color.FromHex("#71638E")),
("JusticeButton", Color.FromHex("#4F3D4C"), Color.FromHex("#5C4B5A")),
("LogisticsButton", Color.FromHex("#61503A"), Color.FromHex("#675C64")),
("MedicalButton", Color.FromHex("#49687D"), Color.FromHex("#556E95")),
("SecurityButton", Color.FromHex("#724449"), Color.FromHex("#745370")),
("ServiceButton", Color.FromHex("#607952"), Color.FromHex("#667A76")),
];
public override StyleRule[] GetRules(T sheet, object config)
{
// Create style boxes
@@ -81,6 +94,21 @@ public sealed class AACSheetlet<T> : Sheetlet<T> where T : PalettedStylesheet, I
.Prop(Control.StylePropertyModulateSelf, Color.DarkRed),
]);
SubjectColorRules(rules);
return rules.ToArray();
}
// AAC - Makes sure colors are applied to subject buttons
private static void SubjectColorRules(List<StyleRule> rules)
{
foreach (var (styleClass, normal, hover) in SubjectButtonColors)
{
rules.AddRange([
E<ContainerButton>().Class(ContainerButton.StyleClassButton).Class(styleClass)
.PseudoNormal().Prop(Control.StylePropertyModulateSelf, normal),
E<ContainerButton>().Class(ContainerButton.StyleClassButton).Class(styleClass)
.PseudoHovered().Prop(Control.StylePropertyModulateSelf, hover),
]);
}
}
}
@@ -218,7 +218,7 @@ public sealed partial class AACWindow : FancyWindow
MaxSize = new Vector2(ButtonWidth, ButtonWidth),
ClipText = false,
HorizontalExpand = true,
StyleClasses = { styleClass }
StyleClasses = { ContainerButton.StyleClassButton, styleClass }
};
var buttonLabel = new RichTextLabel
@@ -0,0 +1,87 @@
<tabs:RadioTab xmlns="https://spacestation14.io"
xmlns:tabs="clr-namespace:Content.Client._DV.Options.UI.Tabs"
xmlns:ui="clr-namespace:Content.Client.Options.UI">
<BoxContainer Orientation="Vertical">
<ScrollContainer VerticalExpand="True" HScrollEnabled="False">
<BoxContainer Orientation="Vertical" Margin="8">
<!-- Common -->
<Label Text="{Loc 'ui-options-radio-header-common'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioCommonColorSlider"
Example="{Loc 'ui-options-radio-example-common'}"/>
<Button Name="ResetCommonColorButton" Text="{Loc 'ui-options-radio-reset-common'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Command -->
<Label Text="{Loc 'ui-options-radio-header-command'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioCommandColorSlider"
Example="{Loc 'ui-options-radio-example-command'}"/>
<Button Name="ResetCommandColorButton" Text="{Loc 'ui-options-radio-reset-command'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Security -->
<Label Text="{Loc 'ui-options-radio-header-security'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioSecurityColorSlider"
Example="{Loc 'ui-options-radio-example-security'}"/>
<Button Name="ResetSecurityColorButton" Text="{Loc 'ui-options-radio-reset-security'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Medical -->
<Label Text="{Loc 'ui-options-radio-header-medical'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioMedicalColorSlider"
Example="{Loc 'ui-options-radio-example-medical'}"/>
<Button Name="ResetMedicalColorButton" Text="{Loc 'ui-options-radio-reset-medical'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Engineering -->
<Label Text="{Loc 'ui-options-radio-header-engineering'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioEngineeringColorSlider"
Example="{Loc 'ui-options-radio-example-engineering'}"/>
<Button Name="ResetEngineeringColorButton" Text="{Loc 'ui-options-radio-reset-engineering'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Science -->
<Label Text="{Loc 'ui-options-radio-header-science'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioScienceColorSlider"
Example="{Loc 'ui-options-radio-example-science'}"/>
<Button Name="ResetScienceColorButton" Text="{Loc 'ui-options-radio-reset-science'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Cargo -->
<Label Text="{Loc 'ui-options-radio-header-cargo'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioCargoColorSlider"
Example="{Loc 'ui-options-radio-example-cargo'}"/>
<Button Name="ResetCargoColorButton" Text="{Loc 'ui-options-radio-reset-cargo'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Service -->
<Label Text="{Loc 'ui-options-radio-header-service'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioServiceColorSlider"
Example="{Loc 'ui-options-radio-example-service'}"/>
<Button Name="ResetServiceColorButton" Text="{Loc 'ui-options-radio-reset-service'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Binary -->
<Label Text="{Loc 'ui-options-radio-header-binary'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioBinaryColorSlider"
Example="{Loc 'ui-options-radio-example-binary'}"/>
<Button Name="ResetBinaryColorButton" Text="{Loc 'ui-options-radio-reset-binary'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- DeltaV - Justice -->
<Label Text="{Loc 'ui-options-radio-header-justice'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioJusticeColorSlider"
Example="{Loc 'ui-options-radio-example-justice'}"/>
<Button Name="ResetJusticeColorButton" Text="{Loc 'ui-options-radio-reset-justice'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- DeltaV - Prison -->
<Label Text="{Loc 'ui-options-radio-header-prison'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioPrisonColorSlider"
Example="{Loc 'ui-options-radio-example-prison'}"/>
<Button Name="ResetPrisonColorButton" Text="{Loc 'ui-options-radio-reset-prison'}" MaxWidth="300" Margin="0 4 0 0" />
</BoxContainer>
</ScrollContainer>
<ui:OptionsTabControlRow Name="Control" Access="Public" />
</BoxContainer>
</tabs:RadioTab>
@@ -0,0 +1,55 @@
using Content.Client.Options.UI;
using Content.Shared._DV.CCVars;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
namespace Content.Client._DV.Options.UI.Tabs;
[GenerateTypedNameReferences]
public sealed partial class RadioTab : Control
{
[Dependency] private readonly IConfigurationManager _config = default!; // DeltaV
public RadioTab()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
// Having so many color sliders on one page is a lot. We should only really try
// to have common/departmental channels here, or it just becomes WAAAAY too much.
Control.AddOptionColorSlider(DCCVars.RadioColorCommon, RadioCommonColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorCommand, RadioCommandColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorSecurity, RadioSecurityColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorMedical, RadioMedicalColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorEngineering, RadioEngineeringColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorScience, RadioScienceColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorCargo, RadioCargoColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorService, RadioServiceColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorBinary, RadioBinaryColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorJustice, RadioJusticeColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorPrison, RadioPrisonColorSlider);
ResetCommonColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorCommon);
ResetCommandColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorCommand);
ResetSecurityColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorSecurity);
ResetMedicalColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorMedical);
ResetEngineeringColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorEngineering);
ResetScienceColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorScience);
ResetCargoColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorCargo);
ResetServiceColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorService);
ResetBinaryColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorBinary);
ResetJusticeColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorJustice);
ResetPrisonColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorPrison);
Control.Initialize();
}
private void OnResetColorButton(CVarDef<string> cvar)
{
_config.SetCVar(cvar, cvar.DefaultValue);
Control.ReloadValues();
}
}
@@ -0,0 +1,49 @@
using Content.Shared._DV.CCVars;
using Content.Shared.Radio;
using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
namespace Content.Client._DV.Radio;
public sealed partial class RadioChannelColorSystem : EntitySystem
{
[Dependency] private readonly IConfigurationManager _config = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
// Feels like there should be a better way to do this but I'd rather not add a client-side cvar ID or reference
// to a prototype in Content.Shared, since I don't want people thinking they can ever use it on the server-side.
private static readonly ProtoId<RadioChannelPrototype> CommonChannelProto = "Common";
private static readonly ProtoId<RadioChannelPrototype> CommandChannelProto = "Command";
private static readonly ProtoId<RadioChannelPrototype> SecurityChannelProto = "Security";
private static readonly ProtoId<RadioChannelPrototype> MedicalChannelProto = "Medical";
private static readonly ProtoId<RadioChannelPrototype> EngineeringChannelProto = "Engineering";
private static readonly ProtoId<RadioChannelPrototype> ScienceChannelProto = "Science";
private static readonly ProtoId<RadioChannelPrototype> CargoChannelProto = "Supply";
private static readonly ProtoId<RadioChannelPrototype> ServiceChannelProto = "Service";
private static readonly ProtoId<RadioChannelPrototype> BinaryChannelProto = "Binary";
private static readonly ProtoId<RadioChannelPrototype> JusticeChannelProto = "Justice";
private static readonly ProtoId<RadioChannelPrototype> PrisonChannelProto = "Prison";
public override void Initialize()
{
base.Initialize();
_config.OnValueChanged(DCCVars.RadioColorCommon, (value) => { SetChannelColor(CommonChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorCommand, (value) => { SetChannelColor(CommandChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorSecurity, (value) => { SetChannelColor(SecurityChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorMedical, (value) => { SetChannelColor(MedicalChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorEngineering, (value) => { SetChannelColor(EngineeringChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorScience, (value) => { SetChannelColor(ScienceChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorCargo, (value) => { SetChannelColor(CargoChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorService, (value) => { SetChannelColor(ServiceChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorBinary, (value) => { SetChannelColor(BinaryChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorJustice, (value) => { SetChannelColor(JusticeChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorPrison, (value) => { SetChannelColor(PrisonChannelProto, value); }, true);
}
private void SetChannelColor(ProtoId<RadioChannelPrototype> channel, string newColor)
{
if (Color.TryParse(newColor, out var color))
_proto.Index(channel).Color = color;
}
}
@@ -108,6 +108,70 @@ public sealed partial class TraitCategory : BoxContainer
{
CategoryPointsLabel.Visible = false;
}
// Lock unselected entries whenever the category cap is reached so the
// player gets a clear visual cue instead of silently failing to equip.
UpdateCategoryFullState();
}
/// <summary>
/// Propagates category-cap lock state to every entry.
/// <para>
/// Selected entries are never locked - they are the traits filling the cap
/// and must stay interactive so the player can deselect them.
/// </para>
/// <para>
/// Unselected entries are locked when:
/// <list type="bullet">
/// <item><see cref="TraitCategoryPrototype.MaxTraits"/> is defined and already reached, OR</item>
/// <item><see cref="TraitCategoryPrototype.MaxPoints"/> is defined and this specific
/// trait's cost would push spending over the limit.</item>
/// </list>
/// </para>
/// </summary>
private void UpdateCategoryFullState()
{
var traitCapReached = _category.MaxTraits.HasValue && SelectedCount >= _category.MaxTraits.Value;
foreach (var (_, entry) in _traitEntries)
{
if (entry.IsSelected)
{
// Selected traits are never locked by category state.
entry.SetLockedByCategory(false);
continue;
}
var locked = traitCapReached;
// Even when the trait count cap hasn't been hit, lock this specific entry
// if adding its cost would exceed the category's point budget.
if (!locked && _category.MaxPoints.HasValue)
locked = PointsSpent + entry.TraitCost > _category.MaxPoints.Value;
entry.SetLockedByCategory(locked);
}
}
/// <summary>
/// Called by <see cref="TraitsTab"/> whenever the player's global point budget changes.
/// Locks any unselected entry whose cost the player can no longer afford.
/// <para>
/// Free (0-cost) and negative-cost traits are never locked - they cost nothing or
/// actually give points back. Selected traits are also never locked here; they
/// were affordable when picked and must stay interactive to be deselected.
/// </para>
/// </summary>
public void UpdateGlobalPointsLock(int remainingPoints)
{
foreach (var (_, entry) in _traitEntries)
{
// A selected trait is always unlocked here - same reasoning as category cap:
// it was paid for at selection time and must stay interactive.
// Traits that cost nothing or give points back are never locked by budget.
var shouldLock = !entry.IsSelected && entry.TraitCost > remainingPoints;
entry.SetLockedByPoints(shouldLock);
}
}
public void SetTraitSelected(ProtoId<TraitPrototype> traitId, bool selected)
@@ -171,11 +235,11 @@ public sealed partial class TraitCategory : BoxContainer
/// Updates condition states for all trait entries based on current job/species.
/// Traits that don't meet conditions are disabled but still visible.
/// </summary>
public void UpdateConditions(ProtoId<JobPrototype>? jobId, ProtoId<SpeciesPrototype>? speciesId, IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences)
public void UpdateConditions(ProtoId<JobPrototype>? jobId, ProtoId<SpeciesPrototype>? speciesId, IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences, IReadOnlySet<ProtoId<TraitPrototype>>? selectedTraits)
{
foreach (var (_, entry) in _traitEntries)
{
entry.UpdateConditionsMet(jobId, speciesId, antagPreferences);
entry.UpdateConditionsMet(jobId, speciesId, antagPreferences, selectedTraits);
}
// Update stats since some traits may have been deselected
+160 -39
View File
@@ -27,6 +27,9 @@ public sealed partial class TraitEntry : PanelContainer
private bool _isUpdating;
private readonly List<string> _failedConditionTooltips = new();
private bool _isLockedByCategory;
private bool _isLockedByPoints;
public TraitEntry(TraitPrototype trait)
{
RobustXamlLoader.Load(this);
@@ -59,9 +62,17 @@ public sealed partial class TraitEntry : PanelContainer
foreach (var condition in _trait.Conditions)
{
var tooltip = condition.GetTooltip(_prototype, _loc);
if (!string.IsNullOrEmpty(tooltip))
tooltips.Add(tooltip);
if (condition is TraitDependencyCondition depCond)
{
// Use GetTooltips() to get individual lines without duplication
tooltips.AddRange(depCond.GetTooltips(_prototype, _loc));
}
else
{
var tooltip = condition.GetTooltip(_prototype, _loc);
if (!string.IsNullOrEmpty(tooltip))
tooltips.Add(tooltip);
}
}
if (tooltips.Count > 0)
@@ -91,39 +102,92 @@ public sealed partial class TraitEntry : PanelContainer
/// <summary>
/// Updates whether conditions are met based on current job/species.
/// </summary>
public void UpdateConditionsMet(ProtoId<JobPrototype>? jobId, ProtoId<SpeciesPrototype>? speciesId, IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences)
public void UpdateConditionsMet(
ProtoId<JobPrototype>? jobId,
ProtoId<SpeciesPrototype>? speciesId,
IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences,
IReadOnlySet<ProtoId<TraitPrototype>>? selectedTraits)
{
_failedConditionTooltips.Clear();
MeetsConditions = true;
foreach (var condition in _trait.Conditions)
{
var result = condition switch
{
IsSpeciesCondition speciesCond => CheckSpeciesCondition(speciesCond, speciesId),
HasJobCondition jobCond => CheckJobCondition(jobCond, jobId),
InDepartmentCondition deptCond => CheckDepartmentCondition(deptCond, jobId),
HasCompCondition compCond => !compCond.Invert, // can't check in lobby but screws with the inversion logic
IsAntagEligibleCondition antagEligibleCond => CheckAntagEligibleCondition(antagEligibleCond, antagPreferences),
AnyOfCondition anyOfCond => CheckAnyOfCondition(anyOfCond, jobId, speciesId, antagPreferences),
_ => true,
};
bool result;
// Apply inversion
result ^= condition.Invert;
if (condition is TraitDependencyCondition depCond)
{
result = CheckDependencyCondition(depCond, selectedTraits);
// CheckDependencyCondition adds its own tooltips directly
}
else
{
result = condition switch
{
IsSpeciesCondition speciesCond => CheckSpeciesCondition(speciesCond, speciesId),
HasJobCondition jobCond => CheckJobCondition(jobCond, jobId),
InDepartmentCondition deptCond => CheckDepartmentCondition(deptCond, jobId),
HasCompCondition compCond => !compCond.Invert, // can't check in lobby
IsAntagEligibleCondition antagEligibleCond => CheckAntagEligibleCondition(antagEligibleCond, antagPreferences),
AnyOfCondition anyOfCond => CheckAnyOfCondition(anyOfCond, jobId, speciesId, antagPreferences, selectedTraits),
_ => true,
};
// Apply inversion for non-dependency conditions
result ^= condition.Invert;
if (!result)
{
var tooltip = condition.GetTooltip(_prototype, _loc);
if (!string.IsNullOrEmpty(tooltip))
_failedConditionTooltips.Add(tooltip);
}
}
if (!result)
{
MeetsConditions = false;
var tooltip = condition.GetTooltip(_prototype, _loc);
if (!string.IsNullOrEmpty(tooltip))
_failedConditionTooltips.Add(tooltip);
}
}
UpdateDisabledState();
}
/// <summary>
/// Checks a TraitDependencyCondition and adds failure tooltips directly.
/// Returns true if the condition passes.
/// </summary>
private bool CheckDependencyCondition(TraitDependencyCondition condition, IReadOnlySet<ProtoId<TraitPrototype>>? selectedTraits)
{
var passed = true;
foreach (var conflict in condition.Conflicts)
{
if (selectedTraits == null || !selectedTraits.Contains(conflict))
continue;
if (_prototype.TryIndex(conflict, out var conflictProto))
{
_failedConditionTooltips.Add(_loc.GetString("trait-condition-trait-conflict",
("trait", _loc.GetString(conflictProto.Name))));
}
passed = false;
}
foreach (var required in condition.Requires)
{
if (selectedTraits != null && selectedTraits.Contains(required))
continue;
if (_prototype.TryIndex(required, out var requiredProto))
{
_failedConditionTooltips.Add(_loc.GetString("trait-condition-trait-required",
("trait", _loc.GetString(requiredProto.Name))));
}
passed = false;
}
return passed;
}
private bool CheckSpeciesCondition(IsSpeciesCondition condition, ProtoId<SpeciesPrototype>? speciesId)
{
if (!_prototype.TryIndex(speciesId, out var species))
@@ -159,7 +223,12 @@ public sealed partial class TraitEntry : PanelContainer
return antagPreferences.Contains(condition.Antag);
}
private bool CheckAnyOfCondition(AnyOfCondition condition, ProtoId<JobPrototype>? jobId, ProtoId<SpeciesPrototype>? speciesId, IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences)
private bool CheckAnyOfCondition(
AnyOfCondition condition,
ProtoId<JobPrototype>? jobId,
ProtoId<SpeciesPrototype>? speciesId,
IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences,
IReadOnlySet<ProtoId<TraitPrototype>>? selectedTraits)
{
if (condition.Conditions.Count == 0)
return false;
@@ -167,19 +236,27 @@ public sealed partial class TraitEntry : PanelContainer
// Return true if ANY child condition evaluates to true
foreach (var childCondition in condition.Conditions)
{
var result = childCondition switch
{
IsSpeciesCondition speciesCond => CheckSpeciesCondition(speciesCond, speciesId),
HasJobCondition jobCond => CheckJobCondition(jobCond, jobId),
InDepartmentCondition deptCond => CheckDepartmentCondition(deptCond, jobId),
HasCompCondition compCond => !compCond.Invert, // can't check in lobby
AnyOfCondition nestedAnyOf => CheckAnyOfCondition(nestedAnyOf, jobId, speciesId, antagPreferences), // Recursive!
IsAntagEligibleCondition antagEligibleCond => CheckAntagEligibleCondition(antagEligibleCond, antagPreferences),
_ => true,
};
bool result;
// Apply child's inversion
result ^= childCondition.Invert;
if (childCondition is TraitDependencyCondition depCond)
{
result = CheckDependencyCondition(depCond, selectedTraits);
}
else
{
result = childCondition switch
{
IsSpeciesCondition speciesCond => CheckSpeciesCondition(speciesCond, speciesId),
HasJobCondition jobCond => CheckJobCondition(jobCond, jobId),
InDepartmentCondition deptCond => CheckDepartmentCondition(deptCond, jobId),
HasCompCondition compCond => !compCond.Invert, // can't check in lobby
IsAntagEligibleCondition antagEligibleCond => CheckAntagEligibleCondition(antagEligibleCond, antagPreferences),
AnyOfCondition nestedAnyOf => CheckAnyOfCondition(nestedAnyOf, jobId, speciesId, antagPreferences, selectedTraits),
_ => true,
};
result ^= childCondition.Invert;
}
// If any child passes, the AnyOf passes
if (result)
@@ -190,16 +267,50 @@ public sealed partial class TraitEntry : PanelContainer
return false;
}
/// <summary>
/// Called by <see cref="TraitCategory"/> whenever the category's trait or
/// points-cap state changes. Locking only applies to <em>unselected</em>
/// entries - the selected traits are the ones filling the cap and must
/// remain interactive so the player can deselect them.
/// </summary>
public void SetLockedByCategory(bool locked)
{
if (_isLockedByCategory == locked)
return;
_isLockedByCategory = locked;
UpdateDisabledState();
}
/// <summary>
/// Called by <see cref="TraitCategory"/> whenever the player's global point budget
/// changes. Locks unselected entries whose cost the player can no longer afford.
/// Free (0-cost) and negative-cost traits are never locked by this.
/// </summary>
public void SetLockedByPoints(bool locked)
{
if (_isLockedByPoints == locked)
return;
_isLockedByPoints = locked;
UpdateDisabledState();
}
private void UpdateDisabledState()
{
if (!MeetsConditions)
var isSelected = TraitCheckbox.Pressed;
var conditionLocked = !MeetsConditions;
var categoryLocked = _isLockedByCategory && !isSelected;
var pointsLocked = _isLockedByPoints && !isSelected;
var isDisabled = conditionLocked || categoryLocked || pointsLocked;
if (isDisabled)
{
// Hide checkbox, show lock icon
TraitCheckbox.Visible = false;
LockIcon.Visible = true;
// Deselect if conditions no longer met
if (TraitCheckbox.Pressed)
if (isSelected && conditionLocked)
{
_isUpdating = true;
TraitCheckbox.Pressed = false;
@@ -211,14 +322,24 @@ public sealed partial class TraitEntry : PanelContainer
// Add disabled styling
AddStyleClass("TraitsEntryDisabled");
// Update tooltip to show failed conditions
if (_failedConditionTooltips.Count > 0)
// Tooltip priority for conditions: condition failures > category full > insufficient points.
if (conditionLocked && _failedConditionTooltips.Count > 0)
{
var tooltipText = Loc.GetString("trait-conditions-not-met-tooltip",
("requirements", string.Join("\n", _failedConditionTooltips)));
TooltipSupplier = _ => CreateMarkupTooltip(tooltipText);
}
else if (categoryLocked)
{
var tooltipText = Loc.GetString("trait-category-full-tooltip");
TooltipSupplier = _ => CreateMarkupTooltip(tooltipText);
}
else if (pointsLocked)
{
var tooltipText = Loc.GetString("trait-insufficient-points-tooltip");
TooltipSupplier = _ => CreateMarkupTooltip(tooltipText);
}
}
else
{
+18 -8
View File
@@ -154,14 +154,18 @@ public sealed partial class TraitsTab : BoxContainer
}
}
// Check conflicts
foreach (var conflict in trait.Conflicts)
// Check conflicts via TraitDependencyCondition
var depCondition = trait.Conditions.OfType<Content.Shared._DV.Traits.Conditions.TraitDependencyCondition>().FirstOrDefault();
if (depCondition != null)
{
if (!_selectedTraits.Contains(conflict))
continue;
foreach (var conflict in depCondition.Conflicts)
{
if (!_selectedTraits.Contains(conflict))
continue;
RevertTraitToggle(traitId);
return;
RevertTraitToggle(traitId);
return;
}
}
_selectedTraits.Add(traitId);
@@ -176,6 +180,7 @@ public sealed partial class TraitsTab : BoxContainer
}
UpdateGlobalStats();
UpdateAllConditions();
UpdateCategoryStats(trait.Category);
OnTraitsChanged?.Invoke(_selectedTraits);
}
@@ -211,7 +216,7 @@ public sealed partial class TraitsTab : BoxContainer
// If parent width is 0 (not laid out yet), defer until layout happens
if (parentWidth > 0)
{
GlobalPointsBar.SetWidth = (int)((parentWidth - 2 ) * percentage);
GlobalPointsBar.SetWidth = (int)((parentWidth - 2) * percentage);
_awaitingLayoutUpdate = false;
}
else if (!_awaitingLayoutUpdate)
@@ -235,6 +240,11 @@ public sealed partial class TraitsTab : BoxContainer
> 0f => "TraitsProgressBarLow",
_ => "TraitsProgressBarEmpty"
});
foreach (var (_, categoryUi) in _categoryUis)
{
categoryUi.UpdateGlobalPointsLock(remainingPoints);
}
}
private void OnProgressBarParentResized()
@@ -281,7 +291,7 @@ public sealed partial class TraitsTab : BoxContainer
foreach (var (_, categoryUi) in _categoryUis)
{
// If some fork wants to use the top selected job as well, just add that to the UpdateConditions method in the editor
categoryUi.UpdateConditions(null, _profile?.Species, _profile?.AntagPreferences);
categoryUi.UpdateConditions(null, _profile?.Species, _profile?.AntagPreferences, _selectedTraits);
}
RecalculateStats();
@@ -6,6 +6,7 @@ using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
using Robust.Shared.Player; // DeltaV
namespace Content.Server.AlertLevel;
@@ -191,7 +192,8 @@ public sealed class AlertLevelSystem : EntitySystem
{
if (detail.Sound != null)
{
var filter = _stationSystem.GetInOwningStation(station);
//var filter = _stationSystem.GetInOwningStation(station); // DeltaV - Global Annoucements
var filter = Filter.Empty().AddAllPlayers(); // DeltaV - Global Annoucements
_audio.PlayGlobal(detail.Sound, filter, true, detail.Sound.Params);
}
else
@@ -202,7 +204,7 @@ public sealed class AlertLevelSystem : EntitySystem
if (announce)
{
_chatSystem.DispatchStationAnnouncement(station, announcementFull, playDefaultSound: playDefault,
_chatSystem.DispatchGlobalAnnouncement(announcementFull, playSound: playDefault, // DeltaV - Global Annoucements
colorOverride: detail.Color, sender: stationName);
}
@@ -7,7 +7,7 @@ using Robust.Shared.Player;
namespace Content.Server.Audio;
public sealed class ServerGlobalSoundSystem : SharedGlobalSoundSystem
public sealed partial class ServerGlobalSoundSystem : SharedGlobalSoundSystem // DeltaV - Made Partial
{
[Dependency] private readonly IConsoleHost _conHost = default!;
[Dependency] private readonly StationSystem _stationSystem = default!;
+9 -9
View File
@@ -327,15 +327,15 @@ public sealed class NukeSystem : EntitySystem
// should play
if (nuke.RemainingTime <= _nukeSongLength + nuke.AlertSoundTime + NukeSongBuffer && !nuke.PlayedNukeSong && !ResolvedSoundSpecifier.IsNullOrEmpty(_selectedNukeSong))
{
_sound.DispatchStationEventMusic(uid, _selectedNukeSong, StationEventMusicType.Nuke);
_sound.DispatchGlobalEventMusic(_selectedNukeSong, StationEventMusicType.Nuke); // DeltaV - Global Nuke Music
nuke.PlayedNukeSong = true;
}
// play alert sound if time is running out
if (nuke.RemainingTime <= nuke.AlertSoundTime && !nuke.PlayedAlertSound)
{
_sound.PlayGlobalOnStation(uid, _audio.ResolveSound(nuke.AlertSound), new AudioParams{Volume = -5f});
_sound.StopStationEventMusic(uid, StationEventMusicType.Nuke);
_sound.PlayGlobal(_audio.ResolveSound(nuke.AlertSound), new AudioParams { Volume = -5f }); // DeltaV - Global Nuke SFX
_sound.StopGlobalEventMusic(StationEventMusicType.Nuke); // DeltaV - Global Nuke Music
nuke.PlayedAlertSound = true;
UpdateAppearance(uid, nuke);
}
@@ -504,9 +504,9 @@ public sealed class NukeSystem : EntitySystem
("time", (int) component.RemainingTime),
("location", FormattedMessage.RemoveMarkupOrThrow(_navMap.GetNearestBeaconString((uid, nukeXform)))));
var sender = Loc.GetString("nuke-component-announcement-sender");
_chatSystem.DispatchStationAnnouncement(stationUid ?? uid, announcement, sender, false, null, Color.Red);
_chatSystem.DispatchGlobalAnnouncement(announcement, sender, false, null, Color.Red); // DeltaV - Global Nuke Annoucement
_sound.PlayGlobalOnStation(uid, _audio.ResolveSound(component.ArmSound));
_sound.PlayGlobal(_audio.ResolveSound(component.ArmSound)); // DeltaV - Global Nuke Music
_nukeSongLength = (float) _audio.GetAudioLength(_selectedNukeSong).TotalSeconds;
// turn on the spinny light
@@ -544,11 +544,11 @@ public sealed class NukeSystem : EntitySystem
// warn a crew
var announcement = Loc.GetString("nuke-component-announcement-unarmed");
var sender = Loc.GetString("nuke-component-announcement-sender");
_chatSystem.DispatchStationAnnouncement(uid, announcement, sender, false);
_chatSystem.DispatchGlobalAnnouncement(announcement, sender, false); // DeltaV - Global Nuke Announcement
component.PlayedNukeSong = false;
_sound.PlayGlobalOnStation(uid, _audio.ResolveSound(component.DisarmSound));
_sound.StopStationEventMusic(uid, StationEventMusicType.Nuke);
_sound.PlayGlobal(_audio.ResolveSound(component.DisarmSound)); // DeltaV - Global Nuke SFX
_sound.StopGlobalEventMusic(StationEventMusicType.Nuke); // DeltaV - Global Nuke Music
// reset nuke remaining time to either itself or the minimum time, whichever is higher
component.RemainingTime = Math.Max(component.RemainingTime, component.MinimumTime);
@@ -610,7 +610,7 @@ public sealed class NukeSystem : EntitySystem
OwningStation = transform.GridUid,
});
_sound.StopStationEventMusic(uid, StationEventMusicType.Nuke);
_sound.StopGlobalEventMusic(StationEventMusicType.Nuke); // DeltaV - Global Nuke Music
Del(uid);
}
@@ -157,7 +157,8 @@ public sealed class RadioSystem : EntitySystem
message,
wrappedMessage,
NetEntity.Invalid,
null);
null,
radioChannelProto: channel.ID); // DeltaV - Add RadioChannel for committing sins
var chatMsg = new MsgChatMessage { Message = chat };
var ev = new RadioReceiveEvent(message, messageSource, channel, radioSource, chatMsg);
@@ -209,7 +210,7 @@ public sealed class RadioSystem : EntitySystem
}
/// <inheritdoc cref="TelecomServerComponent"/>
private bool HasActiveServer(MapId mapId, string channelId)
public bool HasActiveServer(MapId mapId, string channelId) // DeltaV - we need this
{
var servers = EntityQuery<TelecomServerComponent, EncryptionKeyHolderComponent, ApcPowerReceiverComponent, TransformComponent>();
foreach (var (_, keys, power, transform) in servers)
@@ -0,0 +1,73 @@
using Content.Shared.Audio;
using Robust.Shared.Audio;
using Robust.Shared.Player;
using Robust.Shared.Map;
namespace Content.Server.Audio;
/// <summary>
/// Extends upstream's Content.Server/Audio/ServerGlobalSoundSystem.cs.
/// </summary>
public sealed partial class ServerGlobalSoundSystem
{
/// <summary>
/// DeltaV - Plays a sound globally for all players, no matter where they are.
/// </summary>
/// <param name="specifier"></param>
/// <param name="audioParams"></param>
public void PlayGlobal(ResolvedSoundSpecifier specifier, AudioParams? audioParams = null)
{
var msg = new GameGlobalSoundEvent(specifier, audioParams);
RaiseNetworkEvent(msg);
}
public void StopGlobalEventMusic(StationEventMusicType type)
{
var msg = new StopStationEventMusic(type);
RaiseNetworkEvent(msg);
}
public void DispatchGlobalEventMusic(SoundSpecifier sound, StationEventMusicType type)
{
DispatchGlobalEventMusic(_audio.ResolveSound(sound), type);
}
public void DispatchGlobalEventMusic(ResolvedSoundSpecifier specifier, StationEventMusicType type)
{
var audio = AudioParams.Default.WithVolume(-8);
var msg = new StationEventMusicEvent(specifier, type, audio);
RaiseNetworkEvent(msg);
}
/// <summary>
/// DeltaV - Plays a sound globally for all players on a specified Map.
/// </summary>
/// <param name="specifier"></param>
/// <param name="audioParams"></param>
public void PlayGlobalOnMap(MapId map, ResolvedSoundSpecifier specifier, AudioParams? audioParams = null)
{
var msg = new GameGlobalSoundEvent(specifier, audioParams);
var filter = Filter.Empty().AddInMap(map);
RaiseNetworkEvent(msg, filter);
}
public void StopMapEventMusic(MapId map, StationEventMusicType type)
{
var msg = new StopStationEventMusic(type);
var filter = Filter.Empty().AddInMap(map);
RaiseNetworkEvent(msg, filter);
}
public void DispatchMapEventMusic(MapId map, SoundSpecifier sound, StationEventMusicType type)
{
DispatchMapEventMusic(map, _audio.ResolveSound(sound), type);
}
public void DispatchMapEventMusic(MapId map, ResolvedSoundSpecifier specifier, StationEventMusicType type)
{
var audio = AudioParams.Default.WithVolume(-8);
var msg = new StationEventMusicEvent(specifier, type, audio);
var filter = Filter.Empty().AddInMap(map);
RaiseNetworkEvent(msg, filter);
}
}
@@ -6,12 +6,6 @@ namespace Content.Server._DV.CartridgeLoader.Cartridges;
[RegisterComponent, Access(typeof(NanoChatCartridgeSystem))]
public sealed partial class NanoChatCartridgeComponent : Component
{
/// <summary>
/// Station entity to keep track of.
/// </summary>
[DataField]
public EntityUid? Station;
/// <summary>
/// The NanoChat card to keep track of.
/// </summary>
@@ -2,9 +2,8 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Server.Administration.Logs;
using Content.Server.CartridgeLoader;
using Content.Server.Power.Components;
using Content.Server.Radio;
using Content.Server.Station.Systems;
using Content.Server.Radio.EntitySystems;
using Content.Shared.Access.Components;
using Content.Shared.CartridgeLoader;
using Content.Shared.CCVar;
@@ -30,7 +29,7 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly SharedNanoChatSystem _nanoChat = default!;
[Dependency] private readonly SharedUserInterfaceSystem _ui = default!;
[Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly RadioSystem _radio = default!;
private EntityQuery<PdaComponent> _pdaQuery;
private EntityQuery<NanoChatCardComponent> _cardQuery;
@@ -456,9 +455,7 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
{
// First verify we can send from this device
var channel = _prototype.Index(sender.Comp.RadioChannel);
var sendAttemptEvent = new RadioSendAttemptEvent(channel, sender);
RaiseLocalEvent(ref sendAttemptEvent);
if (sendAttemptEvent.Cancelled)
if (!CanSend(sender))
return (true, new List<Entity<NanoChatCardComponent>>());
var foundRecipients = new List<Entity<NanoChatCardComponent>>();
@@ -487,26 +484,19 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
if (receiverCart.Card != recipient.Owner)
continue;
// Check if devices are on same station/map
var recipientStation = _station.GetOwningStation(receiverUid);
var senderStation = _station.GetOwningStation(sender);
var receiverMapId = Transform(receiverUid).MapID;
var senderMapId = Transform(sender).MapID;
// Both entities must be on a station
if (recipientStation == null || senderStation == null)
// Must be on the same map unless long range is allowed.
if (!channel.LongRange && receiverMapId != senderMapId)
continue;
// Must be on same map/station unless long range allowed
if (!channel.LongRange && recipientStation != senderStation)
continue;
// Needs telecomms
if (!HasActiveServer(senderStation.Value) || !HasActiveServer(recipientStation.Value))
// Check if telecommunications are active on both ends
if (!_radio.HasActiveServer(receiverMapId, receiverCart.RadioChannel) || !_radio.HasActiveServer(senderMapId, sender.Comp.RadioChannel))
continue;
// Check if recipient can receive
var receiveAttemptEv = new RadioReceiveAttemptEvent(channel, sender, receiverUid);
RaiseLocalEvent(ref receiveAttemptEv);
if (receiveAttemptEv.Cancelled)
if (!CanReceive(sender, receiverUid))
continue;
// Found valid cartridge that can receive
@@ -519,21 +509,26 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
}
/// <summary>
/// Checks if there are any active telecomms servers on the given station
/// Tests if a NanoChat cartridge can send messages
/// </summary>
private bool HasActiveServer(EntityUid station)
/// <param name="sender">The NanoChat cartridge trying to send</param>
private bool CanSend(Entity<NanoChatCartridgeComponent> sender)
{
// I have no idea why this isn't public in the RadioSystem
var query =
EntityQueryEnumerator<TelecomServerComponent, EncryptionKeyHolderComponent, ApcPowerReceiverComponent>();
var sendAttemptEvent = new RadioSendAttemptEvent(_prototype.Index(sender.Comp.RadioChannel), sender);
RaiseLocalEvent(ref sendAttemptEvent);
return !sendAttemptEvent.Cancelled;
}
while (query.MoveNext(out var uid, out _, out _, out var power))
{
if (_station.GetOwningStation(uid) == station && power.Powered)
return true;
}
return false;
/// <summary>
/// Tests if a receiver can receive from a given NanoChat cartridge
/// </summary>
/// <param name="sender">The NanoChat cartridge trying to send</param>
/// <param name="receiver">The receiver cartridge trying to receive</param>
private bool CanReceive(Entity<NanoChatCartridgeComponent> sender, EntityUid receiver)
{
var receiveAttemptEv = new RadioReceiveAttemptEvent(_prototype.Index(sender.Comp.RadioChannel), sender, receiver);
RaiseLocalEvent(ref receiveAttemptEv);
return !receiveAttemptEv.Cancelled;
}
/// <summary>
@@ -688,16 +683,15 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
private void UpdateUI(Entity<NanoChatCartridgeComponent> ent, EntityUid loader)
{
List<NanoChatRecipient>? contacts;
if (_station.GetOwningStation(loader) is { } station)
{
ent.Comp.Station = station;
if (CanSend(ent) && _radio.HasActiveServer(Transform(ent).MapID, ent.Comp.RadioChannel))
{
contacts = [];
var query = AllEntityQuery<NanoChatCardComponent, IdCardComponent>();
while (query.MoveNext(out var entityId, out var nanoChatCard, out var idCardComponent))
{
if (nanoChatCard.ListNumber && nanoChatCard.Number is uint nanoChatNumber && idCardComponent.FullName is string fullName && _station.GetOwningStation(entityId) == station)
if (nanoChatCard.ListNumber && nanoChatCard.Number is uint nanoChatNumber && idCardComponent.FullName is string fullName)
{
contacts.Add(new NanoChatRecipient(nanoChatNumber, fullName));
}
@@ -706,7 +700,7 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
var borgQuery = AllEntityQuery<NanoChatCardComponent, BorgChassisComponent>();
while (borgQuery.MoveNext(out var borgId, out var borgChatCard, out var _))
{
if (borgChatCard.ListNumber && borgChatCard.Number is uint nanoChatNumber && _station.GetOwningStation(borgId) == station)
if (borgChatCard.ListNumber && borgChatCard.Number is uint nanoChatNumber)
{
contacts.Add(new NanoChatRecipient(nanoChatNumber, MetaData(borgId).EntityName));
}
@@ -715,7 +709,7 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
var aiQuery = AllEntityQuery<NanoChatCardComponent, StationAiHeldComponent>();
while (aiQuery.MoveNext(out var aiId, out var aiChatCard, out var _))
{
if (aiChatCard.ListNumber && aiChatCard.Number is uint nanoChatNumber && _station.GetOwningStation(aiId) == station)
if (aiChatCard.ListNumber && aiChatCard.Number is uint nanoChatNumber)
{
contacts.Add(new NanoChatRecipient(nanoChatNumber, MetaData(aiId).EntityName));
}
@@ -521,7 +521,7 @@ public sealed class CosmicCultRuleSystem : GameRuleSystem<CosmicCultRuleComponen
{
finComp.CurrentState = FinaleState.Unavailable;
_popup.PopupCoordinates(Loc.GetString("cosmiccult-monument-powerdown"), Transform(gameruleMonument).Coordinates, PopupType.Large);
_sound.StopStationEventMusic(gameruleMonument, StationEventMusicType.CosmicCult);
_sound.StopGlobalEventMusic(StationEventMusicType.CosmicCult);
_monument.UpdateMonumentAppearance(gameruleMonument, false);
}
@@ -82,11 +82,9 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem
_corrupting.SetCorruptionTime((uid, corruptingComp), TimeSpan.FromSeconds(1));
_appearance.SetData(uid, MonumentVisuals.FinaleReached, 2);
_sound.DispatchStationEventMusic(uid, comp.SelectedSong, StationEventMusicType.CosmicCult);
_chatSystem.DispatchStationAnnouncement(uid,
Loc.GetString("cosmiccult-finale-location", ("location", indicatedLocation)),
null, false, null,
Color.FromHex("#cae8e8"));
_sound.DispatchGlobalEventMusic(comp.SelectedSong, StationEventMusicType.CosmicCult);
_chatSystem.DispatchGlobalAnnouncement(Loc.GetString("cosmiccult-finale-location", ("location", indicatedLocation)),
null, false, null, Color.FromHex("#cae8e8"));
var stationUid = _station.GetStationInMap(Transform(uid).MapID);
if (stationUid != null)
@@ -128,8 +126,8 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem
if (stationUid != null)
_alert.SetLevel(stationUid.Value, "green", true, true, true);
_sound.PlayGlobalOnStation(uid, _audio.ResolveSound(comp.CancelEventSound));
_sound.StopStationEventMusic(uid, StationEventMusicType.CosmicCult);
_sound.PlayGlobal(_audio.ResolveSound(comp.CancelEventSound));
_sound.StopGlobalEventMusic(StationEventMusicType.CosmicCult);
uid.Comp.CurrentState = FinaleState.ReadyFinale;
if (TryComp<CosmicCorruptingComponent>(uid, out var corruptingComp))
@@ -8,6 +8,7 @@ using Content.Shared.Mind;
using Content.Shared.Roles;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
@@ -25,6 +26,7 @@ public sealed class CosmicChantrySystem : EntitySystem
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedMindSystem _mind = default!;
[Dependency] private readonly SharedRoleSystem _role = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly NavMapSystem _navMap = default!;
/// <summary>
@@ -79,11 +81,11 @@ public sealed class CosmicChantrySystem : EntitySystem
comp.SpawnTimer = _timing.CurTime + comp.SpawningTime;
comp.CountdownTimer = _timing.CurTime + comp.EventTime;
_sound.PlayGlobalOnStation(ent, _audio.ResolveSound(comp.ChantryAlarm));
_chatSystem.DispatchStationAnnouncement(ent,
Loc.GetString("cosmiccult-chantry-location", ("location", indicatedLocation)),
null, false, null,
Color.FromHex("#cae8e8"));
var targetMap = _transform.GetMapId(ent.Owner);
_sound.PlayGlobalOnMap(targetMap, _audio.ResolveSound(comp.ChantryAlarm));
_chatSystem.DispatchGlobalAnnouncement(Loc.GetString("cosmiccult-chantry-location",
("location", indicatedLocation)), null, false, null, Color.FromHex("#cae8e8"));
if (_mind.TryGetMind(comp.InternalVictim, out _, out var mind))
mind.PreventGhosting = true;
@@ -79,13 +79,13 @@ public sealed class MonumentSystem : SharedMonumentSystem
{
comp.SongTimer = null;
if (comp.SelectedSong is { } song)
_sound.DispatchStationEventMusic(uid, song, StationEventMusicType.CosmicCult);
_sound.DispatchGlobalEventMusic(song, StationEventMusicType.CosmicCult);
}
if (comp.CurrentState == FinaleState.ActiveFinale && comp.FinaleAnnounceCheck && comp.FinaleTimer - _timing.CurTime < comp.VisualsThreshold)
{
_appearance.SetData(uid, MonumentVisuals.FinaleReached, 3);
_chatSystem.DispatchStationAnnouncement(uid, Loc.GetString("cosmiccult-announce-finale-warning"), null, false, null, Color.FromHex("#cae8e8"));
_chatSystem.DispatchGlobalAnnouncement(Loc.GetString("cosmiccult-announce-finale-warning"), null, false, null, Color.FromHex("#cae8e8"));
comp.FinaleAnnounceCheck = false;
}
@@ -90,6 +90,7 @@ public sealed class DeepFryerSystem : SharedDeepFryerSystem
private void OnPowerChanged(Entity<DeepFryerComponent> ent, ref PowerChangedEvent args)
{
UpdateAppearance(ent);
ResetCookingItemsStartTime(ent);
}
private void OnThrowHitBy(Entity<DeepFryerComponent> ent, ref ThrowHitByEvent args)
@@ -674,4 +675,26 @@ public sealed class DeepFryerSystem : SharedDeepFryerSystem
// Add the split solution to the food
Solution.AddSolution(foodSolutionEnt.Value, transferredSolution);
}
/// <summary>
/// Resets the starttime for cooking items (on power change)
/// </summary>
private void ResetCookingItemsStartTime(Entity<DeepFryerComponent> ent)
{
if (_power.IsPowered(ent.Owner) && !ent.Comp.WasPreviouslyPowered)
{
// Power just came back on - reset all cooking timers
foreach (var itemUid in ent.Comp.CookingItems.Keys.ToList())
{
var cookingItem = ent.Comp.CookingItems[itemUid];
cookingItem.TimeStarted = _timing.CurTime;
ent.Comp.CookingItems[itemUid] = cookingItem;
}
ent.Comp.WasPreviouslyPowered = true;
}
else if (!_power.IsPowered(ent.Owner) && ent.Comp.WasPreviouslyPowered)
{
ent.Comp.WasPreviouslyPowered = false;
}
}
}
@@ -1,9 +1,9 @@
using Content.Server.Power.Components;
using Content.Server.StationEvents.Events;
using Content.Server._DV.StationEvents.Events;
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
namespace Content.Server.StationEvents.Components;
namespace Content.Server._DV.StationEvents.Components;
/// <summary>
/// When fired, turns off power on the station for a few seconds, playing <see cref="EpsilonEventRuleComponent.PowerOffSound"/>
@@ -1,14 +1,15 @@
using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
using Content.Server.StationEvents.Components;
using Content.Server.StationEvents.Events;
using Content.Shared.GameTicking.Components;
using Content.Shared.Station.Components;
using Content.Server.AlertLevel;
using Content.Server.Audio;
using Content.Server._DV.StationEvents.Components;
using Robust.Shared.Audio.Systems;
namespace Content.Server.StationEvents.Events
{
namespace Content.Server._DV.StationEvents.Events;
public sealed class EpsilonEventRule : StationEventSystem<EpsilonEventRuleComponent>
{
[Dependency] private readonly ApcSystem _apcSystem = default!;
@@ -25,7 +26,7 @@ public sealed class EpsilonEventRule : StationEventSystem<EpsilonEventRuleCompon
return;
component.AffectedStation = chosenStation.Value;
// Plays the power off sound to the station.
// Plays the power off sound for those who are on the station.
_sound.PlayGlobalOnStation(component.AffectedStation, _audio.ResolveSound(component.PowerOffSound));
var query = AllEntityQuery<ApcComponent, TransformComponent>();
@@ -70,4 +71,3 @@ public sealed class EpsilonEventRule : StationEventSystem<EpsilonEventRuleCompon
_alertLevelSystem.SetLevel(component.AffectedStation, "epsilon", true, true, true);
}
}
}
+2 -1
View File
@@ -109,7 +109,8 @@ public sealed class TraitSystem : EntitySystem
JobId = jobId,
SpeciesId = speciesId,
Profile = profile,
StatusEffects = _statusEffects
StatusEffects = _statusEffects,
SelectedTraits = selectedTraits
};
foreach (var traitId in selectedTraits)
+9 -1
View File
@@ -41,7 +41,13 @@ namespace Content.Shared.Chat
[NonSerialized]
public bool Read;
public ChatMessage(ChatChannel channel, string message, string wrappedMessage, NetEntity source, int? senderKey, bool hideChat = false, Color? colorOverride = null, string? audioPath = null, float audioVolume = 0)
/// <summary>
/// DeltaV - If not null, contains the radio channel proto ID that the message was sent on.
/// Used to replace the channel color client-side.
/// </summary>
public string? RadioChannelProtoId = null;
public ChatMessage(ChatChannel channel, string message, string wrappedMessage, NetEntity source, int? senderKey, bool hideChat = false, Color? colorOverride = null, string? audioPath = null, float audioVolume = 0, string? radioChannelProto = null) // DeltaV - added radioChannelProto
{
Channel = channel;
Message = message;
@@ -52,6 +58,7 @@ namespace Content.Shared.Chat
MessageColorOverride = colorOverride;
AudioPath = audioPath;
AudioVolume = audioVolume;
RadioChannelProtoId = radioChannelProto; // DeltaV
}
public ChatMessage(ChatMessage copyFrom)
@@ -66,6 +73,7 @@ namespace Content.Shared.Chat
AudioPath = copyFrom.AudioPath;
AudioVolume = copyFrom.AudioVolume;
Read = copyFrom.Read;
RadioChannelProtoId = copyFrom.RadioChannelProtoId; // DeltaV
}
}
@@ -2,6 +2,7 @@ using System.Linq;
using Content.Shared.Eye.Blinding.Components;
using Content.Shared.Ghost;
using Content.Shared.Interaction;
using Content.Shared.Inventory; // Harmony - for lanyards
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
using JetBrains.Annotations;
@@ -293,7 +294,7 @@ namespace Content.Shared.Examine
/// If you're pushing multiple messages that should be grouped together (or ordered in some way),
/// call <see cref="PushGroup"/> before pushing and <see cref="PopGroup"/> when finished.
/// </summary>
public sealed class ExaminedEvent : EntityEventArgs
public sealed class ExaminedEvent : EntityEventArgs, IInventoryRelayEvent //Harmony InventoryRelayEvent for Lanyards
{
/// <summary>
/// The message that will be displayed as the examine text.
@@ -529,6 +530,7 @@ namespace Content.Shared.Examine
}
private record ExamineMessagePart(FormattedMessage Message, int Priority, bool DoNewLine, string? Group);
public SlotFlags TargetSlots { get; } = SlotFlags.NECK; // Harmony - For targeting lanyards.
}
@@ -33,6 +33,7 @@ using Content.Shared.Verbs;
using Content.Shared.Weapons.Ranged.Events;
using Content.Shared.Wieldable;
using Content.Shared.Zombies;
using Content.Shared.Examine; //Harmony
namespace Content.Shared.Inventory;
@@ -64,6 +65,7 @@ public partial class InventorySystem
SubscribeLocalEvent<InventoryComponent, BeforeEmoteEvent>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, StoodEvent>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, DownedEvent>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, ExaminedEvent>(RelayInventoryEvent); // Harmony - added for lanyards.
// by-ref events
SubscribeLocalEvent<InventoryComponent, RefreshFrictionModifiersEvent>(RefRelayInventoryEvent);
@@ -1,6 +1,8 @@
using System.Diagnostics.CodeAnalysis;
using Content.Shared.Containers.ItemSlots;
using Content.Shared.Examine;
using Content.Shared.IdentityManagement; //Harmony Lanyards
using Content.Shared.Inventory; //Harmony Lanyards
using Content.Shared.Labels.Components;
using Content.Shared.NameModifier.EntitySystems;
using Content.Shared.Paper;
@@ -8,6 +10,7 @@ using Content.Shared.Tag; // DeltaV
using Robust.Shared.Containers;
using Robust.Shared.Prototypes; // DeltaV
using Robust.Shared.Utility;
using System.Linq; //Harmony Lanyards
namespace Content.Shared.Labels.EntitySystems;
@@ -34,6 +37,11 @@ public sealed partial class LabelSystem : EntitySystem
SubscribeLocalEvent<PaperLabelComponent, EntInsertedIntoContainerMessage>(OnContainerModified);
SubscribeLocalEvent<PaperLabelComponent, EntRemovedFromContainerMessage>(OnContainerModified);
SubscribeLocalEvent<PaperLabelComponent, ExaminedEvent>(OnExamined);
// Harmony - OnExamined can now be inventory relayed from the neck slot for lanyard implementation,
// getting the entity's pronouns and changing the label inspection text to reflect it being from a lanyard.
// This would cause any other neck slot item with the label component to be described as a lanyard on inspection,
// but currently no others exist.
SubscribeLocalEvent<PaperLabelComponent, InventoryRelayedEvent<ExaminedEvent>>((e, c, ev) => OnExaminedInInventory(e, c, ev.Args));
}
private void OnLabelCompMapInit(Entity<LabelComponent> ent, ref MapInitEvent args)
@@ -123,9 +131,65 @@ public sealed partial class LabelSystem : EntitySystem
args.PushMarkup(Loc.GetString("comp-paper-label-has-label"));
var text = paper.Content;
args.PushMarkup(text.TrimEnd());
// Harmony addition begins - shows which stamps have been applied to a label when inspected. Copied from PaperSystem.
if (paper.StampedBy.Count > 0)
{
var commaSeparated =
string.Join(", ", paper.StampedBy.Select(s => Loc.GetString(s.StampedName)));
args.PushMarkup(
Loc.GetString(
"comp-label-examine-detail-stamped-by",
("stamps", commaSeparated))
);
}
// Harmony addition ends
}
}
// Harmony addition begins - version of OnExamined for when the event is inventory relayed. Used when reading from a worn lanyard.
private void OnExaminedInInventory(EntityUid uid, PaperLabelComponent comp, ExaminedEvent args)
{
if (comp.LabelSlot.Item is not { Valid: true } item)
return;
using (args.PushGroup(nameof(PaperLabelComponent)))
{
// UID's parent is saved to be used for localisation grammar when the label is from a lanyard, since the text is changed.
var user = Comp<TransformComponent>(uid).ParentUid;
if (!args.IsInDetailsRange)
{
args.PushMarkup(Loc.GetString("comp-lanyard-has-lanyard-cant-read", ("user", Identity.Entity(user, EntityManager))));
return;
}
if (!TryComp(item, out PaperComponent? paper))
// Assuming yaml has the correct entity whitelist, this should not happen.
return;
if (string.IsNullOrWhiteSpace(paper.Content))
{
args.PushMarkup(Loc.GetString("comp-lanyard-has-lanyard-blank", ("user", Identity.Entity(user, EntityManager))));
return;
}
args.PushMarkup(Loc.GetString("comp-lanyard-has-lanyard", ("user", Identity.Entity(user, EntityManager))));
var text = paper.Content;
args.PushMarkup(text.TrimEnd());
// Harmony - shows which stamps have been applied to a lanyard's label when inspected. Copied from PaperSystem.
if (paper.StampedBy.Count > 0)
{
var commaSeparated =
string.Join(", ", paper.StampedBy.Select(s => Loc.GetString(s.StampedName)));
args.PushMarkup(
Loc.GetString(
"comp-lanyard-examine-detail-stamped-by",
("stamps", commaSeparated))
);
}
}
}
// Harmony Addition Ends
// Not ref-sub due to being used for multiple subscriptions.
private void OnContainerModified(EntityUid uid, PaperLabelComponent label, ContainerModifiedMessage args)
{
@@ -120,10 +120,23 @@ public abstract partial class SharedBatterySystem : EntitySystem
var rechargerQuery = EntityQueryEnumerator<BatterySelfRechargerComponent, BatteryComponent>();
while (rechargerQuery.MoveNext(out var uid, out var recharger, out var battery))
{
// BEGIN DeltaV - Battery Drain
// Currently, NextAutoRecharge is only set when there's an explicit power draw from
// the battery, and it doesn't count a negative charge rate as battery charge being used
// so, this is to patch that in the case that the drain exceeds the recharge.
if (recharger.AutoRechargePauseTime > TimeSpan.Zero && battery.ChargeRate < 0)
{
TrySetChargeCooldown((uid, recharger));
continue;
}
// END DeltaV
if (recharger.NextAutoRecharge == null || curTime < recharger.NextAutoRecharge)
continue;
recharger.NextAutoRecharge = null; // Don't refresh every tick.
Dirty(uid, recharger);
RefreshChargeRate((uid, battery)); // Cooldown is over, apply the new recharge rate.
}
@@ -32,4 +32,10 @@ public sealed partial class PowerCellDrawComponent : Component
/// </summary>
[DataField, AutoNetworkedField]
public float UseCharge;
/// <summary>
/// DeltaV - If the battery's recharge should be paused while power draw is active.
/// </summary>
[DataField, AutoNetworkedField]
public bool PauseRecharging;
}
@@ -17,8 +17,14 @@ public sealed partial class PowerCellSystem
ent.Comp.Enabled = enabled;
Dirty(ent, ent.Comp);
if (TryGetBatteryFromSlot(ent.Owner, out var battery))
_battery.RefreshChargeRate(battery.Value.AsNullable());
// BEGIN DeltaV - Allow PowerDraw to prevent recharge
if (TryGetBatteryFromSlot(ent.Owner, out var battery) && battery is { } existingBattery)
{
_battery.RefreshChargeRate(existingBattery.AsNullable());
if (ent.Comp.PauseRecharging) _battery.TrySetChargeCooldown(existingBattery.Owner);
}
// END DeltaV
}
@@ -24,7 +24,7 @@ public sealed partial class RadioChannelPrototype : IPrototype
public int Frequency { get; private set; } = 0;
[DataField("color")]
public Color Color { get; private set; } = Color.Lime;
public Color Color { get; set; } = Color.Lime; // DeltaV - Client-side radio channel colors, no longer private set
[IdDataField, ViewVariables]
public string ID { get; private set; } = default!;
@@ -0,0 +1,73 @@
using Robust.Shared.Audio;
using Robust.Shared.Configuration;
namespace Content.Shared._DV.CCVars;
public sealed partial class DCCVars
{
public static readonly CVarDef<string> RadioColorCommon =
CVarDef.Create("deltav.options.radio.common_color",
"#2cdb2c",
CVar.CLIENTONLY | CVar.ARCHIVE,
"The color of the Common radio channel.");
public static readonly CVarDef<string> RadioColorCommand =
CVarDef.Create("deltav.options.radio.command_color",
"#fcdf03",
CVar.CLIENTONLY | CVar.ARCHIVE,
"The color of the Command radio channel.");
public static readonly CVarDef<string> RadioColorSecurity =
CVarDef.Create("deltav.options.radio.security_color",
"#8c93f5",
CVar.CLIENTONLY | CVar.ARCHIVE,
"The color of the Security radio channel.");
public static readonly CVarDef<string> RadioColorMedical =
CVarDef.Create("deltav.options.radio.medical_color",
"#57b8f0",
CVar.CLIENTONLY | CVar.ARCHIVE,
"The color of the Medical radio channel.");
public static readonly CVarDef<string> RadioColorEngineering =
CVarDef.Create("deltav.options.radio.engineering_color",
"#ff733c",
CVar.CLIENTONLY | CVar.ARCHIVE,
"The color of the Engineering radio channel.");
public static readonly CVarDef<string> RadioColorScience =
CVarDef.Create("deltav.options.radio.science_color",
"#cd7ccd",
CVar.CLIENTONLY | CVar.ARCHIVE,
"The color of the Science radio channel.");
public static readonly CVarDef<string> RadioColorCargo =
CVarDef.Create("deltav.options.radio.cargo_color",
"#b48b57",
CVar.CLIENTONLY | CVar.ARCHIVE,
"The color of the Cargo radio channel.");
public static readonly CVarDef<string> RadioColorService =
CVarDef.Create("deltav.options.radio.service_color",
"#539c00",
CVar.CLIENTONLY | CVar.ARCHIVE,
"The color of the Service radio channel.");
public static readonly CVarDef<string> RadioColorBinary =
CVarDef.Create("deltav.options.radio.binary_color",
"#5ed7aa",
CVar.CLIENTONLY | CVar.ARCHIVE,
"The color of the Binary radio channel.");
public static readonly CVarDef<string> RadioColorJustice =
CVarDef.Create("deltav.options.radio.justice_color",
"#c70667",
CVar.CLIENTONLY | CVar.ARCHIVE,
"The color of the Justice radio channel.");
public static readonly CVarDef<string> RadioColorPrison =
CVarDef.Create("deltav.options.radio.prison_color",
"#FFA500",
CVar.CLIENTONLY | CVar.ARCHIVE,
"The color of the Prison radio channel.");
}
@@ -137,6 +137,12 @@ public sealed partial class DeepFryerComponent : Component
/// <seealso cref="ProfessionalChefComponent"/>
[DataField]
public float MissChance = 0.25f;
/// <summary>
/// Check for whether the cooking timer needs to be reset after powering down
/// </summary>
[DataField]
public bool WasPreviouslyPowered = true;
}
/// <summary>
@@ -65,4 +65,10 @@ public sealed class TraitConditionContext
/// The <see cref="HumanoidCharacterProfile"/> of the player, if available.
/// </summary>
public HumanoidCharacterProfile? Profile { get; init; }
/// <summary>
/// The set of trait IDs currently selected by the player, if available.
/// Used by <see cref="TraitDependencyCondition"/> to check conflicts and requirements.
/// </summary>
public IReadOnlySet<ProtoId<TraitPrototype>>? SelectedTraits { get; init; }
}
@@ -0,0 +1,80 @@
using Robust.Shared.Prototypes;
namespace Content.Shared._DV.Traits.Conditions;
/// <summary>
/// Condition that checks trait conflicts and requirements.
/// - Conflicts: if any listed trait is selected, this condition fails.
/// - Requires: all listed traits must be selected for this condition to pass.
/// Tooltips are generated per-entry by the UI rather than via GetTooltip,
/// so GetTooltip returns empty to avoid duplication.
/// </summary>
public sealed partial class TraitDependencyCondition : BaseTraitCondition
{
/// <summary>
/// Traits that are mutually exclusive with this one.
/// If any of these are selected, this condition fails.
/// </summary>
[DataField]
public List<ProtoId<TraitPrototype>> Conflicts = new();
/// <summary>
/// Traits that must already be selected for this condition to pass.
/// All listed traits must be present.
/// </summary>
[DataField]
public List<ProtoId<TraitPrototype>> Requires = new();
protected override bool EvaluateImplementation(TraitConditionContext ctx)
{
if (ctx.SelectedTraits is { } selectedTraits)
{
foreach (var conflict in Conflicts)
{
if (selectedTraits.Contains(conflict))
return false;
}
}
if (Requires.Count > 0)
{
if (ctx.SelectedTraits is not { } selected)
return false;
foreach (var required in Requires)
{
if (!selected.Contains(required))
return false;
}
}
return true;
}
/// <summary>
/// Returns empty. the UI generates conflict/require tooltips directly via
/// <see cref="GetTooltips"/> to avoid duplicating lines across the two tooltip paths.
/// </summary>
public override string GetTooltip(IPrototypeManager proto, ILocalizationManager loc) => string.Empty;
/// <summary>
/// Returns individual tooltip lines for each conflict and requirement.
/// Used by the UI to build both the requirements preview and the failed-conditions tooltip.
/// </summary>
public IEnumerable<string> GetTooltips(IPrototypeManager proto, ILocalizationManager loc)
{
foreach (var conflict in Conflicts)
{
if (!proto.TryIndex(conflict, out var traitProto))
continue;
yield return loc.GetString("trait-condition-trait-conflict", ("trait", loc.GetString(traitProto.Name)));
}
foreach (var required in Requires)
{
if (!proto.TryIndex(required, out var traitProto))
continue;
yield return loc.GetString("trait-condition-trait-required", ("trait", loc.GetString(traitProto.Name)));
}
}
}
+169 -153
View File
@@ -1,157 +1,4 @@
Entries:
- author: ShepardToTheStars
changes:
- message: All syndicate cyborg ghost roles now spawn with a neuroling rather than
a positronic brain.
type: Tweak
id: 1937
time: '2025-12-08T15:33:15.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4913
- author: ShepardToTheStars
changes:
- message: Feroxi now can sense containers and puddles of blood, and people who
are bleeding, except Diona and Slime people, since they bleed sap and slime
respectively (and that's not blood!).
type: Add
id: 1938
time: '2025-12-08T15:34:22.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4902
- author: verybigman311
changes:
- message: Plastic is now obtainable from deconstructing a reinforced tinted window.
type: Fix
id: 1939
time: '2025-12-08T19:34:23.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4918
- author: MantasDab360
changes:
- message: Ninja visor now has Night Vision!
type: Add
- message: Ninja Hardsuit is now fully Ion resistant!
type: Tweak
id: 1940
time: '2025-12-09T16:44:47.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4916
- author: snowywinters
changes:
- message: Station AI can now use traffic comms. Your secrets are no longer safe.
type: Add
- message: Station AI can now see silicon health, just like diagnostic HUDs.
type: Add
id: 1941
time: '2025-12-09T17:56:16.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4905
- author: Stxcking
changes:
- message: Syndicat ghost role description doesn't mention microbomb implant.
type: Fix
id: 1942
time: '2025-12-09T18:31:07.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4889
- author: Stxcking
changes:
- message: Added more festive headwear, an elf costume, and holiday red dress to
the AutoDrobe!
type: Add
id: 1943
time: '2025-12-10T08:05:33.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4909
- author: ShepardToTheStars
changes:
- message: Entropic Degen should no longer last forever.
type: Fix
id: 1944
time: '2025-12-10T08:12:42.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4931
- author: SirWarock
changes:
- message: Fixed Rollerbeds getting annihilated by mouse traps!
type: Fix
id: 1945
time: '2025-12-10T14:57:38.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4933
- author: verybigman311
changes:
- message: Mowed Astro-Snow can now be crafted and utilized
type: Add
id: 1946
time: '2025-12-10T14:59:27.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4921
- author: pootslap
changes:
- message: New caw sounds for harpies!
type: Add
- message: Harpy emotes are now gender specific.
type: Tweak
id: 1947
time: '2025-12-10T15:25:50.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4915
- author: verybigman311
changes:
- message: Saws are now a little more lethal
type: Tweak
id: 1948
time: '2025-12-10T21:59:39.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4886
- author: Eternally-Confused
changes:
- message: The Crime Assist PDA app has been updated to match Space Law.
type: Fix
id: 1949
time: '2025-12-11T14:58:57.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4937
- author: SirWarock
changes:
- message: Truncheons can now be selected instead of a firearm in Security Loadouts!
type: Tweak
id: 1950
time: '2025-12-11T22:05:22.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4838
- author: AeraAuling
changes:
- message: Adds purifying salt to allow for healing of metaphysical damage
type: Add
id: 1951
time: '2025-12-11T22:39:23.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4682
- author: Halo3moth
changes:
- message: Lawyers now spawn with a forensic scanner.
type: Add
- message: Minor detective goodies added to the lawdrobe.
type: Add
id: 1952
time: '2025-12-12T10:54:37.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4879
- author: IRSMsoso
changes:
- message: Harpy flight no longer causes silent errors
type: Fix
id: 1953
time: '2025-12-12T11:05:00.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4952
- author: EmberAstra
changes:
- message: forensic pads used to scan gloves now also show the fiber's ID.
type: Tweak
id: 1954
time: '2025-12-12T19:21:56.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4932
- author: TheShuEd, Spielern
changes:
- message: The Christmas Anomaly is back in rotation!
type: Add
id: 1955
time: '2025-12-12T22:23:47.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4957
- author: AirlineFood001
changes:
- message: Adjusted the armor values on the Advanced Plate Carrier to make it all
around stronger.
type: Tweak
id: 1956
time: '2025-12-12T22:40:34.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4942
- author: Velcroboy
changes:
- message: Reconfigurated the TEG tentacles
@@ -4396,4 +4243,173 @@
id: 2437
time: '2026-06-20T10:46:03.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5896
- author: einknusprigestoast
changes:
- message: Added CentCom laser turrets + controls
type: Add
id: 2438
time: '2026-06-20T14:20:04.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6069
- author: sowelipililimute
changes:
- message: NanoChat now uses the same methods as the radio system to determine reachability.
In other words, cross-grid NanoChat works now.
type: Tweak
id: 2439
time: '2026-06-20T14:24:36.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6057
- author: RoboBozu, SalDragonsNOA
changes:
- message: NanoTrasen corporate has decided to celebrate the increased productivity
of the Delta Sector with ice cream! Recipes for various frozen treats have been
added to Bartenders' handbooks to facilitate the celebration!
type: Add
id: 2440
time: '2026-06-20T15:02:14.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5943
- author: einknusprigestoast
changes:
- message: Removed DeathSquad
type: Remove
id: 2441
time: '2026-06-20T17:14:12.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6049
- author: Velcroboy
changes:
- message: 'The Hive: Epistemics now has a public thoroughfare through the center
where a new chapel and robotics lab are located. Also security is blue.'
type: Tweak
id: 2442
time: '2026-06-21T13:48:13.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6018
- author: Halo3moth
changes:
- message: Pitbulls now spawn from vents less often
type: Tweak
id: 2443
time: '2026-06-22T04:23:12.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6081
- author: wesk
changes:
- message: Fixed **8 O'Clock Ghosts** from being stereo, instead of mono. This will
no longer make the music play "loud" especially when the jukebox is behind a
wall.
type: Fix
id: 2444
time: '2026-06-22T08:46:38.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6084
- author: wesk
changes:
- message: The Traits UI now shows a visual indicator when you have selected the
max amount of traits in a category.
type: Tweak
- message: The Traits UI now indicates if you do not have enough points for a trait.
type: Tweak
- message: The Traits UI now indicates if a trait is conflicting with another trait,
or is requiring another trait in order to be used/equipped by your character.
type: Tweak
id: 2445
time: '2026-06-22T11:11:35.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6082
- author: Proxysseia
changes:
- message: Shields are now not allowed to be carried on code Green (again)
type: Tweak
id: 2446
time: '2026-06-22T11:36:51.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6070
- author: rebe83
changes:
- message: Slugs are made out of lead and do 100 structural.
type: Tweak
id: 2447
time: '2026-06-22T16:48:31.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6068
- author: A111Vojta
changes:
- message: Ported lanyards from Harmony
type: Add
id: 2448
time: '2026-06-22T18:05:48.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6035
- author: ShepardToTheStars
changes:
- message: Nuke and Cosmic Cult finale music and SFX will always play, even if you're
jetpacking around the station.
type: Tweak
- message: If a cultist converts a borg off-station, it will properly announce that
it is happening.
type: Fix
id: 2449
time: '2026-06-23T10:40:17.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5918
- author: wesk
changes:
- message: Fixed required traits from not being detected by the Trait System, causing
a false positive of traits not being met, even if you have them equipped already.
type: Fix
id: 2450
time: '2026-06-23T12:49:52.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6097
- author: rebe83
changes:
- message: Broken glass bottles can cut and slice things. Yay?
type: Tweak
id: 2451
time: '2026-06-23T15:27:08.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6092
- author: RoboBozu, SalDragonsNOA
changes:
- message: NanoTrasen corporate has decided to celebrate the increased productivity
of the Delta Sector with ice cream! Recipes for various frozen treats have been
added to Bartenders' handbooks to facilitate the celebration!
type: Add
id: 2452
time: '2026-06-20T15:02:14.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5943
- author: ShepardToTheStars
changes:
- message: Sleeper and NT sleeper agents no longer raise the alert level to blue
and no longer display a 'communications intercepted' message.
type: Tweak
id: 2453
time: '2026-06-23T22:34:48.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6066
- author: ShepardToTheStars
changes:
- message: Station-specific jobs in the job preferences can now be found under their
proper categories.
type: Tweak
- message: The station-specific jobs category will no longer appear on the crew
monitor.
type: Tweak
- message: The corpsman job will now properly appear as a member of security on
the crew monitor.
type: Fix
id: 2454
time: '2026-06-23T22:34:44.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6078
- author: Stxcking
changes:
- message: AAC tablet buttons have colors again!
type: Tweak
id: 2455
time: '2026-06-24T13:08:20.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5567
- author: ShepardToTheStars
changes:
- message: Stealth borg modules are now working as intended and no longer provide
infinite duration cloaking.
type: Fix
id: 2456
time: '2026-06-24T13:15:02.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6085
- author: ShepardToTheStars
changes:
- message: You can now change common radio channel colors to the colors of your
choice in the Radio tab in the Options menu!
type: Add
id: 2457
time: '2026-06-24T22:02:59.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6101
Order: 1
File diff suppressed because one or more lines are too long
@@ -0,0 +1,43 @@
ui-options-tab-radio = Radio
ui-options-tab-radio-description = Customize common in-game radio channel colors.
# Upstream Departments
ui-options-radio-header-binary = Binary
ui-options-radio-header-cargo = Logistics
ui-options-radio-header-command = Command
ui-options-radio-header-common = Common
ui-options-radio-header-engineering = Engineering
ui-options-radio-header-medical = Medical
ui-options-radio-header-science = Epistemics
ui-options-radio-header-security = Security
ui-options-radio-header-service = Service
ui-options-radio-example-binary = [Binary] Freefall (AI-752) states, "Someone is breaking into my core."
ui-options-radio-example-cargo = [Logistics] Seren says, "Salvage, are you alive?"
ui-options-radio-example-command = [Command] Alexis asks, "Uh... Where is the nuke disk?"
ui-options-radio-example-common = [Common] Maya says, "I love slacking off."
ui-options-radio-example-engineering = [Engineering] Abigail asks, "Has anyone checked on the Tesla lately?"
ui-options-radio-example-medical = [Medical] Aurora asks, "Did anyone set up cryo?"
ui-options-radio-example-science = [Epistemics] Isaiah says, "That's the next thing we'll research."
ui-options-radio-example-security = [Security] Simon says, "Littering? That's ten minutes in the brig."
ui-options-radio-example-service = [Service] Preston says, "I gave medical almost 2000u of omnizine."
ui-options-radio-reset-binary = Reset Binary channel color
ui-options-radio-reset-cargo = Reset Cargo channel color
ui-options-radio-reset-command = Reset Command channel color
ui-options-radio-reset-common = Reset Common channel color
ui-options-radio-reset-engineering = Reset Engineering channel color
ui-options-radio-reset-medical = Reset Medical channel color
ui-options-radio-reset-science = Reset Science channel color
ui-options-radio-reset-security = Reset Security channel color
ui-options-radio-reset-service = Reset Service channel color
# DeltaV-Specific Departments
ui-options-radio-header-justice = Justice
ui-options-radio-header-prison = Prison
ui-options-radio-example-justice = [Justice] Mila exclaims, "My client did no such thing!"
ui-options-radio-example-prison = [Prison] Pepper asks, "Is anyone getting that scarf for me?"
ui-options-radio-reset-justice = Reset Justice channel color
ui-options-radio-reset-prison = Reset Prison channel color
@@ -97,3 +97,13 @@ flavor-base-awful = awful
candy-flavor-profile = This one is supposed to taste {$flavor}.
candy-flavor-profile-multiple = This one is supposed to taste {$flavors} and {$lastFlavor}.
candy-flavor-profile-unknown = You have no idea what this one is supposed to taste like.
flavor-complex-tart = tart
flavor-complex-icecream-apple-caramel = like apple pie
flavor-complex-icecream-caramel-fudge = like a liquid caramel brownie
flavor-complex-icecream-cobbler = a dessert with a tasty idenity crisis
flavor-complex-icecream-cookiedough = like a weekend at grandma's
flavor-complex-icecream-neapolitan = like chocolate, vanillia, and cherry
flavor-complex-icecream-rockyroad = like a bumpy highway
flavor-complex-icecream-tower = like a tower of power
flavor-complex-sherbert-rainbow = like a rainbow of flavors
@@ -41,3 +41,5 @@ guide-entry-cargo = Logistics
guide-entry-frequently-used-chemicals = Frequently Used Chemicals
guide-entry-deepfried-recipes = Deep-Fried
guide-entry-frozentreat-recipes = Frozen Treats
@@ -1,3 +1,4 @@
department-Epistemics-description = Research artifacts and anomalies to invent new equipment for the station, while trying to keep glimmer tame.
department-Logistics-description = Complete bounties, earn Spesos and deliver useful supplies to the crew.
department-Justice-description = Uphold justice on the station.
department-Incarcerated-description = Serving your sentence for past mistakes.
@@ -1,3 +1,4 @@
department-Epistemics = Epistemics
department-Logistics = Logistics
department-Justice = Justice
department-Incarcerated = Incarcerated
+10 -10
View File
@@ -81,22 +81,22 @@ phrase-number7 = 7
phrase-number8 = 8
phrase-number9 = 9
phrase-number0 = 0
phrase-ten = ten
phrase-hundred = hundred
phrase-thousand = thousand
phrase-million = million
phrase-billion = billion
phrase-stack = stack
phrase-hour = hour
phrase-minute = minute
phrase-second = second
phrase-ten = Ten
phrase-hundred = Hundred
phrase-thousand = Thousand
phrase-million = Million
phrase-billion = Billion
phrase-stack = Stack
phrase-hour = Hour
phrase-minute = Minute
phrase-second = Second
phrase-i-am = I am
phrase-you-are = You are
phrase-mine = Mine
phrase-yours = Yours
phrase-on = On
phrase-off = Off
phrase-day = day
phrase-day = Day
phrase-which = Which
phrase-not = Not
phrase-call = Call
@@ -7,17 +7,17 @@ phrase-location-shuttle = Shuttle
phrase-location-maintenance = Maintenance
# relative
phrase-location-near = near
phrase-location-far = far
phrase-location-inside = inside
phrase-location-outside = outside
phrase-location-near = Near
phrase-location-far = Far
phrase-location-inside = Inside
phrase-location-outside = Outside
## compass
phrase-location-north = north
phrase-location-east = east
phrase-location-south = south
phrase-location-west = west
phrase-location-northeast = northeast
phrase-location-southeast = southeast
phrase-location-southwest = southwest
phrase-location-northwest = northwest
phrase-location-north = North
phrase-location-east = East
phrase-location-south = South
phrase-location-west = West
phrase-location-northeast = Northeast
phrase-location-southeast = Southeast
phrase-location-southwest = Southwest
phrase-location-northwest = Northwest
+43 -43
View File
@@ -1,43 +1,43 @@
phrase-species-dog = dog
phrase-species-cat = cat
phrase-species-opossum = opossum
phrase-species-lizard = lizard
phrase-species-bat = sloth
phrase-species-slime = slime
phrase-species-mouse = mouse
phrase-species-mothroach = mothroach
phrase-species-cockroach = cockroach
phrase-species-spider = spider
phrase-species-bird = bird
phrase-species-parrot = parrot
phrase-species-snake = snake
phrase-species-pig = pig
phrase-species-monkey = monkey
phrase-species-kobold = kobold
phrase-species-ferret = ferret
phrase-species-carp = carp
phrase-species-xeno = xeno
phrase-species-hamster = hamster
phrase-species-ifrit = ifrit
phrase-species-raccoon = raccoon
phrase-species-rouny = rouny
phrase-species-fox = fox
phrase-species-crab = crab
phrase-species-kangaroo = kangaroo
phrase-species-cow = cow
phrase-species-duck = duck
phrase-species-bear = bear
phrase-species-penguin = penguin
phrase-species-goat = goat
phrase-species-person = person
phrase-species-animal = animal
phrase-species-corpse = corpse
phrase-species-robot = robot
phrase-species-alien = alien
phrase-species-monster = monster
phrase-species-ghost = ghost
phrase-species-pest = pest
phrase-species-insect = insect
phrase-species-pet = pet
phrase-species-chicken = chicken
phrase-species-fish = fish
phrase-species-dog = Dog
phrase-species-cat = Cat
phrase-species-opossum = Opossum
phrase-species-lizard = Lizard
phrase-species-bat = Sloth
phrase-species-slime = Slime
phrase-species-mouse = Mouse
phrase-species-mothroach = Mothroach
phrase-species-cockroach = Cockroach
phrase-species-spider = Spider
phrase-species-bird = Bird
phrase-species-parrot = Parrot
phrase-species-snake = Snake
phrase-species-pig = Pig
phrase-species-monkey = Monkey
phrase-species-kobold = Kobold
phrase-species-ferret = Ferret
phrase-species-carp = Carp
phrase-species-xeno = Xeno
phrase-species-hamster = Hamster
phrase-species-ifrit = Ifrit
phrase-species-raccoon = Raccoon
phrase-species-rouny = Rouny
phrase-species-fox = Fox
phrase-species-crab = Crab
phrase-species-kangaroo = Kangaroo
phrase-species-cow = Cow
phrase-species-duck = Duck
phrase-species-bear = Bear
phrase-species-penguin = Penguin
phrase-species-goat = Goat
phrase-species-person = Person
phrase-species-animal = Animal
phrase-species-corpse = Corpse
phrase-species-robot = Robot
phrase-species-alien = Alien
phrase-species-monster = Monster
phrase-species-ghost = Ghost
phrase-species-pest = Pest
phrase-species-insect = Insect
phrase-species-pet = Pet
phrase-species-chicken = Chicken
phrase-species-fish = Fish
+225 -225
View File
@@ -1,249 +1,249 @@
phrase-pen = pen
phrase-paper = paper
phrase-wrench = wrench
phrase-crowbar = crowbar
phrase-screwdriver = screwdriver
phrase-wirecutter = wirecutter
phrase-welding-tool = welding tool
phrase-welding-mask = welding mask
phrase-toolbox = toolbox
phrase-beaker = beaker
phrase-radio = radio
phrase-uniform = uniform
phrase-suit-sensors = suit sensors
phrase-internals = internals
phrase-gas-tank = gas tank
phrase-multitool = multitool
phrase-lathe = lathe
phrase-computer = computer
phrase-door = door
phrase-firelock = firelock
phrase-space = space
phrase-tool = tool
phrase-weapon = weapon
phrase-armor = armor
phrase-brain = brain
phrase-drink = drink
phrase-food = food
phrase-water = water
phrase-signature = signature
phrase-belt = belt
phrase-hardsuit = hardsuit
phrase-light = light
phrase-bag = bag
phrase-steel = steel
phrase-plastic = plastic
phrase-plasteel = plasteel
phrase-plasma = plasma
phrase-uranium = uranium
phrase-bananium = bananium
phrase-wood = wood
phrase-cloth = cloth
phrase-cardboard = cardboard
phrase-gold = gold
phrase-glass = glass
phrase-silver = silver
phrase-bluespace = bluespace
phrase-access = access
phrase-encryption-key = encryption key
phrase-pen = Pen
phrase-paper = Paper
phrase-wrench = Wrench
phrase-crowbar = Crowbar
phrase-screwdriver = Screwdriver
phrase-wirecutter = Wirecutter
phrase-welding-tool = Welding tool
phrase-welding-mask = Welding mask
phrase-toolbox = Toolbox
phrase-beaker = Beaker
phrase-radio = Radio
phrase-uniform = Uniform
phrase-suit-sensors = Suit sensors
phrase-internals = Internals
phrase-gas-tank = Gas tank
phrase-multitool = Multitool
phrase-lathe = Lathe
phrase-computer = Computer
phrase-door = Door
phrase-firelock = Firelock
phrase-space = Space
phrase-tool = Tool
phrase-weapon = Weapon
phrase-armor = Armor
phrase-brain = Brain
phrase-drink = Drink
phrase-food = Food
phrase-water = Water
phrase-signature = Signature
phrase-belt = Belt
phrase-hardsuit = Hardsuit
phrase-light = Light
phrase-bag = Bag
phrase-steel = Steel
phrase-plastic = Plastic
phrase-plasteel = Plasteel
phrase-plasma = Plasma
phrase-uranium = Uranium
phrase-bananium = Bananium
phrase-wood = Wood
phrase-cloth = Cloth
phrase-cardboard = Cardboard
phrase-gold = Gold
phrase-glass = Glass
phrase-silver = Silver
phrase-bluespace = Bluespace
phrase-access = Access
phrase-encryption-key = Encryption key
phrase-id-card = ID card
phrase-pda = pda
phrase-stamp = stamp
phrase-implant = implant
phrase-pda = Pda
phrase-stamp = Stamp
phrase-implant = Implant
phrase-ame = AME
phrase-apc = APC
phrase-canister = canister
phrase-compressed-matter = compressed matter
phrase-frezon = frezon
phrase-gravity = gravity
phrase-canister = Canister
phrase-compressed-matter = Compressed matter
phrase-frezon = Frezon
phrase-gravity = Gravity
phrase-hvwire = HV cable
phrase-lvwire = LV cable
phrase-mvwire = MV cable
phrase-network-configurator = network configurator
phrase-nitrogen = nitrogen
phrase-oxygen = oxygen
phrase-network-configurator = Network configurator
phrase-nitrogen = Nitrogen
phrase-oxygen = Oxygen
phrase-rcd = RCD
phrase-rtg = RTG
phrase-scrubber = scrubber
phrase-singulo = singularity
phrase-scrubber = Scrubber
phrase-singulo = Singularity
phrase-smes = SMES
phrase-substation = substation
phrase-tray-scanner = t-ray scanner
phrase-substation = Substation
phrase-tray-scanner = T-ray scanner
phrase-teg = TEG
phrase-tesla = tesla
phrase-tritium = tritium
phrase-magboots = magboots
phrase-holofan = holofan
phrase-anomaly = anomaly
phrase-tesla = Tesla
phrase-tritium = Tritium
phrase-magboots = Magboots
phrase-holofan = Holofan
phrase-anomaly = Anomaly
phrase-ape = A.P.E.
phrase-anomaly-vessel = anomaly vessel
phrase-artifact = artifact
phrase-artifact-container = artifact container
phrase-robotics = robotics
phrase-circuit-board = circuit board
phrase-research = research
phrase-anomaly-vessel = Anomaly vessel
phrase-artifact = Artifact
phrase-artifact-container = Artifact container
phrase-robotics = Robotics
phrase-circuit-board = Circuit board
phrase-research = Research
phrase-research-console = R&D computer
phrase-oracle = Oracle
phrase-sophie = Sophie
phrase-glimmer = glimmer
phrase-psionic = psionic
phrase-lotophagol-oil = lotophagol oil
phrase-mindbreak-phase = mindbreak
phrase-protolathe = protolathe
phrase-circuit-imprinter = circuit imprinter
phrase-bounty = bounty
phrase-cargo-shuttle = cargo shuttle
phrase-crate = crate
phrase-mail = mail
phrase-order = order
phrase-ore-processor = ore processor
phrase-request = request
phrase-spesos = spesos
phrase-restock = restock
phrase-fulton = fulton
phrase-jetpack = jetpack
phrase-crusher = crusher
phrase-pka = proto-kinetic accelerator
phrase-pickaxe = pickaxe
phrase-drill = drill
phrase-ore-bag = ore bag
phrase-salv-magnet = salvage magnet
phrase-expedition = expedition
phrase-topical = topical
phrase-topical-brute-pack = brute pack
phrase-topical-gauze = gauze
phrase-topical-bloodpack = bloodpack
phrase-defibrillator = defibrillator
phrase-cryopod = cryopod
phrase-stasis-bed = stasis bed
phrase-first-aid-kit = first-aid kit
phrase-clone = clone
phrase-cloning-pod = cloning pod
phrase-biomass = biomass
phrase-syringe = syringe
phrase-pill = pill
phrase-alive = alive
phrase-crit = critical
phrase-dead = dead
phrase-healthy = healthy
phrase-handcuffs = handcuffs
phrase-stun-baton = stun baton
phrase-disabler = disabler
phrase-flash = flash
phrase-flashbang = flashbang
phrase-arrest = arrest
phrase-warrant = warrant
phrase-wanted = wanted
phrase-search = search
phrase-detain = detain
phrase-suspect = suspect
phrase-forensic-scanner = forensic scanner
phrase-forensic-pad = forensic pad
phrase-glimmer = Glimmer
phrase-psionic = Psionic
phrase-lotophagol-oil = Lotophagol oil
phrase-mindbreak-phase = Mindbreak
phrase-protolathe = Protolathe
phrase-circuit-imprinter = Circuit imprinter
phrase-bounty = Bounty
phrase-cargo-shuttle = Cargo shuttle
phrase-crate = Crate
phrase-mail = Mail
phrase-order = Order
phrase-ore-processor = Ore processor
phrase-request = Request
phrase-spesos = Spesos
phrase-restock = Restock
phrase-fulton = Fulton
phrase-jetpack = Jetpack
phrase-crusher = Crusher
phrase-pka = Proto-kinetic accelerator
phrase-pickaxe = Pickaxe
phrase-drill = Drill
phrase-ore-bag = Ore bag
phrase-salv-magnet = Salvage magnet
phrase-expedition = Expedition
phrase-topical = Topical
phrase-topical-brute-pack = Brute pack
phrase-topical-gauze = Gauze
phrase-topical-bloodpack = Bloodpack
phrase-defibrillator = Defibrillator
phrase-cryopod = Cryopod
phrase-stasis-bed = Stasis bed
phrase-first-aid-kit = First-aid kit
phrase-clone = Clone
phrase-cloning-pod = Cloning pod
phrase-biomass = Biomass
phrase-syringe = Syringe
phrase-pill = Pill
phrase-alive = Alive
phrase-crit = Critical
phrase-dead = Dead
phrase-healthy = Healthy
phrase-handcuffs = Handcuffs
phrase-stun-baton = Stun baton
phrase-disabler = Disabler
phrase-flash = Flash
phrase-flashbang = Flashbang
phrase-arrest = Arrest
phrase-warrant = Warrant
phrase-wanted = Wanted
phrase-search = Search
phrase-detain = Detain
phrase-suspect = Suspect
phrase-forensic-scanner = Forensic scanner
phrase-forensic-pad = Forensic pad
phrase-log-probe = LogProbe
phrase-meat = meat
phrase-flour = flour
phrase-rice = rice
phrase-dough = dough
phrase-bread = bread
phrase-milk = milk
phrase-egg = egg
phrase-wheat = wheat
phrase-vegetable = vegetable
phrase-fruit = fruit
phrase-sugar = sugar
phrase-alcohol = alcohol
phrase-non-alcoholic = non-alcoholic
phrase-juice = juice
phrase-mop = mop
phrase-bucket = bucket
phrase-space-cleaner = space cleaner
phrase-soap = soap
phrase-trash = trash
phrase-stage = stage
phrase-seed = seed
phrase-plant = plant
phrase-mutagen = mutagen
phrase-robust = robust harvest
phrase-weed = weed
phrase-knife = knife
phrase-witness = witness
phrase-evidence = evidence
phrase-case = case
phrase-sue = sue
phrase-courtroom-timer = courtroom timer
phrase-bailiff = bailiff
phrase-sentence = sentence
phrase-defendant = defendant
phrase-plaintiff = plaintiff
phrase-victim = victim
phrase-defense = defense
phrase-prosecution = prosecution
phrase-statement = statement
phrase-gavel = gavel
phrase-charge = charge
phrase-guilty = guilty
phrase-not-guilty = not guilty
phrase-meat = Meat
phrase-flour = Flour
phrase-rice = Rice
phrase-dough = Dough
phrase-bread = Bread
phrase-milk = Milk
phrase-egg = Egg
phrase-wheat = Wheat
phrase-vegetable = Vegetable
phrase-fruit = Fruit
phrase-sugar = Sugar
phrase-alcohol = Alcohol
phrase-non-alcoholic = Non-alcoholic
phrase-juice = Juice
phrase-mop = Mop
phrase-bucket = Bucket
phrase-space-cleaner = Space cleaner
phrase-soap = Soap
phrase-trash = Trash
phrase-stage = Stage
phrase-seed = Seed
phrase-plant = Plant
phrase-mutagen = Mutagen
phrase-robust = Robust harvest
phrase-weed = Weed
phrase-knife = Knife
phrase-witness = Witness
phrase-evidence = Evidence
phrase-case = Case
phrase-sue = Sue
phrase-courtroom-timer = Courtroom timer
phrase-bailiff = Bailiff
phrase-sentence = Sentence
phrase-defendant = Defendant
phrase-plaintiff = Plaintiff
phrase-victim = Victim
phrase-defense = Defense
phrase-prosecution = Prosecution
phrase-statement = Statement
phrase-gavel = Gavel
phrase-charge = Charge
phrase-guilty = Guilty
phrase-not-guilty = Not guilty
phrase-objection = Objection
phrase-request-time = I need more time
phrase-your-honor = Your Honor
phrase-microwave = microwave
phrase-grill = grill
phrase-iron = iron
phrase-coal = coal
phrase-quartz = quartz
phrase-salt = salt
phrase-artifact-fragment = artifact fragment
phrase-bluespace-crystal = bluespace
phrase-diamond = diamond
phrase-chemicals = chemicals
phrase-box = box
phrase-locker = locker
phrase-machine = machine
phrase-blood = blood
phrase-nukedisk = nuclear disk
phrase-pinpointer = pinpointer
phrase-law = law
phrase-chassis = chassis
phrase-engi-on = on
phrase-engi-off = off
phrase-gas-analyzer = gas analyzer
phrase-planetside = planetside
phrase-holopad = holopad
phrase-upgrade = upgrade
phrase-gloves = gloves
phrase-shoes = shoes
phrase-limbs = limbs
phrase-release = release
phrase-parole = parole
phrase-microwave = Microwave
phrase-grill = Grill
phrase-iron = Iron
phrase-coal = Coal
phrase-quartz = Quartz
phrase-salt = Salt
phrase-artifact-fragment = Artifact fragment
phrase-bluespace-crystal = Bluespace
phrase-diamond = Diamond
phrase-chemicals = Chemicals
phrase-box = Box
phrase-locker = Locker
phrase-machine = Machine
phrase-blood = Blood
phrase-nukedisk = Nuclear disk
phrase-pinpointer = Pinpointer
phrase-law = Law
phrase-chassis = Chassis
phrase-engi-on = On
phrase-engi-off = Off
phrase-gas-analyzer = Gas analyzer
phrase-planetside = Planetside
phrase-holopad = Holopad
phrase-upgrade = Upgrade
phrase-gloves = Gloves
phrase-shoes = Shoes
phrase-limbs = Limbs
phrase-release = Release
phrase-parole = Parole
# colors
phrase-color-red = red
phrase-color-orange = orange
phrase-color-yellow = yellow
phrase-color-green = green
phrase-color-blue = blue
phrase-color-purple = purple
phrase-color-pink = pink
phrase-color-black = black
phrase-color-white = white
phrase-color-bright = bright
phrase-color-light = light
phrase-color-dark = dark
phrase-color-rainbow = rainbow
phrase-color-brown = brown
phrase-color-gray = gray
phrase-color-red = Red
phrase-color-orange = Orange
phrase-color-yellow = Yellow
phrase-color-green = Green
phrase-color-blue = Blue
phrase-color-purple = Purple
phrase-color-pink = Pink
phrase-color-black = Black
phrase-color-white = White
phrase-color-bright = Bright
phrase-color-light = Light
phrase-color-dark = Dark
phrase-color-rainbow = Rainbow
phrase-color-brown = Brown
phrase-color-gray = Gray
# flavors
phrase-sweet = sweet
phrase-sour = sour
phrase-spicy = spicy
phrase-savory = savory
phrase-bitter = bitter
phrase-sweet = Sweet
phrase-sour = Sour
phrase-spicy = Spicy
phrase-savory = Savory
phrase-bitter = Bitter
# plants
phrase-tomato = tomato
phrase-potato = potato
phrase-onion = onion
phrase-aloe = aloe
phrase-poppy = poppy
phrase-galaxythistle = galaxythistle
phrase-tomato = Tomato
phrase-potato = Potato
phrase-onion = Onion
phrase-aloe = Aloe
phrase-poppy = Poppy
phrase-galaxythistle = Galaxythistle
+54 -54
View File
@@ -1,57 +1,57 @@
phrase-hazard-space = spaced
phrase-hazard-low-presure = low pressure
phrase-hazard-high-presure = high pressure
phrase-hazard-heat = overheating
phrase-hazard-cold = cold
phrase-hazard-gas-leak = gas leak
phrase-hazard-explosion = explosion
phrase-hazard-radiation = radiation
phrase-hazard-structure-damage = structural damage
phrase-hazard-chemical-spill = chemical spill
phrase-hazard-shock = shock hazard
phrase-hazard = hazard
phrase-hazard-meteors = meteor
phrase-hazard-poison = poison
phrase-hazard-fire = fire
phrase-hazard-power-outage = power outage
phrase-hazard-low = low power
phrase-hazard-infection = infection
phrase-hazard-viral-threat = viral threat
phrase-hazard-broken-equipment = broken equipment
phrase-hostile-enemy = enemy
phrase-hostile = hostile
phrase-hostile-attacker = attacker
phrase-hostile-lifeform = dangerous lifeform
phrase-hostile-entity = entity
phrase-hostile-bomb = bomb
phrase-hostile-criminal = criminal
phrase-hostile-intruder = intruder
phrase-hostile-infiltrator = infiltrator
phrase-hostile-fugitive = fugitive
phrase-hostile-weapon = weapon
phrase-hostile-gun = gun
phrase-safety-safe = safe
phrase-safety-in-danger = in danger
phrase-safety-injured = injured
phrase-safety-dying = dying
phrase-safety-critical = critical
phrase-safety-bleeding = bleeding
phrase-safety-dead = dead
phrase-safety-alive = alive
phrase-safety-trustworthy = trustworthy
phrase-safety-escape = escape
phrase-safety-leaving = leaving
phrase-safety-need = need
phrase-safety-rescue = rescue
phrase-safety-dangerous = dangerous
phrase-safety-hazardous = hazardous
phrase-hazard-space = Spaced
phrase-hazard-low-presure = Low pressure
phrase-hazard-high-presure = High pressure
phrase-hazard-heat = Overheating
phrase-hazard-cold = Cold
phrase-hazard-gas-leak = Gas leak
phrase-hazard-explosion = Explosion
phrase-hazard-radiation = Radiation
phrase-hazard-structure-damage = Structural damage
phrase-hazard-chemical-spill = Chemical spill
phrase-hazard-shock = Shock hazard
phrase-hazard = Hazard
phrase-hazard-meteors = Meteor
phrase-hazard-poison = Poison
phrase-hazard-fire = Fire
phrase-hazard-power-outage = Power outage
phrase-hazard-low = Low power
phrase-hazard-infection = Infection
phrase-hazard-viral-threat = Viral threat
phrase-hazard-broken-equipment = Broken equipment
phrase-hostile-enemy = Enemy
phrase-hostile = Hostile
phrase-hostile-attacker = Attacker
phrase-hostile-lifeform = Dangerous lifeform
phrase-hostile-entity = Entity
phrase-hostile-bomb = Bomb
phrase-hostile-criminal = Criminal
phrase-hostile-intruder = Intruder
phrase-hostile-infiltrator = Infiltrator
phrase-hostile-fugitive = Fugitive
phrase-hostile-weapon = Weapon
phrase-hostile-gun = Gun
phrase-safety-safe = Safe
phrase-safety-in-danger = In danger
phrase-safety-injured = Injured
phrase-safety-dying = Dying
phrase-safety-critical = Critical
phrase-safety-bleeding = Bleeding
phrase-safety-dead = Dead
phrase-safety-alive = Alive
phrase-safety-trustworthy = Trustworthy
phrase-safety-escape = Escape
phrase-safety-leaving = Leaving
phrase-safety-need = Need
phrase-safety-rescue = Rescue
phrase-safety-dangerous = Dangerous
phrase-safety-hazardous = Hazardous
phrase-safety-here-to-help = Here to help
phrase-safety-how-to-help = How can I help?
phrase-safety-evac = Let's evacuate
phrase-safety-not = not
phrase-safety-lost = lost
phrase-hazard-hot = hot
phrase-hazard-freezing = freezing
phrase-hazard-burning = burning
phrase-hazard-bad-temperature = bad temperature
phrase-hazard-darkness = darkness
phrase-safety-not = Not
phrase-safety-lost = Lost
phrase-hazard-hot = Hot
phrase-hazard-freezing = Freezing
phrase-hazard-burning = Burning
phrase-hazard-bad-temperature = Bad temperature
phrase-hazard-darkness = Darkness
@@ -1,3 +1,5 @@
id-card-access-level-emergency-command = Emergency Command
id-card-access-level-orders = Orders
id-card-access-level-mantis = Psionic Mantis
id-card-access-level-chief-justice = Chief Justice
@@ -0,0 +1,83 @@
reagent-name-caramel = caramel
reagent-desc-caramel = A sweet, smooth mixture created from heated sugar.
reagent-name-icecream-caramel = caramel ice cream
reagent-desc-icecream-caramel = Sweet, salty, and creamy!
reagent-name-chopped-nuts = chopped nuts
reagent-desc-chopped-nuts = Delicious nuts packed with protien. Much more mixable.
reagent-name-icecream-apple-caramel = apple caramel ice cream
reagent-desc-icecream-apple-caramel = Nothing goes together like caramel, apples, and ice cream.
reagent-name-icecream-caramel-fudge = caramel fudge ice cream
reagent-desc-icecream-caramel-fudge = A deep, rich flavor with caramel to lighten it up!
reagent-name-icecream-cherry = cherry ice cream
reagent-desc-icecream-cherry = Just as sweet as strawberry!
reagent-name-icecream-chocolate = chocolate ice cream
reagent-desc-icecream-chocolate = A classic staple only few can enjoy.
reagent-name-icecream-cobbler = berry cobbler ice cream
reagent-desc-icecream-cobbler = It's a cobbler that got crammed into ice cream which is crammed into a glass.
reagent-name-icecream-coffee = coffee ice cream
reagent-desc-icecream-coffee = A cold pick-me-up.
reagent-name-icecream-cookiedough = cookie dough ice cream
reagent-desc-icecream-cookiedough = A chunky ice cream covered in edible cookie dough!
reagent-name-icecream-greentea = green tea ice cream
reagent-desc-icecream-greentea = A refreshing and soothing dessert.
reagent-name-icecream-mint = mint ice cream
reagent-desc-icecream-mint = Based on the classic mint ice cream with faux chocolate.
reagent-name-icecream-neapolitan = neapolitan Ice Cream
reagent-desc-icecream-neapolitan = An ice cream so simple no one knows its true origins.
reagent-name-icecream-pistachio = pistachio ice cream
reagent-desc-icecream-pistachio = For the real ice cream nuts.
reagent-name-icecream-rockyroad = rocky road ice cream
reagent-desc-icecream-rockyroad = It's an ice cream with a rough texture and rich flavor.
reagent-name-icecream-tower = tower of ice cream
reagent-desc-icecream-tower = Babel has met its match.
reagent-name-icecream-vegan = vegan ice cream
reagent-desc-icecream-vegan = A soy-based ice cream with no animal products.
reagent-name-icecream-watermelon = watermelon ice cream
reagent-desc-icecream-watermelon = The taste of a refreshing Summer in one glass.
reagent-name-sherbet-rainbow = rainbow sherbet
reagent-desc-sherbet-rainbow = The titan of sherbets.
reagent-name-sherbet-lemon = lemon sherbet
reagent-desc-sherbet-lemon = The classic sweet, tart, and sour fruit now really cold.
reagent-name-sherbet-lime = lime sherbet
reagent-desc-sherbet-lime = Lemon sherbert's little brother.
reagent-name-sherbet-orange = orange sherbet
reagent-desc-sherbet-orange = Orange you glad its sherbet?
reagent-name-sherbet-pineapple = pineapple sherbet
reagent-desc-sherbet-pineapple = Not only does it look like a vaction, it taste like it too.
reagent-name-sherbet-raspberry = raspberry sherbert
reagent-desc-sherbet-raspberry = Give them the old razzle dazzle!
reagent-name-slush-blue-raspberry = blue raspberry slush
reagent-desc-slush-blue-raspberry = You can feel your teeth chattering.
reagent-name-slush-cherry = cherry slush
reagent-desc-slush-cherry = While it's rumored to be red, it's typically white.
reagent-name-slush-cola = cola slush
reagent-desc-slush-cola = Space cola in the form of a brain freeze.
reagent-name-tropical-sunday = tropical sunday
reagent-desc-tropical-sunday = Kick back and relax.
@@ -0,0 +1,98 @@
ert-amber-gun-name-patos = Patos bundle
ert-amber-gun-desc-patos = A one-handed submachinegun that punches above its weight. Keep your small magazine capacity in mind.
ert-amber-gun-name-aegun = Advanced energy gun
ert-amber-gun-desc-aegun = One advanced energy gun, for both lethal and non-lethal engagments.
ert-amber-gun-name-mixlaser = Mixed Laser bundle
ert-amber-gun-desc-mixlaser = A disabler SMG together with a Laser Carbine, bundled with a portable recharger.
ert-medkit-name = First aid kit
ert-medkit-desc = A simple first aid kit, dont get shoot too hard.
ert-brutekit-name = Brute kit
ert-brutekit-desc = A brute kit, dont get shot with lasers.
ert-drozdkit-name = Drozd bundle
ert-drozdkit-desc = A heavy submachinegun bundled with different ammo types, a NanoTrasen armaments classic.
ert-lecterkit-name = Lecter bundle
ert-lecterbundle-desc = A high-grade assault rifle packaged with a handful of magazines, precise and packs a punch, but quite bulky.
ert-IK30kit-name = IK-30 bundle
ert-IK30kit-desc = A magazine fed energy weapon packaged with a handful of magazines, for when recharging your energy gun is not an option.
ert-AutoInjectorLight-name = Auto Injectors
ert-AutoInjectorLight-desc = A handful of Autoinjectors and a roll of Gauze for bad days.
ert-AdvancedTopicals-name = Advanced Topicals
ert-AdvancedTopicals-desc = Sutures, Mesh and Bloodbags. A lot of Sutures, Mesh and Bloodbags.
ert-CombatMedkit-name = Combat Medkit
ert-CombatMedkit-desc = A combat medkit, should get you through a gunfight or two.
ert-LeaderRedOfficer-name = Officers Bundle
ert-LeaderRedOfficer-desc = A kit containing a Universal Handgun, a Advanced Laser Pistol and a trench whistle. AVANTI!
ert-LeaderRedColdCannon-name = I.C.E.E bundle
ert-LeaderRedColdCannon-desc = A I.C.E.E cannon bundled together with a portable recharger.
ert-LeaderRedWT-name = WT550 bundle
ert-LeaderRedWT-desc = The classic WT550 submachinegun, bundled together with a few magazines and two telescopic shields.
ert-enforcerkit-name = Enforcer bundle
ert-enforcerkit-desc = A Enforcer bundled with 3 boxes of buckshot.
ert-GammaOfficer-name = Officers Bundle
ert-GammaOfficer-desc = A kit containing a N1984 and a trench whistle. "Retreat? We just got here"
ert-GammaLeaderAntelope-name = Antelope bundle
ert-GammaLeaderAntelope-desc = A bundle containing a Antelope automatic shotgun and 5 drums to feed it with. Ration your ammo carefully.
ert-LeaderAtrides-name = Atreides Bundle
ert-LeaderAtrides-desc = A Atreides bundled together with two telescopic shields and 5 magazines.
ert-GammaPulseRifle-name = Pulse Rifle
ert-GammaPulseRifle-desc = A singular pulse rifle. Corporate asks you to not take this option.
ert-GammaSecCombatkit-name = Combat Medkit bundle
ert-GammaSecCombatkit-desc = A Combat Medkit bundled together with some additional auto-injectors.
ert-GammaSecStimkit-name = Stimulant bundle
ert-GammaSecStimkit-desc = A jetinjector bundled together with 2 bottles of Ephedrine and one bottle of Omnizine. Dont ask about the legality
ert-GammaSecliquidkit-name = Liquid medicine bundle
ert-GammaSecliquidkit-desc = A jetinjector bundled together with a box full of highly fragile medicine bottles.
ert-GammaWTkit-name = WT550 bundle
ert-GammaWTkit-desc = The classic WT550 bundled together with 5 magazines and 2 telescopic shields.
ert-enforcerkitspecial-name = Enforcer bundle
ert-enforcerkitspecial-desc = An Enforcer bundled together with buckshot, incendiary shells and uranium ammunition.
ert-Immolatorkit-name = Immolator bundle
ert-Immolatorkit-desc = The original firestarter bundled together with a portable recharger and an energy gun.
ert-IK60kit-name = IK-60 bundle
ert-IK60kit-desc = IK-60-M bundled together with 4 Laser magazines. Watch your ammo consumption.
ert-GammaC4-name = C4 box
ert-GammaC4-desc = 4 timed charges of plastic breaching explosives.
ert-GammaThermals-name = Special Forces gasmask
ert-GammaThermals-desc = A gasmask with both a thermal and a nightvision lense.
ert-GammaJets-name = Jetpack bundle
ert-GammaJets-desc = A jetpack bundle containing a handheld mass scanner, a better cell for it and a pair of pocket breathinggastanks.
ert-GammaNadesHE-name = Explosive grenades
ert-GammaNadesHE-desc = Three explosive grenades for the usage against soft targets.
ert-GammaSmokes-name = Smoke grenades
ert-GammaSmokes-desc = Three smoke grenades to obscure vision.
ert-GammaIncend-name = Incendiary grenades
ert-GammaIncend-desc = Two Incendiary grenades. Keep in mind your suit protects less against these.
ert-GammaEMP-name = Electro Magnetic Pulse Grenades
ert-GammaEMP-desc = A pair of EMP grenades, incase you have to disable Cyborgs or Lasers.
@@ -32,6 +32,11 @@ trait-conditions-tooltip = [bold]Requirements:[/bold]
trait-conditions-not-met-tooltip = Requirements not met:
{$requirements}
trait-category-full-tooltip = You have reached the maximum amount of traits that you can have in this category.
trait-insufficient-points-tooltip = You do not have enough points to equip this trait.
trait-condition-trait-conflict = You must not have the [color=yellow]{ $trait }[/color] trait.
trait-condition-trait-required = You must have the [color=yellow]{ $trait }[/color] trait.
## Composite conditions
trait-condition-any-of = Any of the following must be true:
• {$requirements}
@@ -49,8 +54,8 @@ trait-condition-department-is = You must be in the [color={$color}]{$department}
trait-condition-department-not = You must not be in the [color={$color}]{$department}[/color] department.
## HasComp borg conditions
trait-condition-borg-not = You must not be a [color=yellow]borg[/color].
trait-condition-borg-not = You must not be a [color=yellow]Silicon[/color].
# Antag conditions
## Antag conditions
trait-condition-antag-is = Must be eligible for [color=red]{$antag}[/color] antag role.
trait-condition-antag-not = Must not be eligible for [color=red]{$antag}[/color] antag role.
@@ -0,0 +1,6 @@
comp-lanyard-has-lanyard = { CAPITALIZE(SUBJECT($user)) } { CONJUGATE-BE($user) } wearing a lanyard, it reads:
comp-lanyard-has-lanyard-blank = { CAPITALIZE(SUBJECT($user)) } { CONJUGATE-BE($user) } wearing a lanyard, but it's blank.
comp-lanyard-has-lanyard-cant-read = { CAPITALIZE(SUBJECT($user)) } { CONJUGATE-BE($user) } wearing a lanyard, but you can't read it from this distance.
# For listing stamps on all labels, not just lanyards
comp-label-examine-detail-stamped-by = The label has been stamped by: {$stamps}.
comp-lanyard-examine-detail-stamped-by = The lanyard has been stamped by: {$stamps}.
@@ -54,8 +54,6 @@ id-card-access-level-external = External
id-card-access-level-nuclear-operative = Nuclear Operative
id-card-access-level-syndicate-agent = Syndicate Agent
id-card-access-level-unused = You shouldn't see this
id-card-access-level-central-command = Central Command
id-card-access-level-wizard = Wizard
+9309 -2749
View File
File diff suppressed because it is too large Load Diff
@@ -218,6 +218,7 @@
- id: NewtonCradle
- id: BoxEnvelope
- id: BrbSign
- id: ClothingNeckLanyard #Harmony addition. Also obtainable through character loadouts and PTech vendor
# Begin DeltaV - More folders & colored paper reams in the bureaucracy crate + denied/approved stamp, low chance of paperwork hater stamp
- id: BoxFolderBlack
amount: 2
@@ -14,10 +14,12 @@
ClothingUniformNightclubSuit: 2 #imp
ClothingUniformNightclubSuitSkirt: 2 #imp
ClothingUniformJumpsuitBartenderPurple: 2
ClothingUniformJumpsuitSodaJerk: 2 # DeltaV
ClothingShoesColorBlack: 2
ClothingOuterArmorDuraVest: 2 # DeltaV - ClothingOuterArmorBasicSlim replaced in favour of stabproof vest
ClothingOuterVest: 2
ClothingBeltBandolier: 2
ClothingEyesGlassesSunglasses: 2
ClothingHeadHatSodaJerkCap: 2 # DeltaV
contrabandInventory:
ToyFigurineBartender: 1
@@ -46,11 +46,15 @@
DrinkJaegermisterBottleFull: 5 # Den - Jaegerminsteeeer!
DrinkWineBottleFull: 5
DrinkChampagneBottleFull: 2 #because the premium drink
DrinkSojuBottleFull: 2 # DeltaV - Soju bottle
DrinkSakeBottleFull: 3
DrinkBeerCan: 5
DrinkWineCan: 5
DrinkAngobittersBottleFull: 3 # DeltaV - Angostura Bitters Bottle
# Begin DeltaV additions
DrinkSojuBottleFull: 2 # Soju bottle
DrinkAngobittersBottleFull: 3 # Angostura Bitters Bottle
DrinkCaramelBottleFull: 3 # Caramel for ice cream stuff
GlassChoppedNuts: 5 # Metaglass of chopped nuts; Here as a stop-gap until we make pistachios growable
# End DeltaV additions
contrabandInventory:
ChemistryBottleEthanol: 3
DrinkBottleOfNothingFull: 1
@@ -26,6 +26,7 @@
ClownPDA: 1
MimePDA: 1
MusicianPDA: 1
ClothingNeckLanyard: 5 #Harmony addition. Also obtainable through bureaucracy crates and character loadouts
# End Delta-V additions
# Begin Delta-V subtractions
# EncryptionKeyCargo: 2
@@ -5,6 +5,17 @@
description: In Space Glasgow this is called a conversation starter.
components:
- type: Sharp
# DeltaV addition
- type: Tool
qualities:
- Slicing
speedModifier: 0.6
useSound:
path: /Audio/Items/Culinary/chop.ogg
- type: Utensil
types:
- Knife
# DeltaV end
- type: Execution
doAfterDuration: 4.0
- type: MeleeWeapon
@@ -527,6 +527,11 @@
- sprite: *icon-rsi-dv # DeltaV - Sec Icon Resprite
offset: *icon-offset
state: Brigmedic
- type: IdCard # DeltaV
jobTitle: job-name-brigmedic
jobIcon: JobIconBrigmedic
- type: PresetIdCard # DeltaV - Puts them in the security department
job: Brigmedic
- type: entity
parent: SecurityIDCard
@@ -896,6 +901,8 @@
- Recyclable
- type: StaticPrice # these are infinitely producible.
price: 0
- type: PresetIdCard # DeltaV - Puts them in the correct department category
job: Prisoner
- type: entity
parent: IDCardStandard
@@ -16,6 +16,7 @@
lastVisibility: 0.1
- type: PowerCellDraw
drawRate: 3.6 # 100 seconds
pauseRecharging: true # DeltaV - Pause recharge while draining
- type: ToggleCellDraw
- type: PowerCellSlot
cellSlotId: cell_slot
@@ -44,3 +45,4 @@
lastVisibility: -1
- type: PowerCellDraw
drawRate: 12 # 30 seconds
pauseRecharging: true # DeltaV - Pause recharge while draining
@@ -11,7 +11,7 @@
damage:
types:
Piercing: 40
Structural: 40 #DeltaV increase from 15 to 40
Structural: 100 # DeltaV - increase from 15 to 100
- type: entity
@@ -951,7 +951,7 @@
sprite: _DV/Structures/Doors/Airlocks/Standard/maint.rsi # DeltaV - Changed to our sprites
- type: entity
parent: AirlockMaintRnDLocked # DeltaV - Chapel is in Epistemics
parent: AirlockChapelLocked # DeltaV - Chapel is in Epistemics
id: AirlockMaintChapelLocked
suffix: Chapel, Locked
components:
+4 -4
View File
@@ -676,14 +676,14 @@
weight: 5 # DeltaV - Was 8 now 5
minimumPlayers: 15
maxOccurrences: 1 # can only happen once per round
startAnnouncement: station-event-communication-interception
startAudio:
path: /Audio/_DV/Announcements/attention.ogg # DeltaV - Use the generic announcement sound
#startAnnouncement: station-event-communication-interception # DeltaV - Silent Sleepers
#startAudio:
# path: /Audio/_DV/Announcements/attention.ogg # DeltaV - Use the generic announcement sound
duration: null # the rule has to last the whole round not 1 second
occursDuringRoundEnd: false
- type: PrecognitionResult # DeltaV - Precogniton
message: psionic-power-precognition-sleeper-agents-result-message
- type: AlertLevelInterceptionRule
#- type: AlertLevelInterceptionRule # DeltaV - Silent Sleepers
- type: AntagSelection
definitions:
- prefRoles: [ TraitorSleeper ]
@@ -15,6 +15,8 @@
name: guide-entry-drinks
text: "/ServerInfo/Guidebook/ReferenceTables/Drinks.xml"
filterEnabled: true
children: # DeltaV - Adding section for our new ice cream catalog to make it easier to search
- FrozenTreats
- type: guideEntry
id: FoodRecipes
@@ -50,6 +50,12 @@
- CandleBlue
- CandleGreenSmall
- type: loadout
id: ClothingNeckLanyard
storage:
back:
- ClothingNeckLanyard
# Smokeables
- type: loadout
id: Lighter
@@ -43,6 +43,7 @@
- ClothingNeckTransPin
- ClothingNeckAutismPin
- ClothingNeckGoldAutismPin
- ClothingNeckLanyard
- OffsetCane
- OffsetCaneWood
- OffsetCaneClown
@@ -447,6 +448,7 @@
loadouts:
- BartenderHead
- BartenderBowler
- SodaJerkCap #DeltaV - Adding retro style outfit for ice cream connoisseurs
- type: loadoutGroup
id: BartenderJumpsuit
@@ -461,6 +463,7 @@
- ClothingUniformSeniorBartender
- ClothingUniformSeniorBartenderSkirt
# End Imp additions
- SodaJerkUniform #DeltaV - Adding retro style outfit for ice cream connoisseurs
- type: loadoutGroup
id: BartenderOuterClothing
+1 -1
View File
@@ -40,7 +40,7 @@
MedicalIntern: [ 1, 3 ]
Paramedic: [ 1, 2 ]
Psychologist: [ 1, 1 ]
Surgeon: [ 1, 1 ]
#Surgeon: [ 1, 1 ] Temporarily disabled
#security
Brigmedic: [ 1, 1 ]
Detective: [ 1, 1 ]
+44 -36
View File
@@ -8,8 +8,10 @@
- CargoTechnician
- Quartermaster
- SalvageSpecialist
- Courier # DeltaV - Courier, see Resources/Prototypes/_DV/Roles/Jobs/Cargo/courier.yml
- CargoAssistant # DeltaV
# BEGIN DeltaV Logistics Jobs
- Courier
- CargoAssistant
# END DeltaV
- type: department
id: Civilian
@@ -21,7 +23,6 @@
roles:
- Bartender
- Botanist
- Boxer # DeltaV - Keep Zookeeper/Boxer
# - Chaplain # DeltaV - Move Chaplain into Epistemics
- Chef
- Clown
@@ -34,11 +35,12 @@
- Passenger
- Reporter
- Visitor
- Zookeeper # DeltaV - Keep Zookeeper/Boxer
- ServiceWorker
- MartialArtist # Nyanotrasen - MartialArtist, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml
- Prisoner # Nyanotrasen - Prisoner, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml
- Gladiator # Nyanotrasen - Gladiator, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml
# BEGIN DeltaV Jobs
- Boxer
- MartialArtist
- Zookeeper
# END DeltaV
- type: department
id: CentralCommand
@@ -112,8 +114,10 @@
- MedicalIntern
- Psychologist
- Paramedic
- MedicalBorg # Delta V - Medical Borg, see Resources/Prototypes/_DV/Roles/Jobs/Medical/medicalborg.yml
- Surgeon # Delta V - Surgeon, see Resources/Prototypes/_DV/Roles/Jobs/Medical/surgeon.yml
# BEGIN DeltaV Med Jobs
- MedicalBorg
- Surgeon
# END DeltaV
- type: department
id: Security
@@ -128,11 +132,13 @@
- SecurityOfficer
- Detective
- Warden
- PrisonGuard # Nyanotrasen - PrisonGuard, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml
- Brigmedic # DeltaV - Brigmedic, see Resources/Prototypes/_DV/Roles/Jobs/Security/brigmedic.yml
- SecurityBorg # Delta-V : Security Borg
- RoleLaika # Delta-V : Secdogs, see Resources/Prototypes/_DV/Roles/Jobs/Pets/pets.yml
- RoleK9Officer # Delta-V : Secdogs, see Resources/Prototypes/_DV/Roles/Jobs/Security/k9.yml
# BEGIN DeltaV Sec Jobs
- Brigmedic
- PrisonGuard
- SecurityBorg
- RoleLaika
- RoleK9Officer
# END DeltaV
- type: department
id: Epistemics # DeltaV - Epistemics Department replacing Science
@@ -144,10 +150,12 @@
- ResearchDirector
- Scientist
- ResearchAssistant
- Chaplain # DeltaV - Move Chaplain into Epistemics
- ForensicMantis # Nyanotrasen - ForensicMantis, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml
- Roboticist # DeltaV: Roboticist job
- Librarian # DeltaV - Move Librarian into epistemics as curator
# BEGIN DeltaV Epi Jobs
- Chaplain # Moved from Service into Epi
- ForensicMantis
- Librarian # Curator, moved from Service into Epi
- Roboticist
# END DeltaV
- type: department
id: Silicon
@@ -156,24 +164,24 @@
color: "#D381C9"
roles:
- Borg
- MedicalBorg # DeltaV - roundstart mediborg job
- SecurityBorg # Delta-V : Security Borg
- StationAi
# BEGIN DeltaV Silicon Jobs
- MedicalBorg
- SecurityBorg
# END DeltaV
primary: false # DeltaV - removed from primary dept
- type: department
id: Specific
name: department-Specific
description: department-Specific-description
color: "#9FED58"
weight: 10
roles:
- Boxer # DeltaV - Keep Zookeeper/Boxer
- Reporter
- Zookeeper # DeltaV - Keep Zookeeper/Boxer
- Psychologist
- MartialArtist # Nyanotrasen - MartialArtist, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml
- Gladiator # Nyanotrasen - Gladiator, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml
- Prisoner # Nyanotrasen - Prisoner, see Resrouces/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml
- Brigmedic # DeltaV - Corpsman, see Resources/Prototypes/_DV/Roles/Jobs/Security/brigmedic.yml
primary: false
# DeltaV - get rid of 'station-specific' as a department. All of these
# jobs are under another category, so all this does is list
# them twice in the job select and on the crew monitor.
# - type: department
# id: Specific
# name: department-Specific
# description: department-Specific-description
# color: "#9FED58"
# weight: 10
# roles:
# - Reporter
# - Psychologist
# primary: false
# END DeltaV
+1 -1
View File
@@ -1,6 +1,6 @@
- type: accessLevel
id: DV-SpareSafe
name: id-card-access-level-unused
name: id-card-access-level-emergency-command
- type: accessGroup
id: AllAccessBorg
@@ -0,0 +1,428 @@
- type: thiefBackpackSet
id: ERTPatosBundle
name: ert-amber-gun-name-patos
description: ert-amber-gun-desc-patos
sprite:
sprite: _DV/Objects/Weapons/Guns/SMGs/patos.rsi
state: icon
content:
- WeaponSubMachineGunPatos
- MagazinePistolHighCapacity
- MagazinePistolHighCapacity
- MagazinePistolHighCapacity
- MagazinePistolHighCapacity
- type: thiefBackpackSet
id: ERTaegunBundle
name: ert-amber-gun-name-aegun
description: ert-amber-gun-desc-aegun
sprite:
sprite: _DV/Objects/Weapons/Guns/Battery/energygunadvanced.rsi
state: icon
content:
- WeaponEnergyGunAdvanced
- type: thiefBackpackSet
id: ERTmixlaserBundle
name: ert-amber-gun-name-mixlaser
description: ert-amber-gun-desc-mixlaser
sprite:
sprite: Objects/Weapons/Guns/Battery/laser_gun.rsi
state: icon
content:
- WeaponLaserCarbine
- WeaponDisablerSMG
- PortableRecharger
- type: thiefBackpackSet
id: ERTMedkit
name: ert-medkit-name
description: ert-medkit-desc
sprite:
sprite: Objects/Specific/Medical/firstaidkits.rsi
state: firstaid
content:
- MedkitFilled
- type: thiefBackpackSet
id: ERTBrutekit
name: ert-brutekit-name
description: ert-brutekit-desc
sprite:
sprite: Objects/Specific/Medical/firstaidkits.rsi
state: brutekit
content:
- MedkitBruteFilled
- type: thiefBackpackSet
id: ERTLecterkit
name: ert-lecterkit-name
description: ert-lecterbundle-desc
sprite:
sprite: _DV/Objects/Weapons/Guns/Rifles/lecter.rsi
state: icon
content:
- WeaponRifleLecter
- MagazineRifle
- MagazineRifle
- MagazineRifle
- MagazineRifle
- MagazineRifle
- type: thiefBackpackSet
id: ERTDrozdkit
name: ert-drozdkit-name
description: ert-drozdkit-desc
sprite:
sprite: _DV/Objects/Weapons/Guns/SMGs/drozd.rsi
state: icon
content:
- WeaponSubMachineGunDrozd
- MagazinePistolSubMachineGun
- MagazinePistolSubMachineGun
- MagazinePistolSubMachineGunRubber
- MagazinePistolSubMachineGunRubber
- MagazinePistolSubMachineGunUranium
- MagazinePistolSubMachineGunUranium
- MagazinePistolSubMachineGunUranium
- type: thiefBackpackSet
id: ERTLaserIK30kit
name: ert-IK30kit-name
description: ert-IK30kit-desc
sprite:
sprite: _DV/Objects/Weapons/Guns/Rifles/lasercarbine.rsi
state: icon
content:
- WeaponRifleLaser
- MagazineLaser
- MagazineLaser
- MagazineLaser
- MagazineLaser
- MagazineLaser
- type: thiefBackpackSet
id: ERTEnforcerkit
name: ert-enforcerkit-name
description: ert-enforcerkit-desc
sprite:
sprite: _DV/Objects/Weapons/Guns/Shotguns/enforcer.rsi
state: icon
content:
- WeaponShotgunEnforcer
- BoxLethalshot
- BoxLethalshot
- BoxLethalshot
- type: thiefBackpackSet
id: ERTCombatMedkit
name: ert-CombatMedkit-name
description: ert-CombatMedkit-desc
sprite:
sprite: Objects/Specific/Medical/firstaidkits.rsi
state: blackkit
content:
- MedkitCombatFilled
- type: thiefBackpackSet
id: ERTAutoInjectorLight
name: ert-AutoInjectorLight-name
description: ert-AutoInjectorLight-desc
sprite:
sprite: Objects/Specific/Medical/medipen.rsi
state: punctpen
content:
- BurnAutoInjector
- BurnAutoInjector
- PunctAutoInjector
- PunctAutoInjector
- Gauze
- type: thiefBackpackSet
id: ERTAdvancedTopicals
name: ert-AdvancedTopicals-name
description: ert-AdvancedTopicals-desc
sprite:
sprite: Objects/Specific/Medical/firstaidkits.rsi
state: advkit
content:
- MedicatedSuture
- RegenerativeMesh
- MedkitAdvancedFilled
- type: thiefBackpackSet
id: ERTLeaderOfficerRed
name: ert-LeaderRedOfficer-name
description: ert-LeaderRedOfficer-desc
sprite:
sprite: _DV/Objects/Weapons/Guns/Pistols/universal.rsi
state: icon
content:
- WeaponPistolUniversal
- SyndicateWhistle
- MagazineUniversalMagnum
- MagazineUniversalMagnum
- MagazineUniversalMagnum
- WeaponAdvancedLaser
- Binoculars
- type: thiefBackpackSet
id: ERTLeaderWTRed
name: ert-LeaderRedWT-name
description: ert-LeaderRedWT-desc
sprite:
sprite: Objects/Weapons/Guns/SMGs/wt550.rsi
state: icon
content:
- WeaponSubMachineGunWt550
- MagazinePistolSubMachineGunTopMounted
- MagazinePistolSubMachineGunTopMounted
- MagazinePistolSubMachineGunTopMounted
- MagazinePistolSubMachineGunTopMounted
- TelescopicShield
- TelescopicShield
- type: thiefBackpackSet
id: ERTLeaderColdCannonRed
name: ert-LeaderRedColdCannon-name
description: ert-LeaderRedColdCannon-desc
sprite:
sprite: _DV/Objects/Weapons/Guns/Battery/cold_cannon.rsi
state: icon
content:
- WeaponColdCannon
- PortableRecharger
- type: thiefBackpackSet
id: ERTLeaderGammaAtrides
name: ert-LeaderAtrides-name
description: ert-LeaderAtrides-desc
sprite:
sprite: Objects/Weapons/Guns/SMGs/atreides.rsi
state: icon
content:
- WeaponSubMachineGunAtreides
- MagazinePistolSubMachineGun
- MagazinePistolSubMachineGun
- MagazinePistolSubMachineGun
- MagazinePistolSubMachineGun
- MagazinePistolSubMachineGun
- TelescopicShield
- TelescopicShield
- type: thiefBackpackSet
id: ERTLeaderGammaPulseRifle
name: ert-GammaPulseRifle-name
description: ert-GammaPulseRifle-desc
sprite:
sprite: Objects/Weapons/Guns/Battery/pulse_rifle.rsi
state: icon
content:
- WeaponPulseRifle
- type: thiefBackpackSet
id: ERTLeaderGammaAntelope
name: ert-GammaLeaderAntelope-name
description: ert-GammaLeaderAntelope-desc
sprite:
sprite: _DV/Objects/Weapons/Guns/Shotguns/Antelope.rsi
state: icon
content:
- WeaponShotgunAntelope
- MagazineShotgun
- MagazineShotgun
- MagazineShotgun
- MagazineShotgun
- MagazineShotgun
- type: thiefBackpackSet
id: ERTLeaderOfficerGamma
name: ert-GammaOfficer-name
description: ert-GammaOfficer-desc
sprite:
sprite: Objects/Weapons/Guns/Pistols/N1984.rsi
state: icon
content:
- SyndicateWhistle
- WeaponPistolN1984
- MagazineMagnum
- MagazineMagnum
- MagazineMagnum
- MagazineBoxMagnum
- MagazineBoxMagnum
- Binoculars
- type: thiefBackpackSet
id: ERTGammaSecCombatkit
name: ert-GammaSecCombatkit-name
description: ert-GammaSecCombatkit-desc
sprite:
sprite: Objects/Specific/Medical/firstaidkits.rsi
state: blackkit
content:
- MedkitCombatFilled
- PunctAutoInjector
- PyraAutoInjector
- type: thiefBackpackSet
id: ERTGammaSecStimkit
name: ert-GammaSecStimkit-name
description: ert-GammaSecStimkit-desc
sprite:
sprite: Objects/Specific/Medical/advanced_jetinjector.rsi
state: jetinjector_base
content:
- AdvancedJetInjector
- ChemistryBottleEphedrine
- ChemistryBottleEphedrine
- ChemistryBottleOmnizine
- type: thiefBackpackSet
id: ERTGammaSecChemkit
name: ert-GammaSecliquidkit-name
description: ert-GammaSecliquidkit-desc
sprite:
sprite: Objects/Specific/Medical/jetinjector.rsi
state: jetinjector_base
content:
- AdvancedJetInjector
- BoxBottleMedicineBasic
- type: thiefBackpackSet
id: ERTGammaSecWT
name: ert-GammaWTkit-name
description: ert-GammaWTkit-desc
sprite:
sprite: Objects/Weapons/Guns/SMGs/wt550.rsi
state: icon
content:
- WeaponSubMachineGunWt550
- MagazinePistolSubMachineGunTopMounted
- MagazinePistolSubMachineGunTopMounted
- MagazinePistolSubMachineGunTopMounted
- MagazinePistolSubMachineGunTopMounted
- MagazinePistolSubMachineGunTopMounted
- TelescopicShield
- TelescopicShield
- type: thiefBackpackSet
id: ERTGammaSecEnforcer
name: ert-enforcerkitspecial-name
description: ert-enforcerkitspecial-desc
sprite:
sprite: _DV/Objects/Weapons/Guns/Shotguns/enforcer.rsi
state: icon
content:
- WeaponShotgunEnforcer
- BoxLethalshot
- BoxLethalshot
- BoxShotgunUranium
- BoxShotgunUranium
- BoxShotgunIncendiary
- BoxShotgunIncendiary
- type: thiefBackpackSet
id: ERTGammaSecImmolator
name: ert-Immolatorkit-name
description: ert-Immolatorkit-desc
sprite:
sprite: _DV/Objects/Weapons/Guns/Battery/multi_lens_immolator.rsi
state: icon
content:
- WeaponImmolatorMulti
- WeaponEnergyGun
- PortableRecharger
- type: thiefBackpackSet
id: ERTGammaSecIK60
name: ert-IK60kit-name
description: ert-IK60kit-desc
sprite:
sprite: _DV/Objects/Weapons/Guns/Rifles/lasercarbineert.rsi
state: icon
content:
- WeaponRifleLaserERT
- MagazineLaser
- MagazineLaser
- MagazineLaser
- MagazineLaser
- type: thiefBackpackSet
id: ERTGammaC4
name: ert-GammaC4-name
description: ert-GammaC4-desc
sprite:
sprite: Objects/Weapons/Bombs/c4.rsi
state: icon
content:
- BoxC4
- type: thiefBackpackSet
id: ERTGammaThermals
name: ert-GammaThermals-name
description: ert-GammaThermals-desc
sprite:
sprite: _White/Clothing/Eyes/Goggles/thermal.rsi
state: icon
content:
- ClothingMaskGasDeathSquad
- type: thiefBackpackSet
id: ERTGammaJets
name: ert-GammaJets-name
description: ert-GammaJets-desc
sprite:
sprite: _DV/Objects/Tanks/Jetpacks/blue.rsi
state: icon
content:
- HandHeldMassScanner
- JetpackBlueFilled
- PowerCellMicroreactor
- DoubleEmergencyOxygenTankFilled
- DoubleEmergencyNitrogenTankFilled
- type: thiefBackpackSet
id: ERTGammaHE
name: ert-GammaNadesHE-name
description: ert-GammaNadesHE-desc
sprite:
sprite: Objects/Weapons/Grenades/grenade.rsi
state: icon
content:
- ExGrenade
- ExGrenade
- ExGrenade
- type: thiefBackpackSet
id: ERTGammaSmoke
name: ert-GammaSmokes-name
description: ert-GammaSmokes-desc
sprite:
sprite: Objects/Weapons/Grenades/smoke.rsi
state: icon
content:
- SmokeGrenade
- SmokeGrenade
- SmokeGrenade
- type: thiefBackpackSet
id: ERTGammaIncend
name: ert-GammaIncend-name
description: ert-GammaIncend-desc
sprite:
sprite: Objects/Weapons/Grenades/pyrogrenade.rsi
state: icon
content:
- GrenadeIncendiary
- GrenadeIncendiary
- type: thiefBackpackSet
id: ERTGammaEMP
name: ert-GammaEMP-name
description: ert-GammaEMP-desc
sprite:
sprite: Objects/Weapons/Grenades/empgrenade.rsi
state: icon
content:
- EmpGrenade
- EmpGrenade
@@ -0,0 +1,81 @@
- type: entity
id: ClothingBackpackDeathSquadFilledBase
parent: ClothingBackpackDeathSquad
suffix: Base
components:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WelderExperimental
- id: ToolDebug
- id: Multitool
- id: SpeedLoaderMagnum
- id: SpeedLoaderMagnum
- id: SpeedLoaderMagnum
- id: SpeedLoaderMagnum
- id: SpeedLoaderMagnum
- id: HandHeldMassScanner
- id: PinpointerNuclear
- id: DoorRemoteCustom
- type: entity
id: ClothingBackpackDeathSquadFilledBlack
parent: ClothingBackpackDeathSquad
suffix: Black
components:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WelderExperimental
- id: ToolDebug
- id: Multitool
- id: SpeedLoaderMagnum
- id: SpeedLoaderMagnum
- id: SpeedLoaderMagnum
- id: SpeedLoaderMagnum
- id: SpeedLoaderMagnum
- id: HandHeldMassScanner
- id: PinpointerNuclear
- id: DoorRemoteCustom
- id: WeaponPulseRifle
- id: ExGrenade
- id: ExGrenade
- id: ExGrenade
- id: ExGrenade
- id: ExGrenade
- id: BoxC4
- id: SpeedLoaderMagnumUranium
- id: SpeedLoaderMagnumUranium
- type: entity
id: ClothingBackpackDeathSquadFilledEpsilon
parent: ClothingBackpackDeathSquad
suffix: Epsilon
components:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WelderExperimental
- id: ToolDebug
- id: Multitool
- id: SpeedLoaderMagnum
- id: SpeedLoaderMagnum
- id: SpeedLoaderMagnum
- id: SpeedLoaderMagnum
- id: HandHeldMassScanner
- id: PinpointerNuclear
- id: DoorRemoteCustom
- id: WeaponShotgunAntelope
- id: MagazineShotgunBeanbag
- id: MagazineShotgunBeanbag
- id: MagazineShotgunBeanbag
- id: MagazineShotgunBeanbag
- id: MagazineShotgunBeanbag
- id: MagazineShotgunBeanbag
- id: BoxHandcuff
- id: MagazineShotgun
- id: MagazineShotgun
- id: MagazineShotgun
@@ -123,3 +123,24 @@
- id: SpeedLoaderMagnum
amount: !type:RangeNumberSelector
range: 0, 2
- type: entity
id: ClothingBeltMilitaryWebbingERTMedicine
parent: ClothingBeltMilitaryWebbingERT
suffix: Filled
components:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MedkitCombatFilled
- id: AirlossAutoInjector
- id: BurnAutoInjector
- id: BruteAutoInjector
- id: PunctAutoInjector
- id: PyraAutoInjector
- id: AirlossAutoInjector
- id: BurnAutoInjector
- id: BruteAutoInjector
- id: PunctAutoInjector
- id: PyraAutoInjector
@@ -510,3 +510,14 @@
tags:
- PetWearable
- CorgiWearable
- type: entity
parent: ClothingHeadBase
id: ClothingHeadHatSodaJerkCap
name: soda jerk cap
description: I was a wimp before the soda jerk.
components:
- type: Sprite
sprite: _DV/Clothing/Head/Hats/SodaJerkCap.rsi
- type: Clothing
sprite: _DV/Clothing/Head/Hats/SodaJerkCap.rsi
@@ -772,3 +772,15 @@
sprite: _DV/Clothing/Uniforms/Jumpsuit/WrestlerCostumeBlue.rsi
- type: Clothing
sprite: _DV/Clothing/Uniforms/Jumpsuit/WrestlerCostumeBlue.rsi
- type: entity
parent: ClothingUniformBase
id: ClothingUniformJumpsuitSodaJerk
name: soda jerk jumpsuit
description: Now I'm a jerk, and now everyone loves me!
components:
- type: Sprite
sprite: _DV/Clothing/Uniforms/Jumpsuit/SodaJerk.rsi
- type: Clothing
sprite: _DV/Clothing/Uniforms/Jumpsuit/SodaJerk.rsi
@@ -15,3 +15,21 @@
- type: Sprite
sprite: _DV/Objects/Consumable/Drinks/angobitters.rsi
- type: Sealable
- type: entity
parent: [DrinkVisualsOpenable, DrinkBottlePlasticSmallBaseFull]
id: DrinkCaramelBottleFull
name: caramel bottle
description: A bottle of what is essentially molten sugar with enough water to keep it somewhat fluid.
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: Caramel
Quantity: 50
- type: Sprite
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/caramel-bottle.rsi
- type: Label
currentLabel: reagent-name-caramel
@@ -0,0 +1,406 @@
# I SCREAM, YOU SCREAM, WE ALL SCREAM FOR ICE CREAM
- type: entity
parent: DrinkGlass
id: DrinkIceCreamAppleCaramel
suffix: apple caramel ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamAppleCaramel
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-applecaramel.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamCaramel
suffix: caramel ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamCaramel
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-caramel.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamCaramelFudge
suffix: caramel fudge ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamCaramelFudge
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-caramelfudge.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamCherry
suffix: cherry ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamCherry
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-cherry.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamChocolate
suffix: chocolate ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamChocolate
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-chocolate.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamBerryCobbler
suffix: cobbler's ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamBerryCobbler
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-cobblers.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamCoffee
suffix: coffee ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamCoffee
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-coffee.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamCookieDough
suffix: cookie dough ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamCookieDough
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-cookiedough.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamGreenTea
suffix: green tea ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamGreenTea
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-greentea.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamMint
suffix: mint ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamMint
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-mint.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamNeapolitan
suffix: neapolitan ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamNeapolitan
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-neapolitan.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamPistachio
suffix: pistachio ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamPistachio
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-pistachio.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamRockyRoad
suffix: rocky road ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamRockyRoad
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-rockyroad.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamTower
suffix: tower of ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamTower
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-tower.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamVegan
suffix: vegan ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamVegan
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-vegan.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamWatermelon
suffix: watermelon ice cream
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamWatermelon
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-watermelon.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkSherbetRainbow
suffix: rainbow sherbet
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamSherbetRainbow
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-rainbow.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIceCreamSherbetlemon
suffix: lemon sherbet
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamSherbetLemon
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-lemon.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkSherbetLime
suffix: lime sherbet
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamSherbetLime
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-lime.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkSherbetOrange
suffix: orange sherbet
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamSherbetOrange
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-orange.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkSherbetPineapple
suffix: pineapple sherbet
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamSherbetPineapple
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-pineapple.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkSherbetRaspberry
suffix: raspberry sherbet
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamSherbetRaspberry
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-raspberry.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkSlushBlueRaspberry
suffix: blue raspberry slush
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: SlushBlueRaspberry
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/slush-blueraspberry.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkSlushCherry
suffix: cherry slush
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: SlushCherry
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/slush-cherry.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkSlushCola
suffix: cola slush
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: SlushCola
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/slush-cola.rsi
state: icon
- type: entity
parent: DrinkGlass
id: IceCreamSundaeTropical
suffix: tropical sundae
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: IceCreamSundaeTropical
Quantity: 30
- type: Icon
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/tropicalsunday.rsi
state: icon
# Stop-gap for making chopped nuts available; In a later edition, going to make pistachios growable and grindable
# to get chopped nuts (including grinding Sweeties packs)
- type: entity
id: GlassChoppedNuts
parent: DrinkGlass
suffix: chopped nuts
components:
- type: Label
currentLabel: reagent-name-chopped-nuts
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: ChoppedNuts
Quantity: 30
@@ -0,0 +1,10 @@
- type: entity
parent: WeaponEnergyTurretStationMachineCircuitboardBase
id: WeaponEnergyTurretCentralCommandTurretboard
suffix: CentComm
components:
- type: Sprite
sprite: Objects/Misc/module.rsi
state: command
- type: MachineBoard
prototype: WeaponEnergyTurretCentralCommand
@@ -0,0 +1,10 @@
- type: entity
parent: WeaponEnergyTurretStationControlPanelElectronicsBase
id: WeaponEnergyTurretCentralCommandControlPanelElectronics
suffix: CentComm
components:
- type: Sprite
sprite: Objects/Misc/module.rsi
state: command
- type: ElectronicsBoard
prototype: WeaponEnergyTurretCentralCommandControlPanel
@@ -0,0 +1,158 @@
- type: entity
parent: ToolboxThief
id: ERTGearSelectorGunAmberSec
name: ERT Equipment Selector
suffix: Amber, Sec, Guns
description: "A small item teleporting a pre-determined set of equipment into the ERT members hands"
components:
- type: Sprite
sprite: _Goobstation/Objects/Devices/unique_teleporters.rsi
state: standard
- type: ThiefUndeterminedBackpack
maxSelectedSets: 1
possibleSets:
- ERTPatosBundle
- ERTaegunBundle
- ERTmixlaserBundle
- type: entity
parent: ToolboxThief
id: ERTGearSelectorMedsAmber
name: ERT Equipment Selector
suffix: Amber, Sec, Meds
description: "A small item teleporting a pre-determined set of equipment into the ERT members hands"
components:
- type: Sprite
sprite: _Goobstation/Objects/Devices/unique_teleporters.rsi
state: standard
- type: ThiefUndeterminedBackpack
maxSelectedSets: 1
possibleSets:
- ERTMedkit
- ERTBrutekit
- type: entity
parent: ToolboxThief
id: ERTGearSelectorGunRedSec
name: ERT Equipment Selector
suffix: Red, Sec, Guns
description: "A small item teleporting a pre-determined set of equipment into the ERT members hands"
components:
- type: Sprite
sprite: _Goobstation/Objects/Devices/unique_teleporters.rsi
state: standard
- type: ThiefUndeterminedBackpack
maxSelectedSets: 1
possibleSets:
- ERTLaserIK30kit
- ERTDrozdkit
- ERTLecterkit
- ERTEnforcerkit
- type: entity
parent: ToolboxThief
id: ERTGearSelectorMedsRed
name: ERT Equipment Selector
suffix: Red, Sec, Meds
description: "A small item teleporting a pre-determined set of equipment into the ERT members hands"
components:
- type: Sprite
sprite: _Goobstation/Objects/Devices/unique_teleporters.rsi
state: standard
- type: ThiefUndeterminedBackpack
maxSelectedSets: 1
possibleSets:
- ERTAutoInjectorLight
- ERTAdvancedTopicals
- ERTCombatMedkit
- type: entity
parent: ToolboxThief
id: ERTGearSelectorLeaderRed
name: ERT Equipment Selector
suffix: Red, Leader
description: "A small item teleporting a pre-determined set of equipment into the ERT members hands"
components:
- type: Sprite
sprite: _Goobstation/Objects/Devices/unique_teleporters.rsi
state: standard
- type: ThiefUndeterminedBackpack
maxSelectedSets: 1
possibleSets:
- ERTLeaderOfficerRed
- ERTLeaderWTRed
- ERTLeaderColdCannonRed
- type: entity
parent: ToolboxThief
id: ERTGearSelectorGunGammaSec
name: ERT Equipment Selector
suffix: Gamma, Gun, Sec
description: "A small item teleporting a pre-determined set of equipment into the ERT members hands"
components:
- type: Sprite
sprite: _Goobstation/Objects/Devices/unique_teleporters.rsi
state: standard
- type: ThiefUndeterminedBackpack
maxSelectedSets: 1
possibleSets:
- ERTGammaSecEnforcer
- ERTGammaSecWT
- ERTGammaSecImmolator
- ERTGammaSecIK60
- type: entity
parent: ToolboxThief
id: ERTGearSelectorMedsGammaSec
name: ERT Equipment Selector
suffix: Gamma, Meds, Sec
description: "A small item teleporting a pre-determined set of equipment into the ERT members hands"
components:
- type: Sprite
sprite: _Goobstation/Objects/Devices/unique_teleporters.rsi
state: standard
- type: ThiefUndeterminedBackpack
maxSelectedSets: 1
possibleSets:
- ERTGammaSecCombatkit
- ERTGammaSecStimkit
- ERTGammaSecChemkit
- type: entity
parent: ToolboxThief
id: ERTGearSelectorLeaderGamma
name: ERT Equipment Selector
suffix: Gamma, Leader
description: "A small item teleporting a pre-determined set of equipment into the ERT members hands"
components:
- type: Sprite
sprite: _Goobstation/Objects/Devices/unique_teleporters.rsi
state: standard
- type: ThiefUndeterminedBackpack
maxSelectedSets: 1
possibleSets:
- ERTLeaderOfficerGamma
- ERTLeaderGammaAntelope
- ERTLeaderGammaAtrides
- ERTLeaderGammaPulseRifle
- type: entity
parent: ToolboxThief
id: ERTGearSelectorGammaSecUtility
name: ERT Equipment Selector
suffix: Gamma, Sec, Utility
description: "A small item teleporting a pre-determined set of equipment into the ERT members hands"
components:
- type: Sprite
sprite: _Goobstation/Objects/Devices/unique_teleporters.rsi
state: standard
- type: ThiefUndeterminedBackpack
maxSelectedSets: 1
possibleSets:
- ERTGammaC4
- ERTGammaThermals
- ERTGammaJets
- ERTGammaHE
- ERTGammaSmoke
- ERTGammaIncend
- ERTGammaEMP
@@ -472,13 +472,37 @@
icon: { sprite: _DV/Interface/Actions/actions_borg.rsi, state: syndicate-infiltrator-module }
- type: entity
parent: CloakingDevice
parent: [ BaseItem, BaseSyndicateContraband ]
id: CloakingDeviceSyndicateBorg
name: syndicate cloaking device
description: A device that allows the borg to become cloaked for a short amount of time. Will recharge after 30 seconds of non-use.
components:
- type: Sprite
sprite: Objects/Tools/access_breaker.rsi # Finally using this awesome icon
sprite: Objects/Tools/access_breaker.rsi # Finally using this awesome sprite
state: icon
- type: ItemToggle
- type: ComponentToggler
parent: true
components:
- type: Stealth
minVisibility: 0.1
lastVisibility: 0.1
- type: PowerCellDraw
drawRate: 3.6
pauseRecharging: true
- type: ToggleCellDraw
- type: PowerCellSlot
cellSlotId: cell_slot
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
- type: ItemSlots
slots:
cell_slot:
name: power-cell-slot-component-slot-name-default
startingItem: PowerCellSmallNuclear
disableEject: true
swap: false
# Service Modules
@@ -15,3 +15,23 @@
- SmallMobMask # same as mouse, lets it go under doors but not phase through walls
layer:
- SmallMobLayer
- type: entity
parent: WeaponEnergyTurretStationBase
id: WeaponEnergyTurretCentralCommand
suffix: CentComm
components:
- type: AccessReader
access: [["CentralCommand"]]
- type: StationAiTurret
- type: TurretTargetSettings
exemptAccessLevels:
- CentralCommand
- ERT
- type: Machine
board: WeaponEnergyTurretCentralCommandTurretboard
- type: DeviceNetwork
receiveFrequencyId: TurretControl
transmitFrequencyId: Turret
- type: StationAiVision
range: 0
@@ -0,0 +1,23 @@
- type: entity
parent: WeaponEnergyTurretStationControlPanelBase
id: WeaponEnergyTurretCentralCommandControlPanel
suffix: CentComm
components:
- type: AccessReader
access: [["CentralCommand"]]
- type: ContainerFill
containers:
board:
- WeaponEnergyTurretCentralCommandControlPanelElectronics
- type: StationAiVision #DeltaV
range: 0
- type: TurretTargetSettings
exemptAccessLevels:
- CentralCommand
- ERT
- type: DeployableTurretController
accessGroups:
- General
accessLevels:
- CentralCommand
- ERT
@@ -0,0 +1,44 @@
- type: flavor
id: tart
flavorType: Complex
description: flavor-complex-tart
- type: flavor
id: IceCreamAppleCaramel
flavorType: Complex
description: flavor-complex-icecream-apple-caramel
- type: flavor
id: IceCreamCaramelFudge
flavorType: Complex
description: flavor-complex-icecream-caramel-fudge
- type: flavor
id: IceCreamCobbler
flavorType: Complex
description: flavor-complex-icecream-cobbler
- type: flavor
id: IceCreamCookieDough
flavorType: Complex
description: flavor-complex-icecream-cookiedough
- type: flavor
id: IceCreamNeapolitan
flavorType: Complex
description: flavor-complex-icecream-neapolitan
- type: flavor
id: IceCreamRockyRoad
flavorType: Complex
description: flavor-complex-icecream-rockyroad
- type: flavor
id: IceCreamTower
flavorType: Complex
description: flavor-complex-icecream-tower
- type: flavor
id: IceCreamRainbow
flavorType: Complex
description: flavor-complex-icecream-rainbow
@@ -430,12 +430,8 @@
minimumPlayers: 25
weight: 3
maxOccurrences: 1
startAnnouncement: station-event-communication-interception
startAudio:
path: /Audio/_DV/Announcements/attention.ogg
duration: null
occursDuringRoundEnd: false
- type: AlertLevelInterceptionRule
- type: AntagRandomObjectives
sets:
- groups: NTAgentObjectiveGroup
@@ -475,7 +471,7 @@
path: /Audio/_DV/Announcements/attention.ogg
earliestStart: 1
minimumPlayers: 10
weight: 5
weight: 1
duration: 15
- type: PrecognitionResult
message: psionic-power-precognition-pitbull-spawn-result-message
@@ -0,0 +1,6 @@
# Adding group for frozen treats since we kinda added a LOT of those
- type: guideEntry
id: FrozenTreats
name: guide-entry-frozentreat-recipes
text: "/ServerInfo/Guidebook/_DV/Service/FrozenTreats.xml"
filterEnabled: True
@@ -14,3 +14,14 @@
id: BartenderGlasses
equipment:
eyes: ClothingEyesHudBeer
# Soda Jerk and Cap
- type: loadout
id: SodaJerkUniform
equipment:
jumpsuit: ClothingUniformJumpsuitSodaJerk
- type: loadout
id: SodaJerkCap
equipment:
head: ClothingHeadHatSodaJerkCap
@@ -0,0 +1,518 @@
- type: reagent
abstract: true
parent: BaseDrink
id: BaseDrinkFrozenTreat
group: FrozenTreats
metamorphicMaxFillLevels: 5
metamorphicFillBaseName: fill-
metamorphicChangeColor: false
footstepSound:
collection: FootstepSlime
- type: reagent
parent: BaseDrink
id: Caramel
name: reagent-name-caramel
desc: reagent-desc-caramel
physicalDesc: reagent-physical-desc-syrupy
flavor: sweet
color: "#F39E33"
recognizable: true
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 1
- type: reagent
parent: BaseDrink
id: ChoppedNuts
name: reagent-name-chopped-nuts
desc: reagent-desc-chopped-nuts
physicalDesc: reagent-physical-desc-aromatic
flavor: nutty
color: "#F1BB24"
recognizable: true
metamorphicMaxFillLevels: 5
metamorphicFillBaseName: fill-
metamorphicChangeColor: false
metabolisms:
Drink:
effects:
- !type:SatiateHunger
factor: 1
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/chopped-nuts.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamAppleCaramel
name: reagent-name-icecream-apple-caramel
desc: reagent-desc-icecream-apple-caramel
physicalDesc: reagent-physical-desc-creamy
flavor: IceCreamAppleCaramel
color: "#F9CD85"
recognizable: true
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 2
- !type:HealthChange
conditions:
- !type:ReagentCondition
reagent: IceCreamAppleCaramel
min: 20
damage:
types:
Cold: .25
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-applecaramel.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamCaramel
name: reagent-name-icecream-caramel
desc: reagent-desc-icecream-caramel
physicalDesc: reagent-physical-desc-creamy
flavor: sweet
color: "#F9CD85"
recognizable: true
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-caramel.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamCaramelFudge
name: reagent-name-icecream-caramel-fudge
desc: reagent-desc-icecream-caramel-fudge
physicalDesc: reagent-physical-desc-creamy
flavor: IceCreamCaramelFudge
color: "#C06B20"
recognizable: true
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 2
- !type:HealthChange
conditions:
- !type:ReagentCondition
reagent: IceCreamCaramelFudge
min: 20
damage:
types:
Cold: .25
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-caramelfudge.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamCherry
name: reagent-name-icecream-cherry
desc: reagent-desc-icecream-cherry
physicalDesc: reagent-physical-desc-creamy
flavor: cherry
color: "#FF8888"
recognizable: true
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-cherry.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamChocolate
name: reagent-name-icecream-chocolate
desc: reagent-desc-icecream-chocolate
physicalDesc: reagent-physical-desc-creamy
flavor: chocolate
color: "#664300"
recognizable: true
metabolisms:
Drink:
effects:
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-chocolate.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamBerryCobbler
name: reagent-name-icecream-cobbler
desc: reagent-desc-icecream-cobbler
physicalDesc: reagent-physical-desc-creamy
flavor: IceCreamCobbler
color: "#FF8888"
recognizable: true
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-cobblers.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamCoffee
name: reagent-name-icecream-coffee
desc: reagent-desc-icecream-coffee
physicalDesc: reagent-physical-desc-creamy
flavor: coffee
color: "#664300"
recognizable: true
metabolisms:
Drink:
effects:
- !type:ModifyStatusEffect
effectProto: StatusEffectDrowsiness
time: 2
type: Remove
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-coffee.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamCookieDough
name: reagent-name-icecream-cookiedough
desc: reagent-desc-icecream-cookiedough
physicalDesc: reagent-physical-desc-creamy
flavor: IceCreamCookieDough
color: "#FFFBD6"
recognizable: true
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 2
- !type:HealthChange
conditions:
- !type:ReagentCondition
reagent: IceCreamCookieDough
min: 20
damage:
types:
Cold: .25
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-cookiedough.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamGreenTea
name: reagent-name-icecream-greentea
desc: reagent-desc-icecream-greentea
physicalDesc: reagent-physical-desc-creamy
flavor: tea
color: "#7EB626"
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 2
- !type:HealthChange
conditions:
- !type:ReagentCondition
reagent: IceCreamGreenTea
min: 20
damage:
types:
Cold: .25
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-greentea.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamMint
name: reagent-name-icecream-mint
desc: reagent-desc-icecream-mint
physicalDesc: reagent-physical-desc-creamy
flavor: minty
color: "#A3F979"
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-mint.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamNeapolitan
name: reagent-name-icecream-neapolitan
desc: reagent-desc-icecream-neapolitan
physicalDesc: reagent-physical-desc-creamy
flavor: IceCreamNeapolitan
color: "#FFFBD6"
recognizable: true
metabolisms:
Drink:
effects:
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-neapolitan.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamPistachio
name: reagent-name-icecream-pistachio
desc: reagent-desc-icecream-pistachio
physicalDesc: reagent-physical-desc-creamy
flavor: nutty
color: "#99B334"
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-pistachio.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamRockyRoad
name: reagent-name-icecream-rockyroad
desc: reagent-desc-icecream-rockyroad
physicalDesc: reagent-physical-desc-creamy
flavor: IceCreamRockyRoad
color: "#664300"
recognizable: true
metabolisms:
Drink:
effects:
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
- !type:SatiateThirst
factor: 2
- !type:HealthChange
conditions:
- !type:ReagentCondition
reagent: IceCreamRockyRoad
min: 20
damage:
types:
Cold: .25
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-rockyroad.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamTower
name: reagent-name-icecream-tower
desc: reagent-desc-icecream-tower
physicalDesc: reagent-physical-desc-creamy
flavor: IceCreamTower
color: "#EDC392"
recognizable: true
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 3
- !type:SatiateHunger
factor: 2
- !type:HealthChange
conditions:
- !type:ReagentCondition
reagent: IceCreamTower
min: 20
damage:
types:
Cold: .5
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-tower.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamVegan
name: reagent-name-icecream-vegan
desc: reagent-desc-icecream-vegan
physicalDesc: reagent-physical-desc-creamy
flavor: icecream
color: "#FFFBD6"
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-vegan.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamWatermelon
name: reagent-name-icecream-watermelon
desc: reagent-desc-icecream-watermelon
physicalDesc: reagent-physical-desc-creamy
flavor: watermelon
color: "#EFBE6C"
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/icecream-watermelon.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamSherbetRainbow
name: reagent-name-sherbet-rainbow
desc: reagent-desc-sherbet-rainbow
physicalDesc: reagent-physical-desc-creamy
flavor: IceCreamRainbow
color: "#D6CE58"
recognizable: true
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 2
- !type:SatiateHunger
factor: 1
- !type:HealthChange
conditions:
- !type:ReagentCondition
reagent: IceCreamSherbetRainbow
min: 20
damage:
types:
Cold: .25
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-rainbow.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamSherbetLemon
name: reagent-name-sherbet-lemon
desc: reagent-desc-sherbet-lemon
physicalDesc: reagent-physical-desc-creamy
flavor: ginfizz
color: "#FFE93F"
recognizable: true
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-lemon.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamSherbetLime
name: reagent-name-sherbet-lime
desc: reagent-desc-sherbet-lime
physicalDesc: reagent-physical-desc-creamy
flavor: tart
color: "#ABFF24"
recognizable: true
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-lime.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamSherbetOrange
name: reagent-name-sherbet-orange
desc: reagent-desc-sherbet-orange
physicalDesc: reagent-physical-desc-creamy
flavor: orange
color: "#FEAF54"
recognizable: true
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-orange.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamSherbetPineapple
name: reagent-name-sherbet-pineapple
desc: reagent-desc-sherbet-pineapple
physicalDesc: reagent-physical-desc-creamy
flavor: bluehawaiian
color: "#FFED69"
recognizable: true
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-pineapple.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamSherbetRaspberry
name: reagent-name-sherbet-raspberry
desc: reagent-desc-sherbet-raspberry
physicalDesc: reagent-physical-desc-creamy
flavor: berry
color: "#F398CB"
recognizable: true
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/sherbet-raspberry.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: SlushBlueRaspberry
name: reagent-name-slush-blue-raspberry
desc: reagent-desc-slush-blue-raspberry
physicalDesc: reagent-physical-desc-frosty
flavor: berry
color: "#2FF0FE"
recognizable: true
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/slush-blueraspberry.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: SlushCherry
name: reagent-name-slush-cherry
desc: reagent-desc-slush-cherry
physicalDesc: reagent-physical-desc-frosty
flavor: cherry
color: "#FFE7E7"
recognizable: true
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/slush-cherry.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: SlushCola
name: reagent-name-slush-cola
desc: reagent-desc-slush-cola
physicalDesc: reagent-physical-desc-frosty
flavor: cola
color: "#FFE7E7"
recognizable: true
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/slush-cola.rsi
state: icon_empty
- type: reagent
parent: BaseDrinkFrozenTreat
id: IceCreamSundaeTropical
name: reagent-name-tropical-sunday
desc: reagent-desc-tropical-sunday
physicalDesc: reagent-physical-desc-creamy
flavor: painkiller
color: "#FFD376"
recognizable: true
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 2
- !type:SatiateHunger
factor: 1
- !type:HealthChange
conditions:
- !type:ReagentCondition
reagent: IceCreamSundaeTropical
min: 20
damage:
types:
Cold: 0.25
metamorphicSprite:
sprite: _DV/Objects/Consumable/Drinks/frozen_treats/tropicalsunday.rsi
state: icon_empty
@@ -0,0 +1,290 @@
- type: reaction
id: Caramel
minTemp: 350
reactants:
Saline:
amount: 1
Sugar:
amount: 2
products:
Caramel: 1
- type: reaction
id: IceCreamAppleCaramel
reactants:
IceCreamCaramel:
amount: 3
JuiceApple:
amount: 1
products:
IceCreamAppleCaramel: 4
- type: reaction
id: IceCreamCaramel
reactants:
IceCream:
amount: 1
Caramel:
amount: 1
products:
IceCreamCaramel: 2
- type: reaction
id: IceCreamCaramelFudge
reactants:
IceCreamChocolate:
amount: 2
Caramel:
amount: 1
products:
IceCreamCaramelFudge: 3
- type: reaction
id: IceCreamBerryCobbler
reactants:
IceCream:
amount: 2
Oats:
amount: 1
JuiceBerry:
amount: 1
products:
IceCreamBerryCobbler: 4
- type: reaction
id: IceCreamCherry
reactants:
IceCream:
amount: 1
JuiceCherry:
amount: 1
products:
IceCreamCherry: 2
- type: reaction
id: IceCreamChocolate
reactants:
IceCream:
amount: 1
CocoaPowder:
amount: 1
products:
IceCreamChocolate: 2
- type: reaction
id: IceCreamCoffee
reactants:
IceCream:
amount: 1
Coffee:
amount: 1
products:
IceCreamCoffee: 2
- type: reaction
id: IceCreamCookieDough
reactants:
IceCream:
amount: 1
IceCreamChocolate:
amount: 1
Flour:
amount: 1
products:
IceCreamCookieDough: 2
- type: reaction
id: IceCreamGreenTea
reactants:
IceCream:
amount: 1
GreenTea:
amount: 1
products:
IceCreamGreenTea: 2
- type: reaction
id: IceCreamNeapolitan
reactants:
IceCream:
amount: 1
IceCreamCherry:
amount: 1
IceCreamChocolate:
amount: 1
products:
IceCreamNeapolitan: 3
- type: reaction
id: IceCreamMint
reactants:
IceCream:
amount: 1
Angobitters:
amount: 1
products:
IceCreamMint: 2
- type: reaction
id: IceCreamTower
reactants:
IceCreamNeapolitan:
amount: 1
IceCreamSherbetRainbow:
amount: 1
products:
IceCreamTower: 2
- type: reaction
id: IceCreamVegan
reactants:
Sugar:
amount: 1
Ice:
amount: 1
MilkSoy:
amount: 1
products:
IceCreamVegan: 3
- type: reaction
id: IceCreamWatermelon
reactants:
IceCream:
amount: 1
JuiceWatermelon:
amount: 1
products:
IceCreamWatermelon: 2
- type: reaction
id: IceCreamSherbetLemon
reactants:
IceCream:
amount: 1
JuiceLemon:
amount: 1
products:
IceCreamSherbetLemon: 2
- type: reaction
id: IceCreamSherbetLime
reactants:
IceCream:
amount: 1
JuiceLime:
amount: 1
products:
IceCreamSherbetLime: 2
- type: reaction
id: IceCreamSherbetPineapple
reactants:
IceCream:
amount: 1
JuicePineapple:
amount: 1
products:
IceCreamSherbetPineapple: 2
- type: reaction
id: IceCreamSherbetOrange
reactants:
IceCream:
amount: 1
JuiceOrange:
amount: 1
products:
IceCreamSherbetOrange: 2
- type: reaction
id: IceCreamSherbetRaspberry
reactants:
IceCream:
amount: 1
JuiceBerry:
amount: 1
products:
IceCreamSherbetRaspberry: 2
- type: reaction
id: IceCreamSherbetRainbow
reactants:
IceCreamSherbetOrange:
amount: 1
IceCreamSherbetLime:
amount: 1
IceCreamSherbetRaspberry:
amount: 1
products:
IceCreamSherbetRainbow: 3
- type: reaction
id: SlushCherry
reactants:
JuiceCherry:
amount: 1
Ice:
amount: 2
Sugar:
amount: 1
products:
SlushCherry: 4
- type: reaction
id: SlushCola
reactants:
Cola:
amount: 1
Ice:
amount: 2
Sugar:
amount: 1
products:
SlushCola: 4
- type: reaction
id: SlushBlueRaspberry
reactants:
JuiceBerry:
amount: 1
Ice:
amount: 2
Sugar:
amount: 1
products:
SlushBlueRaspberry: 4
- type: reaction
id: IceCreamSundaeTropical
reactants:
IceCream:
amount: 3
JuiceBanana:
amount: 1
CoconutWater:
amount: 1
JuiceBungo:
amount: 1
products:
IceCreamSundaeTropical: 6
- type: reaction
id: IceCreamPistachio
reactants:
IceCream:
amount: 1
ChoppedNuts:
amount: 1
products:
IceCreamPistachio: 2
- type: reaction
id: IceCreamRockyRoad
reactants:
IceCreamChocolate:
amount: 2
ChoppedNuts:
amount: 1
products:
IceCreamRockyRoad: 3
@@ -11,7 +11,7 @@
outerClothing: ClothingOuterArmorBasicSlim
id: ERTLeaderPDA
ears: ClothingHeadsetAltCentCom
belt: WeaponEnergyGun
belt: ClothingBeltMilitaryWebbingERT
pocket1: CrowbarRed
pocket2: FlashlightSeclite
storage:
@@ -19,7 +19,12 @@
- PinpointerNuclear
- Zipties
- Zipties
- DoorRemoteOmni
- DoorRemoteCustom
- ERTGearSelectorMedsAmber
- WeaponPistolUniversal
- MagazineUniversalMagnum
- MagazineUniversalMagnum
- MagazineUniversalMagnum
- type: startingGear
parent: ERTLeaderGearAmber
@@ -28,16 +33,13 @@
shoes: ClothingShoesBootsERTMagboots
mask: ClothingMaskGasERT
outerClothing: ClothingOuterHardsuitERTLeaderBase
belt: ClothingBeltSecurityFilled
pocket1: WeaponEnergyGunPistol
storage:
back:
- CrowbarRed
- DoorRemoteOmni
- DoorRemoteCustom
- PinpointerNuclear
- MagazineUniversalMagnum
- MagazineUniversalMagnum
- WeaponPistolUniversal
- ERTGearSelectorLeaderRed
- ERTGearSelectorMedsRed
belt:
- Zipties
- Zipties
@@ -47,20 +49,13 @@
id: ERTLeaderGearGamma
equipment:
outerClothing: ClothingOuterHardsuitERTLeaderElite
pocket2: WeaponPistolUniversal
inhand:
- WeaponRifleLaserERT
storage:
back:
- MagazineLaser
- MagazineLaser
- MagazineLaser
- MagazineUniversalMagnum
- MagazineUniversalMagnum
- CrowbarRed
- PinpointerNuclear
- DoorRemoteOmni
- FlashlightSeclite
- DoorRemoteCustom
- ERTGearSelectorLeaderGamma
- ERTGearSelectorMedsGammaSec
- ToolDebug
# Chaplain
@@ -126,7 +121,7 @@
id: ERTEngineerPDA
ears: ClothingHeadsetAltCentCom
belt: ClothingBeltChiefEngineerFilled
pocket1: WeaponEnergyGunMini
pocket1: WeaponAdvancedLaser
pocket2: FlashlightSeclite
storage:
back:
@@ -144,7 +139,7 @@
equipment:
shoes: ClothingShoesBootsERTMagboots
mask: ClothingMaskGasERT
pocket1: WeaponEnergyGunPistol
pocket1: WeaponAdvancedLaser
inhand:
- JetpackVoid
storage:
@@ -168,7 +163,7 @@
- CableApcStack
- SheetPlasteel
- SheetSteel
- WeaponBeamCannon
- WeaponAdvancedLaser
belt:
- RCDCombat
@@ -192,8 +187,8 @@
storage:
back:
- CrowbarRed
- BoxFlashbang
- WeaponLaserCannon
- ERTGearSelectorGunAmberSec
- ERTGearSelectorMedsAmber
belt:
- Zipties
- Zipties
@@ -208,25 +203,25 @@
pocket1: WeaponEnergyGunPistol
storage:
back:
- CrowbarRed
- MagazineLaser
- MagazineLaser
- MagazineLaser
- WeaponRifleLaserERT
- ToolDebug
- ERTGearSelectorGunRedSec
- ERTGearSelectorMedsRed
- type: startingGear
parent: ERTSecurityGearRed
id: ERTSecurityGearGamma
equipment:
outerClothing: ClothingOuterHardsuitERTSecurityElite
pocket1: CrowbarRed
inhand:
- WeaponImmolatorMulti
- PortableRecharger
pocket1: WeaponAdvancedLaser
storage:
back:
- WeaponEnergyGunAdvanced
- BoxC4
- DoorRemoteCustom
- ERTGearSelectorGunGammaSec
- ERTGearSelectorMedsGammaSec
- ERTGearSelectorGammaSecUtility
- ToolDebug
- Multitool
- WelderIndustrialAdvanced
# Medical
@@ -247,7 +242,7 @@
pocket2: FlashlightSeclite
storage:
back:
- WeaponEnergyGunMini
- WeaponAdvancedLaser
- MedkitCombatFilled
- CrowbarRed
- ChemistryBottleEpinephrine
@@ -263,7 +258,7 @@
mask: ClothingMaskGasERT
outerClothing: ClothingOuterHardsuitERTMedicalBase
inhand:
- WeaponEnergyGun
- WeaponAdvancedLaser
storage:
back:
- MedkitCombatFilled
@@ -281,7 +276,7 @@
equipment:
outerClothing: ClothingOuterHardsuitERTMedicalElite
inhand:
- WeaponEnergyGunPistol
- WeaponAdvancedLaser
storage:
back:
- MedkitCombatFilled
@@ -325,7 +320,7 @@
shoes: ClothingShoesBootsERTMagboots
mask: ClothingMaskGasERT
outerClothing: ClothingOuterHardsuitERTJanitorBase
pocket1: WeaponEnergyGunMini
pocket1: WeaponAdvancedLaser
pocket2: FlashlightSeclite
inhand:
- AdvMopItem
@@ -342,4 +337,36 @@
id: ERTJanitorGearGamma
equipment:
outerClothing: ClothingOuterHardsuitERTJanitorElite
pocket1: WeaponEnergyGunPistol
pocket1: WeaponAdvancedLaser
# SRT
- type: startingGear
id: SRTOfficerBase
equipment:
jumpsuit: ClothingUniformJumpsuitDeathSquad
back: ClothingBackpackDeathSquadFilledBase
shoes: ClothingShoesBootsERTMagboots
head: ClothingHeadHatBeretCommand
eyes: ClothingEyesERTInformationHud
gloves: ClothingHandsGlovesCombat
mask: ClothingMaskGasDeathSquad
outerClothing: ClothingOuterHardsuitSRT
suitstorage: JetpackBlackFilled
id: DeathsquadPDA
ears: ClothingHeadsetAltCentCom
belt: ClothingBeltMilitaryWebbingERTMedicine
pocket1: DoubleEmergencyOxygenTankFilled
pocket2: WeaponRevolverMateba
- type: startingGear
id: SRTOfficerBlack
parent: SRTOfficerBase
equipment:
back: ClothingBackpackDeathSquadFilledBlack
- type: startingGear
id: SRTOfficerEpsilon
parent: SRTOfficerBase
equipment:
back: ClothingBackpackDeathSquadFilledEpsilon
@@ -9,3 +9,13 @@
- Clerk
- Prosecutor
- Lawyer
- type: department
id: Incarcerated
name: department-Incarcerated
description: department-Incarcerated-description
radioChannel: Security # Notifies security on late-join
color: "#3b3b3b"
roles:
- Prisoner
- Gladiator
@@ -78,8 +78,10 @@
name: trait-amputee-left-arm-name
description: trait-amputee-left-arm-desc
category: Disabilities
conflicts:
- ArmAmputeeRight # TODO: AmputeeComponent doesn't stack, should be an effect instead
conditions:
- !type:TraitDependencyCondition
conflicts:
- ArmAmputeeRight # TODO: AmputeeComponent doesn't stack, should be an effect instead
effects:
- !type:AddCompsEffect
components:
@@ -92,8 +94,10 @@
name: trait-amputee-right-arm-name
description: trait-amputee-right-arm-desc
category: Disabilities
conflicts:
- ArmAmputeeLeft
conditions:
- !type:TraitDependencyCondition
conflicts:
- ArmAmputeeLeft
effects:
- !type:AddCompsEffect
components:
@@ -0,0 +1,29 @@
- type: entity
parent: ClothingNeckBase
id: ClothingNeckLanyard
name: lanyard
description: Use this to display information about yourself to others, or brag about your captain-stamped paperwork!
components:
- type: Sprite
sprite: _Harmony/Clothing/Neck/Misc/lanyard.rsi
- type: Clothing
sprite: _Harmony/Clothing/Neck/Misc/lanyard.rsi
- type: PaperLabel
labelSlot:
insertVerbText: comp-paper-label-insert
ejectVerbText: comp-paper-label-eject
whitelist:
components:
- Paper
blacklist:
components:
- DevilContract # Prevent Devils from hiding paperwork
- RevivalContract # Prevent Devils from hiding paperwork
- Access # Prevents PaperSlipSpareID (Emergency Access Biscuit)
tags:
- Book
- type: ContainerContainer
containers:
entity_storage: !type:Container
paper_label: !type:ContainerSlot
- type: ItemSlots

Some files were not shown because too many files have changed in this diff Show More